From 6c4ad885019389dcff7d78b1bbf4e6b5401a6616 Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Thu, 8 Sep 2016 11:42:20 +0300 Subject: [PATCH] tranlator moved to experiements/translator and the the rest is clean upped for now if something will be required in the future (I can always repeate the exercise) --- build.sh | 75 - car_cfmw/.gitignore | 2 - car_cfmw/Makefile | 71 - car_cfmw/README.md | 2 - car_cfmw/src/main.c | 105 - car_cfmw/src/stm32_flash.ld | 177 - car_fmw/.gitignore | 3 - car_fmw/Makefile | 92 - car_fmw/src/Control.kt | 144 - car_fmw/src/ProtoRW.kt | 73 - car_fmw/src/Tests.kt | 33 - car_fmw/src/Voyager.kt | 18 - car_fmw/src/include/Button.kt | 11 - car_fmw/src/include/Connection.kt | 44 - car_fmw/src/include/DebugInfo.kt | 24 - car_fmw/src/include/Engine.kt | 67 - car_fmw/src/include/Leds.kt | 36 - car_fmw/src/include/Memory.kt | 16 - car_fmw/src/include/Random.kt | 6 - car_fmw/src/include/Sonar.kt | 75 - car_fmw/src/include/Time.kt | 16 - car_fmw/src/include/utils.kt | 12 - car_fmw/src/main.kt | 17 - car_fmw/stm32_flash.ld | 177 - car_hw/.gitignore | 2 - car_hw/Makefile | 82 - car_hw/src/assert.c | 20 - car_hw/src/car_conn.c | 64 - car_hw/src/car_engine.c | 79 - car_hw/src/car_leds.c | 30 - car_hw/src/car_random.c | 15 - car_hw/src/car_sonar.c | 108 - car_hw/src/car_time.c | 30 - car_hw/src/car_user_btn.c | 21 - car_hw/src/include/car_conn.h | 15 - car_hw/src/include/car_engine.h | 8 - car_hw/src/include/car_leds.h | 16 - car_hw/src/include/car_random.h | 5 - car_hw/src/include/car_sonar.h | 30 - car_hw/src/include/car_time.h | 11 - car_hw/src/include/car_user_btn.h | 11 - car_hw/src/include/stm32f4xx_conf.h | 94 - car_hw/src/lib/cmsis/Makefile | 15 - car_hw/src/lib/cmsis/arm_common_tables.h | 35 - car_hw/src/lib/cmsis/arm_math.h | 7051 ----- car_hw/src/lib/cmsis/core_cm0.h | 665 - car_hw/src/lib/cmsis/core_cm3.h | 1236 - car_hw/src/lib/cmsis/core_cm4.h | 1378 - car_hw/src/lib/cmsis/core_cm4_simd.h | 701 - car_hw/src/lib/cmsis/core_cmFunc.h | 609 - car_hw/src/lib/cmsis/core_cmInstr.h | 585 - car_hw/src/lib/cmsis/startup_stm32f4xx.s | 509 - car_hw/src/lib/cmsis/stm32f4xx.h | 7004 ----- car_hw/src/lib/cmsis/system_stm32f4xx.c | 584 - car_hw/src/lib/cmsis/system_stm32f4xx.h | 99 - car_hw/src/lib/stdperiph/Makefile | 9 - car_hw/src/lib/stdperiph/misc.c | 244 - car_hw/src/lib/stdperiph/misc.h | 172 - car_hw/src/lib/stdperiph/stm32f4xx_adc.c | 1743 -- car_hw/src/lib/stdperiph/stm32f4xx_adc.h | 643 - car_hw/src/lib/stdperiph/stm32f4xx_can.c | 1699 -- car_hw/src/lib/stdperiph/stm32f4xx_can.h | 638 - car_hw/src/lib/stdperiph/stm32f4xx_crc.c | 127 - car_hw/src/lib/stdperiph/stm32f4xx_crc.h | 77 - car_hw/src/lib/stdperiph/stm32f4xx_cryp.c | 851 - car_hw/src/lib/stdperiph/stm32f4xx_cryp.h | 338 - car_hw/src/lib/stdperiph/stm32f4xx_cryp_aes.c | 638 - car_hw/src/lib/stdperiph/stm32f4xx_cryp_des.c | 291 - .../src/lib/stdperiph/stm32f4xx_cryp_tdes.c | 308 - car_hw/src/lib/stdperiph/stm32f4xx_dac.c | 702 - car_hw/src/lib/stdperiph/stm32f4xx_dac.h | 298 - car_hw/src/lib/stdperiph/stm32f4xx_dbgmcu.c | 175 - car_hw/src/lib/stdperiph/stm32f4xx_dbgmcu.h | 103 - car_hw/src/lib/stdperiph/stm32f4xx_dcmi.c | 535 - car_hw/src/lib/stdperiph/stm32f4xx_dcmi.h | 306 - car_hw/src/lib/stdperiph/stm32f4xx_dma.c | 1284 - car_hw/src/lib/stdperiph/stm32f4xx_dma.h | 603 - car_hw/src/lib/stdperiph/stm32f4xx_exti.c | 307 - car_hw/src/lib/stdperiph/stm32f4xx_exti.h | 177 - car_hw/src/lib/stdperiph/stm32f4xx_flash.c | 1057 - car_hw/src/lib/stdperiph/stm32f4xx_flash.h | 334 - car_hw/src/lib/stdperiph/stm32f4xx_fsmc.c | 983 - car_hw/src/lib/stdperiph/stm32f4xx_fsmc.h | 669 - car_hw/src/lib/stdperiph/stm32f4xx_gpio.c | 562 - car_hw/src/lib/stdperiph/stm32f4xx_gpio.h | 406 - car_hw/src/lib/stdperiph/stm32f4xx_hash.c | 701 - car_hw/src/lib/stdperiph/stm32f4xx_hash.h | 244 - car_hw/src/lib/stdperiph/stm32f4xx_hash_md5.c | 314 - .../src/lib/stdperiph/stm32f4xx_hash_sha1.c | 317 - car_hw/src/lib/stdperiph/stm32f4xx_i2c.c | 1396 - car_hw/src/lib/stdperiph/stm32f4xx_i2c.h | 692 - car_hw/src/lib/stdperiph/stm32f4xx_iwdg.c | 264 - car_hw/src/lib/stdperiph/stm32f4xx_iwdg.h | 125 - car_hw/src/lib/stdperiph/stm32f4xx_pwr.c | 657 - car_hw/src/lib/stdperiph/stm32f4xx_pwr.h | 179 - car_hw/src/lib/stdperiph/stm32f4xx_rcc.c | 1809 -- car_hw/src/lib/stdperiph/stm32f4xx_rcc.h | 510 - car_hw/src/lib/stdperiph/stm32f4xx_rng.c | 400 - car_hw/src/lib/stdperiph/stm32f4xx_rng.h | 114 - car_hw/src/lib/stdperiph/stm32f4xx_rtc.c | 2733 -- car_hw/src/lib/stdperiph/stm32f4xx_rtc.h | 875 - car_hw/src/lib/stdperiph/stm32f4xx_sdio.c | 1005 - car_hw/src/lib/stdperiph/stm32f4xx_sdio.h | 530 - car_hw/src/lib/stdperiph/stm32f4xx_spi.c | 1287 - car_hw/src/lib/stdperiph/stm32f4xx_spi.h | 537 - car_hw/src/lib/stdperiph/stm32f4xx_syscfg.c | 198 - car_hw/src/lib/stdperiph/stm32f4xx_syscfg.h | 173 - car_hw/src/lib/stdperiph/stm32f4xx_tim.c | 3353 --- car_hw/src/lib/stdperiph/stm32f4xx_tim.h | 1144 - car_hw/src/lib/stdperiph/stm32f4xx_usart.c | 1464 - car_hw/src/lib/stdperiph/stm32f4xx_usart.h | 423 - car_hw/src/lib/stdperiph/stm32f4xx_wwdg.c | 304 - car_hw/src/lib/stdperiph/stm32f4xx_wwdg.h | 105 - ...ge SW License Agreement 19Jul2011 v0.1.pdf | Bin 129125 -> 0 bytes car_hw/src/lib/stm32f4d/Makefile | 9 - car_hw/src/lib/stm32f4d/Release_Notes.html | 142 - car_hw/src/lib/stm32f4d/libPDMFilter_GCC.a | Bin 6956 -> 0 bytes car_hw/src/lib/stm32f4d/libPDMFilter_IAR.a | Bin 8880 -> 0 bytes car_hw/src/lib/stm32f4d/libPDMFilter_Keil.lib | Bin 6476 -> 0 bytes car_hw/src/lib/stm32f4d/pdm_filter.h | 66 - car_hw/src/lib/stm32f4d/stm32f4_discovery.c | 253 - car_hw/src/lib/stm32f4d/stm32f4_discovery.h | 163 - .../stm32f4d/stm32f4_discovery_audio_codec.c | 1650 -- .../stm32f4d/stm32f4_discovery_audio_codec.h | 306 - .../lib/stm32f4d/stm32f4_discovery_lis302dl.c | 502 - .../lib/stm32f4d/stm32f4_discovery_lis302dl.h | 772 - car_hw/src/lib/usart/Makefile | 9 - car_hw/src/lib/usart/usart.c | 229 - car_hw/src/lib/usart/usart.h | 17 - car_hw/src/lib/usart/usart_test.c | 28 - car_hw/src/lib/usart/usart_test.h | 5 - car_hw/src/lib/usb_conf/usb_conf.h | 287 - car_hw/src/lib/usb_conf/usbd_conf.h | 95 - car_hw/src/lib/usb_conf/usbd_desc.h | 114 - car_hw/src/lib/usb_conf/usbh_conf.h | 94 - car_hw/src/lib/usb_device/Makefile | 35 - .../usb_device/class/cdc/inc/usbd_cdc_core.h | 137 - .../usb_device/class/cdc/src/usbd_cdc_core.c | 811 - .../src/lib/usb_device/core/inc/usbd_core.h | 114 - car_hw/src/lib/usb_device/core/inc/usbd_def.h | 149 - .../src/lib/usb_device/core/inc/usbd_ioreq.h | 115 - car_hw/src/lib/usb_device/core/inc/usbd_req.h | 102 - car_hw/src/lib/usb_device/core/inc/usbd_usr.h | 135 - .../src/lib/usb_device/core/src/usbd_core.c | 476 - .../src/lib/usb_device/core/src/usbd_ioreq.c | 237 - car_hw/src/lib/usb_device/core/src/usbd_req.c | 868 - car_hw/src/lib/usb_otg/Makefile | 11 - car_hw/src/lib/usb_otg/inc/usb_bsp.h | 97 - car_hw/src/lib/usb_otg/inc/usb_core.h | 408 - car_hw/src/lib/usb_otg/inc/usb_dcd.h | 158 - car_hw/src/lib/usb_otg/inc/usb_dcd_int.h | 121 - car_hw/src/lib/usb_otg/inc/usb_defines.h | 244 - car_hw/src/lib/usb_otg/inc/usb_hcd.h | 102 - car_hw/src/lib/usb_otg/inc/usb_hcd_int.h | 126 - car_hw/src/lib/usb_otg/inc/usb_otg.h | 94 - car_hw/src/lib/usb_otg/inc/usb_regs.h | 1206 - car_hw/src/lib/usb_otg/src/usb_core.c | 2187 -- car_hw/src/lib/usb_otg/src/usb_dcd.c | 475 - car_hw/src/lib/usb_otg/src/usb_dcd_int.c | 889 - car_hw/src/lib/usb_otg/src/usb_hcd.c | 259 - car_hw/src/lib/usb_otg/src/usb_hcd_int.c | 835 - car_hw/src/lib/usb_otg/src/usb_otg.c | 178 - car_hw/src/lib/usb_vcp/Makefile | 9 - car_hw/src/lib/usb_vcp/README.txt | 24 - car_hw/src/lib/usb_vcp/init.c | 16 - car_hw/src/lib/usb_vcp/usb_bsp.c | 333 - car_hw/src/lib/usb_vcp/usbd_cdc_vcp.c | 279 - car_hw/src/lib/usb_vcp/usbd_cdc_vcp.h | 69 - car_hw/src/lib/usb_vcp/usbd_desc.c | 317 - car_hw/src/lib/usb_vcp/usbd_usr.c | 126 - car_hw/src/stm32f4xx_it.c | 188 - car_hw/src/stm32f4xx_it.h | 54 - car_srv/clients/flash/.gitignore | 4 - car_srv/clients/flash/.idea/compiler.xml | 22 - car_srv/clients/flash/.idea/modules.xml | 8 - car_srv/clients/flash/README.md | 17 - car_srv/clients/flash/build.gradle | 62 - car_srv/clients/flash/compileProto.sh | 2 - .../gradle/wrapper/gradle-wrapper.properties | 6 - car_srv/clients/flash/gradlew | 160 - car_srv/clients/flash/run.sh | 2 - car_srv/clients/flash/settings.gradle | 2 - .../flash/src/main/java/CodedInputStream.kt | 305 - .../flash/src/main/java/CodedOutputStream.kt | 258 - .../java/InvalidProtocolBufferException.kt | 10 - car_srv/clients/flash/src/main/java/Main.kt | 154 - .../clients/flash/src/main/java/WireFormat.kt | 114 - .../clients/flash/src/main/java/WireType.kt | 28 - car_srv/clients/flash/src/main/java/carkot.kt | 512 - .../flash/src/main/java/client/Client.kt | 42 - .../src/main/java/client/ClientHandler.kt | 69 - .../src/main/java/client/ClientInitializer.kt | 19 - car_srv/clients/rc/.gitignore | 4 - car_srv/clients/rc/README.md | 17 - car_srv/clients/rc/build.gradle | 62 - car_srv/clients/rc/compileProto.sh | 2 - .../rc/gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - car_srv/clients/rc/gradlew | 160 - car_srv/clients/rc/gradlew.bat | 90 - car_srv/clients/rc/run.sh | 2 - car_srv/clients/rc/settings.gradle | 2 - .../clients/rc/src/main/java/CarControl.kt | 30 - .../rc/src/main/java/CodedInputStream.kt | 305 - .../rc/src/main/java/CodedOutputStream.kt | 258 - .../java/InvalidProtocolBufferException.kt | 10 - car_srv/clients/rc/src/main/java/Main.kt | 157 - .../clients/rc/src/main/java/WireFormat.kt | 118 - car_srv/clients/rc/src/main/java/WireType.kt | 28 - .../rc/src/main/java/clientClasses/Client.kt | 56 - .../main/java/clientClasses/ClientHandler.kt | 105 - .../java/clientClasses/ClientInitializer.kt | 19 - car_srv/clients/rc/src/main/java/direction.kt | 312 - .../clients/rc/src/main/java/rc_session.kt | 694 - car_srv/kotlinSrv/.gitignore | 6 - car_srv/kotlinSrv/.idea/.name | 1 - car_srv/kotlinSrv/.idea/compiler.xml | 22 - .../.idea/copyright/profiles_settings.xml | 3 - car_srv/kotlinSrv/.idea/gradle.xml | 18 - ...tbrains_kotlin_kotlin_js_library_1_0_3.xml | 11 - car_srv/kotlinSrv/.idea/misc.xml | 19 - car_srv/kotlinSrv/.idea/modules.xml | 8 - car_srv/kotlinSrv/.idea/modules/CarServer.iml | 28 - car_srv/kotlinSrv/README.md | 41 - car_srv/kotlinSrv/build.gradle | 44 - car_srv/kotlinSrv/build.sh | 5 - car_srv/kotlinSrv/deploy.sh | 75 - .../gradle/wrapper/gradle-wrapper.jar | Bin 53556 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - car_srv/kotlinSrv/gradlew | 164 - car_srv/kotlinSrv/gradlew.bat | 90 - .../kotlinJsRequiredFiles/connectKotlinLib.js | 3 - .../kotlinSrv/kotlinJsRequiredFiles/kotlin.js | 23868 ---------------- car_srv/kotlinSrv/package.json | 18 - car_srv/kotlinSrv/run.sh | 3 - car_srv/kotlinSrv/settings.gradle | 2 - car_srv/kotlinSrv/src/Config.kt | 41 - car_srv/kotlinSrv/src/JSImport.kt | 97 - car_srv/kotlinSrv/src/MCConnectObserver.kt | 6 - car_srv/kotlinSrv/src/MCConnection.kt | 129 - car_srv/kotlinSrv/src/Main.kt | 43 - car_srv/kotlinSrv/src/McConditionMonitor.kt | 77 - car_srv/kotlinSrv/src/McState.kt | 30 - car_srv/kotlinSrv/src/control/Controller.kt | 13 - .../src/control/car/ControllerToUsb.kt | 47 - car_srv/kotlinSrv/src/net/Client.kt | 62 - car_srv/kotlinSrv/src/net/server/Server.kt | 32 - .../net/server/handlers/AbstractHandler.kt | 21 - .../src/net/server/handlers/debug/Memory.kt | 31 - .../src/net/server/handlers/debug/Sonar.kt | 31 - .../src/net/server/handlers/flash/LoadBin.kt | 41 - .../net/server/handlers/main/GetSonarData.kt | 29 - .../src/net/server/handlers/main/SetRoute.kt | 28 - .../server/handlers/main/SetRouteMetric.kt | 28 - .../net/server/handlers/main/SonarExplore.kt | 29 - .../src/net/server/handlers/rc/Control.kt | 36 - car_srv/src/.gitignore | 7 - car_srv/src/.idea/misc.xml | 13 - car_srv/src/.idea/modules.xml | 8 - car_srv/src/.idea/stFlashServer.iml | 10 - car_srv/src/car.js | 152 - car_srv/src/client.js | 33 - car_srv/src/handlers/controlHandler.js | 40 - car_srv/src/handlers/loadBinHandler.js | 48 - car_srv/src/handlers/setRouteHandler.js | 30 - car_srv/src/main.js | 105 - car_srv/src/package.json | 17 - car_srv/src/proto/carkot.proto | 39 - car_srv/src/proto/connect.proto | 17 - car_srv/src/proto/direction.proto | 21 - car_srv/src/proto/location.proto | 18 - car_srv/src/proto/route.proto | 19 - car_srv/src/proto/route_done.proto | 10 - car_srv/src/router.js | 14 - car_srv/src/server.js | 28 - .../translator}/.idea/compiler.xml | 0 .../.idea/copyright/profiles_settings.xml | 0 .../translator}/.idea/gradle.xml | 0 ...radle__com_github_jshmrsn_karg_a636b3e.xml | 0 .../libraries/Gradle__junit_junit_4_12.xml | 0 ...Gradle__org_hamcrest_hamcrest_core_1_3.xml | 0 ...jetbrains_kotlin_kotlin_compiler_1_0_3.xml | 0 ..._jetbrains_kotlin_kotlin_runtime_1_0_1.xml | 0 ...g_jetbrains_kotlin_kotlin_stdlib_1_0_1.xml | 0 .../translator}/.idea/misc.xml | 0 .../translator}/.idea/modules.xml | 0 .../translator}/.idea/modules/ast-kotlin.iml | 0 .../.idea/modules/ast-kotlin_main.iml | 0 .../.idea/modules/ast-kotlin_test.iml | 0 .../translator}/.idea/modules/translator.iml | 0 .../.idea/modules/translator_main.iml | 0 .../.idea/modules/translator_test.iml | 0 .../translator}/.idea/uiDesigner.xml | 0 .../translator}/.idea/vcs.xml | 0 LICENSE => experiments/translator/LICENSE | 0 .../translator}/Makefile | 0 .../translator}/README.md | 0 .../translator}/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../translator}/gradlew | 0 .../translator}/gradlew.bat | 0 .../translator}/run_one_test.sh | 0 .../translator}/run_tests.sh | 0 .../translator}/settings.gradle | 0 .../src/main/kotlin/DefaultArguments.kt | 0 .../translator}/src/main/kotlin/main.kt | 0 .../translator/ProjectTranslator.kt | 0 .../translator/TranslationState.kt | 0 .../translator/VariableManager.kt | 0 .../translator/codegens/BlockCodegen.kt | 0 .../translator/codegens/ClassCodegen.kt | 0 .../translator/codegens/FunctionCodegen.kt | 0 .../translator/codegens/ObjectCodegen.kt | 0 .../translator/codegens/PropertyCodegen.kt | 0 .../translator/codegens/StructCodegen.kt | 0 .../kotlinnative/translator/debug/debug.kt | 0 .../exceptions/TranslationException.kt | 0 .../exceptions/UnimplementedException.kt | 0 .../translator/llvm/LLVMBuilder.kt | 0 .../kotlinnative/translator/llvm/LLVMCall.kt | 0 .../translator/llvm/LLVMClassVariable.kt | 0 .../translator/llvm/LLVMConstant.kt | 0 .../translator/llvm/LLVMExpression.kt | 0 .../kotlinnative/translator/llvm/LLVMLabel.kt | 0 .../kotlinnative/translator/llvm/LLVMNode.kt | 0 .../kotlinnative/translator/llvm/LLVMScope.kt | 0 .../translator/llvm/LLVMSingleValue.kt | 0 .../translator/llvm/LLVMVariable.kt | 0 .../translator/llvm/generators.kt | 0 .../translator/llvm/types/LLVMArray.kt | 0 .../translator/llvm/types/LLVMBooleanType.kt | 0 .../translator/llvm/types/LLVMByteType.kt | 0 .../translator/llvm/types/LLVMCharType.kt | 0 .../translator/llvm/types/LLVMDoubleType.kt | 0 .../translator/llvm/types/LLVMFloatType.kt | 0 .../translator/llvm/types/LLVMFunctionType.kt | 0 .../translator/llvm/types/LLVMIntType.kt | 0 .../translator/llvm/types/LLVMLongType.kt | 0 .../translator/llvm/types/LLVMNullType.kt | 0 .../llvm/types/LLVMReferenceType.kt | 0 .../translator/llvm/types/LLVMShortType.kt | 0 .../translator/llvm/types/LLVMStringType.kt | 0 .../translator/llvm/types/LLVMType.kt | 0 .../translator/llvm/types/LLVMVoidType.kt | 0 .../array_extensions_1/array_extensions_1.kt | 0 .../array_extensions_1/array_extensions_1.txt | 0 .../array_extensions_2/array_extensions_2.kt | 0 .../array_extensions_2/array_extensions_2.txt | 0 .../assignment_operators_1.kt | 0 .../assignment_operators_1.txt | 0 .../tests/booleanarray_1/booleanarray_1.kt | 0 .../tests/booleanarray_1/booleanarray_1.txt | 0 .../kotlin/tests/bytearray_1/bytearray_1.kt | 0 .../kotlin/tests/bytearray_1/bytearray_1.txt | 0 .../kotlin/tests/callbacks_1/callbacks_1.c | 0 .../kotlin/tests/callbacks_1/callbacks_1.kt | 0 .../kotlin/tests/callbacks_1/callbacks_1.txt | 0 .../class_alignment_1/class_alignment_1.kt | 0 .../class_alignment_1/class_alignment_1.txt | 0 .../class_class_argument_1.kt | 0 .../class_class_argument_1.txt | 0 .../class_default_argument_1.kt | 0 .../class_default_argument_1.txt | 0 .../class_init_section_1.kt | 0 .../class_init_section_1.txt | 0 .../class_method_access_1.kt | 0 .../class_method_access_1.txt | 0 .../tests/class_methods_1/class_methods_1.kt | 0 .../tests/class_methods_1/class_methods_1.txt | 0 .../class_reassignment_1.kt | 0 .../class_reassignment_1.txt | 0 .../class_reassignment_2.kt | 0 .../class_reassignment_2.txt | 0 .../class_variable_access_1.kt | 0 .../class_variable_access_1.txt | 0 .../tests/classfields_1/classfields_1.kt | 0 .../tests/classfields_1/classfields_1.txt | 0 .../tests/classfields_2/classfields_2.kt | 0 .../tests/classfields_2/classfields_2.txt | 0 .../companion_object_1/companion_object_1.kt | 0 .../companion_object_1/companion_object_1.txt | 0 .../companion_object_2/companion_object_2.kt | 0 .../companion_object_2/companion_object_2.txt | 0 .../complex_dot_expr/complex_dot_expr.kt | 0 .../complex_dot_expr/complex_dot_expr.txt | 0 .../declaration_test_1/declaration_test_1.kt | 0 .../declaration_test_1/declaration_test_1.txt | 0 .../src/test/kotlin/tests/dfs_1/dfs_1.kt | 0 .../src/test/kotlin/tests/dfs_1/dfs_1.txt | 0 .../different_type_binary_operator_1.kt | 0 .../different_type_binary_operator_1.txt | 0 .../kotlin/tests/do_while_1/do_while_1.kt | 0 .../kotlin/tests/do_while_1/do_while_1.txt | 0 .../src/test/kotlin/tests/elvis_1/elvis_1.kt | 0 .../src/test/kotlin/tests/elvis_1/elvis_1.txt | 0 .../kotlin/tests/enum_complex/enum_complex.kt | 0 .../tests/enum_complex/enum_complex.txt | 0 .../enum_inner_fields/enum_inner_fields.kt | 0 .../enum_inner_fields/enum_inner_fields.txt | 0 .../floating_point_operators_1.kt | 0 .../floating_point_operators_1.txt | 0 .../src/test/kotlin/tests/for_1/for_1.kt | 0 .../src/test/kotlin/tests/for_1/for_1.txt | 0 .../function_default_arguments_1.kt | 0 .../function_default_arguments_1.txt | 0 .../kotlin/tests/function_eq/function_eq.kt | 0 .../kotlin/tests/function_eq/function_eq.txt | 0 .../function_extensions_1.kt | 0 .../function_extensions_1.txt | 0 .../function_extensions_double_argument_1.kt | 0 .../function_extensions_double_argument_1.txt | 0 .../get_set_operators_1.kt | 0 .../get_set_operators_1.txt | 0 .../tests/global_vars_1/global_vars_1.kt | 0 .../tests/global_vars_1/global_vars_1.txt | 0 .../src/test/kotlin/tests/if_1/if_1.kt | 0 .../src/test/kotlin/tests/if_1/if_1.txt | 0 .../src/test/kotlin/tests/if_2/if_2.kt | 0 .../src/test/kotlin/tests/if_2/if_2.txt | 0 .../if_boolean_argument_1.kt | 0 .../if_boolean_argument_1.txt | 0 .../tests/if_expression_1/if_expression_1.kt | 0 .../tests/if_expression_1/if_expression_1.txt | 0 .../initialization_in_place_and_this_1.kt | 0 .../initialization_in_place_and_this_1.txt | 0 .../initialized_class_fields_1.kt | 0 .../initialized_class_fields_1.txt | 0 .../kotlin/tests/intarray_1/intarray_1.kt | 0 .../kotlin/tests/intarray_1/intarray_1.txt | 0 .../long_operations_1/long_operations_1.kt | 0 .../long_operations_1/long_operations_1.txt | 0 .../tests/nested_classes/nested_classes.kt | 0 .../tests/nested_classes/nested_classes.txt | 0 .../null_comparison_1/null_comparison_1.kt | 0 .../null_comparison_1/null_comparison_1.txt | 0 .../kotlin/tests/nullable_1/nullable_1.kt | 0 .../kotlin/tests/nullable_1/nullable_1.txt | 0 .../nullable_class_fields_1.kt | 0 .../nullable_class_fields_1.txt | 0 .../nullable_primitive_types_1.kt | 0 .../nullable_primitive_types_1.txt | 0 .../numeric_literals_1/numeric_literals_1.kt | 0 .../numeric_literals_1/numeric_literals_1.txt | 0 .../test/kotlin/tests/object_1/object_1.kt | 0 .../test/kotlin/tests/object_1/object_1.txt | 0 .../test/kotlin/tests/postfix_1/postfix_1.kt | 0 .../test/kotlin/tests/postfix_1/postfix_1.txt | 0 .../kotlin/tests/primitives_1/primitives_1.kt | 0 .../tests/primitives_1/primitives_1.txt | 0 .../proto_crossbranch_test.kt | 0 .../proto_crossbranch_test.txt | 0 .../proto_location_test.kt | 0 .../proto_location_test.txt | 0 .../proto_multiple_messages.kt | 0 .../proto_multiple_messages.txt | 0 .../proto_repeated_varint.kt | 0 .../proto_repeated_varint.txt | 0 .../proto_repeated_zigzag.kt | 0 .../proto_repeated_zigzag.txt | 0 .../proto_tagorder_test.kt | 0 .../proto_tagorder_test.txt | 0 .../kotlin/tests/proto_varint/proto_varint.kt | 0 .../tests/proto_varint/proto_varint.txt | 0 .../kotlin/tests/proto_zigzag/proto_zigzag.kt | 0 .../tests/proto_zigzag/proto_zigzag.txt | 0 .../range_operator_1/range_operator_1.kt | 0 .../range_operator_1/range_operator_1.txt | 0 .../tests/reassigment_0/reassigment_0.kt | 0 .../tests/reassigment_0/reassigment_0.txt | 0 .../tests/reassigment_1/reassigment_1.kt | 0 .../tests/reassigment_1/reassigment_1.txt | 0 .../referential_equality_1.kt | 0 .../referential_equality_1.txt | 0 .../referential_equality_2.kt | 0 .../referential_equality_2.txt | 0 .../test/kotlin/tests/return_1/return_1.kt | 0 .../test/kotlin/tests/return_1/return_1.txt | 0 .../safe_access_operator.kt | 0 .../safe_access_operator.txt | 0 .../secondary_constructor_1.kt | 0 .../secondary_constructor_1.txt | 0 .../serialization_test/serialization_test.kt | 0 .../serialization_test/serialization_test.txt | 0 .../tests/simple_class_2/simple_class_2.kt | 0 .../tests/simple_class_2/simple_class_2.txt | 0 .../simple_proto_test_1.kt | 0 .../simple_proto_test_1.txt | 0 .../tests/simply_class_1/simply_class_1.kt | 0 .../tests/simply_class_1/simply_class_1.txt | 0 .../kotlin/tests/smartcast_1/smartcast_1.kt | 0 .../kotlin/tests/smartcast_1/smartcast_1.txt | 0 .../tests/stress_test_1/stress_test_1.kt | 0 .../tests/stress_test_1/stress_test_1.txt | 0 .../string_print_test_1.kt | 0 .../string_print_test_1.txt | 0 .../kotlin/tests/this_test_1/this_test_1.kt | 0 .../kotlin/tests/this_test_1/this_test_1.txt | 0 .../unary_operators_1/unary_operators_1.kt | 0 .../unary_operators_1/unary_operators_1.txt | 0 .../variables_assigment_1.kt | 0 .../variables_assigment_1.txt | 0 .../kotlin/tests/when_block/when_block.kt | 0 .../kotlin/tests/when_block/when_block.txt | 0 .../when_expression_1/when_expression_1.kt | 0 .../when_expression_1/when_expression_1.txt | 0 .../src/test/kotlin/tests/while_1/while_1.kt | 0 .../src/test/kotlin/tests/while_1/while_1.txt | 0 .../src/test/kotlin/tests/while_2/while_2.c | 0 .../src/test/kotlin/tests/while_2/while_2.kt | 0 .../src/test/kotlin/tests/while_2/while_2.txt | 0 .../while_argument_side_effects_1.kt | 0 .../while_argument_side_effects_1.txt | 0 .../tests/while_break_1/while_break_1.kt | 0 .../tests/while_break_1/while_break_1.txt | 0 kotstd/Makefile | 57 - kotstd/c/arm.c | 11 - kotstd/c/array_c.c | 57 - kotstd/c/assert_c.c | 11 - kotstd/c/console_c.c | 92 - kotstd/c/memory.c | 82 - kotstd/c/primitives_c.c | 90 - kotstd/kt/Assert.kt | 8 - kotstd/kt/BooleanArray.kt | 122 - kotstd/kt/ByteArray.kt | 121 - kotstd/kt/CodedInputStream.kt | 217 - kotstd/kt/CodedOutputStream.kt | 167 - kotstd/kt/Console.kt | 171 - kotstd/kt/IntArray.kt | 196 - kotstd/kt/Iterators.kt | 94 - kotstd/kt/KotlinInputStream.kt | 25 - kotstd/kt/KotlinOutputStream.kt | 20 - kotstd/kt/LongArray.kt | 118 - kotstd/kt/Primitives.kt | 251 - kotstd/kt/Progressions.kt | 50 - kotstd/kt/Ranges.kt | 25 - kotstd/kt/ShortArray.kt | 120 - kotstd/kt/WireFormat.kt | 164 - kotstd/kt/WireType.kt | 29 - kotstd/kt/progressionUtil.kt | 71 - mcu_utils/fw/README.md | 8 - mcu_utils/fw/fancyblink.bin | Bin 5264 -> 0 bytes mcu_utils/fw/fancyblink.elf | Bin 94599 -> 0 bytes mcu_utils/fw/stm32f4-stock.bin | Bin 2097152 -> 0 bytes mcu_utils/fw/stm32f4_usb_cdc.bin | Bin 44652 -> 0 bytes mcu_utils/gdb.cmds | 3 - mcu_utils/linux-arm/st-flash | Bin 186852 -> 0 bytes mcu_utils/linux-arm/st-util | Bin 252196 -> 0 bytes mcu_utils/linux-x86_64/st-flash | Bin 252472 -> 0 bytes mcu_utils/macosx-x86_64/st-flash | Bin 80996 -> 0 bytes mcu_utils/macosx-x86_64/st-util | Bin 104716 -> 0 bytes mcu_utils/stm32.sh | 1 - proto/.gitignore | 1 - proto/compiler/.gitignore | 41 - proto/compiler/.idea/compiler.iml | 12 - proto/compiler/.idea/compiler.xml | 22 - .../.idea/copyright/profiles_settings.xml | 3 - .../.idea/libraries/KotlinJavaRuntime.xml | 12 - proto/compiler/.idea/misc.xml | 26 - proto/compiler/.idea/modules.xml | 8 - proto/compiler/Makefile | 70 - proto/compiler/README.md | 79 - proto/compiler/error_codes.txt | 4 - .../protobuf/compiler/kotlin/.deps/.dirstamp | 0 .../kotlin/.deps/kotlin_class_generator.Plo | 438 - .../kotlin/.deps/kotlin_file_generator.Plo | 448 - .../google/protobuf/compiler/kotlin/.dirstamp | 0 .../protobuf/compiler/kotlin/.idea/kotlin.iml | 15 - .../protobuf/compiler/kotlin/.idea/misc.xml | 21 - .../compiler/kotlin/.idea/modules.xml | 8 - .../kotlin/.libs/kotlin_class_generator.o | Bin 679312 -> 0 bytes .../kotlin/.libs/kotlin_file_generator.o | Bin 303360 -> 0 bytes .../google/protobuf/compiler/kotlin/Makefile | 81 - .../protoc-tests/kt_java_tests/build.gradle | 39 - .../gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - .../kotlin/protoc-tests/kt_java_tests/gradlew | 160 - .../protoc-tests/kt_java_tests/gradlew.bat | 90 - .../src/kt_java_tests/BaseExtendedTest.kt | 244 - .../src/kt_java_tests/ConnectTest.kt | 87 - .../src/kt_java_tests/CrossBranchTest.kt | 126 - .../src/kt_java_tests/DirectionTest.kt | 68 - .../src/kt_java_tests/Location.kt | 81 - .../src/kt_java_tests/MultipleMessagesTest.kt | 72 - .../src/kt_java_tests/RandomGen.kt | 7 - .../src/kt_java_tests/RepeatedVarintsTest.kt | 88 - .../src/kt_java_tests/RepeatedZigZag.kt | 62 - .../src/kt_java_tests/TagOrderTests.kt | 137 - .../kt_java_tests/src/kt_java_tests/Util.kt | 57 - .../src/kt_java_tests/VarintsTest.kt | 223 - .../src/kt_java_tests/ZigZagTests.kt | 144 - .../kt_java_tests/src/kt_java_tests/main.kt | 53 - .../protoc-tests/kt_js_tests/build.gradle | 72 - .../gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - .../kotlin/protoc-tests/kt_js_tests/gradlew | 160 - .../protoc-tests/kt_js_tests/gradlew.bat | 90 - .../kt_js_tests/helpers/kotlin.js | 23868 ---------------- .../kt_js_tests/helpers/package.json | 15 - .../kt_js_tests/helpers/prefix.js | 1 - .../kt_js_tests/src/tests/BaseExtendedTest.kt | 123 - .../kt_js_tests/src/tests/ConnectTest.kt | 37 - .../kt_js_tests/src/tests/CrossBranchTest.kt | 66 - .../kt_js_tests/src/tests/LocationTest.kt | 51 - .../src/tests/MultipleMessagesTest.kt | 46 - .../src/tests/RepeatedVarintsTest.kt | 52 - .../src/tests/RepeatedZigZagTest.kt | 36 - .../kt_js_tests/src/tests/TagOrderTest.kt | 65 - .../kt_js_tests/src/tests/Util.kt | 85 - .../kt_js_tests/src/tests/VarintsTest.kt | 52 - .../kt_js_tests/src/tests/ZigZagTest.kt | 37 - .../kt_js_tests/src/tests/main.kt | 39 - .../compiler/kotlin/protoc-tests/run_tests.sh | 28 - .../kotlin/src/UnreachableStateException.cc | 19 - .../kotlin/src/UnreachableStateException.h | 28 - .../kotlin/src/kotlin_class_generator.cc | 446 - .../kotlin/src/kotlin_class_generator.h | 63 - .../kotlin/src/kotlin_enum_generator.cc | 124 - .../kotlin/src/kotlin_enum_generator.h | 52 - .../kotlin/src/kotlin_field_generator.cc | 642 - .../kotlin/src/kotlin_field_generator.h | 102 - .../kotlin/src/kotlin_file_generator.cc | 67 - .../kotlin/src/kotlin_file_generator.h | 38 - .../kotlin/src/kotlin_name_resolver.cc | 235 - .../kotlin/src/kotlin_name_resolver.h | 67 - .../protobuf/compiler/kotlin/src/main.cc | 73 - .../compiler/kotlin/test/base_message.proto | 10 - .../compiler/kotlin/test/connect.proto | 14 - .../compiler/kotlin/test/cross_branch.proto | 32 - .../compiler/kotlin/test/direction.proto | 19 - .../kotlin/test/extended_message.proto | 11 - .../compiler/kotlin/test/location.proto | 16 - .../kotlin/test/multiple_messages.proto | 15 - .../kotlin/test/repeated_varints.proto | 13 - .../kotlin/test/repeated_zigzag.proto | 8 - .../compiler/kotlin/test/tag_order.proto | 16 - .../kotlin/test/tag_order_shuffled.proto | 16 - .../compiler/kotlin/test/varints.proto | 21 - .../compiler/kotlin/test/zigzag.proto | 8 - proto/compiler/pre-build.sh | 90 - proto/compiler/runtime/build.gradle | 29 - .../src/main/kotlin/CodedInputStream.kt | 216 - .../src/main/kotlin/CodedOutputStream.kt | 167 - .../src/main/kotlin/KotlinInputStream.kt | 25 - .../src/main/kotlin/KotlinOutputStream.kt | 20 - .../runtime/src/main/kotlin/WireFormat.kt | 164 - .../runtime/src/main/kotlin/WireType.kt | 29 - proto/protofiles_sources/compile_proto.sh | 6 - .../server_car/carkot.proto | 16 - .../server_car/connect.proto | 12 - .../protofiles_sources/server_car/debug.proto | 25 - .../server_car/direction.proto | 15 - .../server_car/location.proto | 13 - .../protofiles_sources/server_car/route.proto | 16 - .../server_car/route_done.proto | 10 - .../protofiles_sources/server_car/sonar.proto | 27 - .../protofiles_sources/server_car/task.proto | 15 - .../server_client/client_debug.proto | 19 - .../server_client/direction.proto | 15 - .../server_client/generic_response.proto | 9 - .../server_client/mode_change.proto | 12 - .../server_client/waypoints.proto | 9 - server/.gitignore | 5 - server/.idea/compiler.xml | 26 - server/.idea/copyright/profiles_settings.xml | 3 - server/.idea/gradle.xml | 17 - ..._jetbrains_kotlin_kotlin_runtime_1_0_3.xml | 11 - ...g_jetbrains_kotlin_kotlin_stdlib_1_0_3.xml | 11 - server/.idea/misc.xml | 57 - server/.idea/modules.xml | 10 - server/.idea/modules/server.iml | 12 - server/README.md | 17 - server/build.gradle | 60 - server/gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - server/gradlew | 160 - server/gradlew.bat | 90 - server/room_config_example.xml | 9 - server/run.sh | 2 - server/settings.gradle | 2 - server/src/main/java/ClUtils.kt | 33 - server/src/main/java/Logger.kt | 27 - server/src/main/java/ServerMain.kt | 60 - .../main/java/algorithm/AbstractAlgorithm.kt | 176 - .../main/java/algorithm/AlgorithmThread.kt | 29 - .../src/main/java/algorithm/PrettyPrinting.kt | 25 - .../java/algorithm/RoomBypassingAlgorithm.kt | 305 - server/src/main/java/algorithm/RoomModel.kt | 9 - server/src/main/java/algorithm/RouteData.kt | 7 - .../src/main/java/algorithm/geometry/Angle.kt | 26 - .../main/java/algorithm/geometry/AngleData.kt | 18 - .../algorithm/geometry/DoubleComparison.kt | 15 - .../src/main/java/algorithm/geometry/Line.kt | 48 - .../src/main/java/algorithm/geometry/Point.kt | 7 - .../main/java/algorithm/geometry/Vector.kt | 34 - .../src/main/java/algorithm/geometry/Wall.kt | 112 - .../main/java/clInterface/DebugClInterface.kt | 62 - .../java/clInterface/executor/Algorithm.kt | 30 - .../clInterface/executor/CarsInformation.kt | 12 - .../clInterface/executor/CommandExecutor.kt | 7 - .../clInterface/executor/DebugInformation.kt | 53 - .../main/java/clInterface/executor/Explore.kt | 32 - .../java/clInterface/executor/RouteMetric.kt | 91 - .../main/java/clInterface/executor/Sonar.kt | 71 - server/src/main/java/net/Handler.kt | 8 - server/src/main/java/net/Routes.kt | 9 - server/src/main/java/net/ServerHandler.kt | 58 - server/src/main/java/net/car/Dropper.kt | 47 - server/src/main/java/net/car/client/Client.kt | 32 - .../main/java/net/car/server/Initializer.kt | 27 - server/src/main/java/net/car/server/Server.kt | 38 - .../net/car/server/handlers/CarConnection.kt | 22 - .../main/java/net/web/server/Initializer.kt | 31 - server/src/main/java/net/web/server/Server.kt | 63 - .../net/web/server/handlers/ChangeMode.kt | 38 - .../net/web/server/handlers/DirectionOrder.kt | 45 - .../net/web/server/handlers/GetRoomModel.kt | 57 - server/src/main/java/objects/Car.kt | 17 - server/src/main/java/objects/CarConnection.kt | 11 - server/src/main/java/objects/CarReal.kt | 40 - server/src/main/java/objects/Environment.kt | 21 - .../main/java/objects/emulator/CarEmulator.kt | 130 - .../java/objects/emulator/EmulatedRoom.kt | 44 - .../java/objects/emulator/EmulatedWall.kt | 27 - .../objects/emulator/ListenableFutureImpl.kt | 54 - server/src/main/java/objects/emulator/Rng.kt | 28 - .../main/java/roomScanner/CarController.kt | 96 - .../src/main/java/roomScanner/RoomScanner.kt | 43 - server/src/main/java/roomScanner/utils.kt | 65 - .../.idea/copyright/profiles_settings.xml | 3 - translator/gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 0 bytes translator/gradlew.bat | 90 - ui/index.html | 77 - ui/scripts/algorithms/perimeter.js | 58 - ui/scripts/index.js | 192 - ui/scripts/proto/client_debug.proto | 16 - ui/scripts/proto/direction.proto | 15 - ui/scripts/proto/generic_response.proto | 9 - ui/scripts/proto/mode_change.proto | 12 - ui/scripts/proto/waypoints.proto | 9 - ui/scripts/protobufjs/bytebuffer.js | 3746 --- ui/scripts/protobufjs/long.js | 1209 - ui/scripts/protobufjs/protobuf.js | 5242 ---- ui/scripts/util/drawing.js | 255 - ui/server.py | 18 - ui/styles/style.css | 49 - 746 files changed, 154708 deletions(-) delete mode 100755 build.sh delete mode 100644 car_cfmw/.gitignore delete mode 100644 car_cfmw/Makefile delete mode 100644 car_cfmw/README.md delete mode 100644 car_cfmw/src/main.c delete mode 100644 car_cfmw/src/stm32_flash.ld delete mode 100644 car_fmw/.gitignore delete mode 100644 car_fmw/Makefile delete mode 100644 car_fmw/src/Control.kt delete mode 100644 car_fmw/src/ProtoRW.kt delete mode 100644 car_fmw/src/Tests.kt delete mode 100644 car_fmw/src/Voyager.kt delete mode 100644 car_fmw/src/include/Button.kt delete mode 100644 car_fmw/src/include/Connection.kt delete mode 100644 car_fmw/src/include/DebugInfo.kt delete mode 100644 car_fmw/src/include/Engine.kt delete mode 100644 car_fmw/src/include/Leds.kt delete mode 100644 car_fmw/src/include/Memory.kt delete mode 100644 car_fmw/src/include/Random.kt delete mode 100644 car_fmw/src/include/Sonar.kt delete mode 100644 car_fmw/src/include/Time.kt delete mode 100644 car_fmw/src/include/utils.kt delete mode 100644 car_fmw/src/main.kt delete mode 100644 car_fmw/stm32_flash.ld delete mode 100644 car_hw/.gitignore delete mode 100644 car_hw/Makefile delete mode 100644 car_hw/src/assert.c delete mode 100644 car_hw/src/car_conn.c delete mode 100644 car_hw/src/car_engine.c delete mode 100644 car_hw/src/car_leds.c delete mode 100644 car_hw/src/car_random.c delete mode 100644 car_hw/src/car_sonar.c delete mode 100644 car_hw/src/car_time.c delete mode 100644 car_hw/src/car_user_btn.c delete mode 100644 car_hw/src/include/car_conn.h delete mode 100644 car_hw/src/include/car_engine.h delete mode 100644 car_hw/src/include/car_leds.h delete mode 100644 car_hw/src/include/car_random.h delete mode 100644 car_hw/src/include/car_sonar.h delete mode 100644 car_hw/src/include/car_time.h delete mode 100644 car_hw/src/include/car_user_btn.h delete mode 100644 car_hw/src/include/stm32f4xx_conf.h delete mode 100644 car_hw/src/lib/cmsis/Makefile delete mode 100644 car_hw/src/lib/cmsis/arm_common_tables.h delete mode 100644 car_hw/src/lib/cmsis/arm_math.h delete mode 100644 car_hw/src/lib/cmsis/core_cm0.h delete mode 100644 car_hw/src/lib/cmsis/core_cm3.h delete mode 100644 car_hw/src/lib/cmsis/core_cm4.h delete mode 100644 car_hw/src/lib/cmsis/core_cm4_simd.h delete mode 100644 car_hw/src/lib/cmsis/core_cmFunc.h delete mode 100644 car_hw/src/lib/cmsis/core_cmInstr.h delete mode 100644 car_hw/src/lib/cmsis/startup_stm32f4xx.s delete mode 100644 car_hw/src/lib/cmsis/stm32f4xx.h delete mode 100644 car_hw/src/lib/cmsis/system_stm32f4xx.c delete mode 100644 car_hw/src/lib/cmsis/system_stm32f4xx.h delete mode 100644 car_hw/src/lib/stdperiph/Makefile delete mode 100644 car_hw/src/lib/stdperiph/misc.c delete mode 100644 car_hw/src/lib/stdperiph/misc.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_adc.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_adc.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_can.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_can.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_crc.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_crc.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_cryp.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_cryp.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_cryp_aes.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_cryp_des.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_cryp_tdes.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_dac.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_dac.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_dbgmcu.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_dbgmcu.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_dcmi.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_dcmi.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_dma.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_dma.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_exti.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_exti.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_flash.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_flash.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_fsmc.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_fsmc.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_gpio.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_gpio.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_hash.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_hash.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_hash_md5.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_hash_sha1.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_i2c.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_i2c.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_iwdg.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_iwdg.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_pwr.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_pwr.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_rcc.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_rcc.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_rng.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_rng.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_rtc.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_rtc.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_sdio.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_sdio.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_spi.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_spi.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_syscfg.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_syscfg.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_tim.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_tim.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_usart.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_usart.h delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_wwdg.c delete mode 100644 car_hw/src/lib/stdperiph/stm32f4xx_wwdg.h delete mode 100644 car_hw/src/lib/stm32f4d/MCD-ST Image SW License Agreement 19Jul2011 v0.1.pdf delete mode 100644 car_hw/src/lib/stm32f4d/Makefile delete mode 100644 car_hw/src/lib/stm32f4d/Release_Notes.html delete mode 100644 car_hw/src/lib/stm32f4d/libPDMFilter_GCC.a delete mode 100644 car_hw/src/lib/stm32f4d/libPDMFilter_IAR.a delete mode 100644 car_hw/src/lib/stm32f4d/libPDMFilter_Keil.lib delete mode 100644 car_hw/src/lib/stm32f4d/pdm_filter.h delete mode 100644 car_hw/src/lib/stm32f4d/stm32f4_discovery.c delete mode 100644 car_hw/src/lib/stm32f4d/stm32f4_discovery.h delete mode 100644 car_hw/src/lib/stm32f4d/stm32f4_discovery_audio_codec.c delete mode 100644 car_hw/src/lib/stm32f4d/stm32f4_discovery_audio_codec.h delete mode 100644 car_hw/src/lib/stm32f4d/stm32f4_discovery_lis302dl.c delete mode 100644 car_hw/src/lib/stm32f4d/stm32f4_discovery_lis302dl.h delete mode 100644 car_hw/src/lib/usart/Makefile delete mode 100644 car_hw/src/lib/usart/usart.c delete mode 100644 car_hw/src/lib/usart/usart.h delete mode 100644 car_hw/src/lib/usart/usart_test.c delete mode 100644 car_hw/src/lib/usart/usart_test.h delete mode 100644 car_hw/src/lib/usb_conf/usb_conf.h delete mode 100644 car_hw/src/lib/usb_conf/usbd_conf.h delete mode 100644 car_hw/src/lib/usb_conf/usbd_desc.h delete mode 100644 car_hw/src/lib/usb_conf/usbh_conf.h delete mode 100644 car_hw/src/lib/usb_device/Makefile delete mode 100644 car_hw/src/lib/usb_device/class/cdc/inc/usbd_cdc_core.h delete mode 100644 car_hw/src/lib/usb_device/class/cdc/src/usbd_cdc_core.c delete mode 100644 car_hw/src/lib/usb_device/core/inc/usbd_core.h delete mode 100644 car_hw/src/lib/usb_device/core/inc/usbd_def.h delete mode 100644 car_hw/src/lib/usb_device/core/inc/usbd_ioreq.h delete mode 100644 car_hw/src/lib/usb_device/core/inc/usbd_req.h delete mode 100644 car_hw/src/lib/usb_device/core/inc/usbd_usr.h delete mode 100644 car_hw/src/lib/usb_device/core/src/usbd_core.c delete mode 100644 car_hw/src/lib/usb_device/core/src/usbd_ioreq.c delete mode 100644 car_hw/src/lib/usb_device/core/src/usbd_req.c delete mode 100644 car_hw/src/lib/usb_otg/Makefile delete mode 100644 car_hw/src/lib/usb_otg/inc/usb_bsp.h delete mode 100644 car_hw/src/lib/usb_otg/inc/usb_core.h delete mode 100644 car_hw/src/lib/usb_otg/inc/usb_dcd.h delete mode 100644 car_hw/src/lib/usb_otg/inc/usb_dcd_int.h delete mode 100644 car_hw/src/lib/usb_otg/inc/usb_defines.h delete mode 100644 car_hw/src/lib/usb_otg/inc/usb_hcd.h delete mode 100644 car_hw/src/lib/usb_otg/inc/usb_hcd_int.h delete mode 100644 car_hw/src/lib/usb_otg/inc/usb_otg.h delete mode 100644 car_hw/src/lib/usb_otg/inc/usb_regs.h delete mode 100644 car_hw/src/lib/usb_otg/src/usb_core.c delete mode 100644 car_hw/src/lib/usb_otg/src/usb_dcd.c delete mode 100644 car_hw/src/lib/usb_otg/src/usb_dcd_int.c delete mode 100644 car_hw/src/lib/usb_otg/src/usb_hcd.c delete mode 100644 car_hw/src/lib/usb_otg/src/usb_hcd_int.c delete mode 100644 car_hw/src/lib/usb_otg/src/usb_otg.c delete mode 100644 car_hw/src/lib/usb_vcp/Makefile delete mode 100644 car_hw/src/lib/usb_vcp/README.txt delete mode 100644 car_hw/src/lib/usb_vcp/init.c delete mode 100644 car_hw/src/lib/usb_vcp/usb_bsp.c delete mode 100644 car_hw/src/lib/usb_vcp/usbd_cdc_vcp.c delete mode 100644 car_hw/src/lib/usb_vcp/usbd_cdc_vcp.h delete mode 100644 car_hw/src/lib/usb_vcp/usbd_desc.c delete mode 100644 car_hw/src/lib/usb_vcp/usbd_usr.c delete mode 100644 car_hw/src/stm32f4xx_it.c delete mode 100644 car_hw/src/stm32f4xx_it.h delete mode 100644 car_srv/clients/flash/.gitignore delete mode 100644 car_srv/clients/flash/.idea/compiler.xml delete mode 100644 car_srv/clients/flash/.idea/modules.xml delete mode 100644 car_srv/clients/flash/README.md delete mode 100644 car_srv/clients/flash/build.gradle delete mode 100755 car_srv/clients/flash/compileProto.sh delete mode 100644 car_srv/clients/flash/gradle/wrapper/gradle-wrapper.properties delete mode 100755 car_srv/clients/flash/gradlew delete mode 100755 car_srv/clients/flash/run.sh delete mode 100644 car_srv/clients/flash/settings.gradle delete mode 100644 car_srv/clients/flash/src/main/java/CodedInputStream.kt delete mode 100644 car_srv/clients/flash/src/main/java/CodedOutputStream.kt delete mode 100644 car_srv/clients/flash/src/main/java/InvalidProtocolBufferException.kt delete mode 100644 car_srv/clients/flash/src/main/java/Main.kt delete mode 100644 car_srv/clients/flash/src/main/java/WireFormat.kt delete mode 100644 car_srv/clients/flash/src/main/java/WireType.kt delete mode 100644 car_srv/clients/flash/src/main/java/carkot.kt delete mode 100644 car_srv/clients/flash/src/main/java/client/Client.kt delete mode 100644 car_srv/clients/flash/src/main/java/client/ClientHandler.kt delete mode 100644 car_srv/clients/flash/src/main/java/client/ClientInitializer.kt delete mode 100644 car_srv/clients/rc/.gitignore delete mode 100644 car_srv/clients/rc/README.md delete mode 100644 car_srv/clients/rc/build.gradle delete mode 100755 car_srv/clients/rc/compileProto.sh delete mode 100644 car_srv/clients/rc/gradle/wrapper/gradle-wrapper.jar delete mode 100644 car_srv/clients/rc/gradle/wrapper/gradle-wrapper.properties delete mode 100755 car_srv/clients/rc/gradlew delete mode 100644 car_srv/clients/rc/gradlew.bat delete mode 100755 car_srv/clients/rc/run.sh delete mode 100644 car_srv/clients/rc/settings.gradle delete mode 100644 car_srv/clients/rc/src/main/java/CarControl.kt delete mode 100644 car_srv/clients/rc/src/main/java/CodedInputStream.kt delete mode 100644 car_srv/clients/rc/src/main/java/CodedOutputStream.kt delete mode 100644 car_srv/clients/rc/src/main/java/InvalidProtocolBufferException.kt delete mode 100644 car_srv/clients/rc/src/main/java/Main.kt delete mode 100644 car_srv/clients/rc/src/main/java/WireFormat.kt delete mode 100644 car_srv/clients/rc/src/main/java/WireType.kt delete mode 100644 car_srv/clients/rc/src/main/java/clientClasses/Client.kt delete mode 100644 car_srv/clients/rc/src/main/java/clientClasses/ClientHandler.kt delete mode 100644 car_srv/clients/rc/src/main/java/clientClasses/ClientInitializer.kt delete mode 100644 car_srv/clients/rc/src/main/java/direction.kt delete mode 100644 car_srv/clients/rc/src/main/java/rc_session.kt delete mode 100644 car_srv/kotlinSrv/.gitignore delete mode 100644 car_srv/kotlinSrv/.idea/.name delete mode 100644 car_srv/kotlinSrv/.idea/compiler.xml delete mode 100644 car_srv/kotlinSrv/.idea/copyright/profiles_settings.xml delete mode 100644 car_srv/kotlinSrv/.idea/gradle.xml delete mode 100644 car_srv/kotlinSrv/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_js_library_1_0_3.xml delete mode 100644 car_srv/kotlinSrv/.idea/misc.xml delete mode 100644 car_srv/kotlinSrv/.idea/modules.xml delete mode 100644 car_srv/kotlinSrv/.idea/modules/CarServer.iml delete mode 100644 car_srv/kotlinSrv/README.md delete mode 100644 car_srv/kotlinSrv/build.gradle delete mode 100755 car_srv/kotlinSrv/build.sh delete mode 100755 car_srv/kotlinSrv/deploy.sh delete mode 100644 car_srv/kotlinSrv/gradle/wrapper/gradle-wrapper.jar delete mode 100644 car_srv/kotlinSrv/gradle/wrapper/gradle-wrapper.properties delete mode 100755 car_srv/kotlinSrv/gradlew delete mode 100644 car_srv/kotlinSrv/gradlew.bat delete mode 100644 car_srv/kotlinSrv/kotlinJsRequiredFiles/connectKotlinLib.js delete mode 100644 car_srv/kotlinSrv/kotlinJsRequiredFiles/kotlin.js delete mode 100644 car_srv/kotlinSrv/package.json delete mode 100755 car_srv/kotlinSrv/run.sh delete mode 100644 car_srv/kotlinSrv/settings.gradle delete mode 100644 car_srv/kotlinSrv/src/Config.kt delete mode 100644 car_srv/kotlinSrv/src/JSImport.kt delete mode 100644 car_srv/kotlinSrv/src/MCConnectObserver.kt delete mode 100644 car_srv/kotlinSrv/src/MCConnection.kt delete mode 100644 car_srv/kotlinSrv/src/Main.kt delete mode 100644 car_srv/kotlinSrv/src/McConditionMonitor.kt delete mode 100644 car_srv/kotlinSrv/src/McState.kt delete mode 100644 car_srv/kotlinSrv/src/control/Controller.kt delete mode 100644 car_srv/kotlinSrv/src/control/car/ControllerToUsb.kt delete mode 100644 car_srv/kotlinSrv/src/net/Client.kt delete mode 100644 car_srv/kotlinSrv/src/net/server/Server.kt delete mode 100644 car_srv/kotlinSrv/src/net/server/handlers/AbstractHandler.kt delete mode 100644 car_srv/kotlinSrv/src/net/server/handlers/debug/Memory.kt delete mode 100644 car_srv/kotlinSrv/src/net/server/handlers/debug/Sonar.kt delete mode 100644 car_srv/kotlinSrv/src/net/server/handlers/flash/LoadBin.kt delete mode 100644 car_srv/kotlinSrv/src/net/server/handlers/main/GetSonarData.kt delete mode 100644 car_srv/kotlinSrv/src/net/server/handlers/main/SetRoute.kt delete mode 100644 car_srv/kotlinSrv/src/net/server/handlers/main/SetRouteMetric.kt delete mode 100644 car_srv/kotlinSrv/src/net/server/handlers/main/SonarExplore.kt delete mode 100644 car_srv/kotlinSrv/src/net/server/handlers/rc/Control.kt delete mode 100644 car_srv/src/.gitignore delete mode 100644 car_srv/src/.idea/misc.xml delete mode 100644 car_srv/src/.idea/modules.xml delete mode 100644 car_srv/src/.idea/stFlashServer.iml delete mode 100644 car_srv/src/car.js delete mode 100644 car_srv/src/client.js delete mode 100644 car_srv/src/handlers/controlHandler.js delete mode 100644 car_srv/src/handlers/loadBinHandler.js delete mode 100644 car_srv/src/handlers/setRouteHandler.js delete mode 100644 car_srv/src/main.js delete mode 100644 car_srv/src/package.json delete mode 100644 car_srv/src/proto/carkot.proto delete mode 100644 car_srv/src/proto/connect.proto delete mode 100644 car_srv/src/proto/direction.proto delete mode 100644 car_srv/src/proto/location.proto delete mode 100644 car_srv/src/proto/route.proto delete mode 100644 car_srv/src/proto/route_done.proto delete mode 100644 car_srv/src/router.js delete mode 100644 car_srv/src/server.js rename {translator => experiments/translator}/.idea/compiler.xml (100%) rename {car_srv/clients/flash => experiments/translator}/.idea/copyright/profiles_settings.xml (100%) rename {translator => experiments/translator}/.idea/gradle.xml (100%) rename {translator => experiments/translator}/.idea/libraries/Gradle__com_github_jshmrsn_karg_a636b3e.xml (100%) rename {translator => experiments/translator}/.idea/libraries/Gradle__junit_junit_4_12.xml (100%) rename {translator => experiments/translator}/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml (100%) rename {translator => experiments/translator}/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_compiler_1_0_3.xml (100%) rename {translator => experiments/translator}/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_1.xml (100%) rename {translator => experiments/translator}/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_1.xml (100%) rename {translator => experiments/translator}/.idea/misc.xml (100%) rename {translator => experiments/translator}/.idea/modules.xml (100%) rename {translator => experiments/translator}/.idea/modules/ast-kotlin.iml (100%) rename {translator => experiments/translator}/.idea/modules/ast-kotlin_main.iml (100%) rename {translator => experiments/translator}/.idea/modules/ast-kotlin_test.iml (100%) rename {translator => experiments/translator}/.idea/modules/translator.iml (100%) rename {translator => experiments/translator}/.idea/modules/translator_main.iml (100%) rename {translator => experiments/translator}/.idea/modules/translator_test.iml (100%) rename {translator => experiments/translator}/.idea/uiDesigner.xml (100%) rename {translator => experiments/translator}/.idea/vcs.xml (100%) rename LICENSE => experiments/translator/LICENSE (100%) rename {translator => experiments/translator}/Makefile (100%) rename {translator => experiments/translator}/README.md (100%) rename {translator => experiments/translator}/build.gradle (100%) rename {car_srv/clients/flash => experiments/translator}/gradle/wrapper/gradle-wrapper.jar (100%) rename {translator => experiments/translator}/gradle/wrapper/gradle-wrapper.properties (100%) rename {translator => experiments/translator}/gradlew (100%) rename {car_srv/clients/flash => experiments/translator}/gradlew.bat (100%) rename {translator => experiments/translator}/run_one_test.sh (100%) rename {translator => experiments/translator}/run_tests.sh (100%) rename {translator => experiments/translator}/settings.gradle (100%) rename {translator => experiments/translator}/src/main/kotlin/DefaultArguments.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/main.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/ProjectTranslator.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/codegens/BlockCodegen.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/codegens/ClassCodegen.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/codegens/FunctionCodegen.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/codegens/ObjectCodegen.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/codegens/PropertyCodegen.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/codegens/StructCodegen.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/debug/debug.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/exceptions/TranslationException.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/exceptions/UnimplementedException.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMCall.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMClassVariable.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMConstant.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMLabel.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMNode.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMScope.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMSingleValue.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMArray.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMBooleanType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFloatType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFunctionType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMNullType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMStringType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt (100%) rename {translator => experiments/translator}/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMVoidType.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/array_extensions_1/array_extensions_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/array_extensions_1/array_extensions_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/array_extensions_2/array_extensions_2.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/array_extensions_2/array_extensions_2.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/assignment_operators_1/assignment_operators_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/assignment_operators_1/assignment_operators_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/booleanarray_1/booleanarray_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/booleanarray_1/booleanarray_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/bytearray_1/bytearray_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/bytearray_1/bytearray_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/callbacks_1/callbacks_1.c (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/callbacks_1/callbacks_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/callbacks_1/callbacks_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_alignment_1/class_alignment_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_alignment_1/class_alignment_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_class_argument_1/class_class_argument_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_class_argument_1/class_class_argument_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_default_argument_1/class_default_argument_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_default_argument_1/class_default_argument_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_init_section_1/class_init_section_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_init_section_1/class_init_section_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_method_access_1/class_method_access_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_method_access_1/class_method_access_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_methods_1/class_methods_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_methods_1/class_methods_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_reassignment_1/class_reassignment_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_reassignment_1/class_reassignment_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_reassignment_2/class_reassignment_2.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_reassignment_2/class_reassignment_2.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_variable_access_1/class_variable_access_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/class_variable_access_1/class_variable_access_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/classfields_1/classfields_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/classfields_1/classfields_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/classfields_2/classfields_2.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/classfields_2/classfields_2.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/companion_object_1/companion_object_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/companion_object_1/companion_object_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/companion_object_2/companion_object_2.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/companion_object_2/companion_object_2.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/complex_dot_expr/complex_dot_expr.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/complex_dot_expr/complex_dot_expr.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/declaration_test_1/declaration_test_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/declaration_test_1/declaration_test_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/dfs_1/dfs_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/dfs_1/dfs_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/different_type_binary_operator_1/different_type_binary_operator_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/different_type_binary_operator_1/different_type_binary_operator_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/do_while_1/do_while_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/do_while_1/do_while_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/elvis_1/elvis_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/elvis_1/elvis_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/enum_complex/enum_complex.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/enum_complex/enum_complex.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/enum_inner_fields/enum_inner_fields.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/enum_inner_fields/enum_inner_fields.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/floating_point_operators_1/floating_point_operators_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/floating_point_operators_1/floating_point_operators_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/for_1/for_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/for_1/for_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/function_default_arguments_1/function_default_arguments_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/function_default_arguments_1/function_default_arguments_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/function_eq/function_eq.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/function_eq/function_eq.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/function_extensions_1/function_extensions_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/function_extensions_1/function_extensions_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/function_extensions_double_argument_1/function_extensions_double_argument_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/function_extensions_double_argument_1/function_extensions_double_argument_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/get_set_operators_1/get_set_operators_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/get_set_operators_1/get_set_operators_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/global_vars_1/global_vars_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/global_vars_1/global_vars_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/if_1/if_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/if_1/if_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/if_2/if_2.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/if_2/if_2.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/if_boolean_argument_1/if_boolean_argument_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/if_boolean_argument_1/if_boolean_argument_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/if_expression_1/if_expression_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/if_expression_1/if_expression_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/initialization_in_place_and_this_1/initialization_in_place_and_this_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/initialization_in_place_and_this_1/initialization_in_place_and_this_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/initialized_class_fields_1/initialized_class_fields_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/initialized_class_fields_1/initialized_class_fields_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/intarray_1/intarray_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/intarray_1/intarray_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/long_operations_1/long_operations_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/long_operations_1/long_operations_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/nested_classes/nested_classes.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/nested_classes/nested_classes.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/null_comparison_1/null_comparison_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/null_comparison_1/null_comparison_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/nullable_1/nullable_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/nullable_1/nullable_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/nullable_class_fields_1/nullable_class_fields_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/nullable_class_fields_1/nullable_class_fields_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/nullable_primitive_types_1/nullable_primitive_types_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/nullable_primitive_types_1/nullable_primitive_types_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/numeric_literals_1/numeric_literals_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/numeric_literals_1/numeric_literals_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/object_1/object_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/object_1/object_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/postfix_1/postfix_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/postfix_1/postfix_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/primitives_1/primitives_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/primitives_1/primitives_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_crossbranch_test/proto_crossbranch_test.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_crossbranch_test/proto_crossbranch_test.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_location_test/proto_location_test.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_location_test/proto_location_test.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_multiple_messages/proto_multiple_messages.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_multiple_messages/proto_multiple_messages.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_repeated_varint/proto_repeated_varint.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_repeated_varint/proto_repeated_varint.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_repeated_zigzag/proto_repeated_zigzag.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_repeated_zigzag/proto_repeated_zigzag.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_tagorder_test/proto_tagorder_test.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_tagorder_test/proto_tagorder_test.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_varint/proto_varint.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_varint/proto_varint.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_zigzag/proto_zigzag.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/proto_zigzag/proto_zigzag.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/range_operator_1/range_operator_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/range_operator_1/range_operator_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/reassigment_0/reassigment_0.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/reassigment_0/reassigment_0.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/reassigment_1/reassigment_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/reassigment_1/reassigment_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/referential_equality_1/referential_equality_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/referential_equality_1/referential_equality_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/referential_equality_2/referential_equality_2.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/referential_equality_2/referential_equality_2.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/return_1/return_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/return_1/return_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/safe_access_operator/safe_access_operator.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/safe_access_operator/safe_access_operator.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/secondary_constructor_1/secondary_constructor_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/secondary_constructor_1/secondary_constructor_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/serialization_test/serialization_test.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/serialization_test/serialization_test.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/simple_class_2/simple_class_2.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/simple_class_2/simple_class_2.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/simple_proto_test_1/simple_proto_test_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/simple_proto_test_1/simple_proto_test_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/simply_class_1/simply_class_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/simply_class_1/simply_class_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/smartcast_1/smartcast_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/smartcast_1/smartcast_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/stress_test_1/stress_test_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/stress_test_1/stress_test_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/string_print_test_1/string_print_test_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/string_print_test_1/string_print_test_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/this_test_1/this_test_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/this_test_1/this_test_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/unary_operators_1/unary_operators_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/unary_operators_1/unary_operators_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/variables_assigment_1/variables_assigment_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/variables_assigment_1/variables_assigment_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/when_block/when_block.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/when_block/when_block.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/when_expression_1/when_expression_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/when_expression_1/when_expression_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/while_1/while_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/while_1/while_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/while_2/while_2.c (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/while_2/while_2.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/while_2/while_2.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/while_argument_side_effects_1/while_argument_side_effects_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/while_argument_side_effects_1/while_argument_side_effects_1.txt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/while_break_1/while_break_1.kt (100%) rename {translator => experiments/translator}/src/test/kotlin/tests/while_break_1/while_break_1.txt (100%) delete mode 100644 kotstd/Makefile delete mode 100644 kotstd/c/arm.c delete mode 100644 kotstd/c/array_c.c delete mode 100644 kotstd/c/assert_c.c delete mode 100644 kotstd/c/console_c.c delete mode 100644 kotstd/c/memory.c delete mode 100644 kotstd/c/primitives_c.c delete mode 100644 kotstd/kt/Assert.kt delete mode 100644 kotstd/kt/BooleanArray.kt delete mode 100644 kotstd/kt/ByteArray.kt delete mode 100644 kotstd/kt/CodedInputStream.kt delete mode 100644 kotstd/kt/CodedOutputStream.kt delete mode 100644 kotstd/kt/Console.kt delete mode 100644 kotstd/kt/IntArray.kt delete mode 100644 kotstd/kt/Iterators.kt delete mode 100644 kotstd/kt/KotlinInputStream.kt delete mode 100644 kotstd/kt/KotlinOutputStream.kt delete mode 100644 kotstd/kt/LongArray.kt delete mode 100644 kotstd/kt/Primitives.kt delete mode 100644 kotstd/kt/Progressions.kt delete mode 100644 kotstd/kt/Ranges.kt delete mode 100644 kotstd/kt/ShortArray.kt delete mode 100644 kotstd/kt/WireFormat.kt delete mode 100644 kotstd/kt/WireType.kt delete mode 100644 kotstd/kt/progressionUtil.kt delete mode 100644 mcu_utils/fw/README.md delete mode 100644 mcu_utils/fw/fancyblink.bin delete mode 100644 mcu_utils/fw/fancyblink.elf delete mode 100755 mcu_utils/fw/stm32f4-stock.bin delete mode 100755 mcu_utils/fw/stm32f4_usb_cdc.bin delete mode 100644 mcu_utils/gdb.cmds delete mode 100755 mcu_utils/linux-arm/st-flash delete mode 100755 mcu_utils/linux-arm/st-util delete mode 100755 mcu_utils/linux-x86_64/st-flash delete mode 100755 mcu_utils/macosx-x86_64/st-flash delete mode 100755 mcu_utils/macosx-x86_64/st-util delete mode 100644 mcu_utils/stm32.sh delete mode 100644 proto/.gitignore delete mode 100644 proto/compiler/.gitignore delete mode 100644 proto/compiler/.idea/compiler.iml delete mode 100644 proto/compiler/.idea/compiler.xml delete mode 100644 proto/compiler/.idea/copyright/profiles_settings.xml delete mode 100644 proto/compiler/.idea/libraries/KotlinJavaRuntime.xml delete mode 100644 proto/compiler/.idea/misc.xml delete mode 100644 proto/compiler/.idea/modules.xml delete mode 100644 proto/compiler/Makefile delete mode 100644 proto/compiler/README.md delete mode 100644 proto/compiler/error_codes.txt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/.deps/.dirstamp delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/.deps/kotlin_class_generator.Plo delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/.deps/kotlin_file_generator.Plo delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/.dirstamp delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/.idea/kotlin.iml delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/.idea/misc.xml delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/.idea/modules.xml delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/.libs/kotlin_class_generator.o delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/.libs/kotlin_file_generator.o delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/Makefile delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/build.gradle delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradle/wrapper/gradle-wrapper.jar delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradle/wrapper/gradle-wrapper.properties delete mode 100755 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradlew delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradlew.bat delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/BaseExtendedTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/ConnectTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/CrossBranchTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/DirectionTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/Location.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/MultipleMessagesTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/RandomGen.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/RepeatedVarintsTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/RepeatedZigZag.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/TagOrderTests.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/Util.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/VarintsTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/ZigZagTests.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/main.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/build.gradle delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradle/wrapper/gradle-wrapper.jar delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradle/wrapper/gradle-wrapper.properties delete mode 100755 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradlew delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradlew.bat delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/helpers/kotlin.js delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/helpers/package.json delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/helpers/prefix.js delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/BaseExtendedTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/ConnectTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/CrossBranchTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/LocationTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/MultipleMessagesTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/RepeatedVarintsTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/RepeatedZigZagTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/TagOrderTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/Util.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/VarintsTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/ZigZagTest.kt delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/main.kt delete mode 100755 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/run_tests.sh delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/UnreachableStateException.cc delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/UnreachableStateException.h delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.h delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.cc delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.h delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.h delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_file_generator.cc delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_file_generator.h delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.cc delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.h delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/main.cc delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/base_message.proto delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/connect.proto delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/cross_branch.proto delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/direction.proto delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/extended_message.proto delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/location.proto delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/multiple_messages.proto delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/repeated_varints.proto delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/repeated_zigzag.proto delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/tag_order.proto delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/tag_order_shuffled.proto delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/varints.proto delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/test/zigzag.proto delete mode 100755 proto/compiler/pre-build.sh delete mode 100644 proto/compiler/runtime/build.gradle delete mode 100644 proto/compiler/runtime/src/main/kotlin/CodedInputStream.kt delete mode 100644 proto/compiler/runtime/src/main/kotlin/CodedOutputStream.kt delete mode 100644 proto/compiler/runtime/src/main/kotlin/KotlinInputStream.kt delete mode 100644 proto/compiler/runtime/src/main/kotlin/KotlinOutputStream.kt delete mode 100644 proto/compiler/runtime/src/main/kotlin/WireFormat.kt delete mode 100644 proto/compiler/runtime/src/main/kotlin/WireType.kt delete mode 100755 proto/protofiles_sources/compile_proto.sh delete mode 100644 proto/protofiles_sources/server_car/carkot.proto delete mode 100644 proto/protofiles_sources/server_car/connect.proto delete mode 100644 proto/protofiles_sources/server_car/debug.proto delete mode 100644 proto/protofiles_sources/server_car/direction.proto delete mode 100644 proto/protofiles_sources/server_car/location.proto delete mode 100644 proto/protofiles_sources/server_car/route.proto delete mode 100644 proto/protofiles_sources/server_car/route_done.proto delete mode 100644 proto/protofiles_sources/server_car/sonar.proto delete mode 100644 proto/protofiles_sources/server_car/task.proto delete mode 100644 proto/protofiles_sources/server_client/client_debug.proto delete mode 100644 proto/protofiles_sources/server_client/direction.proto delete mode 100644 proto/protofiles_sources/server_client/generic_response.proto delete mode 100644 proto/protofiles_sources/server_client/mode_change.proto delete mode 100644 proto/protofiles_sources/server_client/waypoints.proto delete mode 100644 server/.gitignore delete mode 100644 server/.idea/compiler.xml delete mode 100644 server/.idea/copyright/profiles_settings.xml delete mode 100644 server/.idea/gradle.xml delete mode 100644 server/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_3.xml delete mode 100644 server/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_3.xml delete mode 100644 server/.idea/misc.xml delete mode 100644 server/.idea/modules.xml delete mode 100644 server/.idea/modules/server.iml delete mode 100644 server/README.md delete mode 100644 server/build.gradle delete mode 100644 server/gradle/wrapper/gradle-wrapper.jar delete mode 100644 server/gradle/wrapper/gradle-wrapper.properties delete mode 100755 server/gradlew delete mode 100644 server/gradlew.bat delete mode 100644 server/room_config_example.xml delete mode 100755 server/run.sh delete mode 100644 server/settings.gradle delete mode 100644 server/src/main/java/ClUtils.kt delete mode 100644 server/src/main/java/Logger.kt delete mode 100644 server/src/main/java/ServerMain.kt delete mode 100644 server/src/main/java/algorithm/AbstractAlgorithm.kt delete mode 100644 server/src/main/java/algorithm/AlgorithmThread.kt delete mode 100644 server/src/main/java/algorithm/PrettyPrinting.kt delete mode 100644 server/src/main/java/algorithm/RoomBypassingAlgorithm.kt delete mode 100644 server/src/main/java/algorithm/RoomModel.kt delete mode 100644 server/src/main/java/algorithm/RouteData.kt delete mode 100644 server/src/main/java/algorithm/geometry/Angle.kt delete mode 100644 server/src/main/java/algorithm/geometry/AngleData.kt delete mode 100644 server/src/main/java/algorithm/geometry/DoubleComparison.kt delete mode 100644 server/src/main/java/algorithm/geometry/Line.kt delete mode 100644 server/src/main/java/algorithm/geometry/Point.kt delete mode 100644 server/src/main/java/algorithm/geometry/Vector.kt delete mode 100644 server/src/main/java/algorithm/geometry/Wall.kt delete mode 100644 server/src/main/java/clInterface/DebugClInterface.kt delete mode 100644 server/src/main/java/clInterface/executor/Algorithm.kt delete mode 100644 server/src/main/java/clInterface/executor/CarsInformation.kt delete mode 100644 server/src/main/java/clInterface/executor/CommandExecutor.kt delete mode 100644 server/src/main/java/clInterface/executor/DebugInformation.kt delete mode 100644 server/src/main/java/clInterface/executor/Explore.kt delete mode 100644 server/src/main/java/clInterface/executor/RouteMetric.kt delete mode 100644 server/src/main/java/clInterface/executor/Sonar.kt delete mode 100644 server/src/main/java/net/Handler.kt delete mode 100644 server/src/main/java/net/Routes.kt delete mode 100644 server/src/main/java/net/ServerHandler.kt delete mode 100644 server/src/main/java/net/car/Dropper.kt delete mode 100644 server/src/main/java/net/car/client/Client.kt delete mode 100644 server/src/main/java/net/car/server/Initializer.kt delete mode 100644 server/src/main/java/net/car/server/Server.kt delete mode 100644 server/src/main/java/net/car/server/handlers/CarConnection.kt delete mode 100644 server/src/main/java/net/web/server/Initializer.kt delete mode 100644 server/src/main/java/net/web/server/Server.kt delete mode 100644 server/src/main/java/net/web/server/handlers/ChangeMode.kt delete mode 100644 server/src/main/java/net/web/server/handlers/DirectionOrder.kt delete mode 100644 server/src/main/java/net/web/server/handlers/GetRoomModel.kt delete mode 100644 server/src/main/java/objects/Car.kt delete mode 100644 server/src/main/java/objects/CarConnection.kt delete mode 100644 server/src/main/java/objects/CarReal.kt delete mode 100644 server/src/main/java/objects/Environment.kt delete mode 100644 server/src/main/java/objects/emulator/CarEmulator.kt delete mode 100644 server/src/main/java/objects/emulator/EmulatedRoom.kt delete mode 100644 server/src/main/java/objects/emulator/EmulatedWall.kt delete mode 100644 server/src/main/java/objects/emulator/ListenableFutureImpl.kt delete mode 100644 server/src/main/java/objects/emulator/Rng.kt delete mode 100644 server/src/main/java/roomScanner/CarController.kt delete mode 100644 server/src/main/java/roomScanner/RoomScanner.kt delete mode 100644 server/src/main/java/roomScanner/utils.kt delete mode 100644 translator/.idea/copyright/profiles_settings.xml delete mode 100644 translator/gradle/wrapper/gradle-wrapper.jar delete mode 100644 translator/gradlew.bat delete mode 100644 ui/index.html delete mode 100644 ui/scripts/algorithms/perimeter.js delete mode 100644 ui/scripts/index.js delete mode 100644 ui/scripts/proto/client_debug.proto delete mode 100644 ui/scripts/proto/direction.proto delete mode 100644 ui/scripts/proto/generic_response.proto delete mode 100644 ui/scripts/proto/mode_change.proto delete mode 100644 ui/scripts/proto/waypoints.proto delete mode 100644 ui/scripts/protobufjs/bytebuffer.js delete mode 100644 ui/scripts/protobufjs/long.js delete mode 100644 ui/scripts/protobufjs/protobuf.js delete mode 100644 ui/scripts/util/drawing.js delete mode 100644 ui/server.py delete mode 100644 ui/styles/style.css diff --git a/build.sh b/build.sh deleted file mode 100755 index ef7d9cb5155..00000000000 --- a/build.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash -clr='\033[1;33m' -red='\033[0;31m' -nc='\033[0m' - -# ============= Building ================ -# Build Proto Compiler -echo -e "${clr}Building protoc compiler${nc}" -cd proto/compiler -echo -e "${clr}Checking prerequisites for building protoc${nc}" -./pre-build.sh -if [ $? -ne 0 ]; then - echo -e "${red}Error launching carkot/proto/compiler/pre-build.sh${nc}" - exit 1 -fi - -echo -e "${clr}Building protoc${nc}" -make -if [ $? -ne 0 ]; then - echo -e "${red}Error building protoc with carkot/proto/compiler/Makefile ${nc}" - exit 1 -fi -cd ../../ - -# Compile proto-files -echo -e "${clr}Compiling proto-files sources${nc}" -cd proto/protofiles_sources -./compile_proto.sh -if [ $? -ne 0 ]; then - echo -e "${red}Error compiling proto-files with carkot/proto/protofiles_sources/compile_proto.sh${nc}" - exit 1 -fi -cd ../../ - -# Build central server -echo -e "${clr}Building central server${nc}" -cd server -./gradlew build -if [ $? -ne 0 ]; then - echo -e "${red}Error building central server with carkot/server/gradlew build${nc}" - exit 1 -fi -cd ../ - -# Build Raspberry server -echo -e "${clr}Building Raspberry Pi server${nc}" -cd car_srv/kotlinSrv -./build.sh -if [ $? -ne 0 ]; then - echo -e "${red}Error building Raspberry Pi server with carkot/car_srv/kotlinSrv/build.sh${nc}" - exit 1 -fi -cd ../../ - -# Build Kotlin->Native translator -echo -e "${clr}Building translator${nc}" -cd translator -./gradlew jar -if [ $? -ne 0 ]; then - echo -e "${red}Error building translator with translator/gradlew jar${nc}" - exit 1 -fi -cd ../ - -# Build Kotstd libary for translator -echo -e "${clr}Building Kotstd${nc}" -cd kotstd -make -if [ $? -ne 0 ]; then - echo -e "${red}Error building Kotlin STDlib with kotstd/Makefile${nc}" - exit 1 -fi - - - diff --git a/car_cfmw/.gitignore b/car_cfmw/.gitignore deleted file mode 100644 index 86c36a2d66f..00000000000 --- a/car_cfmw/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -tags -bin diff --git a/car_cfmw/Makefile b/car_cfmw/Makefile deleted file mode 100644 index e90cce74bbd..00000000000 --- a/car_cfmw/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -SRC_DIR=src -BIN_DIR=bin - -CAR_FMW_OBJ=$(BIN_DIR)/car_fmw.o -CAR_FMW_ELF=$(BIN_DIR)/car_fmw.elf -CAR_FMW_BIN=$(BIN_DIR)/car_fmw.bin - -LIB_CARHW_DIR=../car_hw -LIB_CARHW_OBJ=$(LIB_CARHW_DIR)/bin/car_hw.o -LIB_CARHW_LIB_DIR=$(LIB_CARHW_DIR)/src/lib/ - -CC=arm-none-eabi-gcc -AS=arm-none-eabi-as -LD=arm-none-eabi-ld -OBJ_COPY=arm-none-eabi-objcopy - -INCLUDES=-I$(LIB_CARHW_LIB_DIR)/cmsis \ - -I$(LIB_CARHW_LIB_DIR)/stdperiph \ - -I$(LIB_CARHW_LIB_DIR)/stm32f4d \ - -I$(LIB_CARHW_LIB_DIR)/usb_device \ - -I$(LIB_CARHW_LIB_DIR)/usb_otg \ - -I$(LIB_CARHW_LIB_DIR)/usb_vcp \ - -I$(LIB_CARHW_LIB_DIR)/usart \ - -I$(LIB_CARHW_DIR)/src/include \ - -I$(SRC_DIR) - -DEFINES=-DUSE_STM32_DISCOVERY=1 -DUSE_STDPERIPH_DRIVER=1 -DSTM32F4XX=1 -DHSE_VALUE=8000000 -CFLAGS=-g -nostdlib -ffreestanding -O0 \ - -mcpu=cortex-m3 -mfloat-abi=soft -mthumb \ - $(DEFINES) -ASMFLAGS=-g -mthumb - -LD_ALL_DEPS=$(LD) -r $(filter %.o,$^) -o $@ -CC_ALL_DEPS=$(CC) $(CFLAGS) -c $(INCLUDES) $(filter %.c,$^) -o $@ -AS_ALL_DEPS=$(AS) $(ASMFLAGS) $(filter %.s,$^) -o $@ - -dirhs=$(wildcard $(1)/*.h) -dircs=$(wildcard $(1)/*.c) -dircs_to_prefxd_objs=\ - $(patsubst $(1)/%.c,$(BIN_DIR)/$(2)%.o,$(call dircs,$1)) - -CARFMW_OBJ_PREFIX=carfmw_ - -$(CAR_FMW_BIN): $(CAR_FMW_ELF) $(BIN_DIR) - $(OBJ_COPY) -O binary $< $@ - -$(CAR_FMW_ELF): $(LIB_CARHW_OBJ) $(CAR_FMW_OBJ) - $(CC) $(CFLAGS) $^ -T $(SRC_DIR)/stm32_flash.ld -o $@ - -$(CAR_FMW_OBJ): \ - $(call dircs_to_prefxd_objs,$(SRC_DIR),$(CARFMW_OBJ_PREFIX)) - $(LD_ALL_DEPS) - -$(BIN_DIR)/$(CARFMW_OBJ_PREFIX)%.o: $(SRC_DIR)/%.c \ - $(call dirhs,$(SRC_DIR)) - $(CC_ALL_DEPS) - -$(LIB_CARHW_OBJ): - make -C $(LIB_CARHW_DIR) - -$(BIN_DIR): - mkdir -p $(BIN_DIR) - -clean: - rm -rf bin/* - make -C $(LIB_CARHW_DIR) clean - -tags: - ctags -R * $(LIB_CARHW_DIR) - -.PHONY: clean tags diff --git a/car_cfmw/README.md b/car_cfmw/README.md deleted file mode 100644 index 7b7925b0cef..00000000000 --- a/car_cfmw/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Car firmware project for low level experimentation -using C. diff --git a/car_cfmw/src/main.c b/car_cfmw/src/main.c deleted file mode 100644 index 081a0aeb0f1..00000000000 --- a/car_cfmw/src/main.c +++ /dev/null @@ -1,105 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -size_t strlen(const char *str) -{ - size_t len = 0; - - while (str[len]) - ++len; - return len; -} - -char digit_to_char(uint8_t digit) -{ - if (digit <= 9) - return '0' + digit; - else return 'A' + (digit - 10); -} - -// Should allow to store up to "65535\0" -char uint16_str[6] = "65535"; - -char *uint16_to_str(uint16_t val) -{ - int dix = 4; - for (; dix >= 0; --dix) { - uint8_t digit = (uint8_t)(val % 10); - uint16_str[dix] = digit_to_char(digit); - val = val / 10; - if (val == 0) - break; - } - if (dix == -1) - dix = 0; - return &uint16_str[dix]; -} - -void sonar_prog_dist_to_conn(void) -{ - while (1) { - uint16_t dist = 0; - - car_leds_clear_all(); - dist = car_sonar_get_dist(90); - - if (dist == CAR_SONAR_DIST_ERR) - car_led_set(CAR_LED_RED, true); - else { - car_led_set(CAR_LED_GREEN, true); - const char *str = uint16_to_str(dist); - car_conn_snd_buf(strlen(str), (int)str); - car_conn_snd_byte('\n'); - } - car_time_wait(1000); - } -} - -void sonar_prog_rotate(void) -{ - uint8_t degree = 0; - while (1) { - uint16_t dist = 0; - - car_leds_clear_all(); - dist = car_sonar_get_dist(degree); - if (degree == 0 || - degree == 45 || - degree == 90 || - degree == (90 + 45) || - degree == 180) - car_time_wait(500); - - degree += 5; - if (degree > 180) - degree = 0; - if (dist == CAR_SONAR_DIST_ERR) - car_led_set(CAR_LED_RED, true); - else - car_led_set(CAR_LED_GREEN, true); - car_time_wait(300); - } -} - -int main(void) -{ - car_time_init(); - car_leds_init(); - car_engine_init(); - car_user_btn_init(NULL); - car_conn_init(); - car_sonar_init(); - - car_sonar_get_dist(0); - car_time_wait(3000); - car_sonar_get_dist(180); - car_time_wait(3000); - /* sonar_prog_rotate(); */ - sonar_prog_dist_to_conn(); - // Also we can run usart test from here -} diff --git a/car_cfmw/src/stm32_flash.ld b/car_cfmw/src/stm32_flash.ld deleted file mode 100644 index 9a10d57b3c1..00000000000 --- a/car_cfmw/src/stm32_flash.ld +++ /dev/null @@ -1,177 +0,0 @@ -/* -***************************************************************************** -** -** File : stm32_flash.ld -** -** Abstract : Linker script for STM32F407VG Device with -** 1024KByte FLASH, 192KByte RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** Environment : Atollic TrueSTUDIO(R) -** -** Distribution: The file is distributed “as is,” without any warranty -** of any kind. -** -** (c)Copyright Atollic AB. -** You may use this file as-is or modify it according to the needs of your -** project. Distribution of this file (unmodified or modified) is not -** permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the -** rights to distribute the assembled, compiled & linked contents of this -** file as part of an application binary file, provided that it is built -** using the Atollic TrueSTUDIO(R) toolchain. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* - * _estack is the highest address of user mode stack - * (sp initial value, stack grows down). - * We have 192K RAM on our MCU and _estack should be 0x20030000. - * But our MCU maps only 128K SRAM at 0x20000000 after boot. - * We need to perform some memory remapping to use more. - * This isn't implemented yet. - */ -_estack = 0x20020000; /* end of 128K SRAM region */ - -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0; /* required amount of heap */ -_Min_Stack_Size = 0x400; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K - MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = .; - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : AT ( _sidata ) - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM - - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack : - { - . = ALIGN(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - /* MEMORY_bank1 section, code must be located here explicitly */ - /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */ - .memory_b1_text : - { - *(.mb1text) /* .mb1text sections (code) */ - *(.mb1text*) /* .mb1text* sections (code) */ - *(.mb1rodata) /* read-only data (constants) */ - *(.mb1rodata*) - } >MEMORY_B1 - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/car_fmw/.gitignore b/car_fmw/.gitignore deleted file mode 100644 index 9e51373e336..00000000000 --- a/car_fmw/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -bin -tags -lib diff --git a/car_fmw/Makefile b/car_fmw/Makefile deleted file mode 100644 index 6578b72cfbb..00000000000 --- a/car_fmw/Makefile +++ /dev/null @@ -1,92 +0,0 @@ -BIN_DIR=$(PWD)/bin -SRC_DIR=$(PWD)/src -LIB_DIR=$(PWD)/lib -TRANSLATOR_DIR=$(PWD)/../translator -KOTSTD_DIR=$(PWD)/../kotstd -CAR_HW_DIR=$(PWD)/../car_hw -PROTO_DIR=$(PWD)/../proto/protofiles_sources/out - -OS_ARCH=linux-x86_64 - -CAR_FMW_OBJ=$(BIN_DIR)/car_fmw.o -CAR_FMW_ELF=$(BIN_DIR)/car_fmw.elf -CAR_FMW_BIN=$(BIN_DIR)/car_fmw.bin -ST_DIR=$(PWD)/../mcu_utils/$(OS_ARCH) - -LIB_KOT=$(BIN_DIR)/kotlib.o -LIB_KOTSTD=$(KOTSTD_DIR)/build/stdlib_arm.ll -LIB_CAR_HW=$(CAR_HW_DIR)/bin/car_hw.o - -CC=arm-none-eabi-gcc -AS=arm-none-eabi-as -KT=$(TRANSLATOR_DIR)/build/libs/translator-1.0.jar -LD=arm-none-eabi-ld -OBJ_COPY=arm-none-eabi-objcopy -GDB=arm-none-eabi-gdb - -LL=llc-3.6 -LLINK=llvm-link-3.6 - -KTFLAGS=-I $(KOTSTD_DIR)/include --arm -LLINK_FLAGS=-S -ASMFLAGS=-g -mthumb -LLFLAGS=-O0 - -DEFINES=-DUSE_STM32_DISCOVERY=1 -DUSE_STDPERIPH_DRIVER=1 -DSTM32F4XX=1 -DHSE_VALUE=8000000 -CFLAGS=-g -nostdlib -ffreestanding -O0 \ - -mcpu=cortex-m3 -mfloat-abi=soft -mthumb \ - $(DEFINES) - -LD_ALL_DEPS=$(LD) -r $(filter %.o,$^) -o $@ -AS_ALL_DEPS=$(AS) $(ASMFLAGS) $(filter %.s,$^) -o $@ -LL_ALL_DEPS=$(LL) $(LLFLAGS) $(filter %.ll, $^) -o $@ -KT_ALL_DEPS=java -jar $(KT) $(KTFLAGS) -o $@ $(filter %.kt, $^) -LLINK_ALL_DEPS=$(LLINK) $(LLINK_FLAGS) $(filter %.ll,$^) > $@ - -all: $(KT) $(CAR_FMW_BIN) - -$(CAR_FMW_BIN): $(CAR_FMW_ELF) $(BIN_DIR) - $(OBJ_COPY) -O binary $< $@ - -$(CAR_FMW_ELF): $(LIB_CAR_HW) $(LIB_KOT) - $(CC) -Os $(CFLAGS) $^ -T stm32_flash.ld -o $@ - -$(LIB_CAR_HW): - cd $(CAR_HW_DIR) && make - -$(BIN_DIR): - mkdir -p $(BIN_DIR) - -$(LIB_KOT): $(BIN_DIR)/kotlib.s - $(AS_ALL_DEPS) - -$(BIN_DIR)/kotlib.s: $(BIN_DIR)/kotlib.ll - $(LL_ALL_DEPS) - -$(BIN_DIR)/kotlib.ll: $(LIB_DIR)/app.ll $(LIB_KOTSTD) - $(LLINK_ALL_DEPS) - -$(LIB_KOTSTD): - cd $(KOTSTD_DIR) && make - -$(LIB_DIR)/app.ll: $(SRC_DIR)/**/*.kt $(SRC_DIR)/*.kt $(PROTO_DIR)/*.kt - $(KT_ALL_DEPS) - -$(KT): - cd $(TRANSLATOR_DIR) && ./gradlew jar - -flash: $(CAR_FMW_BIN) - $(ST_DIR)/st-flash write $(CAR_FMW_BIN) 0x8000000 - -debug: - -killall st-util - (setsid $(ST_DIR)/st-util 2>/dev/null 1>&2)& - $(GDB) $(CAR_FMW_ELF) -tui -x $(ST_DIR)/../gdb.cmds - -clean: - rm -rf bin/* - rm -rf lib/* - cd $(CAR_HW_DIR) && make clean - cd $(KOTSTD_DIR) && make clean - -.PHONY: clean debug flash diff --git a/car_fmw/src/Control.kt b/car_fmw/src/Control.kt deleted file mode 100644 index 84b35561796..00000000000 --- a/car_fmw/src/Control.kt +++ /dev/null @@ -1,144 +0,0 @@ -object Control { - val BLINK_DURATION = 1000 - - fun run() { - Memory.setHeap(Memory.DYNAMIC_HEAP) - while (true) { - executeCommand() - Memory.cleanDynamicHeap() - } - } - - private fun executeCommand() { - val task = Reader.readTask() - when (task.type.id) { - TaskRequest.Type.DEBUG.id -> debugTask() - TaskRequest.Type.ROUTE.id -> routeTask() - TaskRequest.Type.ROUTE_METRIC.id -> routeMetricTask() - TaskRequest.Type.SONAR.id -> sonarTask() - TaskRequest.Type.SONAR_EXPLORE.id -> sonarExploreTask() - } - } - - private fun debugTask() { - val request = Reader.readDebug() - - when (request.type.id) { - DebugRequest.Type.MEMORY_STATS.id -> sendMemoryStats() - DebugRequest.Type.SONAR_STATS.id -> sendSonarStats() - } - } - - private fun routeTask() { - val route = Reader.readRoute() - - val times = route.times - val directions = route.directions - var i = 0 - - while (i < times.size) { - val time = times[i] - val direction = directions[i] - - Engine.go(direction) - Time.wait(time) - Engine.stop() - - i++ - } - - val response = RouteResponse.BuilderRouteResponse(0).build() - Writer.writeRoute(response) - } - - private fun routeMetricTask() { - val route = Reader.readMetricRoute() - val distances = route.distances - var i = 0 - - while (i < distances.size) { - val distance = distances[i] - val direction = route.directions[i] - Engine.drive(direction, distance) - - i++ - } - - val response = RouteResponse.BuilderRouteResponse(0).build() - Writer.writeRoute(response) - } - - private fun sonarTask() { - val request = Reader.readSonar() - val angles = request.angles - val size = angles.size - val attempts = request.attempts - val distances = IntArray(size) - - var i = 0 - while (i < size) { - distances[i] = sonarMeasure(request.smoothing, attempts[i], angles[i], request.windowSize) - i++ - } - - val response = SonarResponse.BuilderSonarResponse(distances).build() - Writer.writeSonar(response) - } - - private fun sonarExploreTask() { - val request = Reader.readSonarExplore() - - val angle = request.angle - val window = request.windowSize - val result = Sonar.getRange(max(angle - window, 0), min(angle + window, 360)) - - val response = SonarExploreAngleResponse.BuilderSonarExploreAngleResponse(result).build() - Writer.writeSonarExplore(response) - } - - private fun sonarMeasure(smoothing: SonarRequest.Smoothing, attempts: Int, angle: Int, windowSize: Int): Int { - val data = IntArray(attempts) - var i = 0 - while (i < attempts) { - data[i] = Sonar.getSmoothDistance(angle, windowSize, smoothing) - - if (smoothing.id == SonarRequest.Smoothing.NONE.id && data[i] != -1) { - return data[i] - } - i++ - } - - val distances = data.filter(::positive) - if (distances.size == 0) { - return -1 - } - - return when (smoothing.id) { - SonarRequest.Smoothing.MEAN.id -> distances.mean() - SonarRequest.Smoothing.MEDIAN.id -> distances.median() - else -> -1 - } - } - - private fun sendMemoryStats() { - val stats = DebugResponseMemoryStats.BuilderDebugResponseMemoryStats( - DebugInfo.getDynamicHeapTail(), - DebugInfo.getStaticHeapTail(), - DebugInfo.getDynamicHeapMaxSize(), - DebugInfo.getDynamicHeapTotalBytes() - ).build() - - Writer.writeMemoryStats(stats) - } - - private fun sendSonarStats() { - val stats = DebugResponseSonarStats.BuilderDebugResponseSonarStats( - DebugSonarInfo.getMeasurementCount(), - DebugSonarInfo.getMeasurementFailedChecksum(), - DebugSonarInfo.getMeasurementFailedDistance(), - DebugSonarInfo.getMeasurementFailedCommand() - ).build() - - Writer.writeSonarStats(stats) - } -} diff --git a/car_fmw/src/ProtoRW.kt b/car_fmw/src/ProtoRW.kt deleted file mode 100644 index bb3afafbff7..00000000000 --- a/car_fmw/src/ProtoRW.kt +++ /dev/null @@ -1,73 +0,0 @@ -object Reader { - fun readRoute(): RouteRequest { - val stream = getInputStream() - return RouteRequest.BuilderRouteRequest(IntArray(0), IntArray(0)).parseFrom(stream).build() - } - - fun readMetricRoute(): RouteMetricRequest { - val stream = getInputStream() - return RouteMetricRequest.BuilderRouteMetricRequest(IntArray(0), IntArray(0)).parseFrom(stream).build() - } - - fun readTask(): TaskRequest { - val stream = getInputStream() - return TaskRequest.BuilderTaskRequest(TaskRequest.Type.DEBUG).parseFrom(stream).build() - } - - fun readDebug(): DebugRequest { - val stream = getInputStream() - return DebugRequest.BuilderDebugRequest(DebugRequest.Type.MEMORY_STATS).parseFrom(stream).build() - } - - fun readSonar(): SonarRequest { - val stream = getInputStream() - return SonarRequest.BuilderSonarRequest(IntArray(0), IntArray(0), 0, SonarRequest.Smoothing.NONE).parseFrom(stream).build() - } - - fun readSonarExplore(): SonarExploreAngleRequest { - val stream = getInputStream() - return SonarExploreAngleRequest.BuilderSonarExploreAngleRequest(0, 0).parseFrom(stream).build() - } - - private fun getInputStream(): CodedInputStream { - val buffer = Connection.receiveByteArray() - return CodedInputStream(buffer) - } -} - -object Writer { - fun writeRoute(route: RouteResponse) { - val stream = getOutputStream(route.getSizeNoTag()) - route.writeTo(stream) - Connection.sendByteArray(stream.buffer) - } - - fun writeMemoryStats(stats: DebugResponseMemoryStats) { - val stream = getOutputStream(stats.getSizeNoTag()) - stats.writeTo(stream) - Connection.sendByteArray(stream.buffer) - } - - fun writeSonarStats(stats: DebugResponseSonarStats) { - val stream = getOutputStream(stats.getSizeNoTag()) - stats.writeTo(stream) - Connection.sendByteArray(stream.buffer) - } - - fun writeSonar(response: SonarResponse) { - val stream = getOutputStream(response.getSizeNoTag()) - response.writeTo(stream) - Connection.sendByteArray(stream.buffer) - } - - fun writeSonarExplore(response: SonarExploreAngleResponse) { - val stream = getOutputStream(response.getSizeNoTag()) - response.writeTo(stream) - Connection.sendByteArray(stream.buffer) - } - - private fun getOutputStream(size: Int): CodedOutputStream { - val buffer = ByteArray(size) - return CodedOutputStream(buffer) - } -} \ No newline at end of file diff --git a/car_fmw/src/Tests.kt b/car_fmw/src/Tests.kt deleted file mode 100644 index 0ed436db767..00000000000 --- a/car_fmw/src/Tests.kt +++ /dev/null @@ -1,33 +0,0 @@ - -object Tests { - var PROGRAM_DURATION = 1000 - - fun echoUsbTest() { - val command = Connection.receiveInt() - Connection.sendInt(command) - Time.wait(PROGRAM_DURATION) - } - - fun simpleRouteTest() { - Engine.forward() - Leds.blink() - Time.wait(PROGRAM_DURATION) - - Engine.right() - Leds.blink() - Time.wait(PROGRAM_DURATION) - - Engine.backward() - Leds.blink() - Time.wait(PROGRAM_DURATION) - - Engine.left() - Leds.blink() - Time.wait(PROGRAM_DURATION) - } - - fun blinkTest() { - Leds.blink() - Time.wait(PROGRAM_DURATION) - } -} \ No newline at end of file diff --git a/car_fmw/src/Voyager.kt b/car_fmw/src/Voyager.kt deleted file mode 100644 index 9951151e2ba..00000000000 --- a/car_fmw/src/Voyager.kt +++ /dev/null @@ -1,18 +0,0 @@ - -object Voyager { - private val MAX_ANGLE: Int = 180 // angle - private val SEGMENT_SIZE: Int = 30 // centimeter - private var DEFAULT_WINDOW = 10 // angle - - fun run() { - while (true) { - var distance = Sonar.getSmoothDistance(0, DEFAULT_WINDOW, SonarRequest.Smoothing.NONE) - while (distance == -1 || distance > 4 * SEGMENT_SIZE) { - Engine.drive(RouteType.FORWARD.id, SEGMENT_SIZE) - distance = Sonar.getSmoothDistance(0, DEFAULT_WINDOW, SonarRequest.Smoothing.NONE) - } - - Engine.drive(RouteType.LEFT.id, 45) - } - } -} \ No newline at end of file diff --git a/car_fmw/src/include/Button.kt b/car_fmw/src/include/Button.kt deleted file mode 100644 index 82103cddf20..00000000000 --- a/car_fmw/src/include/Button.kt +++ /dev/null @@ -1,11 +0,0 @@ -external fun car_user_btn_init(handler: () -> Unit) -external fun car_user_btn_is_pushed(): Boolean -external fun EXTI0_IRQHandler() - -object Button { - fun setCallback(handler: () -> Unit) { - car_user_btn_init(handler) - } - - fun isPushed(): Boolean = car_user_btn_is_pushed() -} \ No newline at end of file diff --git a/car_fmw/src/include/Connection.kt b/car_fmw/src/include/Connection.kt deleted file mode 100644 index 44bafd1aa16..00000000000 --- a/car_fmw/src/include/Connection.kt +++ /dev/null @@ -1,44 +0,0 @@ - -external fun car_conn_init() -external fun car_conn_rcv_buf_clear() - -external fun car_conn_snd_byte(b: Byte) -external fun car_conn_snd_int(i: Int) -external fun car_conn_snd_buf(size: Int, pointer: Int) - -external fun car_conn_rcv_byte(): Byte -external fun car_conn_rcv_int(): Int -external fun car_conn_rcv_buf(size: Int, pointer: Int) - -object Connection { - fun init() { - car_conn_init() - } - - fun clearBuffer() { - car_conn_rcv_buf_clear() - } - - fun receiveInt(): Int = car_conn_rcv_int() - fun receiveByte(): Byte = car_conn_rcv_byte() - - fun sendInt(n: Int) { - car_conn_snd_int(n) - } - - fun sendByte(b: Byte) { - car_conn_snd_byte(b) - } - - fun receiveByteArray(): ByteArray { - val result = ByteArray(car_conn_rcv_int()) - car_conn_rcv_buf(result.size, result.data) - - return result - } - - fun sendByteArray(array: ByteArray) { - car_conn_snd_int(array.size) - car_conn_snd_buf(array.size, array.data) - } -} diff --git a/car_fmw/src/include/DebugInfo.kt b/car_fmw/src/include/DebugInfo.kt deleted file mode 100644 index ec364978be0..00000000000 --- a/car_fmw/src/include/DebugInfo.kt +++ /dev/null @@ -1,24 +0,0 @@ - -external fun dynamic_heap_tail(): Int -external fun static_heap_tail(): Int -external fun dynamic_heap_max_bytes(): Int -external fun dynamic_heap_total(): Int - -object DebugInfo { - fun getDynamicHeapTail(): Int = dynamic_heap_tail() - fun getStaticHeapTail(): Int = static_heap_tail() - fun getDynamicHeapMaxSize(): Int = dynamic_heap_max_bytes() - fun getDynamicHeapTotalBytes(): Int = dynamic_heap_total() -} - -external fun car_sonar_get_measurement_total(): Int -external fun car_sonar_get_measurement_failed_checksum(): Int -external fun car_sonar_get_measurement_failed_distance(): Int -external fun car_sonar_get_measurement_failed_command(): Int - -object DebugSonarInfo { - fun getMeasurementCount(): Int = car_sonar_get_measurement_total() - fun getMeasurementFailedChecksum(): Int = car_sonar_get_measurement_failed_checksum() - fun getMeasurementFailedDistance(): Int = car_sonar_get_measurement_failed_distance() - fun getMeasurementFailedCommand(): Int = car_sonar_get_measurement_failed_command() -} diff --git a/car_fmw/src/include/Engine.kt b/car_fmw/src/include/Engine.kt deleted file mode 100644 index e3a57aedebb..00000000000 --- a/car_fmw/src/include/Engine.kt +++ /dev/null @@ -1,67 +0,0 @@ -external fun car_engine_init() - -external fun car_engine_stop() -external fun car_engine_forward() -external fun car_engine_backward() -external fun car_engine_turn_left() -external fun car_engine_turn_right() - -enum class RouteType(val id: Int) { - FORWARD(0), - BACKWARD(1), - LEFT(2), - RIGHT(3); -} - -object Engine { - val VELOCITY_DRIVE: Double = 0.05 // centimeter in millisecond - val VEL0CITY_ROTATE: Double = 0.05 // angle in millisecond - - fun init() { - car_engine_init() - } - - fun stop() { - car_engine_stop() - Sonar.calibrate() - } - - fun forward() { - car_engine_forward() - } - - fun backward() { - car_engine_backward() - } - - fun left() { - car_engine_turn_left() - } - - fun right() { - car_engine_turn_right() - } - - fun go(direction: Int) { - when (direction) { - RouteType.FORWARD.id -> forward() - RouteType.BACKWARD.id -> backward() - RouteType.LEFT.id -> left() - RouteType.RIGHT.id -> right() - } - } - - fun drive(direction: Int, distance: Int) { - val duration = when (direction) { - RouteType.FORWARD.id, - RouteType.BACKWARD.id -> (distance.toDouble() / VELOCITY_DRIVE).toInt() - RouteType.LEFT.id, - RouteType.RIGHT.id -> (distance.toDouble() / VEL0CITY_ROTATE).toInt() - else -> 0 - } - - go(direction) - Time.wait(duration) - stop() - } -} \ No newline at end of file diff --git a/car_fmw/src/include/Leds.kt b/car_fmw/src/include/Leds.kt deleted file mode 100644 index a6af92a1dd6..00000000000 --- a/car_fmw/src/include/Leds.kt +++ /dev/null @@ -1,36 +0,0 @@ - -external fun car_leds_init() -external fun car_leds_clear_all() -external fun car_led_set(led: Int, on: Boolean) - -object Leds { - val BLINK_DURATION: Int = 1000 - val GREEN = 0 - val ORANGE = 1 - val RED = 2 - val BLUE = 3 - - fun init() { - car_leds_init() - } - - fun set(led: Int, on: Boolean) { - car_led_set(led, on) - } - - fun switchAll(on: Boolean) { - car_led_set(GREEN, on) - car_led_set(BLUE, on) - car_led_set(RED, on) - car_led_set(ORANGE, on) - } - - fun blink() { - switchAll(true) - Time.wait(BLINK_DURATION) - switchAll(false) - } -} - - - diff --git a/car_fmw/src/include/Memory.kt b/car_fmw/src/include/Memory.kt deleted file mode 100644 index d1576835ee7..00000000000 --- a/car_fmw/src/include/Memory.kt +++ /dev/null @@ -1,16 +0,0 @@ - -external fun set_active_heap(heap: Int) -external fun clean_dynamic_heap() - -object Memory { - val STATIC_HEAP = 0 - val DYNAMIC_HEAP = 1 - - fun setHeap(heap: Int) { - set_active_heap(heap) - } - - fun cleanDynamicHeap() { - clean_dynamic_heap() - } -} diff --git a/car_fmw/src/include/Random.kt b/car_fmw/src/include/Random.kt deleted file mode 100644 index 2979d92f5df..00000000000 --- a/car_fmw/src/include/Random.kt +++ /dev/null @@ -1,6 +0,0 @@ - -external fun car_random_get_int(): Int - -object Random { - fun getInt(): Int = car_random_get_int() -} diff --git a/car_fmw/src/include/Sonar.kt b/car_fmw/src/include/Sonar.kt deleted file mode 100644 index c7d99ef8193..00000000000 --- a/car_fmw/src/include/Sonar.kt +++ /dev/null @@ -1,75 +0,0 @@ -external fun car_sonar_init() -external fun car_sonar_get_dist(degree: Byte): Short - -object Sonar { - fun init() { - car_sonar_init() - } - - fun getDistance(angle: Int): Int = - car_sonar_get_dist(angle.toByte()).toInt() - - fun getSmoothDistance(angle: Int, windowSize: Int, smoothing: SonarRequest.Smoothing): Int { - val distance = getDistance(angle) - if (distance != -1 || windowSize == 0) { - return distance - } - - val start = if (angle - windowSize < 0) 0 else angle - windowSize - val stop = angle + windowSize - when (smoothing.id) { - SonarRequest.Smoothing.NONE.id -> { - return getOneOfRange(start, stop) - } - SonarRequest.Smoothing.MEDIAN.id -> { - val data = getRange(start, stop).filter(::positive) - if (data.size == 0) { - return -1 - } - - return data.median() - } - SonarRequest.Smoothing.MEAN.id -> { - val data = getRange(start, stop).filter(::positive) - if (data.size == 0) { - return -1 - } - - return data.mean() - } - } - - return -1 - } - - fun getRange(start: Int, stop: Int): IntArray { - val result = IntArray(stop - start + 1) - var i = 0 - while (i < stop - start + 1) { - result[i] = getDistance(start + i) - i++ - } - - return result - } - - private fun getOneOfRange(start: Int, stop: Int): Int { - var i = start - var distance = getDistance(start) - while (i <= stop && distance == -1) { - distance = getDistance(i) - i += 1 - } - - while (i >= start && distance == -1) { - distance = getDistance(i) - i -= 1 - } - - return distance - } - - fun calibrate() { - getDistance(180) - } -} diff --git a/car_fmw/src/include/Time.kt b/car_fmw/src/include/Time.kt deleted file mode 100644 index 8c3c32eb873..00000000000 --- a/car_fmw/src/include/Time.kt +++ /dev/null @@ -1,16 +0,0 @@ - -external fun car_time_init() -external fun car_time_wait(msec: Int) -external fun car_time_get_timestamp(): Int - -object Time { - fun init() { - car_time_init() - } - - fun wait(msec: Int) { - car_time_wait(msec) - } - - fun getTimestamp(): Int = car_time_get_timestamp() -} diff --git a/car_fmw/src/include/utils.kt b/car_fmw/src/include/utils.kt deleted file mode 100644 index 78c31dbe375..00000000000 --- a/car_fmw/src/include/utils.kt +++ /dev/null @@ -1,12 +0,0 @@ - -fun positive(i: Int): Boolean { - return i > 0 -} - -fun min(first: Int, second: Int): Int { - if (first < second) return first else return second -} - -fun max(first: Int, second: Int): Int { - if (first > second) return first else return second -} diff --git a/car_fmw/src/main.kt b/car_fmw/src/main.kt deleted file mode 100644 index 458d2b2815b..00000000000 --- a/car_fmw/src/main.kt +++ /dev/null @@ -1,17 +0,0 @@ - -fun main() { - /* init hardware */ - Time.init() - Engine.init() - Leds.init() - Sonar.init() - Connection.init() - - Leds.set(Leds.GREEN, true) - - /* car task */ - Control.run() - - /* Voyager */ -// Voyager.run() -} diff --git a/car_fmw/stm32_flash.ld b/car_fmw/stm32_flash.ld deleted file mode 100644 index 9a10d57b3c1..00000000000 --- a/car_fmw/stm32_flash.ld +++ /dev/null @@ -1,177 +0,0 @@ -/* -***************************************************************************** -** -** File : stm32_flash.ld -** -** Abstract : Linker script for STM32F407VG Device with -** 1024KByte FLASH, 192KByte RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** Environment : Atollic TrueSTUDIO(R) -** -** Distribution: The file is distributed “as is,” without any warranty -** of any kind. -** -** (c)Copyright Atollic AB. -** You may use this file as-is or modify it according to the needs of your -** project. Distribution of this file (unmodified or modified) is not -** permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the -** rights to distribute the assembled, compiled & linked contents of this -** file as part of an application binary file, provided that it is built -** using the Atollic TrueSTUDIO(R) toolchain. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* - * _estack is the highest address of user mode stack - * (sp initial value, stack grows down). - * We have 192K RAM on our MCU and _estack should be 0x20030000. - * But our MCU maps only 128K SRAM at 0x20000000 after boot. - * We need to perform some memory remapping to use more. - * This isn't implemented yet. - */ -_estack = 0x20020000; /* end of 128K SRAM region */ - -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0; /* required amount of heap */ -_Min_Stack_Size = 0x400; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K - MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(.fini_array*)) - KEEP (*(SORT(.fini_array.*))) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = .; - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : AT ( _sidata ) - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM - - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack : - { - . = ALIGN(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - /* MEMORY_bank1 section, code must be located here explicitly */ - /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */ - .memory_b1_text : - { - *(.mb1text) /* .mb1text sections (code) */ - *(.mb1text*) /* .mb1text* sections (code) */ - *(.mb1rodata) /* read-only data (constants) */ - *(.mb1rodata*) - } >MEMORY_B1 - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/car_hw/.gitignore b/car_hw/.gitignore deleted file mode 100644 index 7fcd950a051..00000000000 --- a/car_hw/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -bin -tags diff --git a/car_hw/Makefile b/car_hw/Makefile deleted file mode 100644 index 0d18b69b89f..00000000000 --- a/car_hw/Makefile +++ /dev/null @@ -1,82 +0,0 @@ -BIN_DIR=bin -SRC_DIR=src -LIB_DIR=$(SRC_DIR)/lib -OS_ARCH=linux-arm - -LIB_CMSIS_DIR=$(LIB_DIR)/cmsis -LIB_STDPERIPH_DIR=$(LIB_DIR)/stdperiph -LIB_STM32F4D_DIR=$(LIB_DIR)/stm32f4d -LIB_USB_DEV_DIR=$(LIB_DIR)/usb_device -LIB_USB_OTG_DIR=$(LIB_DIR)/usb_otg -LIB_USB_VCP_DIR=$(LIB_DIR)/usb_vcp -LIB_USART_DIR=$(LIB_DIR)/usart - -LIB_CMSIS_OBJ=$(BIN_DIR)/libcmsis.o -LIB_STDPERIPH_OBJ=$(BIN_DIR)/libstdperiph.o -LIB_STM32F4D_OBJ=$(BIN_DIR)/libstm32f4d.o -LIB_USB_DEV_OBJ=$(BIN_DIR)/libusbdevice.o -LIB_USB_OTG_OBJ=$(BIN_DIR)/libusbotg.o -LIB_USB_VCP_OBJ=$(BIN_DIR)/libusbvcp.o -LIB_USART_OBJ=$(BIN_DIR)/libusart.o - -CARHW_OBJ=$(BIN_DIR)/car_hw.o - -CC=arm-none-eabi-gcc -AS=arm-none-eabi-as -LD=arm-none-eabi-ld -OBJ_COPY=arm-none-eabi-objcopy -GDB=arm-none-eabi-gdb - -USB_CONF_DIR=$(LIB_DIR)/usb_conf -INCLUDES=-I$(LIB_CMSIS_DIR) \ - -I$(LIB_STDPERIPH_DIR) \ - -I$(LIB_STM32F4D_DIR) \ - -I$(LIB_USB_DEV_DIR) \ - -I$(LIB_USB_OTG_DIR) \ - -I$(LIB_USB_VCP_DIR) \ - -I$(LIB_USART_DIR) \ - -I$(USB_CONF_DIR) \ - -I$(SRC_DIR) \ - -I$(SRC_DIR)/include - -DEFINES=-DUSE_STM32_DISCOVERY=1 -DUSE_STDPERIPH_DRIVER=1 -DSTM32F4XX=1 -DHSE_VALUE=8000000 -CFLAGS=-g -nostdlib -ffreestanding -O0 \ - -mcpu=cortex-m3 -mfloat-abi=soft -mthumb \ - $(DEFINES) -ASMFLAGS=-g -mthumb - -LD_ALL_DEPS=$(LD) -r $(filter %.o,$^) -o $@ -CC_ALL_DEPS=$(CC) $(CFLAGS) -c $(INCLUDES) $(filter %.c,$^) -o $@ -AS_ALL_DEPS=$(AS) $(ASMFLAGS) $(filter %.s,$^) -o $@ - -dirhs=$(wildcard $(1)/*.h) -dircs=$(wildcard $(1)/*.c) -dircs_to_prefxd_objs=\ - $(patsubst $(1)/%.c,$(BIN_DIR)/$(2)%.o,$(call dircs,$1)) - -CAR_OBJ=$(BIN_DIR)/car.o -CAR_OBJ_PREFIX=car_ - -$(CARHW_OBJ): $(CAR_OBJ) $(LIB_STM32F4D_OBJ) \ - $(LIB_CMSIS_OBJ) $(LIB_STDPERIPH_OBJ) \ - $(LIB_USB_DEV_OBJ) $(LIB_USB_OTG_OBJ) \ - $(LIB_USB_VCP_OBJ) $(LIB_USART_OBJ) - $(LD) -r $^ -o $@ - -$(CAR_OBJ): \ - $(call dircs_to_prefxd_objs,$(SRC_DIR),$(CAR_OBJ_PREFIX)) - $(LD_ALL_DEPS) - -$(BIN_DIR)/$(CAR_OBJ_PREFIX)%.o: $(SRC_DIR)/%.c \ - $(call dirhs,$(SRC_DIR)/include) - $(CC_ALL_DEPS) - -clean: - rm -rf $(BIN_DIR)/* - -tags: - ctags -R * - -include $(LIB_DIR)/**/Makefile - -.PHONY: tags clean diff --git a/car_hw/src/assert.c b/car_hw/src/assert.c deleted file mode 100644 index 43decf8acfd..00000000000 --- a/car_hw/src/assert.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "stm32f4_discovery.h" -#include "stm32f4xx_conf.h" - -/** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ -void assert_failed(uint8_t* file, uint32_t line) -{ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - - /* Infinite loop */ - while (1) - { - } -} diff --git a/car_hw/src/car_conn.c b/car_hw/src/car_conn.c deleted file mode 100644 index 739e8043fb5..00000000000 --- a/car_hw/src/car_conn.c +++ /dev/null @@ -1,64 +0,0 @@ -#include "car_conn.h" - -#include - -void car_conn_init(void) -{ - VCP_init(); - car_conn_rcv_buf_clear(); -} - -void car_conn_rcv_buf_clear(void) -{ - uint8_t tmp_char; - while (VCP_get_char(&tmp_char)); -} - -void car_conn_snd_byte(uint8_t b) -{ - VCP_put_char(b); -} - -void car_conn_snd_int(int32_t n) -{ - VCP_put_char(n >> 24); - VCP_put_char(n >> 16); - VCP_put_char(n >> 8); - VCP_put_char(n); -} - -void car_conn_snd_buf(uint32_t size, int buf) -{ - size_t i = 0; - uint8_t *cbuf = (uint8_t *)buf; - - for (; i < size; ++i) - car_conn_snd_byte(cbuf[i]); -} - -uint8_t car_conn_rcv_byte(void) -{ - uint8_t byte = 0; - while (!VCP_get_char(&byte)); - return byte; -} - -int32_t car_conn_rcv_int(void) -{ - int32_t result = 0; - - result += (car_conn_rcv_byte() << 24); - result += (car_conn_rcv_byte() << 16); - result += (car_conn_rcv_byte() << 8); - result += car_conn_rcv_byte(); - return result; -} - -void car_conn_rcv_buf(uint32_t size, int buf) -{ - uint8_t* cbuf = (uint8_t *)buf; - size_t i = 0; - - for (; i < size; ++i) - cbuf[i] = car_conn_rcv_byte(); -} diff --git a/car_hw/src/car_engine.c b/car_hw/src/car_engine.c deleted file mode 100644 index 8f5d5368924..00000000000 --- a/car_hw/src/car_engine.c +++ /dev/null @@ -1,79 +0,0 @@ -#include "car_engine.h" - -#include "stm32f4_discovery.h" -#include "stm32f4xx_conf.h" - -#define CAR_ENGINE_ENABLE - -#define CAR_ENGINE_GPIO_PORT_CLOCK RCC_AHB1Periph_GPIOB -#define CAR_ENGINE_GPIO_PORT GPIOB -#define CAR_ENGINE_ENABLE_PIN GPIO_Pin_3 -#define CAR_ENGINE_LWHEEL_FWD_PIN GPIO_Pin_4 -#define CAR_ENGINE_LWHEEL_BKWD_PIN GPIO_Pin_5 -#define CAR_ENGINE_RWHEEL_FWD_PIN GPIO_Pin_6 -#define CAR_ENGINE_RWHEEL_BKWD_PIN GPIO_Pin_7 - -void car_engine_init(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - RCC_AHB1PeriphClockCmd(CAR_ENGINE_GPIO_PORT_CLOCK, ENABLE); - GPIO_InitStructure.GPIO_Pin = CAR_ENGINE_ENABLE_PIN - | CAR_ENGINE_LWHEEL_FWD_PIN - | CAR_ENGINE_LWHEEL_BKWD_PIN - | CAR_ENGINE_RWHEEL_FWD_PIN - | CAR_ENGINE_RWHEEL_BKWD_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(CAR_ENGINE_GPIO_PORT, &GPIO_InitStructure); -} - -void car_engine_stop(void) -{ - GPIO_ResetBits(CAR_ENGINE_GPIO_PORT, 0 - | CAR_ENGINE_LWHEEL_BKWD_PIN - | CAR_ENGINE_ENABLE_PIN - | CAR_ENGINE_LWHEEL_FWD_PIN - | CAR_ENGINE_RWHEEL_FWD_PIN - | CAR_ENGINE_RWHEEL_BKWD_PIN); -} - -#ifdef CAR_ENGINE_ENABLE -void car_engine_forward(void) -{ - car_engine_stop(); - GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_ENABLE_PIN); - GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_LWHEEL_FWD_PIN); - GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_RWHEEL_FWD_PIN); -} - -void car_engine_backward(void) -{ - car_engine_stop(); - GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_ENABLE_PIN); - GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_LWHEEL_BKWD_PIN); - GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_RWHEEL_BKWD_PIN); -} - -void car_engine_turn_right(void) -{ - car_engine_stop(); - GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_ENABLE_PIN); - GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_LWHEEL_BKWD_PIN); - GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_RWHEEL_FWD_PIN); -} - -void car_engine_turn_left(void) -{ - car_engine_stop(); - GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_ENABLE_PIN); - GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_LWHEEL_FWD_PIN); - GPIO_SetBits(CAR_ENGINE_GPIO_PORT, CAR_ENGINE_RWHEEL_BKWD_PIN); -} -#else -void car_engine_forward(void) {} -void car_engine_backward(void) {} -void car_engine_turn_right(void) {} -void car_engine_turn_left(void) {} -#endif // CAR_ENGINE_ENABLE diff --git a/car_hw/src/car_leds.c b/car_hw/src/car_leds.c deleted file mode 100644 index 250cc711238..00000000000 --- a/car_hw/src/car_leds.c +++ /dev/null @@ -1,30 +0,0 @@ -#include - -#include "car_leds.h" - -#include "stm32f4_discovery.h" -#include "stm32f4xx_conf.h" - -void car_leds_init(void) -{ - STM_EVAL_LEDInit(CAR_LED_RED); - STM_EVAL_LEDInit(CAR_LED_ORANGE); - STM_EVAL_LEDInit(CAR_LED_GREEN); - STM_EVAL_LEDInit(CAR_LED_BLUE); -} - -void car_led_set(int led, bool on) -{ - if (on) - STM_EVAL_LEDOn(led); - else - STM_EVAL_LEDOff(led); -} - -void car_leds_clear_all(void) -{ - car_led_set(CAR_LED_GREEN, false); - car_led_set(CAR_LED_ORANGE, false); - car_led_set(CAR_LED_RED, false); - car_led_set(CAR_LED_BLUE, false); -} diff --git a/car_hw/src/car_random.c b/car_hw/src/car_random.c deleted file mode 100644 index 3a6c5990ce2..00000000000 --- a/car_hw/src/car_random.c +++ /dev/null @@ -1,15 +0,0 @@ - -#include - - -uint32_t prev_number = 0; - -#define MULTIPLIER 1664525 -#define INCREMENT 1013904223 -#define MODULE UINT32_MAX - -uint32_t car_random_get_int(void) -{ - prev_number = (prev_number * MULTIPLIER + INCREMENT) % MODULE; - return prev_number; -} diff --git a/car_hw/src/car_sonar.c b/car_hw/src/car_sonar.c deleted file mode 100644 index d1df61cb002..00000000000 --- a/car_hw/src/car_sonar.c +++ /dev/null @@ -1,108 +0,0 @@ -#include -#include -#include - -/* - * Sonar reference: - * http://www.dfrobot.com/wiki/index.php?title=URM37_V4.0_Ultrasonic_Sensor_(SKU:SEN0001) - */ - -#define FRONT_ANGLE 1 -#define BACK_ANGLE 40 -#define MAX_DEGREE 180 - -uint32_t measurement_count = 0; -uint32_t measurement_failed_checksum = 0; -uint32_t measurement_failed_distance = 0; -uint32_t measurement_failed_command = 0; - -static uint8_t sonar_degree(uint8_t degree) -{ - if (degree > MAX_DEGREE) - degree = MAX_DEGREE; - - degree = MAX_DEGREE - degree; - - float factor = 1.0 * (BACK_ANGLE - FRONT_ANGLE) / MAX_DEGREE; - return factor * degree + FRONT_ANGLE; -} - -#define SONAR_CMD_GET_DIST 0x22 - -static uint8_t sonar_cmd[4]; -static void sonar_snd_dist_req(uint8_t rot_degree) -{ - size_t i = 0; - sonar_cmd[0] = SONAR_CMD_GET_DIST; - sonar_cmd[1] = sonar_degree(rot_degree); - sonar_cmd[2] = sonar_cmd[3] = 0; - - for (; i < 3; ++i) - sonar_cmd[3] += sonar_cmd[i]; - usart_send_data(USART3_ID, sonar_cmd, 4); -} - -static uint8_t sonar_resp[4]; -static uint16_t sonar_wait_dist_resp(void) -{ - measurement_count++; - - size_t i = 0; - uint8_t sum = 0; - int16_t distance = 0; - - usart_rcv_data(USART3_ID, sonar_resp, 4); - sum = sonar_resp[0] + sonar_resp[1] + sonar_resp[2]; - - if (sonar_resp[0] != SONAR_CMD_GET_DIST) { - measurement_failed_command++; - return CAR_SONAR_DIST_ERR; - } - - if (sum != sonar_resp[3]) { - measurement_failed_checksum++; - return CAR_SONAR_DIST_ERR; - } - - distance = ((uint16_t)sonar_resp[1] << 8) + sonar_resp[2]; - if (distance == -1) { - measurement_failed_distance++; - } - - return distance; -} - -uint32_t car_sonar_get_measurement_total() -{ - return measurement_count; -} - -uint32_t car_sonar_get_measurement_failed_checksum() -{ - return measurement_failed_checksum; -} - -uint32_t car_sonar_get_measurement_failed_distance() -{ - return measurement_failed_distance; -} - -uint32_t car_sonar_get_measurement_failed_command() -{ - return measurement_failed_command; -} - -uint16_t car_sonar_get_dist(uint8_t rot_degree) -{ - sonar_snd_dist_req(rot_degree); - return sonar_wait_dist_resp(); -} - -void car_sonar_init(void) -{ - usart_init(USART3_ID); - // Sonar boots in ~2.2 secs - car_time_wait(3000); - // Some really needed magical tweak - sonar_snd_dist_req(0); -} diff --git a/car_hw/src/car_time.c b/car_hw/src/car_time.c deleted file mode 100644 index 7f34154c40a..00000000000 --- a/car_hw/src/car_time.c +++ /dev/null @@ -1,30 +0,0 @@ -#include - -#include "car_time.h" - -static volatile uint32_t pending_timer_ticks, ticks_since_boot; - -void car_time_init(void) -{ - // XXX this is copy pasted and it doesn't provide 1ms periodic - // timer interrupt - if (SysTick_Config(SystemCoreClock / 1000)) - while (1){}; -} - -void car_time_wait(volatile uint32_t ms) { - pending_timer_ticks = ms; - while(pending_timer_ticks){}; -} - -uint32_t car_time_get_timestamp(void) -{ - return ticks_since_boot; -} - -void car_time_irq_handler() { - if (pending_timer_ticks) - pending_timer_ticks--; - - ticks_since_boot++; -} diff --git a/car_hw/src/car_user_btn.c b/car_hw/src/car_user_btn.c deleted file mode 100644 index f802b74d50f..00000000000 --- a/car_hw/src/car_user_btn.c +++ /dev/null @@ -1,21 +0,0 @@ -#include "car_user_btn.h" - -static car_user_btn_handler_t user_btn_handler; - -void car_user_btn_init(car_user_btn_handler_t handler) -{ - user_btn_handler = handler; - STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); -} - -bool car_user_btn_is_pushed(void) -{ - return STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET; -} - -void EXTI0_IRQHandler(void) -{ - if (user_btn_handler) - user_btn_handler(); - EXTI_ClearITPendingBit(USER_BUTTON_EXTI_LINE); -} diff --git a/car_hw/src/include/car_conn.h b/car_hw/src/include/car_conn.h deleted file mode 100644 index 6f0a99c47eb..00000000000 --- a/car_hw/src/include/car_conn.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include -#include - -void car_conn_init(void); -void car_conn_rcv_buf_clear(void); - -void car_conn_snd_byte(uint8_t b); -void car_conn_snd_int(int32_t n); -void car_conn_snd_buf(uint32_t size, /*void */int buf); - -uint8_t car_conn_rcv_byte(void); -int32_t car_conn_rcv_int(void); -void car_conn_rcv_buf(uint32_t size, /*void **/int buf); diff --git a/car_hw/src/include/car_engine.h b/car_hw/src/include/car_engine.h deleted file mode 100644 index 56885b70d99..00000000000 --- a/car_hw/src/include/car_engine.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -void car_engine_init(void); -void car_engine_stop(void); -void car_engine_forward(void); -void car_engine_backward(void); -void car_engine_turn_left(void); -void car_engine_turn_right(void); diff --git a/car_hw/src/include/car_leds.h b/car_hw/src/include/car_leds.h deleted file mode 100644 index 8089c0fbf58..00000000000 --- a/car_hw/src/include/car_leds.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include -#include "stm32f4_discovery.h" - -typedef enum -{ - CAR_LED_GREEN = LED4, - CAR_LED_ORANGE = LED3, - CAR_LED_RED = LED5, - CAR_LED_BLUE = LED6 -} car_led_t; - -void car_leds_init(void); -void car_leds_clear_all(void); -void car_led_set(int led, bool on); diff --git a/car_hw/src/include/car_random.h b/car_hw/src/include/car_random.h deleted file mode 100644 index d1c42195048..00000000000 --- a/car_hw/src/include/car_random.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include - -uint32_t car_random_get_int(void); diff --git a/car_hw/src/include/car_sonar.h b/car_hw/src/include/car_sonar.h deleted file mode 100644 index f5a3d08faae..00000000000 --- a/car_hw/src/include/car_sonar.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include - -/* - * Pins commutation: - * MCU | URM37 | Servo | - * ---------------------------- - * PC11 | TXD | - | - * PC10 | RXD | - | - * GND | GND | - | - * NRST | NRST | - | - * 5V | +5V | - | - * - | MOTO | Orange | - * GND | - | Brown | - * 5V | - | Red | - */ - -#define CAR_SONAR_DIST_ERR 0xffff - -void car_sonar_init(void); -// returns CAR_SONAR_DIST_ERR on error -// else distance in centimeters -uint16_t car_sonar_get_dist(uint8_t rot_degree); - -uint32_t car_sonar_get_measurement_total(); -uint32_t car_sonar_get_measurement_failed_checksum(); -uint32_t car_sonar_get_measurement_failed_distance(); -uint32_t car_sonar_get_measurement_failed_command(); - diff --git a/car_hw/src/include/car_time.h b/car_hw/src/include/car_time.h deleted file mode 100644 index babad33c08f..00000000000 --- a/car_hw/src/include/car_time.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include - -void car_time_init(void); -void car_time_wait(volatile uint32_t ms); -uint32_t car_time_get_timestamp(void); -/* - * Called from systick handler - */ -void car_time_irq_handler(); diff --git a/car_hw/src/include/car_user_btn.h b/car_hw/src/include/car_user_btn.h deleted file mode 100644 index b78673a8798..00000000000 --- a/car_hw/src/include/car_user_btn.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include -#include "stm32f4_discovery.h" - -typedef void (*car_user_btn_handler_t)(void); - -// @handler can be NULL -void car_user_btn_init(car_user_btn_handler_t handler); - -bool car_user_btn_is_pushed(void); diff --git a/car_hw/src/include/stm32f4xx_conf.h b/car_hw/src/include/stm32f4xx_conf.h deleted file mode 100644 index abd159f6ba9..00000000000 --- a/car_hw/src/include/stm32f4xx_conf.h +++ /dev/null @@ -1,94 +0,0 @@ -/** - ****************************************************************************** - * @file IO_Toggle/stm32f4xx_conf.h - * @author MCD Application Team - * @version V1.0.0 - * @date 19-September-2011 - * @brief Library configuration file. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_CONF_H -#define __STM32F4xx_CONF_H - -#if defined (HSE_VALUE) -/* Redefine the HSE value; it's equal to 8 MHz on the STM32F4-DISCOVERY Kit */ - #undef HSE_VALUE - #define HSE_VALUE ((uint32_t)8000000) -#endif /* HSE_VALUE */ - -/* Includes ------------------------------------------------------------------*/ -/* Uncomment the line below to enable peripheral header file inclusion */ -#include "stm32f4xx_adc.h" -#include "stm32f4xx_can.h" -#include "stm32f4xx_crc.h" -#include "stm32f4xx_cryp.h" -#include "stm32f4xx_dac.h" -#include "stm32f4xx_dbgmcu.h" -#include "stm32f4xx_dcmi.h" -#include "stm32f4xx_dma.h" -#include "stm32f4xx_exti.h" -#include "stm32f4xx_flash.h" -#include "stm32f4xx_fsmc.h" -#include "stm32f4xx_hash.h" -#include "stm32f4xx_gpio.h" -#include "stm32f4xx_i2c.h" -#include "stm32f4xx_iwdg.h" -#include "stm32f4xx_pwr.h" -#include "stm32f4xx_rcc.h" -#include "stm32f4xx_rng.h" -#include "stm32f4xx_rtc.h" -#include "stm32f4xx_sdio.h" -#include "stm32f4xx_spi.h" -#include "stm32f4xx_syscfg.h" -#include "stm32f4xx_tim.h" -#include "stm32f4xx_usart.h" -#include "stm32f4xx_wwdg.h" -#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* If an external clock source is used, then the value of the following define - should be set to the value of the external clock source, else, if no external - clock is used, keep this define commented */ -/*#define I2S_EXTERNAL_CLOCK_VAL 12288000 */ /* Value of the external clock in Hz */ - - -/* Uncomment the line below to expanse the "assert_param" macro in the - Standard Peripheral Library drivers code */ -/* #define USE_FULL_ASSERT 1 */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT - -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0) -#endif /* USE_FULL_ASSERT */ - -#endif /* __STM32F4xx_CONF_H */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/cmsis/Makefile b/car_hw/src/lib/cmsis/Makefile deleted file mode 100644 index 3628b8618b1..00000000000 --- a/car_hw/src/lib/cmsis/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -LIB_CMSIS_OBJ_PREFIX=libcmsis_ - -$(LIB_CMSIS_OBJ): \ - $(call dircs_to_prefxd_objs,$(LIB_CMSIS_DIR),$(LIB_CMSIS_OBJ_PREFIX)) \ - $(BIN_DIR)/$(LIB_CMSIS_OBJ_PREFIX)startup_stm32f4xx.o - $(LD_ALL_DEPS) - -$(BIN_DIR)/$(LIB_CMSIS_OBJ_PREFIX)startup_stm32f4xx.o: \ - $(call dirhs, $(LIB_CMSIS_DIR)) \ - $(LIB_CMSIS_DIR)/startup_stm32f4xx.s - $(AS_ALL_DEPS) - -$(BIN_DIR)/$(LIB_CMSIS_OBJ_PREFIX)%.o: $(LIB_CMSIS_DIR)/%.c \ - $(call dirhs, $(LIB_CMSIS_DIR)) - $(CC_ALL_DEPS) diff --git a/car_hw/src/lib/cmsis/arm_common_tables.h b/car_hw/src/lib/cmsis/arm_common_tables.h deleted file mode 100644 index 34f910f9baf..00000000000 --- a/car_hw/src/lib/cmsis/arm_common_tables.h +++ /dev/null @@ -1,35 +0,0 @@ -/* ---------------------------------------------------------------------- -* Copyright (C) 2010 ARM Limited. All rights reserved. -* -* $Date: 11. November 2010 -* $Revision: V1.0.2 -* -* Project: CMSIS DSP Library -* Title: arm_common_tables.h -* -* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions -* -* Target Processor: Cortex-M4/Cortex-M3 -* -* Version 1.0.2 2010/11/11 -* Documentation updated. -* -* Version 1.0.1 2010/10/05 -* Production release and review comments incorporated. -* -* Version 1.0.0 2010/09/20 -* Production release and review comments incorporated. -* -------------------------------------------------------------------- */ - -#ifndef _ARM_COMMON_TABLES_H -#define _ARM_COMMON_TABLES_H - -#include "arm_math.h" - -extern uint16_t armBitRevTable[256]; -extern q15_t armRecipTableQ15[64]; -extern q31_t armRecipTableQ31[64]; -extern const q31_t realCoefAQ31[1024]; -extern const q31_t realCoefBQ31[1024]; - -#endif /* ARM_COMMON_TABLES_H */ diff --git a/car_hw/src/lib/cmsis/arm_math.h b/car_hw/src/lib/cmsis/arm_math.h deleted file mode 100644 index d8901db155e..00000000000 --- a/car_hw/src/lib/cmsis/arm_math.h +++ /dev/null @@ -1,7051 +0,0 @@ -/* ---------------------------------------------------------------------- - * Copyright (C) 2010 ARM Limited. All rights reserved. - * - * $Date: 15. July 2011 - * $Revision: V1.0.10 - * - * Project: CMSIS DSP Library - * Title: arm_math.h - * - * Description: Public header file for CMSIS DSP Library - * - * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 - * - * Version 1.0.10 2011/7/15 - * Big Endian support added and Merged M0 and M3/M4 Source code. - * - * Version 1.0.3 2010/11/29 - * Re-organized the CMSIS folders and updated documentation. - * - * Version 1.0.2 2010/11/11 - * Documentation updated. - * - * Version 1.0.1 2010/10/05 - * Production release and review comments incorporated. - * - * Version 1.0.0 2010/09/20 - * Production release and review comments incorporated. - * -------------------------------------------------------------------- */ - -/** - \mainpage CMSIS DSP Software Library - * - * Introduction - * - * This user manual describes the CMSIS DSP software library, - * a suite of common signal processing functions for use on Cortex-M processor based devices. - * - * The library is divided into a number of modules each covering a specific category: - * - Basic math functions - * - Fast math functions - * - Complex math functions - * - Filters - * - Matrix functions - * - Transforms - * - Motor control functions - * - Statistical functions - * - Support functions - * - Interpolation functions - * - * The library has separate functions for operating on 8-bit integers, 16-bit integers, - * 32-bit integer and 32-bit floating-point values. - * - * Processor Support - * - * The library is completely written in C and is fully CMSIS compliant. - * High performance is achieved through maximum use of Cortex-M4 intrinsics. - * - * The supplied library source code also builds and runs on the Cortex-M3 and Cortex-M0 processor, - * with the DSP intrinsics being emulated through software. - * - * - * Toolchain Support - * - * The library has been developed and tested with MDK-ARM version 4.21. - * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. - * - * Using the Library - * - * The library installer contains prebuilt versions of the libraries in the Lib folder. - * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4) - * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4) - * - arm_cortexM4l_math.lib (Little endian on Cortex-M4) - * - arm_cortexM4b_math.lib (Big endian on Cortex-M4) - * - arm_cortexM3l_math.lib (Little endian on Cortex-M3) - * - arm_cortexM3b_math.lib (Big endian on Cortex-M3) - * - arm_cortexM0l_math.lib (Little endian on Cortex-M0) - * - arm_cortexM0b_math.lib (Big endian on Cortex-M3) - * - * The library functions are declared in the public file arm_math.h which is placed in the Include folder. - * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single - * public header file arm_math.h for Cortex-M4/M3/M0 with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. - * Define the appropriate pre processor MACRO ARM_MATH_CM4 or ARM_MATH_CM3 or - * ARM_MATH_CM0 depending on the target processor in the application. - * - * Examples - * - * The library ships with a number of examples which demonstrate how to use the library functions. - * - * Building the Library - * - * The library installer contains project files to re build libraries on MDK Tool chain in the CMSIS\DSP_Lib\Source\ARM folder. - * - arm_cortexM0b_math.uvproj - * - arm_cortexM0l_math.uvproj - * - arm_cortexM3b_math.uvproj - * - arm_cortexM3l_math.uvproj - * - arm_cortexM4b_math.uvproj - * - arm_cortexM4l_math.uvproj - * - arm_cortexM4bf_math.uvproj - * - arm_cortexM4lf_math.uvproj - * - * Each library project have differant pre-processor macros. - * - * ARM_MATH_CMx: - * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target - * and ARM_MATH_CM0 for building library on cortex-M0 target. - * - * ARM_MATH_BIG_ENDIAN: - * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. - * - * ARM_MATH_MATRIX_CHECK: - * Define macro for checking on the input and output sizes of matrices - * - * ARM_MATH_ROUNDING: - * Define macro for rounding on support functions - * - * __FPU_PRESENT: - * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries - * - * - * The project can be built by opening the appropriate project in MDK-ARM 4.21 chain and defining the optional pre processor MACROs detailed above. - * - * Copyright Notice - * - * Copyright (C) 2010 ARM Limited. All rights reserved. - */ - - -/** - * @defgroup groupMath Basic Math Functions - */ - -/** - * @defgroup groupFastMath Fast Math Functions - * This set of functions provides a fast approximation to sine, cosine, and square root. - * As compared to most of the other functions in the CMSIS math library, the fast math functions - * operate on individual values and not arrays. - * There are separate functions for Q15, Q31, and floating-point data. - * - */ - -/** - * @defgroup groupCmplxMath Complex Math Functions - * This set of functions operates on complex data vectors. - * The data in the complex arrays is stored in an interleaved fashion - * (real, imag, real, imag, ...). - * In the API functions, the number of samples in a complex array refers - * to the number of complex values; the array contains twice this number of - * real values. - */ - -/** - * @defgroup groupFilters Filtering Functions - */ - -/** - * @defgroup groupMatrix Matrix Functions - * - * This set of functions provides basic matrix math operations. - * The functions operate on matrix data structures. For example, - * the type - * definition for the floating-point matrix structure is shown - * below: - *
- *     typedef struct
- *     {
- *       uint16_t numRows;     // number of rows of the matrix.
- *       uint16_t numCols;     // number of columns of the matrix.
- *       float32_t *pData;     // points to the data of the matrix.
- *     } arm_matrix_instance_f32;
- * 
- * There are similar definitions for Q15 and Q31 data types. - * - * The structure specifies the size of the matrix and then points to - * an array of data. The array is of size numRows X numCols - * and the values are arranged in row order. That is, the - * matrix element (i, j) is stored at: - *
- *     pData[i*numCols + j]
- * 
- * - * \par Init Functions - * There is an associated initialization function for each type of matrix - * data structure. - * The initialization function sets the values of the internal structure fields. - * Refer to the function arm_mat_init_f32(), arm_mat_init_q31() - * and arm_mat_init_q15() for floating-point, Q31 and Q15 types, respectively. - * - * \par - * Use of the initialization function is optional. However, if initialization function is used - * then the instance structure cannot be placed into a const data section. - * To place the instance structure in a const data - * section, manually initialize the data structure. For example: - *
- * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
- * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
- * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
- * 
- * where nRows specifies the number of rows, nColumns - * specifies the number of columns, and pData points to the - * data array. - * - * \par Size Checking - * By default all of the matrix functions perform size checking on the input and - * output matrices. For example, the matrix addition function verifies that the - * two input matrices and the output matrix all have the same number of rows and - * columns. If the size check fails the functions return: - *
- *     ARM_MATH_SIZE_MISMATCH
- * 
- * Otherwise the functions return - *
- *     ARM_MATH_SUCCESS
- * 
- * There is some overhead associated with this matrix size checking. - * The matrix size checking is enabled via the #define - *
- *     ARM_MATH_MATRIX_CHECK
- * 
- * within the library project settings. By default this macro is defined - * and size checking is enabled. By changing the project settings and - * undefining this macro size checking is eliminated and the functions - * run a bit faster. With size checking disabled the functions always - * return ARM_MATH_SUCCESS. - */ - -/** - * @defgroup groupTransforms Transform Functions - */ - -/** - * @defgroup groupController Controller Functions - */ - -/** - * @defgroup groupStats Statistics Functions - */ -/** - * @defgroup groupSupport Support Functions - */ - -/** - * @defgroup groupInterpolation Interpolation Functions - * These functions perform 1- and 2-dimensional interpolation of data. - * Linear interpolation is used for 1-dimensional data and - * bilinear interpolation is used for 2-dimensional data. - */ - -/** - * @defgroup groupExamples Examples - */ -#ifndef _ARM_MATH_H -#define _ARM_MATH_H - -#define __CMSIS_GENERIC /* disable NVIC and Systick functions */ - -#if defined (ARM_MATH_CM4) - #include "core_cm4.h" -#elif defined (ARM_MATH_CM3) - #include "core_cm3.h" -#elif defined (ARM_MATH_CM0) - #include "core_cm0.h" -#else -#include "ARMCM4.h" -#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....." -#endif - -#undef __CMSIS_GENERIC /* enable NVIC and Systick functions */ -#include "string.h" - #include "math.h" -#ifdef __cplusplus -extern "C" -{ -#endif - - - /** - * @brief Macros required for reciprocal calculation in Normalized LMS - */ - -#define DELTA_Q31 (0x100) -#define DELTA_Q15 0x5 -#define INDEX_MASK 0x0000003F -#define PI 3.14159265358979f - - /** - * @brief Macros required for SINE and COSINE Fast math approximations - */ - -#define TABLE_SIZE 256 -#define TABLE_SPACING_Q31 0x800000 -#define TABLE_SPACING_Q15 0x80 - - /** - * @brief Macros required for SINE and COSINE Controller functions - */ - /* 1.31(q31) Fixed value of 2/360 */ - /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ -#define INPUT_SPACING 0xB60B61 - - - /** - * @brief Error status returned by some functions in the library. - */ - - typedef enum - { - ARM_MATH_SUCCESS = 0, /**< No error */ - ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ - ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ - ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ - ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ - ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ - ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ - } arm_status; - - /** - * @brief 8-bit fractional data type in 1.7 format. - */ - typedef int8_t q7_t; - - /** - * @brief 16-bit fractional data type in 1.15 format. - */ - typedef int16_t q15_t; - - /** - * @brief 32-bit fractional data type in 1.31 format. - */ - typedef int32_t q31_t; - - /** - * @brief 64-bit fractional data type in 1.63 format. - */ - typedef int64_t q63_t; - - /** - * @brief 32-bit floating-point type definition. - */ - typedef float float32_t; - - /** - * @brief 64-bit floating-point type definition. - */ - typedef double float64_t; - - /** - * @brief definition to read/write two 16 bit values. - */ -#define __SIMD32(addr) (*(int32_t **) & (addr)) - -#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) - /** - * @brief definition to pack two 16 bit values. - */ -#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ - (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) - -#endif - - - /** - * @brief definition to pack four 8 bit values. - */ -#ifndef ARM_MATH_BIG_ENDIAN - -#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) -#else - -#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) - -#endif - - - /** - * @brief Clips Q63 to Q31 values. - */ - static __INLINE q31_t clip_q63_to_q31( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; - } - - /** - * @brief Clips Q63 to Q15 values. - */ - static __INLINE q15_t clip_q63_to_q15( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); - } - - /** - * @brief Clips Q31 to Q7 values. - */ - static __INLINE q7_t clip_q31_to_q7( - q31_t x) - { - return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? - ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; - } - - /** - * @brief Clips Q31 to Q15 values. - */ - static __INLINE q15_t clip_q31_to_q15( - q31_t x) - { - return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? - ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; - } - - /** - * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. - */ - - static __INLINE q63_t mult32x64( - q63_t x, - q31_t y) - { - return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + - (((q63_t) (x >> 32) * y))); - } - - -#if defined (ARM_MATH_CM0) && defined ( __CC_ARM ) -#define __CLZ __clz -#endif - -#if defined (ARM_MATH_CM0) && ((defined (__ICCARM__)) ||(defined (__GNUC__)) || defined (__TASKING__) ) - - static __INLINE uint32_t __CLZ(q31_t data); - - - static __INLINE uint32_t __CLZ(q31_t data) - { - uint32_t count = 0; - uint32_t mask = 0x80000000; - - while((data & mask) == 0) - { - count += 1u; - mask = mask >> 1u; - } - - return(count); - - } - -#endif - - /** - * @brief Function to Calculates 1/in(reciprocal) value of Q31 Data type. - */ - - static __INLINE uint32_t arm_recip_q31( - q31_t in, - q31_t * dst, - q31_t * pRecipTable) - { - - uint32_t out, tempVal; - uint32_t index, i; - uint32_t signBits; - - if(in > 0) - { - signBits = __CLZ(in) - 1; - } - else - { - signBits = __CLZ(-in) - 1; - } - - /* Convert input sample to 1.31 format */ - in = in << signBits; - - /* calculation of index for initial approximated Val */ - index = (uint32_t) (in >> 24u); - index = (index & INDEX_MASK); - - /* 1.31 with exp 1 */ - out = pRecipTable[index]; - - /* calculation of reciprocal value */ - /* running approximation for two iterations */ - for (i = 0u; i < 2u; i++) - { - tempVal = (q31_t) (((q63_t) in * out) >> 31u); - tempVal = 0x7FFFFFFF - tempVal; - /* 1.31 with exp 1 */ - //out = (q31_t) (((q63_t) out * tempVal) >> 30u); - out = (q31_t) clip_q63_to_q31(((q63_t) out * tempVal) >> 30u); - } - - /* write output */ - *dst = out; - - /* return num of signbits of out = 1/in value */ - return (signBits + 1u); - - } - - /** - * @brief Function to Calculates 1/in(reciprocal) value of Q15 Data type. - */ - static __INLINE uint32_t arm_recip_q15( - q15_t in, - q15_t * dst, - q15_t * pRecipTable) - { - - uint32_t out = 0, tempVal = 0; - uint32_t index = 0, i = 0; - uint32_t signBits = 0; - - if(in > 0) - { - signBits = __CLZ(in) - 17; - } - else - { - signBits = __CLZ(-in) - 17; - } - - /* Convert input sample to 1.15 format */ - in = in << signBits; - - /* calculation of index for initial approximated Val */ - index = in >> 8; - index = (index & INDEX_MASK); - - /* 1.15 with exp 1 */ - out = pRecipTable[index]; - - /* calculation of reciprocal value */ - /* running approximation for two iterations */ - for (i = 0; i < 2; i++) - { - tempVal = (q15_t) (((q31_t) in * out) >> 15); - tempVal = 0x7FFF - tempVal; - /* 1.15 with exp 1 */ - out = (q15_t) (((q31_t) out * tempVal) >> 14); - } - - /* write output */ - *dst = out; - - /* return num of signbits of out = 1/in value */ - return (signBits + 1); - - } - - - /* - * @brief C custom defined intrinisic function for only M0 processors - */ -#if defined(ARM_MATH_CM0) - - static __INLINE q31_t __SSAT( - q31_t x, - uint32_t y) - { - int32_t posMax, negMin; - uint32_t i; - - posMax = 1; - for (i = 0; i < (y - 1); i++) - { - posMax = posMax * 2; - } - - if(x > 0) - { - posMax = (posMax - 1); - - if(x > posMax) - { - x = posMax; - } - } - else - { - negMin = -posMax; - - if(x < negMin) - { - x = negMin; - } - } - return (x); - - - } - -#endif /* end of ARM_MATH_CM0 */ - - - - /* - * @brief C custom defined intrinsic function for M3 and M0 processors - */ -#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) - - /* - * @brief C custom defined QADD8 for M3 and M0 processors - */ - static __INLINE q31_t __QADD8( - q31_t x, - q31_t y) - { - - q31_t sum; - q7_t r, s, t, u; - - r = (char) x; - s = (char) y; - - r = __SSAT((q31_t) (r + s), 8); - s = __SSAT(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8); - t = __SSAT(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8); - u = __SSAT(((q31_t) ((x >> 24) + (y >> 24))), 8); - - sum = (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) | - (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF); - - return sum; - - } - - /* - * @brief C custom defined QSUB8 for M3 and M0 processors - */ - static __INLINE q31_t __QSUB8( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s, t, u; - - r = (char) x; - s = (char) y; - - r = __SSAT((r - s), 8); - s = __SSAT(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8; - t = __SSAT(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16; - u = __SSAT(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24; - - sum = - (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r & 0x000000FF); - - return sum; - } - - /* - * @brief C custom defined QADD16 for M3 and M0 processors - */ - - /* - * @brief C custom defined QADD16 for M3 and M0 processors - */ - static __INLINE q31_t __QADD16( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = __SSAT(r + s, 16); - s = __SSAT(((q31_t) ((x >> 16) + (y >> 16))), 16) << 16; - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - - } - - /* - * @brief C custom defined SHADD16 for M3 and M0 processors - */ - static __INLINE q31_t __SHADD16( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = ((r >> 1) + (s >> 1)); - s = ((q31_t) ((x >> 17) + (y >> 17))) << 16; - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - - } - - /* - * @brief C custom defined QSUB16 for M3 and M0 processors - */ - static __INLINE q31_t __QSUB16( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = __SSAT(r - s, 16); - s = __SSAT(((q31_t) ((x >> 16) - (y >> 16))), 16) << 16; - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - } - - /* - * @brief C custom defined SHSUB16 for M3 and M0 processors - */ - static __INLINE q31_t __SHSUB16( - q31_t x, - q31_t y) - { - - q31_t diff; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = ((r >> 1) - (s >> 1)); - s = (((x >> 17) - (y >> 17)) << 16); - - diff = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return diff; - } - - /* - * @brief C custom defined QASX for M3 and M0 processors - */ - static __INLINE q31_t __QASX( - q31_t x, - q31_t y) - { - - q31_t sum = 0; - - sum = ((sum + clip_q31_to_q15((q31_t) ((short) (x >> 16) + (short) y))) << 16) + - clip_q31_to_q15((q31_t) ((short) x - (short) (y >> 16))); - - return sum; - } - - /* - * @brief C custom defined SHASX for M3 and M0 processors - */ - static __INLINE q31_t __SHASX( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = ((r >> 1) - (y >> 17)); - s = (((x >> 17) + (s >> 1)) << 16); - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - } - - - /* - * @brief C custom defined QSAX for M3 and M0 processors - */ - static __INLINE q31_t __QSAX( - q31_t x, - q31_t y) - { - - q31_t sum = 0; - - sum = ((sum + clip_q31_to_q15((q31_t) ((short) (x >> 16) - (short) y))) << 16) + - clip_q31_to_q15((q31_t) ((short) x + (short) (y >> 16))); - - return sum; - } - - /* - * @brief C custom defined SHSAX for M3 and M0 processors - */ - static __INLINE q31_t __SHSAX( - q31_t x, - q31_t y) - { - - q31_t sum; - q31_t r, s; - - r = (short) x; - s = (short) y; - - r = ((r >> 1) + (y >> 17)); - s = (((x >> 17) - (s >> 1)) << 16); - - sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); - - return sum; - } - - /* - * @brief C custom defined SMUSDX for M3 and M0 processors - */ - static __INLINE q31_t __SMUSDX( - q31_t x, - q31_t y) - { - - return ((q31_t)(((short) x * (short) (y >> 16)) - - ((short) (x >> 16) * (short) y))); - } - - /* - * @brief C custom defined SMUADX for M3 and M0 processors - */ - static __INLINE q31_t __SMUADX( - q31_t x, - q31_t y) - { - - return ((q31_t)(((short) x * (short) (y >> 16)) + - ((short) (x >> 16) * (short) y))); - } - - /* - * @brief C custom defined QADD for M3 and M0 processors - */ - static __INLINE q31_t __QADD( - q31_t x, - q31_t y) - { - return clip_q63_to_q31((q63_t) x + y); - } - - /* - * @brief C custom defined QSUB for M3 and M0 processors - */ - static __INLINE q31_t __QSUB( - q31_t x, - q31_t y) - { - return clip_q63_to_q31((q63_t) x - y); - } - - /* - * @brief C custom defined SMLAD for M3 and M0 processors - */ - static __INLINE q31_t __SMLAD( - q31_t x, - q31_t y, - q31_t sum) - { - - return (sum + ((short) (x >> 16) * (short) (y >> 16)) + - ((short) x * (short) y)); - } - - /* - * @brief C custom defined SMLADX for M3 and M0 processors - */ - static __INLINE q31_t __SMLADX( - q31_t x, - q31_t y, - q31_t sum) - { - - return (sum + ((short) (x >> 16) * (short) (y)) + - ((short) x * (short) (y >> 16))); - } - - /* - * @brief C custom defined SMLSDX for M3 and M0 processors - */ - static __INLINE q31_t __SMLSDX( - q31_t x, - q31_t y, - q31_t sum) - { - - return (sum - ((short) (x >> 16) * (short) (y)) + - ((short) x * (short) (y >> 16))); - } - - /* - * @brief C custom defined SMLALD for M3 and M0 processors - */ - static __INLINE q63_t __SMLALD( - q31_t x, - q31_t y, - q63_t sum) - { - - return (sum + ((short) (x >> 16) * (short) (y >> 16)) + - ((short) x * (short) y)); - } - - /* - * @brief C custom defined SMLALDX for M3 and M0 processors - */ - static __INLINE q63_t __SMLALDX( - q31_t x, - q31_t y, - q63_t sum) - { - - return (sum + ((short) (x >> 16) * (short) y)) + - ((short) x * (short) (y >> 16)); - } - - /* - * @brief C custom defined SMUAD for M3 and M0 processors - */ - static __INLINE q31_t __SMUAD( - q31_t x, - q31_t y) - { - - return (((x >> 16) * (y >> 16)) + - (((x << 16) >> 16) * ((y << 16) >> 16))); - } - - /* - * @brief C custom defined SMUSD for M3 and M0 processors - */ - static __INLINE q31_t __SMUSD( - q31_t x, - q31_t y) - { - - return (-((x >> 16) * (y >> 16)) + - (((x << 16) >> 16) * ((y << 16) >> 16))); - } - - - - -#endif /* (ARM_MATH_CM3) || defined (ARM_MATH_CM0) */ - - - /** - * @brief Instance structure for the Q7 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q7; - - /** - * @brief Instance structure for the Q15 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_f32; - - - /** - * @brief Processing function for the Q7 FIR filter. - * @param[in] *S points to an instance of the Q7 FIR filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_q7( - const arm_fir_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q7 FIR filter. - * @param[in,out] *S points to an instance of the Q7 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed. - * @return none - */ - void arm_fir_init_q7( - arm_fir_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 FIR filter. - * @param[in] *S points to an instance of the Q15 FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_q15( - const arm_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q15 FIR filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_fast_q15( - const arm_fir_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q15 FIR filter. - * @param[in,out] *S points to an instance of the Q15 FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if - * numTaps is not a supported value. - */ - - arm_status arm_fir_init_q15( - arm_fir_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR filter. - * @param[in] *S points to an instance of the Q31 FIR filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_q31( - const arm_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q31 FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_fast_q31( - const arm_fir_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 FIR filter. - * @param[in,out] *S points to an instance of the Q31 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return none. - */ - void arm_fir_init_q31( - arm_fir_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the floating-point FIR filter. - * @param[in] *S points to an instance of the floating-point FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_f32( - const arm_fir_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point FIR filter. - * @param[in,out] *S points to an instance of the floating-point FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return none. - */ - void arm_fir_init_f32( - arm_fir_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 Biquad cascade filter. - */ - typedef struct - { - int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - - } arm_biquad_casd_df1_inst_q15; - - - /** - * @brief Instance structure for the Q31 Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - - } arm_biquad_casd_df1_inst_q31; - - /** - * @brief Instance structure for the floating-point Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - - - } arm_biquad_casd_df1_inst_f32; - - - - /** - * @brief Processing function for the Q15 Biquad cascade filter. - * @param[in] *S points to an instance of the Q15 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_q15( - const arm_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q15 Biquad cascade filter. - * @param[in,out] *S points to an instance of the Q15 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - * @return none - */ - - void arm_biquad_cascade_df1_init_q15( - arm_biquad_casd_df1_inst_q15 * S, - uint8_t numStages, - q15_t * pCoeffs, - q15_t * pState, - int8_t postShift); - - - /** - * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q15 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_fast_q15( - const arm_biquad_casd_df1_inst_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 Biquad cascade filter - * @param[in] *S points to an instance of the Q31 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_q31( - const arm_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q31 Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_fast_q31( - const arm_biquad_casd_df1_inst_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 Biquad cascade filter. - * @param[in,out] *S points to an instance of the Q31 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - * @return none - */ - - void arm_biquad_cascade_df1_init_q31( - arm_biquad_casd_df1_inst_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q31_t * pState, - int8_t postShift); - - /** - * @brief Processing function for the floating-point Biquad cascade filter. - * @param[in] *S points to an instance of the floating-point Biquad cascade structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df1_f32( - const arm_biquad_casd_df1_inst_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point Biquad cascade filter. - * @param[in,out] *S points to an instance of the floating-point Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @return none - */ - - void arm_biquad_cascade_df1_init_f32( - arm_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Instance structure for the floating-point matrix structure. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float32_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_f32; - - /** - * @brief Instance structure for the Q15 matrix structure. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q15_t *pData; /**< points to the data of the matrix. */ - - } arm_matrix_instance_q15; - - /** - * @brief Instance structure for the Q31 matrix structure. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q31_t *pData; /**< points to the data of the matrix. */ - - } arm_matrix_instance_q31; - - - - /** - * @brief Floating-point matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_add_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_add_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix addition. - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_add_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_trans_f32( - const arm_matrix_instance_f32 * pSrc, - arm_matrix_instance_f32 * pDst); - - - /** - * @brief Q15 matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_trans_q15( - const arm_matrix_instance_q15 * pSrc, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix transpose. - * @param[in] *pSrc points to the input matrix - * @param[out] *pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_trans_q31( - const arm_matrix_instance_q31 * pSrc, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix multiplication - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix multiplication - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); - - /** - * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @param[in] *pState points to the array for storing intermediate results - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_mult_fast_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); - - /** - * @brief Q31 matrix multiplication - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_mult_fast_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Floating-point matrix subtraction - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_sub_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix subtraction - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_sub_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix subtraction - * @param[in] *pSrcA points to the first input matrix structure - * @param[in] *pSrcB points to the second input matrix structure - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_sub_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point matrix scaling. - * @param[in] *pSrc points to the input matrix - * @param[in] scale scale factor - * @param[out] *pDst points to the output matrix - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_scale_f32( - const arm_matrix_instance_f32 * pSrc, - float32_t scale, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix scaling. - * @param[in] *pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to output matrix - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_scale_q15( - const arm_matrix_instance_q15 * pSrc, - q15_t scaleFract, - int32_t shift, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix scaling. - * @param[in] *pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ - - arm_status arm_mat_scale_q31( - const arm_matrix_instance_q31 * pSrc, - q31_t scaleFract, - int32_t shift, - arm_matrix_instance_q31 * pDst); - - - /** - * @brief Q31 matrix initialization. - * @param[in,out] *S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] *pData points to the matrix data array. - * @return none - */ - - void arm_mat_init_q31( - arm_matrix_instance_q31 * S, - uint16_t nRows, - uint16_t nColumns, - q31_t *pData); - - /** - * @brief Q15 matrix initialization. - * @param[in,out] *S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] *pData points to the matrix data array. - * @return none - */ - - void arm_mat_init_q15( - arm_matrix_instance_q15 * S, - uint16_t nRows, - uint16_t nColumns, - q15_t *pData); - - /** - * @brief Floating-point matrix initialization. - * @param[in,out] *S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] *pData points to the matrix data array. - * @return none - */ - - void arm_mat_init_f32( - arm_matrix_instance_f32 * S, - uint16_t nRows, - uint16_t nColumns, - float32_t *pData); - - - - /** - * @brief Instance structure for the Q15 PID Control. - */ - typedef struct - { - q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - #ifdef ARM_MATH_CM0 - q15_t A1; - q15_t A2; - #else - q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ - #endif - q15_t state[3]; /**< The state array of length 3. */ - q15_t Kp; /**< The proportional gain. */ - q15_t Ki; /**< The integral gain. */ - q15_t Kd; /**< The derivative gain. */ - } arm_pid_instance_q15; - - /** - * @brief Instance structure for the Q31 PID Control. - */ - typedef struct - { - q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - q31_t A2; /**< The derived gain, A2 = Kd . */ - q31_t state[3]; /**< The state array of length 3. */ - q31_t Kp; /**< The proportional gain. */ - q31_t Ki; /**< The integral gain. */ - q31_t Kd; /**< The derivative gain. */ - - } arm_pid_instance_q31; - - /** - * @brief Instance structure for the floating-point PID Control. - */ - typedef struct - { - float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - float32_t A2; /**< The derived gain, A2 = Kd . */ - float32_t state[3]; /**< The state array of length 3. */ - float32_t Kp; /**< The proportional gain. */ - float32_t Ki; /**< The integral gain. */ - float32_t Kd; /**< The derivative gain. */ - } arm_pid_instance_f32; - - - - /** - * @brief Initialization function for the floating-point PID Control. - * @param[in,out] *S points to an instance of the PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - * @return none. - */ - void arm_pid_init_f32( - arm_pid_instance_f32 * S, - int32_t resetStateFlag); - - /** - * @brief Reset function for the floating-point PID Control. - * @param[in,out] *S is an instance of the floating-point PID Control structure - * @return none - */ - void arm_pid_reset_f32( - arm_pid_instance_f32 * S); - - - /** - * @brief Initialization function for the Q31 PID Control. - * @param[in,out] *S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - * @return none. - */ - void arm_pid_init_q31( - arm_pid_instance_q31 * S, - int32_t resetStateFlag); - - - /** - * @brief Reset function for the Q31 PID Control. - * @param[in,out] *S points to an instance of the Q31 PID Control structure - * @return none - */ - - void arm_pid_reset_q31( - arm_pid_instance_q31 * S); - - /** - * @brief Initialization function for the Q15 PID Control. - * @param[in,out] *S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - * @return none. - */ - void arm_pid_init_q15( - arm_pid_instance_q15 * S, - int32_t resetStateFlag); - - /** - * @brief Reset function for the Q15 PID Control. - * @param[in,out] *S points to an instance of the q15 PID Control structure - * @return none - */ - void arm_pid_reset_q15( - arm_pid_instance_q15 * S); - - - /** - * @brief Instance structure for the floating-point Linear Interpolate function. - */ - typedef struct - { - uint32_t nValues; - float32_t x1; - float32_t xSpacing; - float32_t *pYData; /**< pointer to the table of Y values */ - } arm_linear_interp_instance_f32; - - /** - * @brief Instance structure for the floating-point bilinear interpolation function. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - float32_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_f32; - - /** - * @brief Instance structure for the Q31 bilinear interpolation function. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q31_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q31; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q15_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q15; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q7_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q7; - - - /** - * @brief Q7 vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_mult_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Q15 vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_mult_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Q31 vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_mult_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Floating-point vector multiplication. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_mult_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q15; - - /** - * @brief Instance structure for the Q31 CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q31; - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - float32_t *pTwiddle; /**< points to the twiddle factor table. */ - uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix4_instance_f32; - - /** - * @brief Processing function for the Q15 CFFT/CIFFT. - * @param[in] *S points to an instance of the Q15 CFFT/CIFFT structure. - * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. - * @return none. - */ - - void arm_cfft_radix4_q15( - const arm_cfft_radix4_instance_q15 * S, - q15_t * pSrc); - - /** - * @brief Initialization function for the Q15 CFFT/CIFFT. - * @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure. - * @param[in] fftLen length of the FFT. - * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. - */ - - arm_status arm_cfft_radix4_init_q15( - arm_cfft_radix4_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Processing function for the Q31 CFFT/CIFFT. - * @param[in] *S points to an instance of the Q31 CFFT/CIFFT structure. - * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. - * @return none. - */ - - void arm_cfft_radix4_q31( - const arm_cfft_radix4_instance_q31 * S, - q31_t * pSrc); - - /** - * @brief Initialization function for the Q31 CFFT/CIFFT. - * @param[in,out] *S points to an instance of the Q31 CFFT/CIFFT structure. - * @param[in] fftLen length of the FFT. - * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. - */ - - arm_status arm_cfft_radix4_init_q31( - arm_cfft_radix4_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Processing function for the floating-point CFFT/CIFFT. - * @param[in] *S points to an instance of the floating-point CFFT/CIFFT structure. - * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. - * @return none. - */ - - void arm_cfft_radix4_f32( - const arm_cfft_radix4_instance_f32 * S, - float32_t * pSrc); - - /** - * @brief Initialization function for the floating-point CFFT/CIFFT. - * @param[in,out] *S points to an instance of the floating-point CFFT/CIFFT structure. - * @param[in] fftLen length of the FFT. - * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. - */ - - arm_status arm_cfft_radix4_init_f32( - arm_cfft_radix4_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - - - /*---------------------------------------------------------------------- - * Internal functions prototypes FFT function - ----------------------------------------------------------------------*/ - - /** - * @brief Core function for the floating-point CFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to the twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix4_butterfly_f32( - float32_t * pSrc, - uint16_t fftLen, - float32_t * pCoef, - uint16_t twidCoefModifier); - - /** - * @brief Core function for the floating-point CIFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @param[in] onebyfftLen value of 1/fftLen. - * @return none. - */ - - void arm_radix4_butterfly_inverse_f32( - float32_t * pSrc, - uint16_t fftLen, - float32_t * pCoef, - uint16_t twidCoefModifier, - float32_t onebyfftLen); - - /** - * @brief In-place bit reversal function. - * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. - * @param[in] fftSize length of the FFT. - * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table. - * @param[in] *pBitRevTab points to the bit reversal table. - * @return none. - */ - - void arm_bitreversal_f32( - float32_t *pSrc, - uint16_t fftSize, - uint16_t bitRevFactor, - uint16_t *pBitRevTab); - - /** - * @brief Core function for the Q31 CFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix4_butterfly_q31( - q31_t *pSrc, - uint32_t fftLen, - q31_t *pCoef, - uint32_t twidCoefModifier); - - /** - * @brief Core function for the Q31 CIFFT butterfly process. - * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix4_butterfly_inverse_q31( - q31_t * pSrc, - uint32_t fftLen, - q31_t * pCoef, - uint32_t twidCoefModifier); - - /** - * @brief In-place bit reversal function. - * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. - * @param[in] fftLen length of the FFT. - * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table - * @param[in] *pBitRevTab points to bit reversal table. - * @return none. - */ - - void arm_bitreversal_q31( - q31_t * pSrc, - uint32_t fftLen, - uint16_t bitRevFactor, - uint16_t *pBitRevTab); - - /** - * @brief Core function for the Q15 CFFT butterfly process. - * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef16 points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix4_butterfly_q15( - q15_t *pSrc16, - uint32_t fftLen, - q15_t *pCoef16, - uint32_t twidCoefModifier); - - /** - * @brief Core function for the Q15 CIFFT butterfly process. - * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. - * @param[in] fftLen length of the FFT. - * @param[in] *pCoef16 points to twiddle coefficient buffer. - * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. - * @return none. - */ - - void arm_radix4_butterfly_inverse_q15( - q15_t *pSrc16, - uint32_t fftLen, - q15_t *pCoef16, - uint32_t twidCoefModifier); - - /** - * @brief In-place bit reversal function. - * @param[in, out] *pSrc points to the in-place buffer of Q15 data type. - * @param[in] fftLen length of the FFT. - * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table - * @param[in] *pBitRevTab points to bit reversal table. - * @return none. - */ - - void arm_bitreversal_q15( - q15_t * pSrc, - uint32_t fftLen, - uint16_t bitRevFactor, - uint16_t *pBitRevTab); - - /** - * @brief Instance structure for the Q15 RFFT/RIFFT function. - */ - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint32_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_q15; - - /** - * @brief Instance structure for the Q31 RFFT/RIFFT function. - */ - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint32_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_q31; - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ - - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint16_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_f32; - - /** - * @brief Processing function for the Q15 RFFT/RIFFT. - * @param[in] *S points to an instance of the Q15 RFFT/RIFFT structure. - * @param[in] *pSrc points to the input buffer. - * @param[out] *pDst points to the output buffer. - * @return none. - */ - - void arm_rfft_q15( - const arm_rfft_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst); - - /** - * @brief Initialization function for the Q15 RFFT/RIFFT. - * @param[in, out] *S points to an instance of the Q15 RFFT/RIFFT structure. - * @param[in] *S_CFFT points to an instance of the Q15 CFFT/CIFFT structure. - * @param[in] fftLenReal length of the FFT. - * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. - */ - - arm_status arm_rfft_init_q15( - arm_rfft_instance_q15 * S, - arm_cfft_radix4_instance_q15 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - /** - * @brief Processing function for the Q31 RFFT/RIFFT. - * @param[in] *S points to an instance of the Q31 RFFT/RIFFT structure. - * @param[in] *pSrc points to the input buffer. - * @param[out] *pDst points to the output buffer. - * @return none. - */ - - void arm_rfft_q31( - const arm_rfft_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst); - - /** - * @brief Initialization function for the Q31 RFFT/RIFFT. - * @param[in, out] *S points to an instance of the Q31 RFFT/RIFFT structure. - * @param[in, out] *S_CFFT points to an instance of the Q31 CFFT/CIFFT structure. - * @param[in] fftLenReal length of the FFT. - * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. - */ - - arm_status arm_rfft_init_q31( - arm_rfft_instance_q31 * S, - arm_cfft_radix4_instance_q31 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - /** - * @brief Initialization function for the floating-point RFFT/RIFFT. - * @param[in,out] *S points to an instance of the floating-point RFFT/RIFFT structure. - * @param[in,out] *S_CFFT points to an instance of the floating-point CFFT/CIFFT structure. - * @param[in] fftLenReal length of the FFT. - * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. - * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. - */ - - arm_status arm_rfft_init_f32( - arm_rfft_instance_f32 * S, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - /** - * @brief Processing function for the floating-point RFFT/RIFFT. - * @param[in] *S points to an instance of the floating-point RFFT/RIFFT structure. - * @param[in] *pSrc points to the input buffer. - * @param[out] *pDst points to the output buffer. - * @return none. - */ - - void arm_rfft_f32( - const arm_rfft_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst); - - /** - * @brief Instance structure for the floating-point DCT4/IDCT4 function. - */ - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - float32_t normalize; /**< normalizing factor. */ - float32_t *pTwiddle; /**< points to the twiddle factor table. */ - float32_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_f32; - - /** - * @brief Initialization function for the floating-point DCT4/IDCT4. - * @param[in,out] *S points to an instance of floating-point DCT4/IDCT4 structure. - * @param[in] *S_RFFT points to an instance of floating-point RFFT/RIFFT structure. - * @param[in] *S_CFFT points to an instance of floating-point CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. - */ - - arm_status arm_dct4_init_f32( - arm_dct4_instance_f32 * S, - arm_rfft_instance_f32 * S_RFFT, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint16_t N, - uint16_t Nby2, - float32_t normalize); - - /** - * @brief Processing function for the floating-point DCT4/IDCT4. - * @param[in] *S points to an instance of the floating-point DCT4/IDCT4 structure. - * @param[in] *pState points to state buffer. - * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. - * @return none. - */ - - void arm_dct4_f32( - const arm_dct4_instance_f32 * S, - float32_t * pState, - float32_t * pInlineBuffer); - - /** - * @brief Instance structure for the Q31 DCT4/IDCT4 function. - */ - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q31_t normalize; /**< normalizing factor. */ - q31_t *pTwiddle; /**< points to the twiddle factor table. */ - q31_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q31; - - /** - * @brief Initialization function for the Q31 DCT4/IDCT4. - * @param[in,out] *S points to an instance of Q31 DCT4/IDCT4 structure. - * @param[in] *S_RFFT points to an instance of Q31 RFFT/RIFFT structure - * @param[in] *S_CFFT points to an instance of Q31 CFFT/CIFFT structure - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. - */ - - arm_status arm_dct4_init_q31( - arm_dct4_instance_q31 * S, - arm_rfft_instance_q31 * S_RFFT, - arm_cfft_radix4_instance_q31 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q31_t normalize); - - /** - * @brief Processing function for the Q31 DCT4/IDCT4. - * @param[in] *S points to an instance of the Q31 DCT4 structure. - * @param[in] *pState points to state buffer. - * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. - * @return none. - */ - - void arm_dct4_q31( - const arm_dct4_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - - /** - * @brief Instance structure for the Q15 DCT4/IDCT4 function. - */ - - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q15_t normalize; /**< normalizing factor. */ - q15_t *pTwiddle; /**< points to the twiddle factor table. */ - q15_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q15; - - /** - * @brief Initialization function for the Q15 DCT4/IDCT4. - * @param[in,out] *S points to an instance of Q15 DCT4/IDCT4 structure. - * @param[in] *S_RFFT points to an instance of Q15 RFFT/RIFFT structure. - * @param[in] *S_CFFT points to an instance of Q15 CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. - */ - - arm_status arm_dct4_init_q15( - arm_dct4_instance_q15 * S, - arm_rfft_instance_q15 * S_RFFT, - arm_cfft_radix4_instance_q15 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q15_t normalize); - - /** - * @brief Processing function for the Q15 DCT4/IDCT4. - * @param[in] *S points to an instance of the Q15 DCT4 structure. - * @param[in] *pState points to state buffer. - * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. - * @return none. - */ - - void arm_dct4_q15( - const arm_dct4_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer); - - /** - * @brief Floating-point vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_add_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Q7 vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_add_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Q15 vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_add_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Q31 vector addition. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_add_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Floating-point vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_sub_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Q7 vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_sub_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Q15 vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_sub_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Q31 vector subtraction. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_sub_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Multiplies a floating-point vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scale scale factor to be applied - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_scale_f32( - float32_t * pSrc, - float32_t scale, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Multiplies a Q7 vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_scale_q7( - q7_t * pSrc, - q7_t scaleFract, - int8_t shift, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Multiplies a Q15 vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_scale_q15( - q15_t * pSrc, - q15_t scaleFract, - int8_t shift, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Multiplies a Q31 vector by a scalar. - * @param[in] *pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_scale_q31( - q31_t * pSrc, - q31_t scaleFract, - int8_t shift, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Q7 vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_abs_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Floating-point vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_abs_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Q15 vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_abs_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Q31 vector absolute value. - * @param[in] *pSrc points to the input buffer - * @param[out] *pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - * @return none. - */ - - void arm_abs_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Dot product of floating-point vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - void arm_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t blockSize, - float32_t * result); - - /** - * @brief Dot product of Q7 vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - void arm_dot_prod_q7( - q7_t * pSrcA, - q7_t * pSrcB, - uint32_t blockSize, - q31_t * result); - - /** - * @brief Dot product of Q15 vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - void arm_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - /** - * @brief Dot product of Q31 vectors. - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] *result output result returned here - * @return none. - */ - - void arm_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - /** - * @brief Shifts the elements of a Q7 vector a specified number of bits. - * @param[in] *pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_shift_q7( - q7_t * pSrc, - int8_t shiftBits, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Shifts the elements of a Q15 vector a specified number of bits. - * @param[in] *pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_shift_q15( - q15_t * pSrc, - int8_t shiftBits, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Shifts the elements of a Q31 vector a specified number of bits. - * @param[in] *pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_shift_q31( - q31_t * pSrc, - int8_t shiftBits, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Adds a constant offset to a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_offset_f32( - float32_t * pSrc, - float32_t offset, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Adds a constant offset to a Q7 vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_offset_q7( - q7_t * pSrc, - q7_t offset, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Adds a constant offset to a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_offset_q15( - q15_t * pSrc, - q15_t offset, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Adds a constant offset to a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_offset_q31( - q31_t * pSrc, - q31_t offset, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Negates the elements of a floating-point vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_negate_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Negates the elements of a Q7 vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_negate_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Negates the elements of a Q15 vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_negate_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Negates the elements of a Q31 vector. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] blockSize number of samples in the vector - * @return none. - */ - - void arm_negate_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - /** - * @brief Copies the elements of a floating-point vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_copy_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Copies the elements of a Q7 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_copy_q7( - q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Copies the elements of a Q15 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_copy_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Copies the elements of a Q31 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_copy_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - /** - * @brief Fills a constant value into a floating-point vector. - * @param[in] value input value to be filled - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_fill_f32( - float32_t value, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Fills a constant value into a Q7 vector. - * @param[in] value input value to be filled - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_fill_q7( - q7_t value, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Fills a constant value into a Q15 vector. - * @param[in] value input value to be filled - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_fill_q15( - q15_t value, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Fills a constant value into a Q31 vector. - * @param[in] value input value to be filled - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_fill_q31( - q31_t value, - q31_t * pDst, - uint32_t blockSize); - -/** - * @brief Convolution of floating-point sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - -/** - * @brief Convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - /** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - /** - * @brief Convolution of Q31 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - /** - * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - /** - * @brief Convolution of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. - * @return none. - */ - - void arm_conv_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - /** - * @brief Partial convolution of floating-point sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - /** - * @brief Partial convolution of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - /** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - /** - * @brief Partial convolution of Q31 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - /** - * @brief Partial convolution of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - - arm_status arm_conv_partial_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Instance structure for the Q15 FIR decimator. - */ - - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR decimator. - */ - - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - - } arm_fir_decimate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR decimator. - */ - - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - - } arm_fir_decimate_instance_f32; - - - - /** - * @brief Processing function for the floating-point FIR decimator. - * @param[in] *S points to an instance of the floating-point FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_f32( - const arm_fir_decimate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point FIR decimator. - * @param[in,out] *S points to an instance of the floating-point FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - - arm_status arm_fir_decimate_init_f32( - arm_fir_decimate_instance_f32 * S, - uint16_t numTaps, - uint8_t M, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q15 FIR decimator. - * @param[in] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_fast_q15( - const arm_fir_decimate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - - /** - * @brief Initialization function for the Q15 FIR decimator. - * @param[in,out] *S points to an instance of the Q15 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - - arm_status arm_fir_decimate_init_q15( - arm_fir_decimate_instance_q15 * S, - uint16_t numTaps, - uint8_t M, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR decimator. - * @param[in] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_q31( - const arm_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - * @return none - */ - - void arm_fir_decimate_fast_q31( - arm_fir_decimate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR decimator. - * @param[in,out] *S points to an instance of the Q31 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - - arm_status arm_fir_decimate_init_q31( - arm_fir_decimate_instance_q31 * S, - uint16_t numTaps, - uint8_t M, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - - /** - * @brief Instance structure for the Q15 FIR interpolator. - */ - - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR interpolator. - */ - - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR interpolator. - */ - - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ - } arm_fir_interpolate_instance_f32; - - - /** - * @brief Processing function for the Q15 FIR interpolator. - * @param[in] *S points to an instance of the Q15 FIR interpolator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_interpolate_q15( - const arm_fir_interpolate_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 FIR interpolator. - * @param[in,out] *S points to an instance of the Q15 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - - arm_status arm_fir_interpolate_init_q15( - arm_fir_interpolate_instance_q15 * S, - uint8_t L, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR interpolator. - * @param[in] *S points to an instance of the Q15 FIR interpolator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_interpolate_q31( - const arm_fir_interpolate_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 FIR interpolator. - * @param[in,out] *S points to an instance of the Q31 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - - arm_status arm_fir_interpolate_init_q31( - arm_fir_interpolate_instance_q31 * S, - uint8_t L, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point FIR interpolator. - * @param[in] *S points to an instance of the floating-point FIR interpolator structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_interpolate_f32( - const arm_fir_interpolate_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point FIR interpolator. - * @param[in,out] *S points to an instance of the floating-point FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] *pCoeffs points to the filter coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - - arm_status arm_fir_interpolate_init_f32( - arm_fir_interpolate_instance_f32 * S, - uint8_t L, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - /** - * @brief Instance structure for the high precision Q31 Biquad cascade filter. - */ - - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ - - } arm_biquad_cas_df1_32x64_ins_q31; - - - /** - * @param[in] *S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cas_df1_32x64_q31( - const arm_biquad_cas_df1_32x64_ins_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @param[in,out] *S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format - * @return none - */ - - void arm_biquad_cas_df1_32x64_init_q31( - arm_biquad_cas_df1_32x64_ins_q31 * S, - uint8_t numStages, - q31_t * pCoeffs, - q63_t * pState, - uint8_t postShift); - - - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_df2T_instance_f32; - - - /** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in] *S points to an instance of the filter data structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_biquad_cascade_df2T_f32( - const arm_biquad_cascade_df2T_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] *S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] *pCoeffs points to the filter coefficients. - * @param[in] *pState points to the state buffer. - * @return none - */ - - void arm_biquad_cascade_df2T_init_f32( - arm_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - - - /** - * @brief Instance structure for the Q15 FIR lattice filter. - */ - - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR lattice filter. - */ - - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR lattice filter. - */ - - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_f32; - - /** - * @brief Initialization function for the Q15 FIR lattice filter. - * @param[in] *S points to an instance of the Q15 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] *pState points to the state buffer. The array is of length numStages. - * @return none. - */ - - void arm_fir_lattice_init_q15( - arm_fir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pCoeffs, - q15_t * pState); - - - /** - * @brief Processing function for the Q15 FIR lattice filter. - * @param[in] *S points to an instance of the Q15 FIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - void arm_fir_lattice_q15( - const arm_fir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 FIR lattice filter. - * @param[in] *S points to an instance of the Q31 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] *pState points to the state buffer. The array is of length numStages. - * @return none. - */ - - void arm_fir_lattice_init_q31( - arm_fir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pCoeffs, - q31_t * pState); - - - /** - * @brief Processing function for the Q31 FIR lattice filter. - * @param[in] *S points to an instance of the Q31 FIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_fir_lattice_q31( - const arm_fir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - -/** - * @brief Initialization function for the floating-point FIR lattice filter. - * @param[in] *S points to an instance of the floating-point FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] *pState points to the state buffer. The array is of length numStages. - * @return none. - */ - - void arm_fir_lattice_init_f32( - arm_fir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pCoeffs, - float32_t * pState); - - /** - * @brief Processing function for the floating-point FIR lattice filter. - * @param[in] *S points to an instance of the floating-point FIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_fir_lattice_f32( - const arm_fir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Instance structure for the Q15 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_f32; - - /** - * @brief Processing function for the floating-point IIR lattice filter. - * @param[in] *S points to an instance of the floating-point IIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_f32( - const arm_iir_lattice_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point IIR lattice filter. - * @param[in] *S points to an instance of the floating-point IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize-1. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_init_f32( - arm_iir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t *pkCoeffs, - float32_t *pvCoeffs, - float32_t *pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 IIR lattice filter. - * @param[in] *S points to an instance of the Q31 IIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_q31( - const arm_iir_lattice_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 IIR lattice filter. - * @param[in] *S points to an instance of the Q31 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_init_q31( - arm_iir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t *pkCoeffs, - q31_t *pvCoeffs, - q31_t *pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 IIR lattice filter. - * @param[in] *S points to an instance of the Q15 IIR lattice structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_iir_lattice_q15( - const arm_iir_lattice_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q15 IIR lattice filter. - * @param[in] *S points to an instance of the fixed-point Q15 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] *pkCoeffs points to reflection coefficient buffer. The array is of length numStages. - * @param[in] *pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. - * @param[in] *pState points to state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process per call. - * @return none. - */ - - void arm_iir_lattice_init_q15( - arm_iir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t *pkCoeffs, - q15_t *pvCoeffs, - q15_t *pState, - uint32_t blockSize); - - /** - * @brief Instance structure for the floating-point LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that controls filter coefficient updates. */ - } arm_lms_instance_f32; - - /** - * @brief Processing function for floating-point LMS filter. - * @param[in] *S points to an instance of the floating-point LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_f32( - const arm_lms_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - /** - * @brief Initialization function for floating-point LMS filter. - * @param[in] *S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to the coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_init_f32( - arm_lms_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - /** - * @brief Instance structure for the Q15 LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } arm_lms_instance_q15; - - - /** - * @brief Initialization function for the Q15 LMS filter. - * @param[in] *S points to an instance of the Q15 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to the coefficient buffer. - * @param[in] *pState points to the state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - */ - - void arm_lms_init_q15( - arm_lms_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint32_t postShift); - - /** - * @brief Processing function for Q15 LMS filter. - * @param[in] *S points to an instance of the Q15 LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_q15( - const arm_lms_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - - } arm_lms_instance_q31; - - /** - * @brief Processing function for Q31 LMS filter. - * @param[in] *S points to an instance of the Q15 LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_q31( - const arm_lms_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - /** - * @brief Initialization function for Q31 LMS filter. - * @param[in] *S points to an instance of the Q31 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - */ - - void arm_lms_init_q31( - arm_lms_instance_q31 * S, - uint16_t numTaps, - q31_t *pCoeffs, - q31_t *pState, - q31_t mu, - uint32_t blockSize, - uint32_t postShift); - - /** - * @brief Instance structure for the floating-point normalized LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that control filter coefficient updates. */ - float32_t energy; /**< saves previous frame energy. */ - float32_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_f32; - - /** - * @brief Processing function for floating-point normalized LMS filter. - * @param[in] *S points to an instance of the floating-point normalized LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_norm_f32( - arm_lms_norm_instance_f32 * S, - float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - /** - * @brief Initialization function for floating-point normalized LMS filter. - * @param[in] *S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_norm_init_f32( - arm_lms_norm_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - q31_t *recipTable; /**< points to the reciprocal initial value table. */ - q31_t energy; /**< saves previous frame energy. */ - q31_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q31; - - /** - * @brief Processing function for Q31 normalized LMS filter. - * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_norm_q31( - arm_lms_norm_instance_q31 * S, - q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - /** - * @brief Initialization function for Q31 normalized LMS filter. - * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - */ - - void arm_lms_norm_init_q31( - arm_lms_norm_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint8_t postShift); - - /** - * @brief Instance structure for the Q15 normalized LMS filter. - */ - - typedef struct - { - uint16_t numTaps; /**< Number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - q15_t *recipTable; /**< Points to the reciprocal initial value table. */ - q15_t energy; /**< saves previous frame energy. */ - q15_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q15; - - /** - * @brief Processing function for Q15 normalized LMS filter. - * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] *pSrc points to the block of input data. - * @param[in] *pRef points to the block of reference data. - * @param[out] *pOut points to the block of output data. - * @param[out] *pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - * @return none. - */ - - void arm_lms_norm_q15( - arm_lms_norm_instance_q15 * S, - q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for Q15 normalized LMS filter. - * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] *pCoeffs points to coefficient buffer. - * @param[in] *pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - * @return none. - */ - - void arm_lms_norm_init_q15( - arm_lms_norm_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint8_t postShift); - - /** - * @brief Correlation of floating-point sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_f32( - float32_t * pSrcA, - uint32_t srcALen, - float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - /** - * @brief Correlation of Q15 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - /** - * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_fast_q15( - q15_t * pSrcA, - uint32_t srcALen, - q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - /** - * @brief Correlation of Q31 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - /** - * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_fast_q31( - q31_t * pSrcA, - uint32_t srcALen, - q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - /** - * @brief Correlation of Q7 sequences. - * @param[in] *pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] *pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @return none. - */ - - void arm_correlate_q7( - q7_t * pSrcA, - uint32_t srcALen, - q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - /** - * @brief Instance structure for the floating-point sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_f32; - - /** - * @brief Instance structure for the Q31 sparse FIR filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q31; - - /** - * @brief Instance structure for the Q15 sparse FIR filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q15; - - /** - * @brief Instance structure for the Q7 sparse FIR filter. - */ - - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q7; - - /** - * @brief Processing function for the floating-point sparse FIR filter. - * @param[in] *S points to an instance of the floating-point sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_sparse_f32( - arm_fir_sparse_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - float32_t * pScratchIn, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point sparse FIR filter. - * @param[in,out] *S points to an instance of the floating-point sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - */ - - void arm_fir_sparse_init_f32( - arm_fir_sparse_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 sparse FIR filter. - * @param[in] *S points to an instance of the Q31 sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_sparse_q31( - arm_fir_sparse_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst, - q31_t * pScratchIn, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 sparse FIR filter. - * @param[in,out] *S points to an instance of the Q31 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - */ - - void arm_fir_sparse_init_q31( - arm_fir_sparse_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - /** - * @brief Processing function for the Q15 sparse FIR filter. - * @param[in] *S points to an instance of the Q15 sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] *pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_sparse_q15( - arm_fir_sparse_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst, - q15_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 sparse FIR filter. - * @param[in,out] *S points to an instance of the Q15 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - */ - - void arm_fir_sparse_init_q15( - arm_fir_sparse_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - /** - * @brief Processing function for the Q7 sparse FIR filter. - * @param[in] *S points to an instance of the Q7 sparse FIR structure. - * @param[in] *pSrc points to the block of input data. - * @param[out] *pDst points to the block of output data - * @param[in] *pScratchIn points to a temporary buffer of size blockSize. - * @param[in] *pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - * @return none. - */ - - void arm_fir_sparse_q7( - arm_fir_sparse_instance_q7 * S, - q7_t * pSrc, - q7_t * pDst, - q7_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q7 sparse FIR filter. - * @param[in,out] *S points to an instance of the Q7 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] *pCoeffs points to the array of filter coefficients. - * @param[in] *pState points to the state buffer. - * @param[in] *pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - * @return none - */ - - void arm_fir_sparse_init_q7( - arm_fir_sparse_instance_q7 * S, - uint16_t numTaps, - q7_t * pCoeffs, - q7_t * pState, - int32_t *pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /* - * @brief Floating-point sin_cos function. - * @param[in] theta input value in degrees - * @param[out] *pSinVal points to the processed sine output. - * @param[out] *pCosVal points to the processed cos output. - * @return none. - */ - - void arm_sin_cos_f32( - float32_t theta, - float32_t *pSinVal, - float32_t *pCcosVal); - - /* - * @brief Q31 sin_cos function. - * @param[in] theta scaled input value in degrees - * @param[out] *pSinVal points to the processed sine output. - * @param[out] *pCosVal points to the processed cosine output. - * @return none. - */ - - void arm_sin_cos_q31( - q31_t theta, - q31_t *pSinVal, - q31_t *pCosVal); - - - /** - * @brief Floating-point complex conjugate. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_conj_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex conjugate. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_conj_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - /** - * @brief Q15 complex conjugate. - * @param[in] *pSrc points to the input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_conj_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - - /** - * @brief Floating-point complex magnitude squared - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_squared_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex magnitude squared - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_squared_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - /** - * @brief Q15 complex magnitude squared - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_squared_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @ingroup groupController - */ - - /** - * @defgroup PID PID Motor Control - * - * A Proportional Integral Derivative (PID) controller is a generic feedback control - * loop mechanism widely used in industrial control systems. - * A PID controller is the most commonly used type of feedback controller. - * - * This set of functions implements (PID) controllers - * for Q15, Q31, and floating-point data types. The functions operate on a single sample - * of data and each call to the function returns a single processed value. - * S points to an instance of the PID control data structure. in - * is the input sample value. The functions return the output value. - * - * \par Algorithm: - *
-   *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
-   *    A0 = Kp + Ki + Kd
-   *    A1 = (-Kp ) - (2 * Kd )
-   *    A2 = Kd  
- * - * \par - * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant - * - * \par - * \image html PID.gif "Proportional Integral Derivative Controller" - * - * \par - * The PID controller calculates an "error" value as the difference between - * the measured output and the reference input. - * The controller attempts to minimize the error by adjusting the process control inputs. - * The proportional value determines the reaction to the current error, - * the integral value determines the reaction based on the sum of recent errors, - * and the derivative value determines the reaction based on the rate at which the error has been changing. - * - * \par Instance Structure - * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. - * A separate instance structure must be defined for each PID Controller. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Reset Functions - * There is also an associated reset function for each data type which clears the state array. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. - * - Zeros out the values in the state buffer. - * - * \par - * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. - * - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the PID Controller functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup PID - * @{ - */ - - /** - * @brief Process function for the floating-point PID Control. - * @param[in,out] *S is an instance of the floating-point PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - */ - - - static __INLINE float32_t arm_pid_f32( - arm_pid_instance_f32 * S, - float32_t in) - { - float32_t out; - - /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ - out = (S->A0 * in) + - (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - - } - - /** - * @brief Process function for the Q31 PID Control. - * @param[in,out] *S points to an instance of the Q31 PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 64-bit accumulator. - * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - * Thus, if the accumulator result overflows it wraps around rather than clip. - * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. - * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. - */ - - static __INLINE q31_t arm_pid_q31( - arm_pid_instance_q31 * S, - q31_t in) - { - q63_t acc; - q31_t out; - - /* acc = A0 * x[n] */ - acc = (q63_t) S->A0 * in; - - /* acc += A1 * x[n-1] */ - acc += (q63_t) S->A1 * S->state[0]; - - /* acc += A2 * x[n-2] */ - acc += (q63_t) S->A2 * S->state[1]; - - /* convert output to 1.31 format to add y[n-1] */ - out = (q31_t) (acc >> 31u); - - /* out += y[n-1] */ - out += S->state[2]; - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - - } - - /** - * @brief Process function for the Q15 PID Control. - * @param[in,out] *S points to an instance of the Q15 PID Control structure - * @param[in] in input sample to process - * @return out processed output sample. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using a 64-bit internal accumulator. - * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - * Lastly, the accumulator is saturated to yield a result in 1.15 format. - */ - - static __INLINE q15_t arm_pid_q15( - arm_pid_instance_q15 * S, - q15_t in) - { - q63_t acc; - q15_t out; - - /* Implementation of PID controller */ - - #ifdef ARM_MATH_CM0 - - /* acc = A0 * x[n] */ - acc = ((q31_t) S->A0 )* in ; - - #else - - /* acc = A0 * x[n] */ - acc = (q31_t) __SMUAD(S->A0, in); - - #endif - - #ifdef ARM_MATH_CM0 - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc += (q31_t) S->A1 * S->state[0] ; - acc += (q31_t) S->A2 * S->state[1] ; - - #else - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc = __SMLALD(S->A1, (q31_t)__SIMD32(S->state), acc); - - #endif - - /* acc += y[n-1] */ - acc += (q31_t) S->state[2] << 15; - - /* saturate the output */ - out = (q15_t) (__SSAT((acc >> 15), 16)); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - - } - - /** - * @} end of PID group - */ - - - /** - * @brief Floating-point matrix inverse. - * @param[in] *src points to the instance of the input floating-point matrix structure. - * @param[out] *dst points to the instance of the output floating-point matrix structure. - * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. - * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. - */ - - arm_status arm_mat_inverse_f32( - const arm_matrix_instance_f32 * src, - arm_matrix_instance_f32 * dst); - - - - /** - * @ingroup groupController - */ - - - /** - * @defgroup clarke Vector Clarke Transform - * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. - * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents - * in the two-phase orthogonal stator axis Ialpha and Ibeta. - * When Ialpha is superposed with Ia as shown in the figure below - * \image html clarke.gif Stator current space vector and its components in (a,b). - * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta - * can be calculated using only Ia and Ib. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeFormula.gif - * where Ia and Ib are the instantaneous stator phases and - * pIalpha and pIbeta are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup clarke - * @{ - */ - - /** - * - * @brief Floating-point Clarke transform - * @param[in] Ia input three-phase coordinate a - * @param[in] Ib input three-phase coordinate b - * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta - * @return none. - */ - - static __INLINE void arm_clarke_f32( - float32_t Ia, - float32_t Ib, - float32_t * pIalpha, - float32_t * pIbeta) - { - /* Calculate pIalpha using the equation, pIalpha = Ia */ - *pIalpha = Ia; - - /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ - *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); - - } - - /** - * @brief Clarke transform for Q31 version - * @param[in] Ia input three-phase coordinate a - * @param[in] Ib input three-phase coordinate b - * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition, hence there is no risk of overflow. - */ - - static __INLINE void arm_clarke_q31( - q31_t Ia, - q31_t Ib, - q31_t * pIalpha, - q31_t * pIbeta) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIalpha from Ia by equation pIalpha = Ia */ - *pIalpha = Ia; - - /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); - - /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ - product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); - - /* pIbeta is calculated by adding the intermediate products */ - *pIbeta = __QADD(product1, product2); - } - - /** - * @} end of clarke group - */ - - /** - * @brief Converts the elements of the Q7 vector to Q31 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_q7_to_q31( - q7_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup inv_clarke Vector Inverse Clarke Transform - * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeInvFormula.gif - * where pIa and pIb are the instantaneous stator phases and - * Ialpha and Ibeta are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup inv_clarke - * @{ - */ - - /** - * @brief Floating-point Inverse Clarke transform - * @param[in] Ialpha input two-phase orthogonal vector axis alpha - * @param[in] Ibeta input two-phase orthogonal vector axis beta - * @param[out] *pIa points to output three-phase coordinate a - * @param[out] *pIb points to output three-phase coordinate b - * @return none. - */ - - - static __INLINE void arm_inv_clarke_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pIa, - float32_t * pIb) - { - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ - *pIb = -0.5 * Ialpha + (float32_t) 0.8660254039 *Ibeta; - - } - - /** - * @brief Inverse Clarke transform for Q31 version - * @param[in] Ialpha input two-phase orthogonal vector axis alpha - * @param[in] Ibeta input two-phase orthogonal vector axis beta - * @param[out] *pIa points to output three-phase coordinate a - * @param[out] *pIb points to output three-phase coordinate b - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the subtraction, hence there is no risk of overflow. - */ - - static __INLINE void arm_inv_clarke_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pIa, - q31_t * pIb) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); - - /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); - - /* pIb is calculated by subtracting the products */ - *pIb = __QSUB(product2, product1); - - } - - /** - * @} end of inv_clarke group - */ - - /** - * @brief Converts the elements of the Q7 vector to Q15 vector. - * @param[in] *pSrc input pointer - * @param[out] *pDst output pointer - * @param[in] blockSize number of samples to process - * @return none. - */ - void arm_q7_to_q15( - q7_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup park Vector Park Transform - * - * Forward Park transform converts the input two-coordinate vector to flux and torque components. - * The Park transform can be used to realize the transformation of the Ialpha and the Ibeta currents - * from the stationary to the moving reference frame and control the spatial relationship between - * the stator vector current and rotor flux vector. - * If we consider the d axis aligned with the rotor flux, the diagram below shows the - * current vector and the relationship from the two reference frames: - * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkFormula.gif - * where Ialpha and Ibeta are the stator vector components, - * pId and pIq are rotor vector components and cosVal and sinVal are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup park - * @{ - */ - - /** - * @brief Floating-point Park transform - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] *pId points to output rotor reference frame d - * @param[out] *pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none. - * - * The function implements the forward Park transform. - * - */ - - static __INLINE void arm_park_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pId, - float32_t * pIq, - float32_t sinVal, - float32_t cosVal) - { - /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ - *pId = Ialpha * cosVal + Ibeta * sinVal; - - /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ - *pIq = -Ialpha * sinVal + Ibeta * cosVal; - - } - - /** - * @brief Park transform for Q31 version - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] *pId points to output rotor reference frame d - * @param[out] *pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition and subtraction, hence there is no risk of overflow. - */ - - - static __INLINE void arm_park_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pId, - q31_t * pIq, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - - /* Intermediate product is calculated by (Ialpha * cosVal) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); - - /* Intermediate product is calculated by (Ibeta * sinVal) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); - - - /* Intermediate product is calculated by (Ialpha * sinVal) */ - product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); - - /* Intermediate product is calculated by (Ibeta * cosVal) */ - product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); - - /* Calculate pId by adding the two intermediate products 1 and 2 */ - *pId = __QADD(product1, product2); - - /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ - *pIq = __QSUB(product4, product3); - } - - /** - * @} end of park group - */ - - /** - * @brief Converts the elements of the Q7 vector to floating-point vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q7_to_float( - q7_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @ingroup groupController - */ - - /** - * @defgroup inv_park Vector Inverse Park transform - * Inverse Park transform converts the input flux and torque components to two-coordinate vector. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkInvFormula.gif - * where pIalpha and pIbeta are the stator vector components, - * Id and Iq are rotor vector components and cosVal and sinVal are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup inv_park - * @{ - */ - - /** - * @brief Floating-point Inverse Park transform - * @param[in] Id input coordinate of rotor reference frame d - * @param[in] Iq input coordinate of rotor reference frame q - * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none. - */ - - static __INLINE void arm_inv_park_f32( - float32_t Id, - float32_t Iq, - float32_t * pIalpha, - float32_t * pIbeta, - float32_t sinVal, - float32_t cosVal) - { - /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ - *pIalpha = Id * cosVal - Iq * sinVal; - - /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ - *pIbeta = Id * sinVal + Iq * cosVal; - - } - - - /** - * @brief Inverse Park transform for Q31 version - * @param[in] Id input coordinate of rotor reference frame d - * @param[in] Iq input coordinate of rotor reference frame q - * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function is implemented using an internal 32-bit accumulator. - * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - * There is saturation on the addition, hence there is no risk of overflow. - */ - - - static __INLINE void arm_inv_park_q31( - q31_t Id, - q31_t Iq, - q31_t * pIalpha, - q31_t * pIbeta, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - - /* Intermediate product is calculated by (Id * cosVal) */ - product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); - - /* Intermediate product is calculated by (Iq * sinVal) */ - product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); - - - /* Intermediate product is calculated by (Id * sinVal) */ - product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); - - /* Intermediate product is calculated by (Iq * cosVal) */ - product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); - - /* Calculate pIalpha by using the two intermediate products 1 and 2 */ - *pIalpha = __QSUB(product1, product2); - - /* Calculate pIbeta by using the two intermediate products 3 and 4 */ - *pIbeta = __QADD(product4, product3); - - } - - /** - * @} end of Inverse park group - */ - - - /** - * @brief Converts the elements of the Q31 vector to floating-point vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q31_to_float( - q31_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @ingroup groupInterpolation - */ - - /** - * @defgroup LinearInterpolate Linear Interpolation - * - * Linear interpolation is a method of curve fitting using linear polynomials. - * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line - * - * \par - * \image html LinearInterp.gif "Linear interpolation" - * - * \par - * A Linear Interpolate function calculates an output value(y), for the input(x) - * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) - * - * \par Algorithm: - *
-   *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
-   *       where x0, x1 are nearest values of input x
-   *             y0, y1 are nearest values to output y
-   * 
- * - * \par - * This set of functions implements Linear interpolation process - * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single - * sample of data and each call to the function returns a single processed value. - * S points to an instance of the Linear Interpolate function data structure. - * x is the input sample value. The functions returns the output value. - * - * \par - * if x is outside of the table boundary, Linear interpolation returns first value of the table - * if x is below input range and returns last value of table if x is above range. - */ - - /** - * @addtogroup LinearInterpolate - * @{ - */ - - /** - * @brief Process function for the floating-point Linear Interpolation Function. - * @param[in,out] *S is an instance of the floating-point Linear Interpolation structure - * @param[in] x input sample to process - * @return y processed output sample. - * - */ - - static __INLINE float32_t arm_linear_interp_f32( - arm_linear_interp_instance_f32 * S, - float32_t x) - { - - float32_t y; - float32_t x0, x1; /* Nearest input values */ - float32_t y0, y1; /* Nearest output values */ - float32_t xSpacing = S->xSpacing; /* spacing between input values */ - int32_t i; /* Index variable */ - float32_t *pYData = S->pYData; /* pointer to output table */ - - /* Calculation of index */ - i = (x - S->x1) / xSpacing; - - if(i < 0) - { - /* Iniatilize output for below specified range as least output value of table */ - y = pYData[0]; - } - else if(i >= S->nValues) - { - /* Iniatilize output for above specified range as last output value of table */ - y = pYData[S->nValues-1]; - } - else - { - /* Calculation of nearest input values */ - x0 = S->x1 + i * xSpacing; - x1 = S->x1 + (i +1) * xSpacing; - - /* Read of nearest output values */ - y0 = pYData[i]; - y1 = pYData[i + 1]; - - /* Calculation of output */ - y = y0 + (x - x0) * ((y1 - y0)/(x1-x0)); - - } - - /* returns output value */ - return (y); - } - - /** - * - * @brief Process function for the Q31 Linear Interpolation Function. - * @param[in] *pYData pointer to Q31 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ - - - static __INLINE q31_t arm_linear_interp_q31(q31_t *pYData, - q31_t x, uint32_t nValues) - { - q31_t y; /* output */ - q31_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & 0xFFF00000) >> 20); - - if(index >= (nValues - 1)) - { - return(pYData[nValues - 1]); - } - else if(index < 0) - { - return(pYData[0]); - } - else - { - - /* 20 bits for the fractional part */ - /* shift left by 11 to keep fract in 1.31 format */ - fract = (x & 0x000FFFFF) << 11; - - /* Read two nearest output values from the index in 1.31(q31) format */ - y0 = pYData[index]; - y1 = pYData[index + 1u]; - - /* Calculation of y0 * (1-fract) and y is in 2.30 format */ - y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); - - /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ - y += ((q31_t) (((q63_t) y1 * fract) >> 32)); - - /* Convert y to 1.31 format */ - return (y << 1u); - - } - - } - - /** - * - * @brief Process function for the Q15 Linear Interpolation Function. - * @param[in] *pYData pointer to Q15 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ - - - static __INLINE q15_t arm_linear_interp_q15(q15_t *pYData, q31_t x, uint32_t nValues) - { - q63_t y; /* output */ - q15_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & 0xFFF00000) >> 20u); - - if(index >= (nValues - 1)) - { - return(pYData[nValues - 1]); - } - else if(index < 0) - { - return(pYData[0]); - } - else - { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y0 = pYData[index]; - y1 = pYData[index + 1u]; - - /* Calculation of y0 * (1-fract) and y is in 13.35 format */ - y = ((q63_t) y0 * (0xFFFFF - fract)); - - /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ - y += ((q63_t) y1 * (fract)); - - /* convert y to 1.15 format */ - return (y >> 20); - } - - - } - - /** - * - * @brief Process function for the Q7 Linear Interpolation Function. - * @param[in] *pYData pointer to Q7 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - */ - - - static __INLINE q7_t arm_linear_interp_q7(q7_t *pYData, q31_t x, uint32_t nValues) - { - q31_t y; /* output */ - q7_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & 0xFFF00000) >> 20u); - - - if(index >= (nValues - 1)) - { - return(pYData[nValues - 1]); - } - else if(index < 0) - { - return(pYData[0]); - } - else - { - - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - - /* Read two nearest output values from the index and are in 1.7(q7) format */ - y0 = pYData[index]; - y1 = pYData[index + 1u]; - - /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ - y = ((y0 * (0xFFFFF - fract))); - - /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ - y += (y1 * fract); - - /* convert y to 1.7(q7) format */ - return (y >> 20u); - - } - - } - /** - * @} end of LinearInterpolate group - */ - - /** - * @brief Fast approximation to the trigonometric sine function for floating-point data. - * @param[in] x input value in radians. - * @return sin(x). - */ - - float32_t arm_sin_f32( - float32_t x); - - /** - * @brief Fast approximation to the trigonometric sine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ - - q31_t arm_sin_q31( - q31_t x); - - /** - * @brief Fast approximation to the trigonometric sine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ - - q15_t arm_sin_q15( - q15_t x); - - /** - * @brief Fast approximation to the trigonometric cosine function for floating-point data. - * @param[in] x input value in radians. - * @return cos(x). - */ - - float32_t arm_cos_f32( - float32_t x); - - /** - * @brief Fast approximation to the trigonometric cosine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ - - q31_t arm_cos_q31( - q31_t x); - - /** - * @brief Fast approximation to the trigonometric cosine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ - - q15_t arm_cos_q15( - q15_t x); - - - /** - * @ingroup groupFastMath - */ - - - /** - * @defgroup SQRT Square Root - * - * Computes the square root of a number. - * There are separate functions for Q15, Q31, and floating-point data types. - * The square root function is computed using the Newton-Raphson algorithm. - * This is an iterative algorithm of the form: - *
-   *      x1 = x0 - f(x0)/f'(x0)
-   * 
- * where x1 is the current estimate, - * x0 is the previous estimate and - * f'(x0) is the derivative of f() evaluated at x0. - * For the square root function, the algorithm reduces to: - *
-   *     x0 = in/2                         [initial guess]
-   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
-   * 
- */ - - - /** - * @addtogroup SQRT - * @{ - */ - - /** - * @brief Floating-point square root function. - * @param[in] in input value. - * @param[out] *pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * in is negative value and returns zero output for negative values. - */ - - static __INLINE arm_status arm_sqrt_f32( - float32_t in, float32_t *pOut) - { - if(in > 0) - { - -// #if __FPU_USED - #if (__FPU_USED == 1) && defined ( __CC_ARM ) - *pOut = __sqrtf(in); - #else - *pOut = sqrtf(in); - #endif - - return (ARM_MATH_SUCCESS); - } - else - { - *pOut = 0.0f; - return (ARM_MATH_ARGUMENT_ERROR); - } - - } - - - /** - * @brief Q31 square root function. - * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF. - * @param[out] *pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * in is negative value and returns zero output for negative values. - */ - arm_status arm_sqrt_q31( - q31_t in, q31_t *pOut); - - /** - * @brief Q15 square root function. - * @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF. - * @param[out] *pOut square root of input value. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * in is negative value and returns zero output for negative values. - */ - arm_status arm_sqrt_q15( - q15_t in, q15_t *pOut); - - /** - * @} end of SQRT group - */ - - - - - - - /** - * @brief floating-point Circular write function. - */ - - static __INLINE void arm_circularWrite_f32( - int32_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const int32_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if(wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = wOffset; - } - - - - /** - * @brief floating-point Circular Read function. - */ - static __INLINE void arm_circularRead_f32( - int32_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - int32_t * dst, - int32_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t rOffset, dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - dst_end = (int32_t) (dst_base + dst_length); - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if(dst == (int32_t *) dst_end) - { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if(rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - /** - * @brief Q15 Circular write function. - */ - - static __INLINE void arm_circularWrite_q15( - q15_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q15_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if(wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = wOffset; - } - - - - /** - * @brief Q15 Circular Read function. - */ - static __INLINE void arm_circularRead_q15( - q15_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q15_t * dst, - q15_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0; - int32_t rOffset, dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - - dst_end = (int32_t) (dst_base + dst_length); - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if(dst == (q15_t *) dst_end) - { - dst = dst_base; - } - - /* Circularly update wOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if(rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Q7 Circular write function. - */ - - static __INLINE void arm_circularWrite_q7( - q7_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q7_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0u; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if(wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = wOffset; - } - - - - /** - * @brief Q7 Circular Read function. - */ - static __INLINE void arm_circularRead_q7( - q7_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q7_t * dst, - q7_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0; - int32_t rOffset, dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - - dst_end = (int32_t) (dst_base + dst_length); - - /* Loop over the blockSize */ - i = blockSize; - - while(i > 0u) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if(dst == (q7_t *) dst_end) - { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if(rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Sum of the squares of the elements of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_power_q31( - q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - /** - * @brief Sum of the squares of the elements of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_power_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Sum of the squares of the elements of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_power_q15( - q15_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - /** - * @brief Sum of the squares of the elements of a Q7 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_power_q7( - q7_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Mean value of a Q7 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_mean_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult); - - /** - * @brief Mean value of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - void arm_mean_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - /** - * @brief Mean value of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - void arm_mean_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Mean value of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - void arm_mean_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Variance of the elements of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_var_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Variance of the elements of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_var_q31( - q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - /** - * @brief Variance of the elements of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_var_q15( - q15_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Root Mean Square of the elements of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_rms_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Root Mean Square of the elements of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_rms_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Root Mean Square of the elements of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_rms_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - /** - * @brief Standard deviation of the elements of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_std_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - /** - * @brief Standard deviation of the elements of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_std_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - /** - * @brief Standard deviation of the elements of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output value. - * @return none. - */ - - void arm_std_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - /** - * @brief Floating-point complex magnitude - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_f32( - float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex magnitude - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_q31( - q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - /** - * @brief Q15 complex magnitude - * @param[in] *pSrc points to the complex input vector - * @param[out] *pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - * @return none. - */ - - void arm_cmplx_mag_q15( - q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - /** - * @brief Q15 complex dot product - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] *realResult real part of the result returned here - * @param[out] *imagResult imaginary part of the result returned here - * @return none. - */ - - void arm_cmplx_dot_prod_q15( - q15_t * pSrcA, - q15_t * pSrcB, - uint32_t numSamples, - q31_t * realResult, - q31_t * imagResult); - - /** - * @brief Q31 complex dot product - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] *realResult real part of the result returned here - * @param[out] *imagResult imaginary part of the result returned here - * @return none. - */ - - void arm_cmplx_dot_prod_q31( - q31_t * pSrcA, - q31_t * pSrcB, - uint32_t numSamples, - q63_t * realResult, - q63_t * imagResult); - - /** - * @brief Floating-point complex dot product - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] *realResult real part of the result returned here - * @param[out] *imagResult imaginary part of the result returned here - * @return none. - */ - - void arm_cmplx_dot_prod_f32( - float32_t * pSrcA, - float32_t * pSrcB, - uint32_t numSamples, - float32_t * realResult, - float32_t * imagResult); - - /** - * @brief Q15 complex-by-real multiplication - * @param[in] *pSrcCmplx points to the complex input vector - * @param[in] *pSrcReal points to the real input vector - * @param[out] *pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - * @return none. - */ - - void arm_cmplx_mult_real_q15( - q15_t * pSrcCmplx, - q15_t * pSrcReal, - q15_t * pCmplxDst, - uint32_t numSamples); - - /** - * @brief Q31 complex-by-real multiplication - * @param[in] *pSrcCmplx points to the complex input vector - * @param[in] *pSrcReal points to the real input vector - * @param[out] *pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - * @return none. - */ - - void arm_cmplx_mult_real_q31( - q31_t * pSrcCmplx, - q31_t * pSrcReal, - q31_t * pCmplxDst, - uint32_t numSamples); - - /** - * @brief Floating-point complex-by-real multiplication - * @param[in] *pSrcCmplx points to the complex input vector - * @param[in] *pSrcReal points to the real input vector - * @param[out] *pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - * @return none. - */ - - void arm_cmplx_mult_real_f32( - float32_t * pSrcCmplx, - float32_t * pSrcReal, - float32_t * pCmplxDst, - uint32_t numSamples); - - /** - * @brief Minimum value of a Q7 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *result is output pointer - * @param[in] index is the array index of the minimum value in the input buffer. - * @return none. - */ - - void arm_min_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * result, - uint32_t * index); - - /** - * @brief Minimum value of a Q15 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output pointer - * @param[in] *pIndex is the array index of the minimum value in the input buffer. - * @return none. - */ - - void arm_min_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - /** - * @brief Minimum value of a Q31 vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output pointer - * @param[out] *pIndex is the array index of the minimum value in the input buffer. - * @return none. - */ - void arm_min_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - /** - * @brief Minimum value of a floating-point vector. - * @param[in] *pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] *pResult is output pointer - * @param[out] *pIndex is the array index of the minimum value in the input buffer. - * @return none. - */ - - void arm_min_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - -/** - * @brief Maximum value of a Q7 vector. - * @param[in] *pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - - void arm_max_q7( - q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex); - -/** - * @brief Maximum value of a Q15 vector. - * @param[in] *pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - - void arm_max_q15( - q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - -/** - * @brief Maximum value of a Q31 vector. - * @param[in] *pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - - void arm_max_q31( - q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - -/** - * @brief Maximum value of a floating-point vector. - * @param[in] *pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] *pResult maximum value returned here - * @param[out] *pIndex index of maximum value returned here - * @return none. - */ - - void arm_max_f32( - float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - /** - * @brief Q15 complex-by-complex multiplication - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_mult_cmplx_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex-by-complex multiplication - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_mult_cmplx_q31( - q31_t * pSrcA, - q31_t * pSrcB, - q31_t * pDst, - uint32_t numSamples); - - /** - * @brief Floating-point complex-by-complex multiplication - * @param[in] *pSrcA points to the first input vector - * @param[in] *pSrcB points to the second input vector - * @param[out] *pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - * @return none. - */ - - void arm_cmplx_mult_cmplx_f32( - float32_t * pSrcA, - float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Converts the elements of the floating-point vector to Q31 vector. - * @param[in] *pSrc points to the floating-point input vector - * @param[out] *pDst points to the Q31 output vector - * @param[in] blockSize length of the input vector - * @return none. - */ - void arm_float_to_q31( - float32_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Converts the elements of the floating-point vector to Q15 vector. - * @param[in] *pSrc points to the floating-point input vector - * @param[out] *pDst points to the Q15 output vector - * @param[in] blockSize length of the input vector - * @return none - */ - void arm_float_to_q15( - float32_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Converts the elements of the floating-point vector to Q7 vector. - * @param[in] *pSrc points to the floating-point input vector - * @param[out] *pDst points to the Q7 output vector - * @param[in] blockSize length of the input vector - * @return none - */ - void arm_float_to_q7( - float32_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q31 vector to Q15 vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q31_to_q15( - q31_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Converts the elements of the Q31 vector to Q7 vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q31_to_q7( - q31_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Converts the elements of the Q15 vector to floating-point vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q15_to_float( - q15_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to Q31 vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q15_to_q31( - q15_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to Q7 vector. - * @param[in] *pSrc is input pointer - * @param[out] *pDst is output pointer - * @param[in] blockSize is the number of samples to process - * @return none. - */ - void arm_q15_to_q7( - q15_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @ingroup groupInterpolation - */ - - /** - * @defgroup BilinearInterpolate Bilinear Interpolation - * - * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. - * The underlying function f(x, y) is sampled on a regular grid and the interpolation process - * determines values between the grid points. - * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. - * Bilinear interpolation is often used in image processing to rescale images. - * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. - * - * Algorithm - * \par - * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. - * For floating-point, the instance structure is defined as: - *
-   *   typedef struct
-   *   {
-   *     uint16_t numRows;
-   *     uint16_t numCols;
-   *     float32_t *pData;
-   * } arm_bilinear_interp_instance_f32;
-   * 
- * - * \par - * where numRows specifies the number of rows in the table; - * numCols specifies the number of columns in the table; - * and pData points to an array of size numRows*numCols values. - * The data table pTable is organized in row order and the supplied data values fall on integer indexes. - * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. - * - * \par - * Let (x, y) specify the desired interpolation point. Then define: - *
-   *     XF = floor(x)
-   *     YF = floor(y)
-   * 
- * \par - * The interpolated output point is computed as: - *
-   *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
-   *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
-   *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
-   *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
-   * 
- * Note that the coordinates (x, y) contain integer and fractional components. - * The integer components specify which portion of the table to use while the - * fractional components control the interpolation processor. - * - * \par - * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. - */ - - /** - * @addtogroup BilinearInterpolate - * @{ - */ - - /** - * - * @brief Floating-point bilinear interpolation. - * @param[in,out] *S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate. - * @param[in] Y interpolation coordinate. - * @return out interpolated value. - */ - - - static __INLINE float32_t arm_bilinear_interp_f32( - const arm_bilinear_interp_instance_f32 * S, - float32_t X, - float32_t Y) - { - float32_t out; - float32_t f00, f01, f10, f11; - float32_t *pData = S->pData; - int32_t xIndex, yIndex, index; - float32_t xdiff, ydiff; - float32_t b1, b2, b3, b4; - - xIndex = (int32_t) X; - yIndex = (int32_t) Y; - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(xIndex < 0 || xIndex > (S->numRows-1) || yIndex < 0 || yIndex > ( S->numCols-1)) - { - return(0); - } - - /* Calculation of index for two nearest points in X-direction */ - index = (xIndex - 1) + (yIndex-1) * S->numCols ; - - - /* Read two nearest points in X-direction */ - f00 = pData[index]; - f01 = pData[index + 1]; - - /* Calculation of index for two nearest points in Y-direction */ - index = (xIndex-1) + (yIndex) * S->numCols; - - - /* Read two nearest points in Y-direction */ - f10 = pData[index]; - f11 = pData[index + 1]; - - /* Calculation of intermediate values */ - b1 = f00; - b2 = f01 - f00; - b3 = f10 - f00; - b4 = f00 - f01 - f10 + f11; - - /* Calculation of fractional part in X */ - xdiff = X - xIndex; - - /* Calculation of fractional part in Y */ - ydiff = Y - yIndex; - - /* Calculation of bi-linear interpolated output */ - out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; - - /* return to application */ - return (out); - - } - - /** - * - * @brief Q31 bilinear interpolation. - * @param[in,out] *S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - - static __INLINE q31_t arm_bilinear_interp_q31( - arm_bilinear_interp_instance_q31 * S, - q31_t X, - q31_t Y) - { - q31_t out; /* Temporary output */ - q31_t acc = 0; /* output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q31_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q31_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & 0xFFF00000) >> 20u); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & 0xFFF00000) >> 20u); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows-1) || cI < 0 || cI > ( S->numCols-1)) - { - return(0); - } - - /* 20 bits for the fractional part */ - /* shift left xfract by 11 to keep 1.31 format */ - xfract = (X & 0x000FFFFF) << 11u; - - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + nCols * (cI)]; - x2 = pYData[(rI) + nCols * (cI) + 1u]; - - /* 20 bits for the fractional part */ - /* shift left yfract by 11 to keep 1.31 format */ - yfract = (Y & 0x000FFFFF) << 11u; - - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + nCols * (cI + 1)]; - y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ - out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); - acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); - - /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); - - /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - - /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - - /* Convert acc to 1.31(q31) format */ - return (acc << 2u); - - } - - /** - * @brief Q15 bilinear interpolation. - * @param[in,out] *S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - - static __INLINE q15_t arm_bilinear_interp_q15( - arm_bilinear_interp_instance_q15 * S, - q31_t X, - q31_t Y) - { - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q15_t x1, x2, y1, y2; /* Nearest output values */ - q31_t xfract, yfract; /* X, Y fractional parts */ - int32_t rI, cI; /* Row and column indices */ - q15_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & 0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & 0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows-1) || cI < 0 || cI > ( S->numCols-1)) - { - return(0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & 0x000FFFFF); - - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + nCols * (cI)]; - x2 = pYData[(rI) + nCols * (cI) + 1u]; - - - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + nCols * (cI + 1)]; - y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ - - /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ - /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ - out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4u); - acc = ((q63_t) out * (0xFFFFF - yfract)); - - /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4u); - acc += ((q63_t) out * (xfract)); - - /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4u); - acc += ((q63_t) out * (yfract)); - - /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y2 * (xfract)) >> 4u); - acc += ((q63_t) out * (yfract)); - - /* acc is in 13.51 format and down shift acc by 36 times */ - /* Convert out to 1.15 format */ - return (acc >> 36); - - } - - /** - * @brief Q7 bilinear interpolation. - * @param[in,out] *S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - - static __INLINE q7_t arm_bilinear_interp_q7( - arm_bilinear_interp_instance_q7 * S, - q31_t X, - q31_t Y) - { - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q7_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q7_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & 0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & 0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if(rI < 0 || rI > (S->numRows-1) || cI < 0 || cI > ( S->numCols-1)) - { - return(0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & 0x000FFFFF); - - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + nCols * (cI)]; - x2 = pYData[(rI) + nCols * (cI) + 1u]; - - - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + nCols * (cI + 1)]; - y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ - out = ((x1 * (0xFFFFF - xfract))); - acc = (((q63_t) out * (0xFFFFF - yfract))); - - /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ - out = ((x2 * (0xFFFFF - yfract))); - acc += (((q63_t) out * (xfract))); - - /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y1 * (0xFFFFF - xfract))); - acc += (((q63_t) out * (yfract))); - - /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y2 * (yfract))); - acc += (((q63_t) out * (xfract))); - - /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ - return (acc >> 40); - - } - - /** - * @} end of BilinearInterpolate group - */ - - - - - - -#ifdef __cplusplus -} -#endif - - -#endif /* _ARM_MATH_H */ - - -/** - * - * End of file. - */ diff --git a/car_hw/src/lib/cmsis/core_cm0.h b/car_hw/src/lib/cmsis/core_cm0.h deleted file mode 100644 index edd522173e1..00000000000 --- a/car_hw/src/lib/cmsis/core_cm0.h +++ /dev/null @@ -1,665 +0,0 @@ -/**************************************************************************//** - * @file core_cm0.h - * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File - * @version V2.10 - * @date 19. July 2011 - * - * @note - * Copyright (C) 2009-2011 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM0_H_GENERIC -#define __CORE_CM0_H_GENERIC - - -/** \mainpage CMSIS Cortex-M0 - - This documentation describes the CMSIS Cortex-M Core Peripheral Access Layer. - It consists of: - - - Cortex-M Core Register Definitions - - Cortex-M functions - - Cortex-M instructions - - The CMSIS Cortex-M0 Core Peripheral Access Layer contains C and assembly functions that ease - access to the Cortex-M Core - */ - -/** \defgroup CMSIS_MISRA_Exceptions CMSIS MISRA-C:2004 Compliance Exceptions - CMSIS violates following MISRA-C2004 Rules: - - - Violates MISRA 2004 Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - - Violates MISRA 2004 Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - - Violates MISRA 2004 Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \defgroup CMSIS_core_definitions CMSIS Core Definitions - This file defines all structures and symbols for CMSIS core: - - CMSIS version number - - Cortex-M core - - Cortex-M core Revision Number - @{ - */ - -/* CMSIS CM0 definitions */ -#define __CM0_CMSIS_VERSION_MAIN (0x02) /*!< [31:16] CMSIS HAL main version */ -#define __CM0_CMSIS_VERSION_SUB (0x10) /*!< [15:0] CMSIS HAL sub version */ -#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | __CM0_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x00) /*!< Cortex core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - -#endif - -/*!< __FPU_USED to be checked prior to making use of FPU specific registers and functions */ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - /* add preprocessor checks */ -#endif - -#include /*!< standard types definitions */ -#include "core_cmInstr.h" /*!< Core Instruction Access */ -#include "core_cmFunc.h" /*!< Core Function Access */ - -#endif /* __CORE_CM0_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0_H_DEPENDANT -#define __CORE_CM0_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0_REV - #define __CM0_REV 0x0000 - #warning "__CM0_REV not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -#ifdef __cplusplus - #define __I volatile /*!< defines 'read only' permissions */ -#else - #define __I volatile const /*!< defines 'read only' permissions */ -#endif -#define __O volatile /*!< defines 'write only' permissions */ -#define __IO volatile /*!< defines 'read / write' permissions */ - -/*@} end of group CMSIS_core_definitions */ - - - -/******************************************************************************* - * Register Abstraction - ******************************************************************************/ -/** \defgroup CMSIS_core_register CMSIS Core Register - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE CMSIS Core - Type definitions for the Cortex-M Core Registers - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC CMSIS NVIC - Type definitions for the Cortex-M NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31]; - __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31]; - __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31]; - __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31]; - uint32_t RESERVED4[64]; - __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB CMSIS SCB - Type definitions for the Cortex-M System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - uint32_t RESERVED0; - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick CMSIS SysTick - Type definitions for the Cortex-M System Timer Registers - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug CMSIS Core Debug - Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP - and not via processor. Therefore they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - @{ - */ - -/* Memory mapping of Cortex-M0 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface CMSIS Core Function Interface - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions CMSIS Core NVIC Functions - @{ - */ - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 ) -#define _SHP_IDX(IRQn) ( ((((uint32_t)(IRQn) & 0x0F)-8) >> 2) ) -#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) ) - - -/** \brief Enable External Interrupt - - This function enables a device specific interrupt in the NVIC interrupt controller. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the external interrupt to enable - */ -static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Disable External Interrupt - - This function disables a device specific interrupt in the NVIC interrupt controller. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the external interrupt to disable - */ -static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Get Pending Interrupt - - This function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Number of the interrupt for get pending - \return 0 Interrupt status is not pending - \return 1 Interrupt status is pending - */ -static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); -} - - -/** \brief Set Pending Interrupt - - This function sets the pending bit for the specified interrupt. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the interrupt for set pending - */ -static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); -} - - -/** \brief Clear Pending Interrupt - - This function clears the pending bit for the specified interrupt. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the interrupt for clear pending - */ -static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Set Interrupt Priority - - This function sets the priority for the specified interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - Note: The priority cannot be set for every core interrupt. - - \param [in] IRQn Number of the interrupt for set priority - \param [in] priority Priority to set - */ -static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } - else { - NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); } -} - - -/** \brief Get Interrupt Priority - - This function reads the priority for the specified interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - The returned priority value is automatically aligned to the implemented - priority bits of the microcontroller. - - \param [in] IRQn Number of the interrupt for get priority - \return Interrupt Priority - */ -static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */ - else { - return((uint32_t)((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief System Reset - - This function initiate a system reset request to reset the MCU. - */ -static __INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions CMSIS Core SysTick Functions - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - This function initialises the system tick timer and its interrupt and start the system tick timer. - Counter is in free running mode to generate periodical interrupts. - - \param [in] ticks Number of ticks between two interrupts - \return 0 Function succeeded - \return 1 Function failed - */ -static __INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#endif /* __CORE_CM0_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/car_hw/src/lib/cmsis/core_cm3.h b/car_hw/src/lib/cmsis/core_cm3.h deleted file mode 100644 index c15e10ae2c5..00000000000 --- a/car_hw/src/lib/cmsis/core_cm3.h +++ /dev/null @@ -1,1236 +0,0 @@ -/**************************************************************************//** - * @file core_cm3.h - * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V2.10 - * @date 19. July 2011 - * - * @note - * Copyright (C) 2009-2011 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM3_H_GENERIC -#define __CORE_CM3_H_GENERIC - - -/** \mainpage CMSIS Cortex-M3 - - This documentation describes the CMSIS Cortex-M Core Peripheral Access Layer. - It consists of: - - - Cortex-M Core Register Definitions - - Cortex-M functions - - Cortex-M instructions - - The CMSIS Cortex-M3 Core Peripheral Access Layer contains C and assembly functions that ease - access to the Cortex-M Core - */ - -/** \defgroup CMSIS_MISRA_Exceptions CMSIS MISRA-C:2004 Compliance Exceptions - CMSIS violates following MISRA-C2004 Rules: - - - Violates MISRA 2004 Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - - Violates MISRA 2004 Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - - Violates MISRA 2004 Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \defgroup CMSIS_core_definitions CMSIS Core Definitions - This file defines all structures and symbols for CMSIS core: - - CMSIS version number - - Cortex-M core - - Cortex-M core Revision Number - @{ - */ - -/* CMSIS CM3 definitions */ -#define __CM3_CMSIS_VERSION_MAIN (0x02) /*!< [31:16] CMSIS HAL main version */ -#define __CM3_CMSIS_VERSION_SUB (0x10) /*!< [15:0] CMSIS HAL sub version */ -#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x03) /*!< Cortex core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - -#endif - -/*!< __FPU_USED to be checked prior to making use of FPU specific registers and functions */ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - /* add preprocessor checks */ -#endif - -#include /*!< standard types definitions */ -#include "core_cmInstr.h" /*!< Core Instruction Access */ -#include "core_cmFunc.h" /*!< Core Function Access */ - -#endif /* __CORE_CM3_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM3_H_DEPENDANT -#define __CORE_CM3_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM3_REV - #define __CM3_REV 0x0200 - #warning "__CM3_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -#ifdef __cplusplus - #define __I volatile /*!< defines 'read only' permissions */ -#else - #define __I volatile const /*!< defines 'read only' permissions */ -#endif -#define __O volatile /*!< defines 'write only' permissions */ -#define __IO volatile /*!< defines 'read / write' permissions */ - -/*@} end of group CMSIS_core_definitions */ - - - -/******************************************************************************* - * Register Abstraction - ******************************************************************************/ -/** \defgroup CMSIS_core_register CMSIS Core Register - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE CMSIS Core - Type definitions for the Cortex-M Core Registers - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC CMSIS NVIC - Type definitions for the Cortex-M NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB CMSIS SCB - Type definitions for the Cortex-M System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB CMSIS System Control and ID Register not in the SCB - Type definitions for the Cortex-M System Control and ID Register not in the SCB - @{ - */ - -/** \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ -#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -#else - uint32_t RESERVED1[1]; -#endif -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick CMSIS SysTick - Type definitions for the Cortex-M System Timer Registers - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM CMSIS ITM - Type definitions for the Cortex-M Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __O union - { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_TXENA_Pos 3 /*!< ITM TCR: TXENA Position */ -#define ITM_TCR_TXENA_Msk (1UL << ITM_TCR_TXENA_Pos) /*!< ITM TCR: TXENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU CMSIS MPU - Type definitions for the Cortex-M Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug CMSIS Core Debug - Type definitions for the Cortex-M Core Debug Registers - @{ - */ - -/** \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - @{ - */ - -/* Memory mapping of Cortex-M3 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface CMSIS Core Function Interface - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions CMSIS Core NVIC Functions - @{ - */ - -/** \brief Set Priority Grouping - - This function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - - \param [in] PriorityGroup Priority grouping field - */ -static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** \brief Get Priority Grouping - - This function gets the priority grouping from NVIC Interrupt Controller. - Priority grouping is SCB->AIRCR [10:8] PRIGROUP field. - - \return Priority grouping field - */ -static __INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ -} - - -/** \brief Enable External Interrupt - - This function enables a device specific interrupt in the NVIC interrupt controller. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the external interrupt to enable - */ -static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ -} - - -/** \brief Disable External Interrupt - - This function disables a device specific interrupt in the NVIC interrupt controller. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the external interrupt to disable - */ -static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ -} - - -/** \brief Get Pending Interrupt - - This function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Number of the interrupt for get pending - \return 0 Interrupt status is not pending - \return 1 Interrupt status is pending - */ -static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ -} - - -/** \brief Set Pending Interrupt - - This function sets the pending bit for the specified interrupt. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the interrupt for set pending - */ -static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ -} - - -/** \brief Clear Pending Interrupt - - This function clears the pending bit for the specified interrupt. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the interrupt for clear pending - */ -static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Get Active Interrupt - - This function reads the active register in NVIC and returns the active bit. - \param [in] IRQn Number of the interrupt for get active - \return 0 Interrupt status is not active - \return 1 Interrupt status is active - */ -static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ -} - - -/** \brief Set Interrupt Priority - - This function sets the priority for the specified interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - Note: The priority cannot be set for every core interrupt. - - \param [in] IRQn Number of the interrupt for set priority - \param [in] priority Priority to set - */ -static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ - else { - NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ -} - - -/** \brief Get Interrupt Priority - - This function reads the priority for the specified interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - The returned priority value is automatically aligned to the implemented - priority bits of the microcontroller. - - \param [in] IRQn Number of the interrupt for get priority - \return Interrupt Priority - */ -static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ - else { - return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief Encode Priority - - This function encodes the priority for an interrupt with the given priority group, - preemptive priority value and sub priority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - - The returned priority value can be used for NVIC_SetPriority(...) function - - \param [in] PriorityGroup Used priority group - \param [in] PreemptPriority Preemptive priority value (starting from 0) - \param [in] SubPriority Sub priority value (starting from 0) - \return Encoded priority for the interrupt - */ -static __INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - return ( - ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | - ((SubPriority & ((1 << (SubPriorityBits )) - 1))) - ); -} - - -/** \brief Decode Priority - - This function decodes an interrupt priority value with the given priority group to - preemptive priority value and sub priority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - - The priority value can be retrieved with NVIC_GetPriority(...) function - - \param [in] Priority Priority value - \param [in] PriorityGroup Used priority group - \param [out] pPreemptPriority Preemptive priority value (starting from 0) - \param [out] pSubPriority Sub priority value (starting from 0) - */ -static __INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); - *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); -} - - -/** \brief System Reset - - This function initiate a system reset request to reset the MCU. - */ -static __INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions CMSIS Core SysTick Functions - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - This function initialises the system tick timer and its interrupt and start the system tick timer. - Counter is in free running mode to generate periodical interrupts. - - \param [in] ticks Number of ticks between two interrupts - \return 0 Function succeeded - \return 1 Function failed - */ -static __INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions CMSIS Core Debug Functions - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< external variable to receive characters */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< value identifying ITM_RxBuffer is ready for next character */ - - -/** \brief ITM Send Character - - This function transmits a character via the ITM channel 0. - It just returns when no debugger is connected that has booked the output. - It is blocking when a debugger is connected, but the previous character send is not transmitted. - - \param [in] ch Character to transmit - \return Character to transmit - */ -static __INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) && /* Trace enabled */ - (ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ - (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0].u32 == 0); - ITM->PORT[0].u8 = (uint8_t) ch; - } - return (ch); -} - - -/** \brief ITM Receive Character - - This function inputs a character via external variable ITM_RxBuffer. - It just returns when no debugger is connected that has booked the output. - It is blocking when a debugger is connected, but the previous character send is not transmitted. - - \return Received character - \return -1 No character received - */ -static __INLINE int32_t ITM_ReceiveChar (void) { - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** \brief ITM Check Character - - This function checks external variable ITM_RxBuffer whether a character is available or not. - It returns '1' if a character is available and '0' if no character is available. - - \return 0 No character available - \return 1 Character available - */ -static __INLINE int32_t ITM_CheckChar (void) { - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - -#endif /* __CORE_CM3_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/car_hw/src/lib/cmsis/core_cm4.h b/car_hw/src/lib/cmsis/core_cm4.h deleted file mode 100644 index 76bf8292a97..00000000000 --- a/car_hw/src/lib/cmsis/core_cm4.h +++ /dev/null @@ -1,1378 +0,0 @@ -/**************************************************************************//** - * @file core_cm4.h - * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File - * @version V2.10 - * @date 19. July 2011 - * - * @note - * Copyright (C) 2009-2011 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM4_H_GENERIC -#define __CORE_CM4_H_GENERIC - - -/** \mainpage CMSIS Cortex-M4 - - This documentation describes the CMSIS Cortex-M Core Peripheral Access Layer. - It consists of: - - - Cortex-M Core Register Definitions - - Cortex-M functions - - Cortex-M instructions - - Cortex-M SIMD instructions - - The CMSIS Cortex-M4 Core Peripheral Access Layer contains C and assembly functions that ease - access to the Cortex-M Core - */ - -/** \defgroup CMSIS_MISRA_Exceptions CMSIS MISRA-C:2004 Compliance Exceptions - CMSIS violates following MISRA-C2004 Rules: - - - Violates MISRA 2004 Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - - Violates MISRA 2004 Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - - Violates MISRA 2004 Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \defgroup CMSIS_core_definitions CMSIS Core Definitions - This file defines all structures and symbols for CMSIS core: - - CMSIS version number - - Cortex-M core - - Cortex-M core Revision Number - @{ - */ - -/* CMSIS CM4 definitions */ -#define __CM4_CMSIS_VERSION_MAIN (0x02) /*!< [31:16] CMSIS HAL main version */ -#define __CM4_CMSIS_VERSION_SUB (0x10) /*!< [15:0] CMSIS HAL sub version */ -#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16) | __CM4_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x04) /*!< Cortex core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - -#endif - -/*!< __FPU_USED to be checked prior to making use of FPU specific registers and functions */ -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 - #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 - #endif - #else - #define __FPU_USED 0 - #endif - -#elif defined ( __TASKING__ ) - /* add preprocessor checks to define __FPU_USED */ - #define __FPU_USED 0 -#endif - -#include /*!< standard types definitions */ -#include /*!< Core Instruction Access */ -#include /*!< Core Function Access */ -#include /*!< Compiler specific SIMD Intrinsics */ - -#endif /* __CORE_CM4_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM4_H_DEPENDANT -#define __CORE_CM4_H_DEPENDANT - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM4_REV - #define __CM4_REV 0x0000 - #warning "__CM4_REV not defined in device header file; using default!" - #endif - - #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0 - #warning "__FPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -#ifdef __cplusplus - #define __I volatile /*!< defines 'read only' permissions */ -#else - #define __I volatile const /*!< defines 'read only' permissions */ -#endif -#define __O volatile /*!< defines 'write only' permissions */ -#define __IO volatile /*!< defines 'read / write' permissions */ - -/*@} end of group CMSIS_core_definitions */ - - - -/******************************************************************************* - * Register Abstraction - ******************************************************************************/ -/** \defgroup CMSIS_core_register CMSIS Core Register - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core Debug Register - - Core MPU Register - - Core FPU Register -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE CMSIS Core - Type definitions for the Cortex-M Core Registers - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ -#else - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ -#endif - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ -#if (__CORTEX_M != 0x04) - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ -#else - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ -#endif - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC CMSIS NVIC - Type definitions for the Cortex-M NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ -} NVIC_Type; - -/* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ -#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB CMSIS SCB - Type definitions for the Cortex-M System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ -#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ -#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ -#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ - -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ -#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ -#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ - -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ -#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ -#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ - -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ -#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ - -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ -#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ - -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ -#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ - -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ -#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ - -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ -#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ - -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ -#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ - -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ -#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ - -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ -#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ - -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ -#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ - -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ -#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ - -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ -#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ - -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ -#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ - -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ -#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ - -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ -#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ - -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ -#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ - -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ -#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ - -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ -#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ - -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ -#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ - -/* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ -#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ - -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ -#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ - -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ -#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ - -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ -#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ - -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ -#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB CMSIS System Control and ID Register not in the SCB - Type definitions for the Cortex-M System Control and ID Register not in the SCB - @{ - */ - -/** \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ -#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISOOFP_Pos 9 /*!< ACTLR: DISOOFP Position */ -#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ - -#define SCnSCB_ACTLR_DISFPCA_Pos 8 /*!< ACTLR: DISFPCA Position */ -#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ - -#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ -#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ - -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ -#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ - -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick CMSIS SysTick - Type definitions for the Cortex-M System Timer Registers - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM CMSIS ITM - Type definitions for the Cortex-M Instrumentation Trace Macrocell (ITM) - @{ - */ - -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). - */ -typedef struct -{ - __O union - { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ -} ITM_Type; - -/* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ - -/* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ -#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ - -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ -#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ - -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ -#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ - -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ -#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ - -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ -#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ - -#define ITM_TCR_TXENA_Pos 3 /*!< ITM TCR: TXENA Position */ -#define ITM_TCR_TXENA_Msk (1UL << ITM_TCR_TXENA_Pos) /*!< ITM TCR: TXENA Mask */ - -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ -#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ - -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ -#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ - -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ -#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ - -/*@}*/ /* end of group CMSIS_ITM */ - - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU CMSIS MPU - Type definitions for the Cortex-M Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -#if (__FPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_FPU CMSIS FPU - Type definitions for the Cortex-M Floating Point Unit (FPU) - @{ - */ - -/** \brief Structure type to access the Floating Point Unit (FPU). - */ -typedef struct -{ - uint32_t RESERVED0[1]; - __IO uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IO uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IO uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __I uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __I uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ -} FPU_Type; - -/* Floating-Point Context Control Register */ -#define FPU_FPCCR_ASPEN_Pos 31 /*!< FPCCR: ASPEN bit Position */ -#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ - -#define FPU_FPCCR_LSPEN_Pos 30 /*!< FPCCR: LSPEN Position */ -#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ - -#define FPU_FPCCR_MONRDY_Pos 8 /*!< FPCCR: MONRDY Position */ -#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ - -#define FPU_FPCCR_BFRDY_Pos 6 /*!< FPCCR: BFRDY Position */ -#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ - -#define FPU_FPCCR_MMRDY_Pos 5 /*!< FPCCR: MMRDY Position */ -#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ - -#define FPU_FPCCR_HFRDY_Pos 4 /*!< FPCCR: HFRDY Position */ -#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ - -#define FPU_FPCCR_THREAD_Pos 3 /*!< FPCCR: processor mode bit Position */ -#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ - -#define FPU_FPCCR_USER_Pos 1 /*!< FPCCR: privilege level bit Position */ -#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ - -#define FPU_FPCCR_LSPACT_Pos 0 /*!< FPCCR: Lazy state preservation active bit Position */ -#define FPU_FPCCR_LSPACT_Msk (1UL << FPU_FPCCR_LSPACT_Pos) /*!< FPCCR: Lazy state preservation active bit Mask */ - -/* Floating-Point Context Address Register */ -#define FPU_FPCAR_ADDRESS_Pos 3 /*!< FPCAR: ADDRESS bit Position */ -#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ - -/* Floating-Point Default Status Control Register */ -#define FPU_FPDSCR_AHP_Pos 26 /*!< FPDSCR: AHP bit Position */ -#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ - -#define FPU_FPDSCR_DN_Pos 25 /*!< FPDSCR: DN bit Position */ -#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ - -#define FPU_FPDSCR_FZ_Pos 24 /*!< FPDSCR: FZ bit Position */ -#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ - -#define FPU_FPDSCR_RMode_Pos 22 /*!< FPDSCR: RMode bit Position */ -#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ - -/* Media and FP Feature Register 0 */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28 /*!< MVFR0: FP rounding modes bits Position */ -#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ - -#define FPU_MVFR0_Short_vectors_Pos 24 /*!< MVFR0: Short vectors bits Position */ -#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ - -#define FPU_MVFR0_Square_root_Pos 20 /*!< MVFR0: Square root bits Position */ -#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ - -#define FPU_MVFR0_Divide_Pos 16 /*!< MVFR0: Divide bits Position */ -#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ - -#define FPU_MVFR0_FP_excep_trapping_Pos 12 /*!< MVFR0: FP exception trapping bits Position */ -#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ - -#define FPU_MVFR0_Double_precision_Pos 8 /*!< MVFR0: Double-precision bits Position */ -#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ - -#define FPU_MVFR0_Single_precision_Pos 4 /*!< MVFR0: Single-precision bits Position */ -#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ - -#define FPU_MVFR0_A_SIMD_registers_Pos 0 /*!< MVFR0: A_SIMD registers bits Position */ -#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL << FPU_MVFR0_A_SIMD_registers_Pos) /*!< MVFR0: A_SIMD registers bits Mask */ - -/* Media and FP Feature Register 1 */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28 /*!< MVFR1: FP fused MAC bits Position */ -#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ - -#define FPU_MVFR1_FP_HPFP_Pos 24 /*!< MVFR1: FP HPFP bits Position */ -#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ - -#define FPU_MVFR1_D_NaN_mode_Pos 4 /*!< MVFR1: D_NaN mode bits Position */ -#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ - -#define FPU_MVFR1_FtZ_mode_Pos 0 /*!< MVFR1: FtZ mode bits Position */ -#define FPU_MVFR1_FtZ_mode_Msk (0xFUL << FPU_MVFR1_FtZ_mode_Pos) /*!< MVFR1: FtZ mode bits Mask */ - -/*@} end of group CMSIS_FPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug CMSIS Core Debug - Type definitions for the Cortex-M Core Debug Registers - @{ - */ - -/** \brief Structure type to access the Core Debug Register (CoreDebug). - */ -typedef struct -{ - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ -} CoreDebug_Type; - -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ -#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ - -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ -#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ - -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ - -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ -#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ - -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ -#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ - -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ -#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ - -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ -#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ - -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ - -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ -#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ - -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ -#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ - -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ -#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ - -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ -#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ - -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ -#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ - -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ -#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ - -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ -#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ - -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ -#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ - -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ -#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ - -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ -#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ - -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ -#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ - -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ -#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ - -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ -#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ - -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ -#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ - -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ -#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ - -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ -#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ - -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ -#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ - -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ -#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ - -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ -#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ - -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - @{ - */ - -/* Memory mapping of Cortex-M4 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -#if (__FPU_PRESENT == 1) - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface CMSIS Core Function Interface - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Debug Functions - - Core Register Access Functions -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions CMSIS Core NVIC Functions - @{ - */ - -/** \brief Set Priority Grouping - - This function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - - \param [in] PriorityGroup Priority grouping field - */ -static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) -{ - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - - -/** \brief Get Priority Grouping - - This function gets the priority grouping from NVIC Interrupt Controller. - Priority grouping is SCB->AIRCR [10:8] PRIGROUP field. - - \return Priority grouping field - */ -static __INLINE uint32_t NVIC_GetPriorityGrouping(void) -{ - return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ -} - - -/** \brief Enable External Interrupt - - This function enables a device specific interrupt in the NVIC interrupt controller. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the external interrupt to enable - */ -static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ -/* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */ - NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */ -} - - -/** \brief Disable External Interrupt - - This function disables a device specific interrupt in the NVIC interrupt controller. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the external interrupt to disable - */ -static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ -} - - -/** \brief Get Pending Interrupt - - This function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Number of the interrupt for get pending - \return 0 Interrupt status is not pending - \return 1 Interrupt status is pending - */ -static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ -} - - -/** \brief Set Pending Interrupt - - This function sets the pending bit for the specified interrupt. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the interrupt for set pending - */ -static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ -} - - -/** \brief Clear Pending Interrupt - - This function clears the pending bit for the specified interrupt. - The interrupt number cannot be a negative value. - - \param [in] IRQn Number of the interrupt for clear pending - */ -static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ -} - - -/** \brief Get Active Interrupt - - This function reads the active register in NVIC and returns the active bit. - \param [in] IRQn Number of the interrupt for get active - \return 0 Interrupt status is not active - \return 1 Interrupt status is active - */ -static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) -{ - return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ -} - - -/** \brief Set Interrupt Priority - - This function sets the priority for the specified interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - Note: The priority cannot be set for every core interrupt. - - \param [in] IRQn Number of the interrupt for set priority - \param [in] priority Priority to set - */ -static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if(IRQn < 0) { - SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ - else { - NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ -} - - -/** \brief Get Interrupt Priority - - This function reads the priority for the specified interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - The returned priority value is automatically aligned to the implemented - priority bits of the microcontroller. - - \param [in] IRQn Number of the interrupt for get priority - \return Interrupt Priority - */ -static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if(IRQn < 0) { - return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ - else { - return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ -} - - -/** \brief Encode Priority - - This function encodes the priority for an interrupt with the given priority group, - preemptive priority value and sub priority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - - The returned priority value can be used for NVIC_SetPriority(...) function - - \param [in] PriorityGroup Used priority group - \param [in] PreemptPriority Preemptive priority value (starting from 0) - \param [in] SubPriority Sub priority value (starting from 0) - \return Encoded priority for the interrupt - */ -static __INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - return ( - ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | - ((SubPriority & ((1 << (SubPriorityBits )) - 1))) - ); -} - - -/** \brief Decode Priority - - This function decodes an interrupt priority value with the given priority group to - preemptive priority value and sub priority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. - - The priority value can be retrieved with NVIC_GetPriority(...) function - - \param [in] Priority Priority value - \param [in] PriorityGroup Used priority group - \param [out] pPreemptPriority Preemptive priority value (starting from 0) - \param [out] pSubPriority Sub priority value (starting from 0) - */ -static __INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) -{ - uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; - - PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; - SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; - - *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); - *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); -} - - -/** \brief System Reset - - This function initiate a system reset request to reset the MCU. - */ -static __INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ - while(1); /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions CMSIS Core SysTick Functions - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - This function initialises the system tick timer and its interrupt and start the system tick timer. - Counter is in free running mode to generate periodical interrupts. - - \param [in] ticks Number of ticks between two interrupts - \return 0 Function succeeded - \return 1 Function failed - */ -static __INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ - - SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ - SysTick->VAL = 0; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - -/* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions CMSIS Core Debug Functions - @{ - */ - -extern volatile int32_t ITM_RxBuffer; /*!< external variable to receive characters */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< value identifying ITM_RxBuffer is ready for next character */ - - -/** \brief ITM Send Character - - This function transmits a character via the ITM channel 0. - It just returns when no debugger is connected that has booked the output. - It is blocking when a debugger is connected, but the previous character send is not transmitted. - - \param [in] ch Character to transmit - \return Character to transmit - */ -static __INLINE uint32_t ITM_SendChar (uint32_t ch) -{ - if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) && /* Trace enabled */ - (ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ - (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0].u32 == 0); - ITM->PORT[0].u8 = (uint8_t) ch; - } - return (ch); -} - - -/** \brief ITM Receive Character - - This function inputs a character via external variable ITM_RxBuffer. - It just returns when no debugger is connected that has booked the output. - It is blocking when a debugger is connected, but the previous character send is not transmitted. - - \return Received character - \return -1 No character received - */ -static __INLINE int32_t ITM_ReceiveChar (void) { - int32_t ch = -1; /* no character available */ - - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } - - return (ch); -} - - -/** \brief ITM Check Character - - This function checks external variable ITM_RxBuffer whether a character is available or not. - It returns '1' if a character is available and '0' if no character is available. - - \return 0 No character available - \return 1 Character available - */ -static __INLINE int32_t ITM_CheckChar (void) { - - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ - } -} - -/*@} end of CMSIS_core_DebugFunctions */ - -#endif /* __CORE_CM4_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ - -#ifdef __cplusplus -} -#endif diff --git a/car_hw/src/lib/cmsis/core_cm4_simd.h b/car_hw/src/lib/cmsis/core_cm4_simd.h deleted file mode 100644 index 479188696b1..00000000000 --- a/car_hw/src/lib/cmsis/core_cm4_simd.h +++ /dev/null @@ -1,701 +0,0 @@ -/**************************************************************************//** - * @file core_cm4_simd.h - * @brief CMSIS Cortex-M4 SIMD Header File - * @version V2.10 - * @date 19. July 2011 - * - * @note - * Copyright (C) 2010-2011 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CORE_CM4_SIMD_H -#define __CORE_CM4_SIMD_H - - -/******************************************************************************* - * Hardware Abstraction Layer - ******************************************************************************/ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -/*------ CM4 SOMD Intrinsics -----------------------------------------------------*/ -#define __SADD8 __sadd8 -#define __QADD8 __qadd8 -#define __SHADD8 __shadd8 -#define __UADD8 __uadd8 -#define __UQADD8 __uqadd8 -#define __UHADD8 __uhadd8 -#define __SSUB8 __ssub8 -#define __QSUB8 __qsub8 -#define __SHSUB8 __shsub8 -#define __USUB8 __usub8 -#define __UQSUB8 __uqsub8 -#define __UHSUB8 __uhsub8 -#define __SADD16 __sadd16 -#define __QADD16 __qadd16 -#define __SHADD16 __shadd16 -#define __UADD16 __uadd16 -#define __UQADD16 __uqadd16 -#define __UHADD16 __uhadd16 -#define __SSUB16 __ssub16 -#define __QSUB16 __qsub16 -#define __SHSUB16 __shsub16 -#define __USUB16 __usub16 -#define __UQSUB16 __uqsub16 -#define __UHSUB16 __uhsub16 -#define __SASX __sasx -#define __QASX __qasx -#define __SHASX __shasx -#define __UASX __uasx -#define __UQASX __uqasx -#define __UHASX __uhasx -#define __SSAX __ssax -#define __QSAX __qsax -#define __SHSAX __shsax -#define __USAX __usax -#define __UQSAX __uqsax -#define __UHSAX __uhsax -#define __USAD8 __usad8 -#define __USADA8 __usada8 -#define __SSAT16 __ssat16 -#define __USAT16 __usat16 -#define __UXTB16 __uxtb16 -#define __UXTAB16 __uxtab16 -#define __SXTB16 __sxtb16 -#define __SXTAB16 __sxtab16 -#define __SMUAD __smuad -#define __SMUADX __smuadx -#define __SMLAD __smlad -#define __SMLADX __smladx -#define __SMLALD __smlald -#define __SMLALDX __smlaldx -#define __SMUSD __smusd -#define __SMUSDX __smusdx -#define __SMLSD __smlsd -#define __SMLSDX __smlsdx -#define __SMLSLD __smlsld -#define __SMLSLDX __smlsldx -#define __SEL __sel -#define __QADD __qadd -#define __QSUB __qsub - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - - -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - - -#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ - -#include - -/*------ CM4 SIMDDSP Intrinsics -----------------------------------------------------*/ -/* intrinsic __SADD8 see intrinsics.h */ -/* intrinsic __QADD8 see intrinsics.h */ -/* intrinsic __SHADD8 see intrinsics.h */ -/* intrinsic __UADD8 see intrinsics.h */ -/* intrinsic __UQADD8 see intrinsics.h */ -/* intrinsic __UHADD8 see intrinsics.h */ -/* intrinsic __SSUB8 see intrinsics.h */ -/* intrinsic __QSUB8 see intrinsics.h */ -/* intrinsic __SHSUB8 see intrinsics.h */ -/* intrinsic __USUB8 see intrinsics.h */ -/* intrinsic __UQSUB8 see intrinsics.h */ -/* intrinsic __UHSUB8 see intrinsics.h */ -/* intrinsic __SADD16 see intrinsics.h */ -/* intrinsic __QADD16 see intrinsics.h */ -/* intrinsic __SHADD16 see intrinsics.h */ -/* intrinsic __UADD16 see intrinsics.h */ -/* intrinsic __UQADD16 see intrinsics.h */ -/* intrinsic __UHADD16 see intrinsics.h */ -/* intrinsic __SSUB16 see intrinsics.h */ -/* intrinsic __QSUB16 see intrinsics.h */ -/* intrinsic __SHSUB16 see intrinsics.h */ -/* intrinsic __USUB16 see intrinsics.h */ -/* intrinsic __UQSUB16 see intrinsics.h */ -/* intrinsic __UHSUB16 see intrinsics.h */ -/* intrinsic __SASX see intrinsics.h */ -/* intrinsic __QASX see intrinsics.h */ -/* intrinsic __SHASX see intrinsics.h */ -/* intrinsic __UASX see intrinsics.h */ -/* intrinsic __UQASX see intrinsics.h */ -/* intrinsic __UHASX see intrinsics.h */ -/* intrinsic __SSAX see intrinsics.h */ -/* intrinsic __QSAX see intrinsics.h */ -/* intrinsic __SHSAX see intrinsics.h */ -/* intrinsic __USAX see intrinsics.h */ -/* intrinsic __UQSAX see intrinsics.h */ -/* intrinsic __UHSAX see intrinsics.h */ -/* intrinsic __USAD8 see intrinsics.h */ -/* intrinsic __USADA8 see intrinsics.h */ -/* intrinsic __SSAT16 see intrinsics.h */ -/* intrinsic __USAT16 see intrinsics.h */ -/* intrinsic __UXTB16 see intrinsics.h */ -/* intrinsic __SXTB16 see intrinsics.h */ -/* intrinsic __UXTAB16 see intrinsics.h */ -/* intrinsic __SXTAB16 see intrinsics.h */ -/* intrinsic __SMUAD see intrinsics.h */ -/* intrinsic __SMUADX see intrinsics.h */ -/* intrinsic __SMLAD see intrinsics.h */ -/* intrinsic __SMLADX see intrinsics.h */ -/* intrinsic __SMLALD see intrinsics.h */ -/* intrinsic __SMLALDX see intrinsics.h */ -/* intrinsic __SMUSD see intrinsics.h */ -/* intrinsic __SMUSDX see intrinsics.h */ -/* intrinsic __SMLSD see intrinsics.h */ -/* intrinsic __SMLSDX see intrinsics.h */ -/* intrinsic __SMLSLD see intrinsics.h */ -/* intrinsic __SMLSLDX see intrinsics.h */ -/* intrinsic __SEL see intrinsics.h */ -/* intrinsic __QADD see intrinsics.h */ -/* intrinsic __QSUB see intrinsics.h */ -/* intrinsic __PKHBT see intrinsics.h */ -/* intrinsic __PKHTB see intrinsics.h */ - -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - - -#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SSAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -#define __USAT16(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SXTB16(uint32_t op1) -{ - uint32_t result; - - __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SMLALD(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ - (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ - }) - -#define __SMLALDX(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ - (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ - }) - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) -{ - uint32_t result; - - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#define __SMLSLD(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ - (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ - }) - -#define __SMLSLDX(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ - (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ - }) - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __QADD(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -__attribute__( ( always_inline ) ) static __INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2) -{ - uint32_t result; - - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); -} - -#define __PKHBT(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -#define __PKHTB(ARG1,ARG2,ARG3) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ - if (ARG3 == 0) \ - __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ - else \ - __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ - __RES; \ - }) - -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - - -#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ -/* TASKING carm specific functions */ - - -/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ -/* not yet supported */ -/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ - - -#endif - -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CORE_CM4_SIMD_H */ - -#ifdef __cplusplus -} -#endif diff --git a/car_hw/src/lib/cmsis/core_cmFunc.h b/car_hw/src/lib/cmsis/core_cmFunc.h deleted file mode 100644 index c999b1c83b0..00000000000 --- a/car_hw/src/lib/cmsis/core_cmFunc.h +++ /dev/null @@ -1,609 +0,0 @@ -/**************************************************************************//** - * @file core_cmFunc.h - * @brief CMSIS Cortex-M Core Function Access Header File - * @version V2.10 - * @date 26. July 2011 - * - * @note - * Copyright (C) 2009-2011 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - -#ifndef __CORE_CMFUNC_H -#define __CORE_CMFUNC_H - - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -#if (__ARMCC_VERSION < 400677) - #error "Please use ARM Compiler Toolchain V4.0.677 or later!" -#endif - -/* intrinsic void __enable_irq(); */ -/* intrinsic void __disable_irq(); */ - -/** \brief Get Control Register - - This function returns the content of the Control Register. - - \return Control Register value - */ -static __INLINE uint32_t __get_CONTROL(void) -{ - register uint32_t __regControl __ASM("control"); - return(__regControl); -} - - -/** \brief Set Control Register - - This function writes the given value to the Control Register. - - \param [in] control Control Register value to set - */ -static __INLINE void __set_CONTROL(uint32_t control) -{ - register uint32_t __regControl __ASM("control"); - __regControl = control; -} - - -/** \brief Get ISPR Register - - This function returns the content of the ISPR Register. - - \return ISPR Register value - */ -static __INLINE uint32_t __get_IPSR(void) -{ - register uint32_t __regIPSR __ASM("ipsr"); - return(__regIPSR); -} - - -/** \brief Get APSR Register - - This function returns the content of the APSR Register. - - \return APSR Register value - */ -static __INLINE uint32_t __get_APSR(void) -{ - register uint32_t __regAPSR __ASM("apsr"); - return(__regAPSR); -} - - -/** \brief Get xPSR Register - - This function returns the content of the xPSR Register. - - \return xPSR Register value - */ -static __INLINE uint32_t __get_xPSR(void) -{ - register uint32_t __regXPSR __ASM("xpsr"); - return(__regXPSR); -} - - -/** \brief Get Process Stack Pointer - - This function returns the current value of the Process Stack Pointer (PSP). - - \return PSP Register value - */ -static __INLINE uint32_t __get_PSP(void) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - return(__regProcessStackPointer); -} - - -/** \brief Set Process Stack Pointer - - This function assigns the given value to the Process Stack Pointer (PSP). - - \param [in] topOfProcStack Process Stack Pointer value to set - */ -static __INLINE void __set_PSP(uint32_t topOfProcStack) -{ - register uint32_t __regProcessStackPointer __ASM("psp"); - __regProcessStackPointer = topOfProcStack; -} - - -/** \brief Get Main Stack Pointer - - This function returns the current value of the Main Stack Pointer (MSP). - - \return MSP Register value - */ -static __INLINE uint32_t __get_MSP(void) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - return(__regMainStackPointer); -} - - -/** \brief Set Main Stack Pointer - - This function assigns the given value to the Main Stack Pointer (MSP). - - \param [in] topOfMainStack Main Stack Pointer value to set - */ -static __INLINE void __set_MSP(uint32_t topOfMainStack) -{ - register uint32_t __regMainStackPointer __ASM("msp"); - __regMainStackPointer = topOfMainStack; -} - - -/** \brief Get Priority Mask - - This function returns the current state of the priority mask bit from the Priority Mask Register. - - \return Priority Mask value - */ -static __INLINE uint32_t __get_PRIMASK(void) -{ - register uint32_t __regPriMask __ASM("primask"); - return(__regPriMask); -} - - -/** \brief Set Priority Mask - - This function assigns the given value to the Priority Mask Register. - - \param [in] priMask Priority Mask - */ -static __INLINE void __set_PRIMASK(uint32_t priMask) -{ - register uint32_t __regPriMask __ASM("primask"); - __regPriMask = (priMask); -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Enable FIQ - - This function enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq - - -/** \brief Disable FIQ - - This function disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq - - -/** \brief Get Base Priority - - This function returns the current value of the Base Priority register. - - \return Base Priority register value - */ -static __INLINE uint32_t __get_BASEPRI(void) -{ - register uint32_t __regBasePri __ASM("basepri"); - return(__regBasePri); -} - - -/** \brief Set Base Priority - - This function assigns the given value to the Base Priority register. - - \param [in] basePri Base Priority value to set - */ -static __INLINE void __set_BASEPRI(uint32_t basePri) -{ - register uint32_t __regBasePri __ASM("basepri"); - __regBasePri = (basePri & 0xff); -} - - -/** \brief Get Fault Mask - - This function returns the current value of the Fault Mask register. - - \return Fault Mask register value - */ -static __INLINE uint32_t __get_FAULTMASK(void) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - return(__regFaultMask); -} - - -/** \brief Set Fault Mask - - This function assigns the given value to the Fault Mask register. - - \param [in] faultMask Fault Mask value to set - */ -static __INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - register uint32_t __regFaultMask __ASM("faultmask"); - __regFaultMask = (faultMask & (uint32_t)1); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - -#if (__CORTEX_M == 0x04) - -/** \brief Get FPSCR - - This function returns the current value of the Floating Point Status/Control register. - - \return Floating Point Status/Control register value - */ -static __INLINE uint32_t __get_FPSCR(void) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - register uint32_t __regfpscr __ASM("fpscr"); - return(__regfpscr); -#else - return(0); -#endif -} - - -/** \brief Set FPSCR - - This function assigns the given value to the Floating Point Status/Control register. - - \param [in] fpscr Floating Point Status/Control value to set - */ -static __INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - register uint32_t __regfpscr __ASM("fpscr"); - __regfpscr = (fpscr); -#endif -} - -#endif /* (__CORTEX_M == 0x04) */ - - -#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ - -#include - -#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -/** \brief Enable IRQ Interrupts - - This function enables IRQ interrupts by clearing the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) static __INLINE void __enable_irq(void) -{ - __ASM volatile ("cpsie i"); -} - - -/** \brief Disable IRQ Interrupts - - This function disables IRQ interrupts by setting the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) static __INLINE void __disable_irq(void) -{ - __ASM volatile ("cpsid i"); -} - - -/** \brief Get Control Register - - This function returns the content of the Control Register. - - \return Control Register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -/** \brief Set Control Register - - This function writes the given value to the Control Register. - - \param [in] control Control Register value to set - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) ); -} - - -/** \brief Get ISPR Register - - This function returns the content of the ISPR Register. - - \return ISPR Register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** \brief Get APSR Register - - This function returns the content of the APSR Register. - - \return APSR Register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** \brief Get xPSR Register - - This function returns the content of the xPSR Register. - - \return xPSR Register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** \brief Get Process Stack Pointer - - This function returns the current value of the Process Stack Pointer (PSP). - - \return PSP Register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); - return(result); -} - - -/** \brief Set Process Stack Pointer - - This function assigns the given value to the Process Stack Pointer (PSP). - - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) ); -} - - -/** \brief Get Main Stack Pointer - - This function returns the current value of the Main Stack Pointer (MSP). - - \return MSP Register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_MSP(void) -{ - register uint32_t result; - - __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); - return(result); -} - - -/** \brief Set Main Stack Pointer - - This function assigns the given value to the Main Stack Pointer (MSP). - - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) ); -} - - -/** \brief Get Priority Mask - - This function returns the current state of the priority mask bit from the Priority Mask Register. - - \return Priority Mask value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -/** \brief Set Priority Mask - - This function assigns the given value to the Priority Mask Register. - - \param [in] priMask Priority Mask - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) ); -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Enable FIQ - - This function enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) static __INLINE void __enable_fault_irq(void) -{ - __ASM volatile ("cpsie f"); -} - - -/** \brief Disable FIQ - - This function disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -__attribute__( ( always_inline ) ) static __INLINE void __disable_fault_irq(void) -{ - __ASM volatile ("cpsid f"); -} - - -/** \brief Get Base Priority - - This function returns the current value of the Base Priority register. - - \return Base Priority register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); - return(result); -} - - -/** \brief Set Base Priority - - This function assigns the given value to the Base Priority register. - - \param [in] basePri Base Priority value to set - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_BASEPRI(uint32_t value) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (value) ); -} - - -/** \brief Get Fault Mask - - This function returns the current value of the Fault Mask register. - - \return Fault Mask register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -/** \brief Set Fault Mask - - This function assigns the given value to the Fault Mask register. - - \param [in] faultMask Fault Mask value to set - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - -#if (__CORTEX_M == 0x04) - -/** \brief Get FPSCR - - This function returns the current value of the Floating Point Status/Control register. - - \return Floating Point Status/Control register value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FPSCR(void) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - uint32_t result; - - __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); - return(result); -#else - return(0); -#endif -} - - -/** \brief Set FPSCR - - This function assigns the given value to the Floating Point Status/Control register. - - \param [in] fpscr Floating Point Status/Control value to set - */ -__attribute__( ( always_inline ) ) static __INLINE void __set_FPSCR(uint32_t fpscr) -{ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) ); -#endif -} - -#endif /* (__CORTEX_M == 0x04) */ - - -#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ -/* TASKING carm specific functions */ - -/* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all instrinsics, - * Including the CMSIS ones. - */ - -#endif - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -#endif /* __CORE_CMFUNC_H */ diff --git a/car_hw/src/lib/cmsis/core_cmInstr.h b/car_hw/src/lib/cmsis/core_cmInstr.h deleted file mode 100644 index ceb4f875686..00000000000 --- a/car_hw/src/lib/cmsis/core_cmInstr.h +++ /dev/null @@ -1,585 +0,0 @@ -/**************************************************************************//** - * @file core_cmInstr.h - * @brief CMSIS Cortex-M Core Instruction Access Header File - * @version V2.10 - * @date 19. July 2011 - * - * @note - * Copyright (C) 2009-2011 ARM Limited. All rights reserved. - * - * @par - * ARM Limited (ARM) is supplying this software for use with Cortex-M - * processor based microcontrollers. This file can be freely distributed - * within development tools that are supporting such ARM based processors. - * - * @par - * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED - * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. - * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR - * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. - * - ******************************************************************************/ - -#ifndef __CORE_CMINSTR_H -#define __CORE_CMINSTR_H - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ -/* ARM armcc specific functions */ - -#if (__ARMCC_VERSION < 400677) - #error "Please use ARM Compiler Toolchain V4.0.677 or later!" -#endif - - -/** \brief No Operation - - No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __nop - - -/** \brief Wait For Interrupt - - Wait For Interrupt is a hint instruction that suspends execution - until one of a number of events occurs. - */ -#define __WFI __wfi - - -/** \brief Wait For Event - - Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -#define __WFE __wfe - - -/** \brief Send Event - - Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __sev - - -/** \brief Instruction Synchronization Barrier - - Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or - memory, after the instruction has been completed. - */ -#define __ISB() __isb(0xF) - - -/** \brief Data Synchronization Barrier - - This function acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __dsb(0xF) - - -/** \brief Data Memory Barrier - - This function ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __dmb(0xF) - - -/** \brief Reverse byte order (32 bit) - - This function reverses the byte order in integer value. - - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV __rev - - -/** \brief Reverse byte order (16 bit) - - This function reverses the byte order in two unsigned short values. - - \param [in] value Value to reverse - \return Reversed value - */ -static __INLINE __ASM uint32_t __REV16(uint32_t value) -{ - rev16 r0, r0 - bx lr -} - - -/** \brief Reverse byte order in signed short value - - This function reverses the byte order in a signed short value with sign extension to integer. - - \param [in] value Value to reverse - \return Reversed value - */ -static __INLINE __ASM int32_t __REVSH(int32_t value) -{ - revsh r0, r0 - bx lr -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Reverse bit order of value - - This function reverses the bit order of the given value. - - \param [in] value Value to reverse - \return Reversed value - */ -#define __RBIT __rbit - - -/** \brief LDR Exclusive (8 bit) - - This function performs a exclusive LDR command for 8 bit value. - - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) - - -/** \brief LDR Exclusive (16 bit) - - This function performs a exclusive LDR command for 16 bit values. - - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) - - -/** \brief LDR Exclusive (32 bit) - - This function performs a exclusive LDR command for 32 bit values. - - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) - - -/** \brief STR Exclusive (8 bit) - - This function performs a exclusive STR command for 8 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXB(value, ptr) __strex(value, ptr) - - -/** \brief STR Exclusive (16 bit) - - This function performs a exclusive STR command for 16 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXH(value, ptr) __strex(value, ptr) - - -/** \brief STR Exclusive (32 bit) - - This function performs a exclusive STR command for 32 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXW(value, ptr) __strex(value, ptr) - - -/** \brief Remove the exclusive lock - - This function removes the exclusive lock which is created by LDREX. - - */ -#define __CLREX __clrex - - -/** \brief Signed Saturate - - This function saturates a signed value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __ssat - - -/** \brief Unsigned Saturate - - This function saturates an unsigned value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __usat - - -/** \brief Count leading zeros - - This function counts the number of leading zeros of a data value. - - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -#define __CLZ __clz - -#endif /* (__CORTEX_M >= 0x03) */ - - - -#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ -/* IAR iccarm specific functions */ - -#include - - -#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ -/* GNU gcc specific functions */ - -/** \brief No Operation - - No Operation does nothing. This instruction can be used for code alignment purposes. - */ -__attribute__( ( always_inline ) ) static __INLINE void __NOP(void) -{ - __ASM volatile ("nop"); -} - - -/** \brief Wait For Interrupt - - Wait For Interrupt is a hint instruction that suspends execution - until one of a number of events occurs. - */ -__attribute__( ( always_inline ) ) static __INLINE void __WFI(void) -{ - __ASM volatile ("wfi"); -} - - -/** \brief Wait For Event - - Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -__attribute__( ( always_inline ) ) static __INLINE void __WFE(void) -{ - __ASM volatile ("wfe"); -} - - -/** \brief Send Event - - Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -__attribute__( ( always_inline ) ) static __INLINE void __SEV(void) -{ - __ASM volatile ("sev"); -} - - -/** \brief Instruction Synchronization Barrier - - Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or - memory, after the instruction has been completed. - */ -__attribute__( ( always_inline ) ) static __INLINE void __ISB(void) -{ - __ASM volatile ("isb"); -} - - -/** \brief Data Synchronization Barrier - - This function acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -__attribute__( ( always_inline ) ) static __INLINE void __DSB(void) -{ - __ASM volatile ("dsb"); -} - - -/** \brief Data Memory Barrier - - This function ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -__attribute__( ( always_inline ) ) static __INLINE void __DMB(void) -{ - __ASM volatile ("dmb"); -} - - -/** \brief Reverse byte order (32 bit) - - This function reverses the byte order in integer value. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -/** \brief Reverse byte order (16 bit) - - This function reverses the byte order in two unsigned short values. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV16(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -/** \brief Reverse byte order in signed short value - - This function reverses the byte order in a signed short value with sign extension to integer. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) static __INLINE int32_t __REVSH(int32_t value) -{ - uint32_t result; - - __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -#if (__CORTEX_M >= 0x03) - -/** \brief Reverse bit order of value - - This function reverses the bit order of the given value. - - \param [in] value Value to reverse - \return Reversed value - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __RBIT(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - - -/** \brief LDR Exclusive (8 bit) - - This function performs a exclusive LDR command for 8 bit value. - - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__attribute__( ( always_inline ) ) static __INLINE uint8_t __LDREXB(volatile uint8_t *addr) -{ - uint8_t result; - - __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); - return(result); -} - - -/** \brief LDR Exclusive (16 bit) - - This function performs a exclusive LDR command for 16 bit values. - - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__attribute__( ( always_inline ) ) static __INLINE uint16_t __LDREXH(volatile uint16_t *addr) -{ - uint16_t result; - - __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); - return(result); -} - - -/** \brief LDR Exclusive (32 bit) - - This function performs a exclusive LDR command for 32 bit values. - - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __LDREXW(volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); - return(result); -} - - -/** \brief STR Exclusive (8 bit) - - This function performs a exclusive STR command for 8 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); - return(result); -} - - -/** \brief STR Exclusive (16 bit) - - This function performs a exclusive STR command for 16 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) -{ - uint32_t result; - - __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); - return(result); -} - - -/** \brief STR Exclusive (32 bit) - - This function performs a exclusive STR command for 32 bit values. - - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) -{ - uint32_t result; - - __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); - return(result); -} - - -/** \brief Remove the exclusive lock - - This function removes the exclusive lock which is created by LDREX. - - */ -__attribute__( ( always_inline ) ) static __INLINE void __CLREX(void) -{ - __ASM volatile ("clrex"); -} - - -/** \brief Signed Saturate - - This function saturates a signed value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** \brief Unsigned Saturate - - This function saturates an unsigned value. - - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT(ARG1,ARG2) \ -({ \ - uint32_t __RES, __ARG1 = (ARG1); \ - __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ - __RES; \ - }) - - -/** \brief Count leading zeros - - This function counts the number of leading zeros of a data value. - - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -__attribute__( ( always_inline ) ) static __INLINE uint8_t __CLZ(uint32_t value) -{ - uint8_t result; - - __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); - return(result); -} - -#endif /* (__CORTEX_M >= 0x03) */ - - - - -#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ -/* TASKING carm specific functions */ - -/* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all intrinsics, - * Including the CMSIS ones. - */ - -#endif - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - -#endif /* __CORE_CMINSTR_H */ diff --git a/car_hw/src/lib/cmsis/startup_stm32f4xx.s b/car_hw/src/lib/cmsis/startup_stm32f4xx.s deleted file mode 100644 index c8d696beb08..00000000000 --- a/car_hw/src/lib/cmsis/startup_stm32f4xx.s +++ /dev/null @@ -1,509 +0,0 @@ -/** - ****************************************************************************** - * @file startup_stm32f4xx.s - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief STM32F4xx Devices vector table for RIDE7 toolchain. - * This module performs: - * - Set the initial SP - * - Set the initial PC == Reset_Handler, - * - Set the vector table entries with the exceptions ISR address - * - Configure the clock system and the external SRAM mounted on - * STM324xG-EVAL board to be used as data memory (optional, - * to be enabled by user) - * - Branches to main in the C library (which eventually - * calls main()). - * After Reset the Cortex-M4 processor is in Thread mode, - * priority is Privileged, and the Stack is set to Main. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - - .syntax unified - .cpu cortex-m3 - .fpu softvfp - .thumb - -.global g_pfnVectors -.global Default_Handler - -/* start address for the initialization values of the .data section. -defined in linker script */ -.word _sidata -/* start address for the .data section. defined in linker script */ -.word _sdata -/* end address for the .data section. defined in linker script */ -.word _edata -/* start address for the .bss section. defined in linker script */ -.word _sbss -/* end address for the .bss section. defined in linker script */ -.word _ebss -/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ - -/** - * @brief This is the code that gets called when the processor first - * starts execution following a reset event. Only the absolutely - * necessary set is performed, after which the application - * supplied main() routine is called. - * @param None - * @retval : None -*/ - - .section .text.Reset_Handler - .weak Reset_Handler - .type Reset_Handler, %function -Reset_Handler: - -/* Copy the data segment initializers from flash to SRAM */ - movs r1, #0 - b LoopCopyDataInit - -CopyDataInit: - ldr r3, =_sidata - ldr r3, [r3, r1] - str r3, [r0, r1] - adds r1, r1, #4 - -LoopCopyDataInit: - ldr r0, =_sdata - ldr r3, =_edata - adds r2, r0, r1 - cmp r2, r3 - bcc CopyDataInit - ldr r2, =_sbss - b LoopFillZerobss -/* Zero fill the bss segment. */ -FillZerobss: - movs r3, #0 - str r3, [r2], #4 - -LoopFillZerobss: - ldr r3, = _ebss - cmp r2, r3 - bcc FillZerobss - -/* Call the clock system intitialization function.*/ - bl SystemInit -/* Call the application's entry point.*/ - bl main - bx lr -.size Reset_Handler, .-Reset_Handler - -/** - * @brief This is the code that gets called when the processor receives an - * unexpected interrupt. This simply enters an infinite loop, preserving - * the system state for examination by a debugger. - * @param None - * @retval None -*/ - .section .text.Default_Handler,"ax",%progbits -Default_Handler: -Infinite_Loop: - b Infinite_Loop - .size Default_Handler, .-Default_Handler -/****************************************************************************** -* -* The minimal vector table for a Cortex M3. Note that the proper constructs -* must be placed on this to ensure that it ends up at physical address -* 0x0000.0000. -* -*******************************************************************************/ - .section .isr_vector,"a",%progbits - .type g_pfnVectors, %object - .size g_pfnVectors, .-g_pfnVectors - - -g_pfnVectors: - .word _estack - .word Reset_Handler - .word NMI_Handler - .word HardFault_Handler - .word MemManage_Handler - .word BusFault_Handler - .word UsageFault_Handler - .word 0 - .word 0 - .word 0 - .word 0 - .word SVC_Handler - .word DebugMon_Handler - .word 0 - .word PendSV_Handler - .word SysTick_Handler - - /* External Interrupts */ - .word WWDG_IRQHandler /* Window WatchDog */ - .word PVD_IRQHandler /* PVD through EXTI Line detection */ - .word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */ - .word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */ - .word FLASH_IRQHandler /* FLASH */ - .word RCC_IRQHandler /* RCC */ - .word EXTI0_IRQHandler /* EXTI Line0 */ - .word EXTI1_IRQHandler /* EXTI Line1 */ - .word EXTI2_IRQHandler /* EXTI Line2 */ - .word EXTI3_IRQHandler /* EXTI Line3 */ - .word EXTI4_IRQHandler /* EXTI Line4 */ - .word DMA1_Stream0_IRQHandler /* DMA1 Stream 0 */ - .word DMA1_Stream1_IRQHandler /* DMA1 Stream 1 */ - .word DMA1_Stream2_IRQHandler /* DMA1 Stream 2 */ - .word DMA1_Stream3_IRQHandler /* DMA1 Stream 3 */ - .word DMA1_Stream4_IRQHandler /* DMA1 Stream 4 */ - .word DMA1_Stream5_IRQHandler /* DMA1 Stream 5 */ - .word DMA1_Stream6_IRQHandler /* DMA1 Stream 6 */ - .word ADC_IRQHandler /* ADC1, ADC2 and ADC3s */ - .word CAN1_TX_IRQHandler /* CAN1 TX */ - .word CAN1_RX0_IRQHandler /* CAN1 RX0 */ - .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ - .word CAN1_SCE_IRQHandler /* CAN1 SCE */ - .word EXTI9_5_IRQHandler /* External Line[9:5]s */ - .word TIM1_BRK_TIM9_IRQHandler /* TIM1 Break and TIM9 */ - .word TIM1_UP_TIM10_IRQHandler /* TIM1 Update and TIM10 */ - .word TIM1_TRG_COM_TIM11_IRQHandler /* TIM1 Trigger and Commutation and TIM11 */ - .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ - .word TIM2_IRQHandler /* TIM2 */ - .word TIM3_IRQHandler /* TIM3 */ - .word TIM4_IRQHandler /* TIM4 */ - .word I2C1_EV_IRQHandler /* I2C1 Event */ - .word I2C1_ER_IRQHandler /* I2C1 Error */ - .word I2C2_EV_IRQHandler /* I2C2 Event */ - .word I2C2_ER_IRQHandler /* I2C2 Error */ - .word SPI1_IRQHandler /* SPI1 */ - .word SPI2_IRQHandler /* SPI2 */ - .word USART1_IRQHandler /* USART1 */ - .word USART2_IRQHandler /* USART2 */ - .word USART3_IRQHandler /* USART3 */ - .word EXTI15_10_IRQHandler /* External Line[15:10]s */ - .word RTC_Alarm_IRQHandler /* RTC Alarm (A and B) through EXTI Line */ - .word OTG_FS_WKUP_IRQHandler /* USB OTG FS Wakeup through EXTI line */ - .word TIM8_BRK_TIM12_IRQHandler /* TIM8 Break and TIM12 */ - .word TIM8_UP_TIM13_IRQHandler /* TIM8 Update and TIM13 */ - .word TIM8_TRG_COM_TIM14_IRQHandler /* TIM8 Trigger and Commutation and TIM14 */ - .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ - .word DMA1_Stream7_IRQHandler /* DMA1 Stream7 */ - .word FSMC_IRQHandler /* FSMC */ - .word SDIO_IRQHandler /* SDIO */ - .word TIM5_IRQHandler /* TIM5 */ - .word SPI3_IRQHandler /* SPI3 */ - .word UART4_IRQHandler /* UART4 */ - .word UART5_IRQHandler /* UART5 */ - .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ - .word TIM7_IRQHandler /* TIM7 */ - .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ - .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ - .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ - .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ - .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ - .word ETH_IRQHandler /* Ethernet */ - .word ETH_WKUP_IRQHandler /* Ethernet Wakeup through EXTI line */ - .word CAN2_TX_IRQHandler /* CAN2 TX */ - .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ - .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ - .word CAN2_SCE_IRQHandler /* CAN2 SCE */ - .word OTG_FS_IRQHandler /* USB OTG FS */ - .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ - .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ - .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ - .word USART6_IRQHandler /* USART6 */ - .word I2C3_EV_IRQHandler /* I2C3 event */ - .word I2C3_ER_IRQHandler /* I2C3 error */ - .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ - .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ - .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ - .word OTG_HS_IRQHandler /* USB OTG HS */ - .word DCMI_IRQHandler /* DCMI */ - .word CRYP_IRQHandler /* CRYP crypto */ - .word HASH_RNG_IRQHandler /* Hash and Rng */ - .word FPU_IRQHandler /* FPU */ - -/******************************************************************************* -* -* Provide weak aliases for each Exception handler to the Default_Handler. -* As they are weak aliases, any function with the same name will override -* this definition. -* -*******************************************************************************/ - .weak NMI_Handler - .thumb_set NMI_Handler,Default_Handler - - .weak HardFault_Handler - .thumb_set HardFault_Handler,Default_Handler - - .weak MemManage_Handler - .thumb_set MemManage_Handler,Default_Handler - - .weak BusFault_Handler - .thumb_set BusFault_Handler,Default_Handler - - .weak UsageFault_Handler - .thumb_set UsageFault_Handler,Default_Handler - - .weak SVC_Handler - .thumb_set SVC_Handler,Default_Handler - - .weak DebugMon_Handler - .thumb_set DebugMon_Handler,Default_Handler - - .weak PendSV_Handler - .thumb_set PendSV_Handler,Default_Handler - - .weak SysTick_Handler - .thumb_set SysTick_Handler,Default_Handler - - .weak WWDG_IRQHandler - .thumb_set WWDG_IRQHandler,Default_Handler - - .weak PVD_IRQHandler - .thumb_set PVD_IRQHandler,Default_Handler - - .weak TAMP_STAMP_IRQHandler - .thumb_set TAMP_STAMP_IRQHandler,Default_Handler - - .weak RTC_WKUP_IRQHandler - .thumb_set RTC_WKUP_IRQHandler,Default_Handler - - .weak FLASH_IRQHandler - .thumb_set FLASH_IRQHandler,Default_Handler - - .weak RCC_IRQHandler - .thumb_set RCC_IRQHandler,Default_Handler - - .weak EXTI0_IRQHandler - .thumb_set EXTI0_IRQHandler,Default_Handler - - .weak EXTI1_IRQHandler - .thumb_set EXTI1_IRQHandler,Default_Handler - - .weak EXTI2_IRQHandler - .thumb_set EXTI2_IRQHandler,Default_Handler - - .weak EXTI3_IRQHandler - .thumb_set EXTI3_IRQHandler,Default_Handler - - .weak EXTI4_IRQHandler - .thumb_set EXTI4_IRQHandler,Default_Handler - - .weak DMA1_Stream0_IRQHandler - .thumb_set DMA1_Stream0_IRQHandler,Default_Handler - - .weak DMA1_Stream1_IRQHandler - .thumb_set DMA1_Stream1_IRQHandler,Default_Handler - - .weak DMA1_Stream2_IRQHandler - .thumb_set DMA1_Stream2_IRQHandler,Default_Handler - - .weak DMA1_Stream3_IRQHandler - .thumb_set DMA1_Stream3_IRQHandler,Default_Handler - - .weak DMA1_Stream4_IRQHandler - .thumb_set DMA1_Stream4_IRQHandler,Default_Handler - - .weak DMA1_Stream5_IRQHandler - .thumb_set DMA1_Stream5_IRQHandler,Default_Handler - - .weak DMA1_Stream6_IRQHandler - .thumb_set DMA1_Stream6_IRQHandler,Default_Handler - - .weak ADC_IRQHandler - .thumb_set ADC_IRQHandler,Default_Handler - - .weak CAN1_TX_IRQHandler - .thumb_set CAN1_TX_IRQHandler,Default_Handler - - .weak CAN1_RX0_IRQHandler - .thumb_set CAN1_RX0_IRQHandler,Default_Handler - - .weak CAN1_RX1_IRQHandler - .thumb_set CAN1_RX1_IRQHandler,Default_Handler - - .weak CAN1_SCE_IRQHandler - .thumb_set CAN1_SCE_IRQHandler,Default_Handler - - .weak EXTI9_5_IRQHandler - .thumb_set EXTI9_5_IRQHandler,Default_Handler - - .weak TIM1_BRK_TIM9_IRQHandler - .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler - - .weak TIM1_UP_TIM10_IRQHandler - .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler - - .weak TIM1_TRG_COM_TIM11_IRQHandler - .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler - - .weak TIM1_CC_IRQHandler - .thumb_set TIM1_CC_IRQHandler,Default_Handler - - .weak TIM2_IRQHandler - .thumb_set TIM2_IRQHandler,Default_Handler - - .weak TIM3_IRQHandler - .thumb_set TIM3_IRQHandler,Default_Handler - - .weak TIM4_IRQHandler - .thumb_set TIM4_IRQHandler,Default_Handler - - .weak I2C1_EV_IRQHandler - .thumb_set I2C1_EV_IRQHandler,Default_Handler - - .weak I2C1_ER_IRQHandler - .thumb_set I2C1_ER_IRQHandler,Default_Handler - - .weak I2C2_EV_IRQHandler - .thumb_set I2C2_EV_IRQHandler,Default_Handler - - .weak I2C2_ER_IRQHandler - .thumb_set I2C2_ER_IRQHandler,Default_Handler - - .weak SPI1_IRQHandler - .thumb_set SPI1_IRQHandler,Default_Handler - - .weak SPI2_IRQHandler - .thumb_set SPI2_IRQHandler,Default_Handler - - .weak USART1_IRQHandler - .thumb_set USART1_IRQHandler,Default_Handler - - .weak USART2_IRQHandler - .thumb_set USART2_IRQHandler,Default_Handler - - .weak USART3_IRQHandler - .thumb_set USART3_IRQHandler,Default_Handler - - .weak EXTI15_10_IRQHandler - .thumb_set EXTI15_10_IRQHandler,Default_Handler - - .weak RTC_Alarm_IRQHandler - .thumb_set RTC_Alarm_IRQHandler,Default_Handler - - .weak OTG_FS_WKUP_IRQHandler - .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler - - .weak TIM8_BRK_TIM12_IRQHandler - .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler - - .weak TIM8_UP_TIM13_IRQHandler - .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler - - .weak TIM8_TRG_COM_TIM14_IRQHandler - .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler - - .weak TIM8_CC_IRQHandler - .thumb_set TIM8_CC_IRQHandler,Default_Handler - - .weak DMA1_Stream7_IRQHandler - .thumb_set DMA1_Stream7_IRQHandler,Default_Handler - - .weak FSMC_IRQHandler - .thumb_set FSMC_IRQHandler,Default_Handler - - .weak SDIO_IRQHandler - .thumb_set SDIO_IRQHandler,Default_Handler - - .weak TIM5_IRQHandler - .thumb_set TIM5_IRQHandler,Default_Handler - - .weak SPI3_IRQHandler - .thumb_set SPI3_IRQHandler,Default_Handler - - .weak UART4_IRQHandler - .thumb_set UART4_IRQHandler,Default_Handler - - .weak UART5_IRQHandler - .thumb_set UART5_IRQHandler,Default_Handler - - .weak TIM6_DAC_IRQHandler - .thumb_set TIM6_DAC_IRQHandler,Default_Handler - - .weak TIM7_IRQHandler - .thumb_set TIM7_IRQHandler,Default_Handler - - .weak DMA2_Stream0_IRQHandler - .thumb_set DMA2_Stream0_IRQHandler,Default_Handler - - .weak DMA2_Stream1_IRQHandler - .thumb_set DMA2_Stream1_IRQHandler,Default_Handler - - .weak DMA2_Stream2_IRQHandler - .thumb_set DMA2_Stream2_IRQHandler,Default_Handler - - .weak DMA2_Stream3_IRQHandler - .thumb_set DMA2_Stream3_IRQHandler,Default_Handler - - .weak DMA2_Stream4_IRQHandler - .thumb_set DMA2_Stream4_IRQHandler,Default_Handler - - .weak ETH_IRQHandler - .thumb_set ETH_IRQHandler,Default_Handler - - .weak ETH_WKUP_IRQHandler - .thumb_set ETH_WKUP_IRQHandler,Default_Handler - - .weak CAN2_TX_IRQHandler - .thumb_set CAN2_TX_IRQHandler,Default_Handler - - .weak CAN2_RX0_IRQHandler - .thumb_set CAN2_RX0_IRQHandler,Default_Handler - - .weak CAN2_RX1_IRQHandler - .thumb_set CAN2_RX1_IRQHandler,Default_Handler - - .weak CAN2_SCE_IRQHandler - .thumb_set CAN2_SCE_IRQHandler,Default_Handler - - .weak OTG_FS_IRQHandler - .thumb_set OTG_FS_IRQHandler,Default_Handler - - .weak DMA2_Stream5_IRQHandler - .thumb_set DMA2_Stream5_IRQHandler,Default_Handler - - .weak DMA2_Stream6_IRQHandler - .thumb_set DMA2_Stream6_IRQHandler,Default_Handler - - .weak DMA2_Stream7_IRQHandler - .thumb_set DMA2_Stream7_IRQHandler,Default_Handler - - .weak USART6_IRQHandler - .thumb_set USART6_IRQHandler,Default_Handler - - .weak I2C3_EV_IRQHandler - .thumb_set I2C3_EV_IRQHandler,Default_Handler - - .weak I2C3_ER_IRQHandler - .thumb_set I2C3_ER_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_OUT_IRQHandler - .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler - - .weak OTG_HS_EP1_IN_IRQHandler - .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler - - .weak OTG_HS_WKUP_IRQHandler - .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler - - .weak OTG_HS_IRQHandler - .thumb_set OTG_HS_IRQHandler,Default_Handler - - .weak DCMI_IRQHandler - .thumb_set DCMI_IRQHandler,Default_Handler - - .weak CRYP_IRQHandler - .thumb_set CRYP_IRQHandler,Default_Handler - - .weak HASH_RNG_IRQHandler - .thumb_set HASH_RNG_IRQHandler,Default_Handler - - .weak FPU_IRQHandler - .thumb_set FPU_IRQHandler,Default_Handler - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/cmsis/stm32f4xx.h b/car_hw/src/lib/cmsis/stm32f4xx.h deleted file mode 100644 index e7b49be29fe..00000000000 --- a/car_hw/src/lib/cmsis/stm32f4xx.h +++ /dev/null @@ -1,7004 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief CMSIS Cortex-M4 Device Peripheral Access Layer Header File. - * This file contains all the peripheral register's definitions, bits - * definitions and memory mapping for STM32F4xx devices. - * - * The file is the unique include file that the application programmer - * is using in the C source code, usually in main.c. This file contains: - * - Configuration section that allows to select: - * - The device used in the target application - * - To use or not the peripheral’s drivers in application code(i.e. - * code will be based on direct access to peripheral’s registers - * rather than drivers API), this option is controlled by - * "#define USE_STDPERIPH_DRIVER" - * - To change few application-specific parameters such as the HSE - * crystal frequency - * - Data structures and the address mapping for all peripherals - * - Peripheral's registers declarations and bits definition - * - Macros to access peripheral’s registers hardware - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx - * @{ - */ - -#ifndef __STM32F4xx_H -#define __STM32F4xx_H - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - -/** @addtogroup Library_configuration_section - * @{ - */ - -/* Uncomment the line below according to the target STM32 device used in your - application - */ - -#if !defined (STM32F4XX) - #define STM32F4XX -#endif - -/* Tip: To avoid modifying this file each time you need to switch between these - devices, you can define the device in your toolchain compiler preprocessor. - */ - -#if !defined (STM32F4XX) - #error "Please select first the target STM32F4XX device used in your application (in stm32f4xx.h file)" -#endif - -#if !defined (USE_STDPERIPH_DRIVER) -/** - * @brief Comment the line below if you will not use the peripherals drivers. - In this case, these drivers will not be included and the application code will - be based on direct access to peripherals registers - */ - /*#define USE_STDPERIPH_DRIVER*/ -#endif /* USE_STDPERIPH_DRIVER */ - -/** - * @brief In the following line adjust the value of External High Speed oscillator (HSE) - used in your application - - Tip: To avoid modifying this file each time you need to use different HSE, you - can define the HSE value in your toolchain compiler preprocessor. - */ - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -/** - * @brief In the following line adjust the External High Speed oscillator (HSE) Startup - Timeout value - */ -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */ -#endif /* HSE_STARTUP_TIMEOUT */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief STM32F4XX Standard Peripherals Library version number V1.0.0 - */ -#define __STM32F4XX_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ -#define __STM32F4XX_STDPERIPH_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ -#define __STM32F4XX_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ -#define __STM32F4XX_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __STM32F4XX_STDPERIPH_VERSION ((__STM32F4XX_STDPERIPH_VERSION_MAIN << 24)\ - |(__STM32F4XX_STDPERIPH_VERSION_SUB1 << 16)\ - |(__STM32F4XX_STDPERIPH_VERSION_SUB2 << 8)\ - |(__STM32F4XX_STDPERIPH_VERSION_RC)) - -/** - * @} - */ - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M4 Processor and Core Peripherals - */ -#define __CM4_REV 0x0001 /*!< Core revision r0p1 */ -#define __MPU_PRESENT 1 /*!< STM32F4XX provides an MPU */ -#define __NVIC_PRIO_BITS 4 /*!< STM32F4XX uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -#if !defined (__FPU_PRESENT) - #define __FPU_PRESENT 1 /*!< FPU present */ -#endif /* __FPU_PRESENT */ - - - -/** - * @brief STM32F4XX Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum IRQn -{ -/****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ -/****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ - DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ - DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ - DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ - DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ - DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ - DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ - ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ - CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ - CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ - TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ - TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ - TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ - DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ - FSMC_IRQn = 48, /*!< FSMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ - TIM7_IRQn = 55, /*!< TIM7 global interrupt */ - DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ - DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ - DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ - DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ - DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ - ETH_IRQn = 61, /*!< Ethernet global Interrupt */ - ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ - CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ - CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ - CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ - CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ - OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ - DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ - DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ - DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ - USART6_IRQn = 71, /*!< USART6 global interrupt */ - I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ - I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ - OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ - OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ - OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ - OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ - DCMI_IRQn = 78, /*!< DCMI global interrupt */ - CRYP_IRQn = 79, /*!< CRYP crypto global interrupt */ - HASH_RNG_IRQn = 80, /*!< Hash and Rng global interrupt */ - FPU_IRQn = 81 /*!< FPU global interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ -#include "system_stm32f4xx.h" -#include - -/** @addtogroup Exported_types - * @{ - */ -/*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ -typedef int32_t s32; -typedef int16_t s16; -typedef int8_t s8; - -typedef const int32_t sc32; /*!< Read Only */ -typedef const int16_t sc16; /*!< Read Only */ -typedef const int8_t sc8; /*!< Read Only */ - -typedef __IO int32_t vs32; -typedef __IO int16_t vs16; -typedef __IO int8_t vs8; - -typedef __I int32_t vsc32; /*!< Read Only */ -typedef __I int16_t vsc16; /*!< Read Only */ -typedef __I int8_t vsc8; /*!< Read Only */ - -typedef uint32_t u32; -typedef uint16_t u16; -typedef uint8_t u8; - -typedef const uint32_t uc32; /*!< Read Only */ -typedef const uint16_t uc16; /*!< Read Only */ -typedef const uint8_t uc8; /*!< Read Only */ - -typedef __IO uint32_t vu32; -typedef __IO uint16_t vu16; -typedef __IO uint8_t vu8; - -typedef __I uint32_t vuc32; /*!< Read Only */ -typedef __I uint16_t vuc16; /*!< Read Only */ -typedef __I uint8_t vuc8; /*!< Read Only */ - -typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; - -typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; -#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) - -typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; - -/** - * @} - */ - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ - __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ - __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ - __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ - __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ - __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ -} ADC_Common_TypeDef; - - -/** - * @brief Controller Area Network TxMailBox - */ - -typedef struct -{ - __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ - __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ - __IO uint32_t TDLR; /*!< CAN mailbox data low register */ - __IO uint32_t TDHR; /*!< CAN mailbox data high register */ -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ - -typedef struct -{ - __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ - -typedef struct -{ - __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ - __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ - -typedef struct -{ - __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ - __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ - __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ - __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ - __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ - __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ - __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ - __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ - uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ - CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ - uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ - __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ - __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ - uint32_t RESERVED2; /*!< Reserved, 0x208 */ - __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ - uint32_t RESERVED3; /*!< Reserved, 0x210 */ - __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ - uint32_t RESERVED4; /*!< Reserved, 0x218 */ - __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ - uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ - CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ -} CAN_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ - __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ - __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ - __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ - __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ - __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -}DBGMCU_TypeDef; - -/** - * @brief DCMI - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ - __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ - __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ - __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ - __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ - __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ - __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ - __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ - __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ - __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ - __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ -} DCMI_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA stream x configuration register */ - __IO uint32_t NDTR; /*!< DMA stream x number of data register */ - __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ - __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ - __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ - __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ -} DMA_Stream_TypeDef; - -typedef struct -{ - __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ - __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ - __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ - __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ -} DMA_TypeDef; - -/** - * @brief Ethernet MAC - */ - -typedef struct -{ - __IO uint32_t MACCR; - __IO uint32_t MACFFR; - __IO uint32_t MACHTHR; - __IO uint32_t MACHTLR; - __IO uint32_t MACMIIAR; - __IO uint32_t MACMIIDR; - __IO uint32_t MACFCR; - __IO uint32_t MACVLANTR; /* 8 */ - uint32_t RESERVED0[2]; - __IO uint32_t MACRWUFFR; /* 11 */ - __IO uint32_t MACPMTCSR; - uint32_t RESERVED1[2]; - __IO uint32_t MACSR; /* 15 */ - __IO uint32_t MACIMR; - __IO uint32_t MACA0HR; - __IO uint32_t MACA0LR; - __IO uint32_t MACA1HR; - __IO uint32_t MACA1LR; - __IO uint32_t MACA2HR; - __IO uint32_t MACA2LR; - __IO uint32_t MACA3HR; - __IO uint32_t MACA3LR; /* 24 */ - uint32_t RESERVED2[40]; - __IO uint32_t MMCCR; /* 65 */ - __IO uint32_t MMCRIR; - __IO uint32_t MMCTIR; - __IO uint32_t MMCRIMR; - __IO uint32_t MMCTIMR; /* 69 */ - uint32_t RESERVED3[14]; - __IO uint32_t MMCTGFSCCR; /* 84 */ - __IO uint32_t MMCTGFMSCCR; - uint32_t RESERVED4[5]; - __IO uint32_t MMCTGFCR; - uint32_t RESERVED5[10]; - __IO uint32_t MMCRFCECR; - __IO uint32_t MMCRFAECR; - uint32_t RESERVED6[10]; - __IO uint32_t MMCRGUFCR; - uint32_t RESERVED7[334]; - __IO uint32_t PTPTSCR; - __IO uint32_t PTPSSIR; - __IO uint32_t PTPTSHR; - __IO uint32_t PTPTSLR; - __IO uint32_t PTPTSHUR; - __IO uint32_t PTPTSLUR; - __IO uint32_t PTPTSAR; - __IO uint32_t PTPTTHR; - __IO uint32_t PTPTTLR; - __IO uint32_t RESERVED8; - __IO uint32_t PTPTSSR; - uint32_t RESERVED9[565]; - __IO uint32_t DMABMR; - __IO uint32_t DMATPDR; - __IO uint32_t DMARPDR; - __IO uint32_t DMARDLAR; - __IO uint32_t DMATDLAR; - __IO uint32_t DMASR; - __IO uint32_t DMAOMR; - __IO uint32_t DMAIER; - __IO uint32_t DMAMFBOCR; - __IO uint32_t DMARSWTR; - uint32_t RESERVED10[8]; - __IO uint32_t DMACHTDR; - __IO uint32_t DMACHRDR; - __IO uint32_t DMACHTBAR; - __IO uint32_t DMACHRBAR; -} ETH_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ -} FLASH_TypeDef; - -/** - * @brief Flexible Static Memory Controller - */ - -typedef struct -{ - __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ -} FSMC_Bank1_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank1E - */ - -typedef struct -{ - __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ -} FSMC_Bank1E_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank2 - */ - -typedef struct -{ - __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ - __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ - __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ - __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ - uint32_t RESERVED0; /*!< Reserved, 0x70 */ - __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ -} FSMC_Bank2_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank3 - */ - -typedef struct -{ - __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ - __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ - __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ - __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ - uint32_t RESERVED0; /*!< Reserved, 0x90 */ - __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ -} FSMC_Bank3_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank4 - */ - -typedef struct -{ - __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ - __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ - __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ - __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ - __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ -} FSMC_Bank4_TypeDef; - -/** - * @brief General Purpose I/O - */ - -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __IO uint16_t BSRRL; /*!< GPIO port bit set/reset low register, Address offset: 0x18 */ - __IO uint16_t BSRRH; /*!< GPIO port bit set/reset high register, Address offset: 0x1A */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ -} GPIO_TypeDef; - -/** - * @brief System configuration controller - */ - -typedef struct -{ - __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ - __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ - uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ - __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint16_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t DR; /*!< I2C Data register, Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ - __IO uint16_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ - uint16_t RESERVED7; /*!< Reserved, 0x1E */ - __IO uint16_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ - uint16_t RESERVED8; /*!< Reserved, 0x22 */ -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ -} IWDG_TypeDef; - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32_t RESERVED0; /*!< Reserved, 0x1C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32_t RESERVED2; /*!< Reserved, 0x3C */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32_t RESERVED4; /*!< Reserved, 0x5C */ - __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ - __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ - __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ - __IO uint32_t CALR; /*!< RTC calibration register, Address offset: 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - __IO uint32_t ALRMASSR;/*!< RTC alarm A sub second register, Address offset: 0x44 */ - __IO uint32_t ALRMBSSR;/*!< RTC alarm B sub second register, Address offset: 0x48 */ - uint32_t RESERVED7; /*!< Reserved, 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ - __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ - __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ - __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ - __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ - __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ - __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ - __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ - __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ - __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ - __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ - __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ - __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ - __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ - __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ - __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ -} RTC_TypeDef; - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ - __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ - __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ - __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ - __I uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ - __I uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ - __I uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ - __I uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ - __I uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ - __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ - __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ - __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ - __I uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ - __I uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ - __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ - __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ - uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ - __I uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ - uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ - __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint16_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t SR; /*!< SPI status register, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t DR; /*!< SPI data register, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ - __IO uint16_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - uint16_t RESERVED7; /*!< Reserved, 0x1E */ - __IO uint16_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ - uint16_t RESERVED8; /*!< Reserved, 0x22 */ -} SPI_TypeDef; - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint16_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t SR; /*!< TIM status register, Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ - __IO uint16_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - uint16_t RESERVED7; /*!< Reserved, 0x1E */ - __IO uint16_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - uint16_t RESERVED8; /*!< Reserved, 0x22 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint16_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ - uint16_t RESERVED9; /*!< Reserved, 0x2A */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint16_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - uint16_t RESERVED10; /*!< Reserved, 0x32 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint16_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - uint16_t RESERVED11; /*!< Reserved, 0x46 */ - __IO uint16_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - uint16_t RESERVED12; /*!< Reserved, 0x4A */ - __IO uint16_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ - uint16_t RESERVED13; /*!< Reserved, 0x4E */ - __IO uint16_t OR; /*!< TIM option register, Address offset: 0x50 */ - uint16_t RESERVED14; /*!< Reserved, 0x52 */ -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint16_t SR; /*!< USART Status register, Address offset: 0x00 */ - uint16_t RESERVED0; /*!< Reserved, 0x02 */ - __IO uint16_t DR; /*!< USART Data register, Address offset: 0x04 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint16_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ - uint16_t RESERVED2; /*!< Reserved, 0x0A */ - __IO uint16_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ - uint16_t RESERVED3; /*!< Reserved, 0x0E */ - __IO uint16_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ - uint16_t RESERVED4; /*!< Reserved, 0x12 */ - __IO uint16_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ - uint16_t RESERVED5; /*!< Reserved, 0x16 */ - __IO uint16_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ - uint16_t RESERVED6; /*!< Reserved, 0x1A */ -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; - -/** - * @brief Crypto Processor - */ - -typedef struct -{ - __IO uint32_t CR; /*!< CRYP control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< CRYP status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< CRYP data input register, Address offset: 0x08 */ - __IO uint32_t DOUT; /*!< CRYP data output register, Address offset: 0x0C */ - __IO uint32_t DMACR; /*!< CRYP DMA control register, Address offset: 0x10 */ - __IO uint32_t IMSCR; /*!< CRYP interrupt mask set/clear register, Address offset: 0x14 */ - __IO uint32_t RISR; /*!< CRYP raw interrupt status register, Address offset: 0x18 */ - __IO uint32_t MISR; /*!< CRYP masked interrupt status register, Address offset: 0x1C */ - __IO uint32_t K0LR; /*!< CRYP key left register 0, Address offset: 0x20 */ - __IO uint32_t K0RR; /*!< CRYP key right register 0, Address offset: 0x24 */ - __IO uint32_t K1LR; /*!< CRYP key left register 1, Address offset: 0x28 */ - __IO uint32_t K1RR; /*!< CRYP key right register 1, Address offset: 0x2C */ - __IO uint32_t K2LR; /*!< CRYP key left register 2, Address offset: 0x30 */ - __IO uint32_t K2RR; /*!< CRYP key right register 2, Address offset: 0x34 */ - __IO uint32_t K3LR; /*!< CRYP key left register 3, Address offset: 0x38 */ - __IO uint32_t K3RR; /*!< CRYP key right register 3, Address offset: 0x3C */ - __IO uint32_t IV0LR; /*!< CRYP initialization vector left-word register 0, Address offset: 0x40 */ - __IO uint32_t IV0RR; /*!< CRYP initialization vector right-word register 0, Address offset: 0x44 */ - __IO uint32_t IV1LR; /*!< CRYP initialization vector left-word register 1, Address offset: 0x48 */ - __IO uint32_t IV1RR; /*!< CRYP initialization vector right-word register 1, Address offset: 0x4C */ -} CRYP_TypeDef; - -/** - * @brief HASH - */ - -typedef struct -{ - __IO uint32_t CR; /*!< HASH control register, Address offset: 0x00 */ - __IO uint32_t DIN; /*!< HASH data input register, Address offset: 0x04 */ - __IO uint32_t STR; /*!< HASH start register, Address offset: 0x08 */ - __IO uint32_t HR[5]; /*!< HASH digest registers, Address offset: 0x0C-0x1C */ - __IO uint32_t IMR; /*!< HASH interrupt enable register, Address offset: 0x20 */ - __IO uint32_t SR; /*!< HASH status register, Address offset: 0x24 */ - uint32_t RESERVED[52]; /*!< Reserved, 0x28-0xF4 */ - __IO uint32_t CSR[51]; /*!< HASH context swap registers, Address offset: 0x0F8-0x1C0 */ -} HASH_TypeDef; - -/** - * @brief HASH - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ -} RNG_TypeDef; - -/** - * @} - */ - -/** @addtogroup Peripheral_memory_map - * @{ - */ -#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH(up to 1 MB) base address in the alias region */ -#define CCMDATARAM_BASE ((uint32_t)0x10000000) /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */ -#define SRAM1_BASE ((uint32_t)0x20000000) /*!< SRAM1(112 KB) base address in the alias region */ -#define SRAM2_BASE ((uint32_t)0x2001C000) /*!< SRAM2(16 KB) base address in the alias region */ -#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ -#define BKPSRAM_BASE ((uint32_t)0x40024000) /*!< Backup SRAM(4 KB) base address in the alias region */ -#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ - -#define CCMDATARAM_BB_BASE ((uint32_t)0x12000000) /*!< CCM(core coupled memory) data RAM(64 KB) base address in the bit-band region */ -#define SRAM1_BB_BASE ((uint32_t)0x22000000) /*!< SRAM1(112 KB) base address in the bit-band region */ -#define SRAM2_BB_BASE ((uint32_t)0x2201C000) /*!< SRAM2(16 KB) base address in the bit-band region */ -#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ -#define BKPSRAM_BB_BASE ((uint32_t)0x42024000) /*!< Backup SRAM(4 KB) base address in the bit-band region */ - -/* Legacy defines */ -#define SRAM_BASE SRAM1_BASE -#define SRAM_BB_BASE SRAM1_BB_BASE - - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) -#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000) - -/*!< APB1 peripherals */ -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) -#define TIM12_BASE (APB1PERIPH_BASE + 0x1800) -#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00) -#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) -#define I2S2ext_BASE (APB1PERIPH_BASE + 0x3400) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) -#define I2S3ext_BASE (APB1PERIPH_BASE + 0x4000) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800) -#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) -#define UART5_BASE (APB1PERIPH_BASE + 0x5000) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) -#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00) -#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) -#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400) - -/*!< APB2 peripherals */ -#define TIM1_BASE (APB2PERIPH_BASE + 0x0000) -#define TIM8_BASE (APB2PERIPH_BASE + 0x0400) -#define USART1_BASE (APB2PERIPH_BASE + 0x1000) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2000) -#define ADC2_BASE (APB2PERIPH_BASE + 0x2100) -#define ADC3_BASE (APB2PERIPH_BASE + 0x2200) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300) -#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800) -#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4000) -#define TIM10_BASE (APB2PERIPH_BASE + 0x4400) -#define TIM11_BASE (APB2PERIPH_BASE + 0x4800) - -/*!< AHB1 peripherals */ -#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000) -#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400) -#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) -#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00) -#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000) -#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400) -#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800) -#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00) -#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000) -#define CRC_BASE (AHB1PERIPH_BASE + 0x3000) -#define RCC_BASE (AHB1PERIPH_BASE + 0x3800) -#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00) -#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000) -#define DMA1_Stream0_BASE (DMA1_BASE + 0x010) -#define DMA1_Stream1_BASE (DMA1_BASE + 0x028) -#define DMA1_Stream2_BASE (DMA1_BASE + 0x040) -#define DMA1_Stream3_BASE (DMA1_BASE + 0x058) -#define DMA1_Stream4_BASE (DMA1_BASE + 0x070) -#define DMA1_Stream5_BASE (DMA1_BASE + 0x088) -#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0) -#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8) -#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400) -#define DMA2_Stream0_BASE (DMA2_BASE + 0x010) -#define DMA2_Stream1_BASE (DMA2_BASE + 0x028) -#define DMA2_Stream2_BASE (DMA2_BASE + 0x040) -#define DMA2_Stream3_BASE (DMA2_BASE + 0x058) -#define DMA2_Stream4_BASE (DMA2_BASE + 0x070) -#define DMA2_Stream5_BASE (DMA2_BASE + 0x088) -#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0) -#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8) -#define ETH_BASE (AHB1PERIPH_BASE + 0x8000) -#define ETH_MAC_BASE (ETH_BASE) -#define ETH_MMC_BASE (ETH_BASE + 0x0100) -#define ETH_PTP_BASE (ETH_BASE + 0x0700) -#define ETH_DMA_BASE (ETH_BASE + 0x1000) - -/*!< AHB2 peripherals */ -#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000) -#define CRYP_BASE (AHB2PERIPH_BASE + 0x60000) -#define HASH_BASE (AHB2PERIPH_BASE + 0x60400) -#define RNG_BASE (AHB2PERIPH_BASE + 0x60800) - -/*!< FSMC Bankx registers base address */ -#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) -#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) -#define FSMC_Bank2_R_BASE (FSMC_R_BASE + 0x0060) -#define FSMC_Bank3_R_BASE (FSMC_R_BASE + 0x0080) -#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) - -/* Debug MCU registers base address */ -#define DBGMCU_BASE ((uint32_t )0xE0042000) - -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define TIM12 ((TIM_TypeDef *) TIM12_BASE) -#define TIM13 ((TIM_TypeDef *) TIM13_BASE) -#define TIM14 ((TIM_TypeDef *) TIM14_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define I2S2ext ((SPI_TypeDef *) I2S2ext_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define I2S3ext ((SPI_TypeDef *) I2S3ext_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define UART4 ((USART_TypeDef *) UART4_BASE) -#define UART5 ((USART_TypeDef *) UART5_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define I2C3 ((I2C_TypeDef *) I2C3_BASE) -#define CAN1 ((CAN_TypeDef *) CAN1_BASE) -#define CAN2 ((CAN_TypeDef *) CAN2_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define TIM8 ((TIM_TypeDef *) TIM8_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC2 ((ADC_TypeDef *) ADC2_BASE) -#define ADC3 ((ADC_TypeDef *) ADC3_BASE) -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) -#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) -#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) -#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) -#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) -#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) -#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) -#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) -#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) -#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) -#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) -#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) -#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) -#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) -#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) -#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) -#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) -#define ETH ((ETH_TypeDef *) ETH_BASE) -#define DCMI ((DCMI_TypeDef *) DCMI_BASE) -#define CRYP ((CRYP_TypeDef *) CRYP_BASE) -#define HASH ((HASH_TypeDef *) HASH_BASE) -#define RNG ((RNG_TypeDef *) RNG_BASE) -#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) -#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) -#define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE) -#define FSMC_Bank3 ((FSMC_Bank3_TypeDef *) FSMC_Bank3_R_BASE) -#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ -/******************** Bit definition for ADC_SR register ********************/ -#define ADC_SR_AWD ((uint8_t)0x01) /*!
© COPYRIGHT 2011 STMicroelectronics
- ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx_system - * @{ - */ - -/** @addtogroup STM32F4xx_System_Private_Includes - * @{ - */ - -#include "stm32f4xx.h" - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ -/*!< Uncomment the following line if you need to use external SRAM mounted - on STM324xG_EVAL board as data memory */ -/* #define DATA_IN_ExtSRAM */ - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -/******************************************************************************/ - -/************************* PLL Parameters *************************************/ -/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ -#define PLL_M 8 -#define PLL_N 336 - -/* SYSCLK = PLL_VCO / PLL_P */ -#define PLL_P 2 - -/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ -#define PLL_Q 7 - -/* PLLI2S_VCO = (HSE_VALUE Or HSI_VALUE / PLL_M) * PLLI2S_N - I2SCLK = PLLI2S_VCO / PLLI2S_R */ -#define START_I2SCLOCK 0 -#define PLLI2S_N 352 -#define PLLI2S_R 2 - -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Variables - * @{ - */ - -uint32_t SystemCoreClock = 168000000; - -__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes - * @{ - */ - -static void SetSysClock(void); -#ifdef DATA_IN_ExtSRAM -static void SystemInit_ExtMemCtl(void); -#endif /* DATA_IN_ExtSRAM */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemFrequency variable. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ -#endif - /* Reset the RCC clock configuration to the default reset state ------------*/ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset CFGR register */ - RCC->CFGR = 0x00000000; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset PLLCFGR register */ - RCC->PLLCFGR = 0x24003010; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; - -#ifdef DATA_IN_ExtSRAM - SystemInit_ExtMemCtl(); -#endif /* DATA_IN_ExtSRAM */ - - /* Configure the System clock source, PLL Multiplier and Divider factors, - AHB/APBx prescalers and Flash settings ----------------------------------*/ - SetSysClock(); - - /* Configure the Vector Table location add offset address ------------------*/ -#ifdef VECT_TAB_SRAM - SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f4xx.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f4xx.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @brief Configures the System clock source, PLL Multiplier and Divider factors, - * AHB/APBx prescalers and Flash settings - * @Note This function should be called only once the RCC clock configuration - * is reset to the default reset state (done in SystemInit() function). - * @param None - * @retval None - */ -static void SetSysClock(void) -{ - /******************************************************************************/ - /* PLL (clocked by HSE) used as System clock source */ - /******************************************************************************/ - __IO uint32_t StartUpCounter = 0, HSEStatus = 0; - - /* Enable HSE */ - RCC->CR |= ((uint32_t)RCC_CR_HSEON); - - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - HSEStatus = RCC->CR & RCC_CR_HSERDY; - StartUpCounter++; - } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); - - if ((RCC->CR & RCC_CR_HSERDY) != RESET) - { - HSEStatus = (uint32_t)0x01; - } - else - { - HSEStatus = (uint32_t)0x00; - } - - if (HSEStatus == (uint32_t)0x01) - { - /* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */ - RCC->APB1ENR |= RCC_APB1ENR_PWREN; - PWR->CR |= PWR_CR_VOS; - - /* HCLK = SYSCLK / 1*/ - RCC->CFGR |= RCC_CFGR_HPRE_DIV1; - - /* PCLK2 = HCLK / 2*/ - RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; - - /* PCLK1 = HCLK / 4*/ - RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; - - /* Configure the main PLL */ - RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) | - (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); - - /* Enable the main PLL */ - RCC->CR |= RCC_CR_PLLON; - - /* Wait till the main PLL is ready */ - while((RCC->CR & RCC_CR_PLLRDY) == 0) - { - } - - /* Configure Flash prefetch, Instruction cache, Data cache and wait state */ - FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; - - /* Select the main PLL as system clock source */ - RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); - RCC->CFGR |= RCC_CFGR_SW_PLL; - - /* Wait till the main PLL is used as system clock source */ - while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); - { - } - } - else - { /* If HSE fails to start-up, the application will have wrong clock - configuration. User can add here some code to deal with this error */ - } - - - /******************************************************************************/ - /* I2S clock configuration */ - /******************************************************************************/ - -#if START_I2SCLOCK - /* PLLI2S clock used as I2S clock source */ - RCC->CFGR &= ~RCC_CFGR_I2SSRC; - - /* Configure PLLI2S */ - RCC->PLLI2SCFGR = (PLLI2S_N << 6) | (PLLI2S_R << 28); - - /* Enable PLLI2S */ - RCC->CR |= ((uint32_t)RCC_CR_PLLI2SON); - - /* Wait till PLLI2S is ready */ - while((RCC->CR & RCC_CR_PLLI2SRDY) == 0) - { - } -#endif -} - -/** - * @brief Setup the external memory controller. Called in startup_stm32f4xx.s - * before jump to __main - * @param None - * @retval None - */ -#ifdef DATA_IN_ExtSRAM -/** - * @brief Setup the external memory controller. - * Called in startup_stm32f4xx.s before jump to main. - * This function configures the external SRAM mounted on STM324xG_EVAL board - * This SRAM will be used as program data memory (including heap and stack). - * @param None - * @retval None - */ -void SystemInit_ExtMemCtl(void) -{ - /*-- GPIOs Configuration -----------------------------------------------------*/ - /* - +-------------------+--------------------+------------------+------------------+ - + SRAM pins assignment + - +-------------------+--------------------+------------------+------------------+ - | PD0 <-> FSMC_D2 | PE0 <-> FSMC_NBL0 | PF0 <-> FSMC_A0 | PG0 <-> FSMC_A10 | - | PD1 <-> FSMC_D3 | PE1 <-> FSMC_NBL1 | PF1 <-> FSMC_A1 | PG1 <-> FSMC_A11 | - | PD4 <-> FSMC_NOE | PE3 <-> FSMC_A19 | PF2 <-> FSMC_A2 | PG2 <-> FSMC_A12 | - | PD5 <-> FSMC_NWE | PE4 <-> FSMC_A20 | PF3 <-> FSMC_A3 | PG3 <-> FSMC_A13 | - | PD8 <-> FSMC_D13 | PE7 <-> FSMC_D4 | PF4 <-> FSMC_A4 | PG4 <-> FSMC_A14 | - | PD9 <-> FSMC_D14 | PE8 <-> FSMC_D5 | PF5 <-> FSMC_A5 | PG5 <-> FSMC_A15 | - | PD10 <-> FSMC_D15 | PE9 <-> FSMC_D6 | PF12 <-> FSMC_A6 | PG9 <-> FSMC_NE2 | - | PD11 <-> FSMC_A16 | PE10 <-> FSMC_D7 | PF13 <-> FSMC_A7 |------------------+ - | PD12 <-> FSMC_A17 | PE11 <-> FSMC_D8 | PF14 <-> FSMC_A8 | - | PD13 <-> FSMC_A18 | PE12 <-> FSMC_D9 | PF15 <-> FSMC_A9 | - | PD14 <-> FSMC_D0 | PE13 <-> FSMC_D10 |------------------+ - | PD15 <-> FSMC_D1 | PE14 <-> FSMC_D11 | - | | PE15 <-> FSMC_D12 | - +-------------------+--------------------+ - */ - /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ - RCC->AHB1ENR = 0x00000078; - - /* Connect PDx pins to FSMC Alternate function */ - GPIOD->AFR[0] = 0x00cc00cc; - GPIOD->AFR[1] = 0xcc0ccccc; - /* Configure PDx pins in Alternate function mode */ - GPIOD->MODER = 0xaaaa0a0a; - /* Configure PDx pins speed to 100 MHz */ - GPIOD->OSPEEDR = 0xffff0f0f; - /* Configure PDx pins Output type to push-pull */ - GPIOD->OTYPER = 0x00000000; - /* No pull-up, pull-down for PDx pins */ - GPIOD->PUPDR = 0x00000000; - - /* Connect PEx pins to FSMC Alternate function */ - GPIOE->AFR[0] = 0xc00cc0cc; - GPIOE->AFR[1] = 0xcccccccc; - /* Configure PEx pins in Alternate function mode */ - GPIOE->MODER = 0xaaaa828a; - /* Configure PEx pins speed to 100 MHz */ - GPIOE->OSPEEDR = 0xffffc3cf; - /* Configure PEx pins Output type to push-pull */ - GPIOE->OTYPER = 0x00000000; - /* No pull-up, pull-down for PEx pins */ - GPIOE->PUPDR = 0x00000000; - - /* Connect PFx pins to FSMC Alternate function */ - GPIOF->AFR[0] = 0x00cccccc; - GPIOF->AFR[1] = 0xcccc0000; - /* Configure PFx pins in Alternate function mode */ - GPIOF->MODER = 0xaa000aaa; - /* Configure PFx pins speed to 100 MHz */ - GPIOF->OSPEEDR = 0xff000fff; - /* Configure PFx pins Output type to push-pull */ - GPIOF->OTYPER = 0x00000000; - /* No pull-up, pull-down for PFx pins */ - GPIOF->PUPDR = 0x00000000; - - /* Connect PGx pins to FSMC Alternate function */ - GPIOG->AFR[0] = 0x00cccccc; - GPIOG->AFR[1] = 0x000000c0; - /* Configure PGx pins in Alternate function mode */ - GPIOG->MODER = 0x00080aaa; - /* Configure PGx pins speed to 100 MHz */ - GPIOG->OSPEEDR = 0x000c0fff; - /* Configure PGx pins Output type to push-pull */ - GPIOG->OTYPER = 0x00000000; - /* No pull-up, pull-down for PGx pins */ - GPIOG->PUPDR = 0x00000000; - - /*-- FSMC Configuration ------------------------------------------------------*/ - /* Enable the FSMC interface clock */ - RCC->AHB3ENR = 0x00000001; - - /* Configure and enable Bank1_SRAM2 */ - FSMC_Bank1->BTCR[2] = 0x00001015; - FSMC_Bank1->BTCR[3] = 0x00010603; - FSMC_Bank1E->BWTR[2] = 0x0fffffff; - /* - Bank1_SRAM2 is configured as follow: - - p.FSMC_AddressSetupTime = 3; - p.FSMC_AddressHoldTime = 0; - p.FSMC_DataSetupTime = 6; - p.FSMC_BusTurnAroundDuration = 1; - p.FSMC_CLKDivision = 0; - p.FSMC_DataLatency = 0; - p.FSMC_AccessMode = FSMC_AccessMode_A; - - FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2; - FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; - FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM; - FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; - FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; - FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; - FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; - FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; - FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; - FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; - FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; - FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; - */ -} -#endif /* DATA_IN_ExtSRAM */ - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/cmsis/system_stm32f4xx.h b/car_hw/src/lib/cmsis/system_stm32f4xx.h deleted file mode 100644 index 7b298509efc..00000000000 --- a/car_hw/src/lib/cmsis/system_stm32f4xx.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - ****************************************************************************** - * @file system_stm32f4xx.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief CMSIS Cortex-M4 Device System Source File for STM32F4xx devices. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f4xx_system - * @{ - */ - -/** - * @brief Define to prevent recursive inclusion - */ -#ifndef __SYSTEM_STM32F4XX_H -#define __SYSTEM_STM32F4XX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** @addtogroup STM32F4xx_System_Includes - * @{ - */ - -/** - * @} - */ - - -/** @addtogroup STM32F4xx_System_Exported_types - * @{ - */ - -extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ - - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Exported_Constants - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F4xx_System_Exported_Functions - * @{ - */ - -extern void SystemInit(void); -extern void SystemCoreClockUpdate(void); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__SYSTEM_STM32F4XX_H */ - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/Makefile b/car_hw/src/lib/stdperiph/Makefile deleted file mode 100644 index f2bc295dcc7..00000000000 --- a/car_hw/src/lib/stdperiph/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -LIB_STDPERIPH_OBJ_PREFIX=libstdperiph_ - -$(LIB_STDPERIPH_OBJ): \ - $(call dircs_to_prefxd_objs,$(LIB_STDPERIPH_DIR),$(LIB_STDPERIPH_OBJ_PREFIX)) - $(LD_ALL_DEPS) - -$(BIN_DIR)/$(LIB_STDPERIPH_OBJ_PREFIX)%.o: $(LIB_STDPERIPH_DIR)/%.c \ - $(call dirhs,$(LIB_STDPERIPH_DIR)) - $(CC_ALL_DEPS) diff --git a/car_hw/src/lib/stdperiph/misc.c b/car_hw/src/lib/stdperiph/misc.c deleted file mode 100644 index b22514040b2..00000000000 --- a/car_hw/src/lib/stdperiph/misc.c +++ /dev/null @@ -1,244 +0,0 @@ -/** - ****************************************************************************** - * @file misc.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides all the miscellaneous firmware functions (add-on - * to CMSIS functions). - * - * @verbatim - * - * =================================================================== - * How to configure Interrupts using driver - * =================================================================== - * - * This section provide functions allowing to configure the NVIC interrupts (IRQ). - * The Cortex-M4 exceptions are managed by CMSIS functions. - * - * 1. Configure the NVIC Priority Grouping using NVIC_PriorityGroupConfig() - * function according to the following table. - - * The table below gives the allowed values of the pre-emption priority and subpriority according - * to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function - * ========================================================================================================================== - * NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description - * ========================================================================================================================== - * NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for pre-emption priority - * | | | 4 bits for subpriority - * -------------------------------------------------------------------------------------------------------------------------- - * NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for pre-emption priority - * | | | 3 bits for subpriority - * -------------------------------------------------------------------------------------------------------------------------- - * NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for pre-emption priority - * | | | 2 bits for subpriority - * -------------------------------------------------------------------------------------------------------------------------- - * NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for pre-emption priority - * | | | 1 bits for subpriority - * -------------------------------------------------------------------------------------------------------------------------- - * NVIC_PriorityGroup_4 | 0-15 | 0 | 4 bits for pre-emption priority - * | | | 0 bits for subpriority - * ========================================================================================================================== - * - * 2. Enable and Configure the priority of the selected IRQ Channels using NVIC_Init() - * - * @note When the NVIC_PriorityGroup_0 is selected, IRQ pre-emption is no more possible. - * The pending IRQ priority will be managed only by the subpriority. - * - * @note IRQ priority order (sorted by highest to lowest priority): - * - Lowest pre-emption priority - * - Lowest subpriority - * - Lowest hardware priority (IRQ number) - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "misc.h" -#include "stm32f4xx_conf.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup MISC - * @brief MISC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup MISC_Private_Functions - * @{ - */ - -/** - * @brief Configures the priority grouping: pre-emption priority and subpriority. - * @param NVIC_PriorityGroup: specifies the priority grouping bits length. - * This parameter can be one of the following values: - * @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority - * 4 bits for subpriority - * @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority - * 3 bits for subpriority - * @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority - * 2 bits for subpriority - * @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority - * 1 bits for subpriority - * @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority - * 0 bits for subpriority - * @note When the NVIC_PriorityGroup_0 is selected, IRQ pre-emption is no more possible. - * The pending IRQ priority will be managed only by the subpriority. - * @retval None - */ -void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) -{ - /* Check the parameters */ - assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup)); - - /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */ - SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup; -} - -/** - * @brief Initializes the NVIC peripheral according to the specified - * parameters in the NVIC_InitStruct. - * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() - * function should be called before. - * @param NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure that contains - * the configuration information for the specified NVIC peripheral. - * @retval None - */ -void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) -{ - uint8_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd)); - assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority)); - assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority)); - - if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) - { - /* Compute the Corresponding IRQ Priority --------------------------------*/ - tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08; - tmppre = (0x4 - tmppriority); - tmpsub = tmpsub >> tmppriority; - - tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre; - tmppriority |= (uint8_t)(NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub); - - tmppriority = tmppriority << 0x04; - - NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority; - - /* Enable the Selected IRQ Channels --------------------------------------*/ - NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = - (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); - } - else - { - /* Disable the Selected IRQ Channels -------------------------------------*/ - NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = - (uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); - } -} - -/** - * @brief Sets the vector table location and Offset. - * @param NVIC_VectTab: specifies if the vector table is in RAM or FLASH memory. - * This parameter can be one of the following values: - * @arg NVIC_VectTab_RAM: Vector Table in internal SRAM. - * @arg NVIC_VectTab_FLASH: Vector Table in internal FLASH. - * @param Offset: Vector Table base offset field. This value must be a multiple of 0x200. - * @retval None - */ -void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) -{ - /* Check the parameters */ - assert_param(IS_NVIC_VECTTAB(NVIC_VectTab)); - assert_param(IS_NVIC_OFFSET(Offset)); - - SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80); -} - -/** - * @brief Selects the condition for the system to enter low power mode. - * @param LowPowerMode: Specifies the new mode for the system to enter low power mode. - * This parameter can be one of the following values: - * @arg NVIC_LP_SEVONPEND: Low Power SEV on Pend. - * @arg NVIC_LP_SLEEPDEEP: Low Power DEEPSLEEP request. - * @arg NVIC_LP_SLEEPONEXIT: Low Power Sleep on Exit. - * @param NewState: new state of LP condition. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_NVIC_LP(LowPowerMode)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - SCB->SCR |= LowPowerMode; - } - else - { - SCB->SCR &= (uint32_t)(~(uint32_t)LowPowerMode); - } -} - -/** - * @brief Configures the SysTick clock source. - * @param SysTick_CLKSource: specifies the SysTick clock source. - * This parameter can be one of the following values: - * @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source. - * @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source. - * @retval None - */ -void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) -{ - /* Check the parameters */ - assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); - if (SysTick_CLKSource == SysTick_CLKSource_HCLK) - { - SysTick->CTRL |= SysTick_CLKSource_HCLK; - } - else - { - SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/misc.h b/car_hw/src/lib/stdperiph/misc.h deleted file mode 100644 index 7a203eeb680..00000000000 --- a/car_hw/src/lib/stdperiph/misc.h +++ /dev/null @@ -1,172 +0,0 @@ -/** - ****************************************************************************** - * @file misc.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the miscellaneous - * firmware library functions (add-on to CMSIS functions). - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MISC_H -#define __MISC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup MISC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief NVIC Init Structure definition - */ - -typedef struct -{ - uint8_t NVIC_IRQChannel; /*!< Specifies the IRQ channel to be enabled or disabled. - This parameter can be an enumerator of @ref IRQn_Type - enumeration (For the complete STM32 Devices IRQ Channels - list, please refer to stm32f4xx.h file) */ - - uint8_t NVIC_IRQChannelPreemptionPriority; /*!< Specifies the pre-emption priority for the IRQ channel - specified in NVIC_IRQChannel. This parameter can be a value - between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table - A lower priority value indicates a higher priority */ - - uint8_t NVIC_IRQChannelSubPriority; /*!< Specifies the subpriority level for the IRQ channel specified - in NVIC_IRQChannel. This parameter can be a value - between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table - A lower priority value indicates a higher priority */ - - FunctionalState NVIC_IRQChannelCmd; /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel - will be enabled or disabled. - This parameter can be set either to ENABLE or DISABLE */ -} NVIC_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup MISC_Exported_Constants - * @{ - */ - -/** @defgroup MISC_Vector_Table_Base - * @{ - */ - -#define NVIC_VectTab_RAM ((uint32_t)0x20000000) -#define NVIC_VectTab_FLASH ((uint32_t)0x08000000) -#define IS_NVIC_VECTTAB(VECTTAB) (((VECTTAB) == NVIC_VectTab_RAM) || \ - ((VECTTAB) == NVIC_VectTab_FLASH)) -/** - * @} - */ - -/** @defgroup MISC_System_Low_Power - * @{ - */ - -#define NVIC_LP_SEVONPEND ((uint8_t)0x10) -#define NVIC_LP_SLEEPDEEP ((uint8_t)0x04) -#define NVIC_LP_SLEEPONEXIT ((uint8_t)0x02) -#define IS_NVIC_LP(LP) (((LP) == NVIC_LP_SEVONPEND) || \ - ((LP) == NVIC_LP_SLEEPDEEP) || \ - ((LP) == NVIC_LP_SLEEPONEXIT)) -/** - * @} - */ - -/** @defgroup MISC_Preemption_Priority_Group - * @{ - */ - -#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority - 4 bits for subpriority */ -#define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority - 3 bits for subpriority */ -#define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority - 2 bits for subpriority */ -#define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority - 1 bits for subpriority */ -#define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority - 0 bits for subpriority */ - -#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || \ - ((GROUP) == NVIC_PriorityGroup_1) || \ - ((GROUP) == NVIC_PriorityGroup_2) || \ - ((GROUP) == NVIC_PriorityGroup_3) || \ - ((GROUP) == NVIC_PriorityGroup_4)) - -#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY) ((PRIORITY) < 0x10) - -#define IS_NVIC_SUB_PRIORITY(PRIORITY) ((PRIORITY) < 0x10) - -#define IS_NVIC_OFFSET(OFFSET) ((OFFSET) < 0x000FFFFF) - -/** - * @} - */ - -/** @defgroup MISC_SysTick_clock_source - * @{ - */ - -#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB) -#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004) -#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \ - ((SOURCE) == SysTick_CLKSource_HCLK_Div8)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); -void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); -void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset); -void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState); -void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource); - -#ifdef __cplusplus -} -#endif - -#endif /* __MISC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_adc.c b/car_hw/src/lib/stdperiph/stm32f4xx_adc.c deleted file mode 100644 index ed8783c039b..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_adc.c +++ /dev/null @@ -1,1743 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_adc.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Analog to Digital Convertor (ADC) peripheral: - * - Initialization and Configuration (in addition to ADC multi mode - * selection) - * - Analog Watchdog configuration - * - Temperature Sensor & Vrefint (Voltage Reference internal) & VBAT - * management - * - Regular Channels Configuration - * - Regular Channels DMA Configuration - * - Injected channels Configuration - * - Interrupts and flags management - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - - * 1. Enable the ADC interface clock using - * RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADCx, ENABLE); - * - * 2. ADC pins configuration - * - Enable the clock for the ADC GPIOs using the following function: - * RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); - * - Configure these ADC pins in analog mode using GPIO_Init(); - * - * 3. Configure the ADC Prescaler, conversion resolution and data - * alignment using the ADC_Init() function. - * 4. Activate the ADC peripheral using ADC_Cmd() function. - * - * Regular channels group configuration - * ==================================== - * - To configure the ADC regular channels group features, use - * ADC_Init() and ADC_RegularChannelConfig() functions. - * - To activate the continuous mode, use the ADC_continuousModeCmd() - * function. - * - To configurate and activate the Discontinuous mode, use the - * ADC_DiscModeChannelCountConfig() and ADC_DiscModeCmd() functions. - * - To read the ADC converted values, use the ADC_GetConversionValue() - * function. - * - * Multi mode ADCs Regular channels configuration - * =============================================== - * - Refer to "Regular channels group configuration" description to - * configure the ADC1, ADC2 and ADC3 regular channels. - * - Select the Multi mode ADC regular channels features (dual or - * triple mode) using ADC_CommonInit() function and configure - * the DMA mode using ADC_MultiModeDMARequestAfterLastTransferCmd() - * functions. - * - Read the ADCs converted values using the - * ADC_GetMultiModeConversionValue() function. - * - * DMA for Regular channels group features configuration - * ====================================================== - * - To enable the DMA mode for regular channels group, use the - * ADC_DMACmd() function. - * - To enable the generation of DMA requests continuously at the end - * of the last DMA transfer, use the ADC_DMARequestAfterLastTransferCmd() - * function. - * - * Injected channels group configuration - * ===================================== - * - To configure the ADC Injected channels group features, use - * ADC_InjectedChannelConfig() and ADC_InjectedSequencerLengthConfig() - * functions. - * - To activate the continuous mode, use the ADC_continuousModeCmd() - * function. - * - To activate the Injected Discontinuous mode, use the - * ADC_InjectedDiscModeCmd() function. - * - To activate the AutoInjected mode, use the ADC_AutoInjectedConvCmd() - * function. - * - To read the ADC converted values, use the ADC_GetInjectedConversionValue() - * function. - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_adc.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup ADC - * @brief ADC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* ADC DISCNUM mask */ -#define CR1_DISCNUM_RESET ((uint32_t)0xFFFF1FFF) - -/* ADC AWDCH mask */ -#define CR1_AWDCH_RESET ((uint32_t)0xFFFFFFE0) - -/* ADC Analog watchdog enable mode mask */ -#define CR1_AWDMode_RESET ((uint32_t)0xFF3FFDFF) - -/* CR1 register Mask */ -#define CR1_CLEAR_MASK ((uint32_t)0xFCFFFEFF) - -/* ADC EXTEN mask */ -#define CR2_EXTEN_RESET ((uint32_t)0xCFFFFFFF) - -/* ADC JEXTEN mask */ -#define CR2_JEXTEN_RESET ((uint32_t)0xFFCFFFFF) - -/* ADC JEXTSEL mask */ -#define CR2_JEXTSEL_RESET ((uint32_t)0xFFF0FFFF) - -/* CR2 register Mask */ -#define CR2_CLEAR_MASK ((uint32_t)0xC0FFF7FD) - -/* ADC SQx mask */ -#define SQR3_SQ_SET ((uint32_t)0x0000001F) -#define SQR2_SQ_SET ((uint32_t)0x0000001F) -#define SQR1_SQ_SET ((uint32_t)0x0000001F) - -/* ADC L Mask */ -#define SQR1_L_RESET ((uint32_t)0xFF0FFFFF) - -/* ADC JSQx mask */ -#define JSQR_JSQ_SET ((uint32_t)0x0000001F) - -/* ADC JL mask */ -#define JSQR_JL_SET ((uint32_t)0x00300000) -#define JSQR_JL_RESET ((uint32_t)0xFFCFFFFF) - -/* ADC SMPx mask */ -#define SMPR1_SMP_SET ((uint32_t)0x00000007) -#define SMPR2_SMP_SET ((uint32_t)0x00000007) - -/* ADC JDRx registers offset */ -#define JDR_OFFSET ((uint8_t)0x28) - -/* ADC CDR register base address */ -#define CDR_ADDRESS ((uint32_t)0x40012308) - -/* ADC CCR register Mask */ -#define CR_CLEAR_MASK ((uint32_t)0xFFFC30E0) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup ADC_Private_Functions - * @{ - */ - -/** @defgroup ADC_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - Initialization and Configuration functions - =============================================================================== - This section provides functions allowing to: - - Initialize and configure the ADC Prescaler - - ADC Conversion Resolution (12bit..6bit) - - Scan Conversion Mode (multichannels or one channel) for regular group - - ADC Continuous Conversion Mode (Continuous or Single conversion) for - regular group - - External trigger Edge and source of regular group, - - Converted data alignment (left or right) - - The number of ADC conversions that will be done using the sequencer for - regular channel group - - Multi ADC mode selection - - Direct memory access mode selection for multi ADC mode - - Delay between 2 sampling phases (used in dual or triple interleaved modes) - - Enable or disable the ADC peripheral - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes all ADCs peripherals registers to their default reset - * values. - * @param None - * @retval None - */ -void ADC_DeInit(void) -{ - /* Enable all ADCs reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC, ENABLE); - - /* Release all ADCs from reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC, DISABLE); -} - -/** - * @brief Initializes the ADCx peripheral according to the specified parameters - * in the ADC_InitStruct. - * @note This function is used to configure the global features of the ADC ( - * Resolution and Data Alignment), however, the rest of the configuration - * parameters are specific to the regular channels group (scan mode - * activation, continuous mode activation, External trigger source and - * edge, number of conversion in the regular channels group sequencer). - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_InitStruct: pointer to an ADC_InitTypeDef structure that contains - * the configuration information for the specified ADC peripheral. - * @retval None - */ -void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct) -{ - uint32_t tmpreg1 = 0; - uint8_t tmpreg2 = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_RESOLUTION(ADC_InitStruct->ADC_Resolution)); - assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ScanConvMode)); - assert_param(IS_FUNCTIONAL_STATE(ADC_InitStruct->ADC_ContinuousConvMode)); - assert_param(IS_ADC_EXT_TRIG_EDGE(ADC_InitStruct->ADC_ExternalTrigConvEdge)); - assert_param(IS_ADC_EXT_TRIG(ADC_InitStruct->ADC_ExternalTrigConv)); - assert_param(IS_ADC_DATA_ALIGN(ADC_InitStruct->ADC_DataAlign)); - assert_param(IS_ADC_REGULAR_LENGTH(ADC_InitStruct->ADC_NbrOfConversion)); - - /*---------------------------- ADCx CR1 Configuration -----------------*/ - /* Get the ADCx CR1 value */ - tmpreg1 = ADCx->CR1; - - /* Clear RES and SCAN bits */ - tmpreg1 &= CR1_CLEAR_MASK; - - /* Configure ADCx: scan conversion mode and resolution */ - /* Set SCAN bit according to ADC_ScanConvMode value */ - /* Set RES bit according to ADC_Resolution value */ - tmpreg1 |= (uint32_t)(((uint32_t)ADC_InitStruct->ADC_ScanConvMode << 8) | \ - ADC_InitStruct->ADC_Resolution); - /* Write to ADCx CR1 */ - ADCx->CR1 = tmpreg1; - /*---------------------------- ADCx CR2 Configuration -----------------*/ - /* Get the ADCx CR2 value */ - tmpreg1 = ADCx->CR2; - - /* Clear CONT, ALIGN, EXTEN and EXTSEL bits */ - tmpreg1 &= CR2_CLEAR_MASK; - - /* Configure ADCx: external trigger event and edge, data alignment and - continuous conversion mode */ - /* Set ALIGN bit according to ADC_DataAlign value */ - /* Set EXTEN bits according to ADC_ExternalTrigConvEdge value */ - /* Set EXTSEL bits according to ADC_ExternalTrigConv value */ - /* Set CONT bit according to ADC_ContinuousConvMode value */ - tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | \ - ADC_InitStruct->ADC_ExternalTrigConv | - ADC_InitStruct->ADC_ExternalTrigConvEdge | \ - ((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1)); - - /* Write to ADCx CR2 */ - ADCx->CR2 = tmpreg1; - /*---------------------------- ADCx SQR1 Configuration -----------------*/ - /* Get the ADCx SQR1 value */ - tmpreg1 = ADCx->SQR1; - - /* Clear L bits */ - tmpreg1 &= SQR1_L_RESET; - - /* Configure ADCx: regular channel sequence length */ - /* Set L bits according to ADC_NbrOfConversion value */ - tmpreg2 |= (uint8_t)(ADC_InitStruct->ADC_NbrOfConversion - (uint8_t)1); - tmpreg1 |= ((uint32_t)tmpreg2 << 20); - - /* Write to ADCx SQR1 */ - ADCx->SQR1 = tmpreg1; -} - -/** - * @brief Fills each ADC_InitStruct member with its default value. - * @note This function is used to initialize the global features of the ADC ( - * Resolution and Data Alignment), however, the rest of the configuration - * parameters are specific to the regular channels group (scan mode - * activation, continuous mode activation, External trigger source and - * edge, number of conversion in the regular channels group sequencer). - * @param ADC_InitStruct: pointer to an ADC_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct) -{ - /* Initialize the ADC_Mode member */ - ADC_InitStruct->ADC_Resolution = ADC_Resolution_12b; - - /* initialize the ADC_ScanConvMode member */ - ADC_InitStruct->ADC_ScanConvMode = DISABLE; - - /* Initialize the ADC_ContinuousConvMode member */ - ADC_InitStruct->ADC_ContinuousConvMode = DISABLE; - - /* Initialize the ADC_ExternalTrigConvEdge member */ - ADC_InitStruct->ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; - - /* Initialize the ADC_ExternalTrigConv member */ - ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; - - /* Initialize the ADC_DataAlign member */ - ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right; - - /* Initialize the ADC_NbrOfConversion member */ - ADC_InitStruct->ADC_NbrOfConversion = 1; -} - -/** - * @brief Initializes the ADCs peripherals according to the specified parameters - * in the ADC_CommonInitStruct. - * @param ADC_CommonInitStruct: pointer to an ADC_CommonInitTypeDef structure - * that contains the configuration information for All ADCs peripherals. - * @retval None - */ -void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct) -{ - uint32_t tmpreg1 = 0; - /* Check the parameters */ - assert_param(IS_ADC_MODE(ADC_CommonInitStruct->ADC_Mode)); - assert_param(IS_ADC_PRESCALER(ADC_CommonInitStruct->ADC_Prescaler)); - assert_param(IS_ADC_DMA_ACCESS_MODE(ADC_CommonInitStruct->ADC_DMAAccessMode)); - assert_param(IS_ADC_SAMPLING_DELAY(ADC_CommonInitStruct->ADC_TwoSamplingDelay)); - /*---------------------------- ADC CCR Configuration -----------------*/ - /* Get the ADC CCR value */ - tmpreg1 = ADC->CCR; - - /* Clear MULTI, DELAY, DMA and ADCPRE bits */ - tmpreg1 &= CR_CLEAR_MASK; - - /* Configure ADCx: Multi mode, Delay between two sampling time, ADC prescaler, - and DMA access mode for multimode */ - /* Set MULTI bits according to ADC_Mode value */ - /* Set ADCPRE bits according to ADC_Prescaler value */ - /* Set DMA bits according to ADC_DMAAccessMode value */ - /* Set DELAY bits according to ADC_TwoSamplingDelay value */ - tmpreg1 |= (uint32_t)(ADC_CommonInitStruct->ADC_Mode | - ADC_CommonInitStruct->ADC_Prescaler | - ADC_CommonInitStruct->ADC_DMAAccessMode | - ADC_CommonInitStruct->ADC_TwoSamplingDelay); - - /* Write to ADC CCR */ - ADC->CCR = tmpreg1; -} - -/** - * @brief Fills each ADC_CommonInitStruct member with its default value. - * @param ADC_CommonInitStruct: pointer to an ADC_CommonInitTypeDef structure - * which will be initialized. - * @retval None - */ -void ADC_CommonStructInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct) -{ - /* Initialize the ADC_Mode member */ - ADC_CommonInitStruct->ADC_Mode = ADC_Mode_Independent; - - /* initialize the ADC_Prescaler member */ - ADC_CommonInitStruct->ADC_Prescaler = ADC_Prescaler_Div2; - - /* Initialize the ADC_DMAAccessMode member */ - ADC_CommonInitStruct->ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; - - /* Initialize the ADC_TwoSamplingDelay member */ - ADC_CommonInitStruct->ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; -} - -/** - * @brief Enables or disables the specified ADC peripheral. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the ADCx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Set the ADON bit to wake up the ADC from power down mode */ - ADCx->CR2 |= (uint32_t)ADC_CR2_ADON; - } - else - { - /* Disable the selected ADC peripheral */ - ADCx->CR2 &= (uint32_t)(~ADC_CR2_ADON); - } -} -/** - * @} - */ - -/** @defgroup ADC_Group2 Analog Watchdog configuration functions - * @brief Analog Watchdog configuration functions - * -@verbatim - =============================================================================== - Analog Watchdog configuration functions - =============================================================================== - - This section provides functions allowing to configure the Analog Watchdog - (AWD) feature in the ADC. - - A typical configuration Analog Watchdog is done following these steps : - 1. the ADC guarded channel(s) is (are) selected using the - ADC_AnalogWatchdogSingleChannelConfig() function. - 2. The Analog watchdog lower and higher threshold are configured using the - ADC_AnalogWatchdogThresholdsConfig() function. - 3. The Analog watchdog is enabled and configured to enable the check, on one - or more channels, using the ADC_AnalogWatchdogCmd() function. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the analog watchdog on single/all regular or - * injected channels - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_AnalogWatchdog: the ADC analog watchdog configuration. - * This parameter can be one of the following values: - * @arg ADC_AnalogWatchdog_SingleRegEnable: Analog watchdog on a single regular channel - * @arg ADC_AnalogWatchdog_SingleInjecEnable: Analog watchdog on a single injected channel - * @arg ADC_AnalogWatchdog_SingleRegOrInjecEnable: Analog watchdog on a single regular or injected channel - * @arg ADC_AnalogWatchdog_AllRegEnable: Analog watchdog on all regular channel - * @arg ADC_AnalogWatchdog_AllInjecEnable: Analog watchdog on all injected channel - * @arg ADC_AnalogWatchdog_AllRegAllInjecEnable: Analog watchdog on all regular and injected channels - * @arg ADC_AnalogWatchdog_None: No channel guarded by the analog watchdog - * @retval None - */ -void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_ANALOG_WATCHDOG(ADC_AnalogWatchdog)); - - /* Get the old register value */ - tmpreg = ADCx->CR1; - - /* Clear AWDEN, JAWDEN and AWDSGL bits */ - tmpreg &= CR1_AWDMode_RESET; - - /* Set the analog watchdog enable mode */ - tmpreg |= ADC_AnalogWatchdog; - - /* Store the new register value */ - ADCx->CR1 = tmpreg; -} - -/** - * @brief Configures the high and low thresholds of the analog watchdog. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param HighThreshold: the ADC analog watchdog High threshold value. - * This parameter must be a 12-bit value. - * @param LowThreshold: the ADC analog watchdog Low threshold value. - * This parameter must be a 12-bit value. - * @retval None - */ -void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, - uint16_t LowThreshold) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_THRESHOLD(HighThreshold)); - assert_param(IS_ADC_THRESHOLD(LowThreshold)); - - /* Set the ADCx high threshold */ - ADCx->HTR = HighThreshold; - - /* Set the ADCx low threshold */ - ADCx->LTR = LowThreshold; -} - -/** - * @brief Configures the analog watchdog guarded single channel - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_Channel: the ADC channel to configure for the analog watchdog. - * This parameter can be one of the following values: - * @arg ADC_Channel_0: ADC Channel0 selected - * @arg ADC_Channel_1: ADC Channel1 selected - * @arg ADC_Channel_2: ADC Channel2 selected - * @arg ADC_Channel_3: ADC Channel3 selected - * @arg ADC_Channel_4: ADC Channel4 selected - * @arg ADC_Channel_5: ADC Channel5 selected - * @arg ADC_Channel_6: ADC Channel6 selected - * @arg ADC_Channel_7: ADC Channel7 selected - * @arg ADC_Channel_8: ADC Channel8 selected - * @arg ADC_Channel_9: ADC Channel9 selected - * @arg ADC_Channel_10: ADC Channel10 selected - * @arg ADC_Channel_11: ADC Channel11 selected - * @arg ADC_Channel_12: ADC Channel12 selected - * @arg ADC_Channel_13: ADC Channel13 selected - * @arg ADC_Channel_14: ADC Channel14 selected - * @arg ADC_Channel_15: ADC Channel15 selected - * @arg ADC_Channel_16: ADC Channel16 selected - * @arg ADC_Channel_17: ADC Channel17 selected - * @arg ADC_Channel_18: ADC Channel18 selected - * @retval None - */ -void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_CHANNEL(ADC_Channel)); - - /* Get the old register value */ - tmpreg = ADCx->CR1; - - /* Clear the Analog watchdog channel select bits */ - tmpreg &= CR1_AWDCH_RESET; - - /* Set the Analog watchdog channel */ - tmpreg |= ADC_Channel; - - /* Store the new register value */ - ADCx->CR1 = tmpreg; -} -/** - * @} - */ - -/** @defgroup ADC_Group3 Temperature Sensor, Vrefint (Voltage Reference internal) - * and VBAT (Voltage BATtery) management functions - * @brief Temperature Sensor, Vrefint and VBAT management functions - * -@verbatim - =============================================================================== - Temperature Sensor, Vrefint and VBAT management functions - =============================================================================== - - This section provides functions allowing to enable/ disable the internal - connections between the ADC and the Temperature Sensor, the Vrefint and the - Vbat sources. - - A typical configuration to get the Temperature sensor and Vrefint channels - voltages is done following these steps : - 1. Enable the internal connection of Temperature sensor and Vrefint sources - with the ADC channels using ADC_TempSensorVrefintCmd() function. - 2. Select the ADC_Channel_TempSensor and/or ADC_Channel_Vrefint using - ADC_RegularChannelConfig() or ADC_InjectedChannelConfig() functions - 3. Get the voltage values, using ADC_GetConversionValue() or - ADC_GetInjectedConversionValue(). - - A typical configuration to get the VBAT channel voltage is done following - these steps : - 1. Enable the internal connection of VBAT source with the ADC channel using - ADC_VBATCmd() function. - 2. Select the ADC_Channel_Vbat using ADC_RegularChannelConfig() or - ADC_InjectedChannelConfig() functions - 3. Get the voltage value, using ADC_GetConversionValue() or - ADC_GetInjectedConversionValue(). - -@endverbatim - * @{ - */ - - -/** - * @brief Enables or disables the temperature sensor and Vrefint channels. - * @param NewState: new state of the temperature sensor and Vrefint channels. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_TempSensorVrefintCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the temperature sensor and Vrefint channel*/ - ADC->CCR |= (uint32_t)ADC_CCR_TSVREFE; - } - else - { - /* Disable the temperature sensor and Vrefint channel*/ - ADC->CCR &= (uint32_t)(~ADC_CCR_TSVREFE); - } -} - -/** - * @brief Enables or disables the VBAT (Voltage Battery) channel. - * @param NewState: new state of the VBAT channel. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_VBATCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the VBAT channel*/ - ADC->CCR |= (uint32_t)ADC_CCR_VBATE; - } - else - { - /* Disable the VBAT channel*/ - ADC->CCR &= (uint32_t)(~ADC_CCR_VBATE); - } -} - -/** - * @} - */ - -/** @defgroup ADC_Group4 Regular Channels Configuration functions - * @brief Regular Channels Configuration functions - * -@verbatim - =============================================================================== - Regular Channels Configuration functions - =============================================================================== - - This section provides functions allowing to manage the ADC's regular channels, - it is composed of 2 sub sections : - - 1. Configuration and management functions for regular channels: This subsection - provides functions allowing to configure the ADC regular channels : - - Configure the rank in the regular group sequencer for each channel - - Configure the sampling time for each channel - - select the conversion Trigger for regular channels - - select the desired EOC event behavior configuration - - Activate the continuous Mode (*) - - Activate the Discontinuous Mode - Please Note that the following features for regular channels are configurated - using the ADC_Init() function : - - scan mode activation - - continuous mode activation (**) - - External trigger source - - External trigger edge - - number of conversion in the regular channels group sequencer. - - @note (*) and (**) are performing the same configuration - - 2. Get the conversion data: This subsection provides an important function in - the ADC peripheral since it returns the converted data of the current - regular channel. When the Conversion value is read, the EOC Flag is - automatically cleared. - - @note For multi ADC mode, the last ADC1, ADC2 and ADC3 regular conversions - results data (in the selected multi mode) can be returned in the same - time using ADC_GetMultiModeConversionValue() function. - - -@endverbatim - * @{ - */ -/** - * @brief Configures for the selected ADC regular channel its corresponding - * rank in the sequencer and its sample time. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_Channel: the ADC channel to configure. - * This parameter can be one of the following values: - * @arg ADC_Channel_0: ADC Channel0 selected - * @arg ADC_Channel_1: ADC Channel1 selected - * @arg ADC_Channel_2: ADC Channel2 selected - * @arg ADC_Channel_3: ADC Channel3 selected - * @arg ADC_Channel_4: ADC Channel4 selected - * @arg ADC_Channel_5: ADC Channel5 selected - * @arg ADC_Channel_6: ADC Channel6 selected - * @arg ADC_Channel_7: ADC Channel7 selected - * @arg ADC_Channel_8: ADC Channel8 selected - * @arg ADC_Channel_9: ADC Channel9 selected - * @arg ADC_Channel_10: ADC Channel10 selected - * @arg ADC_Channel_11: ADC Channel11 selected - * @arg ADC_Channel_12: ADC Channel12 selected - * @arg ADC_Channel_13: ADC Channel13 selected - * @arg ADC_Channel_14: ADC Channel14 selected - * @arg ADC_Channel_15: ADC Channel15 selected - * @arg ADC_Channel_16: ADC Channel16 selected - * @arg ADC_Channel_17: ADC Channel17 selected - * @arg ADC_Channel_18: ADC Channel18 selected - * @param Rank: The rank in the regular group sequencer. - * This parameter must be between 1 to 16. - * @param ADC_SampleTime: The sample time value to be set for the selected channel. - * This parameter can be one of the following values: - * @arg ADC_SampleTime_3Cycles: Sample time equal to 3 cycles - * @arg ADC_SampleTime_15Cycles: Sample time equal to 15 cycles - * @arg ADC_SampleTime_28Cycles: Sample time equal to 28 cycles - * @arg ADC_SampleTime_56Cycles: Sample time equal to 56 cycles - * @arg ADC_SampleTime_84Cycles: Sample time equal to 84 cycles - * @arg ADC_SampleTime_112Cycles: Sample time equal to 112 cycles - * @arg ADC_SampleTime_144Cycles: Sample time equal to 144 cycles - * @arg ADC_SampleTime_480Cycles: Sample time equal to 480 cycles - * @retval None - */ -void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) -{ - uint32_t tmpreg1 = 0, tmpreg2 = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_CHANNEL(ADC_Channel)); - assert_param(IS_ADC_REGULAR_RANK(Rank)); - assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); - - /* if ADC_Channel_10 ... ADC_Channel_18 is selected */ - if (ADC_Channel > ADC_Channel_9) - { - /* Get the old register value */ - tmpreg1 = ADCx->SMPR1; - - /* Calculate the mask to clear */ - tmpreg2 = SMPR1_SMP_SET << (3 * (ADC_Channel - 10)); - - /* Clear the old sample time */ - tmpreg1 &= ~tmpreg2; - - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10)); - - /* Set the new sample time */ - tmpreg1 |= tmpreg2; - - /* Store the new register value */ - ADCx->SMPR1 = tmpreg1; - } - else /* ADC_Channel include in ADC_Channel_[0..9] */ - { - /* Get the old register value */ - tmpreg1 = ADCx->SMPR2; - - /* Calculate the mask to clear */ - tmpreg2 = SMPR2_SMP_SET << (3 * ADC_Channel); - - /* Clear the old sample time */ - tmpreg1 &= ~tmpreg2; - - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); - - /* Set the new sample time */ - tmpreg1 |= tmpreg2; - - /* Store the new register value */ - ADCx->SMPR2 = tmpreg1; - } - /* For Rank 1 to 6 */ - if (Rank < 7) - { - /* Get the old register value */ - tmpreg1 = ADCx->SQR3; - - /* Calculate the mask to clear */ - tmpreg2 = SQR3_SQ_SET << (5 * (Rank - 1)); - - /* Clear the old SQx bits for the selected rank */ - tmpreg1 &= ~tmpreg2; - - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1)); - - /* Set the SQx bits for the selected rank */ - tmpreg1 |= tmpreg2; - - /* Store the new register value */ - ADCx->SQR3 = tmpreg1; - } - /* For Rank 7 to 12 */ - else if (Rank < 13) - { - /* Get the old register value */ - tmpreg1 = ADCx->SQR2; - - /* Calculate the mask to clear */ - tmpreg2 = SQR2_SQ_SET << (5 * (Rank - 7)); - - /* Clear the old SQx bits for the selected rank */ - tmpreg1 &= ~tmpreg2; - - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7)); - - /* Set the SQx bits for the selected rank */ - tmpreg1 |= tmpreg2; - - /* Store the new register value */ - ADCx->SQR2 = tmpreg1; - } - /* For Rank 13 to 16 */ - else - { - /* Get the old register value */ - tmpreg1 = ADCx->SQR1; - - /* Calculate the mask to clear */ - tmpreg2 = SQR1_SQ_SET << (5 * (Rank - 13)); - - /* Clear the old SQx bits for the selected rank */ - tmpreg1 &= ~tmpreg2; - - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13)); - - /* Set the SQx bits for the selected rank */ - tmpreg1 |= tmpreg2; - - /* Store the new register value */ - ADCx->SQR1 = tmpreg1; - } -} - -/** - * @brief Enables the selected ADC software start conversion of the regular channels. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval None - */ -void ADC_SoftwareStartConv(ADC_TypeDef* ADCx) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - - /* Enable the selected ADC conversion for regular group */ - ADCx->CR2 |= (uint32_t)ADC_CR2_SWSTART; -} - -/** - * @brief Gets the selected ADC Software start regular conversion Status. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval The new state of ADC software start conversion (SET or RESET). - */ -FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - - /* Check the status of SWSTART bit */ - if ((ADCx->CR2 & ADC_CR2_JSWSTART) != (uint32_t)RESET) - { - /* SWSTART bit is set */ - bitstatus = SET; - } - else - { - /* SWSTART bit is reset */ - bitstatus = RESET; - } - - /* Return the SWSTART bit status */ - return bitstatus; -} - - -/** - * @brief Enables or disables the EOC on each regular channel conversion - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC EOC flag rising - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_EOCOnEachRegularChannelCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected ADC EOC rising on each regular channel conversion */ - ADCx->CR2 |= (uint32_t)ADC_CR2_EOCS; - } - else - { - /* Disable the selected ADC EOC rising on each regular channel conversion */ - ADCx->CR2 &= (uint32_t)(~ADC_CR2_EOCS); - } -} - -/** - * @brief Enables or disables the ADC continuous conversion mode - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC continuous conversion mode - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_ContinuousModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected ADC continuous conversion mode */ - ADCx->CR2 |= (uint32_t)ADC_CR2_CONT; - } - else - { - /* Disable the selected ADC continuous conversion mode */ - ADCx->CR2 &= (uint32_t)(~ADC_CR2_CONT); - } -} - -/** - * @brief Configures the discontinuous mode for the selected ADC regular group - * channel. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param Number: specifies the discontinuous mode regular channel count value. - * This number must be between 1 and 8. - * @retval None - */ -void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number) -{ - uint32_t tmpreg1 = 0; - uint32_t tmpreg2 = 0; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_REGULAR_DISC_NUMBER(Number)); - - /* Get the old register value */ - tmpreg1 = ADCx->CR1; - - /* Clear the old discontinuous mode channel count */ - tmpreg1 &= CR1_DISCNUM_RESET; - - /* Set the discontinuous mode channel count */ - tmpreg2 = Number - 1; - tmpreg1 |= tmpreg2 << 13; - - /* Store the new register value */ - ADCx->CR1 = tmpreg1; -} - -/** - * @brief Enables or disables the discontinuous mode on regular group channel - * for the specified ADC - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC discontinuous mode on - * regular group channel. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected ADC regular discontinuous mode */ - ADCx->CR1 |= (uint32_t)ADC_CR1_DISCEN; - } - else - { - /* Disable the selected ADC regular discontinuous mode */ - ADCx->CR1 &= (uint32_t)(~ADC_CR1_DISCEN); - } -} - -/** - * @brief Returns the last ADCx conversion result data for regular channel. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval The Data conversion value. - */ -uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - - /* Return the selected ADC conversion value */ - return (uint16_t) ADCx->DR; -} - -/** - * @brief Returns the last ADC1, ADC2 and ADC3 regular conversions results - * data in the selected multi mode. - * @param None - * @retval The Data conversion value. - * @note In dual mode, the value returned by this function is as following - * Data[15:0] : these bits contain the regular data of ADC1. - * Data[31:16]: these bits contain the regular data of ADC2. - * @note In triple mode, the value returned by this function is as following - * Data[15:0] : these bits contain alternatively the regular data of ADC1, ADC3 and ADC2. - * Data[31:16]: these bits contain alternatively the regular data of ADC2, ADC1 and ADC3. - */ -uint32_t ADC_GetMultiModeConversionValue(void) -{ - /* Return the multi mode conversion value */ - return (*(__IO uint32_t *) CDR_ADDRESS); -} -/** - * @} - */ - -/** @defgroup ADC_Group5 Regular Channels DMA Configuration functions - * @brief Regular Channels DMA Configuration functions - * -@verbatim - =============================================================================== - Regular Channels DMA Configuration functions - =============================================================================== - - This section provides functions allowing to configure the DMA for ADC regular - channels. - Since converted regular channel values are stored into a unique data register, - it is useful to use DMA for conversion of more than one regular channel. This - avoids the loss of the data already stored in the ADC Data register. - - When the DMA mode is enabled (using the ADC_DMACmd() function), after each - conversion of a regular channel, a DMA request is generated. - - Depending on the "DMA disable selection for Independent ADC mode" - configuration (using the ADC_DMARequestAfterLastTransferCmd() function), - at the end of the last DMA transfer, two possibilities are allowed: - - No new DMA request is issued to the DMA controller (feature DISABLED) - - Requests can continue to be generated (feature ENABLED). - - Depending on the "DMA disable selection for multi ADC mode" configuration - (using the void ADC_MultiModeDMARequestAfterLastTransferCmd() function), - at the end of the last DMA transfer, two possibilities are allowed: - - No new DMA request is issued to the DMA controller (feature DISABLED) - - Requests can continue to be generated (feature ENABLED). - -@endverbatim - * @{ - */ - - /** - * @brief Enables or disables the specified ADC DMA request. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC DMA transfer. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC DMA request */ - ADCx->CR2 |= (uint32_t)ADC_CR2_DMA; - } - else - { - /* Disable the selected ADC DMA request */ - ADCx->CR2 &= (uint32_t)(~ADC_CR2_DMA); - } -} - -/** - * @brief Enables or disables the ADC DMA request after last transfer (Single-ADC mode) - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC DMA request after last transfer. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_DMARequestAfterLastTransferCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC DMA request after last transfer */ - ADCx->CR2 |= (uint32_t)ADC_CR2_DDS; - } - else - { - /* Disable the selected ADC DMA request after last transfer */ - ADCx->CR2 &= (uint32_t)(~ADC_CR2_DDS); - } -} - -/** - * @brief Enables or disables the ADC DMA request after last transfer in multi ADC mode - * @param NewState: new state of the selected ADC DMA request after last transfer. - * This parameter can be: ENABLE or DISABLE. - * @note if Enabled, DMA requests are issued as long as data are converted and - * DMA mode for multi ADC mode (selected using ADC_CommonInit() function - * by ADC_CommonInitStruct.ADC_DMAAccessMode structure member) is - * ADC_DMAAccessMode_1, ADC_DMAAccessMode_2 or ADC_DMAAccessMode_3. - * @retval None - */ -void ADC_MultiModeDMARequestAfterLastTransferCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC DMA request after last transfer */ - ADC->CCR |= (uint32_t)ADC_CCR_DDS; - } - else - { - /* Disable the selected ADC DMA request after last transfer */ - ADC->CCR &= (uint32_t)(~ADC_CCR_DDS); - } -} -/** - * @} - */ - -/** @defgroup ADC_Group6 Injected channels Configuration functions - * @brief Injected channels Configuration functions - * -@verbatim - =============================================================================== - Injected channels Configuration functions - =============================================================================== - - This section provide functions allowing to configure the ADC Injected channels, - it is composed of 2 sub sections : - - 1. Configuration functions for Injected channels: This subsection provides - functions allowing to configure the ADC injected channels : - - Configure the rank in the injected group sequencer for each channel - - Configure the sampling time for each channel - - Activate the Auto injected Mode - - Activate the Discontinuous Mode - - scan mode activation - - External/software trigger source - - External trigger edge - - injected channels sequencer. - - 2. Get the Specified Injected channel conversion data: This subsection - provides an important function in the ADC peripheral since it returns the - converted data of the specific injected channel. - -@endverbatim - * @{ - */ -/** - * @brief Configures for the selected ADC injected channel its corresponding - * rank in the sequencer and its sample time. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_Channel: the ADC channel to configure. - * This parameter can be one of the following values: - * @arg ADC_Channel_0: ADC Channel0 selected - * @arg ADC_Channel_1: ADC Channel1 selected - * @arg ADC_Channel_2: ADC Channel2 selected - * @arg ADC_Channel_3: ADC Channel3 selected - * @arg ADC_Channel_4: ADC Channel4 selected - * @arg ADC_Channel_5: ADC Channel5 selected - * @arg ADC_Channel_6: ADC Channel6 selected - * @arg ADC_Channel_7: ADC Channel7 selected - * @arg ADC_Channel_8: ADC Channel8 selected - * @arg ADC_Channel_9: ADC Channel9 selected - * @arg ADC_Channel_10: ADC Channel10 selected - * @arg ADC_Channel_11: ADC Channel11 selected - * @arg ADC_Channel_12: ADC Channel12 selected - * @arg ADC_Channel_13: ADC Channel13 selected - * @arg ADC_Channel_14: ADC Channel14 selected - * @arg ADC_Channel_15: ADC Channel15 selected - * @arg ADC_Channel_16: ADC Channel16 selected - * @arg ADC_Channel_17: ADC Channel17 selected - * @arg ADC_Channel_18: ADC Channel18 selected - * @param Rank: The rank in the injected group sequencer. - * This parameter must be between 1 to 4. - * @param ADC_SampleTime: The sample time value to be set for the selected channel. - * This parameter can be one of the following values: - * @arg ADC_SampleTime_3Cycles: Sample time equal to 3 cycles - * @arg ADC_SampleTime_15Cycles: Sample time equal to 15 cycles - * @arg ADC_SampleTime_28Cycles: Sample time equal to 28 cycles - * @arg ADC_SampleTime_56Cycles: Sample time equal to 56 cycles - * @arg ADC_SampleTime_84Cycles: Sample time equal to 84 cycles - * @arg ADC_SampleTime_112Cycles: Sample time equal to 112 cycles - * @arg ADC_SampleTime_144Cycles: Sample time equal to 144 cycles - * @arg ADC_SampleTime_480Cycles: Sample time equal to 480 cycles - * @retval None - */ -void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) -{ - uint32_t tmpreg1 = 0, tmpreg2 = 0, tmpreg3 = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_CHANNEL(ADC_Channel)); - assert_param(IS_ADC_INJECTED_RANK(Rank)); - assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime)); - /* if ADC_Channel_10 ... ADC_Channel_18 is selected */ - if (ADC_Channel > ADC_Channel_9) - { - /* Get the old register value */ - tmpreg1 = ADCx->SMPR1; - /* Calculate the mask to clear */ - tmpreg2 = SMPR1_SMP_SET << (3*(ADC_Channel - 10)); - /* Clear the old sample time */ - tmpreg1 &= ~tmpreg2; - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_SampleTime << (3*(ADC_Channel - 10)); - /* Set the new sample time */ - tmpreg1 |= tmpreg2; - /* Store the new register value */ - ADCx->SMPR1 = tmpreg1; - } - else /* ADC_Channel include in ADC_Channel_[0..9] */ - { - /* Get the old register value */ - tmpreg1 = ADCx->SMPR2; - /* Calculate the mask to clear */ - tmpreg2 = SMPR2_SMP_SET << (3 * ADC_Channel); - /* Clear the old sample time */ - tmpreg1 &= ~tmpreg2; - /* Calculate the mask to set */ - tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); - /* Set the new sample time */ - tmpreg1 |= tmpreg2; - /* Store the new register value */ - ADCx->SMPR2 = tmpreg1; - } - /* Rank configuration */ - /* Get the old register value */ - tmpreg1 = ADCx->JSQR; - /* Get JL value: Number = JL+1 */ - tmpreg3 = (tmpreg1 & JSQR_JL_SET)>> 20; - /* Calculate the mask to clear: ((Rank-1)+(4-JL-1)) */ - tmpreg2 = JSQR_JSQ_SET << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); - /* Clear the old JSQx bits for the selected rank */ - tmpreg1 &= ~tmpreg2; - /* Calculate the mask to set: ((Rank-1)+(4-JL-1)) */ - tmpreg2 = (uint32_t)ADC_Channel << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); - /* Set the JSQx bits for the selected rank */ - tmpreg1 |= tmpreg2; - /* Store the new register value */ - ADCx->JSQR = tmpreg1; -} - -/** - * @brief Configures the sequencer length for injected channels - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param Length: The sequencer length. - * This parameter must be a number between 1 to 4. - * @retval None - */ -void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length) -{ - uint32_t tmpreg1 = 0; - uint32_t tmpreg2 = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_INJECTED_LENGTH(Length)); - - /* Get the old register value */ - tmpreg1 = ADCx->JSQR; - - /* Clear the old injected sequence length JL bits */ - tmpreg1 &= JSQR_JL_RESET; - - /* Set the injected sequence length JL bits */ - tmpreg2 = Length - 1; - tmpreg1 |= tmpreg2 << 20; - - /* Store the new register value */ - ADCx->JSQR = tmpreg1; -} - -/** - * @brief Set the injected channels conversion value offset - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_InjectedChannel: the ADC injected channel to set its offset. - * This parameter can be one of the following values: - * @arg ADC_InjectedChannel_1: Injected Channel1 selected - * @arg ADC_InjectedChannel_2: Injected Channel2 selected - * @arg ADC_InjectedChannel_3: Injected Channel3 selected - * @arg ADC_InjectedChannel_4: Injected Channel4 selected - * @param Offset: the offset value for the selected ADC injected channel - * This parameter must be a 12bit value. - * @retval None - */ -void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset) -{ - __IO uint32_t tmp = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel)); - assert_param(IS_ADC_OFFSET(Offset)); - - tmp = (uint32_t)ADCx; - tmp += ADC_InjectedChannel; - - /* Set the selected injected channel data offset */ - *(__IO uint32_t *) tmp = (uint32_t)Offset; -} - - /** - * @brief Configures the ADCx external trigger for injected channels conversion. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_ExternalTrigInjecConv: specifies the ADC trigger to start injected conversion. - * This parameter can be one of the following values: - * @arg ADC_ExternalTrigInjecConv_T1_CC4: Timer1 capture compare4 selected - * @arg ADC_ExternalTrigInjecConv_T1_TRGO: Timer1 TRGO event selected - * @arg ADC_ExternalTrigInjecConv_T2_CC1: Timer2 capture compare1 selected - * @arg ADC_ExternalTrigInjecConv_T2_TRGO: Timer2 TRGO event selected - * @arg ADC_ExternalTrigInjecConv_T3_CC2: Timer3 capture compare2 selected - * @arg ADC_ExternalTrigInjecConv_T3_CC4: Timer3 capture compare4 selected - * @arg ADC_ExternalTrigInjecConv_T4_CC1: Timer4 capture compare1 selected - * @arg ADC_ExternalTrigInjecConv_T4_CC2: Timer4 capture compare2 selected - * @arg ADC_ExternalTrigInjecConv_T4_CC3: Timer4 capture compare3 selected - * @arg ADC_ExternalTrigInjecConv_T4_TRGO: Timer4 TRGO event selected - * @arg ADC_ExternalTrigInjecConv_T5_CC4: Timer5 capture compare4 selected - * @arg ADC_ExternalTrigInjecConv_T5_TRGO: Timer5 TRGO event selected - * @arg ADC_ExternalTrigInjecConv_T8_CC2: Timer8 capture compare2 selected - * @arg ADC_ExternalTrigInjecConv_T8_CC3: Timer8 capture compare3 selected - * @arg ADC_ExternalTrigInjecConv_T8_CC4: Timer8 capture compare4 selected - * @arg ADC_ExternalTrigInjecConv_Ext_IT15: External interrupt line 15 event selected - * @retval None - */ -void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_EXT_INJEC_TRIG(ADC_ExternalTrigInjecConv)); - - /* Get the old register value */ - tmpreg = ADCx->CR2; - - /* Clear the old external event selection for injected group */ - tmpreg &= CR2_JEXTSEL_RESET; - - /* Set the external event selection for injected group */ - tmpreg |= ADC_ExternalTrigInjecConv; - - /* Store the new register value */ - ADCx->CR2 = tmpreg; -} - -/** - * @brief Configures the ADCx external trigger edge for injected channels conversion. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_ExternalTrigInjecConvEdge: specifies the ADC external trigger edge - * to start injected conversion. - * This parameter can be one of the following values: - * @arg ADC_ExternalTrigInjecConvEdge_None: external trigger disabled for - * injected conversion - * @arg ADC_ExternalTrigInjecConvEdge_Rising: detection on rising edge - * @arg ADC_ExternalTrigInjecConvEdge_Falling: detection on falling edge - * @arg ADC_ExternalTrigInjecConvEdge_RisingFalling: detection on both rising - * and falling edge - * @retval None - */ -void ADC_ExternalTrigInjectedConvEdgeConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConvEdge) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_EXT_INJEC_TRIG_EDGE(ADC_ExternalTrigInjecConvEdge)); - /* Get the old register value */ - tmpreg = ADCx->CR2; - /* Clear the old external trigger edge for injected group */ - tmpreg &= CR2_JEXTEN_RESET; - /* Set the new external trigger edge for injected group */ - tmpreg |= ADC_ExternalTrigInjecConvEdge; - /* Store the new register value */ - ADCx->CR2 = tmpreg; -} - -/** - * @brief Enables the selected ADC software start conversion of the injected channels. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval None - */ -void ADC_SoftwareStartInjectedConv(ADC_TypeDef* ADCx) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - /* Enable the selected ADC conversion for injected group */ - ADCx->CR2 |= (uint32_t)ADC_CR2_JSWSTART; -} - -/** - * @brief Gets the selected ADC Software start injected conversion Status. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @retval The new state of ADC software start injected conversion (SET or RESET). - */ -FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - - /* Check the status of JSWSTART bit */ - if ((ADCx->CR2 & ADC_CR2_JSWSTART) != (uint32_t)RESET) - { - /* JSWSTART bit is set */ - bitstatus = SET; - } - else - { - /* JSWSTART bit is reset */ - bitstatus = RESET; - } - /* Return the JSWSTART bit status */ - return bitstatus; -} - -/** - * @brief Enables or disables the selected ADC automatic injected group - * conversion after regular one. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC auto injected conversion - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC automatic injected group conversion */ - ADCx->CR1 |= (uint32_t)ADC_CR1_JAUTO; - } - else - { - /* Disable the selected ADC automatic injected group conversion */ - ADCx->CR1 &= (uint32_t)(~ADC_CR1_JAUTO); - } -} - -/** - * @brief Enables or disables the discontinuous mode for injected group - * channel for the specified ADC - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param NewState: new state of the selected ADC discontinuous mode on injected - * group channel. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected ADC injected discontinuous mode */ - ADCx->CR1 |= (uint32_t)ADC_CR1_JDISCEN; - } - else - { - /* Disable the selected ADC injected discontinuous mode */ - ADCx->CR1 &= (uint32_t)(~ADC_CR1_JDISCEN); - } -} - -/** - * @brief Returns the ADC injected channel conversion result - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_InjectedChannel: the converted ADC injected channel. - * This parameter can be one of the following values: - * @arg ADC_InjectedChannel_1: Injected Channel1 selected - * @arg ADC_InjectedChannel_2: Injected Channel2 selected - * @arg ADC_InjectedChannel_3: Injected Channel3 selected - * @arg ADC_InjectedChannel_4: Injected Channel4 selected - * @retval The Data conversion value. - */ -uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel)); - - tmp = (uint32_t)ADCx; - tmp += ADC_InjectedChannel + JDR_OFFSET; - - /* Returns the selected injected channel conversion data value */ - return (uint16_t) (*(__IO uint32_t*) tmp); -} -/** - * @} - */ - -/** @defgroup ADC_Group7 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - - This section provides functions allowing to configure the ADC Interrupts and - to get the status and clear flags and Interrupts pending bits. - - Each ADC provides 4 Interrupts sources and 6 Flags which can be divided into - 3 groups: - - I. Flags and Interrupts for ADC regular channels - ================================================= - Flags : - ---------- - 1. ADC_FLAG_OVR : Overrun detection when regular converted data are lost - - 2. ADC_FLAG_EOC : Regular channel end of conversion ==> to indicate (depending - on EOCS bit, managed by ADC_EOCOnEachRegularChannelCmd() ) the end of: - ==> a regular CHANNEL conversion - ==> sequence of regular GROUP conversions . - - 3. ADC_FLAG_STRT: Regular channel start ==> to indicate when regular CHANNEL - conversion starts. - - Interrupts : - ------------ - 1. ADC_IT_OVR : specifies the interrupt source for Overrun detection event. - 2. ADC_IT_EOC : specifies the interrupt source for Regular channel end of - conversion event. - - - II. Flags and Interrupts for ADC Injected channels - ================================================= - Flags : - ---------- - 1. ADC_FLAG_JEOC : Injected channel end of conversion ==> to indicate at - the end of injected GROUP conversion - - 2. ADC_FLAG_JSTRT: Injected channel start ==> to indicate hardware when - injected GROUP conversion starts. - - Interrupts : - ------------ - 1. ADC_IT_JEOC : specifies the interrupt source for Injected channel end of - conversion event. - - III. General Flags and Interrupts for the ADC - ================================================= - Flags : - ---------- - 1. ADC_FLAG_AWD: Analog watchdog ==> to indicate if the converted voltage - crosses the programmed thresholds values. - - Interrupts : - ------------ - 1. ADC_IT_AWD : specifies the interrupt source for Analog watchdog event. - - - The user should identify which mode will be used in his application to manage - the ADC controller events: Polling mode or Interrupt mode. - - In the Polling Mode it is advised to use the following functions: - - ADC_GetFlagStatus() : to check if flags events occur. - - ADC_ClearFlag() : to clear the flags events. - - In the Interrupt Mode it is advised to use the following functions: - - ADC_ITConfig() : to enable or disable the interrupt source. - - ADC_GetITStatus() : to check if Interrupt occurs. - - ADC_ClearITPendingBit() : to clear the Interrupt pending Bit - (corresponding Flag). -@endverbatim - * @{ - */ -/** - * @brief Enables or disables the specified ADC interrupts. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_IT: specifies the ADC interrupt sources to be enabled or disabled. - * This parameter can be one of the following values: - * @arg ADC_IT_EOC: End of conversion interrupt mask - * @arg ADC_IT_AWD: Analog watchdog interrupt mask - * @arg ADC_IT_JEOC: End of injected conversion interrupt mask - * @arg ADC_IT_OVR: Overrun interrupt enable - * @param NewState: new state of the specified ADC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState) -{ - uint32_t itmask = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_ADC_IT(ADC_IT)); - - /* Get the ADC IT index */ - itmask = (uint8_t)ADC_IT; - itmask = (uint32_t)0x01 << itmask; - - if (NewState != DISABLE) - { - /* Enable the selected ADC interrupts */ - ADCx->CR1 |= itmask; - } - else - { - /* Disable the selected ADC interrupts */ - ADCx->CR1 &= (~(uint32_t)itmask); - } -} - -/** - * @brief Checks whether the specified ADC flag is set or not. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg ADC_FLAG_AWD: Analog watchdog flag - * @arg ADC_FLAG_EOC: End of conversion flag - * @arg ADC_FLAG_JEOC: End of injected group conversion flag - * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag - * @arg ADC_FLAG_STRT: Start of regular group conversion flag - * @arg ADC_FLAG_OVR: Overrun flag - * @retval The new state of ADC_FLAG (SET or RESET). - */ -FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_GET_FLAG(ADC_FLAG)); - - /* Check the status of the specified ADC flag */ - if ((ADCx->SR & ADC_FLAG) != (uint8_t)RESET) - { - /* ADC_FLAG is set */ - bitstatus = SET; - } - else - { - /* ADC_FLAG is reset */ - bitstatus = RESET; - } - /* Return the ADC_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the ADCx's pending flags. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg ADC_FLAG_AWD: Analog watchdog flag - * @arg ADC_FLAG_EOC: End of conversion flag - * @arg ADC_FLAG_JEOC: End of injected group conversion flag - * @arg ADC_FLAG_JSTRT: Start of injected group conversion flag - * @arg ADC_FLAG_STRT: Start of regular group conversion flag - * @arg ADC_FLAG_OVR: Overrun flag - * @retval None - */ -void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG) -{ - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_CLEAR_FLAG(ADC_FLAG)); - - /* Clear the selected ADC flags */ - ADCx->SR = ~(uint32_t)ADC_FLAG; -} - -/** - * @brief Checks whether the specified ADC interrupt has occurred or not. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_IT: specifies the ADC interrupt source to check. - * This parameter can be one of the following values: - * @arg ADC_IT_EOC: End of conversion interrupt mask - * @arg ADC_IT_AWD: Analog watchdog interrupt mask - * @arg ADC_IT_JEOC: End of injected conversion interrupt mask - * @arg ADC_IT_OVR: Overrun interrupt mask - * @retval The new state of ADC_IT (SET or RESET). - */ -ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT) -{ - ITStatus bitstatus = RESET; - uint32_t itmask = 0, enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_IT(ADC_IT)); - - /* Get the ADC IT index */ - itmask = ADC_IT >> 8; - - /* Get the ADC_IT enable bit status */ - enablestatus = (ADCx->CR1 & ((uint32_t)0x01 << (uint8_t)ADC_IT)) ; - - /* Check the status of the specified ADC interrupt */ - if (((ADCx->SR & itmask) != (uint32_t)RESET) && enablestatus) - { - /* ADC_IT is set */ - bitstatus = SET; - } - else - { - /* ADC_IT is reset */ - bitstatus = RESET; - } - /* Return the ADC_IT status */ - return bitstatus; -} - -/** - * @brief Clears the ADCx's interrupt pending bits. - * @param ADCx: where x can be 1, 2 or 3 to select the ADC peripheral. - * @param ADC_IT: specifies the ADC interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg ADC_IT_EOC: End of conversion interrupt mask - * @arg ADC_IT_AWD: Analog watchdog interrupt mask - * @arg ADC_IT_JEOC: End of injected conversion interrupt mask - * @arg ADC_IT_OVR: Overrun interrupt mask - * @retval None - */ -void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT) -{ - uint8_t itmask = 0; - /* Check the parameters */ - assert_param(IS_ADC_ALL_PERIPH(ADCx)); - assert_param(IS_ADC_IT(ADC_IT)); - /* Get the ADC IT index */ - itmask = (uint8_t)(ADC_IT >> 8); - /* Clear the selected ADC interrupt pending bits */ - ADCx->SR = ~(uint32_t)itmask; -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_adc.h b/car_hw/src/lib/stdperiph/stm32f4xx_adc.h deleted file mode 100644 index dba848ca74f..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_adc.h +++ /dev/null @@ -1,643 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_adc.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the ADC firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_ADC_H -#define __STM32F4xx_ADC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup ADC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief ADC Init structure definition - */ -typedef struct -{ - uint32_t ADC_Resolution; /*!< Configures the ADC resolution dual mode. - This parameter can be a value of @ref ADC_resolution */ - FunctionalState ADC_ScanConvMode; /*!< Specifies whether the conversion - is performed in Scan (multichannels) - or Single (one channel) mode. - This parameter can be set to ENABLE or DISABLE */ - FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion - is performed in Continuous or Single mode. - This parameter can be set to ENABLE or DISABLE. */ - uint32_t ADC_ExternalTrigConvEdge; /*!< Select the external trigger edge and - enable the trigger of a regular group. - This parameter can be a value of - @ref ADC_external_trigger_edge_for_regular_channels_conversion */ - uint32_t ADC_ExternalTrigConv; /*!< Select the external event used to trigger - the start of conversion of a regular group. - This parameter can be a value of - @ref ADC_extrenal_trigger_sources_for_regular_channels_conversion */ - uint32_t ADC_DataAlign; /*!< Specifies whether the ADC data alignment - is left or right. This parameter can be - a value of @ref ADC_data_align */ - uint8_t ADC_NbrOfConversion; /*!< Specifies the number of ADC conversions - that will be done using the sequencer for - regular channel group. - This parameter must range from 1 to 16. */ -}ADC_InitTypeDef; - -/** - * @brief ADC Common Init structure definition - */ -typedef struct -{ - uint32_t ADC_Mode; /*!< Configures the ADC to operate in - independent or multi mode. - This parameter can be a value of @ref ADC_Common_mode */ - uint32_t ADC_Prescaler; /*!< Select the frequency of the clock - to the ADC. The clock is common for all the ADCs. - This parameter can be a value of @ref ADC_Prescaler */ - uint32_t ADC_DMAAccessMode; /*!< Configures the Direct memory access - mode for multi ADC mode. - This parameter can be a value of - @ref ADC_Direct_memory_access_mode_for_multi_mode */ - uint32_t ADC_TwoSamplingDelay; /*!< Configures the Delay between 2 sampling phases. - This parameter can be a value of - @ref ADC_delay_between_2_sampling_phases */ - -}ADC_CommonInitTypeDef; - - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup ADC_Exported_Constants - * @{ - */ -#define IS_ADC_ALL_PERIPH(PERIPH) (((PERIPH) == ADC1) || \ - ((PERIPH) == ADC2) || \ - ((PERIPH) == ADC3)) - -/** @defgroup ADC_Common_mode - * @{ - */ -#define ADC_Mode_Independent ((uint32_t)0x00000000) -#define ADC_DualMode_RegSimult_InjecSimult ((uint32_t)0x00000001) -#define ADC_DualMode_RegSimult_AlterTrig ((uint32_t)0x00000002) -#define ADC_DualMode_InjecSimult ((uint32_t)0x00000005) -#define ADC_DualMode_RegSimult ((uint32_t)0x00000006) -#define ADC_DualMode_Interl ((uint32_t)0x00000007) -#define ADC_DualMode_AlterTrig ((uint32_t)0x00000009) -#define ADC_TripleMode_RegSimult_InjecSimult ((uint32_t)0x00000011) -#define ADC_TripleMode_RegSimult_AlterTrig ((uint32_t)0x00000012) -#define ADC_TripleMode_InjecSimult ((uint32_t)0x00000015) -#define ADC_TripleMode_RegSimult ((uint32_t)0x00000016) -#define ADC_TripleMode_Interl ((uint32_t)0x00000017) -#define ADC_TripleMode_AlterTrig ((uint32_t)0x00000019) -#define IS_ADC_MODE(MODE) (((MODE) == ADC_Mode_Independent) || \ - ((MODE) == ADC_DualMode_RegSimult_InjecSimult) || \ - ((MODE) == ADC_DualMode_RegSimult_AlterTrig) || \ - ((MODE) == ADC_DualMode_InjecSimult) || \ - ((MODE) == ADC_DualMode_RegSimult) || \ - ((MODE) == ADC_DualMode_Interl) || \ - ((MODE) == ADC_DualMode_AlterTrig) || \ - ((MODE) == ADC_TripleMode_RegSimult_InjecSimult) || \ - ((MODE) == ADC_TripleMode_RegSimult_AlterTrig) || \ - ((MODE) == ADC_TripleMode_InjecSimult) || \ - ((MODE) == ADC_TripleMode_RegSimult) || \ - ((MODE) == ADC_TripleMode_Interl) || \ - ((MODE) == ADC_TripleMode_AlterTrig)) -/** - * @} - */ - - -/** @defgroup ADC_Prescaler - * @{ - */ -#define ADC_Prescaler_Div2 ((uint32_t)0x00000000) -#define ADC_Prescaler_Div4 ((uint32_t)0x00010000) -#define ADC_Prescaler_Div6 ((uint32_t)0x00020000) -#define ADC_Prescaler_Div8 ((uint32_t)0x00030000) -#define IS_ADC_PRESCALER(PRESCALER) (((PRESCALER) == ADC_Prescaler_Div2) || \ - ((PRESCALER) == ADC_Prescaler_Div4) || \ - ((PRESCALER) == ADC_Prescaler_Div6) || \ - ((PRESCALER) == ADC_Prescaler_Div8)) -/** - * @} - */ - - -/** @defgroup ADC_Direct_memory_access_mode_for_multi_mode - * @{ - */ -#define ADC_DMAAccessMode_Disabled ((uint32_t)0x00000000) /* DMA mode disabled */ -#define ADC_DMAAccessMode_1 ((uint32_t)0x00004000) /* DMA mode 1 enabled (2 / 3 half-words one by one - 1 then 2 then 3)*/ -#define ADC_DMAAccessMode_2 ((uint32_t)0x00008000) /* DMA mode 2 enabled (2 / 3 half-words by pairs - 2&1 then 1&3 then 3&2)*/ -#define ADC_DMAAccessMode_3 ((uint32_t)0x0000C000) /* DMA mode 3 enabled (2 / 3 bytes by pairs - 2&1 then 1&3 then 3&2) */ -#define IS_ADC_DMA_ACCESS_MODE(MODE) (((MODE) == ADC_DMAAccessMode_Disabled) || \ - ((MODE) == ADC_DMAAccessMode_1) || \ - ((MODE) == ADC_DMAAccessMode_2) || \ - ((MODE) == ADC_DMAAccessMode_3)) - -/** - * @} - */ - - -/** @defgroup ADC_delay_between_2_sampling_phases - * @{ - */ -#define ADC_TwoSamplingDelay_5Cycles ((uint32_t)0x00000000) -#define ADC_TwoSamplingDelay_6Cycles ((uint32_t)0x00000100) -#define ADC_TwoSamplingDelay_7Cycles ((uint32_t)0x00000200) -#define ADC_TwoSamplingDelay_8Cycles ((uint32_t)0x00000300) -#define ADC_TwoSamplingDelay_9Cycles ((uint32_t)0x00000400) -#define ADC_TwoSamplingDelay_10Cycles ((uint32_t)0x00000500) -#define ADC_TwoSamplingDelay_11Cycles ((uint32_t)0x00000600) -#define ADC_TwoSamplingDelay_12Cycles ((uint32_t)0x00000700) -#define ADC_TwoSamplingDelay_13Cycles ((uint32_t)0x00000800) -#define ADC_TwoSamplingDelay_14Cycles ((uint32_t)0x00000900) -#define ADC_TwoSamplingDelay_15Cycles ((uint32_t)0x00000A00) -#define ADC_TwoSamplingDelay_16Cycles ((uint32_t)0x00000B00) -#define ADC_TwoSamplingDelay_17Cycles ((uint32_t)0x00000C00) -#define ADC_TwoSamplingDelay_18Cycles ((uint32_t)0x00000D00) -#define ADC_TwoSamplingDelay_19Cycles ((uint32_t)0x00000E00) -#define ADC_TwoSamplingDelay_20Cycles ((uint32_t)0x00000F00) -#define IS_ADC_SAMPLING_DELAY(DELAY) (((DELAY) == ADC_TwoSamplingDelay_5Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_6Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_7Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_8Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_9Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_10Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_11Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_12Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_13Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_14Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_15Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_16Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_17Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_18Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_19Cycles) || \ - ((DELAY) == ADC_TwoSamplingDelay_20Cycles)) - -/** - * @} - */ - - -/** @defgroup ADC_resolution - * @{ - */ -#define ADC_Resolution_12b ((uint32_t)0x00000000) -#define ADC_Resolution_10b ((uint32_t)0x01000000) -#define ADC_Resolution_8b ((uint32_t)0x02000000) -#define ADC_Resolution_6b ((uint32_t)0x03000000) -#define IS_ADC_RESOLUTION(RESOLUTION) (((RESOLUTION) == ADC_Resolution_12b) || \ - ((RESOLUTION) == ADC_Resolution_10b) || \ - ((RESOLUTION) == ADC_Resolution_8b) || \ - ((RESOLUTION) == ADC_Resolution_6b)) - -/** - * @} - */ - - -/** @defgroup ADC_external_trigger_edge_for_regular_channels_conversion - * @{ - */ -#define ADC_ExternalTrigConvEdge_None ((uint32_t)0x00000000) -#define ADC_ExternalTrigConvEdge_Rising ((uint32_t)0x10000000) -#define ADC_ExternalTrigConvEdge_Falling ((uint32_t)0x20000000) -#define ADC_ExternalTrigConvEdge_RisingFalling ((uint32_t)0x30000000) -#define IS_ADC_EXT_TRIG_EDGE(EDGE) (((EDGE) == ADC_ExternalTrigConvEdge_None) || \ - ((EDGE) == ADC_ExternalTrigConvEdge_Rising) || \ - ((EDGE) == ADC_ExternalTrigConvEdge_Falling) || \ - ((EDGE) == ADC_ExternalTrigConvEdge_RisingFalling)) -/** - * @} - */ - - -/** @defgroup ADC_extrenal_trigger_sources_for_regular_channels_conversion - * @{ - */ -#define ADC_ExternalTrigConv_T1_CC1 ((uint32_t)0x00000000) -#define ADC_ExternalTrigConv_T1_CC2 ((uint32_t)0x01000000) -#define ADC_ExternalTrigConv_T1_CC3 ((uint32_t)0x02000000) -#define ADC_ExternalTrigConv_T2_CC2 ((uint32_t)0x03000000) -#define ADC_ExternalTrigConv_T2_CC3 ((uint32_t)0x04000000) -#define ADC_ExternalTrigConv_T2_CC4 ((uint32_t)0x05000000) -#define ADC_ExternalTrigConv_T2_TRGO ((uint32_t)0x06000000) -#define ADC_ExternalTrigConv_T3_CC1 ((uint32_t)0x07000000) -#define ADC_ExternalTrigConv_T3_TRGO ((uint32_t)0x08000000) -#define ADC_ExternalTrigConv_T4_CC4 ((uint32_t)0x09000000) -#define ADC_ExternalTrigConv_T5_CC1 ((uint32_t)0x0A000000) -#define ADC_ExternalTrigConv_T5_CC2 ((uint32_t)0x0B000000) -#define ADC_ExternalTrigConv_T5_CC3 ((uint32_t)0x0C000000) -#define ADC_ExternalTrigConv_T8_CC1 ((uint32_t)0x0D000000) -#define ADC_ExternalTrigConv_T8_TRGO ((uint32_t)0x0E000000) -#define ADC_ExternalTrigConv_Ext_IT11 ((uint32_t)0x0F000000) -#define IS_ADC_EXT_TRIG(REGTRIG) (((REGTRIG) == ADC_ExternalTrigConv_T1_CC1) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T1_CC2) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T1_CC3) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T2_CC2) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T2_CC3) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T2_CC4) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T2_TRGO) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T3_CC1) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T3_TRGO) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T4_CC4) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T5_CC1) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T5_CC2) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T5_CC3) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T8_CC1) || \ - ((REGTRIG) == ADC_ExternalTrigConv_T8_TRGO) || \ - ((REGTRIG) == ADC_ExternalTrigConv_Ext_IT11)) -/** - * @} - */ - - -/** @defgroup ADC_data_align - * @{ - */ -#define ADC_DataAlign_Right ((uint32_t)0x00000000) -#define ADC_DataAlign_Left ((uint32_t)0x00000800) -#define IS_ADC_DATA_ALIGN(ALIGN) (((ALIGN) == ADC_DataAlign_Right) || \ - ((ALIGN) == ADC_DataAlign_Left)) -/** - * @} - */ - - -/** @defgroup ADC_channels - * @{ - */ -#define ADC_Channel_0 ((uint8_t)0x00) -#define ADC_Channel_1 ((uint8_t)0x01) -#define ADC_Channel_2 ((uint8_t)0x02) -#define ADC_Channel_3 ((uint8_t)0x03) -#define ADC_Channel_4 ((uint8_t)0x04) -#define ADC_Channel_5 ((uint8_t)0x05) -#define ADC_Channel_6 ((uint8_t)0x06) -#define ADC_Channel_7 ((uint8_t)0x07) -#define ADC_Channel_8 ((uint8_t)0x08) -#define ADC_Channel_9 ((uint8_t)0x09) -#define ADC_Channel_10 ((uint8_t)0x0A) -#define ADC_Channel_11 ((uint8_t)0x0B) -#define ADC_Channel_12 ((uint8_t)0x0C) -#define ADC_Channel_13 ((uint8_t)0x0D) -#define ADC_Channel_14 ((uint8_t)0x0E) -#define ADC_Channel_15 ((uint8_t)0x0F) -#define ADC_Channel_16 ((uint8_t)0x10) -#define ADC_Channel_17 ((uint8_t)0x11) -#define ADC_Channel_18 ((uint8_t)0x12) - -#define ADC_Channel_TempSensor ((uint8_t)ADC_Channel_16) -#define ADC_Channel_Vrefint ((uint8_t)ADC_Channel_17) -#define ADC_Channel_Vbat ((uint8_t)ADC_Channel_18) - -#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) == ADC_Channel_0) || \ - ((CHANNEL) == ADC_Channel_1) || \ - ((CHANNEL) == ADC_Channel_2) || \ - ((CHANNEL) == ADC_Channel_3) || \ - ((CHANNEL) == ADC_Channel_4) || \ - ((CHANNEL) == ADC_Channel_5) || \ - ((CHANNEL) == ADC_Channel_6) || \ - ((CHANNEL) == ADC_Channel_7) || \ - ((CHANNEL) == ADC_Channel_8) || \ - ((CHANNEL) == ADC_Channel_9) || \ - ((CHANNEL) == ADC_Channel_10) || \ - ((CHANNEL) == ADC_Channel_11) || \ - ((CHANNEL) == ADC_Channel_12) || \ - ((CHANNEL) == ADC_Channel_13) || \ - ((CHANNEL) == ADC_Channel_14) || \ - ((CHANNEL) == ADC_Channel_15) || \ - ((CHANNEL) == ADC_Channel_16) || \ - ((CHANNEL) == ADC_Channel_17) || \ - ((CHANNEL) == ADC_Channel_18)) -/** - * @} - */ - - -/** @defgroup ADC_sampling_times - * @{ - */ -#define ADC_SampleTime_3Cycles ((uint8_t)0x00) -#define ADC_SampleTime_15Cycles ((uint8_t)0x01) -#define ADC_SampleTime_28Cycles ((uint8_t)0x02) -#define ADC_SampleTime_56Cycles ((uint8_t)0x03) -#define ADC_SampleTime_84Cycles ((uint8_t)0x04) -#define ADC_SampleTime_112Cycles ((uint8_t)0x05) -#define ADC_SampleTime_144Cycles ((uint8_t)0x06) -#define ADC_SampleTime_480Cycles ((uint8_t)0x07) -#define IS_ADC_SAMPLE_TIME(TIME) (((TIME) == ADC_SampleTime_3Cycles) || \ - ((TIME) == ADC_SampleTime_15Cycles) || \ - ((TIME) == ADC_SampleTime_28Cycles) || \ - ((TIME) == ADC_SampleTime_56Cycles) || \ - ((TIME) == ADC_SampleTime_84Cycles) || \ - ((TIME) == ADC_SampleTime_112Cycles) || \ - ((TIME) == ADC_SampleTime_144Cycles) || \ - ((TIME) == ADC_SampleTime_480Cycles)) -/** - * @} - */ - - -/** @defgroup ADC_external_trigger_edge_for_injected_channels_conversion - * @{ - */ -#define ADC_ExternalTrigInjecConvEdge_None ((uint32_t)0x00000000) -#define ADC_ExternalTrigInjecConvEdge_Rising ((uint32_t)0x00100000) -#define ADC_ExternalTrigInjecConvEdge_Falling ((uint32_t)0x00200000) -#define ADC_ExternalTrigInjecConvEdge_RisingFalling ((uint32_t)0x00300000) -#define IS_ADC_EXT_INJEC_TRIG_EDGE(EDGE) (((EDGE) == ADC_ExternalTrigInjecConvEdge_None) || \ - ((EDGE) == ADC_ExternalTrigInjecConvEdge_Rising) || \ - ((EDGE) == ADC_ExternalTrigInjecConvEdge_Falling) || \ - ((EDGE) == ADC_ExternalTrigInjecConvEdge_RisingFalling)) - -/** - * @} - */ - - -/** @defgroup ADC_extrenal_trigger_sources_for_injected_channels_conversion - * @{ - */ -#define ADC_ExternalTrigInjecConv_T1_CC4 ((uint32_t)0x00000000) -#define ADC_ExternalTrigInjecConv_T1_TRGO ((uint32_t)0x00010000) -#define ADC_ExternalTrigInjecConv_T2_CC1 ((uint32_t)0x00020000) -#define ADC_ExternalTrigInjecConv_T2_TRGO ((uint32_t)0x00030000) -#define ADC_ExternalTrigInjecConv_T3_CC2 ((uint32_t)0x00040000) -#define ADC_ExternalTrigInjecConv_T3_CC4 ((uint32_t)0x00050000) -#define ADC_ExternalTrigInjecConv_T4_CC1 ((uint32_t)0x00060000) -#define ADC_ExternalTrigInjecConv_T4_CC2 ((uint32_t)0x00070000) -#define ADC_ExternalTrigInjecConv_T4_CC3 ((uint32_t)0x00080000) -#define ADC_ExternalTrigInjecConv_T4_TRGO ((uint32_t)0x00090000) -#define ADC_ExternalTrigInjecConv_T5_CC4 ((uint32_t)0x000A0000) -#define ADC_ExternalTrigInjecConv_T5_TRGO ((uint32_t)0x000B0000) -#define ADC_ExternalTrigInjecConv_T8_CC2 ((uint32_t)0x000C0000) -#define ADC_ExternalTrigInjecConv_T8_CC3 ((uint32_t)0x000D0000) -#define ADC_ExternalTrigInjecConv_T8_CC4 ((uint32_t)0x000E0000) -#define ADC_ExternalTrigInjecConv_Ext_IT15 ((uint32_t)0x000F0000) -#define IS_ADC_EXT_INJEC_TRIG(INJTRIG) (((INJTRIG) == ADC_ExternalTrigInjecConv_T1_CC4) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T1_TRGO) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_CC1) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T2_TRGO) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T3_CC2) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T3_CC4) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC1) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC2) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_CC3) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T4_TRGO) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T5_CC4) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T5_TRGO) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC2) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC3) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_T8_CC4) || \ - ((INJTRIG) == ADC_ExternalTrigInjecConv_Ext_IT15)) -/** - * @} - */ - - -/** @defgroup ADC_injected_channel_selection - * @{ - */ -#define ADC_InjectedChannel_1 ((uint8_t)0x14) -#define ADC_InjectedChannel_2 ((uint8_t)0x18) -#define ADC_InjectedChannel_3 ((uint8_t)0x1C) -#define ADC_InjectedChannel_4 ((uint8_t)0x20) -#define IS_ADC_INJECTED_CHANNEL(CHANNEL) (((CHANNEL) == ADC_InjectedChannel_1) || \ - ((CHANNEL) == ADC_InjectedChannel_2) || \ - ((CHANNEL) == ADC_InjectedChannel_3) || \ - ((CHANNEL) == ADC_InjectedChannel_4)) -/** - * @} - */ - - -/** @defgroup ADC_analog_watchdog_selection - * @{ - */ -#define ADC_AnalogWatchdog_SingleRegEnable ((uint32_t)0x00800200) -#define ADC_AnalogWatchdog_SingleInjecEnable ((uint32_t)0x00400200) -#define ADC_AnalogWatchdog_SingleRegOrInjecEnable ((uint32_t)0x00C00200) -#define ADC_AnalogWatchdog_AllRegEnable ((uint32_t)0x00800000) -#define ADC_AnalogWatchdog_AllInjecEnable ((uint32_t)0x00400000) -#define ADC_AnalogWatchdog_AllRegAllInjecEnable ((uint32_t)0x00C00000) -#define ADC_AnalogWatchdog_None ((uint32_t)0x00000000) -#define IS_ADC_ANALOG_WATCHDOG(WATCHDOG) (((WATCHDOG) == ADC_AnalogWatchdog_SingleRegEnable) || \ - ((WATCHDOG) == ADC_AnalogWatchdog_SingleInjecEnable) || \ - ((WATCHDOG) == ADC_AnalogWatchdog_SingleRegOrInjecEnable) || \ - ((WATCHDOG) == ADC_AnalogWatchdog_AllRegEnable) || \ - ((WATCHDOG) == ADC_AnalogWatchdog_AllInjecEnable) || \ - ((WATCHDOG) == ADC_AnalogWatchdog_AllRegAllInjecEnable) || \ - ((WATCHDOG) == ADC_AnalogWatchdog_None)) -/** - * @} - */ - - -/** @defgroup ADC_interrupts_definition - * @{ - */ -#define ADC_IT_EOC ((uint16_t)0x0205) -#define ADC_IT_AWD ((uint16_t)0x0106) -#define ADC_IT_JEOC ((uint16_t)0x0407) -#define ADC_IT_OVR ((uint16_t)0x201A) -#define IS_ADC_IT(IT) (((IT) == ADC_IT_EOC) || ((IT) == ADC_IT_AWD) || \ - ((IT) == ADC_IT_JEOC)|| ((IT) == ADC_IT_OVR)) -/** - * @} - */ - - -/** @defgroup ADC_flags_definition - * @{ - */ -#define ADC_FLAG_AWD ((uint8_t)0x01) -#define ADC_FLAG_EOC ((uint8_t)0x02) -#define ADC_FLAG_JEOC ((uint8_t)0x04) -#define ADC_FLAG_JSTRT ((uint8_t)0x08) -#define ADC_FLAG_STRT ((uint8_t)0x10) -#define ADC_FLAG_OVR ((uint8_t)0x20) - -#define IS_ADC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint8_t)0xC0) == 0x00) && ((FLAG) != 0x00)) -#define IS_ADC_GET_FLAG(FLAG) (((FLAG) == ADC_FLAG_AWD) || \ - ((FLAG) == ADC_FLAG_EOC) || \ - ((FLAG) == ADC_FLAG_JEOC) || \ - ((FLAG)== ADC_FLAG_JSTRT) || \ - ((FLAG) == ADC_FLAG_STRT) || \ - ((FLAG)== ADC_FLAG_OVR)) -/** - * @} - */ - - -/** @defgroup ADC_thresholds - * @{ - */ -#define IS_ADC_THRESHOLD(THRESHOLD) ((THRESHOLD) <= 0xFFF) -/** - * @} - */ - - -/** @defgroup ADC_injected_offset - * @{ - */ -#define IS_ADC_OFFSET(OFFSET) ((OFFSET) <= 0xFFF) -/** - * @} - */ - - -/** @defgroup ADC_injected_length - * @{ - */ -#define IS_ADC_INJECTED_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x4)) -/** - * @} - */ - - -/** @defgroup ADC_injected_rank - * @{ - */ -#define IS_ADC_INJECTED_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x4)) -/** - * @} - */ - - -/** @defgroup ADC_regular_length - * @{ - */ -#define IS_ADC_REGULAR_LENGTH(LENGTH) (((LENGTH) >= 0x1) && ((LENGTH) <= 0x10)) -/** - * @} - */ - - -/** @defgroup ADC_regular_rank - * @{ - */ -#define IS_ADC_REGULAR_RANK(RANK) (((RANK) >= 0x1) && ((RANK) <= 0x10)) -/** - * @} - */ - - -/** @defgroup ADC_regular_discontinuous_mode_number - * @{ - */ -#define IS_ADC_REGULAR_DISC_NUMBER(NUMBER) (((NUMBER) >= 0x1) && ((NUMBER) <= 0x8)) -/** - * @} - */ - - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the ADC configuration to the default reset state *****/ -void ADC_DeInit(void); - -/* Initialization and Configuration functions *********************************/ -void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); -void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); -void ADC_CommonInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct); -void ADC_CommonStructInit(ADC_CommonInitTypeDef* ADC_CommonInitStruct); -void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); - -/* Analog Watchdog configuration functions ************************************/ -void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog); -void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold,uint16_t LowThreshold); -void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel); - -/* Temperature Sensor, Vrefint and VBAT management functions ******************/ -void ADC_TempSensorVrefintCmd(FunctionalState NewState); -void ADC_VBATCmd(FunctionalState NewState); - -/* Regular Channels Configuration functions ***********************************/ -void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); -void ADC_SoftwareStartConv(ADC_TypeDef* ADCx); -FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx); -void ADC_EOCOnEachRegularChannelCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_ContinuousModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); -void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); -uint32_t ADC_GetMultiModeConversionValue(void); - -/* Regular Channels DMA Configuration functions *******************************/ -void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_DMARequestAfterLastTransferCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_MultiModeDMARequestAfterLastTransferCmd(FunctionalState NewState); - -/* Injected channels Configuration functions **********************************/ -void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); -void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length); -void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset); -void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv); -void ADC_ExternalTrigInjectedConvEdgeConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConvEdge); -void ADC_SoftwareStartInjectedConv(ADC_TypeDef* ADCx); -FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx); -void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); -uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel); - -/* Interrupts and flags management functions **********************************/ -void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); -FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); -void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); -ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT); -void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_ADC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_can.c b/car_hw/src/lib/stdperiph/stm32f4xx_can.c deleted file mode 100644 index 812eaccdf15..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_can.c +++ /dev/null @@ -1,1699 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_can.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Controller area network (CAN) peripheral: - * - Initialization and Configuration - * - CAN Frames Transmission - * - CAN Frames Reception - * - Operation modes switch - * - Error management - * - Interrupts and flags - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - - * 1. Enable the CAN controller interface clock using - * RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); for CAN1 - * and RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE); for CAN2 - * @note In case you are using CAN2 only, you have to enable the CAN1 clock. - * - * 2. CAN pins configuration - * - Enable the clock for the CAN GPIOs using the following function: - * RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); - * - Connect the involved CAN pins to AF9 using the following function - * GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_CANx); - * - Configure these CAN pins in alternate function mode by calling - * the function GPIO_Init(); - * - * 3. Initialise and configure the CAN using CAN_Init() and - * CAN_FilterInit() functions. - * - * 4. Transmit the desired CAN frame using CAN_Transmit() function. - * - * 5. Check the transmission of a CAN frame using CAN_TransmitStatus() - * function. - * - * 6. Cancel the transmission of a CAN frame using CAN_CancelTransmit() - * function. - * - * 7. Receive a CAN frame using CAN_Recieve() function. - * - * 8. Release the receive FIFOs using CAN_FIFORelease() function. - * - * 9. Return the number of pending received frames using - * CAN_MessagePending() function. - * - * 10. To control CAN events you can use one of the following two methods: - * - Check on CAN flags using the CAN_GetFlagStatus() function. - * - Use CAN interrupts through the function CAN_ITConfig() at - * initialization phase and CAN_GetITStatus() function into - * interrupt routines to check if the event has occurred or not. - * After checking on a flag you should clear it using CAN_ClearFlag() - * function. And after checking on an interrupt event you should - * clear it using CAN_ClearITPendingBit() function. - * - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_can.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup CAN - * @brief CAN driver modules - * @{ - */ -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* CAN Master Control Register bits */ -#define MCR_DBF ((uint32_t)0x00010000) /* software master reset */ - -/* CAN Mailbox Transmit Request */ -#define TMIDxR_TXRQ ((uint32_t)0x00000001) /* Transmit mailbox request */ - -/* CAN Filter Master Register bits */ -#define FMR_FINIT ((uint32_t)0x00000001) /* Filter init mode */ - -/* Time out for INAK bit */ -#define INAK_TIMEOUT ((uint32_t)0x0000FFFF) -/* Time out for SLAK bit */ -#define SLAK_TIMEOUT ((uint32_t)0x0000FFFF) - -/* Flags in TSR register */ -#define CAN_FLAGS_TSR ((uint32_t)0x08000000) -/* Flags in RF1R register */ -#define CAN_FLAGS_RF1R ((uint32_t)0x04000000) -/* Flags in RF0R register */ -#define CAN_FLAGS_RF0R ((uint32_t)0x02000000) -/* Flags in MSR register */ -#define CAN_FLAGS_MSR ((uint32_t)0x01000000) -/* Flags in ESR register */ -#define CAN_FLAGS_ESR ((uint32_t)0x00F00000) - -/* Mailboxes definition */ -#define CAN_TXMAILBOX_0 ((uint8_t)0x00) -#define CAN_TXMAILBOX_1 ((uint8_t)0x01) -#define CAN_TXMAILBOX_2 ((uint8_t)0x02) - -#define CAN_MODE_MASK ((uint32_t) 0x00000003) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit); - -/** @defgroup CAN_Private_Functions - * @{ - */ - -/** @defgroup CAN_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - Initialization and Configuration functions - =============================================================================== - This section provides functions allowing to - - Initialize the CAN peripherals : Prescaler, operating mode, the maximum number - of time quanta to perform resynchronization, the number of time quanta in - Bit Segment 1 and 2 and many other modes. - Refer to @ref CAN_InitTypeDef for more details. - - Configures the CAN reception filter. - - Select the start bank filter for slave CAN. - - Enables or disables the Debug Freeze mode for CAN - - Enables or disables the CAN Time Trigger Operation communication mode - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the CAN peripheral registers to their default reset values. - * @param CANx: where x can be 1 or 2 to select the CAN peripheral. - * @retval None. - */ -void CAN_DeInit(CAN_TypeDef* CANx) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - if (CANx == CAN1) - { - /* Enable CAN1 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE); - /* Release CAN1 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, DISABLE); - } - else - { - /* Enable CAN2 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, ENABLE); - /* Release CAN2 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, DISABLE); - } -} - -/** - * @brief Initializes the CAN peripheral according to the specified - * parameters in the CAN_InitStruct. - * @param CANx: where x can be 1 or 2 to select the CAN peripheral. - * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure that contains - * the configuration information for the CAN peripheral. - * @retval Constant indicates initialization succeed which will be - * CAN_InitStatus_Failed or CAN_InitStatus_Success. - */ -uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct) -{ - uint8_t InitStatus = CAN_InitStatus_Failed; - uint32_t wait_ack = 0x00000000; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TTCM)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_ABOM)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_AWUM)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_NART)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_RFLM)); - assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TXFP)); - assert_param(IS_CAN_MODE(CAN_InitStruct->CAN_Mode)); - assert_param(IS_CAN_SJW(CAN_InitStruct->CAN_SJW)); - assert_param(IS_CAN_BS1(CAN_InitStruct->CAN_BS1)); - assert_param(IS_CAN_BS2(CAN_InitStruct->CAN_BS2)); - assert_param(IS_CAN_PRESCALER(CAN_InitStruct->CAN_Prescaler)); - - /* Exit from sleep mode */ - CANx->MCR &= (~(uint32_t)CAN_MCR_SLEEP); - - /* Request initialisation */ - CANx->MCR |= CAN_MCR_INRQ ; - - /* Wait the acknowledge */ - while (((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT)) - { - wait_ack++; - } - - /* Check acknowledge */ - if ((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) - { - InitStatus = CAN_InitStatus_Failed; - } - else - { - /* Set the time triggered communication mode */ - if (CAN_InitStruct->CAN_TTCM == ENABLE) - { - CANx->MCR |= CAN_MCR_TTCM; - } - else - { - CANx->MCR &= ~(uint32_t)CAN_MCR_TTCM; - } - - /* Set the automatic bus-off management */ - if (CAN_InitStruct->CAN_ABOM == ENABLE) - { - CANx->MCR |= CAN_MCR_ABOM; - } - else - { - CANx->MCR &= ~(uint32_t)CAN_MCR_ABOM; - } - - /* Set the automatic wake-up mode */ - if (CAN_InitStruct->CAN_AWUM == ENABLE) - { - CANx->MCR |= CAN_MCR_AWUM; - } - else - { - CANx->MCR &= ~(uint32_t)CAN_MCR_AWUM; - } - - /* Set the no automatic retransmission */ - if (CAN_InitStruct->CAN_NART == ENABLE) - { - CANx->MCR |= CAN_MCR_NART; - } - else - { - CANx->MCR &= ~(uint32_t)CAN_MCR_NART; - } - - /* Set the receive FIFO locked mode */ - if (CAN_InitStruct->CAN_RFLM == ENABLE) - { - CANx->MCR |= CAN_MCR_RFLM; - } - else - { - CANx->MCR &= ~(uint32_t)CAN_MCR_RFLM; - } - - /* Set the transmit FIFO priority */ - if (CAN_InitStruct->CAN_TXFP == ENABLE) - { - CANx->MCR |= CAN_MCR_TXFP; - } - else - { - CANx->MCR &= ~(uint32_t)CAN_MCR_TXFP; - } - - /* Set the bit timing register */ - CANx->BTR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) | \ - ((uint32_t)CAN_InitStruct->CAN_SJW << 24) | \ - ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) | \ - ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) | \ - ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1); - - /* Request leave initialisation */ - CANx->MCR &= ~(uint32_t)CAN_MCR_INRQ; - - /* Wait the acknowledge */ - wait_ack = 0; - - while (((CANx->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT)) - { - wait_ack++; - } - - /* ...and check acknowledged */ - if ((CANx->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) - { - InitStatus = CAN_InitStatus_Failed; - } - else - { - InitStatus = CAN_InitStatus_Success ; - } - } - - /* At this step, return the status of initialization */ - return InitStatus; -} - -/** - * @brief Configures the CAN reception filter according to the specified - * parameters in the CAN_FilterInitStruct. - * @param CAN_FilterInitStruct: pointer to a CAN_FilterInitTypeDef structure that - * contains the configuration information. - * @retval None - */ -void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct) -{ - uint32_t filter_number_bit_pos = 0; - /* Check the parameters */ - assert_param(IS_CAN_FILTER_NUMBER(CAN_FilterInitStruct->CAN_FilterNumber)); - assert_param(IS_CAN_FILTER_MODE(CAN_FilterInitStruct->CAN_FilterMode)); - assert_param(IS_CAN_FILTER_SCALE(CAN_FilterInitStruct->CAN_FilterScale)); - assert_param(IS_CAN_FILTER_FIFO(CAN_FilterInitStruct->CAN_FilterFIFOAssignment)); - assert_param(IS_FUNCTIONAL_STATE(CAN_FilterInitStruct->CAN_FilterActivation)); - - filter_number_bit_pos = ((uint32_t)1) << CAN_FilterInitStruct->CAN_FilterNumber; - - /* Initialisation mode for the filter */ - CAN1->FMR |= FMR_FINIT; - - /* Filter Deactivation */ - CAN1->FA1R &= ~(uint32_t)filter_number_bit_pos; - - /* Filter Scale */ - if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_16bit) - { - /* 16-bit scale for the filter */ - CAN1->FS1R &= ~(uint32_t)filter_number_bit_pos; - - /* First 16-bit identifier and First 16-bit mask */ - /* Or First 16-bit identifier and Second 16-bit identifier */ - CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = - ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow) << 16) | - (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); - - /* Second 16-bit identifier and Second 16-bit mask */ - /* Or Third 16-bit identifier and Fourth 16-bit identifier */ - CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = - ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | - (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh); - } - - if (CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_32bit) - { - /* 32-bit scale for the filter */ - CAN1->FS1R |= filter_number_bit_pos; - /* 32-bit identifier or First 32-bit identifier */ - CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = - ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh) << 16) | - (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); - /* 32-bit mask or Second 32-bit identifier */ - CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = - ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | - (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow); - } - - /* Filter Mode */ - if (CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdMask) - { - /*Id/Mask mode for the filter*/ - CAN1->FM1R &= ~(uint32_t)filter_number_bit_pos; - } - else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */ - { - /*Identifier list mode for the filter*/ - CAN1->FM1R |= (uint32_t)filter_number_bit_pos; - } - - /* Filter FIFO assignment */ - if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO0) - { - /* FIFO 0 assignation for the filter */ - CAN1->FFA1R &= ~(uint32_t)filter_number_bit_pos; - } - - if (CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO1) - { - /* FIFO 1 assignation for the filter */ - CAN1->FFA1R |= (uint32_t)filter_number_bit_pos; - } - - /* Filter activation */ - if (CAN_FilterInitStruct->CAN_FilterActivation == ENABLE) - { - CAN1->FA1R |= filter_number_bit_pos; - } - - /* Leave the initialisation mode for the filter */ - CAN1->FMR &= ~FMR_FINIT; -} - -/** - * @brief Fills each CAN_InitStruct member with its default value. - * @param CAN_InitStruct: pointer to a CAN_InitTypeDef structure which ill be initialized. - * @retval None - */ -void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct) -{ - /* Reset CAN init structure parameters values */ - - /* Initialize the time triggered communication mode */ - CAN_InitStruct->CAN_TTCM = DISABLE; - - /* Initialize the automatic bus-off management */ - CAN_InitStruct->CAN_ABOM = DISABLE; - - /* Initialize the automatic wake-up mode */ - CAN_InitStruct->CAN_AWUM = DISABLE; - - /* Initialize the no automatic retransmission */ - CAN_InitStruct->CAN_NART = DISABLE; - - /* Initialize the receive FIFO locked mode */ - CAN_InitStruct->CAN_RFLM = DISABLE; - - /* Initialize the transmit FIFO priority */ - CAN_InitStruct->CAN_TXFP = DISABLE; - - /* Initialize the CAN_Mode member */ - CAN_InitStruct->CAN_Mode = CAN_Mode_Normal; - - /* Initialize the CAN_SJW member */ - CAN_InitStruct->CAN_SJW = CAN_SJW_1tq; - - /* Initialize the CAN_BS1 member */ - CAN_InitStruct->CAN_BS1 = CAN_BS1_4tq; - - /* Initialize the CAN_BS2 member */ - CAN_InitStruct->CAN_BS2 = CAN_BS2_3tq; - - /* Initialize the CAN_Prescaler member */ - CAN_InitStruct->CAN_Prescaler = 1; -} - -/** - * @brief Select the start bank filter for slave CAN. - * @param CAN_BankNumber: Select the start slave bank filter from 1..27. - * @retval None - */ -void CAN_SlaveStartBank(uint8_t CAN_BankNumber) -{ - /* Check the parameters */ - assert_param(IS_CAN_BANKNUMBER(CAN_BankNumber)); - - /* Enter Initialisation mode for the filter */ - CAN1->FMR |= FMR_FINIT; - - /* Select the start slave bank */ - CAN1->FMR &= (uint32_t)0xFFFFC0F1 ; - CAN1->FMR |= (uint32_t)(CAN_BankNumber)<<8; - - /* Leave Initialisation mode for the filter */ - CAN1->FMR &= ~FMR_FINIT; -} - -/** - * @brief Enables or disables the DBG Freeze for CAN. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param NewState: new state of the CAN peripheral. - * This parameter can be: ENABLE (CAN reception/transmission is frozen - * during debug. Reception FIFOs can still be accessed/controlled normally) - * or DISABLE (CAN is working during debug). - * @retval None - */ -void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable Debug Freeze */ - CANx->MCR |= MCR_DBF; - } - else - { - /* Disable Debug Freeze */ - CANx->MCR &= ~MCR_DBF; - } -} - - -/** - * @brief Enables or disables the CAN Time TriggerOperation communication mode. - * @note DLC must be programmed as 8 in order Time Stamp (2 bytes) to be - * sent over the CAN bus. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param NewState: Mode new state. This parameter can be: ENABLE or DISABLE. - * When enabled, Time stamp (TIME[15:0]) value is sent in the last two - * data bytes of the 8-byte message: TIME[7:0] in data byte 6 and TIME[15:8] - * in data byte 7. - * @retval None - */ -void CAN_TTComModeCmd(CAN_TypeDef* CANx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the TTCM mode */ - CANx->MCR |= CAN_MCR_TTCM; - - /* Set TGT bits */ - CANx->sTxMailBox[0].TDTR |= ((uint32_t)CAN_TDT0R_TGT); - CANx->sTxMailBox[1].TDTR |= ((uint32_t)CAN_TDT1R_TGT); - CANx->sTxMailBox[2].TDTR |= ((uint32_t)CAN_TDT2R_TGT); - } - else - { - /* Disable the TTCM mode */ - CANx->MCR &= (uint32_t)(~(uint32_t)CAN_MCR_TTCM); - - /* Reset TGT bits */ - CANx->sTxMailBox[0].TDTR &= ((uint32_t)~CAN_TDT0R_TGT); - CANx->sTxMailBox[1].TDTR &= ((uint32_t)~CAN_TDT1R_TGT); - CANx->sTxMailBox[2].TDTR &= ((uint32_t)~CAN_TDT2R_TGT); - } -} -/** - * @} - */ - - -/** @defgroup CAN_Group2 CAN Frames Transmission functions - * @brief CAN Frames Transmission functions - * -@verbatim - =============================================================================== - CAN Frames Transmission functions - =============================================================================== - This section provides functions allowing to - - Initiate and transmit a CAN frame message (if there is an empty mailbox). - - Check the transmission status of a CAN Frame - - Cancel a transmit request - -@endverbatim - * @{ - */ - -/** - * @brief Initiates and transmits a CAN frame message. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param TxMessage: pointer to a structure which contains CAN Id, CAN DLC and CAN data. - * @retval The number of the mailbox that is used for transmission or - * CAN_TxStatus_NoMailBox if there is no empty mailbox. - */ -uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage) -{ - uint8_t transmit_mailbox = 0; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_IDTYPE(TxMessage->IDE)); - assert_param(IS_CAN_RTR(TxMessage->RTR)); - assert_param(IS_CAN_DLC(TxMessage->DLC)); - - /* Select one empty transmit mailbox */ - if ((CANx->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) - { - transmit_mailbox = 0; - } - else if ((CANx->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) - { - transmit_mailbox = 1; - } - else if ((CANx->TSR&CAN_TSR_TME2) == CAN_TSR_TME2) - { - transmit_mailbox = 2; - } - else - { - transmit_mailbox = CAN_TxStatus_NoMailBox; - } - - if (transmit_mailbox != CAN_TxStatus_NoMailBox) - { - /* Set up the Id */ - CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ; - if (TxMessage->IDE == CAN_Id_Standard) - { - assert_param(IS_CAN_STDID(TxMessage->StdId)); - CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | \ - TxMessage->RTR); - } - else - { - assert_param(IS_CAN_EXTID(TxMessage->ExtId)); - CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId << 3) | \ - TxMessage->IDE | \ - TxMessage->RTR); - } - - /* Set up the DLC */ - TxMessage->DLC &= (uint8_t)0x0000000F; - CANx->sTxMailBox[transmit_mailbox].TDTR &= (uint32_t)0xFFFFFFF0; - CANx->sTxMailBox[transmit_mailbox].TDTR |= TxMessage->DLC; - - /* Set up the data field */ - CANx->sTxMailBox[transmit_mailbox].TDLR = (((uint32_t)TxMessage->Data[3] << 24) | - ((uint32_t)TxMessage->Data[2] << 16) | - ((uint32_t)TxMessage->Data[1] << 8) | - ((uint32_t)TxMessage->Data[0])); - CANx->sTxMailBox[transmit_mailbox].TDHR = (((uint32_t)TxMessage->Data[7] << 24) | - ((uint32_t)TxMessage->Data[6] << 16) | - ((uint32_t)TxMessage->Data[5] << 8) | - ((uint32_t)TxMessage->Data[4])); - /* Request transmission */ - CANx->sTxMailBox[transmit_mailbox].TIR |= TMIDxR_TXRQ; - } - return transmit_mailbox; -} - -/** - * @brief Checks the transmission status of a CAN Frame. - * @param CANx: where x can be 1 or 2 to select the CAN peripheral. - * @param TransmitMailbox: the number of the mailbox that is used for transmission. - * @retval CAN_TxStatus_Ok if the CAN driver transmits the message, - * CAN_TxStatus_Failed in an other case. - */ -uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox) -{ - uint32_t state = 0; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_TRANSMITMAILBOX(TransmitMailbox)); - - switch (TransmitMailbox) - { - case (CAN_TXMAILBOX_0): - state = CANx->TSR & (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0); - break; - case (CAN_TXMAILBOX_1): - state = CANx->TSR & (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1); - break; - case (CAN_TXMAILBOX_2): - state = CANx->TSR & (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2); - break; - default: - state = CAN_TxStatus_Failed; - break; - } - switch (state) - { - /* transmit pending */ - case (0x0): state = CAN_TxStatus_Pending; - break; - /* transmit failed */ - case (CAN_TSR_RQCP0 | CAN_TSR_TME0): state = CAN_TxStatus_Failed; - break; - case (CAN_TSR_RQCP1 | CAN_TSR_TME1): state = CAN_TxStatus_Failed; - break; - case (CAN_TSR_RQCP2 | CAN_TSR_TME2): state = CAN_TxStatus_Failed; - break; - /* transmit succeeded */ - case (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0):state = CAN_TxStatus_Ok; - break; - case (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1):state = CAN_TxStatus_Ok; - break; - case (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2):state = CAN_TxStatus_Ok; - break; - default: state = CAN_TxStatus_Failed; - break; - } - return (uint8_t) state; -} - -/** - * @brief Cancels a transmit request. - * @param CANx: where x can be 1 or 2 to select the CAN peripheral. - * @param Mailbox: Mailbox number. - * @retval None - */ -void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_TRANSMITMAILBOX(Mailbox)); - /* abort transmission */ - switch (Mailbox) - { - case (CAN_TXMAILBOX_0): CANx->TSR |= CAN_TSR_ABRQ0; - break; - case (CAN_TXMAILBOX_1): CANx->TSR |= CAN_TSR_ABRQ1; - break; - case (CAN_TXMAILBOX_2): CANx->TSR |= CAN_TSR_ABRQ2; - break; - default: - break; - } -} -/** - * @} - */ - - -/** @defgroup CAN_Group3 CAN Frames Reception functions - * @brief CAN Frames Reception functions - * -@verbatim - =============================================================================== - CAN Frames Reception functions - =============================================================================== - This section provides functions allowing to - - Receive a correct CAN frame - - Release a specified receive FIFO (2 FIFOs are available) - - Return the number of the pending received CAN frames - -@endverbatim - * @{ - */ - -/** - * @brief Receives a correct CAN frame. - * @param CANx: where x can be 1 or 2 to select the CAN peripheral. - * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1. - * @param RxMessage: pointer to a structure receive frame which contains CAN Id, - * CAN DLC, CAN data and FMI number. - * @retval None - */ -void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_FIFO(FIFONumber)); - /* Get the Id */ - RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONumber].RIR; - if (RxMessage->IDE == CAN_Id_Standard) - { - RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 21); - } - else - { - RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONumber].RIR >> 3); - } - - RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONumber].RIR; - /* Get the DLC */ - RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONumber].RDTR; - /* Get the FMI */ - RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDTR >> 8); - /* Get the data field */ - RxMessage->Data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDLR; - RxMessage->Data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 8); - RxMessage->Data[2] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 16); - RxMessage->Data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDLR >> 24); - RxMessage->Data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RDHR; - RxMessage->Data[5] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 8); - RxMessage->Data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 16); - RxMessage->Data[7] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RDHR >> 24); - /* Release the FIFO */ - /* Release FIFO0 */ - if (FIFONumber == CAN_FIFO0) - { - CANx->RF0R |= CAN_RF0R_RFOM0; - } - /* Release FIFO1 */ - else /* FIFONumber == CAN_FIFO1 */ - { - CANx->RF1R |= CAN_RF1R_RFOM1; - } -} - -/** - * @brief Releases the specified receive FIFO. - * @param CANx: where x can be 1 or 2 to select the CAN peripheral. - * @param FIFONumber: FIFO to release, CAN_FIFO0 or CAN_FIFO1. - * @retval None - */ -void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_FIFO(FIFONumber)); - /* Release FIFO0 */ - if (FIFONumber == CAN_FIFO0) - { - CANx->RF0R |= CAN_RF0R_RFOM0; - } - /* Release FIFO1 */ - else /* FIFONumber == CAN_FIFO1 */ - { - CANx->RF1R |= CAN_RF1R_RFOM1; - } -} - -/** - * @brief Returns the number of pending received messages. - * @param CANx: where x can be 1 or 2 to select the CAN peripheral. - * @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1. - * @retval NbMessage : which is the number of pending message. - */ -uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber) -{ - uint8_t message_pending=0; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_FIFO(FIFONumber)); - if (FIFONumber == CAN_FIFO0) - { - message_pending = (uint8_t)(CANx->RF0R&(uint32_t)0x03); - } - else if (FIFONumber == CAN_FIFO1) - { - message_pending = (uint8_t)(CANx->RF1R&(uint32_t)0x03); - } - else - { - message_pending = 0; - } - return message_pending; -} -/** - * @} - */ - - -/** @defgroup CAN_Group4 CAN Operation modes functions - * @brief CAN Operation modes functions - * -@verbatim - =============================================================================== - CAN Operation modes functions - =============================================================================== - This section provides functions allowing to select the CAN Operation modes - - sleep mode - - normal mode - - initialization mode - -@endverbatim - * @{ - */ - - -/** - * @brief Selects the CAN Operation mode. - * @param CAN_OperatingMode: CAN Operating Mode. - * This parameter can be one of @ref CAN_OperatingMode_TypeDef enumeration. - * @retval status of the requested mode which can be - * - CAN_ModeStatus_Failed: CAN failed entering the specific mode - * - CAN_ModeStatus_Success: CAN Succeed entering the specific mode - */ -uint8_t CAN_OperatingModeRequest(CAN_TypeDef* CANx, uint8_t CAN_OperatingMode) -{ - uint8_t status = CAN_ModeStatus_Failed; - - /* Timeout for INAK or also for SLAK bits*/ - uint32_t timeout = INAK_TIMEOUT; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_OPERATING_MODE(CAN_OperatingMode)); - - if (CAN_OperatingMode == CAN_OperatingMode_Initialization) - { - /* Request initialisation */ - CANx->MCR = (uint32_t)((CANx->MCR & (uint32_t)(~(uint32_t)CAN_MCR_SLEEP)) | CAN_MCR_INRQ); - - /* Wait the acknowledge */ - while (((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_INAK) && (timeout != 0)) - { - timeout--; - } - if ((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_INAK) - { - status = CAN_ModeStatus_Failed; - } - else - { - status = CAN_ModeStatus_Success; - } - } - else if (CAN_OperatingMode == CAN_OperatingMode_Normal) - { - /* Request leave initialisation and sleep mode and enter Normal mode */ - CANx->MCR &= (uint32_t)(~(CAN_MCR_SLEEP|CAN_MCR_INRQ)); - - /* Wait the acknowledge */ - while (((CANx->MSR & CAN_MODE_MASK) != 0) && (timeout!=0)) - { - timeout--; - } - if ((CANx->MSR & CAN_MODE_MASK) != 0) - { - status = CAN_ModeStatus_Failed; - } - else - { - status = CAN_ModeStatus_Success; - } - } - else if (CAN_OperatingMode == CAN_OperatingMode_Sleep) - { - /* Request Sleep mode */ - CANx->MCR = (uint32_t)((CANx->MCR & (uint32_t)(~(uint32_t)CAN_MCR_INRQ)) | CAN_MCR_SLEEP); - - /* Wait the acknowledge */ - while (((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_SLAK) && (timeout!=0)) - { - timeout--; - } - if ((CANx->MSR & CAN_MODE_MASK) != CAN_MSR_SLAK) - { - status = CAN_ModeStatus_Failed; - } - else - { - status = CAN_ModeStatus_Success; - } - } - else - { - status = CAN_ModeStatus_Failed; - } - - return (uint8_t) status; -} - -/** - * @brief Enters the Sleep (low power) mode. - * @param CANx: where x can be 1 or 2 to select the CAN peripheral. - * @retval CAN_Sleep_Ok if sleep entered, CAN_Sleep_Failed otherwise. - */ -uint8_t CAN_Sleep(CAN_TypeDef* CANx) -{ - uint8_t sleepstatus = CAN_Sleep_Failed; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Request Sleep mode */ - CANx->MCR = (((CANx->MCR) & (uint32_t)(~(uint32_t)CAN_MCR_INRQ)) | CAN_MCR_SLEEP); - - /* Sleep mode status */ - if ((CANx->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) == CAN_MSR_SLAK) - { - /* Sleep mode not entered */ - sleepstatus = CAN_Sleep_Ok; - } - /* return sleep mode status */ - return (uint8_t)sleepstatus; -} - -/** - * @brief Wakes up the CAN peripheral from sleep mode . - * @param CANx: where x can be 1 or 2 to select the CAN peripheral. - * @retval CAN_WakeUp_Ok if sleep mode left, CAN_WakeUp_Failed otherwise. - */ -uint8_t CAN_WakeUp(CAN_TypeDef* CANx) -{ - uint32_t wait_slak = SLAK_TIMEOUT; - uint8_t wakeupstatus = CAN_WakeUp_Failed; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Wake up request */ - CANx->MCR &= ~(uint32_t)CAN_MCR_SLEEP; - - /* Sleep mode status */ - while(((CANx->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK)&&(wait_slak!=0x00)) - { - wait_slak--; - } - if((CANx->MSR & CAN_MSR_SLAK) != CAN_MSR_SLAK) - { - /* wake up done : Sleep mode exited */ - wakeupstatus = CAN_WakeUp_Ok; - } - /* return wakeup status */ - return (uint8_t)wakeupstatus; -} -/** - * @} - */ - - -/** @defgroup CAN_Group5 CAN Bus Error management functions - * @brief CAN Bus Error management functions - * -@verbatim - =============================================================================== - CAN Bus Error management functions - =============================================================================== - This section provides functions allowing to - - Return the CANx's last error code (LEC) - - Return the CANx Receive Error Counter (REC) - - Return the LSB of the 9-bit CANx Transmit Error Counter(TEC). - - @note If TEC is greater than 255, The CAN is in bus-off state. - @note if REC or TEC are greater than 96, an Error warning flag occurs. - @note if REC or TEC are greater than 127, an Error Passive Flag occurs. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the CANx's last error code (LEC). - * @param CANx: where x can be 1 or 2 to select the CAN peripheral. - * @retval Error code: - * - CAN_ERRORCODE_NoErr: No Error - * - CAN_ERRORCODE_StuffErr: Stuff Error - * - CAN_ERRORCODE_FormErr: Form Error - * - CAN_ERRORCODE_ACKErr : Acknowledgment Error - * - CAN_ERRORCODE_BitRecessiveErr: Bit Recessive Error - * - CAN_ERRORCODE_BitDominantErr: Bit Dominant Error - * - CAN_ERRORCODE_CRCErr: CRC Error - * - CAN_ERRORCODE_SoftwareSetErr: Software Set Error - */ -uint8_t CAN_GetLastErrorCode(CAN_TypeDef* CANx) -{ - uint8_t errorcode=0; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Get the error code*/ - errorcode = (((uint8_t)CANx->ESR) & (uint8_t)CAN_ESR_LEC); - - /* Return the error code*/ - return errorcode; -} - -/** - * @brief Returns the CANx Receive Error Counter (REC). - * @note In case of an error during reception, this counter is incremented - * by 1 or by 8 depending on the error condition as defined by the CAN - * standard. After every successful reception, the counter is - * decremented by 1 or reset to 120 if its value was higher than 128. - * When the counter value exceeds 127, the CAN controller enters the - * error passive state. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @retval CAN Receive Error Counter. - */ -uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef* CANx) -{ - uint8_t counter=0; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Get the Receive Error Counter*/ - counter = (uint8_t)((CANx->ESR & CAN_ESR_REC)>> 24); - - /* Return the Receive Error Counter*/ - return counter; -} - - -/** - * @brief Returns the LSB of the 9-bit CANx Transmit Error Counter(TEC). - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @retval LSB of the 9-bit CAN Transmit Error Counter. - */ -uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef* CANx) -{ - uint8_t counter=0; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - - /* Get the LSB of the 9-bit CANx Transmit Error Counter(TEC) */ - counter = (uint8_t)((CANx->ESR & CAN_ESR_TEC)>> 16); - - /* Return the LSB of the 9-bit CANx Transmit Error Counter(TEC) */ - return counter; -} -/** - * @} - */ - -/** @defgroup CAN_Group6 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - - This section provides functions allowing to configure the CAN Interrupts and - to get the status and clear flags and Interrupts pending bits. - - The CAN provides 14 Interrupts sources and 15 Flags: - - =============== - Flags : - =============== - The 15 flags can be divided on 4 groups: - - A. Transmit Flags - ----------------------- - CAN_FLAG_RQCP0, - CAN_FLAG_RQCP1, - CAN_FLAG_RQCP2 : Request completed MailBoxes 0, 1 and 2 Flags - Set when when the last request (transmit or abort) has - been performed. - - B. Receive Flags - ----------------------- - - CAN_FLAG_FMP0, - CAN_FLAG_FMP1 : FIFO 0 and 1 Message Pending Flags - set to signal that messages are pending in the receive - FIFO. - These Flags are cleared only by hardware. - - CAN_FLAG_FF0, - CAN_FLAG_FF1 : FIFO 0 and 1 Full Flags - set when three messages are stored in the selected - FIFO. - - CAN_FLAG_FOV0 - CAN_FLAG_FOV1 : FIFO 0 and 1 Overrun Flags - set when a new message has been received and passed - the filter while the FIFO was full. - - C. Operating Mode Flags - ----------------------- - CAN_FLAG_WKU : Wake up Flag - set to signal that a SOF bit has been detected while - the CAN hardware was in Sleep mode. - - CAN_FLAG_SLAK : Sleep acknowledge Flag - Set to signal that the CAN has entered Sleep Mode. - - D. Error Flags - ----------------------- - CAN_FLAG_EWG : Error Warning Flag - Set when the warning limit has been reached (Receive - Error Counter or Transmit Error Counter greater than 96). - This Flag is cleared only by hardware. - - CAN_FLAG_EPV : Error Passive Flag - Set when the Error Passive limit has been reached - (Receive Error Counter or Transmit Error Counter - greater than 127). - This Flag is cleared only by hardware. - - CAN_FLAG_BOF : Bus-Off Flag - set when CAN enters the bus-off state. The bus-off - state is entered on TEC overflow, greater than 255. - This Flag is cleared only by hardware. - - CAN_FLAG_LEC : Last error code Flag - set If a message has been transferred (reception or - transmission) with error, and the error code is hold. - - =============== - Interrupts : - =============== - The 14 interrupts can be divided on 4 groups: - - A. Transmit interrupt - ----------------------- - CAN_IT_TME : Transmit mailbox empty Interrupt - if enabled, this interrupt source is pending when - no transmit request are pending for Tx mailboxes. - - B. Receive Interrupts - ----------------------- - CAN_IT_FMP0, - CAN_IT_FMP1 : FIFO 0 and FIFO1 message pending Interrupts - if enabled, these interrupt sources are pending when - messages are pending in the receive FIFO. - The corresponding interrupt pending bits are cleared - only by hardware. - - CAN_IT_FF0, - CAN_IT_FF1 : FIFO 0 and FIFO1 full Interrupts - if enabled, these interrupt sources are pending when - three messages are stored in the selected FIFO. - - CAN_IT_FOV0, - CAN_IT_FOV1 : FIFO 0 and FIFO1 overrun Interrupts - if enabled, these interrupt sources are pending when - a new message has been received and passed the filter - while the FIFO was full. - - C. Operating Mode Interrupts - ------------------------------- - CAN_IT_WKU : Wake-up Interrupt - if enabled, this interrupt source is pending when - a SOF bit has been detected while the CAN hardware was - in Sleep mode. - - CAN_IT_SLK : Sleep acknowledge Interrupt - if enabled, this interrupt source is pending when - the CAN has entered Sleep Mode. - - D. Error Interrupts - ----------------------- - CAN_IT_EWG : Error warning Interrupt - if enabled, this interrupt source is pending when - the warning limit has been reached (Receive Error - Counter or Transmit Error Counter=96). - - CAN_IT_EPV : Error passive Interrupt - if enabled, this interrupt source is pending when - the Error Passive limit has been reached (Receive - Error Counter or Transmit Error Counter>127). - - CAN_IT_BOF : Bus-off Interrupt - if enabled, this interrupt source is pending when - CAN enters the bus-off state. The bus-off state is - entered on TEC overflow, greater than 255. - This Flag is cleared only by hardware. - - CAN_IT_LEC : Last error code Interrupt - if enabled, this interrupt source is pending when - a message has been transferred (reception or - transmission) with error, and the error code is hold. - - CAN_IT_ERR : Error Interrupt - if enabled, this interrupt source is pending when - an error condition is pending. - - - Managing the CAN controller events : - ------------------------------------ - The user should identify which mode will be used in his application to manage - the CAN controller events: Polling mode or Interrupt mode. - - 1. In the Polling Mode it is advised to use the following functions: - - CAN_GetFlagStatus() : to check if flags events occur. - - CAN_ClearFlag() : to clear the flags events. - - - - 2. In the Interrupt Mode it is advised to use the following functions: - - CAN_ITConfig() : to enable or disable the interrupt source. - - CAN_GetITStatus() : to check if Interrupt occurs. - - CAN_ClearITPendingBit() : to clear the Interrupt pending Bit (corresponding Flag). - @note This function has no impact on CAN_IT_FMP0 and CAN_IT_FMP1 Interrupts - pending bits since there are cleared only by hardware. - -@endverbatim - * @{ - */ -/** - * @brief Enables or disables the specified CANx interrupts. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_IT: specifies the CAN interrupt sources to be enabled or disabled. - * This parameter can be: - * @arg CAN_IT_TME: Transmit mailbox empty Interrupt - * @arg CAN_IT_FMP0: FIFO 0 message pending Interrupt - * @arg CAN_IT_FF0: FIFO 0 full Interrupt - * @arg CAN_IT_FOV0: FIFO 0 overrun Interrupt - * @arg CAN_IT_FMP1: FIFO 1 message pending Interrupt - * @arg CAN_IT_FF1: FIFO 1 full Interrupt - * @arg CAN_IT_FOV1: FIFO 1 overrun Interrupt - * @arg CAN_IT_WKU: Wake-up Interrupt - * @arg CAN_IT_SLK: Sleep acknowledge Interrupt - * @arg CAN_IT_EWG: Error warning Interrupt - * @arg CAN_IT_EPV: Error passive Interrupt - * @arg CAN_IT_BOF: Bus-off Interrupt - * @arg CAN_IT_LEC: Last error code Interrupt - * @arg CAN_IT_ERR: Error Interrupt - * @param NewState: new state of the CAN interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_IT(CAN_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected CANx interrupt */ - CANx->IER |= CAN_IT; - } - else - { - /* Disable the selected CANx interrupt */ - CANx->IER &= ~CAN_IT; - } -} -/** - * @brief Checks whether the specified CAN flag is set or not. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg CAN_FLAG_RQCP0: Request MailBox0 Flag - * @arg CAN_FLAG_RQCP1: Request MailBox1 Flag - * @arg CAN_FLAG_RQCP2: Request MailBox2 Flag - * @arg CAN_FLAG_FMP0: FIFO 0 Message Pending Flag - * @arg CAN_FLAG_FF0: FIFO 0 Full Flag - * @arg CAN_FLAG_FOV0: FIFO 0 Overrun Flag - * @arg CAN_FLAG_FMP1: FIFO 1 Message Pending Flag - * @arg CAN_FLAG_FF1: FIFO 1 Full Flag - * @arg CAN_FLAG_FOV1: FIFO 1 Overrun Flag - * @arg CAN_FLAG_WKU: Wake up Flag - * @arg CAN_FLAG_SLAK: Sleep acknowledge Flag - * @arg CAN_FLAG_EWG: Error Warning Flag - * @arg CAN_FLAG_EPV: Error Passive Flag - * @arg CAN_FLAG_BOF: Bus-Off Flag - * @arg CAN_FLAG_LEC: Last error code Flag - * @retval The new state of CAN_FLAG (SET or RESET). - */ -FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG) -{ - FlagStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_GET_FLAG(CAN_FLAG)); - - - if((CAN_FLAG & CAN_FLAGS_ESR) != (uint32_t)RESET) - { - /* Check the status of the specified CAN flag */ - if ((CANx->ESR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) - { - /* CAN_FLAG is set */ - bitstatus = SET; - } - else - { - /* CAN_FLAG is reset */ - bitstatus = RESET; - } - } - else if((CAN_FLAG & CAN_FLAGS_MSR) != (uint32_t)RESET) - { - /* Check the status of the specified CAN flag */ - if ((CANx->MSR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) - { - /* CAN_FLAG is set */ - bitstatus = SET; - } - else - { - /* CAN_FLAG is reset */ - bitstatus = RESET; - } - } - else if((CAN_FLAG & CAN_FLAGS_TSR) != (uint32_t)RESET) - { - /* Check the status of the specified CAN flag */ - if ((CANx->TSR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) - { - /* CAN_FLAG is set */ - bitstatus = SET; - } - else - { - /* CAN_FLAG is reset */ - bitstatus = RESET; - } - } - else if((CAN_FLAG & CAN_FLAGS_RF0R) != (uint32_t)RESET) - { - /* Check the status of the specified CAN flag */ - if ((CANx->RF0R & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) - { - /* CAN_FLAG is set */ - bitstatus = SET; - } - else - { - /* CAN_FLAG is reset */ - bitstatus = RESET; - } - } - else /* If(CAN_FLAG & CAN_FLAGS_RF1R != (uint32_t)RESET) */ - { - /* Check the status of the specified CAN flag */ - if ((uint32_t)(CANx->RF1R & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) - { - /* CAN_FLAG is set */ - bitstatus = SET; - } - else - { - /* CAN_FLAG is reset */ - bitstatus = RESET; - } - } - /* Return the CAN_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the CAN's pending flags. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_FLAG: specifies the flag to clear. - * This parameter can be one of the following values: - * @arg CAN_FLAG_RQCP0: Request MailBox0 Flag - * @arg CAN_FLAG_RQCP1: Request MailBox1 Flag - * @arg CAN_FLAG_RQCP2: Request MailBox2 Flag - * @arg CAN_FLAG_FF0: FIFO 0 Full Flag - * @arg CAN_FLAG_FOV0: FIFO 0 Overrun Flag - * @arg CAN_FLAG_FF1: FIFO 1 Full Flag - * @arg CAN_FLAG_FOV1: FIFO 1 Overrun Flag - * @arg CAN_FLAG_WKU: Wake up Flag - * @arg CAN_FLAG_SLAK: Sleep acknowledge Flag - * @arg CAN_FLAG_LEC: Last error code Flag - * @retval None - */ -void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG) -{ - uint32_t flagtmp=0; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_CLEAR_FLAG(CAN_FLAG)); - - if (CAN_FLAG == CAN_FLAG_LEC) /* ESR register */ - { - /* Clear the selected CAN flags */ - CANx->ESR = (uint32_t)RESET; - } - else /* MSR or TSR or RF0R or RF1R */ - { - flagtmp = CAN_FLAG & 0x000FFFFF; - - if ((CAN_FLAG & CAN_FLAGS_RF0R)!=(uint32_t)RESET) - { - /* Receive Flags */ - CANx->RF0R = (uint32_t)(flagtmp); - } - else if ((CAN_FLAG & CAN_FLAGS_RF1R)!=(uint32_t)RESET) - { - /* Receive Flags */ - CANx->RF1R = (uint32_t)(flagtmp); - } - else if ((CAN_FLAG & CAN_FLAGS_TSR)!=(uint32_t)RESET) - { - /* Transmit Flags */ - CANx->TSR = (uint32_t)(flagtmp); - } - else /* If((CAN_FLAG & CAN_FLAGS_MSR)!=(uint32_t)RESET) */ - { - /* Operating mode Flags */ - CANx->MSR = (uint32_t)(flagtmp); - } - } -} - -/** - * @brief Checks whether the specified CANx interrupt has occurred or not. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_IT: specifies the CAN interrupt source to check. - * This parameter can be one of the following values: - * @arg CAN_IT_TME: Transmit mailbox empty Interrupt - * @arg CAN_IT_FMP0: FIFO 0 message pending Interrupt - * @arg CAN_IT_FF0: FIFO 0 full Interrupt - * @arg CAN_IT_FOV0: FIFO 0 overrun Interrupt - * @arg CAN_IT_FMP1: FIFO 1 message pending Interrupt - * @arg CAN_IT_FF1: FIFO 1 full Interrupt - * @arg CAN_IT_FOV1: FIFO 1 overrun Interrupt - * @arg CAN_IT_WKU: Wake-up Interrupt - * @arg CAN_IT_SLK: Sleep acknowledge Interrupt - * @arg CAN_IT_EWG: Error warning Interrupt - * @arg CAN_IT_EPV: Error passive Interrupt - * @arg CAN_IT_BOF: Bus-off Interrupt - * @arg CAN_IT_LEC: Last error code Interrupt - * @arg CAN_IT_ERR: Error Interrupt - * @retval The current state of CAN_IT (SET or RESET). - */ -ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT) -{ - ITStatus itstatus = RESET; - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_IT(CAN_IT)); - - /* check the interrupt enable bit */ - if((CANx->IER & CAN_IT) != RESET) - { - /* in case the Interrupt is enabled, .... */ - switch (CAN_IT) - { - case CAN_IT_TME: - /* Check CAN_TSR_RQCPx bits */ - itstatus = CheckITStatus(CANx->TSR, CAN_TSR_RQCP0|CAN_TSR_RQCP1|CAN_TSR_RQCP2); - break; - case CAN_IT_FMP0: - /* Check CAN_RF0R_FMP0 bit */ - itstatus = CheckITStatus(CANx->RF0R, CAN_RF0R_FMP0); - break; - case CAN_IT_FF0: - /* Check CAN_RF0R_FULL0 bit */ - itstatus = CheckITStatus(CANx->RF0R, CAN_RF0R_FULL0); - break; - case CAN_IT_FOV0: - /* Check CAN_RF0R_FOVR0 bit */ - itstatus = CheckITStatus(CANx->RF0R, CAN_RF0R_FOVR0); - break; - case CAN_IT_FMP1: - /* Check CAN_RF1R_FMP1 bit */ - itstatus = CheckITStatus(CANx->RF1R, CAN_RF1R_FMP1); - break; - case CAN_IT_FF1: - /* Check CAN_RF1R_FULL1 bit */ - itstatus = CheckITStatus(CANx->RF1R, CAN_RF1R_FULL1); - break; - case CAN_IT_FOV1: - /* Check CAN_RF1R_FOVR1 bit */ - itstatus = CheckITStatus(CANx->RF1R, CAN_RF1R_FOVR1); - break; - case CAN_IT_WKU: - /* Check CAN_MSR_WKUI bit */ - itstatus = CheckITStatus(CANx->MSR, CAN_MSR_WKUI); - break; - case CAN_IT_SLK: - /* Check CAN_MSR_SLAKI bit */ - itstatus = CheckITStatus(CANx->MSR, CAN_MSR_SLAKI); - break; - case CAN_IT_EWG: - /* Check CAN_ESR_EWGF bit */ - itstatus = CheckITStatus(CANx->ESR, CAN_ESR_EWGF); - break; - case CAN_IT_EPV: - /* Check CAN_ESR_EPVF bit */ - itstatus = CheckITStatus(CANx->ESR, CAN_ESR_EPVF); - break; - case CAN_IT_BOF: - /* Check CAN_ESR_BOFF bit */ - itstatus = CheckITStatus(CANx->ESR, CAN_ESR_BOFF); - break; - case CAN_IT_LEC: - /* Check CAN_ESR_LEC bit */ - itstatus = CheckITStatus(CANx->ESR, CAN_ESR_LEC); - break; - case CAN_IT_ERR: - /* Check CAN_MSR_ERRI bit */ - itstatus = CheckITStatus(CANx->MSR, CAN_MSR_ERRI); - break; - default: - /* in case of error, return RESET */ - itstatus = RESET; - break; - } - } - else - { - /* in case the Interrupt is not enabled, return RESET */ - itstatus = RESET; - } - - /* Return the CAN_IT status */ - return itstatus; -} - -/** - * @brief Clears the CANx's interrupt pending bits. - * @param CANx: where x can be 1 or 2 to to select the CAN peripheral. - * @param CAN_IT: specifies the interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg CAN_IT_TME: Transmit mailbox empty Interrupt - * @arg CAN_IT_FF0: FIFO 0 full Interrupt - * @arg CAN_IT_FOV0: FIFO 0 overrun Interrupt - * @arg CAN_IT_FF1: FIFO 1 full Interrupt - * @arg CAN_IT_FOV1: FIFO 1 overrun Interrupt - * @arg CAN_IT_WKU: Wake-up Interrupt - * @arg CAN_IT_SLK: Sleep acknowledge Interrupt - * @arg CAN_IT_EWG: Error warning Interrupt - * @arg CAN_IT_EPV: Error passive Interrupt - * @arg CAN_IT_BOF: Bus-off Interrupt - * @arg CAN_IT_LEC: Last error code Interrupt - * @arg CAN_IT_ERR: Error Interrupt - * @retval None - */ -void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT) -{ - /* Check the parameters */ - assert_param(IS_CAN_ALL_PERIPH(CANx)); - assert_param(IS_CAN_CLEAR_IT(CAN_IT)); - - switch (CAN_IT) - { - case CAN_IT_TME: - /* Clear CAN_TSR_RQCPx (rc_w1)*/ - CANx->TSR = CAN_TSR_RQCP0|CAN_TSR_RQCP1|CAN_TSR_RQCP2; - break; - case CAN_IT_FF0: - /* Clear CAN_RF0R_FULL0 (rc_w1)*/ - CANx->RF0R = CAN_RF0R_FULL0; - break; - case CAN_IT_FOV0: - /* Clear CAN_RF0R_FOVR0 (rc_w1)*/ - CANx->RF0R = CAN_RF0R_FOVR0; - break; - case CAN_IT_FF1: - /* Clear CAN_RF1R_FULL1 (rc_w1)*/ - CANx->RF1R = CAN_RF1R_FULL1; - break; - case CAN_IT_FOV1: - /* Clear CAN_RF1R_FOVR1 (rc_w1)*/ - CANx->RF1R = CAN_RF1R_FOVR1; - break; - case CAN_IT_WKU: - /* Clear CAN_MSR_WKUI (rc_w1)*/ - CANx->MSR = CAN_MSR_WKUI; - break; - case CAN_IT_SLK: - /* Clear CAN_MSR_SLAKI (rc_w1)*/ - CANx->MSR = CAN_MSR_SLAKI; - break; - case CAN_IT_EWG: - /* Clear CAN_MSR_ERRI (rc_w1) */ - CANx->MSR = CAN_MSR_ERRI; - /* @note the corresponding Flag is cleared by hardware depending on the CAN Bus status*/ - break; - case CAN_IT_EPV: - /* Clear CAN_MSR_ERRI (rc_w1) */ - CANx->MSR = CAN_MSR_ERRI; - /* @note the corresponding Flag is cleared by hardware depending on the CAN Bus status*/ - break; - case CAN_IT_BOF: - /* Clear CAN_MSR_ERRI (rc_w1) */ - CANx->MSR = CAN_MSR_ERRI; - /* @note the corresponding Flag is cleared by hardware depending on the CAN Bus status*/ - break; - case CAN_IT_LEC: - /* Clear LEC bits */ - CANx->ESR = RESET; - /* Clear CAN_MSR_ERRI (rc_w1) */ - CANx->MSR = CAN_MSR_ERRI; - break; - case CAN_IT_ERR: - /*Clear LEC bits */ - CANx->ESR = RESET; - /* Clear CAN_MSR_ERRI (rc_w1) */ - CANx->MSR = CAN_MSR_ERRI; - /* @note BOFF, EPVF and EWGF Flags are cleared by hardware depending on the CAN Bus status*/ - break; - default: - break; - } -} - /** - * @} - */ - -/** - * @brief Checks whether the CAN interrupt has occurred or not. - * @param CAN_Reg: specifies the CAN interrupt register to check. - * @param It_Bit: specifies the interrupt source bit to check. - * @retval The new state of the CAN Interrupt (SET or RESET). - */ -static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit) -{ - ITStatus pendingbitstatus = RESET; - - if ((CAN_Reg & It_Bit) != (uint32_t)RESET) - { - /* CAN_IT is set */ - pendingbitstatus = SET; - } - else - { - /* CAN_IT is reset */ - pendingbitstatus = RESET; - } - return pendingbitstatus; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_can.h b/car_hw/src/lib/stdperiph/stm32f4xx_can.h deleted file mode 100644 index 46d92b36691..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_can.h +++ /dev/null @@ -1,638 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_can.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the CAN firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_CAN_H -#define __STM32F4xx_CAN_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup CAN - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -#define IS_CAN_ALL_PERIPH(PERIPH) (((PERIPH) == CAN1) || \ - ((PERIPH) == CAN2)) - -/** - * @brief CAN init structure definition - */ -typedef struct -{ - uint16_t CAN_Prescaler; /*!< Specifies the length of a time quantum. - It ranges from 1 to 1024. */ - - uint8_t CAN_Mode; /*!< Specifies the CAN operating mode. - This parameter can be a value of @ref CAN_operating_mode */ - - uint8_t CAN_SJW; /*!< Specifies the maximum number of time quanta - the CAN hardware is allowed to lengthen or - shorten a bit to perform resynchronization. - This parameter can be a value of @ref CAN_synchronisation_jump_width */ - - uint8_t CAN_BS1; /*!< Specifies the number of time quanta in Bit - Segment 1. This parameter can be a value of - @ref CAN_time_quantum_in_bit_segment_1 */ - - uint8_t CAN_BS2; /*!< Specifies the number of time quanta in Bit Segment 2. - This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_2 */ - - FunctionalState CAN_TTCM; /*!< Enable or disable the time triggered communication mode. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_ABOM; /*!< Enable or disable the automatic bus-off management. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_AWUM; /*!< Enable or disable the automatic wake-up mode. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_NART; /*!< Enable or disable the non-automatic retransmission mode. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_RFLM; /*!< Enable or disable the Receive FIFO Locked mode. - This parameter can be set either to ENABLE or DISABLE. */ - - FunctionalState CAN_TXFP; /*!< Enable or disable the transmit FIFO priority. - This parameter can be set either to ENABLE or DISABLE. */ -} CAN_InitTypeDef; - -/** - * @brief CAN filter init structure definition - */ -typedef struct -{ - uint16_t CAN_FilterIdHigh; /*!< Specifies the filter identification number (MSBs for a 32-bit - configuration, first one for a 16-bit configuration). - This parameter can be a value between 0x0000 and 0xFFFF */ - - uint16_t CAN_FilterIdLow; /*!< Specifies the filter identification number (LSBs for a 32-bit - configuration, second one for a 16-bit configuration). - This parameter can be a value between 0x0000 and 0xFFFF */ - - uint16_t CAN_FilterMaskIdHigh; /*!< Specifies the filter mask number or identification number, - according to the mode (MSBs for a 32-bit configuration, - first one for a 16-bit configuration). - This parameter can be a value between 0x0000 and 0xFFFF */ - - uint16_t CAN_FilterMaskIdLow; /*!< Specifies the filter mask number or identification number, - according to the mode (LSBs for a 32-bit configuration, - second one for a 16-bit configuration). - This parameter can be a value between 0x0000 and 0xFFFF */ - - uint16_t CAN_FilterFIFOAssignment; /*!< Specifies the FIFO (0 or 1) which will be assigned to the filter. - This parameter can be a value of @ref CAN_filter_FIFO */ - - uint8_t CAN_FilterNumber; /*!< Specifies the filter which will be initialized. It ranges from 0 to 13. */ - - uint8_t CAN_FilterMode; /*!< Specifies the filter mode to be initialized. - This parameter can be a value of @ref CAN_filter_mode */ - - uint8_t CAN_FilterScale; /*!< Specifies the filter scale. - This parameter can be a value of @ref CAN_filter_scale */ - - FunctionalState CAN_FilterActivation; /*!< Enable or disable the filter. - This parameter can be set either to ENABLE or DISABLE. */ -} CAN_FilterInitTypeDef; - -/** - * @brief CAN Tx message structure definition - */ -typedef struct -{ - uint32_t StdId; /*!< Specifies the standard identifier. - This parameter can be a value between 0 to 0x7FF. */ - - uint32_t ExtId; /*!< Specifies the extended identifier. - This parameter can be a value between 0 to 0x1FFFFFFF. */ - - uint8_t IDE; /*!< Specifies the type of identifier for the message that - will be transmitted. This parameter can be a value - of @ref CAN_identifier_type */ - - uint8_t RTR; /*!< Specifies the type of frame for the message that will - be transmitted. This parameter can be a value of - @ref CAN_remote_transmission_request */ - - uint8_t DLC; /*!< Specifies the length of the frame that will be - transmitted. This parameter can be a value between - 0 to 8 */ - - uint8_t Data[8]; /*!< Contains the data to be transmitted. It ranges from 0 - to 0xFF. */ -} CanTxMsg; - -/** - * @brief CAN Rx message structure definition - */ -typedef struct -{ - uint32_t StdId; /*!< Specifies the standard identifier. - This parameter can be a value between 0 to 0x7FF. */ - - uint32_t ExtId; /*!< Specifies the extended identifier. - This parameter can be a value between 0 to 0x1FFFFFFF. */ - - uint8_t IDE; /*!< Specifies the type of identifier for the message that - will be received. This parameter can be a value of - @ref CAN_identifier_type */ - - uint8_t RTR; /*!< Specifies the type of frame for the received message. - This parameter can be a value of - @ref CAN_remote_transmission_request */ - - uint8_t DLC; /*!< Specifies the length of the frame that will be received. - This parameter can be a value between 0 to 8 */ - - uint8_t Data[8]; /*!< Contains the data to be received. It ranges from 0 to - 0xFF. */ - - uint8_t FMI; /*!< Specifies the index of the filter the message stored in - the mailbox passes through. This parameter can be a - value between 0 to 0xFF */ -} CanRxMsg; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CAN_Exported_Constants - * @{ - */ - -/** @defgroup CAN_InitStatus - * @{ - */ - -#define CAN_InitStatus_Failed ((uint8_t)0x00) /*!< CAN initialization failed */ -#define CAN_InitStatus_Success ((uint8_t)0x01) /*!< CAN initialization OK */ - - -/* Legacy defines */ -#define CANINITFAILED CAN_InitStatus_Failed -#define CANINITOK CAN_InitStatus_Success -/** - * @} - */ - -/** @defgroup CAN_operating_mode - * @{ - */ - -#define CAN_Mode_Normal ((uint8_t)0x00) /*!< normal mode */ -#define CAN_Mode_LoopBack ((uint8_t)0x01) /*!< loopback mode */ -#define CAN_Mode_Silent ((uint8_t)0x02) /*!< silent mode */ -#define CAN_Mode_Silent_LoopBack ((uint8_t)0x03) /*!< loopback combined with silent mode */ - -#define IS_CAN_MODE(MODE) (((MODE) == CAN_Mode_Normal) || \ - ((MODE) == CAN_Mode_LoopBack)|| \ - ((MODE) == CAN_Mode_Silent) || \ - ((MODE) == CAN_Mode_Silent_LoopBack)) -/** - * @} - */ - - - /** - * @defgroup CAN_operating_mode - * @{ - */ -#define CAN_OperatingMode_Initialization ((uint8_t)0x00) /*!< Initialization mode */ -#define CAN_OperatingMode_Normal ((uint8_t)0x01) /*!< Normal mode */ -#define CAN_OperatingMode_Sleep ((uint8_t)0x02) /*!< sleep mode */ - - -#define IS_CAN_OPERATING_MODE(MODE) (((MODE) == CAN_OperatingMode_Initialization) ||\ - ((MODE) == CAN_OperatingMode_Normal)|| \ - ((MODE) == CAN_OperatingMode_Sleep)) -/** - * @} - */ - -/** - * @defgroup CAN_operating_mode_status - * @{ - */ - -#define CAN_ModeStatus_Failed ((uint8_t)0x00) /*!< CAN entering the specific mode failed */ -#define CAN_ModeStatus_Success ((uint8_t)!CAN_ModeStatus_Failed) /*!< CAN entering the specific mode Succeed */ -/** - * @} - */ - -/** @defgroup CAN_synchronisation_jump_width - * @{ - */ -#define CAN_SJW_1tq ((uint8_t)0x00) /*!< 1 time quantum */ -#define CAN_SJW_2tq ((uint8_t)0x01) /*!< 2 time quantum */ -#define CAN_SJW_3tq ((uint8_t)0x02) /*!< 3 time quantum */ -#define CAN_SJW_4tq ((uint8_t)0x03) /*!< 4 time quantum */ - -#define IS_CAN_SJW(SJW) (((SJW) == CAN_SJW_1tq) || ((SJW) == CAN_SJW_2tq)|| \ - ((SJW) == CAN_SJW_3tq) || ((SJW) == CAN_SJW_4tq)) -/** - * @} - */ - -/** @defgroup CAN_time_quantum_in_bit_segment_1 - * @{ - */ -#define CAN_BS1_1tq ((uint8_t)0x00) /*!< 1 time quantum */ -#define CAN_BS1_2tq ((uint8_t)0x01) /*!< 2 time quantum */ -#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */ -#define CAN_BS1_4tq ((uint8_t)0x03) /*!< 4 time quantum */ -#define CAN_BS1_5tq ((uint8_t)0x04) /*!< 5 time quantum */ -#define CAN_BS1_6tq ((uint8_t)0x05) /*!< 6 time quantum */ -#define CAN_BS1_7tq ((uint8_t)0x06) /*!< 7 time quantum */ -#define CAN_BS1_8tq ((uint8_t)0x07) /*!< 8 time quantum */ -#define CAN_BS1_9tq ((uint8_t)0x08) /*!< 9 time quantum */ -#define CAN_BS1_10tq ((uint8_t)0x09) /*!< 10 time quantum */ -#define CAN_BS1_11tq ((uint8_t)0x0A) /*!< 11 time quantum */ -#define CAN_BS1_12tq ((uint8_t)0x0B) /*!< 12 time quantum */ -#define CAN_BS1_13tq ((uint8_t)0x0C) /*!< 13 time quantum */ -#define CAN_BS1_14tq ((uint8_t)0x0D) /*!< 14 time quantum */ -#define CAN_BS1_15tq ((uint8_t)0x0E) /*!< 15 time quantum */ -#define CAN_BS1_16tq ((uint8_t)0x0F) /*!< 16 time quantum */ - -#define IS_CAN_BS1(BS1) ((BS1) <= CAN_BS1_16tq) -/** - * @} - */ - -/** @defgroup CAN_time_quantum_in_bit_segment_2 - * @{ - */ -#define CAN_BS2_1tq ((uint8_t)0x00) /*!< 1 time quantum */ -#define CAN_BS2_2tq ((uint8_t)0x01) /*!< 2 time quantum */ -#define CAN_BS2_3tq ((uint8_t)0x02) /*!< 3 time quantum */ -#define CAN_BS2_4tq ((uint8_t)0x03) /*!< 4 time quantum */ -#define CAN_BS2_5tq ((uint8_t)0x04) /*!< 5 time quantum */ -#define CAN_BS2_6tq ((uint8_t)0x05) /*!< 6 time quantum */ -#define CAN_BS2_7tq ((uint8_t)0x06) /*!< 7 time quantum */ -#define CAN_BS2_8tq ((uint8_t)0x07) /*!< 8 time quantum */ - -#define IS_CAN_BS2(BS2) ((BS2) <= CAN_BS2_8tq) -/** - * @} - */ - -/** @defgroup CAN_clock_prescaler - * @{ - */ -#define IS_CAN_PRESCALER(PRESCALER) (((PRESCALER) >= 1) && ((PRESCALER) <= 1024)) -/** - * @} - */ - -/** @defgroup CAN_filter_number - * @{ - */ -#define IS_CAN_FILTER_NUMBER(NUMBER) ((NUMBER) <= 27) -/** - * @} - */ - -/** @defgroup CAN_filter_mode - * @{ - */ -#define CAN_FilterMode_IdMask ((uint8_t)0x00) /*!< identifier/mask mode */ -#define CAN_FilterMode_IdList ((uint8_t)0x01) /*!< identifier list mode */ - -#define IS_CAN_FILTER_MODE(MODE) (((MODE) == CAN_FilterMode_IdMask) || \ - ((MODE) == CAN_FilterMode_IdList)) -/** - * @} - */ - -/** @defgroup CAN_filter_scale - * @{ - */ -#define CAN_FilterScale_16bit ((uint8_t)0x00) /*!< Two 16-bit filters */ -#define CAN_FilterScale_32bit ((uint8_t)0x01) /*!< One 32-bit filter */ - -#define IS_CAN_FILTER_SCALE(SCALE) (((SCALE) == CAN_FilterScale_16bit) || \ - ((SCALE) == CAN_FilterScale_32bit)) -/** - * @} - */ - -/** @defgroup CAN_filter_FIFO - * @{ - */ -#define CAN_Filter_FIFO0 ((uint8_t)0x00) /*!< Filter FIFO 0 assignment for filter x */ -#define CAN_Filter_FIFO1 ((uint8_t)0x01) /*!< Filter FIFO 1 assignment for filter x */ -#define IS_CAN_FILTER_FIFO(FIFO) (((FIFO) == CAN_FilterFIFO0) || \ - ((FIFO) == CAN_FilterFIFO1)) - -/* Legacy defines */ -#define CAN_FilterFIFO0 CAN_Filter_FIFO0 -#define CAN_FilterFIFO1 CAN_Filter_FIFO1 -/** - * @} - */ - -/** @defgroup CAN_Start_bank_filter_for_slave_CAN - * @{ - */ -#define IS_CAN_BANKNUMBER(BANKNUMBER) (((BANKNUMBER) >= 1) && ((BANKNUMBER) <= 27)) -/** - * @} - */ - -/** @defgroup CAN_Tx - * @{ - */ -#define IS_CAN_TRANSMITMAILBOX(TRANSMITMAILBOX) ((TRANSMITMAILBOX) <= ((uint8_t)0x02)) -#define IS_CAN_STDID(STDID) ((STDID) <= ((uint32_t)0x7FF)) -#define IS_CAN_EXTID(EXTID) ((EXTID) <= ((uint32_t)0x1FFFFFFF)) -#define IS_CAN_DLC(DLC) ((DLC) <= ((uint8_t)0x08)) -/** - * @} - */ - -/** @defgroup CAN_identifier_type - * @{ - */ -#define CAN_Id_Standard ((uint32_t)0x00000000) /*!< Standard Id */ -#define CAN_Id_Extended ((uint32_t)0x00000004) /*!< Extended Id */ -#define IS_CAN_IDTYPE(IDTYPE) (((IDTYPE) == CAN_Id_Standard) || \ - ((IDTYPE) == CAN_Id_Extended)) - -/* Legacy defines */ -#define CAN_ID_STD CAN_Id_Standard -#define CAN_ID_EXT CAN_Id_Extended -/** - * @} - */ - -/** @defgroup CAN_remote_transmission_request - * @{ - */ -#define CAN_RTR_Data ((uint32_t)0x00000000) /*!< Data frame */ -#define CAN_RTR_Remote ((uint32_t)0x00000002) /*!< Remote frame */ -#define IS_CAN_RTR(RTR) (((RTR) == CAN_RTR_Data) || ((RTR) == CAN_RTR_Remote)) - -/* Legacy defines */ -#define CAN_RTR_DATA CAN_RTR_Data -#define CAN_RTR_REMOTE CAN_RTR_Remote -/** - * @} - */ - -/** @defgroup CAN_transmit_constants - * @{ - */ -#define CAN_TxStatus_Failed ((uint8_t)0x00)/*!< CAN transmission failed */ -#define CAN_TxStatus_Ok ((uint8_t)0x01) /*!< CAN transmission succeeded */ -#define CAN_TxStatus_Pending ((uint8_t)0x02) /*!< CAN transmission pending */ -#define CAN_TxStatus_NoMailBox ((uint8_t)0x04) /*!< CAN cell did not provide - an empty mailbox */ -/* Legacy defines */ -#define CANTXFAILED CAN_TxStatus_Failed -#define CANTXOK CAN_TxStatus_Ok -#define CANTXPENDING CAN_TxStatus_Pending -#define CAN_NO_MB CAN_TxStatus_NoMailBox -/** - * @} - */ - -/** @defgroup CAN_receive_FIFO_number_constants - * @{ - */ -#define CAN_FIFO0 ((uint8_t)0x00) /*!< CAN FIFO 0 used to receive */ -#define CAN_FIFO1 ((uint8_t)0x01) /*!< CAN FIFO 1 used to receive */ - -#define IS_CAN_FIFO(FIFO) (((FIFO) == CAN_FIFO0) || ((FIFO) == CAN_FIFO1)) -/** - * @} - */ - -/** @defgroup CAN_sleep_constants - * @{ - */ -#define CAN_Sleep_Failed ((uint8_t)0x00) /*!< CAN did not enter the sleep mode */ -#define CAN_Sleep_Ok ((uint8_t)0x01) /*!< CAN entered the sleep mode */ - -/* Legacy defines */ -#define CANSLEEPFAILED CAN_Sleep_Failed -#define CANSLEEPOK CAN_Sleep_Ok -/** - * @} - */ - -/** @defgroup CAN_wake_up_constants - * @{ - */ -#define CAN_WakeUp_Failed ((uint8_t)0x00) /*!< CAN did not leave the sleep mode */ -#define CAN_WakeUp_Ok ((uint8_t)0x01) /*!< CAN leaved the sleep mode */ - -/* Legacy defines */ -#define CANWAKEUPFAILED CAN_WakeUp_Failed -#define CANWAKEUPOK CAN_WakeUp_Ok -/** - * @} - */ - -/** - * @defgroup CAN_Error_Code_constants - * @{ - */ -#define CAN_ErrorCode_NoErr ((uint8_t)0x00) /*!< No Error */ -#define CAN_ErrorCode_StuffErr ((uint8_t)0x10) /*!< Stuff Error */ -#define CAN_ErrorCode_FormErr ((uint8_t)0x20) /*!< Form Error */ -#define CAN_ErrorCode_ACKErr ((uint8_t)0x30) /*!< Acknowledgment Error */ -#define CAN_ErrorCode_BitRecessiveErr ((uint8_t)0x40) /*!< Bit Recessive Error */ -#define CAN_ErrorCode_BitDominantErr ((uint8_t)0x50) /*!< Bit Dominant Error */ -#define CAN_ErrorCode_CRCErr ((uint8_t)0x60) /*!< CRC Error */ -#define CAN_ErrorCode_SoftwareSetErr ((uint8_t)0x70) /*!< Software Set Error */ -/** - * @} - */ - -/** @defgroup CAN_flags - * @{ - */ -/* If the flag is 0x3XXXXXXX, it means that it can be used with CAN_GetFlagStatus() - and CAN_ClearFlag() functions. */ -/* If the flag is 0x1XXXXXXX, it means that it can only be used with - CAN_GetFlagStatus() function. */ - -/* Transmit Flags */ -#define CAN_FLAG_RQCP0 ((uint32_t)0x38000001) /*!< Request MailBox0 Flag */ -#define CAN_FLAG_RQCP1 ((uint32_t)0x38000100) /*!< Request MailBox1 Flag */ -#define CAN_FLAG_RQCP2 ((uint32_t)0x38010000) /*!< Request MailBox2 Flag */ - -/* Receive Flags */ -#define CAN_FLAG_FMP0 ((uint32_t)0x12000003) /*!< FIFO 0 Message Pending Flag */ -#define CAN_FLAG_FF0 ((uint32_t)0x32000008) /*!< FIFO 0 Full Flag */ -#define CAN_FLAG_FOV0 ((uint32_t)0x32000010) /*!< FIFO 0 Overrun Flag */ -#define CAN_FLAG_FMP1 ((uint32_t)0x14000003) /*!< FIFO 1 Message Pending Flag */ -#define CAN_FLAG_FF1 ((uint32_t)0x34000008) /*!< FIFO 1 Full Flag */ -#define CAN_FLAG_FOV1 ((uint32_t)0x34000010) /*!< FIFO 1 Overrun Flag */ - -/* Operating Mode Flags */ -#define CAN_FLAG_WKU ((uint32_t)0x31000008) /*!< Wake up Flag */ -#define CAN_FLAG_SLAK ((uint32_t)0x31000012) /*!< Sleep acknowledge Flag */ -/* @note When SLAK interrupt is disabled (SLKIE=0), no polling on SLAKI is possible. - In this case the SLAK bit can be polled.*/ - -/* Error Flags */ -#define CAN_FLAG_EWG ((uint32_t)0x10F00001) /*!< Error Warning Flag */ -#define CAN_FLAG_EPV ((uint32_t)0x10F00002) /*!< Error Passive Flag */ -#define CAN_FLAG_BOF ((uint32_t)0x10F00004) /*!< Bus-Off Flag */ -#define CAN_FLAG_LEC ((uint32_t)0x30F00070) /*!< Last error code Flag */ - -#define IS_CAN_GET_FLAG(FLAG) (((FLAG) == CAN_FLAG_LEC) || ((FLAG) == CAN_FLAG_BOF) || \ - ((FLAG) == CAN_FLAG_EPV) || ((FLAG) == CAN_FLAG_EWG) || \ - ((FLAG) == CAN_FLAG_WKU) || ((FLAG) == CAN_FLAG_FOV0) || \ - ((FLAG) == CAN_FLAG_FF0) || ((FLAG) == CAN_FLAG_FMP0) || \ - ((FLAG) == CAN_FLAG_FOV1) || ((FLAG) == CAN_FLAG_FF1) || \ - ((FLAG) == CAN_FLAG_FMP1) || ((FLAG) == CAN_FLAG_RQCP2) || \ - ((FLAG) == CAN_FLAG_RQCP1)|| ((FLAG) == CAN_FLAG_RQCP0) || \ - ((FLAG) == CAN_FLAG_SLAK )) - -#define IS_CAN_CLEAR_FLAG(FLAG)(((FLAG) == CAN_FLAG_LEC) || ((FLAG) == CAN_FLAG_RQCP2) || \ - ((FLAG) == CAN_FLAG_RQCP1) || ((FLAG) == CAN_FLAG_RQCP0) || \ - ((FLAG) == CAN_FLAG_FF0) || ((FLAG) == CAN_FLAG_FOV0) ||\ - ((FLAG) == CAN_FLAG_FF1) || ((FLAG) == CAN_FLAG_FOV1) || \ - ((FLAG) == CAN_FLAG_WKU) || ((FLAG) == CAN_FLAG_SLAK)) -/** - * @} - */ - - -/** @defgroup CAN_interrupts - * @{ - */ -#define CAN_IT_TME ((uint32_t)0x00000001) /*!< Transmit mailbox empty Interrupt*/ - -/* Receive Interrupts */ -#define CAN_IT_FMP0 ((uint32_t)0x00000002) /*!< FIFO 0 message pending Interrupt*/ -#define CAN_IT_FF0 ((uint32_t)0x00000004) /*!< FIFO 0 full Interrupt*/ -#define CAN_IT_FOV0 ((uint32_t)0x00000008) /*!< FIFO 0 overrun Interrupt*/ -#define CAN_IT_FMP1 ((uint32_t)0x00000010) /*!< FIFO 1 message pending Interrupt*/ -#define CAN_IT_FF1 ((uint32_t)0x00000020) /*!< FIFO 1 full Interrupt*/ -#define CAN_IT_FOV1 ((uint32_t)0x00000040) /*!< FIFO 1 overrun Interrupt*/ - -/* Operating Mode Interrupts */ -#define CAN_IT_WKU ((uint32_t)0x00010000) /*!< Wake-up Interrupt*/ -#define CAN_IT_SLK ((uint32_t)0x00020000) /*!< Sleep acknowledge Interrupt*/ - -/* Error Interrupts */ -#define CAN_IT_EWG ((uint32_t)0x00000100) /*!< Error warning Interrupt*/ -#define CAN_IT_EPV ((uint32_t)0x00000200) /*!< Error passive Interrupt*/ -#define CAN_IT_BOF ((uint32_t)0x00000400) /*!< Bus-off Interrupt*/ -#define CAN_IT_LEC ((uint32_t)0x00000800) /*!< Last error code Interrupt*/ -#define CAN_IT_ERR ((uint32_t)0x00008000) /*!< Error Interrupt*/ - -/* Flags named as Interrupts : kept only for FW compatibility */ -#define CAN_IT_RQCP0 CAN_IT_TME -#define CAN_IT_RQCP1 CAN_IT_TME -#define CAN_IT_RQCP2 CAN_IT_TME - - -#define IS_CAN_IT(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FMP0) ||\ - ((IT) == CAN_IT_FF0) || ((IT) == CAN_IT_FOV0) ||\ - ((IT) == CAN_IT_FMP1) || ((IT) == CAN_IT_FF1) ||\ - ((IT) == CAN_IT_FOV1) || ((IT) == CAN_IT_EWG) ||\ - ((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF) ||\ - ((IT) == CAN_IT_LEC) || ((IT) == CAN_IT_ERR) ||\ - ((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_SLK)) - -#define IS_CAN_CLEAR_IT(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FF0) ||\ - ((IT) == CAN_IT_FOV0)|| ((IT) == CAN_IT_FF1) ||\ - ((IT) == CAN_IT_FOV1)|| ((IT) == CAN_IT_EWG) ||\ - ((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF) ||\ - ((IT) == CAN_IT_LEC) || ((IT) == CAN_IT_ERR) ||\ - ((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_SLK)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the CAN configuration to the default reset state *****/ -void CAN_DeInit(CAN_TypeDef* CANx); - -/* Initialization and Configuration functions *********************************/ -uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct); -void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct); -void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct); -void CAN_SlaveStartBank(uint8_t CAN_BankNumber); -void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState); -void CAN_TTComModeCmd(CAN_TypeDef* CANx, FunctionalState NewState); - -/* CAN Frames Transmission functions ******************************************/ -uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage); -uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox); -void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox); - -/* CAN Frames Reception functions *********************************************/ -void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage); -void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber); -uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber); - -/* Operation modes functions **************************************************/ -uint8_t CAN_OperatingModeRequest(CAN_TypeDef* CANx, uint8_t CAN_OperatingMode); -uint8_t CAN_Sleep(CAN_TypeDef* CANx); -uint8_t CAN_WakeUp(CAN_TypeDef* CANx); - -/* CAN Bus Error management functions *****************************************/ -uint8_t CAN_GetLastErrorCode(CAN_TypeDef* CANx); -uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef* CANx); -uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef* CANx); - -/* Interrupts and flags management functions **********************************/ -void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState); -FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG); -void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG); -ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT); -void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_CAN_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_crc.c b/car_hw/src/lib/stdperiph/stm32f4xx_crc.c deleted file mode 100644 index 5709980803e..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_crc.c +++ /dev/null @@ -1,127 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_crc.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides all the CRC firmware functions. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_crc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup CRC - * @brief CRC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup CRC_Private_Functions - * @{ - */ - -/** - * @brief Resets the CRC Data register (DR). - * @param None - * @retval None - */ -void CRC_ResetDR(void) -{ - /* Reset CRC generator */ - CRC->CR = CRC_CR_RESET; -} - -/** - * @brief Computes the 32-bit CRC of a given data word(32-bit). - * @param Data: data word(32-bit) to compute its CRC - * @retval 32-bit CRC - */ -uint32_t CRC_CalcCRC(uint32_t Data) -{ - CRC->DR = Data; - - return (CRC->DR); -} - -/** - * @brief Computes the 32-bit CRC of a given buffer of data word(32-bit). - * @param pBuffer: pointer to the buffer containing the data to be computed - * @param BufferLength: length of the buffer to be computed - * @retval 32-bit CRC - */ -uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength) -{ - uint32_t index = 0; - - for(index = 0; index < BufferLength; index++) - { - CRC->DR = pBuffer[index]; - } - return (CRC->DR); -} - -/** - * @brief Returns the current CRC value. - * @param None - * @retval 32-bit CRC - */ -uint32_t CRC_GetCRC(void) -{ - return (CRC->DR); -} - -/** - * @brief Stores a 8-bit data in the Independent Data(ID) register. - * @param IDValue: 8-bit value to be stored in the ID register - * @retval None - */ -void CRC_SetIDRegister(uint8_t IDValue) -{ - CRC->IDR = IDValue; -} - -/** - * @brief Returns the 8-bit data stored in the Independent Data(ID) register - * @param None - * @retval 8-bit value of the ID register - */ -uint8_t CRC_GetIDRegister(void) -{ - return (CRC->IDR); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_crc.h b/car_hw/src/lib/stdperiph/stm32f4xx_crc.h deleted file mode 100644 index ace4ee9d108..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_crc.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_crc.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the CRC firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_CRC_H -#define __STM32F4xx_CRC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup CRC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CRC_Exported_Constants - * @{ - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -void CRC_ResetDR(void); -uint32_t CRC_CalcCRC(uint32_t Data); -uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength); -uint32_t CRC_GetCRC(void); -void CRC_SetIDRegister(uint8_t IDValue); -uint8_t CRC_GetIDRegister(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_CRC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_cryp.c b/car_hw/src/lib/stdperiph/stm32f4xx_cryp.c deleted file mode 100644 index 8a5b2aa75e5..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_cryp.c +++ /dev/null @@ -1,851 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_cryp.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Cryptographic processor (CRYP) peripheral: - * - Initialization and Configuration functions - * - Data treatment functions - * - Context swapping functions - * - DMA interface function - * - Interrupts and flags management - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - * 1. Enable the CRYP controller clock using - * RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, ENABLE); function. - * - * 2. Initialise the CRYP using CRYP_Init(), CRYP_KeyInit() and if - * needed CRYP_IVInit(). - * - * 3. Flush the IN and OUT FIFOs by using CRYP_FIFOFlush() function. - * - * 4. Enable the CRYP controller using the CRYP_Cmd() function. - * - * 5. If using DMA for Data input and output transfer, - * Activate the needed DMA Requests using CRYP_DMACmd() function - - * 6. If DMA is not used for data transfer, use CRYP_DataIn() and - * CRYP_DataOut() functions to enter data to IN FIFO and get result - * from OUT FIFO. - * - * 7. To control CRYP events you can use one of the following - * two methods: - * - Check on CRYP flags using the CRYP_GetFlagStatus() function. - * - Use CRYP interrupts through the function CRYP_ITConfig() at - * initialization phase and CRYP_GetITStatus() function into - * interrupt routines in processing phase. - * - * 8. Save and restore Cryptographic processor context using - * CRYP_SaveContext() and CRYP_RestoreContext() functions. - * - * - * =================================================================== - * Procedure to perform an encryption or a decryption - * =================================================================== - * - * Initialization - * =============== - * 1. Initialize the peripheral using CRYP_Init(), CRYP_KeyInit() and - * CRYP_IVInit functions: - * - Configure the key size (128-, 192- or 256-bit, in the AES only) - * - Enter the symmetric key - * - Configure the data type - * - In case of decryption in AES-ECB or AES-CBC, you must prepare - * the key: configure the key preparation mode. Then Enable the CRYP - * peripheral using CRYP_Cmd() function: the BUSY flag is set. - * Wait until BUSY flag is reset : the key is prepared for decryption - * - Configure the algorithm and chaining (the DES/TDES in ECB/CBC, the - * AES in ECB/CBC/CTR) - * - Configure the direction (encryption/decryption). - * - Write the initialization vectors (in CBC or CTR modes only) - * - * 2. Flush the IN and OUT FIFOs using the CRYP_FIFOFlush() function - * - * - * Basic Processing mode (polling mode) - * ==================================== - * 1. Enable the cryptographic processor using CRYP_Cmd() function. - * - * 2. Write the first blocks in the input FIFO (2 to 8 words) using - * CRYP_DataIn() function. - * - * 3. Repeat the following sequence until the complete message has been - * processed: - * - * a) Wait for flag CRYP_FLAG_OFNE occurs (using CRYP_GetFlagStatus() - * function), then read the OUT-FIFO using CRYP_DataOut() function - * (1 block or until the FIFO is empty) - * - * b) Wait for flag CRYP_FLAG_IFNF occurs, (using CRYP_GetFlagStatus() - * function then write the IN FIFO using CRYP_DataIn() function - * (1 block or until the FIFO is full) - * - * 4. At the end of the processing, CRYP_FLAG_BUSY flag will be reset and - * both FIFOs are empty (CRYP_FLAG_IFEM is set and CRYP_FLAG_OFNE is - * reset). You can disable the peripheral using CRYP_Cmd() function. - * - * Interrupts Processing mode - * =========================== - * In this mode, Processing is done when the data are transferred by the - * CPU during interrupts. - * - * 1. Enable the interrupts CRYP_IT_INI and CRYP_IT_OUTI using - * CRYP_ITConfig() function. - * - * 2. Enable the cryptographic processor using CRYP_Cmd() function. - * - * 3. In the CRYP_IT_INI interrupt handler : load the input message into the - * IN FIFO using CRYP_DataIn() function . You can load 2 or 4 words at a - * time, or load data until the IN FIFO is full. When the last word of - * the message has been entered into the IN FIFO, disable the CRYP_IT_INI - * interrupt (using CRYP_ITConfig() function). - * - * 4. In the CRYP_IT_OUTI interrupt handler : read the output message from - * the OUT FIFO using CRYP_DataOut() function. You can read 1 block (2 or - * 4 words) at a time or read data until the FIFO is empty. - * When the last word has been read, INIM=0, BUSY=0 and both FIFOs are - * empty (CRYP_FLAG_IFEM is set and CRYP_FLAG_OFNE is reset). - * You can disable the CRYP_IT_OUTI interrupt (using CRYP_ITConfig() - * function) and you can disable the peripheral using CRYP_Cmd() function. - * - * DMA Processing mode - * ==================== - * In this mode, Processing is done when the DMA is used to transfer the - * data from/to the memory. - * - * 1. Configure the DMA controller to transfer the input data from the - * memory using DMA_Init() function. - * The transfer length is the length of the message. - * As message padding is not managed by the peripheral, the message - * length must be an entire number of blocks. The data are transferred - * in burst mode. The burst length is 4 words in the AES and 2 or 4 - * words in the DES/TDES. The DMA should be configured to set an - * interrupt on transfer completion of the output data to indicate that - * the processing is finished. - * Refer to DMA peripheral driver for more details. - * - * 2. Enable the cryptographic processor using CRYP_Cmd() function. - * Enable the DMA requests CRYP_DMAReq_DataIN and CRYP_DMAReq_DataOUT - * using CRYP_DMACmd() function. - * - * 3. All the transfers and processing are managed by the DMA and the - * cryptographic processor. The DMA transfer complete interrupt indicates - * that the processing is complete. Both FIFOs are normally empty and - * CRYP_FLAG_BUSY flag is reset. - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_cryp.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup CRYP - * @brief CRYP driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define FLAG_MASK ((uint8_t)0x20) -#define MAX_TIMEOUT ((uint16_t)0xFFFF) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup CRYP_Private_Functions - * @{ - */ - -/** @defgroup CRYP_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - Initialization and Configuration functions - =============================================================================== - This section provides functions allowing to - - Initialize the cryptographic Processor using CRYP_Init() function - - Encrypt or Decrypt - - mode : TDES-ECB, TDES-CBC, - DES-ECB, DES-CBC, - AES-ECB, AES-CBC, AES-CTR, AES-Key - - DataType : 32-bit data, 16-bit data, bit data or bit-string - - Key Size (only in AES modes) - - Configure the Encrypt or Decrypt Key using CRYP_KeyInit() function - - Configure the Initialization Vectors(IV) for CBC and CTR modes using - CRYP_IVInit() function. - - Flushes the IN and OUT FIFOs : using CRYP_FIFOFlush() function. - - Enable or disable the CRYP Processor using CRYP_Cmd() function - - -@endverbatim - * @{ - */ -/** - * @brief Deinitializes the CRYP peripheral registers to their default reset values - * @param None - * @retval None - */ -void CRYP_DeInit(void) -{ - /* Enable CRYP reset state */ - RCC_AHB2PeriphResetCmd(RCC_AHB2Periph_CRYP, ENABLE); - - /* Release CRYP from reset state */ - RCC_AHB2PeriphResetCmd(RCC_AHB2Periph_CRYP, DISABLE); -} - -/** - * @brief Initializes the CRYP peripheral according to the specified parameters - * in the CRYP_InitStruct. - * @param CRYP_InitStruct: pointer to a CRYP_InitTypeDef structure that contains - * the configuration information for the CRYP peripheral. - * @retval None - */ -void CRYP_Init(CRYP_InitTypeDef* CRYP_InitStruct) -{ - /* Check the parameters */ - assert_param(IS_CRYP_ALGOMODE(CRYP_InitStruct->CRYP_AlgoMode)); - assert_param(IS_CRYP_DATATYPE(CRYP_InitStruct->CRYP_DataType)); - assert_param(IS_CRYP_ALGODIR(CRYP_InitStruct->CRYP_AlgoDir)); - - /* Select Algorithm mode*/ - CRYP->CR &= ~CRYP_CR_ALGOMODE; - CRYP->CR |= CRYP_InitStruct->CRYP_AlgoMode; - - /* Select dataType */ - CRYP->CR &= ~CRYP_CR_DATATYPE; - CRYP->CR |= CRYP_InitStruct->CRYP_DataType; - - /* select Key size (used only with AES algorithm) */ - if ((CRYP_InitStruct->CRYP_AlgoMode == CRYP_AlgoMode_AES_ECB) || - (CRYP_InitStruct->CRYP_AlgoMode == CRYP_AlgoMode_AES_CBC) || - (CRYP_InitStruct->CRYP_AlgoMode == CRYP_AlgoMode_AES_CTR) || - (CRYP_InitStruct->CRYP_AlgoMode == CRYP_AlgoMode_AES_Key)) - { - assert_param(IS_CRYP_KEYSIZE(CRYP_InitStruct->CRYP_KeySize)); - CRYP->CR &= ~CRYP_CR_KEYSIZE; - CRYP->CR |= CRYP_InitStruct->CRYP_KeySize; /* Key size and value must be - configured once the key has - been prepared */ - } - - /* Select data Direction */ - CRYP->CR &= ~CRYP_CR_ALGODIR; - CRYP->CR |= CRYP_InitStruct->CRYP_AlgoDir; -} - -/** - * @brief Fills each CRYP_InitStruct member with its default value. - * @param CRYP_InitStruct: pointer to a CRYP_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void CRYP_StructInit(CRYP_InitTypeDef* CRYP_InitStruct) -{ - /* Initialize the CRYP_AlgoDir member */ - CRYP_InitStruct->CRYP_AlgoDir = CRYP_AlgoDir_Encrypt; - - /* initialize the CRYP_AlgoMode member */ - CRYP_InitStruct->CRYP_AlgoMode = CRYP_AlgoMode_TDES_ECB; - - /* initialize the CRYP_DataType member */ - CRYP_InitStruct->CRYP_DataType = CRYP_DataType_32b; - - /* Initialize the CRYP_KeySize member */ - CRYP_InitStruct->CRYP_KeySize = CRYP_KeySize_128b; -} - -/** - * @brief Initializes the CRYP Keys according to the specified parameters in - * the CRYP_KeyInitStruct. - * @param CRYP_KeyInitStruct: pointer to a CRYP_KeyInitTypeDef structure that - * contains the configuration information for the CRYP Keys. - * @retval None - */ -void CRYP_KeyInit(CRYP_KeyInitTypeDef* CRYP_KeyInitStruct) -{ - /* Key Initialisation */ - CRYP->K0LR = CRYP_KeyInitStruct->CRYP_Key0Left; - CRYP->K0RR = CRYP_KeyInitStruct->CRYP_Key0Right; - CRYP->K1LR = CRYP_KeyInitStruct->CRYP_Key1Left; - CRYP->K1RR = CRYP_KeyInitStruct->CRYP_Key1Right; - CRYP->K2LR = CRYP_KeyInitStruct->CRYP_Key2Left; - CRYP->K2RR = CRYP_KeyInitStruct->CRYP_Key2Right; - CRYP->K3LR = CRYP_KeyInitStruct->CRYP_Key3Left; - CRYP->K3RR = CRYP_KeyInitStruct->CRYP_Key3Right; -} - -/** - * @brief Fills each CRYP_KeyInitStruct member with its default value. - * @param CRYP_KeyInitStruct: pointer to a CRYP_KeyInitTypeDef structure - * which will be initialized. - * @retval None - */ -void CRYP_KeyStructInit(CRYP_KeyInitTypeDef* CRYP_KeyInitStruct) -{ - CRYP_KeyInitStruct->CRYP_Key0Left = 0; - CRYP_KeyInitStruct->CRYP_Key0Right = 0; - CRYP_KeyInitStruct->CRYP_Key1Left = 0; - CRYP_KeyInitStruct->CRYP_Key1Right = 0; - CRYP_KeyInitStruct->CRYP_Key2Left = 0; - CRYP_KeyInitStruct->CRYP_Key2Right = 0; - CRYP_KeyInitStruct->CRYP_Key3Left = 0; - CRYP_KeyInitStruct->CRYP_Key3Right = 0; -} -/** - * @brief Initializes the CRYP Initialization Vectors(IV) according to the - * specified parameters in the CRYP_IVInitStruct. - * @param CRYP_IVInitStruct: pointer to a CRYP_IVInitTypeDef structure that contains - * the configuration information for the CRYP Initialization Vectors(IV). - * @retval None - */ -void CRYP_IVInit(CRYP_IVInitTypeDef* CRYP_IVInitStruct) -{ - CRYP->IV0LR = CRYP_IVInitStruct->CRYP_IV0Left; - CRYP->IV0RR = CRYP_IVInitStruct->CRYP_IV0Right; - CRYP->IV1LR = CRYP_IVInitStruct->CRYP_IV1Left; - CRYP->IV1RR = CRYP_IVInitStruct->CRYP_IV1Right; -} - -/** - * @brief Fills each CRYP_IVInitStruct member with its default value. - * @param CRYP_IVInitStruct: pointer to a CRYP_IVInitTypeDef Initialization - * Vectors(IV) structure which will be initialized. - * @retval None - */ -void CRYP_IVStructInit(CRYP_IVInitTypeDef* CRYP_IVInitStruct) -{ - CRYP_IVInitStruct->CRYP_IV0Left = 0; - CRYP_IVInitStruct->CRYP_IV0Right = 0; - CRYP_IVInitStruct->CRYP_IV1Left = 0; - CRYP_IVInitStruct->CRYP_IV1Right = 0; -} - -/** - * @brief Flushes the IN and OUT FIFOs (that is read and write pointers of the - * FIFOs are reset) - * @note The FIFOs must be flushed only when BUSY flag is reset. - * @param None - * @retval None - */ -void CRYP_FIFOFlush(void) -{ - /* Reset the read and write pointers of the FIFOs */ - CRYP->CR |= CRYP_CR_FFLUSH; -} - -/** - * @brief Enables or disables the CRYP peripheral. - * @param NewState: new state of the CRYP peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CRYP_Cmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Cryptographic processor */ - CRYP->CR |= CRYP_CR_CRYPEN; - } - else - { - /* Disable the Cryptographic processor */ - CRYP->CR &= ~CRYP_CR_CRYPEN; - } -} -/** - * @} - */ - -/** @defgroup CRYP_Group2 CRYP Data processing functions - * @brief CRYP Data processing functions - * -@verbatim - =============================================================================== - CRYP Data processing functions - =============================================================================== - This section provides functions allowing the encryption and decryption - operations: - - Enter data to be treated in the IN FIFO : using CRYP_DataIn() function. - - Get the data result from the OUT FIFO : using CRYP_DataOut() function. - -@endverbatim - * @{ - */ - -/** - * @brief Writes data in the Data Input register (DIN). - * @note After the DIN register has been read once or several times, - * the FIFO must be flushed (using CRYP_FIFOFlush() function). - * @param Data: data to write in Data Input register - * @retval None - */ -void CRYP_DataIn(uint32_t Data) -{ - CRYP->DR = Data; -} - -/** - * @brief Returns the last data entered into the output FIFO. - * @param None - * @retval Last data entered into the output FIFO. - */ -uint32_t CRYP_DataOut(void) -{ - return CRYP->DOUT; -} -/** - * @} - */ - -/** @defgroup CRYP_Group3 Context swapping functions - * @brief Context swapping functions - * -@verbatim - =============================================================================== - Context swapping functions - =============================================================================== - - This section provides functions allowing to save and store CRYP Context - - It is possible to interrupt an encryption/ decryption/ key generation process - to perform another processing with a higher priority, and to complete the - interrupted process later on, when the higher-priority task is complete. To do - so, the context of the interrupted task must be saved from the CRYP registers - to memory, and then be restored from memory to the CRYP registers. - - 1. To save the current context, use CRYP_SaveContext() function - 2. To restore the saved context, use CRYP_RestoreContext() function - - -@endverbatim - * @{ - */ - -/** - * @brief Saves the CRYP peripheral Context. - * @note This function stops DMA transfer before to save the context. After - * restoring the context, you have to enable the DMA again (if the DMA - * was previously used). - * @param CRYP_ContextSave: pointer to a CRYP_Context structure that contains - * the repository for current context. - * @param CRYP_KeyInitStruct: pointer to a CRYP_KeyInitTypeDef structure that - * contains the configuration information for the CRYP Keys. - * @retval None - */ -ErrorStatus CRYP_SaveContext(CRYP_Context* CRYP_ContextSave, - CRYP_KeyInitTypeDef* CRYP_KeyInitStruct) -{ - __IO uint32_t timeout = 0; - uint32_t ckeckmask = 0, bitstatus; - ErrorStatus status = ERROR; - - /* Stop DMA transfers on the IN FIFO by clearing the DIEN bit in the CRYP_DMACR */ - CRYP->DMACR &= ~(uint32_t)CRYP_DMACR_DIEN; - - /* Wait until both the IN and OUT FIFOs are empty - (IFEM=1 and OFNE=0 in the CRYP_SR register) and the - BUSY bit is cleared. */ - - if ((CRYP->CR & (uint32_t)(CRYP_CR_ALGOMODE_TDES_ECB | CRYP_CR_ALGOMODE_TDES_CBC)) != (uint32_t)0 )/* TDES */ - { - ckeckmask = CRYP_SR_IFEM | CRYP_SR_BUSY ; - } - else /* AES or DES */ - { - ckeckmask = CRYP_SR_IFEM | CRYP_SR_BUSY | CRYP_SR_OFNE; - } - - do - { - bitstatus = CRYP->SR & ckeckmask; - timeout++; - } - while ((timeout != MAX_TIMEOUT) && (bitstatus != CRYP_SR_IFEM)); - - if ((CRYP->SR & ckeckmask) != CRYP_SR_IFEM) - { - status = ERROR; - } - else - { - /* Stop DMA transfers on the OUT FIFO by - - writing the DOEN bit to 0 in the CRYP_DMACR register - - and clear the CRYPEN bit. */ - - CRYP->DMACR &= ~(uint32_t)CRYP_DMACR_DOEN; - CRYP->CR &= ~(uint32_t)CRYP_CR_CRYPEN; - - /* Save the current configuration (bits [9:2] in the CRYP_CR register) */ - CRYP_ContextSave->CR_bits9to2 = CRYP->CR & (CRYP_CR_KEYSIZE | - CRYP_CR_DATATYPE | - CRYP_CR_ALGOMODE | - CRYP_CR_ALGODIR); - - /* and, if not in ECB mode, the initialization vectors. */ - CRYP_ContextSave->CRYP_IV0LR = CRYP->IV0LR; - CRYP_ContextSave->CRYP_IV0RR = CRYP->IV0RR; - CRYP_ContextSave->CRYP_IV1LR = CRYP->IV1LR; - CRYP_ContextSave->CRYP_IV1RR = CRYP->IV1RR; - - /* save The key value */ - CRYP_ContextSave->CRYP_K0LR = CRYP_KeyInitStruct->CRYP_Key0Left; - CRYP_ContextSave->CRYP_K0RR = CRYP_KeyInitStruct->CRYP_Key0Right; - CRYP_ContextSave->CRYP_K1LR = CRYP_KeyInitStruct->CRYP_Key1Left; - CRYP_ContextSave->CRYP_K1RR = CRYP_KeyInitStruct->CRYP_Key1Right; - CRYP_ContextSave->CRYP_K2LR = CRYP_KeyInitStruct->CRYP_Key2Left; - CRYP_ContextSave->CRYP_K2RR = CRYP_KeyInitStruct->CRYP_Key2Right; - CRYP_ContextSave->CRYP_K3LR = CRYP_KeyInitStruct->CRYP_Key3Left; - CRYP_ContextSave->CRYP_K3RR = CRYP_KeyInitStruct->CRYP_Key3Right; - - /* When needed, save the DMA status (pointers for IN and OUT messages, - number of remaining bytes, etc.) */ - - status = SUCCESS; - } - - return status; -} - -/** - * @brief Restores the CRYP peripheral Context. - * @note Since teh DMA transfer is stopped in CRYP_SaveContext() function, - * after restoring the context, you have to enable the DMA again (if the - * DMA was previously used). - * @param CRYP_ContextRestore: pointer to a CRYP_Context structure that contains - * the repository for saved context. - * @note The data that were saved during context saving must be rewrited into - * the IN FIFO. - * @retval None - */ -void CRYP_RestoreContext(CRYP_Context* CRYP_ContextRestore) -{ - - /* Configure the processor with the saved configuration */ - CRYP->CR = CRYP_ContextRestore->CR_bits9to2; - - /* restore The key value */ - CRYP->K0LR = CRYP_ContextRestore->CRYP_K0LR; - CRYP->K0RR = CRYP_ContextRestore->CRYP_K0RR; - CRYP->K1LR = CRYP_ContextRestore->CRYP_K1LR; - CRYP->K1RR = CRYP_ContextRestore->CRYP_K1RR; - CRYP->K2LR = CRYP_ContextRestore->CRYP_K2LR; - CRYP->K2RR = CRYP_ContextRestore->CRYP_K2RR; - CRYP->K3LR = CRYP_ContextRestore->CRYP_K3LR; - CRYP->K3RR = CRYP_ContextRestore->CRYP_K3RR; - - /* and the initialization vectors. */ - CRYP->IV0LR = CRYP_ContextRestore->CRYP_IV0LR; - CRYP->IV0RR = CRYP_ContextRestore->CRYP_IV0RR; - CRYP->IV1LR = CRYP_ContextRestore->CRYP_IV1LR; - CRYP->IV1RR = CRYP_ContextRestore->CRYP_IV1RR; - - /* Enable the cryptographic processor */ - CRYP->CR |= CRYP_CR_CRYPEN; -} -/** - * @} - */ - -/** @defgroup CRYP_Group4 CRYP's DMA interface Configuration function - * @brief CRYP's DMA interface Configuration function - * -@verbatim - =============================================================================== - CRYP's DMA interface Configuration function - =============================================================================== - - This section provides functions allowing to configure the DMA interface for - CRYP data input and output transfer. - - When the DMA mode is enabled (using the CRYP_DMACmd() function), data can be - transferred: - - From memory to the CRYP IN FIFO using the DMA peripheral by enabling - the CRYP_DMAReq_DataIN request. - - From the CRYP OUT FIFO to the memory using the DMA peripheral by enabling - the CRYP_DMAReq_DataOUT request. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the CRYP DMA interface. - * @param CRYP_DMAReq: specifies the CRYP DMA transfer request to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg CRYP_DMAReq_DataOUT: DMA for outgoing(Tx) data transfer - * @arg CRYP_DMAReq_DataIN: DMA for incoming(Rx) data transfer - * @param NewState: new state of the selected CRYP DMA transfer request. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CRYP_DMACmd(uint8_t CRYP_DMAReq, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_CRYP_DMAREQ(CRYP_DMAReq)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected CRYP DMA request */ - CRYP->DMACR |= CRYP_DMAReq; - } - else - { - /* Disable the selected CRYP DMA request */ - CRYP->DMACR &= (uint8_t)~CRYP_DMAReq; - } -} -/** - * @} - */ - -/** @defgroup CRYP_Group5 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - - This section provides functions allowing to configure the CRYP Interrupts and - to get the status and Interrupts pending bits. - - The CRYP provides 2 Interrupts sources and 7 Flags: - - Flags : - ------- - - 1. CRYP_FLAG_IFEM : Set when Input FIFO is empty. - This Flag is cleared only by hardware. - - 2. CRYP_FLAG_IFNF : Set when Input FIFO is not full. - This Flag is cleared only by hardware. - - - 3. CRYP_FLAG_INRIS : Set when Input FIFO Raw interrupt is pending - it gives the raw interrupt state prior to masking - of the input FIFO service interrupt. - This Flag is cleared only by hardware. - - 4. CRYP_FLAG_OFNE : Set when Output FIFO not empty. - This Flag is cleared only by hardware. - - 5. CRYP_FLAG_OFFU : Set when Output FIFO is full. - This Flag is cleared only by hardware. - - 6. CRYP_FLAG_OUTRIS : Set when Output FIFO Raw interrupt is pending - it gives the raw interrupt state prior to masking - of the output FIFO service interrupt. - This Flag is cleared only by hardware. - - 7. CRYP_FLAG_BUSY : Set when the CRYP core is currently processing a - block of data or a key preparation (for AES - decryption). - This Flag is cleared only by hardware. - To clear it, the CRYP core must be disabled and the - last processing has completed. - - Interrupts : - ------------ - - 1. CRYP_IT_INI : The input FIFO service interrupt is asserted when there - are less than 4 words in the input FIFO. - This interrupt is associated to CRYP_FLAG_INRIS flag. - - @note This interrupt is cleared by performing write operations - to the input FIFO until it holds 4 or more words. The - input FIFO service interrupt INMIS is enabled with the - CRYP enable bit. Consequently, when CRYP is disabled, the - INMIS signal is low even if the input FIFO is empty. - - - - 2. CRYP_IT_OUTI : The output FIFO service interrupt is asserted when there - is one or more (32-bit word) data items in the output FIFO. - This interrupt is associated to CRYP_FLAG_OUTRIS flag. - - @note This interrupt is cleared by reading data from the output - FIFO until there is no valid (32-bit) word left (that is, - the interrupt follows the state of the OFNE (output FIFO - not empty) flag). - - - Managing the CRYP controller events : - ------------------------------------ - The user should identify which mode will be used in his application to manage - the CRYP controller events: Polling mode or Interrupt mode. - - 1. In the Polling Mode it is advised to use the following functions: - - CRYP_GetFlagStatus() : to check if flags events occur. - - @note The CRYPT flags do not need to be cleared since they are cleared as - soon as the associated event are reset. - - - 2. In the Interrupt Mode it is advised to use the following functions: - - CRYP_ITConfig() : to enable or disable the interrupt source. - - CRYP_GetITStatus() : to check if Interrupt occurs. - - @note The CRYPT interrupts have no pending bits, the interrupt is cleared as - soon as the associated event is reset. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified CRYP interrupts. - * @param CRYP_IT: specifies the CRYP interrupt source to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg CRYP_IT_INI: Input FIFO interrupt - * @arg CRYP_IT_OUTI: Output FIFO interrupt - * @param NewState: new state of the specified CRYP interrupt. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void CRYP_ITConfig(uint8_t CRYP_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_CRYP_CONFIG_IT(CRYP_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected CRYP interrupt */ - CRYP->IMSCR |= CRYP_IT; - } - else - { - /* Disable the selected CRYP interrupt */ - CRYP->IMSCR &= (uint8_t)~CRYP_IT; - } -} - -/** - * @brief Checks whether the specified CRYP interrupt has occurred or not. - * @note This function checks the status of the masked interrupt (i.e the - * interrupt should be previously enabled). - * @param CRYP_IT: specifies the CRYP (masked) interrupt source to check. - * This parameter can be one of the following values: - * @arg CRYP_IT_INI: Input FIFO interrupt - * @arg CRYP_IT_OUTI: Output FIFO interrupt - * @retval The new state of CRYP_IT (SET or RESET). - */ -ITStatus CRYP_GetITStatus(uint8_t CRYP_IT) -{ - ITStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_CRYP_GET_IT(CRYP_IT)); - - /* Check the status of the specified CRYP interrupt */ - if ((CRYP->MISR & CRYP_IT) != (uint8_t)RESET) - { - /* CRYP_IT is set */ - bitstatus = SET; - } - else - { - /* CRYP_IT is reset */ - bitstatus = RESET; - } - /* Return the CRYP_IT status */ - return bitstatus; -} - -/** - * @brief Checks whether the specified CRYP flag is set or not. - * @param CRYP_FLAG: specifies the CRYP flag to check. - * This parameter can be one of the following values: - * @arg CRYP_FLAG_IFEM: Input FIFO Empty flag. - * @arg CRYP_FLAG_IFNF: Input FIFO Not Full flag. - * @arg CRYP_FLAG_OFNE: Output FIFO Not Empty flag. - * @arg CRYP_FLAG_OFFU: Output FIFO Full flag. - * @arg CRYP_FLAG_BUSY: Busy flag. - * @arg CRYP_FLAG_OUTRIS: Output FIFO raw interrupt flag. - * @arg CRYP_FLAG_INRIS: Input FIFO raw interrupt flag. - * @retval The new state of CRYP_FLAG (SET or RESET). - */ -FlagStatus CRYP_GetFlagStatus(uint8_t CRYP_FLAG) -{ - FlagStatus bitstatus = RESET; - uint32_t tempreg = 0; - - /* Check the parameters */ - assert_param(IS_CRYP_GET_FLAG(CRYP_FLAG)); - - /* check if the FLAG is in RISR register */ - if ((CRYP_FLAG & FLAG_MASK) != 0x00) - { - tempreg = CRYP->RISR; - } - else /* The FLAG is in SR register */ - { - tempreg = CRYP->SR; - } - - - /* Check the status of the specified CRYP flag */ - if ((tempreg & CRYP_FLAG ) != (uint8_t)RESET) - { - /* CRYP_FLAG is set */ - bitstatus = SET; - } - else - { - /* CRYP_FLAG is reset */ - bitstatus = RESET; - } - - /* Return the CRYP_FLAG status */ - return bitstatus; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_cryp.h b/car_hw/src/lib/stdperiph/stm32f4xx_cryp.h deleted file mode 100644 index 2e43b3200dc..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_cryp.h +++ /dev/null @@ -1,338 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_cryp.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the Cryptographic - * processor(CRYP) firmware library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_CRYP_H -#define __STM32F4xx_CRYP_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup CRYP - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief CRYP Init structure definition - */ -typedef struct -{ - uint16_t CRYP_AlgoDir; /*!< Encrypt or Decrypt. This parameter can be a - value of @ref CRYP_Algorithm_Direction */ - uint16_t CRYP_AlgoMode; /*!< TDES-ECB, TDES-CBC, DES-ECB, DES-CBC, AES-ECB, - AES-CBC, AES-CTR, AES-Key. This parameter can be - a value of @ref CRYP_Algorithm_Mode */ - uint16_t CRYP_DataType; /*!< 32-bit data, 16-bit data, bit data or bit-string. - This parameter can be a value of @ref CRYP_Data_Type */ - uint16_t CRYP_KeySize; /*!< Used only in AES mode only : 128, 192 or 256 bit - key length. This parameter can be a value of - @ref CRYP_Key_Size_for_AES_only */ -}CRYP_InitTypeDef; - -/** - * @brief CRYP Key(s) structure definition - */ -typedef struct -{ - uint32_t CRYP_Key0Left; /*!< Key 0 Left */ - uint32_t CRYP_Key0Right; /*!< Key 0 Right */ - uint32_t CRYP_Key1Left; /*!< Key 1 left */ - uint32_t CRYP_Key1Right; /*!< Key 1 Right */ - uint32_t CRYP_Key2Left; /*!< Key 2 left */ - uint32_t CRYP_Key2Right; /*!< Key 2 Right */ - uint32_t CRYP_Key3Left; /*!< Key 3 left */ - uint32_t CRYP_Key3Right; /*!< Key 3 Right */ -}CRYP_KeyInitTypeDef; -/** - * @brief CRYP Initialization Vectors (IV) structure definition - */ -typedef struct -{ - uint32_t CRYP_IV0Left; /*!< Init Vector 0 Left */ - uint32_t CRYP_IV0Right; /*!< Init Vector 0 Right */ - uint32_t CRYP_IV1Left; /*!< Init Vector 1 left */ - uint32_t CRYP_IV1Right; /*!< Init Vector 1 Right */ -}CRYP_IVInitTypeDef; - -/** - * @brief CRYP context swapping structure definition - */ -typedef struct -{ - /*!< Configuration */ - uint32_t CR_bits9to2; - /*!< KEY */ - uint32_t CRYP_IV0LR; - uint32_t CRYP_IV0RR; - uint32_t CRYP_IV1LR; - uint32_t CRYP_IV1RR; - /*!< IV */ - uint32_t CRYP_K0LR; - uint32_t CRYP_K0RR; - uint32_t CRYP_K1LR; - uint32_t CRYP_K1RR; - uint32_t CRYP_K2LR; - uint32_t CRYP_K2RR; - uint32_t CRYP_K3LR; - uint32_t CRYP_K3RR; -}CRYP_Context; - - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup CRYP_Exported_Constants - * @{ - */ - -/** @defgroup CRYP_Algorithm_Direction - * @{ - */ -#define CRYP_AlgoDir_Encrypt ((uint16_t)0x0000) -#define CRYP_AlgoDir_Decrypt ((uint16_t)0x0004) -#define IS_CRYP_ALGODIR(ALGODIR) (((ALGODIR) == CRYP_AlgoDir_Encrypt) || \ - ((ALGODIR) == CRYP_AlgoDir_Decrypt)) - -/** - * @} - */ - -/** @defgroup CRYP_Algorithm_Mode - * @{ - */ - -/*!< TDES Modes */ -#define CRYP_AlgoMode_TDES_ECB ((uint16_t)0x0000) -#define CRYP_AlgoMode_TDES_CBC ((uint16_t)0x0008) - -/*!< DES Modes */ -#define CRYP_AlgoMode_DES_ECB ((uint16_t)0x0010) -#define CRYP_AlgoMode_DES_CBC ((uint16_t)0x0018) - -/*!< AES Modes */ -#define CRYP_AlgoMode_AES_ECB ((uint16_t)0x0020) -#define CRYP_AlgoMode_AES_CBC ((uint16_t)0x0028) -#define CRYP_AlgoMode_AES_CTR ((uint16_t)0x0030) -#define CRYP_AlgoMode_AES_Key ((uint16_t)0x0038) - -#define IS_CRYP_ALGOMODE(ALGOMODE) (((ALGOMODE) == CRYP_AlgoMode_TDES_ECB) || \ - ((ALGOMODE) == CRYP_AlgoMode_TDES_CBC)|| \ - ((ALGOMODE) == CRYP_AlgoMode_DES_ECB)|| \ - ((ALGOMODE) == CRYP_AlgoMode_DES_CBC) || \ - ((ALGOMODE) == CRYP_AlgoMode_AES_ECB) || \ - ((ALGOMODE) == CRYP_AlgoMode_AES_CBC) || \ - ((ALGOMODE) == CRYP_AlgoMode_AES_CTR) || \ - ((ALGOMODE) == CRYP_AlgoMode_AES_Key)) -/** - * @} - */ - -/** @defgroup CRYP_Data_Type - * @{ - */ -#define CRYP_DataType_32b ((uint16_t)0x0000) -#define CRYP_DataType_16b ((uint16_t)0x0040) -#define CRYP_DataType_8b ((uint16_t)0x0080) -#define CRYP_DataType_1b ((uint16_t)0x00C0) -#define IS_CRYP_DATATYPE(DATATYPE) (((DATATYPE) == CRYP_DataType_32b) || \ - ((DATATYPE) == CRYP_DataType_16b)|| \ - ((DATATYPE) == CRYP_DataType_8b)|| \ - ((DATATYPE) == CRYP_DataType_1b)) -/** - * @} - */ - -/** @defgroup CRYP_Key_Size_for_AES_only - * @{ - */ -#define CRYP_KeySize_128b ((uint16_t)0x0000) -#define CRYP_KeySize_192b ((uint16_t)0x0100) -#define CRYP_KeySize_256b ((uint16_t)0x0200) -#define IS_CRYP_KEYSIZE(KEYSIZE) (((KEYSIZE) == CRYP_KeySize_128b)|| \ - ((KEYSIZE) == CRYP_KeySize_192b)|| \ - ((KEYSIZE) == CRYP_KeySize_256b)) -/** - * @} - */ - -/** @defgroup CRYP_flags_definition - * @{ - */ -#define CRYP_FLAG_BUSY ((uint8_t)0x10) /*!< The CRYP core is currently - processing a block of data - or a key preparation (for - AES decryption). */ -#define CRYP_FLAG_IFEM ((uint8_t)0x01) /*!< Input Fifo Empty */ -#define CRYP_FLAG_IFNF ((uint8_t)0x02) /*!< Input Fifo is Not Full */ -#define CRYP_FLAG_INRIS ((uint8_t)0x22) /*!< Raw interrupt pending */ -#define CRYP_FLAG_OFNE ((uint8_t)0x04) /*!< Input Fifo service raw - interrupt status */ -#define CRYP_FLAG_OFFU ((uint8_t)0x08) /*!< Output Fifo is Full */ -#define CRYP_FLAG_OUTRIS ((uint8_t)0x21) /*!< Output Fifo service raw - interrupt status */ - -#define IS_CRYP_GET_FLAG(FLAG) (((FLAG) == CRYP_FLAG_IFEM) || \ - ((FLAG) == CRYP_FLAG_IFNF) || \ - ((FLAG) == CRYP_FLAG_OFNE) || \ - ((FLAG) == CRYP_FLAG_OFFU) || \ - ((FLAG) == CRYP_FLAG_BUSY) || \ - ((FLAG) == CRYP_FLAG_OUTRIS)|| \ - ((FLAG) == CRYP_FLAG_INRIS)) -/** - * @} - */ - -/** @defgroup CRYP_interrupts_definition - * @{ - */ -#define CRYP_IT_INI ((uint8_t)0x01) /*!< IN Fifo Interrupt */ -#define CRYP_IT_OUTI ((uint8_t)0x02) /*!< OUT Fifo Interrupt */ -#define IS_CRYP_CONFIG_IT(IT) ((((IT) & (uint8_t)0xFC) == 0x00) && ((IT) != 0x00)) -#define IS_CRYP_GET_IT(IT) (((IT) == CRYP_IT_INI) || ((IT) == CRYP_IT_OUTI)) - -/** - * @} - */ - -/** @defgroup CRYP_Encryption_Decryption_modes_definition - * @{ - */ -#define MODE_ENCRYPT ((uint8_t)0x01) -#define MODE_DECRYPT ((uint8_t)0x00) - -/** - * @} - */ - -/** @defgroup CRYP_DMA_transfer_requests - * @{ - */ -#define CRYP_DMAReq_DataIN ((uint8_t)0x01) -#define CRYP_DMAReq_DataOUT ((uint8_t)0x02) -#define IS_CRYP_DMAREQ(DMAREQ) ((((DMAREQ) & (uint8_t)0xFC) == 0x00) && ((DMAREQ) != 0x00)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the CRYP configuration to the default reset state ****/ -void CRYP_DeInit(void); - -/* CRYP Initialization and Configuration functions ****************************/ -void CRYP_Init(CRYP_InitTypeDef* CRYP_InitStruct); -void CRYP_StructInit(CRYP_InitTypeDef* CRYP_InitStruct); -void CRYP_KeyInit(CRYP_KeyInitTypeDef* CRYP_KeyInitStruct); -void CRYP_KeyStructInit(CRYP_KeyInitTypeDef* CRYP_KeyInitStruct); -void CRYP_IVInit(CRYP_IVInitTypeDef* CRYP_IVInitStruct); -void CRYP_IVStructInit(CRYP_IVInitTypeDef* CRYP_IVInitStruct); -void CRYP_Cmd(FunctionalState NewState); - -/* CRYP Data processing functions *********************************************/ -void CRYP_DataIn(uint32_t Data); -uint32_t CRYP_DataOut(void); -void CRYP_FIFOFlush(void); - -/* CRYP Context swapping functions ********************************************/ -ErrorStatus CRYP_SaveContext(CRYP_Context* CRYP_ContextSave, - CRYP_KeyInitTypeDef* CRYP_KeyInitStruct); -void CRYP_RestoreContext(CRYP_Context* CRYP_ContextRestore); - -/* CRYP's DMA interface function **********************************************/ -void CRYP_DMACmd(uint8_t CRYP_DMAReq, FunctionalState NewState); - -/* Interrupts and flags management functions **********************************/ -void CRYP_ITConfig(uint8_t CRYP_IT, FunctionalState NewState); -ITStatus CRYP_GetITStatus(uint8_t CRYP_IT); -FlagStatus CRYP_GetFlagStatus(uint8_t CRYP_FLAG); - -/* High Level AES functions **************************************************/ -ErrorStatus CRYP_AES_ECB(uint8_t Mode, - uint8_t *Key, uint16_t Keysize, - uint8_t *Input, uint32_t Ilength, - uint8_t *Output); - -ErrorStatus CRYP_AES_CBC(uint8_t Mode, - uint8_t InitVectors[16], - uint8_t *Key, uint16_t Keysize, - uint8_t *Input, uint32_t Ilength, - uint8_t *Output); - -ErrorStatus CRYP_AES_CTR(uint8_t Mode, - uint8_t InitVectors[16], - uint8_t *Key, uint16_t Keysize, - uint8_t *Input, uint32_t Ilength, - uint8_t *Output); - -/* High Level TDES functions **************************************************/ -ErrorStatus CRYP_TDES_ECB(uint8_t Mode, - uint8_t Key[24], - uint8_t *Input, uint32_t Ilength, - uint8_t *Output); - -ErrorStatus CRYP_TDES_CBC(uint8_t Mode, - uint8_t Key[24], - uint8_t InitVectors[8], - uint8_t *Input, uint32_t Ilength, - uint8_t *Output); - -/* High Level DES functions **************************************************/ -ErrorStatus CRYP_DES_ECB(uint8_t Mode, - uint8_t Key[8], - uint8_t *Input, uint32_t Ilength, - uint8_t *Output); - -ErrorStatus CRYP_DES_CBC(uint8_t Mode, - uint8_t Key[8], - uint8_t InitVectors[8], - uint8_t *Input,uint32_t Ilength, - uint8_t *Output); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_CRYP_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_cryp_aes.c b/car_hw/src/lib/stdperiph/stm32f4xx_cryp_aes.c deleted file mode 100644 index 886307f977d..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_cryp_aes.c +++ /dev/null @@ -1,638 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_cryp_aes.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides high level functions to encrypt and decrypt an - * input message using AES in ECB/CBC/CTR modes. - * It uses the stm32f4xx_cryp.c/.h drivers to access the STM32F4xx CRYP - * peripheral. - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - * 1. Enable The CRYP controller clock using - * RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, ENABLE); function. - * - * 2. Encrypt and decrypt using AES in ECB Mode using CRYP_AES_ECB() - * function. - * - * 3. Encrypt and decrypt using AES in CBC Mode using CRYP_AES_CBC() - * function. - * - * 4. Encrypt and decrypt using AES in CTR Mode using CRYP_AES_CTR() - * function. - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_cryp.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup CRYP - * @brief CRYP driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define AESBUSY_TIMEOUT ((uint32_t) 0x00010000) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup CRYP_Private_Functions - * @{ - */ - -/** @defgroup CRYP_Group6 High Level AES functions - * @brief High Level AES functions - * -@verbatim - =============================================================================== - High Level AES functions - =============================================================================== - - -@endverbatim - * @{ - */ - -/** - * @brief Encrypt and decrypt using AES in ECB Mode - * @param Mode: encryption or decryption Mode. - * This parameter can be one of the following values: - * @arg MODE_ENCRYPT: Encryption - * @arg MODE_DECRYPT: Decryption - * @param Key: Key used for AES algorithm. - * @param Keysize: length of the Key, must be a 128, 192 or 256. - * @param Input: pointer to the Input buffer. - * @param Ilength: length of the Input buffer, must be a multiple of 16. - * @param Output: pointer to the returned buffer. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: Operation done - * - ERROR: Operation failed - */ -ErrorStatus CRYP_AES_ECB(uint8_t Mode, uint8_t* Key, uint16_t Keysize, - uint8_t* Input, uint32_t Ilength, uint8_t* Output) -{ - CRYP_InitTypeDef AES_CRYP_InitStructure; - CRYP_KeyInitTypeDef AES_CRYP_KeyInitStructure; - __IO uint32_t counter = 0; - uint32_t busystatus = 0; - ErrorStatus status = SUCCESS; - uint32_t keyaddr = (uint32_t)Key; - uint32_t inputaddr = (uint32_t)Input; - uint32_t outputaddr = (uint32_t)Output; - uint32_t i = 0; - - /* Crypto structures initialisation*/ - CRYP_KeyStructInit(&AES_CRYP_KeyInitStructure); - - switch(Keysize) - { - case 128: - AES_CRYP_InitStructure.CRYP_KeySize = CRYP_KeySize_128b; - AES_CRYP_KeyInitStructure.CRYP_Key2Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key2Right= __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key3Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key3Right= __REV(*(uint32_t*)(keyaddr)); - break; - case 192: - AES_CRYP_InitStructure.CRYP_KeySize = CRYP_KeySize_192b; - AES_CRYP_KeyInitStructure.CRYP_Key1Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key1Right= __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key2Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key2Right= __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key3Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key3Right= __REV(*(uint32_t*)(keyaddr)); - break; - case 256: - AES_CRYP_InitStructure.CRYP_KeySize = CRYP_KeySize_256b; - AES_CRYP_KeyInitStructure.CRYP_Key0Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key0Right= __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key1Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key1Right= __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key2Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key2Right= __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key3Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - AES_CRYP_KeyInitStructure.CRYP_Key3Right= __REV(*(uint32_t*)(keyaddr)); - break; - default: - break; - } - - /*------------------ AES Decryption ------------------*/ - if(Mode == MODE_DECRYPT) /* AES decryption */ - { - /* Flush IN/OUT FIFOs */ - CRYP_FIFOFlush(); - - /* Crypto Init for Key preparation for decryption process */ - AES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt; - AES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_AES_Key; - AES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_32b; - CRYP_Init(&AES_CRYP_InitStructure); - - /* Key Initialisation */ - CRYP_KeyInit(&AES_CRYP_KeyInitStructure); - - /* Enable Crypto processor */ - CRYP_Cmd(ENABLE); - - /* wait until the Busy flag is RESET */ - do - { - busystatus = CRYP_GetFlagStatus(CRYP_FLAG_BUSY); - counter++; - }while ((counter != AESBUSY_TIMEOUT) && (busystatus != RESET)); - - if (busystatus != RESET) - { - status = ERROR; - } - else - { - /* Crypto Init for decryption process */ - AES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt; - } - } - /*------------------ AES Encryption ------------------*/ - else /* AES encryption */ - { - - CRYP_KeyInit(&AES_CRYP_KeyInitStructure); - - /* Crypto Init for Encryption process */ - AES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt; - } - - AES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_AES_ECB; - AES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b; - CRYP_Init(&AES_CRYP_InitStructure); - - /* Flush IN/OUT FIFOs */ - CRYP_FIFOFlush(); - - /* Enable Crypto processor */ - CRYP_Cmd(ENABLE); - - for(i=0; ((i
© COPYRIGHT 2011 STMicroelectronics
- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_cryp.h" - - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup CRYP - * @brief CRYP driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define DESBUSY_TIMEOUT ((uint32_t) 0x00010000) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - - -/** @defgroup CRYP_Private_Functions - * @{ - */ - -/** @defgroup CRYP_Group8 High Level DES functions - * @brief High Level DES functions - * -@verbatim - =============================================================================== - High Level DES functions - =============================================================================== -@endverbatim - * @{ - */ - -/** - * @brief Encrypt and decrypt using DES in ECB Mode - * @param Mode: encryption or decryption Mode. - * This parameter can be one of the following values: - * @arg MODE_ENCRYPT: Encryption - * @arg MODE_DECRYPT: Decryption - * @param Key: Key used for DES algorithm. - * @param Ilength: length of the Input buffer, must be a multiple of 8. - * @param Input: pointer to the Input buffer. - * @param Output: pointer to the returned buffer. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: Operation done - * - ERROR: Operation failed - */ -ErrorStatus CRYP_DES_ECB(uint8_t Mode, uint8_t Key[8], uint8_t *Input, - uint32_t Ilength, uint8_t *Output) -{ - CRYP_InitTypeDef DES_CRYP_InitStructure; - CRYP_KeyInitTypeDef DES_CRYP_KeyInitStructure; - __IO uint32_t counter = 0; - uint32_t busystatus = 0; - ErrorStatus status = SUCCESS; - uint32_t keyaddr = (uint32_t)Key; - uint32_t inputaddr = (uint32_t)Input; - uint32_t outputaddr = (uint32_t)Output; - uint32_t i = 0; - - /* Crypto structures initialisation*/ - CRYP_KeyStructInit(&DES_CRYP_KeyInitStructure); - - /* Crypto Init for Encryption process */ - if( Mode == MODE_ENCRYPT ) /* DES encryption */ - { - DES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt; - } - else/* if( Mode == MODE_DECRYPT )*/ /* DES decryption */ - { - DES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt; - } - - DES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_DES_ECB; - DES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b; - CRYP_Init(&DES_CRYP_InitStructure); - - /* Key Initialisation */ - DES_CRYP_KeyInitStructure.CRYP_Key1Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - DES_CRYP_KeyInitStructure.CRYP_Key1Right= __REV(*(uint32_t*)(keyaddr)); - CRYP_KeyInit(& DES_CRYP_KeyInitStructure); - - /* Flush IN/OUT FIFO */ - CRYP_FIFOFlush(); - - /* Enable Crypto processor */ - CRYP_Cmd(ENABLE); - - for(i=0; ((i
© COPYRIGHT 2011 STMicroelectronics
- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_cryp.h" - - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup CRYP - * @brief CRYP driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define TDESBUSY_TIMEOUT ((uint32_t) 0x00010000) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - - -/** @defgroup CRYP_Private_Functions - * @{ - */ - -/** @defgroup CRYP_Group7 High Level TDES functions - * @brief High Level TDES functions - * -@verbatim - =============================================================================== - High Level TDES functions - =============================================================================== - - -@endverbatim - * @{ - */ - -/** - * @brief Encrypt and decrypt using TDES in ECB Mode - * @param Mode: encryption or decryption Mode. - * This parameter can be one of the following values: - * @arg MODE_ENCRYPT: Encryption - * @arg MODE_DECRYPT: Decryption - * @param Key: Key used for TDES algorithm. - * @param Ilength: length of the Input buffer, must be a multiple of 8. - * @param Input: pointer to the Input buffer. - * @param Output: pointer to the returned buffer. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: Operation done - * - ERROR: Operation failed - */ -ErrorStatus CRYP_TDES_ECB(uint8_t Mode, uint8_t Key[24], uint8_t *Input, - uint32_t Ilength, uint8_t *Output) -{ - CRYP_InitTypeDef TDES_CRYP_InitStructure; - CRYP_KeyInitTypeDef TDES_CRYP_KeyInitStructure; - __IO uint32_t counter = 0; - uint32_t busystatus = 0; - ErrorStatus status = SUCCESS; - uint32_t keyaddr = (uint32_t)Key; - uint32_t inputaddr = (uint32_t)Input; - uint32_t outputaddr = (uint32_t)Output; - uint32_t i = 0; - - /* Crypto structures initialisation*/ - CRYP_KeyStructInit(&TDES_CRYP_KeyInitStructure); - - /* Crypto Init for Encryption process */ - if(Mode == MODE_ENCRYPT) /* TDES encryption */ - { - TDES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt; - } - else /*if(Mode == MODE_DECRYPT)*/ /* TDES decryption */ - { - TDES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt; - } - - TDES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_TDES_ECB; - TDES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b; - CRYP_Init(&TDES_CRYP_InitStructure); - - /* Key Initialisation */ - TDES_CRYP_KeyInitStructure.CRYP_Key1Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - TDES_CRYP_KeyInitStructure.CRYP_Key1Right= __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - TDES_CRYP_KeyInitStructure.CRYP_Key2Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - TDES_CRYP_KeyInitStructure.CRYP_Key2Right= __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - TDES_CRYP_KeyInitStructure.CRYP_Key3Left = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - TDES_CRYP_KeyInitStructure.CRYP_Key3Right= __REV(*(uint32_t*)(keyaddr)); - CRYP_KeyInit(& TDES_CRYP_KeyInitStructure); - - /* Flush IN/OUT FIFO */ - CRYP_FIFOFlush(); - - /* Enable Crypto processor */ - CRYP_Cmd(ENABLE); - - for(i=0; ((i
© COPYRIGHT 2011 STMicroelectronics
- ****************************************************************************** - */ - - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_dac.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup DAC - * @brief DAC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* CR register Mask */ -#define CR_CLEAR_MASK ((uint32_t)0x00000FFE) - -/* DAC Dual Channels SWTRIG masks */ -#define DUAL_SWTRIG_SET ((uint32_t)0x00000003) -#define DUAL_SWTRIG_RESET ((uint32_t)0xFFFFFFFC) - -/* DHR registers offsets */ -#define DHR12R1_OFFSET ((uint32_t)0x00000008) -#define DHR12R2_OFFSET ((uint32_t)0x00000014) -#define DHR12RD_OFFSET ((uint32_t)0x00000020) - -/* DOR register offset */ -#define DOR_OFFSET ((uint32_t)0x0000002C) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup DAC_Private_Functions - * @{ - */ - -/** @defgroup DAC_Group1 DAC channels configuration - * @brief DAC channels configuration: trigger, output buffer, data format - * -@verbatim - =============================================================================== - DAC channels configuration: trigger, output buffer, data format - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the DAC peripheral registers to their default reset values. - * @param None - * @retval None - */ -void DAC_DeInit(void) -{ - /* Enable DAC reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, ENABLE); - /* Release DAC from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, DISABLE); -} - -/** - * @brief Initializes the DAC peripheral according to the specified parameters - * in the DAC_InitStruct. - * @param DAC_Channel: the selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_InitStruct: pointer to a DAC_InitTypeDef structure that contains - * the configuration information for the specified DAC channel. - * @retval None - */ -void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct) -{ - uint32_t tmpreg1 = 0, tmpreg2 = 0; - - /* Check the DAC parameters */ - assert_param(IS_DAC_TRIGGER(DAC_InitStruct->DAC_Trigger)); - assert_param(IS_DAC_GENERATE_WAVE(DAC_InitStruct->DAC_WaveGeneration)); - assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude)); - assert_param(IS_DAC_OUTPUT_BUFFER_STATE(DAC_InitStruct->DAC_OutputBuffer)); - -/*---------------------------- DAC CR Configuration --------------------------*/ - /* Get the DAC CR value */ - tmpreg1 = DAC->CR; - /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */ - tmpreg1 &= ~(CR_CLEAR_MASK << DAC_Channel); - /* Configure for the selected DAC channel: buffer output, trigger, - wave generation, mask/amplitude for wave generation */ - /* Set TSELx and TENx bits according to DAC_Trigger value */ - /* Set WAVEx bits according to DAC_WaveGeneration value */ - /* Set MAMPx bits according to DAC_LFSRUnmask_TriangleAmplitude value */ - /* Set BOFFx bit according to DAC_OutputBuffer value */ - tmpreg2 = (DAC_InitStruct->DAC_Trigger | DAC_InitStruct->DAC_WaveGeneration | - DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude | \ - DAC_InitStruct->DAC_OutputBuffer); - /* Calculate CR register value depending on DAC_Channel */ - tmpreg1 |= tmpreg2 << DAC_Channel; - /* Write to DAC CR */ - DAC->CR = tmpreg1; -} - -/** - * @brief Fills each DAC_InitStruct member with its default value. - * @param DAC_InitStruct: pointer to a DAC_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct) -{ -/*--------------- Reset DAC init structure parameters values -----------------*/ - /* Initialize the DAC_Trigger member */ - DAC_InitStruct->DAC_Trigger = DAC_Trigger_None; - /* Initialize the DAC_WaveGeneration member */ - DAC_InitStruct->DAC_WaveGeneration = DAC_WaveGeneration_None; - /* Initialize the DAC_LFSRUnmask_TriangleAmplitude member */ - DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; - /* Initialize the DAC_OutputBuffer member */ - DAC_InitStruct->DAC_OutputBuffer = DAC_OutputBuffer_Enable; -} - -/** - * @brief Enables or disables the specified DAC channel. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param NewState: new state of the DAC channel. - * This parameter can be: ENABLE or DISABLE. - * @note When the DAC channel is enabled the trigger source can no more be modified. - * @retval None - */ -void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected DAC channel */ - DAC->CR |= (DAC_CR_EN1 << DAC_Channel); - } - else - { - /* Disable the selected DAC channel */ - DAC->CR &= (~(DAC_CR_EN1 << DAC_Channel)); - } -} - -/** - * @brief Enables or disables the selected DAC channel software trigger. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param NewState: new state of the selected DAC channel software trigger. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable software trigger for the selected DAC channel */ - DAC->SWTRIGR |= (uint32_t)DAC_SWTRIGR_SWTRIG1 << (DAC_Channel >> 4); - } - else - { - /* Disable software trigger for the selected DAC channel */ - DAC->SWTRIGR &= ~((uint32_t)DAC_SWTRIGR_SWTRIG1 << (DAC_Channel >> 4)); - } -} - -/** - * @brief Enables or disables simultaneously the two DAC channels software triggers. - * @param NewState: new state of the DAC channels software triggers. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_DualSoftwareTriggerCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable software trigger for both DAC channels */ - DAC->SWTRIGR |= DUAL_SWTRIG_SET; - } - else - { - /* Disable software trigger for both DAC channels */ - DAC->SWTRIGR &= DUAL_SWTRIG_RESET; - } -} - -/** - * @brief Enables or disables the selected DAC channel wave generation. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_Wave: specifies the wave type to enable or disable. - * This parameter can be one of the following values: - * @arg DAC_Wave_Noise: noise wave generation - * @arg DAC_Wave_Triangle: triangle wave generation - * @param NewState: new state of the selected DAC channel wave generation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_WAVE(DAC_Wave)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected wave generation for the selected DAC channel */ - DAC->CR |= DAC_Wave << DAC_Channel; - } - else - { - /* Disable the selected wave generation for the selected DAC channel */ - DAC->CR &= ~(DAC_Wave << DAC_Channel); - } -} - -/** - * @brief Set the specified data holding register value for DAC channel1. - * @param DAC_Align: Specifies the data alignment for DAC channel1. - * This parameter can be one of the following values: - * @arg DAC_Align_8b_R: 8bit right data alignment selected - * @arg DAC_Align_12b_L: 12bit left data alignment selected - * @arg DAC_Align_12b_R: 12bit right data alignment selected - * @param Data: Data to be loaded in the selected data holding register. - * @retval None - */ -void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_ALIGN(DAC_Align)); - assert_param(IS_DAC_DATA(Data)); - - tmp = (uint32_t)DAC_BASE; - tmp += DHR12R1_OFFSET + DAC_Align; - - /* Set the DAC channel1 selected data holding register */ - *(__IO uint32_t *) tmp = Data; -} - -/** - * @brief Set the specified data holding register value for DAC channel2. - * @param DAC_Align: Specifies the data alignment for DAC channel2. - * This parameter can be one of the following values: - * @arg DAC_Align_8b_R: 8bit right data alignment selected - * @arg DAC_Align_12b_L: 12bit left data alignment selected - * @arg DAC_Align_12b_R: 12bit right data alignment selected - * @param Data: Data to be loaded in the selected data holding register. - * @retval None - */ -void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_ALIGN(DAC_Align)); - assert_param(IS_DAC_DATA(Data)); - - tmp = (uint32_t)DAC_BASE; - tmp += DHR12R2_OFFSET + DAC_Align; - - /* Set the DAC channel2 selected data holding register */ - *(__IO uint32_t *)tmp = Data; -} - -/** - * @brief Set the specified data holding register value for dual channel DAC. - * @param DAC_Align: Specifies the data alignment for dual channel DAC. - * This parameter can be one of the following values: - * @arg DAC_Align_8b_R: 8bit right data alignment selected - * @arg DAC_Align_12b_L: 12bit left data alignment selected - * @arg DAC_Align_12b_R: 12bit right data alignment selected - * @param Data2: Data for DAC Channel2 to be loaded in the selected data holding register. - * @param Data1: Data for DAC Channel1 to be loaded in the selected data holding register. - * @note In dual mode, a unique register access is required to write in both - * DAC channels at the same time. - * @retval None - */ -void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1) -{ - uint32_t data = 0, tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_ALIGN(DAC_Align)); - assert_param(IS_DAC_DATA(Data1)); - assert_param(IS_DAC_DATA(Data2)); - - /* Calculate and set dual DAC data holding register value */ - if (DAC_Align == DAC_Align_8b_R) - { - data = ((uint32_t)Data2 << 8) | Data1; - } - else - { - data = ((uint32_t)Data2 << 16) | Data1; - } - - tmp = (uint32_t)DAC_BASE; - tmp += DHR12RD_OFFSET + DAC_Align; - - /* Set the dual DAC selected data holding register */ - *(__IO uint32_t *)tmp = data; -} - -/** - * @brief Returns the last data output value of the selected DAC channel. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @retval The selected DAC channel data output value. - */ -uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - - tmp = (uint32_t) DAC_BASE ; - tmp += DOR_OFFSET + ((uint32_t)DAC_Channel >> 2); - - /* Returns the DAC channel data output register value */ - return (uint16_t) (*(__IO uint32_t*) tmp); -} -/** - * @} - */ - -/** @defgroup DAC_Group2 DMA management functions - * @brief DMA management functions - * -@verbatim - =============================================================================== - DMA management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified DAC channel DMA request. - * @note When enabled DMA1 is generated when an external trigger (EXTI Line9, - * TIM2, TIM4, TIM5, TIM6, TIM7 or TIM8 but not a software trigger) occurs. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param NewState: new state of the selected DAC channel DMA request. - * This parameter can be: ENABLE or DISABLE. - * @note The DAC channel1 is mapped on DMA1 Stream 5 channel7 which must be - * already configured. - * @note The DAC channel2 is mapped on DMA1 Stream 6 channel7 which must be - * already configured. - * @retval None - */ -void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected DAC channel DMA request */ - DAC->CR |= (DAC_CR_DMAEN1 << DAC_Channel); - } - else - { - /* Disable the selected DAC channel DMA request */ - DAC->CR &= (~(DAC_CR_DMAEN1 << DAC_Channel)); - } -} -/** - * @} - */ - -/** @defgroup DAC_Group3 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified DAC interrupts. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_IT: specifies the DAC interrupt sources to be enabled or disabled. - * This parameter can be the following values: - * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask - * @note The DMA underrun occurs when a second external trigger arrives before the - * acknowledgement for the first external trigger is received (first request). - * @param NewState: new state of the specified DAC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_DAC_IT(DAC_IT)); - - if (NewState != DISABLE) - { - /* Enable the selected DAC interrupts */ - DAC->CR |= (DAC_IT << DAC_Channel); - } - else - { - /* Disable the selected DAC interrupts */ - DAC->CR &= (~(uint32_t)(DAC_IT << DAC_Channel)); - } -} - -/** - * @brief Checks whether the specified DAC flag is set or not. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_FLAG: specifies the flag to check. - * This parameter can be only of the following value: - * @arg DAC_FLAG_DMAUDR: DMA underrun flag - * @note The DMA underrun occurs when a second external trigger arrives before the - * acknowledgement for the first external trigger is received (first request). - * @retval The new state of DAC_FLAG (SET or RESET). - */ -FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_FLAG(DAC_FLAG)); - - /* Check the status of the specified DAC flag */ - if ((DAC->SR & (DAC_FLAG << DAC_Channel)) != (uint8_t)RESET) - { - /* DAC_FLAG is set */ - bitstatus = SET; - } - else - { - /* DAC_FLAG is reset */ - bitstatus = RESET; - } - /* Return the DAC_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the DAC channel's pending flags. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_FLAG: specifies the flag to clear. - * This parameter can be of the following value: - * @arg DAC_FLAG_DMAUDR: DMA underrun flag - * @note The DMA underrun occurs when a second external trigger arrives before the - * acknowledgement for the first external trigger is received (first request). - * @retval None - */ -void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_FLAG(DAC_FLAG)); - - /* Clear the selected DAC flags */ - DAC->SR = (DAC_FLAG << DAC_Channel); -} - -/** - * @brief Checks whether the specified DAC interrupt has occurred or not. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_IT: specifies the DAC interrupt source to check. - * This parameter can be the following values: - * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask - * @note The DMA underrun occurs when a second external trigger arrives before the - * acknowledgement for the first external trigger is received (first request). - * @retval The new state of DAC_IT (SET or RESET). - */ -ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT) -{ - ITStatus bitstatus = RESET; - uint32_t enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_IT(DAC_IT)); - - /* Get the DAC_IT enable bit status */ - enablestatus = (DAC->CR & (DAC_IT << DAC_Channel)) ; - - /* Check the status of the specified DAC interrupt */ - if (((DAC->SR & (DAC_IT << DAC_Channel)) != (uint32_t)RESET) && enablestatus) - { - /* DAC_IT is set */ - bitstatus = SET; - } - else - { - /* DAC_IT is reset */ - bitstatus = RESET; - } - /* Return the DAC_IT status */ - return bitstatus; -} - -/** - * @brief Clears the DAC channel's interrupt pending bits. - * @param DAC_Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_Channel_1: DAC Channel1 selected - * @arg DAC_Channel_2: DAC Channel2 selected - * @param DAC_IT: specifies the DAC interrupt pending bit to clear. - * This parameter can be the following values: - * @arg DAC_IT_DMAUDR: DMA underrun interrupt mask - * @note The DMA underrun occurs when a second external trigger arrives before the - * acknowledgement for the first external trigger is received (first request). - * @retval None - */ -void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(DAC_Channel)); - assert_param(IS_DAC_IT(DAC_IT)); - - /* Clear the selected DAC interrupt pending bits */ - DAC->SR = (DAC_IT << DAC_Channel); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_dac.h b/car_hw/src/lib/stdperiph/stm32f4xx_dac.h deleted file mode 100644 index d7c27596ce6..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_dac.h +++ /dev/null @@ -1,298 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_dac.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the DAC firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_DAC_H -#define __STM32F4xx_DAC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup DAC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief DAC Init structure definition - */ - -typedef struct -{ - uint32_t DAC_Trigger; /*!< Specifies the external trigger for the selected DAC channel. - This parameter can be a value of @ref DAC_trigger_selection */ - - uint32_t DAC_WaveGeneration; /*!< Specifies whether DAC channel noise waves or triangle waves - are generated, or whether no wave is generated. - This parameter can be a value of @ref DAC_wave_generation */ - - uint32_t DAC_LFSRUnmask_TriangleAmplitude; /*!< Specifies the LFSR mask for noise wave generation or - the maximum amplitude triangle generation for the DAC channel. - This parameter can be a value of @ref DAC_lfsrunmask_triangleamplitude */ - - uint32_t DAC_OutputBuffer; /*!< Specifies whether the DAC channel output buffer is enabled or disabled. - This parameter can be a value of @ref DAC_output_buffer */ -}DAC_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup DAC_Exported_Constants - * @{ - */ - -/** @defgroup DAC_trigger_selection - * @{ - */ - -#define DAC_Trigger_None ((uint32_t)0x00000000) /*!< Conversion is automatic once the DAC1_DHRxxxx register - has been loaded, and not by external trigger */ -#define DAC_Trigger_T2_TRGO ((uint32_t)0x00000024) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_Trigger_T4_TRGO ((uint32_t)0x0000002C) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_Trigger_T5_TRGO ((uint32_t)0x0000001C) /*!< TIM5 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_Trigger_T6_TRGO ((uint32_t)0x00000004) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_Trigger_T7_TRGO ((uint32_t)0x00000014) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_Trigger_T8_TRGO ((uint32_t)0x0000000C) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel */ - -#define DAC_Trigger_Ext_IT9 ((uint32_t)0x00000034) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */ -#define DAC_Trigger_Software ((uint32_t)0x0000003C) /*!< Conversion started by software trigger for DAC channel */ - -#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_Trigger_None) || \ - ((TRIGGER) == DAC_Trigger_T6_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T8_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T7_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T5_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T2_TRGO) || \ - ((TRIGGER) == DAC_Trigger_T4_TRGO) || \ - ((TRIGGER) == DAC_Trigger_Ext_IT9) || \ - ((TRIGGER) == DAC_Trigger_Software)) - -/** - * @} - */ - -/** @defgroup DAC_wave_generation - * @{ - */ - -#define DAC_WaveGeneration_None ((uint32_t)0x00000000) -#define DAC_WaveGeneration_Noise ((uint32_t)0x00000040) -#define DAC_WaveGeneration_Triangle ((uint32_t)0x00000080) -#define IS_DAC_GENERATE_WAVE(WAVE) (((WAVE) == DAC_WaveGeneration_None) || \ - ((WAVE) == DAC_WaveGeneration_Noise) || \ - ((WAVE) == DAC_WaveGeneration_Triangle)) -/** - * @} - */ - -/** @defgroup DAC_lfsrunmask_triangleamplitude - * @{ - */ - -#define DAC_LFSRUnmask_Bit0 ((uint32_t)0x00000000) /*!< Unmask DAC channel LFSR bit0 for noise wave generation */ -#define DAC_LFSRUnmask_Bits1_0 ((uint32_t)0x00000100) /*!< Unmask DAC channel LFSR bit[1:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits2_0 ((uint32_t)0x00000200) /*!< Unmask DAC channel LFSR bit[2:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits3_0 ((uint32_t)0x00000300) /*!< Unmask DAC channel LFSR bit[3:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits4_0 ((uint32_t)0x00000400) /*!< Unmask DAC channel LFSR bit[4:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits5_0 ((uint32_t)0x00000500) /*!< Unmask DAC channel LFSR bit[5:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits6_0 ((uint32_t)0x00000600) /*!< Unmask DAC channel LFSR bit[6:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits7_0 ((uint32_t)0x00000700) /*!< Unmask DAC channel LFSR bit[7:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits8_0 ((uint32_t)0x00000800) /*!< Unmask DAC channel LFSR bit[8:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits9_0 ((uint32_t)0x00000900) /*!< Unmask DAC channel LFSR bit[9:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits10_0 ((uint32_t)0x00000A00) /*!< Unmask DAC channel LFSR bit[10:0] for noise wave generation */ -#define DAC_LFSRUnmask_Bits11_0 ((uint32_t)0x00000B00) /*!< Unmask DAC channel LFSR bit[11:0] for noise wave generation */ -#define DAC_TriangleAmplitude_1 ((uint32_t)0x00000000) /*!< Select max triangle amplitude of 1 */ -#define DAC_TriangleAmplitude_3 ((uint32_t)0x00000100) /*!< Select max triangle amplitude of 3 */ -#define DAC_TriangleAmplitude_7 ((uint32_t)0x00000200) /*!< Select max triangle amplitude of 7 */ -#define DAC_TriangleAmplitude_15 ((uint32_t)0x00000300) /*!< Select max triangle amplitude of 15 */ -#define DAC_TriangleAmplitude_31 ((uint32_t)0x00000400) /*!< Select max triangle amplitude of 31 */ -#define DAC_TriangleAmplitude_63 ((uint32_t)0x00000500) /*!< Select max triangle amplitude of 63 */ -#define DAC_TriangleAmplitude_127 ((uint32_t)0x00000600) /*!< Select max triangle amplitude of 127 */ -#define DAC_TriangleAmplitude_255 ((uint32_t)0x00000700) /*!< Select max triangle amplitude of 255 */ -#define DAC_TriangleAmplitude_511 ((uint32_t)0x00000800) /*!< Select max triangle amplitude of 511 */ -#define DAC_TriangleAmplitude_1023 ((uint32_t)0x00000900) /*!< Select max triangle amplitude of 1023 */ -#define DAC_TriangleAmplitude_2047 ((uint32_t)0x00000A00) /*!< Select max triangle amplitude of 2047 */ -#define DAC_TriangleAmplitude_4095 ((uint32_t)0x00000B00) /*!< Select max triangle amplitude of 4095 */ - -#define IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(VALUE) (((VALUE) == DAC_LFSRUnmask_Bit0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits1_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits2_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits3_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits4_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits5_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits6_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits7_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits8_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits9_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits10_0) || \ - ((VALUE) == DAC_LFSRUnmask_Bits11_0) || \ - ((VALUE) == DAC_TriangleAmplitude_1) || \ - ((VALUE) == DAC_TriangleAmplitude_3) || \ - ((VALUE) == DAC_TriangleAmplitude_7) || \ - ((VALUE) == DAC_TriangleAmplitude_15) || \ - ((VALUE) == DAC_TriangleAmplitude_31) || \ - ((VALUE) == DAC_TriangleAmplitude_63) || \ - ((VALUE) == DAC_TriangleAmplitude_127) || \ - ((VALUE) == DAC_TriangleAmplitude_255) || \ - ((VALUE) == DAC_TriangleAmplitude_511) || \ - ((VALUE) == DAC_TriangleAmplitude_1023) || \ - ((VALUE) == DAC_TriangleAmplitude_2047) || \ - ((VALUE) == DAC_TriangleAmplitude_4095)) -/** - * @} - */ - -/** @defgroup DAC_output_buffer - * @{ - */ - -#define DAC_OutputBuffer_Enable ((uint32_t)0x00000000) -#define DAC_OutputBuffer_Disable ((uint32_t)0x00000002) -#define IS_DAC_OUTPUT_BUFFER_STATE(STATE) (((STATE) == DAC_OutputBuffer_Enable) || \ - ((STATE) == DAC_OutputBuffer_Disable)) -/** - * @} - */ - -/** @defgroup DAC_Channel_selection - * @{ - */ - -#define DAC_Channel_1 ((uint32_t)0x00000000) -#define DAC_Channel_2 ((uint32_t)0x00000010) -#define IS_DAC_CHANNEL(CHANNEL) (((CHANNEL) == DAC_Channel_1) || \ - ((CHANNEL) == DAC_Channel_2)) -/** - * @} - */ - -/** @defgroup DAC_data_alignement - * @{ - */ - -#define DAC_Align_12b_R ((uint32_t)0x00000000) -#define DAC_Align_12b_L ((uint32_t)0x00000004) -#define DAC_Align_8b_R ((uint32_t)0x00000008) -#define IS_DAC_ALIGN(ALIGN) (((ALIGN) == DAC_Align_12b_R) || \ - ((ALIGN) == DAC_Align_12b_L) || \ - ((ALIGN) == DAC_Align_8b_R)) -/** - * @} - */ - -/** @defgroup DAC_wave_generation - * @{ - */ - -#define DAC_Wave_Noise ((uint32_t)0x00000040) -#define DAC_Wave_Triangle ((uint32_t)0x00000080) -#define IS_DAC_WAVE(WAVE) (((WAVE) == DAC_Wave_Noise) || \ - ((WAVE) == DAC_Wave_Triangle)) -/** - * @} - */ - -/** @defgroup DAC_data - * @{ - */ - -#define IS_DAC_DATA(DATA) ((DATA) <= 0xFFF0) -/** - * @} - */ - -/** @defgroup DAC_interrupts_definition - * @{ - */ -#define DAC_IT_DMAUDR ((uint32_t)0x00002000) -#define IS_DAC_IT(IT) (((IT) == DAC_IT_DMAUDR)) - -/** - * @} - */ - -/** @defgroup DAC_flags_definition - * @{ - */ - -#define DAC_FLAG_DMAUDR ((uint32_t)0x00002000) -#define IS_DAC_FLAG(FLAG) (((FLAG) == DAC_FLAG_DMAUDR)) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the DAC configuration to the default reset state *****/ -void DAC_DeInit(void); - -/* DAC channels configuration: trigger, output buffer, data format functions */ -void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct); -void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct); -void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState); -void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState); -void DAC_DualSoftwareTriggerCmd(FunctionalState NewState); -void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState); -void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data); -void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data); -void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1); -uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel); - -/* DMA management functions ***************************************************/ -void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState); - -/* Interrupts and flags management functions **********************************/ -void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState); -FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG); -void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG); -ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT); -void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_DAC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_dbgmcu.c b/car_hw/src/lib/stdperiph/stm32f4xx_dbgmcu.c deleted file mode 100644 index 4a4d22a95ef..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_dbgmcu.c +++ /dev/null @@ -1,175 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_dbgmcu.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides all the DBGMCU firmware functions. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_dbgmcu.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup DBGMCU - * @brief DBGMCU driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define IDCODE_DEVID_MASK ((uint32_t)0x00000FFF) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup DBGMCU_Private_Functions - * @{ - */ - -/** - * @brief Returns the device revision identifier. - * @param None - * @retval Device revision identifier - */ -uint32_t DBGMCU_GetREVID(void) -{ - return(DBGMCU->IDCODE >> 16); -} - -/** - * @brief Returns the device identifier. - * @param None - * @retval Device identifier - */ -uint32_t DBGMCU_GetDEVID(void) -{ - return(DBGMCU->IDCODE & IDCODE_DEVID_MASK); -} - -/** - * @brief Configures low power mode behavior when the MCU is in Debug mode. - * @param DBGMCU_Periph: specifies the low power mode. - * This parameter can be any combination of the following values: - * @arg DBGMCU_SLEEP: Keep debugger connection during SLEEP mode - * @arg DBGMCU_STOP: Keep debugger connection during STOP mode - * @arg DBGMCU_STANDBY: Keep debugger connection during STANDBY mode - * @param NewState: new state of the specified low power mode in Debug mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DBGMCU_PERIPH(DBGMCU_Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - DBGMCU->CR |= DBGMCU_Periph; - } - else - { - DBGMCU->CR &= ~DBGMCU_Periph; - } -} - -/** - * @brief Configures APB1 peripheral behavior when the MCU is in Debug mode. - * @param DBGMCU_Periph: specifies the APB1 peripheral. - * This parameter can be any combination of the following values: - * @arg DBGMCU_TIM2_STOP: TIM2 counter stopped when Core is halted - * @arg DBGMCU_TIM3_STOP: TIM3 counter stopped when Core is halted - * @arg DBGMCU_TIM4_STOP: TIM4 counter stopped when Core is halted - * @arg DBGMCU_TIM5_STOP: TIM5 counter stopped when Core is halted - * @arg DBGMCU_TIM6_STOP: TIM6 counter stopped when Core is halted - * @arg DBGMCU_TIM7_STOP: TIM7 counter stopped when Core is halted - * @arg DBGMCU_TIM12_STOP: TIM12 counter stopped when Core is halted - * @arg DBGMCU_TIM13_STOP: TIM13 counter stopped when Core is halted - * @arg DBGMCU_TIM14_STOP: TIM14 counter stopped when Core is halted - * @arg DBGMCU_RTC_STOP: RTC Calendar and Wakeup counter stopped when Core is halted. - * @arg DBGMCU_WWDG_STOP: Debug WWDG stopped when Core is halted - * @arg DBGMCU_IWDG_STOP: Debug IWDG stopped when Core is halted - * @arg DBGMCU_I2C1_SMBUS_TIMEOUT: I2C1 SMBUS timeout mode stopped when Core is halted - * @arg DBGMCU_I2C2_SMBUS_TIMEOUT: I2C2 SMBUS timeout mode stopped when Core is halted - * @arg DBGMCU_I2C3_SMBUS_TIMEOUT: I2C3 SMBUS timeout mode stopped when Core is halted - * @arg DBGMCU_CAN2_STOP: Debug CAN1 stopped when Core is halted - * @arg DBGMCU_CAN1_STOP: Debug CAN2 stopped when Core is halted - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DBGMCU_APB1PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DBGMCU_APB1PERIPH(DBGMCU_Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - DBGMCU->APB1FZ |= DBGMCU_Periph; - } - else - { - DBGMCU->APB1FZ &= ~DBGMCU_Periph; - } -} - -/** - * @brief Configures APB2 peripheral behavior when the MCU is in Debug mode. - * @param DBGMCU_Periph: specifies the APB2 peripheral. - * This parameter can be any combination of the following values: - * @arg DBGMCU_TIM1_STOP: TIM1 counter stopped when Core is halted - * @arg DBGMCU_TIM8_STOP: TIM8 counter stopped when Core is halted - * @arg DBGMCU_TIM9_STOP: TIM9 counter stopped when Core is halted - * @arg DBGMCU_TIM10_STOP: TIM10 counter stopped when Core is halted - * @arg DBGMCU_TIM11_STOP: TIM11 counter stopped when Core is halted - * @param NewState: new state of the specified peripheral in Debug mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DBGMCU_APB2PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DBGMCU_APB2PERIPH(DBGMCU_Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - DBGMCU->APB2FZ |= DBGMCU_Periph; - } - else - { - DBGMCU->APB2FZ &= ~DBGMCU_Periph; - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_dbgmcu.h b/car_hw/src/lib/stdperiph/stm32f4xx_dbgmcu.h deleted file mode 100644 index b10b134d66d..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_dbgmcu.h +++ /dev/null @@ -1,103 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_dbgmcu.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the DBGMCU firmware library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_DBGMCU_H -#define __STM32F4xx_DBGMCU_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup DBGMCU - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup DBGMCU_Exported_Constants - * @{ - */ -#define DBGMCU_SLEEP ((uint32_t)0x00000001) -#define DBGMCU_STOP ((uint32_t)0x00000002) -#define DBGMCU_STANDBY ((uint32_t)0x00000004) -#define IS_DBGMCU_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFFF8) == 0x00) && ((PERIPH) != 0x00)) - -#define DBGMCU_TIM2_STOP ((uint32_t)0x00000001) -#define DBGMCU_TIM3_STOP ((uint32_t)0x00000002) -#define DBGMCU_TIM4_STOP ((uint32_t)0x00000004) -#define DBGMCU_TIM5_STOP ((uint32_t)0x00000008) -#define DBGMCU_TIM6_STOP ((uint32_t)0x00000010) -#define DBGMCU_TIM7_STOP ((uint32_t)0x00000020) -#define DBGMCU_TIM12_STOP ((uint32_t)0x00000040) -#define DBGMCU_TIM13_STOP ((uint32_t)0x00000080) -#define DBGMCU_TIM14_STOP ((uint32_t)0x00000100) -#define DBGMCU_RTC_STOP ((uint32_t)0x00000400) -#define DBGMCU_WWDG_STOP ((uint32_t)0x00000800) -#define DBGMCU_IWDG_STOP ((uint32_t)0x00001000) -#define DBGMCU_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00200000) -#define DBGMCU_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00400000) -#define DBGMCU_I2C3_SMBUS_TIMEOUT ((uint32_t)0x00800000) -#define DBGMCU_CAN1_STOP ((uint32_t)0x02000000) -#define DBGMCU_CAN2_STOP ((uint32_t)0x04000000) -#define IS_DBGMCU_APB1PERIPH(PERIPH) ((((PERIPH) & 0xF91FE200) == 0x00) && ((PERIPH) != 0x00)) - -#define DBGMCU_TIM1_STOP ((uint32_t)0x00000001) -#define DBGMCU_TIM8_STOP ((uint32_t)0x00000002) -#define DBGMCU_TIM9_STOP ((uint32_t)0x00010000) -#define DBGMCU_TIM10_STOP ((uint32_t)0x00020000) -#define DBGMCU_TIM11_STOP ((uint32_t)0x00040000) -#define IS_DBGMCU_APB2PERIPH(PERIPH) ((((PERIPH) & 0xFFF8FFFC) == 0x00) && ((PERIPH) != 0x00)) -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -uint32_t DBGMCU_GetREVID(void); -uint32_t DBGMCU_GetDEVID(void); -void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState); -void DBGMCU_APB1PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState); -void DBGMCU_APB2PeriphConfig(uint32_t DBGMCU_Periph, FunctionalState NewState); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_DBGMCU_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_dcmi.c b/car_hw/src/lib/stdperiph/stm32f4xx_dcmi.c deleted file mode 100644 index 2fe729e5879..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_dcmi.c +++ /dev/null @@ -1,535 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_dcmi.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the DCMI peripheral: - * - Initialization and Configuration - * - Image capture functions - * - Interrupts and flags management - * - * @verbatim - * - * - * =================================================================== - * How to use this driver - * =================================================================== - * - * The sequence below describes how to use this driver to capture image - * from a camera module connected to the DCMI Interface. - * This sequence does not take into account the configuration of the - * camera module, which should be made before to configure and enable - * the DCMI to capture images. - * - * 1. Enable the clock for the DCMI and associated GPIOs using the following functions: - * RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE); - * RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); - * - * 2. DCMI pins configuration - * - Connect the involved DCMI pins to AF13 using the following function - * GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_DCMI); - * - Configure these DCMI pins in alternate function mode by calling the function - * GPIO_Init(); - * - * 3. Declare a DCMI_InitTypeDef structure, for example: - * DCMI_InitTypeDef DCMI_InitStructure; - * and fill the DCMI_InitStructure variable with the allowed values - * of the structure member. - * - * 4. Initialize the DCMI interface by calling the function - * DCMI_Init(&DCMI_InitStructure); - * - * 5. Configure the DMA2_Stream1 channel1 to transfer Data from DCMI DR - * register to the destination memory buffer. - * - * 6. Enable DCMI interface using the function - * DCMI_Cmd(ENABLE); - * - * 7. Start the image capture using the function - * DCMI_CaptureCmd(ENABLE); - * - * 8. At this stage the DCMI interface waits for the first start of frame, - * then a DMA request is generated continuously/once (depending on the - * mode used, Continuous/Snapshot) to transfer the received data into - * the destination memory. - * - * @note If you need to capture only a rectangular window from the received - * image, you have to use the DCMI_CROPConfig() function to configure - * the coordinates and size of the window to be captured, then enable - * the Crop feature using DCMI_CROPCmd(ENABLE); - * In this case, the Crop configuration should be made before to enable - * and start the DCMI interface. - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_dcmi.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup DCMI - * @brief DCMI driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup DCMI_Private_Functions - * @{ - */ - -/** @defgroup DCMI_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - Initialization and Configuration functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the DCMI registers to their default reset values. - * @param None - * @retval None - */ -void DCMI_DeInit(void) -{ - DCMI->CR = 0x0; - DCMI->IER = 0x0; - DCMI->ICR = 0x1F; - DCMI->ESCR = 0x0; - DCMI->ESUR = 0x0; - DCMI->CWSTRTR = 0x0; - DCMI->CWSIZER = 0x0; -} - -/** - * @brief Initializes the DCMI according to the specified parameters in the DCMI_InitStruct. - * @param DCMI_InitStruct: pointer to a DCMI_InitTypeDef structure that contains - * the configuration information for the DCMI. - * @retval None - */ -void DCMI_Init(DCMI_InitTypeDef* DCMI_InitStruct) -{ - uint32_t temp = 0x0; - - /* Check the parameters */ - assert_param(IS_DCMI_CAPTURE_MODE(DCMI_InitStruct->DCMI_CaptureMode)); - assert_param(IS_DCMI_SYNCHRO(DCMI_InitStruct->DCMI_SynchroMode)); - assert_param(IS_DCMI_PCKPOLARITY(DCMI_InitStruct->DCMI_PCKPolarity)); - assert_param(IS_DCMI_VSPOLARITY(DCMI_InitStruct->DCMI_VSPolarity)); - assert_param(IS_DCMI_HSPOLARITY(DCMI_InitStruct->DCMI_HSPolarity)); - assert_param(IS_DCMI_CAPTURE_RATE(DCMI_InitStruct->DCMI_CaptureRate)); - assert_param(IS_DCMI_EXTENDED_DATA(DCMI_InitStruct->DCMI_ExtendedDataMode)); - - /* The DCMI configuration registers should be programmed correctly before - enabling the CR_ENABLE Bit and the CR_CAPTURE Bit */ - DCMI->CR &= ~(DCMI_CR_ENABLE | DCMI_CR_CAPTURE); - - /* Reset the old DCMI configuration */ - temp = DCMI->CR; - - temp &= ~((uint32_t)DCMI_CR_CM | DCMI_CR_ESS | DCMI_CR_PCKPOL | - DCMI_CR_HSPOL | DCMI_CR_VSPOL | DCMI_CR_FCRC_0 | - DCMI_CR_FCRC_1 | DCMI_CR_EDM_0 | DCMI_CR_EDM_1); - - /* Sets the new configuration of the DCMI peripheral */ - temp |= ((uint32_t)DCMI_InitStruct->DCMI_CaptureMode | - DCMI_InitStruct->DCMI_SynchroMode | - DCMI_InitStruct->DCMI_PCKPolarity | - DCMI_InitStruct->DCMI_VSPolarity | - DCMI_InitStruct->DCMI_HSPolarity | - DCMI_InitStruct->DCMI_CaptureRate | - DCMI_InitStruct->DCMI_ExtendedDataMode); - - DCMI->CR = temp; -} - -/** - * @brief Fills each DCMI_InitStruct member with its default value. - * @param DCMI_InitStruct : pointer to a DCMI_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void DCMI_StructInit(DCMI_InitTypeDef* DCMI_InitStruct) -{ - /* Set the default configuration */ - DCMI_InitStruct->DCMI_CaptureMode = DCMI_CaptureMode_Continuous; - DCMI_InitStruct->DCMI_SynchroMode = DCMI_SynchroMode_Hardware; - DCMI_InitStruct->DCMI_PCKPolarity = DCMI_PCKPolarity_Falling; - DCMI_InitStruct->DCMI_VSPolarity = DCMI_VSPolarity_Low; - DCMI_InitStruct->DCMI_HSPolarity = DCMI_HSPolarity_Low; - DCMI_InitStruct->DCMI_CaptureRate = DCMI_CaptureRate_All_Frame; - DCMI_InitStruct->DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b; -} - -/** - * @brief Initializes the DCMI peripheral CROP mode according to the specified - * parameters in the DCMI_CROPInitStruct. - * @note This function should be called before to enable and start the DCMI interface. - * @param DCMI_CROPInitStruct: pointer to a DCMI_CROPInitTypeDef structure that - * contains the configuration information for the DCMI peripheral CROP mode. - * @retval None - */ -void DCMI_CROPConfig(DCMI_CROPInitTypeDef* DCMI_CROPInitStruct) -{ - /* Sets the CROP window coordinates */ - DCMI->CWSTRTR = (uint32_t)((uint32_t)DCMI_CROPInitStruct->DCMI_HorizontalOffsetCount | - ((uint32_t)DCMI_CROPInitStruct->DCMI_VerticalStartLine << 16)); - - /* Sets the CROP window size */ - DCMI->CWSIZER = (uint32_t)(DCMI_CROPInitStruct->DCMI_CaptureCount | - ((uint32_t)DCMI_CROPInitStruct->DCMI_VerticalLineCount << 16)); -} - -/** - * @brief Enables or disables the DCMI Crop feature. - * @note This function should be called before to enable and start the DCMI interface. - * @param NewState: new state of the DCMI Crop feature. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DCMI_CROPCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the DCMI Crop feature */ - DCMI->CR |= (uint32_t)DCMI_CR_CROP; - } - else - { - /* Disable the DCMI Crop feature */ - DCMI->CR &= ~(uint32_t)DCMI_CR_CROP; - } -} - -/** - * @brief Sets the embedded synchronization codes - * @param DCMI_CodesInitTypeDef: pointer to a DCMI_CodesInitTypeDef structure that - * contains the embedded synchronization codes for the DCMI peripheral. - * @retval None - */ -void DCMI_SetEmbeddedSynchroCodes(DCMI_CodesInitTypeDef* DCMI_CodesInitStruct) -{ - DCMI->ESCR = (uint32_t)(DCMI_CodesInitStruct->DCMI_FrameStartCode | - ((uint32_t)DCMI_CodesInitStruct->DCMI_LineStartCode << 8)| - ((uint32_t)DCMI_CodesInitStruct->DCMI_LineEndCode << 16)| - ((uint32_t)DCMI_CodesInitStruct->DCMI_FrameEndCode << 24)); -} - -/** - * @brief Enables or disables the DCMI JPEG format. - * @note The Crop and Embedded Synchronization features cannot be used in this mode. - * @param NewState: new state of the DCMI JPEG format. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DCMI_JPEGCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the DCMI JPEG format */ - DCMI->CR |= (uint32_t)DCMI_CR_JPEG; - } - else - { - /* Disable the DCMI JPEG format */ - DCMI->CR &= ~(uint32_t)DCMI_CR_JPEG; - } -} -/** - * @} - */ - -/** @defgroup DCMI_Group2 Image capture functions - * @brief Image capture functions - * -@verbatim - =============================================================================== - Image capture functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the DCMI interface. - * @param NewState: new state of the DCMI interface. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DCMI_Cmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the DCMI by setting ENABLE bit */ - DCMI->CR |= (uint32_t)DCMI_CR_ENABLE; - } - else - { - /* Disable the DCMI by clearing ENABLE bit */ - DCMI->CR &= ~(uint32_t)DCMI_CR_ENABLE; - } -} - -/** - * @brief Enables or disables the DCMI Capture. - * @param NewState: new state of the DCMI capture. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DCMI_CaptureCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the DCMI Capture */ - DCMI->CR |= (uint32_t)DCMI_CR_CAPTURE; - } - else - { - /* Disable the DCMI Capture */ - DCMI->CR &= ~(uint32_t)DCMI_CR_CAPTURE; - } -} - -/** - * @brief Reads the data stored in the DR register. - * @param None - * @retval Data register value - */ -uint32_t DCMI_ReadData(void) -{ - return DCMI->DR; -} -/** - * @} - */ - -/** @defgroup DCMI_Group3 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the DCMI interface interrupts. - * @param DCMI_IT: specifies the DCMI interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg DCMI_IT_FRAME: Frame capture complete interrupt mask - * @arg DCMI_IT_OVF: Overflow interrupt mask - * @arg DCMI_IT_ERR: Synchronization error interrupt mask - * @arg DCMI_IT_VSYNC: VSYNC interrupt mask - * @arg DCMI_IT_LINE: Line interrupt mask - * @param NewState: new state of the specified DCMI interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DCMI_ITConfig(uint16_t DCMI_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DCMI_CONFIG_IT(DCMI_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Interrupt sources */ - DCMI->IER |= DCMI_IT; - } - else - { - /* Disable the Interrupt sources */ - DCMI->IER &= (uint16_t)(~DCMI_IT); - } -} - -/** - * @brief Checks whether the DCMI interface flag is set or not. - * @param DCMI_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg DCMI_FLAG_FRAMERI: Frame capture complete Raw flag mask - * @arg DCMI_FLAG_OVFRI: Overflow Raw flag mask - * @arg DCMI_FLAG_ERRRI: Synchronization error Raw flag mask - * @arg DCMI_FLAG_VSYNCRI: VSYNC Raw flag mask - * @arg DCMI_FLAG_LINERI: Line Raw flag mask - * @arg DCMI_FLAG_FRAMEMI: Frame capture complete Masked flag mask - * @arg DCMI_FLAG_OVFMI: Overflow Masked flag mask - * @arg DCMI_FLAG_ERRMI: Synchronization error Masked flag mask - * @arg DCMI_FLAG_VSYNCMI: VSYNC Masked flag mask - * @arg DCMI_FLAG_LINEMI: Line Masked flag mask - * @arg DCMI_FLAG_HSYNC: HSYNC flag mask - * @arg DCMI_FLAG_VSYNC: VSYNC flag mask - * @arg DCMI_FLAG_FNE: Fifo not empty flag mask - * @retval The new state of DCMI_FLAG (SET or RESET). - */ -FlagStatus DCMI_GetFlagStatus(uint16_t DCMI_FLAG) -{ - FlagStatus bitstatus = RESET; - uint32_t dcmireg, tempreg = 0; - - /* Check the parameters */ - assert_param(IS_DCMI_GET_FLAG(DCMI_FLAG)); - - /* Get the DCMI register index */ - dcmireg = (((uint16_t)DCMI_FLAG) >> 12); - - if (dcmireg == 0x01) /* The FLAG is in RISR register */ - { - tempreg= DCMI->RISR; - } - else if (dcmireg == 0x02) /* The FLAG is in SR register */ - { - tempreg = DCMI->SR; - } - else /* The FLAG is in MISR register */ - { - tempreg = DCMI->MISR; - } - - if ((tempreg & DCMI_FLAG) != (uint16_t)RESET ) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the DCMI_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the DCMI's pending flags. - * @param DCMI_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg DCMI_FLAG_FRAMERI: Frame capture complete Raw flag mask - * @arg DCMI_FLAG_OVFRI: Overflow Raw flag mask - * @arg DCMI_FLAG_ERRRI: Synchronization error Raw flag mask - * @arg DCMI_FLAG_VSYNCRI: VSYNC Raw flag mask - * @arg DCMI_FLAG_LINERI: Line Raw flag mask - * @retval None - */ -void DCMI_ClearFlag(uint16_t DCMI_FLAG) -{ - /* Check the parameters */ - assert_param(IS_DCMI_CLEAR_FLAG(DCMI_FLAG)); - - /* Clear the flag by writing in the ICR register 1 in the corresponding - Flag position*/ - - DCMI->ICR = DCMI_FLAG; -} - -/** - * @brief Checks whether the DCMI interrupt has occurred or not. - * @param DCMI_IT: specifies the DCMI interrupt source to check. - * This parameter can be one of the following values: - * @arg DCMI_IT_FRAME: Frame capture complete interrupt mask - * @arg DCMI_IT_OVF: Overflow interrupt mask - * @arg DCMI_IT_ERR: Synchronization error interrupt mask - * @arg DCMI_IT_VSYNC: VSYNC interrupt mask - * @arg DCMI_IT_LINE: Line interrupt mask - * @retval The new state of DCMI_IT (SET or RESET). - */ -ITStatus DCMI_GetITStatus(uint16_t DCMI_IT) -{ - ITStatus bitstatus = RESET; - uint32_t itstatus = 0; - - /* Check the parameters */ - assert_param(IS_DCMI_GET_IT(DCMI_IT)); - - itstatus = DCMI->MISR & DCMI_IT; /* Only masked interrupts are checked */ - - if ((itstatus != (uint16_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the DCMI's interrupt pending bits. - * @param DCMI_IT: specifies the DCMI interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg DCMI_IT_FRAME: Frame capture complete interrupt mask - * @arg DCMI_IT_OVF: Overflow interrupt mask - * @arg DCMI_IT_ERR: Synchronization error interrupt mask - * @arg DCMI_IT_VSYNC: VSYNC interrupt mask - * @arg DCMI_IT_LINE: Line interrupt mask - * @retval None - */ -void DCMI_ClearITPendingBit(uint16_t DCMI_IT) -{ - /* Clear the interrupt pending Bit by writing in the ICR register 1 in the - corresponding pending Bit position*/ - - DCMI->ICR = DCMI_IT; -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_dcmi.h b/car_hw/src/lib/stdperiph/stm32f4xx_dcmi.h deleted file mode 100644 index c40b3c87fe9..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_dcmi.h +++ /dev/null @@ -1,306 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_dcmi.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the DCMI firmware library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_DCMI_H -#define __STM32F4xx_DCMI_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup DCMI - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** - * @brief DCMI Init structure definition - */ -typedef struct -{ - uint16_t DCMI_CaptureMode; /*!< Specifies the Capture Mode: Continuous or Snapshot. - This parameter can be a value of @ref DCMI_Capture_Mode */ - - uint16_t DCMI_SynchroMode; /*!< Specifies the Synchronization Mode: Hardware or Embedded. - This parameter can be a value of @ref DCMI_Synchronization_Mode */ - - uint16_t DCMI_PCKPolarity; /*!< Specifies the Pixel clock polarity: Falling or Rising. - This parameter can be a value of @ref DCMI_PIXCK_Polarity */ - - uint16_t DCMI_VSPolarity; /*!< Specifies the Vertical synchronization polarity: High or Low. - This parameter can be a value of @ref DCMI_VSYNC_Polarity */ - - uint16_t DCMI_HSPolarity; /*!< Specifies the Horizontal synchronization polarity: High or Low. - This parameter can be a value of @ref DCMI_HSYNC_Polarity */ - - uint16_t DCMI_CaptureRate; /*!< Specifies the frequency of frame capture: All, 1/2 or 1/4. - This parameter can be a value of @ref DCMI_Capture_Rate */ - - uint16_t DCMI_ExtendedDataMode; /*!< Specifies the data width: 8-bit, 10-bit, 12-bit or 14-bit. - This parameter can be a value of @ref DCMI_Extended_Data_Mode */ -} DCMI_InitTypeDef; - -/** - * @brief DCMI CROP Init structure definition - */ -typedef struct -{ - uint16_t DCMI_VerticalStartLine; /*!< Specifies the Vertical start line count from which the image capture - will start. This parameter can be a value between 0x00 and 0x1FFF */ - - uint16_t DCMI_HorizontalOffsetCount; /*!< Specifies the number of pixel clocks to count before starting a capture. - This parameter can be a value between 0x00 and 0x3FFF */ - - uint16_t DCMI_VerticalLineCount; /*!< Specifies the number of lines to be captured from the starting point. - This parameter can be a value between 0x00 and 0x3FFF */ - - uint16_t DCMI_CaptureCount; /*!< Specifies the number of pixel clocks to be captured from the starting - point on the same line. - This parameter can be a value between 0x00 and 0x3FFF */ -} DCMI_CROPInitTypeDef; - -/** - * @brief DCMI Embedded Synchronisation CODE Init structure definition - */ -typedef struct -{ - uint8_t DCMI_FrameStartCode; /*!< Specifies the code of the frame start delimiter. */ - uint8_t DCMI_LineStartCode; /*!< Specifies the code of the line start delimiter. */ - uint8_t DCMI_LineEndCode; /*!< Specifies the code of the line end delimiter. */ - uint8_t DCMI_FrameEndCode; /*!< Specifies the code of the frame end delimiter. */ -} DCMI_CodesInitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup DCMI_Exported_Constants - * @{ - */ - -/** @defgroup DCMI_Capture_Mode - * @{ - */ -#define DCMI_CaptureMode_Continuous ((uint16_t)0x0000) /*!< The received data are transferred continuously - into the destination memory through the DMA */ -#define DCMI_CaptureMode_SnapShot ((uint16_t)0x0002) /*!< Once activated, the interface waits for the start of - frame and then transfers a single frame through the DMA */ -#define IS_DCMI_CAPTURE_MODE(MODE)(((MODE) == DCMI_CaptureMode_Continuous) || \ - ((MODE) == DCMI_CaptureMode_SnapShot)) -/** - * @} - */ - - -/** @defgroup DCMI_Synchronization_Mode - * @{ - */ -#define DCMI_SynchroMode_Hardware ((uint16_t)0x0000) /*!< Hardware synchronization data capture (frame/line start/stop) - is synchronized with the HSYNC/VSYNC signals */ -#define DCMI_SynchroMode_Embedded ((uint16_t)0x0010) /*!< Embedded synchronization data capture is synchronized with - synchronization codes embedded in the data flow */ -#define IS_DCMI_SYNCHRO(MODE)(((MODE) == DCMI_SynchroMode_Hardware) || \ - ((MODE) == DCMI_SynchroMode_Embedded)) -/** - * @} - */ - - -/** @defgroup DCMI_PIXCK_Polarity - * @{ - */ -#define DCMI_PCKPolarity_Falling ((uint16_t)0x0000) /*!< Pixel clock active on Falling edge */ -#define DCMI_PCKPolarity_Rising ((uint16_t)0x0020) /*!< Pixel clock active on Rising edge */ -#define IS_DCMI_PCKPOLARITY(POLARITY)(((POLARITY) == DCMI_PCKPolarity_Falling) || \ - ((POLARITY) == DCMI_PCKPolarity_Rising)) -/** - * @} - */ - - -/** @defgroup DCMI_VSYNC_Polarity - * @{ - */ -#define DCMI_VSPolarity_Low ((uint16_t)0x0000) /*!< Vertical synchronization active Low */ -#define DCMI_VSPolarity_High ((uint16_t)0x0080) /*!< Vertical synchronization active High */ -#define IS_DCMI_VSPOLARITY(POLARITY)(((POLARITY) == DCMI_VSPolarity_Low) || \ - ((POLARITY) == DCMI_VSPolarity_High)) -/** - * @} - */ - - -/** @defgroup DCMI_HSYNC_Polarity - * @{ - */ -#define DCMI_HSPolarity_Low ((uint16_t)0x0000) /*!< Horizontal synchronization active Low */ -#define DCMI_HSPolarity_High ((uint16_t)0x0040) /*!< Horizontal synchronization active High */ -#define IS_DCMI_HSPOLARITY(POLARITY)(((POLARITY) == DCMI_HSPolarity_Low) || \ - ((POLARITY) == DCMI_HSPolarity_High)) -/** - * @} - */ - - -/** @defgroup DCMI_Capture_Rate - * @{ - */ -#define DCMI_CaptureRate_All_Frame ((uint16_t)0x0000) /*!< All frames are captured */ -#define DCMI_CaptureRate_1of2_Frame ((uint16_t)0x0100) /*!< Every alternate frame captured */ -#define DCMI_CaptureRate_1of4_Frame ((uint16_t)0x0200) /*!< One frame in 4 frames captured */ -#define IS_DCMI_CAPTURE_RATE(RATE) (((RATE) == DCMI_CaptureRate_All_Frame) || \ - ((RATE) == DCMI_CaptureRate_1of2_Frame) ||\ - ((RATE) == DCMI_CaptureRate_1of4_Frame)) -/** - * @} - */ - - -/** @defgroup DCMI_Extended_Data_Mode - * @{ - */ -#define DCMI_ExtendedDataMode_8b ((uint16_t)0x0000) /*!< Interface captures 8-bit data on every pixel clock */ -#define DCMI_ExtendedDataMode_10b ((uint16_t)0x0400) /*!< Interface captures 10-bit data on every pixel clock */ -#define DCMI_ExtendedDataMode_12b ((uint16_t)0x0800) /*!< Interface captures 12-bit data on every pixel clock */ -#define DCMI_ExtendedDataMode_14b ((uint16_t)0x0C00) /*!< Interface captures 14-bit data on every pixel clock */ -#define IS_DCMI_EXTENDED_DATA(DATA)(((DATA) == DCMI_ExtendedDataMode_8b) || \ - ((DATA) == DCMI_ExtendedDataMode_10b) ||\ - ((DATA) == DCMI_ExtendedDataMode_12b) ||\ - ((DATA) == DCMI_ExtendedDataMode_14b)) -/** - * @} - */ - - -/** @defgroup DCMI_interrupt_sources - * @{ - */ -#define DCMI_IT_FRAME ((uint16_t)0x0001) -#define DCMI_IT_OVF ((uint16_t)0x0002) -#define DCMI_IT_ERR ((uint16_t)0x0004) -#define DCMI_IT_VSYNC ((uint16_t)0x0008) -#define DCMI_IT_LINE ((uint16_t)0x0010) -#define IS_DCMI_CONFIG_IT(IT) ((((IT) & (uint16_t)0xFFE0) == 0x0000) && ((IT) != 0x0000)) -#define IS_DCMI_GET_IT(IT) (((IT) == DCMI_IT_FRAME) || \ - ((IT) == DCMI_IT_OVF) || \ - ((IT) == DCMI_IT_ERR) || \ - ((IT) == DCMI_IT_VSYNC) || \ - ((IT) == DCMI_IT_LINE)) -/** - * @} - */ - - -/** @defgroup DCMI_Flags - * @{ - */ -/** - * @brief DCMI SR register - */ -#define DCMI_FLAG_HSYNC ((uint16_t)0x2001) -#define DCMI_FLAG_VSYNC ((uint16_t)0x2002) -#define DCMI_FLAG_FNE ((uint16_t)0x2004) -/** - * @brief DCMI RISR register - */ -#define DCMI_FLAG_FRAMERI ((uint16_t)0x0001) -#define DCMI_FLAG_OVFRI ((uint16_t)0x0002) -#define DCMI_FLAG_ERRRI ((uint16_t)0x0004) -#define DCMI_FLAG_VSYNCRI ((uint16_t)0x0008) -#define DCMI_FLAG_LINERI ((uint16_t)0x0010) -/** - * @brief DCMI MISR register - */ -#define DCMI_FLAG_FRAMEMI ((uint16_t)0x1001) -#define DCMI_FLAG_OVFMI ((uint16_t)0x1002) -#define DCMI_FLAG_ERRMI ((uint16_t)0x1004) -#define DCMI_FLAG_VSYNCMI ((uint16_t)0x1008) -#define DCMI_FLAG_LINEMI ((uint16_t)0x1010) -#define IS_DCMI_GET_FLAG(FLAG) (((FLAG) == DCMI_FLAG_HSYNC) || \ - ((FLAG) == DCMI_FLAG_VSYNC) || \ - ((FLAG) == DCMI_FLAG_FNE) || \ - ((FLAG) == DCMI_FLAG_FRAMERI) || \ - ((FLAG) == DCMI_FLAG_OVFRI) || \ - ((FLAG) == DCMI_FLAG_ERRRI) || \ - ((FLAG) == DCMI_FLAG_VSYNCRI) || \ - ((FLAG) == DCMI_FLAG_LINERI) || \ - ((FLAG) == DCMI_FLAG_FRAMEMI) || \ - ((FLAG) == DCMI_FLAG_OVFMI) || \ - ((FLAG) == DCMI_FLAG_ERRMI) || \ - ((FLAG) == DCMI_FLAG_VSYNCMI) || \ - ((FLAG) == DCMI_FLAG_LINEMI)) - -#define IS_DCMI_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFFE0) == 0x0000) && ((FLAG) != 0x0000)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the DCMI configuration to the default reset state ****/ -void DCMI_DeInit(void); - -/* Initialization and Configuration functions *********************************/ -void DCMI_Init(DCMI_InitTypeDef* DCMI_InitStruct); -void DCMI_StructInit(DCMI_InitTypeDef* DCMI_InitStruct); -void DCMI_CROPConfig(DCMI_CROPInitTypeDef* DCMI_CROPInitStruct); -void DCMI_CROPCmd(FunctionalState NewState); -void DCMI_SetEmbeddedSynchroCodes(DCMI_CodesInitTypeDef* DCMI_CodesInitStruct); -void DCMI_JPEGCmd(FunctionalState NewState); - -/* Image capture functions ****************************************************/ -void DCMI_Cmd(FunctionalState NewState); -void DCMI_CaptureCmd(FunctionalState NewState); -uint32_t DCMI_ReadData(void); - -/* Interrupts and flags management functions **********************************/ -void DCMI_ITConfig(uint16_t DCMI_IT, FunctionalState NewState); -FlagStatus DCMI_GetFlagStatus(uint16_t DCMI_FLAG); -void DCMI_ClearFlag(uint16_t DCMI_FLAG); -ITStatus DCMI_GetITStatus(uint16_t DCMI_IT); -void DCMI_ClearITPendingBit(uint16_t DCMI_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_DCMI_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_dma.c b/car_hw/src/lib/stdperiph/stm32f4xx_dma.c deleted file mode 100644 index 7bc3000d663..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_dma.c +++ /dev/null @@ -1,1284 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_dma.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Direct Memory Access controller (DMA): - * - Initialization and Configuration - * - Data Counter - * - Double Buffer mode configuration and command - * - Interrupts and flags management - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - * 1. Enable The DMA controller clock using RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA1, ENABLE) - * function for DMA1 or using RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2, ENABLE) - * function for DMA2. - * - * 2. Enable and configure the peripheral to be connected to the DMA Stream - * (except for internal SRAM / FLASH memories: no initialization is - * necessary). - * - * 3. For a given Stream, program the required configuration through following parameters: - * Source and Destination addresses, Transfer Direction, Transfer size, Source and Destination - * data formats, Circular or Normal mode, Stream Priority level, Source and Destination - * Incrementation mode, FIFO mode and its Threshold (if needed), Burst mode for Source and/or - * Destination (if needed) using the DMA_Init() function. - * To avoid filling un-nesecessary fields, you can call DMA_StructInit() function - * to initialize a given structure with default values (reset values), the modify - * only necessary fields (ie. Source and Destination addresses, Transfer size and Data Formats). - * - * 4. Enable the NVIC and the corresponding interrupt(s) using the function - * DMA_ITConfig() if you need to use DMA interrupts. - * - * 5. Optionally, if the Circular mode is enabled, you can use the Double buffer mode by configuring - * the second Memory address and the first Memory to be used through the function - * DMA_DoubleBufferModeConfig(). Then enable the Double buffer mode through the function - * DMA_DoubleBufferModeCmd(). These operations must be done before step 6. - * - * 6. Enable the DMA stream using the DMA_Cmd() function. - * - * 7. Activate the needed Stream Request using PPP_DMACmd() function for - * any PPP peripheral except internal SRAM and FLASH (ie. SPI, USART ...) - * The function allowing this operation is provided in each PPP peripheral - * driver (ie. SPI_DMACmd for SPI peripheral). - * Once the Stream is enabled, it is not possible to modify its configuration - * unless the stream is stopped and disabled. - * After enabling the Stream, it is advised to monitor the EN bit status using - * the function DMA_GetCmdStatus(). In case of configuration errors or bus errors - * this bit will remain reset and all transfers on this Stream will remain on hold. - * - * 8. Optionally, you can configure the number of data to be transferred - * when the Stream is disabled (ie. after each Transfer Complete event - * or when a Transfer Error occurs) using the function DMA_SetCurrDataCounter(). - * And you can get the number of remaining data to be transferred using - * the function DMA_GetCurrDataCounter() at run time (when the DMA Stream is - * enabled and running). - * - * 9. To control DMA events you can use one of the following - * two methods: - * a- Check on DMA Stream flags using the function DMA_GetFlagStatus(). - * b- Use DMA interrupts through the function DMA_ITConfig() at initialization - * phase and DMA_GetITStatus() function into interrupt routines in - * communication phase. - * After checking on a flag you should clear it using DMA_ClearFlag() - * function. And after checking on an interrupt event you should - * clear it using DMA_ClearITPendingBit() function. - * - * 10. Optionally, if Circular mode and Double Buffer mode are enabled, you can modify - * the Memory Addresses using the function DMA_MemoryTargetConfig(). Make sure that - * the Memory Address to be modified is not the one currently in use by DMA Stream. - * This condition can be monitored using the function DMA_GetCurrentMemoryTarget(). - * - * 11. Optionally, Pause-Resume operations may be performed: - * The DMA_Cmd() function may be used to perform Pause-Resume operation. When a - * transfer is ongoing, calling this function to disable the Stream will cause the - * transfer to be paused. All configuration registers and the number of remaining - * data will be preserved. When calling again this function to re-enable the Stream, - * the transfer will be resumed from the point where it was paused. - * - * @note Memory-to-Memory transfer is possible by setting the address of the memory into - * the Peripheral registers. In this mode, Circular mode and Double Buffer mode - * are not allowed. - * - * @note The FIFO is used mainly to reduce bus usage and to allow data packing/unpacking: it is - * possible to set different Data Sizes for the Peripheral and the Memory (ie. you can set - * Half-Word data size for the peripheral to access its data register and set Word data size - * for the Memory to gain in access time. Each two Half-words will be packed and written in - * a single access to a Word in the Memory). - * - * @note When FIFO is disabled, it is not allowed to configure different Data Sizes for Source - * and Destination. In this case the Peripheral Data Size will be applied to both Source - * and Destination. - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_dma.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup DMA - * @brief DMA driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* Masks Definition */ -#define TRANSFER_IT_ENABLE_MASK (uint32_t)(DMA_SxCR_TCIE | DMA_SxCR_HTIE | \ - DMA_SxCR_TEIE | DMA_SxCR_DMEIE) - -#define DMA_Stream0_IT_MASK (uint32_t)(DMA_LISR_FEIF0 | DMA_LISR_DMEIF0 | \ - DMA_LISR_TEIF0 | DMA_LISR_HTIF0 | \ - DMA_LISR_TCIF0) - -#define DMA_Stream1_IT_MASK (uint32_t)(DMA_Stream0_IT_MASK << 6) -#define DMA_Stream2_IT_MASK (uint32_t)(DMA_Stream0_IT_MASK << 16) -#define DMA_Stream3_IT_MASK (uint32_t)(DMA_Stream0_IT_MASK << 22) -#define DMA_Stream4_IT_MASK (uint32_t)(DMA_Stream0_IT_MASK | (uint32_t)0x20000000) -#define DMA_Stream5_IT_MASK (uint32_t)(DMA_Stream1_IT_MASK | (uint32_t)0x20000000) -#define DMA_Stream6_IT_MASK (uint32_t)(DMA_Stream2_IT_MASK | (uint32_t)0x20000000) -#define DMA_Stream7_IT_MASK (uint32_t)(DMA_Stream3_IT_MASK | (uint32_t)0x20000000) -#define TRANSFER_IT_MASK (uint32_t)0x0F3C0F3C -#define HIGH_ISR_MASK (uint32_t)0x20000000 -#define RESERVED_MASK (uint32_t)0x0F7D0F7D - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - - -/** @defgroup DMA_Private_Functions - * @{ - */ - -/** @defgroup DMA_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - Initialization and Configuration functions - =============================================================================== - - This subsection provides functions allowing to initialize the DMA Stream source - and destination addresses, incrementation and data sizes, transfer direction, - buffer size, circular/normal mode selection, memory-to-memory mode selection - and Stream priority value. - - The DMA_Init() function follows the DMA configuration procedures as described in - reference manual (RM0090) except the first point: waiting on EN bit to be reset. - This condition should be checked by user application using the function DMA_GetCmdStatus() - before calling the DMA_Init() function. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitialize the DMAy Streamx registers to their default reset values. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @retval None - */ -void DMA_DeInit(DMA_Stream_TypeDef* DMAy_Streamx) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - - /* Disable the selected DMAy Streamx */ - DMAy_Streamx->CR &= ~((uint32_t)DMA_SxCR_EN); - - /* Reset DMAy Streamx control register */ - DMAy_Streamx->CR = 0; - - /* Reset DMAy Streamx Number of Data to Transfer register */ - DMAy_Streamx->NDTR = 0; - - /* Reset DMAy Streamx peripheral address register */ - DMAy_Streamx->PAR = 0; - - /* Reset DMAy Streamx memory 0 address register */ - DMAy_Streamx->M0AR = 0; - - /* Reset DMAy Streamx memory 1 address register */ - DMAy_Streamx->M1AR = 0; - - /* Reset DMAy Streamx FIFO control register */ - DMAy_Streamx->FCR = (uint32_t)0x00000021; - - /* Reset interrupt pending bits for the selected stream */ - if (DMAy_Streamx == DMA1_Stream0) - { - /* Reset interrupt pending bits for DMA1 Stream0 */ - DMA1->LIFCR = DMA_Stream0_IT_MASK; - } - else if (DMAy_Streamx == DMA1_Stream1) - { - /* Reset interrupt pending bits for DMA1 Stream1 */ - DMA1->LIFCR = DMA_Stream1_IT_MASK; - } - else if (DMAy_Streamx == DMA1_Stream2) - { - /* Reset interrupt pending bits for DMA1 Stream2 */ - DMA1->LIFCR = DMA_Stream2_IT_MASK; - } - else if (DMAy_Streamx == DMA1_Stream3) - { - /* Reset interrupt pending bits for DMA1 Stream3 */ - DMA1->LIFCR = DMA_Stream3_IT_MASK; - } - else if (DMAy_Streamx == DMA1_Stream4) - { - /* Reset interrupt pending bits for DMA1 Stream4 */ - DMA1->HIFCR = DMA_Stream4_IT_MASK; - } - else if (DMAy_Streamx == DMA1_Stream5) - { - /* Reset interrupt pending bits for DMA1 Stream5 */ - DMA1->HIFCR = DMA_Stream5_IT_MASK; - } - else if (DMAy_Streamx == DMA1_Stream6) - { - /* Reset interrupt pending bits for DMA1 Stream6 */ - DMA1->HIFCR = (uint32_t)DMA_Stream6_IT_MASK; - } - else if (DMAy_Streamx == DMA1_Stream7) - { - /* Reset interrupt pending bits for DMA1 Stream7 */ - DMA1->HIFCR = DMA_Stream7_IT_MASK; - } - else if (DMAy_Streamx == DMA2_Stream0) - { - /* Reset interrupt pending bits for DMA2 Stream0 */ - DMA2->LIFCR = DMA_Stream0_IT_MASK; - } - else if (DMAy_Streamx == DMA2_Stream1) - { - /* Reset interrupt pending bits for DMA2 Stream1 */ - DMA2->LIFCR = DMA_Stream1_IT_MASK; - } - else if (DMAy_Streamx == DMA2_Stream2) - { - /* Reset interrupt pending bits for DMA2 Stream2 */ - DMA2->LIFCR = DMA_Stream2_IT_MASK; - } - else if (DMAy_Streamx == DMA2_Stream3) - { - /* Reset interrupt pending bits for DMA2 Stream3 */ - DMA2->LIFCR = DMA_Stream3_IT_MASK; - } - else if (DMAy_Streamx == DMA2_Stream4) - { - /* Reset interrupt pending bits for DMA2 Stream4 */ - DMA2->HIFCR = DMA_Stream4_IT_MASK; - } - else if (DMAy_Streamx == DMA2_Stream5) - { - /* Reset interrupt pending bits for DMA2 Stream5 */ - DMA2->HIFCR = DMA_Stream5_IT_MASK; - } - else if (DMAy_Streamx == DMA2_Stream6) - { - /* Reset interrupt pending bits for DMA2 Stream6 */ - DMA2->HIFCR = DMA_Stream6_IT_MASK; - } - else - { - if (DMAy_Streamx == DMA2_Stream7) - { - /* Reset interrupt pending bits for DMA2 Stream7 */ - DMA2->HIFCR = DMA_Stream7_IT_MASK; - } - } -} - -/** - * @brief Initializes the DMAy Streamx according to the specified parameters in - * the DMA_InitStruct structure. - * @note Before calling this function, it is recommended to check that the Stream - * is actually disabled using the function DMA_GetCmdStatus(). - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param DMA_InitStruct: pointer to a DMA_InitTypeDef structure that contains - * the configuration information for the specified DMA Stream. - * @retval None - */ -void DMA_Init(DMA_Stream_TypeDef* DMAy_Streamx, DMA_InitTypeDef* DMA_InitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - assert_param(IS_DMA_CHANNEL(DMA_InitStruct->DMA_Channel)); - assert_param(IS_DMA_DIRECTION(DMA_InitStruct->DMA_DIR)); - assert_param(IS_DMA_BUFFER_SIZE(DMA_InitStruct->DMA_BufferSize)); - assert_param(IS_DMA_PERIPHERAL_INC_STATE(DMA_InitStruct->DMA_PeripheralInc)); - assert_param(IS_DMA_MEMORY_INC_STATE(DMA_InitStruct->DMA_MemoryInc)); - assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(DMA_InitStruct->DMA_PeripheralDataSize)); - assert_param(IS_DMA_MEMORY_DATA_SIZE(DMA_InitStruct->DMA_MemoryDataSize)); - assert_param(IS_DMA_MODE(DMA_InitStruct->DMA_Mode)); - assert_param(IS_DMA_PRIORITY(DMA_InitStruct->DMA_Priority)); - assert_param(IS_DMA_FIFO_MODE_STATE(DMA_InitStruct->DMA_FIFOMode)); - assert_param(IS_DMA_FIFO_THRESHOLD(DMA_InitStruct->DMA_FIFOThreshold)); - assert_param(IS_DMA_MEMORY_BURST(DMA_InitStruct->DMA_MemoryBurst)); - assert_param(IS_DMA_PERIPHERAL_BURST(DMA_InitStruct->DMA_PeripheralBurst)); - - /*------------------------- DMAy Streamx CR Configuration ------------------*/ - /* Get the DMAy_Streamx CR value */ - tmpreg = DMAy_Streamx->CR; - - /* Clear CHSEL, MBURST, PBURST, PL, MSIZE, PSIZE, MINC, PINC, CIRC and DIR bits */ - tmpreg &= ((uint32_t)~(DMA_SxCR_CHSEL | DMA_SxCR_MBURST | DMA_SxCR_PBURST | \ - DMA_SxCR_PL | DMA_SxCR_MSIZE | DMA_SxCR_PSIZE | \ - DMA_SxCR_MINC | DMA_SxCR_PINC | DMA_SxCR_CIRC | \ - DMA_SxCR_DIR)); - - /* Configure DMAy Streamx: */ - /* Set CHSEL bits according to DMA_CHSEL value */ - /* Set DIR bits according to DMA_DIR value */ - /* Set PINC bit according to DMA_PeripheralInc value */ - /* Set MINC bit according to DMA_MemoryInc value */ - /* Set PSIZE bits according to DMA_PeripheralDataSize value */ - /* Set MSIZE bits according to DMA_MemoryDataSize value */ - /* Set CIRC bit according to DMA_Mode value */ - /* Set PL bits according to DMA_Priority value */ - /* Set MBURST bits according to DMA_MemoryBurst value */ - /* Set PBURST bits according to DMA_PeripheralBurst value */ - tmpreg |= DMA_InitStruct->DMA_Channel | DMA_InitStruct->DMA_DIR | - DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc | - DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize | - DMA_InitStruct->DMA_Mode | DMA_InitStruct->DMA_Priority | - DMA_InitStruct->DMA_MemoryBurst | DMA_InitStruct->DMA_PeripheralBurst; - - /* Write to DMAy Streamx CR register */ - DMAy_Streamx->CR = tmpreg; - - /*------------------------- DMAy Streamx FCR Configuration -----------------*/ - /* Get the DMAy_Streamx FCR value */ - tmpreg = DMAy_Streamx->FCR; - - /* Clear DMDIS and FTH bits */ - tmpreg &= (uint32_t)~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH); - - /* Configure DMAy Streamx FIFO: - Set DMDIS bits according to DMA_FIFOMode value - Set FTH bits according to DMA_FIFOThreshold value */ - tmpreg |= DMA_InitStruct->DMA_FIFOMode | DMA_InitStruct->DMA_FIFOThreshold; - - /* Write to DMAy Streamx CR */ - DMAy_Streamx->FCR = tmpreg; - - /*------------------------- DMAy Streamx NDTR Configuration ----------------*/ - /* Write to DMAy Streamx NDTR register */ - DMAy_Streamx->NDTR = DMA_InitStruct->DMA_BufferSize; - - /*------------------------- DMAy Streamx PAR Configuration -----------------*/ - /* Write to DMAy Streamx PAR */ - DMAy_Streamx->PAR = DMA_InitStruct->DMA_PeripheralBaseAddr; - - /*------------------------- DMAy Streamx M0AR Configuration ----------------*/ - /* Write to DMAy Streamx M0AR */ - DMAy_Streamx->M0AR = DMA_InitStruct->DMA_Memory0BaseAddr; -} - -/** - * @brief Fills each DMA_InitStruct member with its default value. - * @param DMA_InitStruct : pointer to a DMA_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct) -{ - /*-------------- Reset DMA init structure parameters values ----------------*/ - /* Initialize the DMA_Channel member */ - DMA_InitStruct->DMA_Channel = 0; - - /* Initialize the DMA_PeripheralBaseAddr member */ - DMA_InitStruct->DMA_PeripheralBaseAddr = 0; - - /* Initialize the DMA_Memory0BaseAddr member */ - DMA_InitStruct->DMA_Memory0BaseAddr = 0; - - /* Initialize the DMA_DIR member */ - DMA_InitStruct->DMA_DIR = DMA_DIR_PeripheralToMemory; - - /* Initialize the DMA_BufferSize member */ - DMA_InitStruct->DMA_BufferSize = 0; - - /* Initialize the DMA_PeripheralInc member */ - DMA_InitStruct->DMA_PeripheralInc = DMA_PeripheralInc_Disable; - - /* Initialize the DMA_MemoryInc member */ - DMA_InitStruct->DMA_MemoryInc = DMA_MemoryInc_Disable; - - /* Initialize the DMA_PeripheralDataSize member */ - DMA_InitStruct->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - - /* Initialize the DMA_MemoryDataSize member */ - DMA_InitStruct->DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - - /* Initialize the DMA_Mode member */ - DMA_InitStruct->DMA_Mode = DMA_Mode_Normal; - - /* Initialize the DMA_Priority member */ - DMA_InitStruct->DMA_Priority = DMA_Priority_Low; - - /* Initialize the DMA_FIFOMode member */ - DMA_InitStruct->DMA_FIFOMode = DMA_FIFOMode_Disable; - - /* Initialize the DMA_FIFOThreshold member */ - DMA_InitStruct->DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; - - /* Initialize the DMA_MemoryBurst member */ - DMA_InitStruct->DMA_MemoryBurst = DMA_MemoryBurst_Single; - - /* Initialize the DMA_PeripheralBurst member */ - DMA_InitStruct->DMA_PeripheralBurst = DMA_PeripheralBurst_Single; -} - -/** - * @brief Enables or disables the specified DMAy Streamx. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param NewState: new state of the DMAy Streamx. - * This parameter can be: ENABLE or DISABLE. - * - * @note This function may be used to perform Pause-Resume operation. When a - * transfer is ongoing, calling this function to disable the Stream will - * cause the transfer to be paused. All configuration registers and the - * number of remaining data will be preserved. When calling again this - * function to re-enable the Stream, the transfer will be resumed from - * the point where it was paused. - * - * @note After configuring the DMA Stream (DMA_Init() function) and enabling the - * stream, it is recommended to check (or wait until) the DMA Stream is - * effectively enabled. A Stream may remain disabled if a configuration - * parameter is wrong. - * After disabling a DMA Stream, it is also recommended to check (or wait - * until) the DMA Stream is effectively disabled. If a Stream is disabled - * while a data transfer is ongoing, the current data will be transferred - * and the Stream will be effectively disabled only after the transfer of - * this single data is finished. - * - * @retval None - */ -void DMA_Cmd(DMA_Stream_TypeDef* DMAy_Streamx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected DMAy Streamx by setting EN bit */ - DMAy_Streamx->CR |= (uint32_t)DMA_SxCR_EN; - } - else - { - /* Disable the selected DMAy Streamx by clearing EN bit */ - DMAy_Streamx->CR &= ~(uint32_t)DMA_SxCR_EN; - } -} - -/** - * @brief Configures, when the PINC (Peripheral Increment address mode) bit is - * set, if the peripheral address should be incremented with the data - * size (configured with PSIZE bits) or by a fixed offset equal to 4 - * (32-bit aligned addresses). - * - * @note This function has no effect if the Peripheral Increment mode is disabled. - * - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param DMA_Pincos: specifies the Peripheral increment offset size. - * This parameter can be one of the following values: - * @arg DMA_PINCOS_Psize: Peripheral address increment is done - * accordingly to PSIZE parameter. - * @arg DMA_PINCOS_WordAligned: Peripheral address increment offset is - * fixed to 4 (32-bit aligned addresses). - * @retval None - */ -void DMA_PeriphIncOffsetSizeConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_Pincos) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - assert_param(IS_DMA_PINCOS_SIZE(DMA_Pincos)); - - /* Check the needed Peripheral increment offset */ - if(DMA_Pincos != DMA_PINCOS_Psize) - { - /* Configure DMA_SxCR_PINCOS bit with the input parameter */ - DMAy_Streamx->CR |= (uint32_t)DMA_SxCR_PINCOS; - } - else - { - /* Clear the PINCOS bit: Peripheral address incremented according to PSIZE */ - DMAy_Streamx->CR &= ~(uint32_t)DMA_SxCR_PINCOS; - } -} - -/** - * @brief Configures, when the DMAy Streamx is disabled, the flow controller for - * the next transactions (Peripheral or Memory). - * - * @note Before enabling this feature, check if the used peripheral supports - * the Flow Controller mode or not. - * - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param DMA_FlowCtrl: specifies the DMA flow controller. - * This parameter can be one of the following values: - * @arg DMA_FlowCtrl_Memory: DMAy_Streamx transactions flow controller is - * the DMA controller. - * @arg DMA_FlowCtrl_Peripheral: DMAy_Streamx transactions flow controller - * is the peripheral. - * @retval None - */ -void DMA_FlowControllerConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_FlowCtrl) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - assert_param(IS_DMA_FLOW_CTRL(DMA_FlowCtrl)); - - /* Check the needed flow controller */ - if(DMA_FlowCtrl != DMA_FlowCtrl_Memory) - { - /* Configure DMA_SxCR_PFCTRL bit with the input parameter */ - DMAy_Streamx->CR |= (uint32_t)DMA_SxCR_PFCTRL; - } - else - { - /* Clear the PFCTRL bit: Memory is the flow controller */ - DMAy_Streamx->CR &= ~(uint32_t)DMA_SxCR_PFCTRL; - } -} -/** - * @} - */ - -/** @defgroup DMA_Group2 Data Counter functions - * @brief Data Counter functions - * -@verbatim - =============================================================================== - Data Counter functions - =============================================================================== - - This subsection provides function allowing to configure and read the buffer size - (number of data to be transferred). - - The DMA data counter can be written only when the DMA Stream is disabled - (ie. after transfer complete event). - - The following function can be used to write the Stream data counter value: - - void DMA_SetCurrDataCounter(DMA_Stream_TypeDef* DMAy_Streamx, uint16_t Counter); - -@note It is advised to use this function rather than DMA_Init() in situations where - only the Data buffer needs to be reloaded. - -@note If the Source and Destination Data Sizes are different, then the value written in - data counter, expressing the number of transfers, is relative to the number of - transfers from the Peripheral point of view. - ie. If Memory data size is Word, Peripheral data size is Half-Words, then the value - to be configured in the data counter is the number of Half-Words to be transferred - from/to the peripheral. - - The DMA data counter can be read to indicate the number of remaining transfers for - the relative DMA Stream. This counter is decremented at the end of each data - transfer and when the transfer is complete: - - If Normal mode is selected: the counter is set to 0. - - If Circular mode is selected: the counter is reloaded with the initial value - (configured before enabling the DMA Stream) - - The following function can be used to read the Stream data counter value: - - uint16_t DMA_GetCurrDataCounter(DMA_Stream_TypeDef* DMAy_Streamx); - -@endverbatim - * @{ - */ - -/** - * @brief Writes the number of data units to be transferred on the DMAy Streamx. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param Counter: Number of data units to be transferred (from 0 to 65535) - * Number of data items depends only on the Peripheral data format. - * - * @note If Peripheral data format is Bytes: number of data units is equal - * to total number of bytes to be transferred. - * - * @note If Peripheral data format is Half-Word: number of data units is - * equal to total number of bytes to be transferred / 2. - * - * @note If Peripheral data format is Word: number of data units is equal - * to total number of bytes to be transferred / 4. - * - * @note In Memory-to-Memory transfer mode, the memory buffer pointed by - * DMAy_SxPAR register is considered as Peripheral. - * - * @retval The number of remaining data units in the current DMAy Streamx transfer. - */ -void DMA_SetCurrDataCounter(DMA_Stream_TypeDef* DMAy_Streamx, uint16_t Counter) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - - /* Write the number of data units to be transferred */ - DMAy_Streamx->NDTR = (uint16_t)Counter; -} - -/** - * @brief Returns the number of remaining data units in the current DMAy Streamx transfer. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @retval The number of remaining data units in the current DMAy Streamx transfer. - */ -uint16_t DMA_GetCurrDataCounter(DMA_Stream_TypeDef* DMAy_Streamx) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - - /* Return the number of remaining data units for DMAy Streamx */ - return ((uint16_t)(DMAy_Streamx->NDTR)); -} -/** - * @} - */ - -/** @defgroup DMA_Group3 Double Buffer mode functions - * @brief Double Buffer mode functions - * -@verbatim - =============================================================================== - Double Buffer mode functions - =============================================================================== - - This subsection provides function allowing to configure and control the double - buffer mode parameters. - - The Double Buffer mode can be used only when Circular mode is enabled. - The Double Buffer mode cannot be used when transferring data from Memory to Memory. - - The Double Buffer mode allows to set two different Memory addresses from/to which - the DMA controller will access alternatively (after completing transfer to/from target - memory 0, it will start transfer to/from target memory 1). - This allows to reduce software overhead for double buffering and reduce the CPU - access time. - - Two functions must be called before calling the DMA_Init() function: - - void DMA_DoubleBufferModeConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t Memory1BaseAddr, - uint32_t DMA_CurrentMemory); - - void DMA_DoubleBufferModeCmd(DMA_Stream_TypeDef* DMAy_Streamx, FunctionalState NewState); - - DMA_DoubleBufferModeConfig() is called to configure the Memory 1 base address and the first - Memory target from/to which the transfer will start after enabling the DMA Stream. - Then DMA_DoubleBufferModeCmd() must be called to enable the Double Buffer mode (or disable - it when it should not be used). - - - Two functions can be called dynamically when the transfer is ongoing (or when the DMA Stream is - stopped) to modify on of the target Memories addresses or to check wich Memory target is currently - used: - - void DMA_MemoryTargetConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t MemoryBaseAddr, - uint32_t DMA_MemoryTarget); - - uint32_t DMA_GetCurrentMemoryTarget(DMA_Stream_TypeDef* DMAy_Streamx); - - DMA_MemoryTargetConfig() can be called to modify the base address of one of the two target Memories. - The Memory of which the base address will be modified must not be currently be used by the DMA Stream - (ie. if the DMA Stream is currently transferring from Memory 1 then you can only modify base address - of target Memory 0 and vice versa). - To check this condition, it is recommended to use the function DMA_GetCurrentMemoryTarget() which - returns the index of the Memory target currently in use by the DMA Stream. - -@endverbatim - * @{ - */ - -/** - * @brief Configures, when the DMAy Streamx is disabled, the double buffer mode - * and the current memory target. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param Memory1BaseAddr: the base address of the second buffer (Memory 1) - * @param DMA_CurrentMemory: specifies which memory will be first buffer for - * the transactions when the Stream will be enabled. - * This parameter can be one of the following values: - * @arg DMA_Memory_0: Memory 0 is the current buffer. - * @arg DMA_Memory_1: Memory 1 is the current buffer. - * - * @note Memory0BaseAddr is set by the DMA structure configuration in DMA_Init(). - * - * @retval None - */ -void DMA_DoubleBufferModeConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t Memory1BaseAddr, - uint32_t DMA_CurrentMemory) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - assert_param(IS_DMA_CURRENT_MEM(DMA_CurrentMemory)); - - if (DMA_CurrentMemory != DMA_Memory_0) - { - /* Set Memory 1 as current memory address */ - DMAy_Streamx->CR |= (uint32_t)(DMA_SxCR_CT); - } - else - { - /* Set Memory 0 as current memory address */ - DMAy_Streamx->CR &= ~(uint32_t)(DMA_SxCR_CT); - } - - /* Write to DMAy Streamx M1AR */ - DMAy_Streamx->M1AR = Memory1BaseAddr; -} - -/** - * @brief Enables or disables the double buffer mode for the selected DMA stream. - * @note This function can be called only when the DMA Stream is disabled. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param NewState: new state of the DMAy Streamx double buffer mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DMA_DoubleBufferModeCmd(DMA_Stream_TypeDef* DMAy_Streamx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Configure the Double Buffer mode */ - if (NewState != DISABLE) - { - /* Enable the Double buffer mode */ - DMAy_Streamx->CR |= (uint32_t)DMA_SxCR_DBM; - } - else - { - /* Disable the Double buffer mode */ - DMAy_Streamx->CR &= ~(uint32_t)DMA_SxCR_DBM; - } -} - -/** - * @brief Configures the Memory address for the next buffer transfer in double - * buffer mode (for dynamic use). This function can be called when the - * DMA Stream is enabled and when the transfer is ongoing. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param MemoryBaseAddr: The base address of the target memory buffer - * @param DMA_MemoryTarget: Next memory target to be used. - * This parameter can be one of the following values: - * @arg DMA_Memory_0: To use the memory address 0 - * @arg DMA_Memory_1: To use the memory address 1 - * - * @note It is not allowed to modify the Base Address of a target Memory when - * this target is involved in the current transfer. ie. If the DMA Stream - * is currently transferring to/from Memory 1, then it not possible to - * modify Base address of Memory 1, but it is possible to modify Base - * address of Memory 0. - * To know which Memory is currently used, you can use the function - * DMA_GetCurrentMemoryTarget(). - * - * @retval None - */ -void DMA_MemoryTargetConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t MemoryBaseAddr, - uint32_t DMA_MemoryTarget) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - assert_param(IS_DMA_CURRENT_MEM(DMA_MemoryTarget)); - - /* Check the Memory target to be configured */ - if (DMA_MemoryTarget != DMA_Memory_0) - { - /* Write to DMAy Streamx M1AR */ - DMAy_Streamx->M1AR = MemoryBaseAddr; - } - else - { - /* Write to DMAy Streamx M0AR */ - DMAy_Streamx->M0AR = MemoryBaseAddr; - } -} - -/** - * @brief Returns the current memory target used by double buffer transfer. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @retval The memory target number: 0 for Memory0 or 1 for Memory1. - */ -uint32_t DMA_GetCurrentMemoryTarget(DMA_Stream_TypeDef* DMAy_Streamx) -{ - uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - - /* Get the current memory target */ - if ((DMAy_Streamx->CR & DMA_SxCR_CT) != 0) - { - /* Current memory buffer used is Memory 1 */ - tmp = 1; - } - else - { - /* Current memory buffer used is Memory 0 */ - tmp = 0; - } - return tmp; -} -/** - * @} - */ - -/** @defgroup DMA_Group4 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - - This subsection provides functions allowing to - - Check the DMA enable status - - Check the FIFO status - - Configure the DMA Interrupts sources and check or clear the flags or pending bits status. - - 1. DMA Enable status: - After configuring the DMA Stream (DMA_Init() function) and enabling the stream, - it is recommended to check (or wait until) the DMA Stream is effectively enabled. - A Stream may remain disabled if a configuration parameter is wrong. - After disabling a DMA Stream, it is also recommended to check (or wait until) the DMA - Stream is effectively disabled. If a Stream is disabled while a data transfer is ongoing, - the current data will be transferred and the Stream will be effectively disabled only after - this data transfer completion. - To monitor this state it is possible to use the following function: - - FunctionalState DMA_GetCmdStatus(DMA_Stream_TypeDef* DMAy_Streamx); - - 2. FIFO Status: - It is possible to monitor the FIFO status when a transfer is ongoing using the following - function: - - uint32_t DMA_GetFIFOStatus(DMA_Stream_TypeDef* DMAy_Streamx); - - 3. DMA Interrupts and Flags: - The user should identify which mode will be used in his application to manage the - DMA controller events: Polling mode or Interrupt mode. - - Polling Mode - ============= - Each DMA stream can be managed through 4 event Flags: - (x : DMA Stream number ) - 1. DMA_FLAG_FEIFx : to indicate that a FIFO Mode Transfer Error event occurred. - 2. DMA_FLAG_DMEIFx : to indicate that a Direct Mode Transfer Error event occurred. - 3. DMA_FLAG_TEIFx : to indicate that a Transfer Error event occurred. - 4. DMA_FLAG_HTIFx : to indicate that a Half-Transfer Complete event occurred. - 5. DMA_FLAG_TCIFx : to indicate that a Transfer Complete event occurred . - - In this Mode it is advised to use the following functions: - - FlagStatus DMA_GetFlagStatus(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_FLAG); - - void DMA_ClearFlag(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_FLAG); - - Interrupt Mode - =============== - Each DMA Stream can be managed through 4 Interrupts: - - Interrupt Source - ---------------- - 1. DMA_IT_FEIFx : specifies the interrupt source for the FIFO Mode Transfer Error event. - 2. DMA_IT_DMEIFx : specifies the interrupt source for the Direct Mode Transfer Error event. - 3. DMA_IT_TEIFx : specifies the interrupt source for the Transfer Error event. - 4. DMA_IT_HTIFx : specifies the interrupt source for the Half-Transfer Complete event. - 5. DMA_IT_TCIFx : specifies the interrupt source for the a Transfer Complete event. - - In this Mode it is advised to use the following functions: - - void DMA_ITConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT, FunctionalState NewState); - - ITStatus DMA_GetITStatus(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT); - - void DMA_ClearITPendingBit(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT); - -@endverbatim - * @{ - */ - -/** - * @brief Returns the status of EN bit for the specified DMAy Streamx. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * - * @note After configuring the DMA Stream (DMA_Init() function) and enabling - * the stream, it is recommended to check (or wait until) the DMA Stream - * is effectively enabled. A Stream may remain disabled if a configuration - * parameter is wrong. - * After disabling a DMA Stream, it is also recommended to check (or wait - * until) the DMA Stream is effectively disabled. If a Stream is disabled - * while a data transfer is ongoing, the current data will be transferred - * and the Stream will be effectively disabled only after the transfer - * of this single data is finished. - * - * @retval Current state of the DMAy Streamx (ENABLE or DISABLE). - */ -FunctionalState DMA_GetCmdStatus(DMA_Stream_TypeDef* DMAy_Streamx) -{ - FunctionalState state = DISABLE; - - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - - if ((DMAy_Streamx->CR & (uint32_t)DMA_SxCR_EN) != 0) - { - /* The selected DMAy Streamx EN bit is set (DMA is still transferring) */ - state = ENABLE; - } - else - { - /* The selected DMAy Streamx EN bit is cleared (DMA is disabled and - all transfers are complete) */ - state = DISABLE; - } - return state; -} - -/** - * @brief Returns the current DMAy Streamx FIFO filled level. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @retval The FIFO filling state. - * - DMA_FIFOStatus_Less1QuarterFull: when FIFO is less than 1 quarter-full - * and not empty. - * - DMA_FIFOStatus_1QuarterFull: if more than 1 quarter-full. - * - DMA_FIFOStatus_HalfFull: if more than 1 half-full. - * - DMA_FIFOStatus_3QuartersFull: if more than 3 quarters-full. - * - DMA_FIFOStatus_Empty: when FIFO is empty - * - DMA_FIFOStatus_Full: when FIFO is full - */ -uint32_t DMA_GetFIFOStatus(DMA_Stream_TypeDef* DMAy_Streamx) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - - /* Get the FIFO level bits */ - tmpreg = (uint32_t)((DMAy_Streamx->FCR & DMA_SxFCR_FS)); - - return tmpreg; -} - -/** - * @brief Checks whether the specified DMAy Streamx flag is set or not. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param DMA_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg DMA_FLAG_TCIFx: Streamx transfer complete flag - * @arg DMA_FLAG_HTIFx: Streamx half transfer complete flag - * @arg DMA_FLAG_TEIFx: Streamx transfer error flag - * @arg DMA_FLAG_DMEIFx: Streamx direct mode error flag - * @arg DMA_FLAG_FEIFx: Streamx FIFO error flag - * Where x can be 0 to 7 to select the DMA Stream. - * @retval The new state of DMA_FLAG (SET or RESET). - */ -FlagStatus DMA_GetFlagStatus(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_FLAG) -{ - FlagStatus bitstatus = RESET; - DMA_TypeDef* DMAy; - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - assert_param(IS_DMA_GET_FLAG(DMA_FLAG)); - - /* Determine the DMA to which belongs the stream */ - if (DMAy_Streamx < DMA2_Stream0) - { - /* DMAy_Streamx belongs to DMA1 */ - DMAy = DMA1; - } - else - { - /* DMAy_Streamx belongs to DMA2 */ - DMAy = DMA2; - } - - /* Check if the flag is in HISR or LISR */ - if ((DMA_FLAG & HIGH_ISR_MASK) != (uint32_t)RESET) - { - /* Get DMAy HISR register value */ - tmpreg = DMAy->HISR; - } - else - { - /* Get DMAy LISR register value */ - tmpreg = DMAy->LISR; - } - - /* Mask the reserved bits */ - tmpreg &= (uint32_t)RESERVED_MASK; - - /* Check the status of the specified DMA flag */ - if ((tmpreg & DMA_FLAG) != (uint32_t)RESET) - { - /* DMA_FLAG is set */ - bitstatus = SET; - } - else - { - /* DMA_FLAG is reset */ - bitstatus = RESET; - } - - /* Return the DMA_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the DMAy Streamx's pending flags. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param DMA_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg DMA_FLAG_TCIFx: Streamx transfer complete flag - * @arg DMA_FLAG_HTIFx: Streamx half transfer complete flag - * @arg DMA_FLAG_TEIFx: Streamx transfer error flag - * @arg DMA_FLAG_DMEIFx: Streamx direct mode error flag - * @arg DMA_FLAG_FEIFx: Streamx FIFO error flag - * Where x can be 0 to 7 to select the DMA Stream. - * @retval None - */ -void DMA_ClearFlag(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_FLAG) -{ - DMA_TypeDef* DMAy; - - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - assert_param(IS_DMA_CLEAR_FLAG(DMA_FLAG)); - - /* Determine the DMA to which belongs the stream */ - if (DMAy_Streamx < DMA2_Stream0) - { - /* DMAy_Streamx belongs to DMA1 */ - DMAy = DMA1; - } - else - { - /* DMAy_Streamx belongs to DMA2 */ - DMAy = DMA2; - } - - /* Check if LIFCR or HIFCR register is targeted */ - if ((DMA_FLAG & HIGH_ISR_MASK) != (uint32_t)RESET) - { - /* Set DMAy HIFCR register clear flag bits */ - DMAy->HIFCR = (uint32_t)(DMA_FLAG & RESERVED_MASK); - } - else - { - /* Set DMAy LIFCR register clear flag bits */ - DMAy->LIFCR = (uint32_t)(DMA_FLAG & RESERVED_MASK); - } -} - -/** - * @brief Enables or disables the specified DMAy Streamx interrupts. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param DMA_IT: specifies the DMA interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TC: Transfer complete interrupt mask - * @arg DMA_IT_HT: Half transfer complete interrupt mask - * @arg DMA_IT_TE: Transfer error interrupt mask - * @arg DMA_IT_FE: FIFO error interrupt mask - * @param NewState: new state of the specified DMA interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void DMA_ITConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - assert_param(IS_DMA_CONFIG_IT(DMA_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Check if the DMA_IT parameter contains a FIFO interrupt */ - if ((DMA_IT & DMA_IT_FE) != 0) - { - if (NewState != DISABLE) - { - /* Enable the selected DMA FIFO interrupts */ - DMAy_Streamx->FCR |= (uint32_t)DMA_IT_FE; - } - else - { - /* Disable the selected DMA FIFO interrupts */ - DMAy_Streamx->FCR &= ~(uint32_t)DMA_IT_FE; - } - } - - /* Check if the DMA_IT parameter contains a Transfer interrupt */ - if (DMA_IT != DMA_IT_FE) - { - if (NewState != DISABLE) - { - /* Enable the selected DMA transfer interrupts */ - DMAy_Streamx->CR |= (uint32_t)(DMA_IT & TRANSFER_IT_ENABLE_MASK); - } - else - { - /* Disable the selected DMA transfer interrupts */ - DMAy_Streamx->CR &= ~(uint32_t)(DMA_IT & TRANSFER_IT_ENABLE_MASK); - } - } -} - -/** - * @brief Checks whether the specified DMAy Streamx interrupt has occurred or not. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param DMA_IT: specifies the DMA interrupt source to check. - * This parameter can be one of the following values: - * @arg DMA_IT_TCIFx: Streamx transfer complete interrupt - * @arg DMA_IT_HTIFx: Streamx half transfer complete interrupt - * @arg DMA_IT_TEIFx: Streamx transfer error interrupt - * @arg DMA_IT_DMEIFx: Streamx direct mode error interrupt - * @arg DMA_IT_FEIFx: Streamx FIFO error interrupt - * Where x can be 0 to 7 to select the DMA Stream. - * @retval The new state of DMA_IT (SET or RESET). - */ -ITStatus DMA_GetITStatus(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT) -{ - ITStatus bitstatus = RESET; - DMA_TypeDef* DMAy; - uint32_t tmpreg = 0, enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - assert_param(IS_DMA_GET_IT(DMA_IT)); - - /* Determine the DMA to which belongs the stream */ - if (DMAy_Streamx < DMA2_Stream0) - { - /* DMAy_Streamx belongs to DMA1 */ - DMAy = DMA1; - } - else - { - /* DMAy_Streamx belongs to DMA2 */ - DMAy = DMA2; - } - - /* Check if the interrupt enable bit is in the CR or FCR register */ - if ((DMA_IT & TRANSFER_IT_MASK) != (uint32_t)RESET) - { - /* Get the interrupt enable position mask in CR register */ - tmpreg = (uint32_t)((DMA_IT >> 11) & TRANSFER_IT_ENABLE_MASK); - - /* Check the enable bit in CR register */ - enablestatus = (uint32_t)(DMAy_Streamx->CR & tmpreg); - } - else - { - /* Check the enable bit in FCR register */ - enablestatus = (uint32_t)(DMAy_Streamx->FCR & DMA_IT_FE); - } - - /* Check if the interrupt pending flag is in LISR or HISR */ - if ((DMA_IT & HIGH_ISR_MASK) != (uint32_t)RESET) - { - /* Get DMAy HISR register value */ - tmpreg = DMAy->HISR ; - } - else - { - /* Get DMAy LISR register value */ - tmpreg = DMAy->LISR ; - } - - /* mask all reserved bits */ - tmpreg &= (uint32_t)RESERVED_MASK; - - /* Check the status of the specified DMA interrupt */ - if (((tmpreg & DMA_IT) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) - { - /* DMA_IT is set */ - bitstatus = SET; - } - else - { - /* DMA_IT is reset */ - bitstatus = RESET; - } - - /* Return the DMA_IT status */ - return bitstatus; -} - -/** - * @brief Clears the DMAy Streamx's interrupt pending bits. - * @param DMAy_Streamx: where y can be 1 or 2 to select the DMA and x can be 0 - * to 7 to select the DMA Stream. - * @param DMA_IT: specifies the DMA interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg DMA_IT_TCIFx: Streamx transfer complete interrupt - * @arg DMA_IT_HTIFx: Streamx half transfer complete interrupt - * @arg DMA_IT_TEIFx: Streamx transfer error interrupt - * @arg DMA_IT_DMEIFx: Streamx direct mode error interrupt - * @arg DMA_IT_FEIFx: Streamx FIFO error interrupt - * Where x can be 0 to 7 to select the DMA Stream. - * @retval None - */ -void DMA_ClearITPendingBit(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT) -{ - DMA_TypeDef* DMAy; - - /* Check the parameters */ - assert_param(IS_DMA_ALL_PERIPH(DMAy_Streamx)); - assert_param(IS_DMA_CLEAR_IT(DMA_IT)); - - /* Determine the DMA to which belongs the stream */ - if (DMAy_Streamx < DMA2_Stream0) - { - /* DMAy_Streamx belongs to DMA1 */ - DMAy = DMA1; - } - else - { - /* DMAy_Streamx belongs to DMA2 */ - DMAy = DMA2; - } - - /* Check if LIFCR or HIFCR register is targeted */ - if ((DMA_IT & HIGH_ISR_MASK) != (uint32_t)RESET) - { - /* Set DMAy HIFCR register clear interrupt bits */ - DMAy->HIFCR = (uint32_t)(DMA_IT & RESERVED_MASK); - } - else - { - /* Set DMAy LIFCR register clear interrupt bits */ - DMAy->LIFCR = (uint32_t)(DMA_IT & RESERVED_MASK); - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_dma.h b/car_hw/src/lib/stdperiph/stm32f4xx_dma.h deleted file mode 100644 index 1d1c5a8ea0c..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_dma.h +++ /dev/null @@ -1,603 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_dma.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the DMA firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_DMA_H -#define __STM32F4xx_DMA_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup DMA - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief DMA Init structure definition - */ - -typedef struct -{ - uint32_t DMA_Channel; /*!< Specifies the channel used for the specified stream. - This parameter can be a value of @ref DMA_channel */ - - uint32_t DMA_PeripheralBaseAddr; /*!< Specifies the peripheral base address for DMAy Streamx. */ - - uint32_t DMA_Memory0BaseAddr; /*!< Specifies the memory 0 base address for DMAy Streamx. - This memory is the default memory used when double buffer mode is - not enabled. */ - - uint32_t DMA_DIR; /*!< Specifies if the data will be transferred from memory to peripheral, - from memory to memory or from peripheral to memory. - This parameter can be a value of @ref DMA_data_transfer_direction */ - - uint32_t DMA_BufferSize; /*!< Specifies the buffer size, in data unit, of the specified Stream. - The data unit is equal to the configuration set in DMA_PeripheralDataSize - or DMA_MemoryDataSize members depending in the transfer direction. */ - - uint32_t DMA_PeripheralInc; /*!< Specifies whether the Peripheral address register should be incremented or not. - This parameter can be a value of @ref DMA_peripheral_incremented_mode */ - - uint32_t DMA_MemoryInc; /*!< Specifies whether the memory address register should be incremented or not. - This parameter can be a value of @ref DMA_memory_incremented_mode */ - - uint32_t DMA_PeripheralDataSize; /*!< Specifies the Peripheral data width. - This parameter can be a value of @ref DMA_peripheral_data_size */ - - uint32_t DMA_MemoryDataSize; /*!< Specifies the Memory data width. - This parameter can be a value of @ref DMA_memory_data_size */ - - uint32_t DMA_Mode; /*!< Specifies the operation mode of the DMAy Streamx. - This parameter can be a value of @ref DMA_circular_normal_mode - @note The circular buffer mode cannot be used if the memory-to-memory - data transfer is configured on the selected Stream */ - - uint32_t DMA_Priority; /*!< Specifies the software priority for the DMAy Streamx. - This parameter can be a value of @ref DMA_priority_level */ - - uint32_t DMA_FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified Stream. - This parameter can be a value of @ref DMA_fifo_direct_mode - @note The Direct mode (FIFO mode disabled) cannot be used if the - memory-to-memory data transfer is configured on the selected Stream */ - - uint32_t DMA_FIFOThreshold; /*!< Specifies the FIFO threshold level. - This parameter can be a value of @ref DMA_fifo_threshold_level */ - - uint32_t DMA_MemoryBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. - It specifies the amount of data to be transferred in a single non interruptable - transaction. This parameter can be a value of @ref DMA_memory_burst - @note The burst mode is possible only if the address Increment mode is enabled. */ - - uint32_t DMA_PeripheralBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. - It specifies the amount of data to be transferred in a single non interruptable - transaction. This parameter can be a value of @ref DMA_peripheral_burst - @note The burst mode is possible only if the address Increment mode is enabled. */ -}DMA_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup DMA_Exported_Constants - * @{ - */ - -#define IS_DMA_ALL_PERIPH(PERIPH) (((PERIPH) == DMA1_Stream0) || \ - ((PERIPH) == DMA1_Stream1) || \ - ((PERIPH) == DMA1_Stream2) || \ - ((PERIPH) == DMA1_Stream3) || \ - ((PERIPH) == DMA1_Stream4) || \ - ((PERIPH) == DMA1_Stream5) || \ - ((PERIPH) == DMA1_Stream6) || \ - ((PERIPH) == DMA1_Stream7) || \ - ((PERIPH) == DMA2_Stream0) || \ - ((PERIPH) == DMA2_Stream1) || \ - ((PERIPH) == DMA2_Stream2) || \ - ((PERIPH) == DMA2_Stream3) || \ - ((PERIPH) == DMA2_Stream4) || \ - ((PERIPH) == DMA2_Stream5) || \ - ((PERIPH) == DMA2_Stream6) || \ - ((PERIPH) == DMA2_Stream7)) - -#define IS_DMA_ALL_CONTROLLER(CONTROLLER) (((CONTROLLER) == DMA1) || \ - ((CONTROLLER) == DMA2)) - -/** @defgroup DMA_channel - * @{ - */ -#define DMA_Channel_0 ((uint32_t)0x00000000) -#define DMA_Channel_1 ((uint32_t)0x02000000) -#define DMA_Channel_2 ((uint32_t)0x04000000) -#define DMA_Channel_3 ((uint32_t)0x06000000) -#define DMA_Channel_4 ((uint32_t)0x08000000) -#define DMA_Channel_5 ((uint32_t)0x0A000000) -#define DMA_Channel_6 ((uint32_t)0x0C000000) -#define DMA_Channel_7 ((uint32_t)0x0E000000) - -#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_Channel_0) || \ - ((CHANNEL) == DMA_Channel_1) || \ - ((CHANNEL) == DMA_Channel_2) || \ - ((CHANNEL) == DMA_Channel_3) || \ - ((CHANNEL) == DMA_Channel_4) || \ - ((CHANNEL) == DMA_Channel_5) || \ - ((CHANNEL) == DMA_Channel_6) || \ - ((CHANNEL) == DMA_Channel_7)) -/** - * @} - */ - - -/** @defgroup DMA_data_transfer_direction - * @{ - */ -#define DMA_DIR_PeripheralToMemory ((uint32_t)0x00000000) -#define DMA_DIR_MemoryToPeripheral ((uint32_t)0x00000040) -#define DMA_DIR_MemoryToMemory ((uint32_t)0x00000080) - -#define IS_DMA_DIRECTION(DIRECTION) (((DIRECTION) == DMA_DIR_PeripheralToMemory ) || \ - ((DIRECTION) == DMA_DIR_MemoryToPeripheral) || \ - ((DIRECTION) == DMA_DIR_MemoryToMemory)) -/** - * @} - */ - - -/** @defgroup DMA_data_buffer_size - * @{ - */ -#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x1) && ((SIZE) < 0x10000)) -/** - * @} - */ - - -/** @defgroup DMA_peripheral_incremented_mode - * @{ - */ -#define DMA_PeripheralInc_Enable ((uint32_t)0x00000200) -#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000) - -#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PeripheralInc_Enable) || \ - ((STATE) == DMA_PeripheralInc_Disable)) -/** - * @} - */ - - -/** @defgroup DMA_memory_incremented_mode - * @{ - */ -#define DMA_MemoryInc_Enable ((uint32_t)0x00000400) -#define DMA_MemoryInc_Disable ((uint32_t)0x00000000) - -#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MemoryInc_Enable) || \ - ((STATE) == DMA_MemoryInc_Disable)) -/** - * @} - */ - - -/** @defgroup DMA_peripheral_data_size - * @{ - */ -#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) -#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000800) -#define DMA_PeripheralDataSize_Word ((uint32_t)0x00001000) - -#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PeripheralDataSize_Byte) || \ - ((SIZE) == DMA_PeripheralDataSize_HalfWord) || \ - ((SIZE) == DMA_PeripheralDataSize_Word)) -/** - * @} - */ - - -/** @defgroup DMA_memory_data_size - * @{ - */ -#define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000) -#define DMA_MemoryDataSize_HalfWord ((uint32_t)0x00002000) -#define DMA_MemoryDataSize_Word ((uint32_t)0x00004000) - -#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MemoryDataSize_Byte) || \ - ((SIZE) == DMA_MemoryDataSize_HalfWord) || \ - ((SIZE) == DMA_MemoryDataSize_Word )) -/** - * @} - */ - - -/** @defgroup DMA_circular_normal_mode - * @{ - */ -#define DMA_Mode_Normal ((uint32_t)0x00000000) -#define DMA_Mode_Circular ((uint32_t)0x00000100) - -#define IS_DMA_MODE(MODE) (((MODE) == DMA_Mode_Normal ) || \ - ((MODE) == DMA_Mode_Circular)) -/** - * @} - */ - - -/** @defgroup DMA_priority_level - * @{ - */ -#define DMA_Priority_Low ((uint32_t)0x00000000) -#define DMA_Priority_Medium ((uint32_t)0x00010000) -#define DMA_Priority_High ((uint32_t)0x00020000) -#define DMA_Priority_VeryHigh ((uint32_t)0x00030000) - -#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_Priority_Low ) || \ - ((PRIORITY) == DMA_Priority_Medium) || \ - ((PRIORITY) == DMA_Priority_High) || \ - ((PRIORITY) == DMA_Priority_VeryHigh)) -/** - * @} - */ - - -/** @defgroup DMA_fifo_direct_mode - * @{ - */ -#define DMA_FIFOMode_Disable ((uint32_t)0x00000000) -#define DMA_FIFOMode_Enable ((uint32_t)0x00000004) - -#define IS_DMA_FIFO_MODE_STATE(STATE) (((STATE) == DMA_FIFOMode_Disable ) || \ - ((STATE) == DMA_FIFOMode_Enable)) -/** - * @} - */ - - -/** @defgroup DMA_fifo_threshold_level - * @{ - */ -#define DMA_FIFOThreshold_1QuarterFull ((uint32_t)0x00000000) -#define DMA_FIFOThreshold_HalfFull ((uint32_t)0x00000001) -#define DMA_FIFOThreshold_3QuartersFull ((uint32_t)0x00000002) -#define DMA_FIFOThreshold_Full ((uint32_t)0x00000003) - -#define IS_DMA_FIFO_THRESHOLD(THRESHOLD) (((THRESHOLD) == DMA_FIFOThreshold_1QuarterFull ) || \ - ((THRESHOLD) == DMA_FIFOThreshold_HalfFull) || \ - ((THRESHOLD) == DMA_FIFOThreshold_3QuartersFull) || \ - ((THRESHOLD) == DMA_FIFOThreshold_Full)) -/** - * @} - */ - - -/** @defgroup DMA_memory_burst - * @{ - */ -#define DMA_MemoryBurst_Single ((uint32_t)0x00000000) -#define DMA_MemoryBurst_INC4 ((uint32_t)0x00800000) -#define DMA_MemoryBurst_INC8 ((uint32_t)0x01000000) -#define DMA_MemoryBurst_INC16 ((uint32_t)0x01800000) - -#define IS_DMA_MEMORY_BURST(BURST) (((BURST) == DMA_MemoryBurst_Single) || \ - ((BURST) == DMA_MemoryBurst_INC4) || \ - ((BURST) == DMA_MemoryBurst_INC8) || \ - ((BURST) == DMA_MemoryBurst_INC16)) -/** - * @} - */ - - -/** @defgroup DMA_peripheral_burst - * @{ - */ -#define DMA_PeripheralBurst_Single ((uint32_t)0x00000000) -#define DMA_PeripheralBurst_INC4 ((uint32_t)0x00200000) -#define DMA_PeripheralBurst_INC8 ((uint32_t)0x00400000) -#define DMA_PeripheralBurst_INC16 ((uint32_t)0x00600000) - -#define IS_DMA_PERIPHERAL_BURST(BURST) (((BURST) == DMA_PeripheralBurst_Single) || \ - ((BURST) == DMA_PeripheralBurst_INC4) || \ - ((BURST) == DMA_PeripheralBurst_INC8) || \ - ((BURST) == DMA_PeripheralBurst_INC16)) -/** - * @} - */ - - -/** @defgroup DMA_fifo_status_level - * @{ - */ -#define DMA_FIFOStatus_Less1QuarterFull ((uint32_t)0x00000000 << 3) -#define DMA_FIFOStatus_1QuarterFull ((uint32_t)0x00000001 << 3) -#define DMA_FIFOStatus_HalfFull ((uint32_t)0x00000002 << 3) -#define DMA_FIFOStatus_3QuartersFull ((uint32_t)0x00000003 << 3) -#define DMA_FIFOStatus_Empty ((uint32_t)0x00000004 << 3) -#define DMA_FIFOStatus_Full ((uint32_t)0x00000005 << 3) - -#define IS_DMA_FIFO_STATUS(STATUS) (((STATUS) == DMA_FIFOStatus_Less1QuarterFull ) || \ - ((STATUS) == DMA_FIFOStatus_HalfFull) || \ - ((STATUS) == DMA_FIFOStatus_1QuarterFull) || \ - ((STATUS) == DMA_FIFOStatus_3QuartersFull) || \ - ((STATUS) == DMA_FIFOStatus_Full) || \ - ((STATUS) == DMA_FIFOStatus_Empty)) -/** - * @} - */ - -/** @defgroup DMA_flags_definition - * @{ - */ -#define DMA_FLAG_FEIF0 ((uint32_t)0x10800001) -#define DMA_FLAG_DMEIF0 ((uint32_t)0x10800004) -#define DMA_FLAG_TEIF0 ((uint32_t)0x10000008) -#define DMA_FLAG_HTIF0 ((uint32_t)0x10000010) -#define DMA_FLAG_TCIF0 ((uint32_t)0x10000020) -#define DMA_FLAG_FEIF1 ((uint32_t)0x10000040) -#define DMA_FLAG_DMEIF1 ((uint32_t)0x10000100) -#define DMA_FLAG_TEIF1 ((uint32_t)0x10000200) -#define DMA_FLAG_HTIF1 ((uint32_t)0x10000400) -#define DMA_FLAG_TCIF1 ((uint32_t)0x10000800) -#define DMA_FLAG_FEIF2 ((uint32_t)0x10010000) -#define DMA_FLAG_DMEIF2 ((uint32_t)0x10040000) -#define DMA_FLAG_TEIF2 ((uint32_t)0x10080000) -#define DMA_FLAG_HTIF2 ((uint32_t)0x10100000) -#define DMA_FLAG_TCIF2 ((uint32_t)0x10200000) -#define DMA_FLAG_FEIF3 ((uint32_t)0x10400000) -#define DMA_FLAG_DMEIF3 ((uint32_t)0x11000000) -#define DMA_FLAG_TEIF3 ((uint32_t)0x12000000) -#define DMA_FLAG_HTIF3 ((uint32_t)0x14000000) -#define DMA_FLAG_TCIF3 ((uint32_t)0x18000000) -#define DMA_FLAG_FEIF4 ((uint32_t)0x20000001) -#define DMA_FLAG_DMEIF4 ((uint32_t)0x20000004) -#define DMA_FLAG_TEIF4 ((uint32_t)0x20000008) -#define DMA_FLAG_HTIF4 ((uint32_t)0x20000010) -#define DMA_FLAG_TCIF4 ((uint32_t)0x20000020) -#define DMA_FLAG_FEIF5 ((uint32_t)0x20000040) -#define DMA_FLAG_DMEIF5 ((uint32_t)0x20000100) -#define DMA_FLAG_TEIF5 ((uint32_t)0x20000200) -#define DMA_FLAG_HTIF5 ((uint32_t)0x20000400) -#define DMA_FLAG_TCIF5 ((uint32_t)0x20000800) -#define DMA_FLAG_FEIF6 ((uint32_t)0x20010000) -#define DMA_FLAG_DMEIF6 ((uint32_t)0x20040000) -#define DMA_FLAG_TEIF6 ((uint32_t)0x20080000) -#define DMA_FLAG_HTIF6 ((uint32_t)0x20100000) -#define DMA_FLAG_TCIF6 ((uint32_t)0x20200000) -#define DMA_FLAG_FEIF7 ((uint32_t)0x20400000) -#define DMA_FLAG_DMEIF7 ((uint32_t)0x21000000) -#define DMA_FLAG_TEIF7 ((uint32_t)0x22000000) -#define DMA_FLAG_HTIF7 ((uint32_t)0x24000000) -#define DMA_FLAG_TCIF7 ((uint32_t)0x28000000) - -#define IS_DMA_CLEAR_FLAG(FLAG) ((((FLAG) & 0x30000000) != 0x30000000) && (((FLAG) & 0x30000000) != 0) && \ - (((FLAG) & 0xC082F082) == 0x00) && ((FLAG) != 0x00)) - -#define IS_DMA_GET_FLAG(FLAG) (((FLAG) == DMA_FLAG_TCIF0) || ((FLAG) == DMA_FLAG_HTIF0) || \ - ((FLAG) == DMA_FLAG_TEIF0) || ((FLAG) == DMA_FLAG_DMEIF0) || \ - ((FLAG) == DMA_FLAG_FEIF0) || ((FLAG) == DMA_FLAG_TCIF1) || \ - ((FLAG) == DMA_FLAG_HTIF1) || ((FLAG) == DMA_FLAG_TEIF1) || \ - ((FLAG) == DMA_FLAG_DMEIF1) || ((FLAG) == DMA_FLAG_FEIF1) || \ - ((FLAG) == DMA_FLAG_TCIF2) || ((FLAG) == DMA_FLAG_HTIF2) || \ - ((FLAG) == DMA_FLAG_TEIF2) || ((FLAG) == DMA_FLAG_DMEIF2) || \ - ((FLAG) == DMA_FLAG_FEIF2) || ((FLAG) == DMA_FLAG_TCIF3) || \ - ((FLAG) == DMA_FLAG_HTIF3) || ((FLAG) == DMA_FLAG_TEIF3) || \ - ((FLAG) == DMA_FLAG_DMEIF3) || ((FLAG) == DMA_FLAG_FEIF3) || \ - ((FLAG) == DMA_FLAG_TCIF4) || ((FLAG) == DMA_FLAG_HTIF4) || \ - ((FLAG) == DMA_FLAG_TEIF4) || ((FLAG) == DMA_FLAG_DMEIF4) || \ - ((FLAG) == DMA_FLAG_FEIF4) || ((FLAG) == DMA_FLAG_TCIF5) || \ - ((FLAG) == DMA_FLAG_HTIF5) || ((FLAG) == DMA_FLAG_TEIF5) || \ - ((FLAG) == DMA_FLAG_DMEIF5) || ((FLAG) == DMA_FLAG_FEIF5) || \ - ((FLAG) == DMA_FLAG_TCIF6) || ((FLAG) == DMA_FLAG_HTIF6) || \ - ((FLAG) == DMA_FLAG_TEIF6) || ((FLAG) == DMA_FLAG_DMEIF6) || \ - ((FLAG) == DMA_FLAG_FEIF6) || ((FLAG) == DMA_FLAG_TCIF7) || \ - ((FLAG) == DMA_FLAG_HTIF7) || ((FLAG) == DMA_FLAG_TEIF7) || \ - ((FLAG) == DMA_FLAG_DMEIF7) || ((FLAG) == DMA_FLAG_FEIF7)) -/** - * @} - */ - - -/** @defgroup DMA_interrupt_enable_definitions - * @{ - */ -#define DMA_IT_TC ((uint32_t)0x00000010) -#define DMA_IT_HT ((uint32_t)0x00000008) -#define DMA_IT_TE ((uint32_t)0x00000004) -#define DMA_IT_DME ((uint32_t)0x00000002) -#define DMA_IT_FE ((uint32_t)0x00000080) - -#define IS_DMA_CONFIG_IT(IT) ((((IT) & 0xFFFFFF61) == 0x00) && ((IT) != 0x00)) -/** - * @} - */ - - -/** @defgroup DMA_interrupts_definitions - * @{ - */ -#define DMA_IT_FEIF0 ((uint32_t)0x90000001) -#define DMA_IT_DMEIF0 ((uint32_t)0x10001004) -#define DMA_IT_TEIF0 ((uint32_t)0x10002008) -#define DMA_IT_HTIF0 ((uint32_t)0x10004010) -#define DMA_IT_TCIF0 ((uint32_t)0x10008020) -#define DMA_IT_FEIF1 ((uint32_t)0x90000040) -#define DMA_IT_DMEIF1 ((uint32_t)0x10001100) -#define DMA_IT_TEIF1 ((uint32_t)0x10002200) -#define DMA_IT_HTIF1 ((uint32_t)0x10004400) -#define DMA_IT_TCIF1 ((uint32_t)0x10008800) -#define DMA_IT_FEIF2 ((uint32_t)0x90010000) -#define DMA_IT_DMEIF2 ((uint32_t)0x10041000) -#define DMA_IT_TEIF2 ((uint32_t)0x10082000) -#define DMA_IT_HTIF2 ((uint32_t)0x10104000) -#define DMA_IT_TCIF2 ((uint32_t)0x10208000) -#define DMA_IT_FEIF3 ((uint32_t)0x90400000) -#define DMA_IT_DMEIF3 ((uint32_t)0x11001000) -#define DMA_IT_TEIF3 ((uint32_t)0x12002000) -#define DMA_IT_HTIF3 ((uint32_t)0x14004000) -#define DMA_IT_TCIF3 ((uint32_t)0x18008000) -#define DMA_IT_FEIF4 ((uint32_t)0xA0000001) -#define DMA_IT_DMEIF4 ((uint32_t)0x20001004) -#define DMA_IT_TEIF4 ((uint32_t)0x20002008) -#define DMA_IT_HTIF4 ((uint32_t)0x20004010) -#define DMA_IT_TCIF4 ((uint32_t)0x20008020) -#define DMA_IT_FEIF5 ((uint32_t)0xA0000040) -#define DMA_IT_DMEIF5 ((uint32_t)0x20001100) -#define DMA_IT_TEIF5 ((uint32_t)0x20002200) -#define DMA_IT_HTIF5 ((uint32_t)0x20004400) -#define DMA_IT_TCIF5 ((uint32_t)0x20008800) -#define DMA_IT_FEIF6 ((uint32_t)0xA0010000) -#define DMA_IT_DMEIF6 ((uint32_t)0x20041000) -#define DMA_IT_TEIF6 ((uint32_t)0x20082000) -#define DMA_IT_HTIF6 ((uint32_t)0x20104000) -#define DMA_IT_TCIF6 ((uint32_t)0x20208000) -#define DMA_IT_FEIF7 ((uint32_t)0xA0400000) -#define DMA_IT_DMEIF7 ((uint32_t)0x21001000) -#define DMA_IT_TEIF7 ((uint32_t)0x22002000) -#define DMA_IT_HTIF7 ((uint32_t)0x24004000) -#define DMA_IT_TCIF7 ((uint32_t)0x28008000) - -#define IS_DMA_CLEAR_IT(IT) ((((IT) & 0x30000000) != 0x30000000) && \ - (((IT) & 0x30000000) != 0) && ((IT) != 0x00) && \ - (((IT) & 0x40820082) == 0x00)) - -#define IS_DMA_GET_IT(IT) (((IT) == DMA_IT_TCIF0) || ((IT) == DMA_IT_HTIF0) || \ - ((IT) == DMA_IT_TEIF0) || ((IT) == DMA_IT_DMEIF0) || \ - ((IT) == DMA_IT_FEIF0) || ((IT) == DMA_IT_TCIF1) || \ - ((IT) == DMA_IT_HTIF1) || ((IT) == DMA_IT_TEIF1) || \ - ((IT) == DMA_IT_DMEIF1)|| ((IT) == DMA_IT_FEIF1) || \ - ((IT) == DMA_IT_TCIF2) || ((IT) == DMA_IT_HTIF2) || \ - ((IT) == DMA_IT_TEIF2) || ((IT) == DMA_IT_DMEIF2) || \ - ((IT) == DMA_IT_FEIF2) || ((IT) == DMA_IT_TCIF3) || \ - ((IT) == DMA_IT_HTIF3) || ((IT) == DMA_IT_TEIF3) || \ - ((IT) == DMA_IT_DMEIF3)|| ((IT) == DMA_IT_FEIF3) || \ - ((IT) == DMA_IT_TCIF4) || ((IT) == DMA_IT_HTIF4) || \ - ((IT) == DMA_IT_TEIF4) || ((IT) == DMA_IT_DMEIF4) || \ - ((IT) == DMA_IT_FEIF4) || ((IT) == DMA_IT_TCIF5) || \ - ((IT) == DMA_IT_HTIF5) || ((IT) == DMA_IT_TEIF5) || \ - ((IT) == DMA_IT_DMEIF5)|| ((IT) == DMA_IT_FEIF5) || \ - ((IT) == DMA_IT_TCIF6) || ((IT) == DMA_IT_HTIF6) || \ - ((IT) == DMA_IT_TEIF6) || ((IT) == DMA_IT_DMEIF6) || \ - ((IT) == DMA_IT_FEIF6) || ((IT) == DMA_IT_TCIF7) || \ - ((IT) == DMA_IT_HTIF7) || ((IT) == DMA_IT_TEIF7) || \ - ((IT) == DMA_IT_DMEIF7)|| ((IT) == DMA_IT_FEIF7)) -/** - * @} - */ - - -/** @defgroup DMA_peripheral_increment_offset - * @{ - */ -#define DMA_PINCOS_Psize ((uint32_t)0x00000000) -#define DMA_PINCOS_WordAligned ((uint32_t)0x00008000) - -#define IS_DMA_PINCOS_SIZE(SIZE) (((SIZE) == DMA_PINCOS_Psize) || \ - ((SIZE) == DMA_PINCOS_WordAligned)) -/** - * @} - */ - - -/** @defgroup DMA_flow_controller_definitions - * @{ - */ -#define DMA_FlowCtrl_Memory ((uint32_t)0x00000000) -#define DMA_FlowCtrl_Peripheral ((uint32_t)0x00000020) - -#define IS_DMA_FLOW_CTRL(CTRL) (((CTRL) == DMA_FlowCtrl_Memory) || \ - ((CTRL) == DMA_FlowCtrl_Peripheral)) -/** - * @} - */ - - -/** @defgroup DMA_memory_targets_definitions - * @{ - */ -#define DMA_Memory_0 ((uint32_t)0x00000000) -#define DMA_Memory_1 ((uint32_t)0x00080000) - -#define IS_DMA_CURRENT_MEM(MEM) (((MEM) == DMA_Memory_0) || ((MEM) == DMA_Memory_1)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the DMA configuration to the default reset state *****/ -void DMA_DeInit(DMA_Stream_TypeDef* DMAy_Streamx); - -/* Initialization and Configuration functions *********************************/ -void DMA_Init(DMA_Stream_TypeDef* DMAy_Streamx, DMA_InitTypeDef* DMA_InitStruct); -void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct); -void DMA_Cmd(DMA_Stream_TypeDef* DMAy_Streamx, FunctionalState NewState); - -/* Optional Configuration functions *******************************************/ -void DMA_PeriphIncOffsetSizeConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_Pincos); -void DMA_FlowControllerConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_FlowCtrl); - -/* Data Counter functions *****************************************************/ -void DMA_SetCurrDataCounter(DMA_Stream_TypeDef* DMAy_Streamx, uint16_t Counter); -uint16_t DMA_GetCurrDataCounter(DMA_Stream_TypeDef* DMAy_Streamx); - -/* Double Buffer mode functions ***********************************************/ -void DMA_DoubleBufferModeConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t Memory1BaseAddr, - uint32_t DMA_CurrentMemory); -void DMA_DoubleBufferModeCmd(DMA_Stream_TypeDef* DMAy_Streamx, FunctionalState NewState); -void DMA_MemoryTargetConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t MemoryBaseAddr, - uint32_t DMA_MemoryTarget); -uint32_t DMA_GetCurrentMemoryTarget(DMA_Stream_TypeDef* DMAy_Streamx); - -/* Interrupts and flags management functions **********************************/ -FunctionalState DMA_GetCmdStatus(DMA_Stream_TypeDef* DMAy_Streamx); -uint32_t DMA_GetFIFOStatus(DMA_Stream_TypeDef* DMAy_Streamx); -FlagStatus DMA_GetFlagStatus(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_FLAG); -void DMA_ClearFlag(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_FLAG); -void DMA_ITConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT, FunctionalState NewState); -ITStatus DMA_GetITStatus(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT); -void DMA_ClearITPendingBit(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_DMA_H */ - -/** - * @} - */ - -/** - * @} - */ - - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_exti.c b/car_hw/src/lib/stdperiph/stm32f4xx_exti.c deleted file mode 100644 index 6022753f5a7..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_exti.c +++ /dev/null @@ -1,307 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_exti.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the EXTI peripheral: - * - Initialization and Configuration - * - Interrupts and flags management - * - * @verbatim - * - * =================================================================== - * EXTI features - * =================================================================== - * - * External interrupt/event lines are mapped as following: - * 1- All available GPIO pins are connected to the 16 external - * interrupt/event lines from EXTI0 to EXTI15. - * 2- EXTI line 16 is connected to the PVD Output - * 3- EXTI line 17 is connected to the RTC Alarm event - * 4- EXTI line 18 is connected to the USB OTG FS Wakeup from suspend event - * 5- EXTI line 19 is connected to the Ethernet Wakeup event - * 6- EXTI line 20 is connected to the USB OTG HS (configured in FS) Wakeup event - * 7- EXTI line 21 is connected to the RTC Tamper and Time Stamp events - * 8- EXTI line 22 is connected to the RTC Wakeup event - * - * =================================================================== - * How to use this driver - * =================================================================== - * - * In order to use an I/O pin as an external interrupt source, follow - * steps below: - * 1- Configure the I/O in input mode using GPIO_Init() - * 2- Select the input source pin for the EXTI line using SYSCFG_EXTILineConfig() - * 3- Select the mode(interrupt, event) and configure the trigger - * selection (Rising, falling or both) using EXTI_Init() - * 4- Configure NVIC IRQ channel mapped to the EXTI line using NVIC_Init() - * - * @note SYSCFG APB clock must be enabled to get write access to SYSCFG_EXTICRx - * registers using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_exti.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup EXTI - * @brief EXTI driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -#define EXTI_LINENONE ((uint32_t)0x00000) /* No interrupt selected */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup EXTI_Private_Functions - * @{ - */ - -/** @defgroup EXTI_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - Initialization and Configuration functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the EXTI peripheral registers to their default reset values. - * @param None - * @retval None - */ -void EXTI_DeInit(void) -{ - EXTI->IMR = 0x00000000; - EXTI->EMR = 0x00000000; - EXTI->RTSR = 0x00000000; - EXTI->FTSR = 0x00000000; - EXTI->PR = 0x007FFFFF; -} - -/** - * @brief Initializes the EXTI peripheral according to the specified - * parameters in the EXTI_InitStruct. - * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure - * that contains the configuration information for the EXTI peripheral. - * @retval None - */ -void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) -{ - uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_EXTI_MODE(EXTI_InitStruct->EXTI_Mode)); - assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct->EXTI_Trigger)); - assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line)); - assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->EXTI_LineCmd)); - - tmp = (uint32_t)EXTI_BASE; - - if (EXTI_InitStruct->EXTI_LineCmd != DISABLE) - { - /* Clear EXTI line configuration */ - EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line; - EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line; - - tmp += EXTI_InitStruct->EXTI_Mode; - - *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line; - EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line; - - /* Select the trigger for the selected external interrupts */ - if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) - { - /* Rising Falling edge */ - EXTI->RTSR |= EXTI_InitStruct->EXTI_Line; - EXTI->FTSR |= EXTI_InitStruct->EXTI_Line; - } - else - { - tmp = (uint32_t)EXTI_BASE; - tmp += EXTI_InitStruct->EXTI_Trigger; - - *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; - } - } - else - { - tmp += EXTI_InitStruct->EXTI_Mode; - - /* Disable the selected external lines */ - *(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line; - } -} - -/** - * @brief Fills each EXTI_InitStruct member with its reset value. - * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) -{ - EXTI_InitStruct->EXTI_Line = EXTI_LINENONE; - EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling; - EXTI_InitStruct->EXTI_LineCmd = DISABLE; -} - -/** - * @brief Generates a Software interrupt on selected EXTI line. - * @param EXTI_Line: specifies the EXTI line on which the software interrupt - * will be generated. - * This parameter can be any combination of EXTI_Linex where x can be (0..22) - * @retval None - */ -void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(EXTI_Line)); - - EXTI->SWIER |= EXTI_Line; -} - -/** - * @} - */ - -/** @defgroup EXTI_Group2 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Checks whether the specified EXTI line flag is set or not. - * @param EXTI_Line: specifies the EXTI line flag to check. - * This parameter can be EXTI_Linex where x can be(0..22) - * @retval The new state of EXTI_Line (SET or RESET). - */ -FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_GET_EXTI_LINE(EXTI_Line)); - - if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the EXTI's line pending flags. - * @param EXTI_Line: specifies the EXTI lines flags to clear. - * This parameter can be any combination of EXTI_Linex where x can be (0..22) - * @retval None - */ -void EXTI_ClearFlag(uint32_t EXTI_Line) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(EXTI_Line)); - - EXTI->PR = EXTI_Line; -} - -/** - * @brief Checks whether the specified EXTI line is asserted or not. - * @param EXTI_Line: specifies the EXTI line to check. - * This parameter can be EXTI_Linex where x can be(0..22) - * @retval The new state of EXTI_Line (SET or RESET). - */ -ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) -{ - ITStatus bitstatus = RESET; - uint32_t enablestatus = 0; - /* Check the parameters */ - assert_param(IS_GET_EXTI_LINE(EXTI_Line)); - - enablestatus = EXTI->IMR & EXTI_Line; - if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the EXTI's line pending bits. - * @param EXTI_Line: specifies the EXTI lines to clear. - * This parameter can be any combination of EXTI_Linex where x can be (0..22) - * @retval None - */ -void EXTI_ClearITPendingBit(uint32_t EXTI_Line) -{ - /* Check the parameters */ - assert_param(IS_EXTI_LINE(EXTI_Line)); - - EXTI->PR = EXTI_Line; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_exti.h b/car_hw/src/lib/stdperiph/stm32f4xx_exti.h deleted file mode 100644 index bda295c4242..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_exti.h +++ /dev/null @@ -1,177 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_exti.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the EXTI firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_EXTI_H -#define __STM32F4xx_EXTI_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup EXTI - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief EXTI mode enumeration - */ - -typedef enum -{ - EXTI_Mode_Interrupt = 0x00, - EXTI_Mode_Event = 0x04 -}EXTIMode_TypeDef; - -#define IS_EXTI_MODE(MODE) (((MODE) == EXTI_Mode_Interrupt) || ((MODE) == EXTI_Mode_Event)) - -/** - * @brief EXTI Trigger enumeration - */ - -typedef enum -{ - EXTI_Trigger_Rising = 0x08, - EXTI_Trigger_Falling = 0x0C, - EXTI_Trigger_Rising_Falling = 0x10 -}EXTITrigger_TypeDef; - -#define IS_EXTI_TRIGGER(TRIGGER) (((TRIGGER) == EXTI_Trigger_Rising) || \ - ((TRIGGER) == EXTI_Trigger_Falling) || \ - ((TRIGGER) == EXTI_Trigger_Rising_Falling)) -/** - * @brief EXTI Init Structure definition - */ - -typedef struct -{ - uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled. - This parameter can be any combination value of @ref EXTI_Lines */ - - EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines. - This parameter can be a value of @ref EXTIMode_TypeDef */ - - EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. - This parameter can be a value of @ref EXTITrigger_TypeDef */ - - FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines. - This parameter can be set either to ENABLE or DISABLE */ -}EXTI_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup EXTI_Exported_Constants - * @{ - */ - -/** @defgroup EXTI_Lines - * @{ - */ - -#define EXTI_Line0 ((uint32_t)0x00001) /*!< External interrupt line 0 */ -#define EXTI_Line1 ((uint32_t)0x00002) /*!< External interrupt line 1 */ -#define EXTI_Line2 ((uint32_t)0x00004) /*!< External interrupt line 2 */ -#define EXTI_Line3 ((uint32_t)0x00008) /*!< External interrupt line 3 */ -#define EXTI_Line4 ((uint32_t)0x00010) /*!< External interrupt line 4 */ -#define EXTI_Line5 ((uint32_t)0x00020) /*!< External interrupt line 5 */ -#define EXTI_Line6 ((uint32_t)0x00040) /*!< External interrupt line 6 */ -#define EXTI_Line7 ((uint32_t)0x00080) /*!< External interrupt line 7 */ -#define EXTI_Line8 ((uint32_t)0x00100) /*!< External interrupt line 8 */ -#define EXTI_Line9 ((uint32_t)0x00200) /*!< External interrupt line 9 */ -#define EXTI_Line10 ((uint32_t)0x00400) /*!< External interrupt line 10 */ -#define EXTI_Line11 ((uint32_t)0x00800) /*!< External interrupt line 11 */ -#define EXTI_Line12 ((uint32_t)0x01000) /*!< External interrupt line 12 */ -#define EXTI_Line13 ((uint32_t)0x02000) /*!< External interrupt line 13 */ -#define EXTI_Line14 ((uint32_t)0x04000) /*!< External interrupt line 14 */ -#define EXTI_Line15 ((uint32_t)0x08000) /*!< External interrupt line 15 */ -#define EXTI_Line16 ((uint32_t)0x10000) /*!< External interrupt line 16 Connected to the PVD Output */ -#define EXTI_Line17 ((uint32_t)0x20000) /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#define EXTI_Line18 ((uint32_t)0x40000) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#define EXTI_Line19 ((uint32_t)0x80000) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#define EXTI_Line20 ((uint32_t)0x00100000) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#define EXTI_Line21 ((uint32_t)0x00200000) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#define EXTI_Line22 ((uint32_t)0x00400000) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ - -#define IS_EXTI_LINE(LINE) ((((LINE) & (uint32_t)0xFF800000) == 0x00) && ((LINE) != (uint16_t)0x00)) - -#define IS_GET_EXTI_LINE(LINE) (((LINE) == EXTI_Line0) || ((LINE) == EXTI_Line1) || \ - ((LINE) == EXTI_Line2) || ((LINE) == EXTI_Line3) || \ - ((LINE) == EXTI_Line4) || ((LINE) == EXTI_Line5) || \ - ((LINE) == EXTI_Line6) || ((LINE) == EXTI_Line7) || \ - ((LINE) == EXTI_Line8) || ((LINE) == EXTI_Line9) || \ - ((LINE) == EXTI_Line10) || ((LINE) == EXTI_Line11) || \ - ((LINE) == EXTI_Line12) || ((LINE) == EXTI_Line13) || \ - ((LINE) == EXTI_Line14) || ((LINE) == EXTI_Line15) || \ - ((LINE) == EXTI_Line16) || ((LINE) == EXTI_Line17) || \ - ((LINE) == EXTI_Line18) || ((LINE) == EXTI_Line19) || \ - ((LINE) == EXTI_Line20) || ((LINE) == EXTI_Line21) ||\ - ((LINE) == EXTI_Line22)) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the EXTI configuration to the default reset state *****/ -void EXTI_DeInit(void); - -/* Initialization and Configuration functions *********************************/ -void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); -void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct); -void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); - -/* Interrupts and flags management functions **********************************/ -FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line); -void EXTI_ClearFlag(uint32_t EXTI_Line); -ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); -void EXTI_ClearITPendingBit(uint32_t EXTI_Line); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_EXTI_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_flash.c b/car_hw/src/lib/stdperiph/stm32f4xx_flash.c deleted file mode 100644 index 24d50675fbf..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_flash.c +++ /dev/null @@ -1,1057 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_flash.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the FLASH peripheral: - * - FLASH Interface configuration - * - FLASH Memory Programming - * - Option Bytes Programming - * - Interrupts and flags management - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - * - * This driver provides functions to configure and program the FLASH - * memory of all STM32F4xx devices. - * These functions are split in 4 groups: - * - * 1. FLASH Interface configuration functions: this group includes the - * management of the following features: - * - Set the latency - * - Enable/Disable the prefetch buffer - * - Enable/Disable the Instruction cache and the Data cache - * - Reset the Instruction cache and the Data cache - * - * 2. FLASH Memory Programming functions: this group includes all needed - * functions to erase and program the main memory: - * - Lock and Unlock the FLASH interface - * - Erase function: Erase sector, erase all sectors - * - Program functions: byte, half word, word and double word - * - * 3. Option Bytes Programming functions: this group includes all needed - * functions to manage the Option Bytes: - * - Set/Reset the write protection - * - Set the Read protection Level - * - Set the BOR level - * - Program the user Option Bytes - * - Launch the Option Bytes loader - * - * 4. Interrupts and flags management functions: this group - * includes all needed functions to: - * - Enable/Disable the FLASH interrupt sources - * - Get flags status - * - Clear flags - * - Get FLASH operation status - * - Wait for last FLASH operation - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_flash.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup FLASH - * @brief FLASH driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define SECTOR_MASK ((uint32_t)0xFFFFFF07) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup FLASH_Private_Functions - * @{ - */ - -/** @defgroup FLASH_Group1 FLASH Interface configuration functions - * @brief FLASH Interface configuration functions - * - -@verbatim - =============================================================================== - FLASH Interface configuration functions - =============================================================================== - - This group includes the following functions: - - void FLASH_SetLatency(uint32_t FLASH_Latency) - To correctly read data from FLASH memory, the number of wait states (LATENCY) - must be correctly programmed according to the frequency of the CPU clock - (HCLK) and the supply voltage of the device. - +-------------------------------------------------------------------------------------+ - | Latency | HCLK clock frequency (MHz) | - | |---------------------------------------------------------------------| - | | voltage range | voltage range | voltage range | voltage range | - | | 2.7 V - 3.6 V | 2.4 V - 2.7 V | 2.1 V - 2.4 V | 1.8 V - 2.1 V | - |---------------|----------------|----------------|-----------------|-----------------| - |0WS(1CPU cycle)|0 < HCLK <= 30 |0 < HCLK <= 24 |0 < HCLK <= 18 |0 < HCLK <= 16 | - |---------------|----------------|----------------|-----------------|-----------------| - |1WS(2CPU cycle)|30 < HCLK <= 60 |24 < HCLK <= 48 |18 < HCLK <= 36 |16 < HCLK <= 32 | - |---------------|----------------|----------------|-----------------|-----------------| - |2WS(3CPU cycle)|60 < HCLK <= 90 |48 < HCLK <= 72 |36 < HCLK <= 54 |32 < HCLK <= 48 | - |---------------|----------------|----------------|-----------------|-----------------| - |3WS(4CPU cycle)|90 < HCLK <= 120|72 < HCLK <= 96 |54 < HCLK <= 72 |48 < HCLK <= 64 | - |---------------|----------------|----------------|-----------------|-----------------| - |4WS(5CPU cycle)|120< HCLK <= 150|96 < HCLK <= 120|72 < HCLK <= 90 |64 < HCLK <= 80 | - |---------------|----------------|----------------|-----------------|-----------------| - |5WS(6CPU cycle)|120< HCLK <= 168|120< HCLK <= 144|90 < HCLK <= 108 |80 < HCLK <= 96 | - |---------------|----------------|----------------|-----------------|-----------------| - |6WS(7CPU cycle)| NA |144< HCLK <= 168|108 < HCLK <= 120|96 < HCLK <= 112 | - |---------------|----------------|----------------|-----------------|-----------------| - |7WS(8CPU cycle)| NA | NA |120 < HCLK <= 138|112 < HCLK <= 120| - |***************|****************|****************|*****************|*****************|*****************************+ - | | voltage range | voltage range | voltage range | voltage range | voltage range 2.7 V - 3.6 V | - | | 2.7 V - 3.6 V | 2.4 V - 2.7 V | 2.1 V - 2.4 V | 1.8 V - 2.1 V | with External Vpp = 9V | - |---------------|----------------|----------------|-----------------|-----------------|-----------------------------| - |Max Parallelism| x32 | x16 | x8 | x64 | - |---------------|----------------|----------------|-----------------|-----------------|-----------------------------| - |PSIZE[1:0] | 10 | 01 | 00 | 11 | - +-------------------------------------------------------------------------------------------------------------------+ - @note When VOS bit (in PWR_CR register) is reset to '0’, the maximum value of HCLK is 144 MHz. - You can use PWR_MainRegulatorModeConfig() function to set or reset this bit. - - - void FLASH_PrefetchBufferCmd(FunctionalState NewState) - - void FLASH_InstructionCacheCmd(FunctionalState NewState) - - void FLASH_DataCacheCmd(FunctionalState NewState) - - void FLASH_InstructionCacheReset(void) - - void FLASH_DataCacheReset(void) - - The unlock sequence is not needed for these functions. - -@endverbatim - * @{ - */ - -/** - * @brief Sets the code latency value. - * @param FLASH_Latency: specifies the FLASH Latency value. - * This parameter can be one of the following values: - * @arg FLASH_Latency_0: FLASH Zero Latency cycle - * @arg FLASH_Latency_1: FLASH One Latency cycle - * @arg FLASH_Latency_2: FLASH Two Latency cycles - * @arg FLASH_Latency_3: FLASH Three Latency cycles - * @arg FLASH_Latency_4: FLASH Four Latency cycles - * @arg FLASH_Latency_5: FLASH Five Latency cycles - * @arg FLASH_Latency_6: FLASH Six Latency cycles - * @arg FLASH_Latency_7: FLASH Seven Latency cycles - * @retval None - */ -void FLASH_SetLatency(uint32_t FLASH_Latency) -{ - /* Check the parameters */ - assert_param(IS_FLASH_LATENCY(FLASH_Latency)); - - /* Perform Byte access to FLASH_ACR[8:0] to set the Latency value */ - *(__IO uint8_t *)ACR_BYTE0_ADDRESS = (uint8_t)FLASH_Latency; -} - -/** - * @brief Enables or disables the Prefetch Buffer. - * @param NewState: new state of the Prefetch Buffer. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FLASH_PrefetchBufferCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Enable or disable the Prefetch Buffer */ - if(NewState != DISABLE) - { - FLASH->ACR |= FLASH_ACR_PRFTEN; - } - else - { - FLASH->ACR &= (~FLASH_ACR_PRFTEN); - } -} - -/** - * @brief Enables or disables the Instruction Cache feature. - * @param NewState: new state of the Instruction Cache. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FLASH_InstructionCacheCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if(NewState != DISABLE) - { - FLASH->ACR |= FLASH_ACR_ICEN; - } - else - { - FLASH->ACR &= (~FLASH_ACR_ICEN); - } -} - -/** - * @brief Enables or disables the Data Cache feature. - * @param NewState: new state of the Data Cache. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FLASH_DataCacheCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if(NewState != DISABLE) - { - FLASH->ACR |= FLASH_ACR_DCEN; - } - else - { - FLASH->ACR &= (~FLASH_ACR_DCEN); - } -} - -/** - * @brief Resets the Instruction Cache. - * @note This function must be used only when the Instruction Cache is disabled. - * @param None - * @retval None - */ -void FLASH_InstructionCacheReset(void) -{ - FLASH->ACR |= FLASH_ACR_ICRST; -} - -/** - * @brief Resets the Data Cache. - * @note This function must be used only when the Data Cache is disabled. - * @param None - * @retval None - */ -void FLASH_DataCacheReset(void) -{ - FLASH->ACR |= FLASH_ACR_DCRST; -} - -/** - * @} - */ - -/** @defgroup FLASH_Group2 FLASH Memory Programming functions - * @brief FLASH Memory Programming functions - * -@verbatim - =============================================================================== - FLASH Memory Programming functions - =============================================================================== - - This group includes the following functions: - - void FLASH_Unlock(void) - - void FLASH_Lock(void) - - FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange) - - FLASH_Status FLASH_EraseAllSectors(uint8_t VoltageRange) - - FLASH_Status FLASH_ProgramDoubleWord(uint32_t Address, uint64_t Data) - - FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) - - FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) - - FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data) - - Any operation of erase or program should follow these steps: - 1. Call the FLASH_Unlock() function to enable the FLASH control register access - - 2. Call the desired function to erase sector(s) or program data - - 3. Call the FLASH_Lock() function to disable the FLASH control register access - (recommended to protect the FLASH memory against possible unwanted operation) - -@endverbatim - * @{ - */ - -/** - * @brief Unlocks the FLASH control register access - * @param None - * @retval None - */ -void FLASH_Unlock(void) -{ - if((FLASH->CR & FLASH_CR_LOCK) != RESET) - { - /* Authorize the FLASH Registers access */ - FLASH->KEYR = FLASH_KEY1; - FLASH->KEYR = FLASH_KEY2; - } -} - -/** - * @brief Locks the FLASH control register access - * @param None - * @retval None - */ -void FLASH_Lock(void) -{ - /* Set the LOCK Bit to lock the FLASH Registers access */ - FLASH->CR |= FLASH_CR_LOCK; -} - -/** - * @brief Erases a specified FLASH Sector. - * - * @param FLASH_Sector: The Sector number to be erased. - * This parameter can be a value between FLASH_Sector_0 and FLASH_Sector_11 - * - * @param VoltageRange: The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg VoltageRange_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg VoltageRange_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg VoltageRange_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg VoltageRange_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM, - * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE. - */ -FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange) -{ - uint32_t tmp_psize = 0x0; - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_FLASH_SECTOR(FLASH_Sector)); - assert_param(IS_VOLTAGERANGE(VoltageRange)); - - if(VoltageRange == VoltageRange_1) - { - tmp_psize = FLASH_PSIZE_BYTE; - } - else if(VoltageRange == VoltageRange_2) - { - tmp_psize = FLASH_PSIZE_HALF_WORD; - } - else if(VoltageRange == VoltageRange_3) - { - tmp_psize = FLASH_PSIZE_WORD; - } - else - { - tmp_psize = FLASH_PSIZE_DOUBLE_WORD; - } - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - if(status == FLASH_COMPLETE) - { - /* if the previous operation is completed, proceed to erase the sector */ - FLASH->CR &= CR_PSIZE_MASK; - FLASH->CR |= tmp_psize; - FLASH->CR &= SECTOR_MASK; - FLASH->CR |= FLASH_CR_SER | FLASH_Sector; - FLASH->CR |= FLASH_CR_STRT; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - /* if the erase operation is completed, disable the SER Bit */ - FLASH->CR &= (~FLASH_CR_SER); - FLASH->CR &= SECTOR_MASK; - } - /* Return the Erase Status */ - return status; -} - -/** - * @brief Erases all FLASH Sectors. - * - * @param VoltageRange: The device voltage range which defines the erase parallelism. - * This parameter can be one of the following values: - * @arg VoltageRange_1: when the device voltage range is 1.8V to 2.1V, - * the operation will be done by byte (8-bit) - * @arg VoltageRange_2: when the device voltage range is 2.1V to 2.7V, - * the operation will be done by half word (16-bit) - * @arg VoltageRange_3: when the device voltage range is 2.7V to 3.6V, - * the operation will be done by word (32-bit) - * @arg VoltageRange_4: when the device voltage range is 2.7V to 3.6V + External Vpp, - * the operation will be done by double word (64-bit) - * - * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM, - * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE. - */ -FLASH_Status FLASH_EraseAllSectors(uint8_t VoltageRange) -{ - uint32_t tmp_psize = 0x0; - FLASH_Status status = FLASH_COMPLETE; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - assert_param(IS_VOLTAGERANGE(VoltageRange)); - - if(VoltageRange == VoltageRange_1) - { - tmp_psize = FLASH_PSIZE_BYTE; - } - else if(VoltageRange == VoltageRange_2) - { - tmp_psize = FLASH_PSIZE_HALF_WORD; - } - else if(VoltageRange == VoltageRange_3) - { - tmp_psize = FLASH_PSIZE_WORD; - } - else - { - tmp_psize = FLASH_PSIZE_DOUBLE_WORD; - } - if(status == FLASH_COMPLETE) - { - /* if the previous operation is completed, proceed to erase all sectors */ - FLASH->CR &= CR_PSIZE_MASK; - FLASH->CR |= tmp_psize; - FLASH->CR |= FLASH_CR_MER; - FLASH->CR |= FLASH_CR_STRT; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - /* if the erase operation is completed, disable the MER Bit */ - FLASH->CR &= (~FLASH_CR_MER); - - } - /* Return the Erase Status */ - return status; -} - -/** - * @brief Programs a double word (64-bit) at a specified address. - * @note This function must be used when the device voltage range is from - * 2.7V to 3.6V and an External Vpp is present. - * @param Address: specifies the address to be programmed. - * @param Data: specifies the data to be programmed. - * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM, - * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE. - */ -FLASH_Status FLASH_ProgramDoubleWord(uint32_t Address, uint64_t Data) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - if(status == FLASH_COMPLETE) - { - /* if the previous operation is completed, proceed to program the new data */ - FLASH->CR &= CR_PSIZE_MASK; - FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint64_t*)Address = Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - /* if the program operation is completed, disable the PG Bit */ - FLASH->CR &= (~FLASH_CR_PG); - } - /* Return the Program Status */ - return status; -} - -/** - * @brief Programs a word (32-bit) at a specified address. - * @param Address: specifies the address to be programmed. - * This parameter can be any address in Program memory zone or in OTP zone. - * @note This function must be used when the device voltage range is from 2.7V to 3.6V. - * @param Data: specifies the data to be programmed. - * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM, - * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE. - */ -FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - if(status == FLASH_COMPLETE) - { - /* if the previous operation is completed, proceed to program the new data */ - FLASH->CR &= CR_PSIZE_MASK; - FLASH->CR |= FLASH_PSIZE_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint32_t*)Address = Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - /* if the program operation is completed, disable the PG Bit */ - FLASH->CR &= (~FLASH_CR_PG); - } - /* Return the Program Status */ - return status; -} - -/** - * @brief Programs a half word (16-bit) at a specified address. - * @note This function must be used when the device voltage range is from 2.1V to 3.6V. - * @param Address: specifies the address to be programmed. - * This parameter can be any address in Program memory zone or in OTP zone. - * @param Data: specifies the data to be programmed. - * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM, - * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE. - */ -FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - if(status == FLASH_COMPLETE) - { - /* if the previous operation is completed, proceed to program the new data */ - FLASH->CR &= CR_PSIZE_MASK; - FLASH->CR |= FLASH_PSIZE_HALF_WORD; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint16_t*)Address = Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - /* if the program operation is completed, disable the PG Bit */ - FLASH->CR &= (~FLASH_CR_PG); - } - /* Return the Program Status */ - return status; -} - -/** - * @brief Programs a byte (8-bit) at a specified address. - * @note This function can be used within all the device supply voltage ranges. - * @param Address: specifies the address to be programmed. - * This parameter can be any address in Program memory zone or in OTP zone. - * @param Data: specifies the data to be programmed. - * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM, - * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE. - */ -FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_FLASH_ADDRESS(Address)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - if(status == FLASH_COMPLETE) - { - /* if the previous operation is completed, proceed to program the new data */ - FLASH->CR &= CR_PSIZE_MASK; - FLASH->CR |= FLASH_PSIZE_BYTE; - FLASH->CR |= FLASH_CR_PG; - - *(__IO uint8_t*)Address = Data; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - /* if the program operation is completed, disable the PG Bit */ - FLASH->CR &= (~FLASH_CR_PG); - } - - /* Return the Program Status */ - return status; -} - -/** - * @} - */ - -/** @defgroup FLASH_Group3 Option Bytes Programming functions - * @brief Option Bytes Programming functions - * -@verbatim - =============================================================================== - Option Bytes Programming functions - =============================================================================== - - This group includes the following functions: - - void FLASH_OB_Unlock(void) - - void FLASH_OB_Lock(void) - - void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState) - - void FLASH_OB_RDPConfig(uint8_t OB_RDP) - - void FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) - - void FLASH_OB_BORConfig(uint8_t OB_BOR) - - FLASH_Status FLASH_ProgramOTP(uint32_t Address, uint32_t Data) - - FLASH_Status FLASH_OB_Launch(void) - - uint32_t FLASH_OB_GetUser(void) - - uint8_t FLASH_OB_GetWRP(void) - - uint8_t FLASH_OB_GetRDP(void) - - uint8_t FLASH_OB_GetBOR(void) - - Any operation of erase or program should follow these steps: - 1. Call the FLASH_OB_Unlock() function to enable the FLASH option control register access - - 2. Call one or several functions to program the desired Option Bytes: - - void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState) => to Enable/Disable - the desired sector write protection - - void FLASH_OB_RDPConfig(uint8_t OB_RDP) => to set the desired read Protection Level - - void FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) => to configure - the user Option Bytes. - - void FLASH_OB_BORConfig(uint8_t OB_BOR) => to set the BOR Level - - 3. Once all needed Option Bytes to be programmed are correctly written, call the - FLASH_OB_Launch() function to launch the Option Bytes programming process. - - @note When changing the IWDG mode from HW to SW or from SW to HW, a system - reset is needed to make the change effective. - - 4. Call the FLASH_OB_Lock() function to disable the FLASH option control register - access (recommended to protect the Option Bytes against possible unwanted operations) - -@endverbatim - * @{ - */ - -/** - * @brief Unlocks the FLASH Option Control Registers access. - * @param None - * @retval None - */ -void FLASH_OB_Unlock(void) -{ - if((FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) != RESET) - { - /* Authorizes the Option Byte register programming */ - FLASH->OPTKEYR = FLASH_OPT_KEY1; - FLASH->OPTKEYR = FLASH_OPT_KEY2; - } -} - -/** - * @brief Locks the FLASH Option Control Registers access. - * @param None - * @retval None - */ -void FLASH_OB_Lock(void) -{ - /* Set the OPTLOCK Bit to lock the FLASH Option Byte Registers access */ - FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK; -} - -/** - * @brief Enables or disables the write protection of the desired sectors - * @param OB_WRP: specifies the sector(s) to be write protected or unprotected. - * This parameter can be one of the following values: - * @arg OB_WRP: A value between OB_WRP_Sector0 and OB_WRP_Sector11 - * @arg OB_WRP_Sector_All - * @param Newstate: new state of the Write Protection. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_OB_WRP(OB_WRP)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - status = FLASH_WaitForLastOperation(); - - if(status == FLASH_COMPLETE) - { - if(NewState != DISABLE) - { - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS &= (~OB_WRP); - } - else - { - *(__IO uint16_t*)OPTCR_BYTE2_ADDRESS |= (uint16_t)OB_WRP; - } - } -} - -/** - * @brief Sets the read protection level. - * @param OB_RDP: specifies the read protection level. - * This parameter can be one of the following values: - * @arg OB_RDP_Level_0: No protection - * @arg OB_RDP_Level_1: Read protection of the memory - * @arg OB_RDP_Level_2: Full chip protection - * - * !!!Warning!!! When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0 - * - * @retval None - */ -void FLASH_OB_RDPConfig(uint8_t OB_RDP) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_OB_RDP(OB_RDP)); - - status = FLASH_WaitForLastOperation(); - - if(status == FLASH_COMPLETE) - { - *(__IO uint8_t*)OPTCR_BYTE1_ADDRESS = OB_RDP; - - } -} - -/** - * @brief Programs the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. - * @param OB_IWDG: Selects the IWDG mode - * This parameter can be one of the following values: - * @arg OB_IWDG_SW: Software IWDG selected - * @arg OB_IWDG_HW: Hardware IWDG selected - * @param OB_STOP: Reset event when entering STOP mode. - * This parameter can be one of the following values: - * @arg OB_STOP_NoRST: No reset generated when entering in STOP - * @arg OB_STOP_RST: Reset generated when entering in STOP - * @param OB_STDBY: Reset event when entering Standby mode. - * This parameter can be one of the following values: - * @arg OB_STDBY_NoRST: No reset generated when entering in STANDBY - * @arg OB_STDBY_RST: Reset generated when entering in STANDBY - * @retval None - */ -void FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY) -{ - uint8_t optiontmp = 0xFF; - FLASH_Status status = FLASH_COMPLETE; - - /* Check the parameters */ - assert_param(IS_OB_IWDG_SOURCE(OB_IWDG)); - assert_param(IS_OB_STOP_SOURCE(OB_STOP)); - assert_param(IS_OB_STDBY_SOURCE(OB_STDBY)); - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - if(status == FLASH_COMPLETE) - { - /* Mask OPTLOCK, OPTSTRT and BOR_LEV bits */ - optiontmp = (uint8_t)((*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0F); - - /* Update User Option Byte */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS = OB_IWDG | (uint8_t)(OB_STDBY | (uint8_t)(OB_STOP | ((uint8_t)optiontmp))); - } -} - -/** - * @brief Sets the BOR Level. - * @param OB_BOR: specifies the Option Bytes BOR Reset Level. - * This parameter can be one of the following values: - * @arg OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V - * @arg OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V - * @arg OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V - * @arg OB_BOR_OFF: Supply voltage ranges from 1.62 to 2.1 V - * @retval None - */ -void FLASH_OB_BORConfig(uint8_t OB_BOR) -{ - /* Check the parameters */ - assert_param(IS_OB_BOR(OB_BOR)); - - /* Set the BOR Level */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS &= (~FLASH_OPTCR_BOR_LEV); - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= OB_BOR; - -} - -/** - * @brief Launch the option byte loading. - * @param None - * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM, - * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE. - */ -FLASH_Status FLASH_OB_Launch(void) -{ - FLASH_Status status = FLASH_COMPLETE; - - /* Set the OPTSTRT bit in OPTCR register */ - *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT; - - /* Wait for last operation to be completed */ - status = FLASH_WaitForLastOperation(); - - return status; -} - -/** - * @brief Returns the FLASH User Option Bytes values. - * @param None - * @retval The FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1) - * and RST_STDBY(Bit2). - */ -uint8_t FLASH_OB_GetUser(void) -{ - /* Return the User Option Byte */ - return (uint8_t)(FLASH->OPTCR >> 5); -} - -/** - * @brief Returns the FLASH Write Protection Option Bytes value. - * @param None - * @retval The FLASH Write Protection Option Bytes value - */ -uint16_t FLASH_OB_GetWRP(void) -{ - /* Return the FLASH write protection Register value */ - return (*(__IO uint16_t *)(OPTCR_BYTE2_ADDRESS)); -} - -/** - * @brief Returns the FLASH Read Protection level. - * @param None - * @retval FLASH ReadOut Protection Status: - * - SET, when OB_RDP_Level_1 or OB_RDP_Level_2 is set - * - RESET, when OB_RDP_Level_0 is set - */ -FlagStatus FLASH_OB_GetRDP(void) -{ - FlagStatus readstatus = RESET; - - if ((*(__IO uint8_t*)(OPTCR_BYTE1_ADDRESS) != (uint8_t)OB_RDP_Level_0)) - { - readstatus = SET; - } - else - { - readstatus = RESET; - } - return readstatus; -} - -/** - * @brief Returns the FLASH BOR level. - * @param None - * @retval The FLASH BOR level: - * - OB_BOR_LEVEL3: Supply voltage ranges from 2.7 to 3.6 V - * - OB_BOR_LEVEL2: Supply voltage ranges from 2.4 to 2.7 V - * - OB_BOR_LEVEL1: Supply voltage ranges from 2.1 to 2.4 V - * - OB_BOR_OFF : Supply voltage ranges from 1.62 to 2.1 V - */ -uint8_t FLASH_OB_GetBOR(void) -{ - /* Return the FLASH BOR level */ - return (uint8_t)(*(__IO uint8_t *)(OPTCR_BYTE0_ADDRESS) & (uint8_t)0x0C); -} - -/** - * @} - */ - -/** @defgroup FLASH_Group4 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified FLASH interrupts. - * @param FLASH_IT: specifies the FLASH interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg FLASH_IT_ERR: FLASH Error Interrupt - * @arg FLASH_IT_EOP: FLASH end of operation Interrupt - * @retval None - */ -void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FLASH_IT(FLASH_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if(NewState != DISABLE) - { - /* Enable the interrupt sources */ - FLASH->CR |= FLASH_IT; - } - else - { - /* Disable the interrupt sources */ - FLASH->CR &= ~(uint32_t)FLASH_IT; - } -} - -/** - * @brief Checks whether the specified FLASH flag is set or not. - * @param FLASH_FLAG: specifies the FLASH flag to check. - * This parameter can be one of the following values: - * @arg FLASH_FLAG_EOP: FLASH End of Operation flag - * @arg FLASH_FLAG_OPERR: FLASH operation Error flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag - * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag - * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @arg FLASH_FLAG_BSY: FLASH Busy flag - * @retval The new state of FLASH_FLAG (SET or RESET). - */ -FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)); - - if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the new state of FLASH_FLAG (SET or RESET) */ - return bitstatus; -} - -/** - * @brief Clears the FLASH's pending flags. - * @param FLASH_FLAG: specifies the FLASH flags to clear. - * This parameter can be any combination of the following values: - * @arg FLASH_FLAG_EOP: FLASH End of Operation flag - * @arg FLASH_FLAG_OPERR: FLASH operation Error flag - * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag - * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag - * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag - * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag - * @retval None - */ -void FLASH_ClearFlag(uint32_t FLASH_FLAG) -{ - /* Check the parameters */ - assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)); - - /* Clear the flags */ - FLASH->SR = FLASH_FLAG; -} - -/** - * @brief Returns the FLASH Status. - * @param None - * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM, - * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE. - */ -FLASH_Status FLASH_GetStatus(void) -{ - FLASH_Status flashstatus = FLASH_COMPLETE; - - if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY) - { - flashstatus = FLASH_BUSY; - } - else - { - if((FLASH->SR & FLASH_FLAG_WRPERR) != (uint32_t)0x00) - { - flashstatus = FLASH_ERROR_WRP; - } - else - { - if((FLASH->SR & (uint32_t)0xEF) != (uint32_t)0x00) - { - flashstatus = FLASH_ERROR_PROGRAM; - } - else - { - if((FLASH->SR & FLASH_FLAG_OPERR) != (uint32_t)0x00) - { - flashstatus = FLASH_ERROR_OPERATION; - } - else - { - flashstatus = FLASH_COMPLETE; - } - } - } - } - /* Return the FLASH Status */ - return flashstatus; -} - -/** - * @brief Waits for a FLASH operation to complete. - * @param None - * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PROGRAM, - * FLASH_ERROR_WRP, FLASH_ERROR_OPERATION or FLASH_COMPLETE. - */ -FLASH_Status FLASH_WaitForLastOperation(void) -{ - __IO FLASH_Status status = FLASH_COMPLETE; - - /* Check for the FLASH Status */ - status = FLASH_GetStatus(); - - /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. - Even if the FLASH operation fails, the BUSY flag will be reset and an error - flag will be set */ - while(status == FLASH_BUSY) - { - status = FLASH_GetStatus(); - } - /* Return the operation status */ - return status; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_flash.h b/car_hw/src/lib/stdperiph/stm32f4xx_flash.h deleted file mode 100644 index d1a7616cba8..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_flash.h +++ /dev/null @@ -1,334 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_flash.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the FLASH - * firmware library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_FLASH_H -#define __STM32F4xx_FLASH_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup FLASH - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** - * @brief FLASH Status - */ -typedef enum -{ - FLASH_BUSY = 1, - FLASH_ERROR_PGS, - FLASH_ERROR_PGP, - FLASH_ERROR_PGA, - FLASH_ERROR_WRP, - FLASH_ERROR_PROGRAM, - FLASH_ERROR_OPERATION, - FLASH_COMPLETE -}FLASH_Status; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup FLASH_Exported_Constants - * @{ - */ - -/** @defgroup Flash_Latency - * @{ - */ -#define FLASH_Latency_0 ((uint8_t)0x0000) /*!< FLASH Zero Latency cycle */ -#define FLASH_Latency_1 ((uint8_t)0x0001) /*!< FLASH One Latency cycle */ -#define FLASH_Latency_2 ((uint8_t)0x0002) /*!< FLASH Two Latency cycles */ -#define FLASH_Latency_3 ((uint8_t)0x0003) /*!< FLASH Three Latency cycles */ -#define FLASH_Latency_4 ((uint8_t)0x0004) /*!< FLASH Four Latency cycles */ -#define FLASH_Latency_5 ((uint8_t)0x0005) /*!< FLASH Five Latency cycles */ -#define FLASH_Latency_6 ((uint8_t)0x0006) /*!< FLASH Six Latency cycles */ -#define FLASH_Latency_7 ((uint8_t)0x0007) /*!< FLASH Seven Latency cycles */ - -#define IS_FLASH_LATENCY(LATENCY) (((LATENCY) == FLASH_Latency_0) || \ - ((LATENCY) == FLASH_Latency_1) || \ - ((LATENCY) == FLASH_Latency_2) || \ - ((LATENCY) == FLASH_Latency_3) || \ - ((LATENCY) == FLASH_Latency_4) || \ - ((LATENCY) == FLASH_Latency_5) || \ - ((LATENCY) == FLASH_Latency_6) || \ - ((LATENCY) == FLASH_Latency_7)) -/** - * @} - */ - -/** @defgroup FLASH_Voltage_Range - * @{ - */ -#define VoltageRange_1 ((uint8_t)0x00) /*!< Device operating range: 1.8V to 2.1V */ -#define VoltageRange_2 ((uint8_t)0x01) /*!= 0x08000000) && ((ADDRESS) < 0x080FFFFF)) ||\ - (((ADDRESS) >= 0x1FFF7800) && ((ADDRESS) < 0x1FFF7A0F))) -/** - * @} - */ - -/** @defgroup Option_Bytes_Write_Protection - * @{ - */ -#define OB_WRP_Sector_0 ((uint32_t)0x00000001) /*!< Write protection of Sector0 */ -#define OB_WRP_Sector_1 ((uint32_t)0x00000002) /*!< Write protection of Sector1 */ -#define OB_WRP_Sector_2 ((uint32_t)0x00000004) /*!< Write protection of Sector2 */ -#define OB_WRP_Sector_3 ((uint32_t)0x00000008) /*!< Write protection of Sector3 */ -#define OB_WRP_Sector_4 ((uint32_t)0x00000010) /*!< Write protection of Sector4 */ -#define OB_WRP_Sector_5 ((uint32_t)0x00000020) /*!< Write protection of Sector5 */ -#define OB_WRP_Sector_6 ((uint32_t)0x00000040) /*!< Write protection of Sector6 */ -#define OB_WRP_Sector_7 ((uint32_t)0x00000080) /*!< Write protection of Sector7 */ -#define OB_WRP_Sector_8 ((uint32_t)0x00000100) /*!< Write protection of Sector8 */ -#define OB_WRP_Sector_9 ((uint32_t)0x00000200) /*!< Write protection of Sector9 */ -#define OB_WRP_Sector_10 ((uint32_t)0x00000400) /*!< Write protection of Sector10 */ -#define OB_WRP_Sector_11 ((uint32_t)0x00000800) /*!< Write protection of Sector11 */ -#define OB_WRP_Sector_All ((uint32_t)0x00000FFF) /*!< Write protection of all Sectors */ - -#define IS_OB_WRP(SECTOR)((((SECTOR) & (uint32_t)0xFFFFF000) == 0x00000000) && ((SECTOR) != 0x00000000)) -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_Read_Protection - * @{ - */ -#define OB_RDP_Level_0 ((uint8_t)0xAA) -#define OB_RDP_Level_1 ((uint8_t)0x55) -/*#define OB_RDP_Level_2 ((uint8_t)0xCC)*/ /*!< Warning: When enabling read protection level 2 - it's no more possible to go back to level 1 or 0 */ -#define IS_OB_RDP(LEVEL) (((LEVEL) == OB_RDP_Level_0)||\ - ((LEVEL) == OB_RDP_Level_1))/*||\ - ((LEVEL) == OB_RDP_Level_2))*/ -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_IWatchdog - * @{ - */ -#define OB_IWDG_SW ((uint8_t)0x20) /*!< Software IWDG selected */ -#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware IWDG selected */ -#define IS_OB_IWDG_SOURCE(SOURCE) (((SOURCE) == OB_IWDG_SW) || ((SOURCE) == OB_IWDG_HW)) -/** - * @} - */ - -/** @defgroup FLASH_Option_Bytes_nRST_STOP - * @{ - */ -#define OB_STOP_NoRST ((uint8_t)0x40) /*!< No reset generated when entering in STOP */ -#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */ -#define IS_OB_STOP_SOURCE(SOURCE) (((SOURCE) == OB_STOP_NoRST) || ((SOURCE) == OB_STOP_RST)) -/** - * @} - */ - - -/** @defgroup FLASH_Option_Bytes_nRST_STDBY - * @{ - */ -#define OB_STDBY_NoRST ((uint8_t)0x80) /*!< No reset generated when entering in STANDBY */ -#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */ -#define IS_OB_STDBY_SOURCE(SOURCE) (((SOURCE) == OB_STDBY_NoRST) || ((SOURCE) == OB_STDBY_RST)) -/** - * @} - */ - -/** @defgroup FLASH_BOR_Reset_Level - * @{ - */ -#define OB_BOR_LEVEL3 ((uint8_t)0x00) /*!< Supply voltage ranges from 2.70 to 3.60 V */ -#define OB_BOR_LEVEL2 ((uint8_t)0x04) /*!< Supply voltage ranges from 2.40 to 2.70 V */ -#define OB_BOR_LEVEL1 ((uint8_t)0x08) /*!< Supply voltage ranges from 2.10 to 2.40 V */ -#define OB_BOR_OFF ((uint8_t)0x0C) /*!< Supply voltage ranges from 1.62 to 2.10 V */ -#define IS_OB_BOR(LEVEL) (((LEVEL) == OB_BOR_LEVEL1) || ((LEVEL) == OB_BOR_LEVEL2) ||\ - ((LEVEL) == OB_BOR_LEVEL3) || ((LEVEL) == OB_BOR_OFF)) -/** - * @} - */ - -/** @defgroup FLASH_Interrupts - * @{ - */ -#define FLASH_IT_EOP ((uint32_t)0x01000000) /*!< End of FLASH Operation Interrupt source */ -#define FLASH_IT_ERR ((uint32_t)0x02000000) /*!< Error Interrupt source */ -#define IS_FLASH_IT(IT) ((((IT) & (uint32_t)0xFCFFFFFF) == 0x00000000) && ((IT) != 0x00000000)) -/** - * @} - */ - -/** @defgroup FLASH_Flags - * @{ - */ -#define FLASH_FLAG_EOP ((uint32_t)0x00000001) /*!< FLASH End of Operation flag */ -#define FLASH_FLAG_OPERR ((uint32_t)0x00000002) /*!< FLASH operation Error flag */ -#define FLASH_FLAG_WRPERR ((uint32_t)0x00000010) /*!< FLASH Write protected error flag */ -#define FLASH_FLAG_PGAERR ((uint32_t)0x00000020) /*!< FLASH Programming Alignment error flag */ -#define FLASH_FLAG_PGPERR ((uint32_t)0x00000040) /*!< FLASH Programming Parallelism error flag */ -#define FLASH_FLAG_PGSERR ((uint32_t)0x00000080) /*!< FLASH Programming Sequence error flag */ -#define FLASH_FLAG_BSY ((uint32_t)0x00010000) /*!< FLASH Busy flag */ -#define IS_FLASH_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFF0C) == 0x00000000) && ((FLAG) != 0x00000000)) -#define IS_FLASH_GET_FLAG(FLAG) (((FLAG) == FLASH_FLAG_EOP) || ((FLAG) == FLASH_FLAG_OPERR) || \ - ((FLAG) == FLASH_FLAG_WRPERR) || ((FLAG) == FLASH_FLAG_PGAERR) || \ - ((FLAG) == FLASH_FLAG_PGPERR) || ((FLAG) == FLASH_FLAG_PGSERR) || \ - ((FLAG) == FLASH_FLAG_BSY)) -/** - * @} - */ - -/** @defgroup FLASH_Program_Parallelism - * @{ - */ -#define FLASH_PSIZE_BYTE ((uint32_t)0x00000000) -#define FLASH_PSIZE_HALF_WORD ((uint32_t)0x00000100) -#define FLASH_PSIZE_WORD ((uint32_t)0x00000200) -#define FLASH_PSIZE_DOUBLE_WORD ((uint32_t)0x00000300) -#define CR_PSIZE_MASK ((uint32_t)0xFFFFFCFF) -/** - * @} - */ - -/** @defgroup FLASH_Keys - * @{ - */ -#define RDP_KEY ((uint16_t)0x00A5) -#define FLASH_KEY1 ((uint32_t)0x45670123) -#define FLASH_KEY2 ((uint32_t)0xCDEF89AB) -#define FLASH_OPT_KEY1 ((uint32_t)0x08192A3B) -#define FLASH_OPT_KEY2 ((uint32_t)0x4C5D6E7F) -/** - * @} - */ - -/** - * @brief ACR register byte 0 (Bits[8:0]) base address - */ -#define ACR_BYTE0_ADDRESS ((uint32_t)0x40023C00) -/** - * @brief OPTCR register byte 3 (Bits[24:16]) base address - */ -#define OPTCR_BYTE0_ADDRESS ((uint32_t)0x40023C14) -#define OPTCR_BYTE1_ADDRESS ((uint32_t)0x40023C15) -#define OPTCR_BYTE2_ADDRESS ((uint32_t)0x40023C16) - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* FLASH Interface configuration functions ************************************/ -void FLASH_SetLatency(uint32_t FLASH_Latency); -void FLASH_PrefetchBufferCmd(FunctionalState NewState); -void FLASH_InstructionCacheCmd(FunctionalState NewState); -void FLASH_DataCacheCmd(FunctionalState NewState); -void FLASH_InstructionCacheReset(void); -void FLASH_DataCacheReset(void); - -/* FLASH Memory Programming functions *****************************************/ -void FLASH_Unlock(void); -void FLASH_Lock(void); -FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange); -FLASH_Status FLASH_EraseAllSectors(uint8_t VoltageRange); -FLASH_Status FLASH_ProgramDoubleWord(uint32_t Address, uint64_t Data); -FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data); -FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); -FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data); - -/* Option Bytes Programming functions *****************************************/ -void FLASH_OB_Unlock(void); -void FLASH_OB_Lock(void); -void FLASH_OB_WRPConfig(uint32_t OB_WRP, FunctionalState NewState); -void FLASH_OB_RDPConfig(uint8_t OB_RDP); -void FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY); -void FLASH_OB_BORConfig(uint8_t OB_BOR); -FLASH_Status FLASH_OB_Launch(void); -uint8_t FLASH_OB_GetUser(void); -uint16_t FLASH_OB_GetWRP(void); -FlagStatus FLASH_OB_GetRDP(void); -uint8_t FLASH_OB_GetBOR(void); - -/* Interrupts and flags management functions **********************************/ -void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState); -FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG); -void FLASH_ClearFlag(uint32_t FLASH_FLAG); -FLASH_Status FLASH_GetStatus(void); -FLASH_Status FLASH_WaitForLastOperation(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_FLASH_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_fsmc.c b/car_hw/src/lib/stdperiph/stm32f4xx_fsmc.c deleted file mode 100644 index ae423f97dfc..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_fsmc.c +++ /dev/null @@ -1,983 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_fsmc.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the FSMC peripheral: - * - Interface with SRAM, PSRAM, NOR and OneNAND memories - * - Interface with NAND memories - * - Interface with 16-bit PC Card compatible memories - * - Interrupts and flags management - * - ****************************************************************************** - - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_fsmc.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup FSMC - * @brief FSMC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* --------------------- FSMC registers bit mask ---------------------------- */ -/* FSMC BCRx Mask */ -#define BCR_MBKEN_SET ((uint32_t)0x00000001) -#define BCR_MBKEN_RESET ((uint32_t)0x000FFFFE) -#define BCR_FACCEN_SET ((uint32_t)0x00000040) - -/* FSMC PCRx Mask */ -#define PCR_PBKEN_SET ((uint32_t)0x00000004) -#define PCR_PBKEN_RESET ((uint32_t)0x000FFFFB) -#define PCR_ECCEN_SET ((uint32_t)0x00000040) -#define PCR_ECCEN_RESET ((uint32_t)0x000FFFBF) -#define PCR_MEMORYTYPE_NAND ((uint32_t)0x00000008) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup FSMC_Private_Functions - * @{ - */ - -/** @defgroup FSMC_Group1 NOR/SRAM Controller functions - * @brief NOR/SRAM Controller functions - * -@verbatim - =============================================================================== - NOR/SRAM Controller functions - =============================================================================== - - The following sequence should be followed to configure the FSMC to interface with - SRAM, PSRAM, NOR or OneNAND memory connected to the NOR/SRAM Bank: - - 1. Enable the clock for the FSMC and associated GPIOs using the following functions: - RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); - - 2. FSMC pins configuration - - Connect the involved FSMC pins to AF12 using the following function - GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_FSMC); - - Configure these FSMC pins in alternate function mode by calling the function - GPIO_Init(); - - 3. Declare a FSMC_NORSRAMInitTypeDef structure, for example: - FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; - and fill the FSMC_NORSRAMInitStructure variable with the allowed values of - the structure member. - - 4. Initialize the NOR/SRAM Controller by calling the function - FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); - - 5. Then enable the NOR/SRAM Bank, for example: - FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE); - - 6. At this stage you can read/write from/to the memory connected to the NOR/SRAM Bank. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the FSMC NOR/SRAM Banks registers to their default - * reset values. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 - * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 - * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 - * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 - * @retval None - */ -void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank) -{ - /* Check the parameter */ - assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); - - /* FSMC_Bank1_NORSRAM1 */ - if(FSMC_Bank == FSMC_Bank1_NORSRAM1) - { - FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030DB; - } - /* FSMC_Bank1_NORSRAM2, FSMC_Bank1_NORSRAM3 or FSMC_Bank1_NORSRAM4 */ - else - { - FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030D2; - } - FSMC_Bank1->BTCR[FSMC_Bank + 1] = 0x0FFFFFFF; - FSMC_Bank1E->BWTR[FSMC_Bank] = 0x0FFFFFFF; -} - -/** - * @brief Initializes the FSMC NOR/SRAM Banks according to the specified - * parameters in the FSMC_NORSRAMInitStruct. - * @param FSMC_NORSRAMInitStruct : pointer to a FSMC_NORSRAMInitTypeDef structure - * that contains the configuration information for the FSMC NOR/SRAM - * specified Banks. - * @retval None - */ -void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) -{ - /* Check the parameters */ - assert_param(IS_FSMC_NORSRAM_BANK(FSMC_NORSRAMInitStruct->FSMC_Bank)); - assert_param(IS_FSMC_MUX(FSMC_NORSRAMInitStruct->FSMC_DataAddressMux)); - assert_param(IS_FSMC_MEMORY(FSMC_NORSRAMInitStruct->FSMC_MemoryType)); - assert_param(IS_FSMC_MEMORY_WIDTH(FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth)); - assert_param(IS_FSMC_BURSTMODE(FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode)); - assert_param(IS_FSMC_ASYNWAIT(FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait)); - assert_param(IS_FSMC_WAIT_POLARITY(FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity)); - assert_param(IS_FSMC_WRAP_MODE(FSMC_NORSRAMInitStruct->FSMC_WrapMode)); - assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive)); - assert_param(IS_FSMC_WRITE_OPERATION(FSMC_NORSRAMInitStruct->FSMC_WriteOperation)); - assert_param(IS_FSMC_WAITE_SIGNAL(FSMC_NORSRAMInitStruct->FSMC_WaitSignal)); - assert_param(IS_FSMC_EXTENDED_MODE(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode)); - assert_param(IS_FSMC_WRITE_BURST(FSMC_NORSRAMInitStruct->FSMC_WriteBurst)); - assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime)); - assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime)); - assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime)); - assert_param(IS_FSMC_TURNAROUND_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration)); - assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision)); - assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency)); - assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode)); - - /* Bank1 NOR/SRAM control register configuration */ - FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] = - (uint32_t)FSMC_NORSRAMInitStruct->FSMC_DataAddressMux | - FSMC_NORSRAMInitStruct->FSMC_MemoryType | - FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth | - FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode | - FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait | - FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity | - FSMC_NORSRAMInitStruct->FSMC_WrapMode | - FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive | - FSMC_NORSRAMInitStruct->FSMC_WriteOperation | - FSMC_NORSRAMInitStruct->FSMC_WaitSignal | - FSMC_NORSRAMInitStruct->FSMC_ExtendedMode | - FSMC_NORSRAMInitStruct->FSMC_WriteBurst; - if(FSMC_NORSRAMInitStruct->FSMC_MemoryType == FSMC_MemoryType_NOR) - { - FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] |= (uint32_t)BCR_FACCEN_SET; - } - /* Bank1 NOR/SRAM timing register configuration */ - FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1] = - (uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime | - (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) | - (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) | - (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) | - (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) | - (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) | - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode; - - - /* Bank1 NOR/SRAM timing register for write configuration, if extended mode is used */ - if(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode == FSMC_ExtendedMode_Enable) - { - assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime)); - assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime)); - assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime)); - assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision)); - assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency)); - assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode)); - FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = - (uint32_t)FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime | - (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime << 4 )| - (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime << 8) | - (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision << 20) | - (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency << 24) | - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode; - } - else - { - FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = 0x0FFFFFFF; - } -} - -/** - * @brief Fills each FSMC_NORSRAMInitStruct member with its default value. - * @param FSMC_NORSRAMInitStruct: pointer to a FSMC_NORSRAMInitTypeDef structure - * which will be initialized. - * @retval None - */ -void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) -{ - /* Reset NOR/SRAM Init structure parameters values */ - FSMC_NORSRAMInitStruct->FSMC_Bank = FSMC_Bank1_NORSRAM1; - FSMC_NORSRAMInitStruct->FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; - FSMC_NORSRAMInitStruct->FSMC_MemoryType = FSMC_MemoryType_SRAM; - FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; - FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; - FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; - FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; - FSMC_NORSRAMInitStruct->FSMC_WrapMode = FSMC_WrapMode_Disable; - FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; - FSMC_NORSRAMInitStruct->FSMC_WriteOperation = FSMC_WriteOperation_Enable; - FSMC_NORSRAMInitStruct->FSMC_WaitSignal = FSMC_WaitSignal_Enable; - FSMC_NORSRAMInitStruct->FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; - FSMC_NORSRAMInitStruct->FSMC_WriteBurst = FSMC_WriteBurst_Disable; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime = 0xF; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime = 0xF; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime = 0xFF; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision = 0xF; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency = 0xF; - FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime = 0xF; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime = 0xF; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime = 0xFF; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_CLKDivision = 0xF; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataLatency = 0xF; - FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; -} - -/** - * @brief Enables or disables the specified NOR/SRAM Memory Bank. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 - * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 - * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 - * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 - * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState) -{ - assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected NOR/SRAM Bank by setting the PBKEN bit in the BCRx register */ - FSMC_Bank1->BTCR[FSMC_Bank] |= BCR_MBKEN_SET; - } - else - { - /* Disable the selected NOR/SRAM Bank by clearing the PBKEN bit in the BCRx register */ - FSMC_Bank1->BTCR[FSMC_Bank] &= BCR_MBKEN_RESET; - } -} -/** - * @} - */ - -/** @defgroup FSMC_Group2 NAND Controller functions - * @brief NAND Controller functions - * -@verbatim - =============================================================================== - NAND Controller functions - =============================================================================== - - The following sequence should be followed to configure the FSMC to interface with - 8-bit or 16-bit NAND memory connected to the NAND Bank: - - 1. Enable the clock for the FSMC and associated GPIOs using the following functions: - RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); - - 2. FSMC pins configuration - - Connect the involved FSMC pins to AF12 using the following function - GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_FSMC); - - Configure these FSMC pins in alternate function mode by calling the function - GPIO_Init(); - - 3. Declare a FSMC_NANDInitTypeDef structure, for example: - FSMC_NANDInitTypeDef FSMC_NANDInitStructure; - and fill the FSMC_NANDInitStructure variable with the allowed values of - the structure member. - - 4. Initialize the NAND Controller by calling the function - FSMC_NANDInit(&FSMC_NANDInitStructure); - - 5. Then enable the NAND Bank, for example: - FSMC_NANDCmd(FSMC_Bank3_NAND, ENABLE); - - 6. At this stage you can read/write from/to the memory connected to the NAND Bank. - -@note To enable the Error Correction Code (ECC), you have to use the function - FSMC_NANDECCCmd(FSMC_Bank3_NAND, ENABLE); - and to get the current ECC value you have to use the function - ECCval = FSMC_GetECC(FSMC_Bank3_NAND); - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the FSMC NAND Banks registers to their default reset values. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @retval None - */ -void FSMC_NANDDeInit(uint32_t FSMC_Bank) -{ - /* Check the parameter */ - assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); - - if(FSMC_Bank == FSMC_Bank2_NAND) - { - /* Set the FSMC_Bank2 registers to their reset values */ - FSMC_Bank2->PCR2 = 0x00000018; - FSMC_Bank2->SR2 = 0x00000040; - FSMC_Bank2->PMEM2 = 0xFCFCFCFC; - FSMC_Bank2->PATT2 = 0xFCFCFCFC; - } - /* FSMC_Bank3_NAND */ - else - { - /* Set the FSMC_Bank3 registers to their reset values */ - FSMC_Bank3->PCR3 = 0x00000018; - FSMC_Bank3->SR3 = 0x00000040; - FSMC_Bank3->PMEM3 = 0xFCFCFCFC; - FSMC_Bank3->PATT3 = 0xFCFCFCFC; - } -} - -/** - * @brief Initializes the FSMC NAND Banks according to the specified parameters - * in the FSMC_NANDInitStruct. - * @param FSMC_NANDInitStruct : pointer to a FSMC_NANDInitTypeDef structure that - * contains the configuration information for the FSMC NAND specified Banks. - * @retval None - */ -void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) -{ - uint32_t tmppcr = 0x00000000, tmppmem = 0x00000000, tmppatt = 0x00000000; - - /* Check the parameters */ - assert_param( IS_FSMC_NAND_BANK(FSMC_NANDInitStruct->FSMC_Bank)); - assert_param( IS_FSMC_WAIT_FEATURE(FSMC_NANDInitStruct->FSMC_Waitfeature)); - assert_param( IS_FSMC_MEMORY_WIDTH(FSMC_NANDInitStruct->FSMC_MemoryDataWidth)); - assert_param( IS_FSMC_ECC_STATE(FSMC_NANDInitStruct->FSMC_ECC)); - assert_param( IS_FSMC_ECCPAGE_SIZE(FSMC_NANDInitStruct->FSMC_ECCPageSize)); - assert_param( IS_FSMC_TCLR_TIME(FSMC_NANDInitStruct->FSMC_TCLRSetupTime)); - assert_param( IS_FSMC_TAR_TIME(FSMC_NANDInitStruct->FSMC_TARSetupTime)); - assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); - assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); - - /* Set the tmppcr value according to FSMC_NANDInitStruct parameters */ - tmppcr = (uint32_t)FSMC_NANDInitStruct->FSMC_Waitfeature | - PCR_MEMORYTYPE_NAND | - FSMC_NANDInitStruct->FSMC_MemoryDataWidth | - FSMC_NANDInitStruct->FSMC_ECC | - FSMC_NANDInitStruct->FSMC_ECCPageSize | - (FSMC_NANDInitStruct->FSMC_TCLRSetupTime << 9 )| - (FSMC_NANDInitStruct->FSMC_TARSetupTime << 13); - - /* Set tmppmem value according to FSMC_CommonSpaceTimingStructure parameters */ - tmppmem = (uint32_t)FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | - (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | - (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| - (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); - - /* Set tmppatt value according to FSMC_AttributeSpaceTimingStructure parameters */ - tmppatt = (uint32_t)FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | - (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | - (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| - (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); - - if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) - { - /* FSMC_Bank2_NAND registers configuration */ - FSMC_Bank2->PCR2 = tmppcr; - FSMC_Bank2->PMEM2 = tmppmem; - FSMC_Bank2->PATT2 = tmppatt; - } - else - { - /* FSMC_Bank3_NAND registers configuration */ - FSMC_Bank3->PCR3 = tmppcr; - FSMC_Bank3->PMEM3 = tmppmem; - FSMC_Bank3->PATT3 = tmppatt; - } -} - - -/** - * @brief Fills each FSMC_NANDInitStruct member with its default value. - * @param FSMC_NANDInitStruct: pointer to a FSMC_NANDInitTypeDef structure which - * will be initialized. - * @retval None - */ -void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) -{ - /* Reset NAND Init structure parameters values */ - FSMC_NANDInitStruct->FSMC_Bank = FSMC_Bank2_NAND; - FSMC_NANDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; - FSMC_NANDInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; - FSMC_NANDInitStruct->FSMC_ECC = FSMC_ECC_Disable; - FSMC_NANDInitStruct->FSMC_ECCPageSize = FSMC_ECCPageSize_256Bytes; - FSMC_NANDInitStruct->FSMC_TCLRSetupTime = 0x0; - FSMC_NANDInitStruct->FSMC_TARSetupTime = 0x0; - FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; - FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; -} - -/** - * @brief Enables or disables the specified NAND Memory Bank. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState) -{ - assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected NAND Bank by setting the PBKEN bit in the PCRx register */ - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->PCR2 |= PCR_PBKEN_SET; - } - else - { - FSMC_Bank3->PCR3 |= PCR_PBKEN_SET; - } - } - else - { - /* Disable the selected NAND Bank by clearing the PBKEN bit in the PCRx register */ - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->PCR2 &= PCR_PBKEN_RESET; - } - else - { - FSMC_Bank3->PCR3 &= PCR_PBKEN_RESET; - } - } -} -/** - * @brief Enables or disables the FSMC NAND ECC feature. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @param NewState: new state of the FSMC NAND ECC feature. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState) -{ - assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected NAND Bank ECC function by setting the ECCEN bit in the PCRx register */ - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->PCR2 |= PCR_ECCEN_SET; - } - else - { - FSMC_Bank3->PCR3 |= PCR_ECCEN_SET; - } - } - else - { - /* Disable the selected NAND Bank ECC function by clearing the ECCEN bit in the PCRx register */ - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->PCR2 &= PCR_ECCEN_RESET; - } - else - { - FSMC_Bank3->PCR3 &= PCR_ECCEN_RESET; - } - } -} - -/** - * @brief Returns the error correction code register value. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @retval The Error Correction Code (ECC) value. - */ -uint32_t FSMC_GetECC(uint32_t FSMC_Bank) -{ - uint32_t eccval = 0x00000000; - - if(FSMC_Bank == FSMC_Bank2_NAND) - { - /* Get the ECCR2 register value */ - eccval = FSMC_Bank2->ECCR2; - } - else - { - /* Get the ECCR3 register value */ - eccval = FSMC_Bank3->ECCR3; - } - /* Return the error correction code value */ - return(eccval); -} -/** - * @} - */ - -/** @defgroup FSMC_Group3 PCCARD Controller functions - * @brief PCCARD Controller functions - * -@verbatim - =============================================================================== - PCCARD Controller functions - =============================================================================== - - The following sequence should be followed to configure the FSMC to interface with - 16-bit PC Card compatible memory connected to the PCCARD Bank: - - 1. Enable the clock for the FSMC and associated GPIOs using the following functions: - RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); - - 2. FSMC pins configuration - - Connect the involved FSMC pins to AF12 using the following function - GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_FSMC); - - Configure these FSMC pins in alternate function mode by calling the function - GPIO_Init(); - - 3. Declare a FSMC_PCCARDInitTypeDef structure, for example: - FSMC_PCCARDInitTypeDef FSMC_PCCARDInitStructure; - and fill the FSMC_PCCARDInitStructure variable with the allowed values of - the structure member. - - 4. Initialize the PCCARD Controller by calling the function - FSMC_PCCARDInit(&FSMC_PCCARDInitStructure); - - 5. Then enable the PCCARD Bank: - FSMC_PCCARDCmd(ENABLE); - - 6. At this stage you can read/write from/to the memory connected to the PCCARD Bank. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the FSMC PCCARD Bank registers to their default reset values. - * @param None - * @retval None - */ -void FSMC_PCCARDDeInit(void) -{ - /* Set the FSMC_Bank4 registers to their reset values */ - FSMC_Bank4->PCR4 = 0x00000018; - FSMC_Bank4->SR4 = 0x00000000; - FSMC_Bank4->PMEM4 = 0xFCFCFCFC; - FSMC_Bank4->PATT4 = 0xFCFCFCFC; - FSMC_Bank4->PIO4 = 0xFCFCFCFC; -} - -/** - * @brief Initializes the FSMC PCCARD Bank according to the specified parameters - * in the FSMC_PCCARDInitStruct. - * @param FSMC_PCCARDInitStruct : pointer to a FSMC_PCCARDInitTypeDef structure - * that contains the configuration information for the FSMC PCCARD Bank. - * @retval None - */ -void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) -{ - /* Check the parameters */ - assert_param(IS_FSMC_WAIT_FEATURE(FSMC_PCCARDInitStruct->FSMC_Waitfeature)); - assert_param(IS_FSMC_TCLR_TIME(FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime)); - assert_param(IS_FSMC_TAR_TIME(FSMC_PCCARDInitStruct->FSMC_TARSetupTime)); - - assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); - - assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); - assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime)); - - /* Set the PCR4 register value according to FSMC_PCCARDInitStruct parameters */ - FSMC_Bank4->PCR4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_Waitfeature | - FSMC_MemoryDataWidth_16b | - (FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime << 9) | - (FSMC_PCCARDInitStruct->FSMC_TARSetupTime << 13); - - /* Set PMEM4 register value according to FSMC_CommonSpaceTimingStructure parameters */ - FSMC_Bank4->PMEM4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | - (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | - (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| - (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); - - /* Set PATT4 register value according to FSMC_AttributeSpaceTimingStructure parameters */ - FSMC_Bank4->PATT4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | - (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | - (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| - (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); - - /* Set PIO4 register value according to FSMC_IOSpaceTimingStructure parameters */ - FSMC_Bank4->PIO4 = (uint32_t)FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime | - (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime << 8) | - (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime << 16)| - (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime << 24); -} - -/** - * @brief Fills each FSMC_PCCARDInitStruct member with its default value. - * @param FSMC_PCCARDInitStruct: pointer to a FSMC_PCCARDInitTypeDef structure - * which will be initialized. - * @retval None - */ -void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) -{ - /* Reset PCCARD Init structure parameters values */ - FSMC_PCCARDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; - FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime = 0x0; - FSMC_PCCARDInitStruct->FSMC_TARSetupTime = 0x0; - FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; - FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; -} - -/** - * @brief Enables or disables the PCCARD Memory Bank. - * @param NewState: new state of the PCCARD Memory Bank. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FSMC_PCCARDCmd(FunctionalState NewState) -{ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the PCCARD Bank by setting the PBKEN bit in the PCR4 register */ - FSMC_Bank4->PCR4 |= PCR_PBKEN_SET; - } - else - { - /* Disable the PCCARD Bank by clearing the PBKEN bit in the PCR4 register */ - FSMC_Bank4->PCR4 &= PCR_PBKEN_RESET; - } -} -/** - * @} - */ - -/** @defgroup FSMC_Group4 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified FSMC interrupts. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD - * @param FSMC_IT: specifies the FSMC interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. - * @arg FSMC_IT_Level: Level edge detection interrupt. - * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. - * @param NewState: new state of the specified FSMC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState) -{ - assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); - assert_param(IS_FSMC_IT(FSMC_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected FSMC_Bank2 interrupts */ - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->SR2 |= FSMC_IT; - } - /* Enable the selected FSMC_Bank3 interrupts */ - else if (FSMC_Bank == FSMC_Bank3_NAND) - { - FSMC_Bank3->SR3 |= FSMC_IT; - } - /* Enable the selected FSMC_Bank4 interrupts */ - else - { - FSMC_Bank4->SR4 |= FSMC_IT; - } - } - else - { - /* Disable the selected FSMC_Bank2 interrupts */ - if(FSMC_Bank == FSMC_Bank2_NAND) - { - - FSMC_Bank2->SR2 &= (uint32_t)~FSMC_IT; - } - /* Disable the selected FSMC_Bank3 interrupts */ - else if (FSMC_Bank == FSMC_Bank3_NAND) - { - FSMC_Bank3->SR3 &= (uint32_t)~FSMC_IT; - } - /* Disable the selected FSMC_Bank4 interrupts */ - else - { - FSMC_Bank4->SR4 &= (uint32_t)~FSMC_IT; - } - } -} - -/** - * @brief Checks whether the specified FSMC flag is set or not. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD - * @param FSMC_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg FSMC_FLAG_RisingEdge: Rising edge detection Flag. - * @arg FSMC_FLAG_Level: Level detection Flag. - * @arg FSMC_FLAG_FallingEdge: Falling edge detection Flag. - * @arg FSMC_FLAG_FEMPT: Fifo empty Flag. - * @retval The new state of FSMC_FLAG (SET or RESET). - */ -FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) -{ - FlagStatus bitstatus = RESET; - uint32_t tmpsr = 0x00000000; - - /* Check the parameters */ - assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); - assert_param(IS_FSMC_GET_FLAG(FSMC_FLAG)); - - if(FSMC_Bank == FSMC_Bank2_NAND) - { - tmpsr = FSMC_Bank2->SR2; - } - else if(FSMC_Bank == FSMC_Bank3_NAND) - { - tmpsr = FSMC_Bank3->SR3; - } - /* FSMC_Bank4_PCCARD*/ - else - { - tmpsr = FSMC_Bank4->SR4; - } - - /* Get the flag status */ - if ((tmpsr & FSMC_FLAG) != (uint16_t)RESET ) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the flag status */ - return bitstatus; -} - -/** - * @brief Clears the FSMC's pending flags. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD - * @param FSMC_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg FSMC_FLAG_RisingEdge: Rising edge detection Flag. - * @arg FSMC_FLAG_Level: Level detection Flag. - * @arg FSMC_FLAG_FallingEdge: Falling edge detection Flag. - * @retval None - */ -void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) -{ - /* Check the parameters */ - assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); - assert_param(IS_FSMC_CLEAR_FLAG(FSMC_FLAG)) ; - - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->SR2 &= ~FSMC_FLAG; - } - else if(FSMC_Bank == FSMC_Bank3_NAND) - { - FSMC_Bank3->SR3 &= ~FSMC_FLAG; - } - /* FSMC_Bank4_PCCARD*/ - else - { - FSMC_Bank4->SR4 &= ~FSMC_FLAG; - } -} - -/** - * @brief Checks whether the specified FSMC interrupt has occurred or not. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD - * @param FSMC_IT: specifies the FSMC interrupt source to check. - * This parameter can be one of the following values: - * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. - * @arg FSMC_IT_Level: Level edge detection interrupt. - * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. - * @retval The new state of FSMC_IT (SET or RESET). - */ -ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT) -{ - ITStatus bitstatus = RESET; - uint32_t tmpsr = 0x0, itstatus = 0x0, itenable = 0x0; - - /* Check the parameters */ - assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); - assert_param(IS_FSMC_GET_IT(FSMC_IT)); - - if(FSMC_Bank == FSMC_Bank2_NAND) - { - tmpsr = FSMC_Bank2->SR2; - } - else if(FSMC_Bank == FSMC_Bank3_NAND) - { - tmpsr = FSMC_Bank3->SR3; - } - /* FSMC_Bank4_PCCARD*/ - else - { - tmpsr = FSMC_Bank4->SR4; - } - - itstatus = tmpsr & FSMC_IT; - - itenable = tmpsr & (FSMC_IT >> 3); - if ((itstatus != (uint32_t)RESET) && (itenable != (uint32_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the FSMC's interrupt pending bits. - * @param FSMC_Bank: specifies the FSMC Bank to be used - * This parameter can be one of the following values: - * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND - * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND - * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD - * @param FSMC_IT: specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. - * @arg FSMC_IT_Level: Level edge detection interrupt. - * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. - * @retval None - */ -void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT) -{ - /* Check the parameters */ - assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); - assert_param(IS_FSMC_IT(FSMC_IT)); - - if(FSMC_Bank == FSMC_Bank2_NAND) - { - FSMC_Bank2->SR2 &= ~(FSMC_IT >> 3); - } - else if(FSMC_Bank == FSMC_Bank3_NAND) - { - FSMC_Bank3->SR3 &= ~(FSMC_IT >> 3); - } - /* FSMC_Bank4_PCCARD*/ - else - { - FSMC_Bank4->SR4 &= ~(FSMC_IT >> 3); - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_fsmc.h b/car_hw/src/lib/stdperiph/stm32f4xx_fsmc.h deleted file mode 100644 index 2411943e141..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_fsmc.h +++ /dev/null @@ -1,669 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_fsmc.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the FSMC firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_FSMC_H -#define __STM32F4xx_FSMC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup FSMC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief Timing parameters For NOR/SRAM Banks - */ -typedef struct -{ - uint32_t FSMC_AddressSetupTime; /*!< Defines the number of HCLK cycles to configure - the duration of the address setup time. - This parameter can be a value between 0 and 0xF. - @note This parameter is not used with synchronous NOR Flash memories. */ - - uint32_t FSMC_AddressHoldTime; /*!< Defines the number of HCLK cycles to configure - the duration of the address hold time. - This parameter can be a value between 0 and 0xF. - @note This parameter is not used with synchronous NOR Flash memories.*/ - - uint32_t FSMC_DataSetupTime; /*!< Defines the number of HCLK cycles to configure - the duration of the data setup time. - This parameter can be a value between 0 and 0xFF. - @note This parameter is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */ - - uint32_t FSMC_BusTurnAroundDuration; /*!< Defines the number of HCLK cycles to configure - the duration of the bus turnaround. - This parameter can be a value between 0 and 0xF. - @note This parameter is only used for multiplexed NOR Flash memories. */ - - uint32_t FSMC_CLKDivision; /*!< Defines the period of CLK clock output signal, expressed in number of HCLK cycles. - This parameter can be a value between 1 and 0xF. - @note This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses. */ - - uint32_t FSMC_DataLatency; /*!< Defines the number of memory clock cycles to issue - to the memory before getting the first data. - The parameter value depends on the memory type as shown below: - - It must be set to 0 in case of a CRAM - - It is don't care in asynchronous NOR, SRAM or ROM accesses - - It may assume a value between 0 and 0xF in NOR Flash memories - with synchronous burst mode enable */ - - uint32_t FSMC_AccessMode; /*!< Specifies the asynchronous access mode. - This parameter can be a value of @ref FSMC_Access_Mode */ -}FSMC_NORSRAMTimingInitTypeDef; - -/** - * @brief FSMC NOR/SRAM Init structure definition - */ -typedef struct -{ - uint32_t FSMC_Bank; /*!< Specifies the NOR/SRAM memory bank that will be used. - This parameter can be a value of @ref FSMC_NORSRAM_Bank */ - - uint32_t FSMC_DataAddressMux; /*!< Specifies whether the address and data values are - multiplexed on the databus or not. - This parameter can be a value of @ref FSMC_Data_Address_Bus_Multiplexing */ - - uint32_t FSMC_MemoryType; /*!< Specifies the type of external memory attached to - the corresponding memory bank. - This parameter can be a value of @ref FSMC_Memory_Type */ - - uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. - This parameter can be a value of @ref FSMC_Data_Width */ - - uint32_t FSMC_BurstAccessMode; /*!< Enables or disables the burst access mode for Flash memory, - valid only with synchronous burst Flash memories. - This parameter can be a value of @ref FSMC_Burst_Access_Mode */ - - uint32_t FSMC_AsynchronousWait; /*!< Enables or disables wait signal during asynchronous transfers, - valid only with asynchronous Flash memories. - This parameter can be a value of @ref FSMC_AsynchronousWait */ - - uint32_t FSMC_WaitSignalPolarity; /*!< Specifies the wait signal polarity, valid only when accessing - the Flash memory in burst mode. - This parameter can be a value of @ref FSMC_Wait_Signal_Polarity */ - - uint32_t FSMC_WrapMode; /*!< Enables or disables the Wrapped burst access mode for Flash - memory, valid only when accessing Flash memories in burst mode. - This parameter can be a value of @ref FSMC_Wrap_Mode */ - - uint32_t FSMC_WaitSignalActive; /*!< Specifies if the wait signal is asserted by the memory one - clock cycle before the wait state or during the wait state, - valid only when accessing memories in burst mode. - This parameter can be a value of @ref FSMC_Wait_Timing */ - - uint32_t FSMC_WriteOperation; /*!< Enables or disables the write operation in the selected bank by the FSMC. - This parameter can be a value of @ref FSMC_Write_Operation */ - - uint32_t FSMC_WaitSignal; /*!< Enables or disables the wait-state insertion via wait - signal, valid for Flash memory access in burst mode. - This parameter can be a value of @ref FSMC_Wait_Signal */ - - uint32_t FSMC_ExtendedMode; /*!< Enables or disables the extended mode. - This parameter can be a value of @ref FSMC_Extended_Mode */ - - uint32_t FSMC_WriteBurst; /*!< Enables or disables the write burst operation. - This parameter can be a value of @ref FSMC_Write_Burst */ - - FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; /*!< Timing Parameters for write and read access if the ExtendedMode is not used*/ - - FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct; /*!< Timing Parameters for write access if the ExtendedMode is used*/ -}FSMC_NORSRAMInitTypeDef; - -/** - * @brief Timing parameters For FSMC NAND and PCCARD Banks - */ -typedef struct -{ - uint32_t FSMC_SetupTime; /*!< Defines the number of HCLK cycles to setup address before - the command assertion for NAND-Flash read or write access - to common/Attribute or I/O memory space (depending on - the memory space timing to be configured). - This parameter can be a value between 0 and 0xFF.*/ - - uint32_t FSMC_WaitSetupTime; /*!< Defines the minimum number of HCLK cycles to assert the - command for NAND-Flash read or write access to - common/Attribute or I/O memory space (depending on the - memory space timing to be configured). - This parameter can be a number between 0x00 and 0xFF */ - - uint32_t FSMC_HoldSetupTime; /*!< Defines the number of HCLK clock cycles to hold address - (and data for write access) after the command deassertion - for NAND-Flash read or write access to common/Attribute - or I/O memory space (depending on the memory space timing - to be configured). - This parameter can be a number between 0x00 and 0xFF */ - - uint32_t FSMC_HiZSetupTime; /*!< Defines the number of HCLK clock cycles during which the - databus is kept in HiZ after the start of a NAND-Flash - write access to common/Attribute or I/O memory space (depending - on the memory space timing to be configured). - This parameter can be a number between 0x00 and 0xFF */ -}FSMC_NAND_PCCARDTimingInitTypeDef; - -/** - * @brief FSMC NAND Init structure definition - */ -typedef struct -{ - uint32_t FSMC_Bank; /*!< Specifies the NAND memory bank that will be used. - This parameter can be a value of @ref FSMC_NAND_Bank */ - - uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the NAND Memory Bank. - This parameter can be any value of @ref FSMC_Wait_feature */ - - uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. - This parameter can be any value of @ref FSMC_Data_Width */ - - uint32_t FSMC_ECC; /*!< Enables or disables the ECC computation. - This parameter can be any value of @ref FSMC_ECC */ - - uint32_t FSMC_ECCPageSize; /*!< Defines the page size for the extended ECC. - This parameter can be any value of @ref FSMC_ECC_Page_Size */ - - uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the - delay between CLE low and RE low. - This parameter can be a value between 0 and 0xFF. */ - - uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the - delay between ALE low and RE low. - This parameter can be a number between 0x0 and 0xFF */ - - FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */ - - FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */ -}FSMC_NANDInitTypeDef; - -/** - * @brief FSMC PCCARD Init structure definition - */ - -typedef struct -{ - uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the Memory Bank. - This parameter can be any value of @ref FSMC_Wait_feature */ - - uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the - delay between CLE low and RE low. - This parameter can be a value between 0 and 0xFF. */ - - uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the - delay between ALE low and RE low. - This parameter can be a number between 0x0 and 0xFF */ - - - FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */ - - FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */ - - FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_IOSpaceTimingStruct; /*!< FSMC IO Space Timing */ -}FSMC_PCCARDInitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup FSMC_Exported_Constants - * @{ - */ - -/** @defgroup FSMC_NORSRAM_Bank - * @{ - */ -#define FSMC_Bank1_NORSRAM1 ((uint32_t)0x00000000) -#define FSMC_Bank1_NORSRAM2 ((uint32_t)0x00000002) -#define FSMC_Bank1_NORSRAM3 ((uint32_t)0x00000004) -#define FSMC_Bank1_NORSRAM4 ((uint32_t)0x00000006) -/** - * @} - */ - -/** @defgroup FSMC_NAND_Bank - * @{ - */ -#define FSMC_Bank2_NAND ((uint32_t)0x00000010) -#define FSMC_Bank3_NAND ((uint32_t)0x00000100) -/** - * @} - */ - -/** @defgroup FSMC_PCCARD_Bank - * @{ - */ -#define FSMC_Bank4_PCCARD ((uint32_t)0x00001000) -/** - * @} - */ - -#define IS_FSMC_NORSRAM_BANK(BANK) (((BANK) == FSMC_Bank1_NORSRAM1) || \ - ((BANK) == FSMC_Bank1_NORSRAM2) || \ - ((BANK) == FSMC_Bank1_NORSRAM3) || \ - ((BANK) == FSMC_Bank1_NORSRAM4)) - -#define IS_FSMC_NAND_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ - ((BANK) == FSMC_Bank3_NAND)) - -#define IS_FSMC_GETFLAG_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ - ((BANK) == FSMC_Bank3_NAND) || \ - ((BANK) == FSMC_Bank4_PCCARD)) - -#define IS_FSMC_IT_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ - ((BANK) == FSMC_Bank3_NAND) || \ - ((BANK) == FSMC_Bank4_PCCARD)) - -/** @defgroup FSMC_NOR_SRAM_Controller - * @{ - */ - -/** @defgroup FSMC_Data_Address_Bus_Multiplexing - * @{ - */ - -#define FSMC_DataAddressMux_Disable ((uint32_t)0x00000000) -#define FSMC_DataAddressMux_Enable ((uint32_t)0x00000002) -#define IS_FSMC_MUX(MUX) (((MUX) == FSMC_DataAddressMux_Disable) || \ - ((MUX) == FSMC_DataAddressMux_Enable)) -/** - * @} - */ - -/** @defgroup FSMC_Memory_Type - * @{ - */ - -#define FSMC_MemoryType_SRAM ((uint32_t)0x00000000) -#define FSMC_MemoryType_PSRAM ((uint32_t)0x00000004) -#define FSMC_MemoryType_NOR ((uint32_t)0x00000008) -#define IS_FSMC_MEMORY(MEMORY) (((MEMORY) == FSMC_MemoryType_SRAM) || \ - ((MEMORY) == FSMC_MemoryType_PSRAM)|| \ - ((MEMORY) == FSMC_MemoryType_NOR)) -/** - * @} - */ - -/** @defgroup FSMC_Data_Width - * @{ - */ - -#define FSMC_MemoryDataWidth_8b ((uint32_t)0x00000000) -#define FSMC_MemoryDataWidth_16b ((uint32_t)0x00000010) -#define IS_FSMC_MEMORY_WIDTH(WIDTH) (((WIDTH) == FSMC_MemoryDataWidth_8b) || \ - ((WIDTH) == FSMC_MemoryDataWidth_16b)) -/** - * @} - */ - -/** @defgroup FSMC_Burst_Access_Mode - * @{ - */ - -#define FSMC_BurstAccessMode_Disable ((uint32_t)0x00000000) -#define FSMC_BurstAccessMode_Enable ((uint32_t)0x00000100) -#define IS_FSMC_BURSTMODE(STATE) (((STATE) == FSMC_BurstAccessMode_Disable) || \ - ((STATE) == FSMC_BurstAccessMode_Enable)) -/** - * @} - */ - -/** @defgroup FSMC_AsynchronousWait - * @{ - */ -#define FSMC_AsynchronousWait_Disable ((uint32_t)0x00000000) -#define FSMC_AsynchronousWait_Enable ((uint32_t)0x00008000) -#define IS_FSMC_ASYNWAIT(STATE) (((STATE) == FSMC_AsynchronousWait_Disable) || \ - ((STATE) == FSMC_AsynchronousWait_Enable)) -/** - * @} - */ - -/** @defgroup FSMC_Wait_Signal_Polarity - * @{ - */ -#define FSMC_WaitSignalPolarity_Low ((uint32_t)0x00000000) -#define FSMC_WaitSignalPolarity_High ((uint32_t)0x00000200) -#define IS_FSMC_WAIT_POLARITY(POLARITY) (((POLARITY) == FSMC_WaitSignalPolarity_Low) || \ - ((POLARITY) == FSMC_WaitSignalPolarity_High)) -/** - * @} - */ - -/** @defgroup FSMC_Wrap_Mode - * @{ - */ -#define FSMC_WrapMode_Disable ((uint32_t)0x00000000) -#define FSMC_WrapMode_Enable ((uint32_t)0x00000400) -#define IS_FSMC_WRAP_MODE(MODE) (((MODE) == FSMC_WrapMode_Disable) || \ - ((MODE) == FSMC_WrapMode_Enable)) -/** - * @} - */ - -/** @defgroup FSMC_Wait_Timing - * @{ - */ -#define FSMC_WaitSignalActive_BeforeWaitState ((uint32_t)0x00000000) -#define FSMC_WaitSignalActive_DuringWaitState ((uint32_t)0x00000800) -#define IS_FSMC_WAIT_SIGNAL_ACTIVE(ACTIVE) (((ACTIVE) == FSMC_WaitSignalActive_BeforeWaitState) || \ - ((ACTIVE) == FSMC_WaitSignalActive_DuringWaitState)) -/** - * @} - */ - -/** @defgroup FSMC_Write_Operation - * @{ - */ -#define FSMC_WriteOperation_Disable ((uint32_t)0x00000000) -#define FSMC_WriteOperation_Enable ((uint32_t)0x00001000) -#define IS_FSMC_WRITE_OPERATION(OPERATION) (((OPERATION) == FSMC_WriteOperation_Disable) || \ - ((OPERATION) == FSMC_WriteOperation_Enable)) -/** - * @} - */ - -/** @defgroup FSMC_Wait_Signal - * @{ - */ -#define FSMC_WaitSignal_Disable ((uint32_t)0x00000000) -#define FSMC_WaitSignal_Enable ((uint32_t)0x00002000) -#define IS_FSMC_WAITE_SIGNAL(SIGNAL) (((SIGNAL) == FSMC_WaitSignal_Disable) || \ - ((SIGNAL) == FSMC_WaitSignal_Enable)) -/** - * @} - */ - -/** @defgroup FSMC_Extended_Mode - * @{ - */ -#define FSMC_ExtendedMode_Disable ((uint32_t)0x00000000) -#define FSMC_ExtendedMode_Enable ((uint32_t)0x00004000) - -#define IS_FSMC_EXTENDED_MODE(MODE) (((MODE) == FSMC_ExtendedMode_Disable) || \ - ((MODE) == FSMC_ExtendedMode_Enable)) -/** - * @} - */ - -/** @defgroup FSMC_Write_Burst - * @{ - */ - -#define FSMC_WriteBurst_Disable ((uint32_t)0x00000000) -#define FSMC_WriteBurst_Enable ((uint32_t)0x00080000) -#define IS_FSMC_WRITE_BURST(BURST) (((BURST) == FSMC_WriteBurst_Disable) || \ - ((BURST) == FSMC_WriteBurst_Enable)) -/** - * @} - */ - -/** @defgroup FSMC_Address_Setup_Time - * @{ - */ -#define IS_FSMC_ADDRESS_SETUP_TIME(TIME) ((TIME) <= 0xF) -/** - * @} - */ - -/** @defgroup FSMC_Address_Hold_Time - * @{ - */ -#define IS_FSMC_ADDRESS_HOLD_TIME(TIME) ((TIME) <= 0xF) -/** - * @} - */ - -/** @defgroup FSMC_Data_Setup_Time - * @{ - */ -#define IS_FSMC_DATASETUP_TIME(TIME) (((TIME) > 0) && ((TIME) <= 0xFF)) -/** - * @} - */ - -/** @defgroup FSMC_Bus_Turn_around_Duration - * @{ - */ -#define IS_FSMC_TURNAROUND_TIME(TIME) ((TIME) <= 0xF) -/** - * @} - */ - -/** @defgroup FSMC_CLK_Division - * @{ - */ -#define IS_FSMC_CLK_DIV(DIV) ((DIV) <= 0xF) -/** - * @} - */ - -/** @defgroup FSMC_Data_Latency - * @{ - */ -#define IS_FSMC_DATA_LATENCY(LATENCY) ((LATENCY) <= 0xF) -/** - * @} - */ - -/** @defgroup FSMC_Access_Mode - * @{ - */ -#define FSMC_AccessMode_A ((uint32_t)0x00000000) -#define FSMC_AccessMode_B ((uint32_t)0x10000000) -#define FSMC_AccessMode_C ((uint32_t)0x20000000) -#define FSMC_AccessMode_D ((uint32_t)0x30000000) -#define IS_FSMC_ACCESS_MODE(MODE) (((MODE) == FSMC_AccessMode_A) || \ - ((MODE) == FSMC_AccessMode_B) || \ - ((MODE) == FSMC_AccessMode_C) || \ - ((MODE) == FSMC_AccessMode_D)) -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup FSMC_NAND_PCCARD_Controller - * @{ - */ - -/** @defgroup FSMC_Wait_feature - * @{ - */ -#define FSMC_Waitfeature_Disable ((uint32_t)0x00000000) -#define FSMC_Waitfeature_Enable ((uint32_t)0x00000002) -#define IS_FSMC_WAIT_FEATURE(FEATURE) (((FEATURE) == FSMC_Waitfeature_Disable) || \ - ((FEATURE) == FSMC_Waitfeature_Enable)) -/** - * @} - */ - - -/** @defgroup FSMC_ECC - * @{ - */ -#define FSMC_ECC_Disable ((uint32_t)0x00000000) -#define FSMC_ECC_Enable ((uint32_t)0x00000040) -#define IS_FSMC_ECC_STATE(STATE) (((STATE) == FSMC_ECC_Disable) || \ - ((STATE) == FSMC_ECC_Enable)) -/** - * @} - */ - -/** @defgroup FSMC_ECC_Page_Size - * @{ - */ -#define FSMC_ECCPageSize_256Bytes ((uint32_t)0x00000000) -#define FSMC_ECCPageSize_512Bytes ((uint32_t)0x00020000) -#define FSMC_ECCPageSize_1024Bytes ((uint32_t)0x00040000) -#define FSMC_ECCPageSize_2048Bytes ((uint32_t)0x00060000) -#define FSMC_ECCPageSize_4096Bytes ((uint32_t)0x00080000) -#define FSMC_ECCPageSize_8192Bytes ((uint32_t)0x000A0000) -#define IS_FSMC_ECCPAGE_SIZE(SIZE) (((SIZE) == FSMC_ECCPageSize_256Bytes) || \ - ((SIZE) == FSMC_ECCPageSize_512Bytes) || \ - ((SIZE) == FSMC_ECCPageSize_1024Bytes) || \ - ((SIZE) == FSMC_ECCPageSize_2048Bytes) || \ - ((SIZE) == FSMC_ECCPageSize_4096Bytes) || \ - ((SIZE) == FSMC_ECCPageSize_8192Bytes)) -/** - * @} - */ - -/** @defgroup FSMC_TCLR_Setup_Time - * @{ - */ -#define IS_FSMC_TCLR_TIME(TIME) ((TIME) <= 0xFF) -/** - * @} - */ - -/** @defgroup FSMC_TAR_Setup_Time - * @{ - */ -#define IS_FSMC_TAR_TIME(TIME) ((TIME) <= 0xFF) -/** - * @} - */ - -/** @defgroup FSMC_Setup_Time - * @{ - */ -#define IS_FSMC_SETUP_TIME(TIME) ((TIME) <= 0xFF) -/** - * @} - */ - -/** @defgroup FSMC_Wait_Setup_Time - * @{ - */ -#define IS_FSMC_WAIT_TIME(TIME) ((TIME) <= 0xFF) -/** - * @} - */ - -/** @defgroup FSMC_Hold_Setup_Time - * @{ - */ -#define IS_FSMC_HOLD_TIME(TIME) ((TIME) <= 0xFF) -/** - * @} - */ - -/** @defgroup FSMC_HiZ_Setup_Time - * @{ - */ -#define IS_FSMC_HIZ_TIME(TIME) ((TIME) <= 0xFF) -/** - * @} - */ - -/** @defgroup FSMC_Interrupt_sources - * @{ - */ -#define FSMC_IT_RisingEdge ((uint32_t)0x00000008) -#define FSMC_IT_Level ((uint32_t)0x00000010) -#define FSMC_IT_FallingEdge ((uint32_t)0x00000020) -#define IS_FSMC_IT(IT) ((((IT) & (uint32_t)0xFFFFFFC7) == 0x00000000) && ((IT) != 0x00000000)) -#define IS_FSMC_GET_IT(IT) (((IT) == FSMC_IT_RisingEdge) || \ - ((IT) == FSMC_IT_Level) || \ - ((IT) == FSMC_IT_FallingEdge)) -/** - * @} - */ - -/** @defgroup FSMC_Flags - * @{ - */ -#define FSMC_FLAG_RisingEdge ((uint32_t)0x00000001) -#define FSMC_FLAG_Level ((uint32_t)0x00000002) -#define FSMC_FLAG_FallingEdge ((uint32_t)0x00000004) -#define FSMC_FLAG_FEMPT ((uint32_t)0x00000040) -#define IS_FSMC_GET_FLAG(FLAG) (((FLAG) == FSMC_FLAG_RisingEdge) || \ - ((FLAG) == FSMC_FLAG_Level) || \ - ((FLAG) == FSMC_FLAG_FallingEdge) || \ - ((FLAG) == FSMC_FLAG_FEMPT)) - -#define IS_FSMC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFF8) == 0x00000000) && ((FLAG) != 0x00000000)) -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* NOR/SRAM Controller functions **********************************************/ -void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank); -void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); -void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); -void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState); - -/* NAND Controller functions **************************************************/ -void FSMC_NANDDeInit(uint32_t FSMC_Bank); -void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); -void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); -void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState); -void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState); -uint32_t FSMC_GetECC(uint32_t FSMC_Bank); - -/* PCCARD Controller functions ************************************************/ -void FSMC_PCCARDDeInit(void); -void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct); -void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct); -void FSMC_PCCARDCmd(FunctionalState NewState); - -/* Interrupts and flags management functions **********************************/ -void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState); -FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); -void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); -ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT); -void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_FSMC_H */ -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_gpio.c b/car_hw/src/lib/stdperiph/stm32f4xx_gpio.c deleted file mode 100644 index f19284cf0c0..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_gpio.c +++ /dev/null @@ -1,562 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_gpio.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the GPIO peripheral: - * - Initialization and Configuration - * - GPIO Read and Write - * - GPIO Alternate functions configuration - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - * 1. Enable the GPIO AHB clock using the following function - * RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); - * - * 2. Configure the GPIO pin(s) using GPIO_Init() - * Four possible configuration are available for each pin: - * - Input: Floating, Pull-up, Pull-down. - * - Output: Push-Pull (Pull-up, Pull-down or no Pull) - * Open Drain (Pull-up, Pull-down or no Pull). - * In output mode, the speed is configurable: 2 MHz, 25 MHz, - * 50 MHz or 100 MHz. - * - Alternate Function: Push-Pull (Pull-up, Pull-down or no Pull) - * Open Drain (Pull-up, Pull-down or no Pull). - * - Analog: required mode when a pin is to be used as ADC channel - * or DAC output. - * - * 3- Peripherals alternate function: - * - For ADC and DAC, configure the desired pin in analog mode using - * GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AN; - * - For other peripherals (TIM, USART...): - * - Connect the pin to the desired peripherals' Alternate - * Function (AF) using GPIO_PinAFConfig() function - * - Configure the desired pin in alternate function mode using - * GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF - * - Select the type, pull-up/pull-down and output speed via - * GPIO_PuPd, GPIO_OType and GPIO_Speed members - * - Call GPIO_Init() function - * - * 4. To get the level of a pin configured in input mode use GPIO_ReadInputDataBit() - * - * 5. To set/reset the level of a pin configured in output mode use - * GPIO_SetBits()/GPIO_ResetBits() - * - * 6. During and just after reset, the alternate functions are not - * active and the GPIO pins are configured in input floating mode - * (except JTAG pins). - * - * 7. The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as - * general-purpose (PC14 and PC15, respectively) when the LSE - * oscillator is off. The LSE has priority over the GPIO function. - * - * 8. The HSE oscillator pins OSC_IN/OSC_OUT can be used as - * general-purpose PH0 and PH1, respectively, when the HSE - * oscillator is off. The HSE has priority over the GPIO function. - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_gpio.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup GPIO - * @brief GPIO driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup GPIO_Private_Functions - * @{ - */ - -/** @defgroup GPIO_Group1 Initialization and Configuration - * @brief Initialization and Configuration - * -@verbatim - =============================================================================== - Initialization and Configuration - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the GPIOx peripheral registers to their default reset values. - * @note By default, The GPIO pins are configured in input floating mode (except JTAG pins). - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @retval None - */ -void GPIO_DeInit(GPIO_TypeDef* GPIOx) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - if (GPIOx == GPIOA) - { - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, ENABLE); - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, DISABLE); - } - else if (GPIOx == GPIOB) - { - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, ENABLE); - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOB, DISABLE); - } - else if (GPIOx == GPIOC) - { - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, ENABLE); - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, DISABLE); - } - else if (GPIOx == GPIOD) - { - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOD, ENABLE); - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOD, DISABLE); - } - else if (GPIOx == GPIOE) - { - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOE, ENABLE); - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOE, DISABLE); - } - else if (GPIOx == GPIOF) - { - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOF, ENABLE); - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOF, DISABLE); - } - else if (GPIOx == GPIOG) - { - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOG, ENABLE); - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOG, DISABLE); - } - else if (GPIOx == GPIOH) - { - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOH, ENABLE); - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOH, DISABLE); - } - else - { - if (GPIOx == GPIOI) - { - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, ENABLE); - RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOI, DISABLE); - } - } -} - -/** - * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_InitStruct. - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains - * the configuration information for the specified GPIO peripheral. - * @retval None - */ -void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) -{ - uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin)); - assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode)); - assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd)); - - /* -------------------------Configure the port pins---------------- */ - /*-- GPIO Mode Configuration --*/ - for (pinpos = 0x00; pinpos < 0x10; pinpos++) - { - pos = ((uint32_t)0x01) << pinpos; - /* Get the port pins position */ - currentpin = (GPIO_InitStruct->GPIO_Pin) & pos; - - if (currentpin == pos) - { - GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (pinpos * 2)); - GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2)); - - if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF)) - { - /* Check Speed mode parameters */ - assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed)); - - /* Speed mode configuration */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2)); - GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2)); - - /* Check Output mode parameters */ - assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType)); - - /* Output mode configuration*/ - GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos)) ; - GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos)); - } - - /* Pull-up Pull down resistor configuration*/ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2)); - GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * 2)); - } - } -} - -/** - * @brief Fills each GPIO_InitStruct member with its default value. - * @param GPIO_InitStruct : pointer to a GPIO_InitTypeDef structure which will be initialized. - * @retval None - */ -void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct) -{ - /* Reset GPIO init structure parameters values */ - GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All; - GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStruct->GPIO_OType = GPIO_OType_PP; - GPIO_InitStruct->GPIO_PuPd = GPIO_PuPd_NOPULL; -} - -/** - * @brief Locks GPIO Pins configuration registers. - * @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, - * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. - * @note The configuration of the locked GPIO pins can no longer be modified - * until the next reset. - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bit to be locked. - * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). - * @retval None - */ -void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - __IO uint32_t tmp = 0x00010000; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - tmp |= GPIO_Pin; - /* Set LCKK bit */ - GPIOx->LCKR = tmp; - /* Reset LCKK bit */ - GPIOx->LCKR = GPIO_Pin; - /* Set LCKK bit */ - GPIOx->LCKR = tmp; - /* Read LCKK bit*/ - tmp = GPIOx->LCKR; - /* Read LCKK bit*/ - tmp = GPIOx->LCKR; -} - -/** - * @} - */ - -/** @defgroup GPIO_Group2 GPIO Read and Write - * @brief GPIO Read and Write - * -@verbatim - =============================================================================== - GPIO Read and Write - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Reads the specified input port pin. - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bit to read. - * This parameter can be GPIO_Pin_x where x can be (0..15). - * @retval The input port pin value. - */ -uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - uint8_t bitstatus = 0x00; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); - - if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET) - { - bitstatus = (uint8_t)Bit_SET; - } - else - { - bitstatus = (uint8_t)Bit_RESET; - } - return bitstatus; -} - -/** - * @brief Reads the specified GPIO input data port. - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @retval GPIO input data port value. - */ -uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - return ((uint16_t)GPIOx->IDR); -} - -/** - * @brief Reads the specified output data port bit. - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bit to read. - * This parameter can be GPIO_Pin_x where x can be (0..15). - * @retval The output port pin value. - */ -uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - uint8_t bitstatus = 0x00; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); - - if ((GPIOx->ODR & GPIO_Pin) != (uint32_t)Bit_RESET) - { - bitstatus = (uint8_t)Bit_SET; - } - else - { - bitstatus = (uint8_t)Bit_RESET; - } - return bitstatus; -} - -/** - * @brief Reads the specified GPIO output data port. - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @retval GPIO output data port value. - */ -uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - return ((uint16_t)GPIOx->ODR); -} - -/** - * @brief Sets the selected data port bits. - * @note This functions uses GPIOx_BSRR register to allow atomic read/modify - * accesses. In this way, there is no risk of an IRQ occurring between - * the read and the modify access. - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bits to be written. - * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). - * @retval None - */ -void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - GPIOx->BSRRL = GPIO_Pin; -} - -/** - * @brief Clears the selected data port bits. - * @note This functions uses GPIOx_BSRR register to allow atomic read/modify - * accesses. In this way, there is no risk of an IRQ occurring between - * the read and the modify access. - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bits to be written. - * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). - * @retval None - */ -void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN(GPIO_Pin)); - - GPIOx->BSRRH = GPIO_Pin; -} - -/** - * @brief Sets or clears the selected data port bit. - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @param GPIO_Pin: specifies the port bit to be written. - * This parameter can be one of GPIO_Pin_x where x can be (0..15). - * @param BitVal: specifies the value to be written to the selected bit. - * This parameter can be one of the BitAction enum values: - * @arg Bit_RESET: to clear the port pin - * @arg Bit_SET: to set the port pin - * @retval None - */ -void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); - assert_param(IS_GPIO_BIT_ACTION(BitVal)); - - if (BitVal != Bit_RESET) - { - GPIOx->BSRRL = GPIO_Pin; - } - else - { - GPIOx->BSRRH = GPIO_Pin ; - } -} - -/** - * @brief Writes data to the specified GPIO data port. - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @param PortVal: specifies the value to be written to the port output data register. - * @retval None - */ -void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - GPIOx->ODR = PortVal; -} - -/** - * @brief Toggles the specified GPIO pins.. - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @param GPIO_Pin: Specifies the pins to be toggled. - * @retval None - */ -void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) -{ - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - - GPIOx->ODR ^= GPIO_Pin; -} - -/** - * @} - */ - -/** @defgroup GPIO_Group3 GPIO Alternate functions configuration function - * @brief GPIO Alternate functions configuration function - * -@verbatim - =============================================================================== - GPIO Alternate functions configuration function - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Changes the mapping of the specified pin. - * @param GPIOx: where x can be (A..I) to select the GPIO peripheral. - * @param GPIO_PinSource: specifies the pin for the Alternate function. - * This parameter can be GPIO_PinSourcex where x can be (0..15). - * @param GPIO_AFSelection: selects the pin to used as Alternate function. - * This parameter can be one of the following values: - * @arg GPIO_AF_RTC_50Hz: Connect RTC_50Hz pin to AF0 (default after reset) - * @arg GPIO_AF_MCO: Connect MCO pin (MCO1 and MCO2) to AF0 (default after reset) - * @arg GPIO_AF_TAMPER: Connect TAMPER pins (TAMPER_1 and TAMPER_2) to AF0 (default after reset) - * @arg GPIO_AF_SWJ: Connect SWJ pins (SWD and JTAG)to AF0 (default after reset) - * @arg GPIO_AF_TRACE: Connect TRACE pins to AF0 (default after reset) - * @arg GPIO_AF_TIM1: Connect TIM1 pins to AF1 - * @arg GPIO_AF_TIM2: Connect TIM2 pins to AF1 - * @arg GPIO_AF_TIM3: Connect TIM3 pins to AF2 - * @arg GPIO_AF_TIM4: Connect TIM4 pins to AF2 - * @arg GPIO_AF_TIM5: Connect TIM5 pins to AF2 - * @arg GPIO_AF_TIM8: Connect TIM8 pins to AF3 - * @arg GPIO_AF_TIM9: Connect TIM9 pins to AF3 - * @arg GPIO_AF_TIM10: Connect TIM10 pins to AF3 - * @arg GPIO_AF_TIM11: Connect TIM11 pins to AF3 - * @arg GPIO_AF_I2C1: Connect I2C1 pins to AF4 - * @arg GPIO_AF_I2C2: Connect I2C2 pins to AF4 - * @arg GPIO_AF_I2C3: Connect I2C3 pins to AF4 - * @arg GPIO_AF_SPI1: Connect SPI1 pins to AF5 - * @arg GPIO_AF_SPI2: Connect SPI2/I2S2 pins to AF5 - * @arg GPIO_AF_SPI3: Connect SPI3/I2S3 pins to AF6 - * @arg GPIO_AF_I2S3ext: Connect I2S3ext pins to AF7 - * @arg GPIO_AF_USART1: Connect USART1 pins to AF7 - * @arg GPIO_AF_USART2: Connect USART2 pins to AF7 - * @arg GPIO_AF_USART3: Connect USART3 pins to AF7 - * @arg GPIO_AF_UART4: Connect UART4 pins to AF8 - * @arg GPIO_AF_UART5: Connect UART5 pins to AF8 - * @arg GPIO_AF_USART6: Connect USART6 pins to AF8 - * @arg GPIO_AF_CAN1: Connect CAN1 pins to AF9 - * @arg GPIO_AF_CAN2: Connect CAN2 pins to AF9 - * @arg GPIO_AF_TIM12: Connect TIM12 pins to AF9 - * @arg GPIO_AF_TIM13: Connect TIM13 pins to AF9 - * @arg GPIO_AF_TIM14: Connect TIM14 pins to AF9 - * @arg GPIO_AF_OTG_FS: Connect OTG_FS pins to AF10 - * @arg GPIO_AF_OTG_HS: Connect OTG_HS pins to AF10 - * @arg GPIO_AF_ETH: Connect ETHERNET pins to AF11 - * @arg GPIO_AF_FSMC: Connect FSMC pins to AF12 - * @arg GPIO_AF_OTG_HS_FS: Connect OTG HS (configured in FS) pins to AF12 - * @arg GPIO_AF_SDIO: Connect SDIO pins to AF12 - * @arg GPIO_AF_DCMI: Connect DCMI pins to AF13 - * @arg GPIO_AF_EVENTOUT: Connect EVENTOUT pins to AF15 - * @retval None - */ -void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF) -{ - uint32_t temp = 0x00; - uint32_t temp_2 = 0x00; - - /* Check the parameters */ - assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); - assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); - assert_param(IS_GPIO_AF(GPIO_AF)); - - temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ; - GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ; - temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp; - GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_gpio.h b/car_hw/src/lib/stdperiph/stm32f4xx_gpio.h deleted file mode 100644 index 3cb99e4b21a..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_gpio.h +++ /dev/null @@ -1,406 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_gpio.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the GPIO firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_GPIO_H -#define __STM32F4xx_GPIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup GPIO - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \ - ((PERIPH) == GPIOB) || \ - ((PERIPH) == GPIOC) || \ - ((PERIPH) == GPIOD) || \ - ((PERIPH) == GPIOE) || \ - ((PERIPH) == GPIOF) || \ - ((PERIPH) == GPIOG) || \ - ((PERIPH) == GPIOH) || \ - ((PERIPH) == GPIOI)) - -/** - * @brief GPIO Configuration Mode enumeration - */ -typedef enum -{ - GPIO_Mode_IN = 0x00, /*!< GPIO Input Mode */ - GPIO_Mode_OUT = 0x01, /*!< GPIO Output Mode */ - GPIO_Mode_AF = 0x02, /*!< GPIO Alternate function Mode */ - GPIO_Mode_AN = 0x03 /*!< GPIO Analog Mode */ -}GPIOMode_TypeDef; -#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_IN) || ((MODE) == GPIO_Mode_OUT) || \ - ((MODE) == GPIO_Mode_AF)|| ((MODE) == GPIO_Mode_AN)) - -/** - * @brief GPIO Output type enumeration - */ -typedef enum -{ - GPIO_OType_PP = 0x00, - GPIO_OType_OD = 0x01 -}GPIOOType_TypeDef; -#define IS_GPIO_OTYPE(OTYPE) (((OTYPE) == GPIO_OType_PP) || ((OTYPE) == GPIO_OType_OD)) - - -/** - * @brief GPIO Output Maximum frequency enumeration - */ -typedef enum -{ - GPIO_Speed_2MHz = 0x00, /*!< Low speed */ - GPIO_Speed_25MHz = 0x01, /*!< Medium speed */ - GPIO_Speed_50MHz = 0x02, /*!< Fast speed */ - GPIO_Speed_100MHz = 0x03 /*!< High speed on 30 pF (80 MHz Output max speed on 15 pF) */ -}GPIOSpeed_TypeDef; -#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_2MHz) || ((SPEED) == GPIO_Speed_25MHz) || \ - ((SPEED) == GPIO_Speed_50MHz)|| ((SPEED) == GPIO_Speed_100MHz)) - -/** - * @brief GPIO Configuration PullUp PullDown enumeration - */ -typedef enum -{ - GPIO_PuPd_NOPULL = 0x00, - GPIO_PuPd_UP = 0x01, - GPIO_PuPd_DOWN = 0x02 -}GPIOPuPd_TypeDef; -#define IS_GPIO_PUPD(PUPD) (((PUPD) == GPIO_PuPd_NOPULL) || ((PUPD) == GPIO_PuPd_UP) || \ - ((PUPD) == GPIO_PuPd_DOWN)) - -/** - * @brief GPIO Bit SET and Bit RESET enumeration - */ -typedef enum -{ - Bit_RESET = 0, - Bit_SET -}BitAction; -#define IS_GPIO_BIT_ACTION(ACTION) (((ACTION) == Bit_RESET) || ((ACTION) == Bit_SET)) - - -/** - * @brief GPIO Init structure definition - */ -typedef struct -{ - uint32_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. - This parameter can be any value of @ref GPIO_pins_define */ - - GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. - This parameter can be a value of @ref GPIOMode_TypeDef */ - - GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. - This parameter can be a value of @ref GPIOSpeed_TypeDef */ - - GPIOOType_TypeDef GPIO_OType; /*!< Specifies the operating output type for the selected pins. - This parameter can be a value of @ref GPIOOType_TypeDef */ - - GPIOPuPd_TypeDef GPIO_PuPd; /*!< Specifies the operating Pull-up/Pull down for the selected pins. - This parameter can be a value of @ref GPIOPuPd_TypeDef */ -}GPIO_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup GPIO_Exported_Constants - * @{ - */ - -/** @defgroup GPIO_pins_define - * @{ - */ -#define GPIO_Pin_0 ((uint16_t)0x0001) /* Pin 0 selected */ -#define GPIO_Pin_1 ((uint16_t)0x0002) /* Pin 1 selected */ -#define GPIO_Pin_2 ((uint16_t)0x0004) /* Pin 2 selected */ -#define GPIO_Pin_3 ((uint16_t)0x0008) /* Pin 3 selected */ -#define GPIO_Pin_4 ((uint16_t)0x0010) /* Pin 4 selected */ -#define GPIO_Pin_5 ((uint16_t)0x0020) /* Pin 5 selected */ -#define GPIO_Pin_6 ((uint16_t)0x0040) /* Pin 6 selected */ -#define GPIO_Pin_7 ((uint16_t)0x0080) /* Pin 7 selected */ -#define GPIO_Pin_8 ((uint16_t)0x0100) /* Pin 8 selected */ -#define GPIO_Pin_9 ((uint16_t)0x0200) /* Pin 9 selected */ -#define GPIO_Pin_10 ((uint16_t)0x0400) /* Pin 10 selected */ -#define GPIO_Pin_11 ((uint16_t)0x0800) /* Pin 11 selected */ -#define GPIO_Pin_12 ((uint16_t)0x1000) /* Pin 12 selected */ -#define GPIO_Pin_13 ((uint16_t)0x2000) /* Pin 13 selected */ -#define GPIO_Pin_14 ((uint16_t)0x4000) /* Pin 14 selected */ -#define GPIO_Pin_15 ((uint16_t)0x8000) /* Pin 15 selected */ -#define GPIO_Pin_All ((uint16_t)0xFFFF) /* All pins selected */ - -#define IS_GPIO_PIN(PIN) ((((PIN) & (uint16_t)0x00) == 0x00) && ((PIN) != (uint16_t)0x00)) -#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \ - ((PIN) == GPIO_Pin_1) || \ - ((PIN) == GPIO_Pin_2) || \ - ((PIN) == GPIO_Pin_3) || \ - ((PIN) == GPIO_Pin_4) || \ - ((PIN) == GPIO_Pin_5) || \ - ((PIN) == GPIO_Pin_6) || \ - ((PIN) == GPIO_Pin_7) || \ - ((PIN) == GPIO_Pin_8) || \ - ((PIN) == GPIO_Pin_9) || \ - ((PIN) == GPIO_Pin_10) || \ - ((PIN) == GPIO_Pin_11) || \ - ((PIN) == GPIO_Pin_12) || \ - ((PIN) == GPIO_Pin_13) || \ - ((PIN) == GPIO_Pin_14) || \ - ((PIN) == GPIO_Pin_15)) -/** - * @} - */ - - -/** @defgroup GPIO_Pin_sources - * @{ - */ -#define GPIO_PinSource0 ((uint8_t)0x00) -#define GPIO_PinSource1 ((uint8_t)0x01) -#define GPIO_PinSource2 ((uint8_t)0x02) -#define GPIO_PinSource3 ((uint8_t)0x03) -#define GPIO_PinSource4 ((uint8_t)0x04) -#define GPIO_PinSource5 ((uint8_t)0x05) -#define GPIO_PinSource6 ((uint8_t)0x06) -#define GPIO_PinSource7 ((uint8_t)0x07) -#define GPIO_PinSource8 ((uint8_t)0x08) -#define GPIO_PinSource9 ((uint8_t)0x09) -#define GPIO_PinSource10 ((uint8_t)0x0A) -#define GPIO_PinSource11 ((uint8_t)0x0B) -#define GPIO_PinSource12 ((uint8_t)0x0C) -#define GPIO_PinSource13 ((uint8_t)0x0D) -#define GPIO_PinSource14 ((uint8_t)0x0E) -#define GPIO_PinSource15 ((uint8_t)0x0F) - -#define IS_GPIO_PIN_SOURCE(PINSOURCE) (((PINSOURCE) == GPIO_PinSource0) || \ - ((PINSOURCE) == GPIO_PinSource1) || \ - ((PINSOURCE) == GPIO_PinSource2) || \ - ((PINSOURCE) == GPIO_PinSource3) || \ - ((PINSOURCE) == GPIO_PinSource4) || \ - ((PINSOURCE) == GPIO_PinSource5) || \ - ((PINSOURCE) == GPIO_PinSource6) || \ - ((PINSOURCE) == GPIO_PinSource7) || \ - ((PINSOURCE) == GPIO_PinSource8) || \ - ((PINSOURCE) == GPIO_PinSource9) || \ - ((PINSOURCE) == GPIO_PinSource10) || \ - ((PINSOURCE) == GPIO_PinSource11) || \ - ((PINSOURCE) == GPIO_PinSource12) || \ - ((PINSOURCE) == GPIO_PinSource13) || \ - ((PINSOURCE) == GPIO_PinSource14) || \ - ((PINSOURCE) == GPIO_PinSource15)) -/** - * @} - */ - -/** @defgroup GPIO_Alternat_function_selection_define - * @{ - */ -/** - * @brief AF 0 selection - */ -#define GPIO_AF_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ -#define GPIO_AF_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ -#define GPIO_AF_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ -#define GPIO_AF_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ -#define GPIO_AF_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ - -/** - * @brief AF 1 selection - */ -#define GPIO_AF_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ -#define GPIO_AF_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ - -/** - * @brief AF 2 selection - */ -#define GPIO_AF_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ -#define GPIO_AF_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ -#define GPIO_AF_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ - -/** - * @brief AF 3 selection - */ -#define GPIO_AF_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ -#define GPIO_AF_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ -#define GPIO_AF_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ -#define GPIO_AF_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ - -/** - * @brief AF 4 selection - */ -#define GPIO_AF_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ -#define GPIO_AF_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ -#define GPIO_AF_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ - -/** - * @brief AF 5 selection - */ -#define GPIO_AF_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ -#define GPIO_AF_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ - -/** - * @brief AF 6 selection - */ -#define GPIO_AF_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ - -/** - * @brief AF 7 selection - */ -#define GPIO_AF_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ -#define GPIO_AF_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ -#define GPIO_AF_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ -#define GPIO_AF_I2S3ext ((uint8_t)0x07) /* I2S3ext Alternate Function mapping */ - -/** - * @brief AF 8 selection - */ -#define GPIO_AF_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ -#define GPIO_AF_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ -#define GPIO_AF_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ - -/** - * @brief AF 9 selection - */ -#define GPIO_AF_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ -#define GPIO_AF_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ -#define GPIO_AF_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ -#define GPIO_AF_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ -#define GPIO_AF_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ - -/** - * @brief AF 10 selection - */ -#define GPIO_AF_OTG_FS ((uint8_t)0xA) /* OTG_FS Alternate Function mapping */ -#define GPIO_AF_OTG_HS ((uint8_t)0xA) /* OTG_HS Alternate Function mapping */ - -/** - * @brief AF 11 selection - */ -#define GPIO_AF_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ - -/** - * @brief AF 12 selection - */ -#define GPIO_AF_FSMC ((uint8_t)0xC) /* FSMC Alternate Function mapping */ -#define GPIO_AF_OTG_HS_FS ((uint8_t)0xC) /* OTG HS configured in FS, Alternate Function mapping */ -#define GPIO_AF_SDIO ((uint8_t)0xC) /* SDIO Alternate Function mapping */ - -/** - * @brief AF 13 selection - */ -#define GPIO_AF_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ - -/** - * @brief AF 15 selection - */ -#define GPIO_AF_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ - -#define IS_GPIO_AF(AF) (((AF) == GPIO_AF_RTC_50Hz) || ((AF) == GPIO_AF_TIM14) || \ - ((AF) == GPIO_AF_MCO) || ((AF) == GPIO_AF_TAMPER) || \ - ((AF) == GPIO_AF_SWJ) || ((AF) == GPIO_AF_TRACE) || \ - ((AF) == GPIO_AF_TIM1) || ((AF) == GPIO_AF_TIM2) || \ - ((AF) == GPIO_AF_TIM3) || ((AF) == GPIO_AF_TIM4) || \ - ((AF) == GPIO_AF_TIM5) || ((AF) == GPIO_AF_TIM8) || \ - ((AF) == GPIO_AF_I2C1) || ((AF) == GPIO_AF_I2C2) || \ - ((AF) == GPIO_AF_I2C3) || ((AF) == GPIO_AF_SPI1) || \ - ((AF) == GPIO_AF_SPI2) || ((AF) == GPIO_AF_TIM13) || \ - ((AF) == GPIO_AF_SPI3) || ((AF) == GPIO_AF_TIM14) || \ - ((AF) == GPIO_AF_USART1) || ((AF) == GPIO_AF_USART2) || \ - ((AF) == GPIO_AF_USART3) || ((AF) == GPIO_AF_UART4) || \ - ((AF) == GPIO_AF_UART5) || ((AF) == GPIO_AF_USART6) || \ - ((AF) == GPIO_AF_CAN1) || ((AF) == GPIO_AF_CAN2) || \ - ((AF) == GPIO_AF_OTG_FS) || ((AF) == GPIO_AF_OTG_HS) || \ - ((AF) == GPIO_AF_ETH) || ((AF) == GPIO_AF_FSMC) || \ - ((AF) == GPIO_AF_OTG_HS_FS) || ((AF) == GPIO_AF_SDIO) || \ - ((AF) == GPIO_AF_DCMI) || ((AF) == GPIO_AF_EVENTOUT)) -/** - * @} - */ - -/** @defgroup GPIO_Legacy - * @{ - */ - -#define GPIO_Mode_AIN GPIO_Mode_AN - -#define GPIO_AF_OTG1_FS GPIO_AF_OTG_FS -#define GPIO_AF_OTG2_HS GPIO_AF_OTG_HS -#define GPIO_AF_OTG2_FS GPIO_AF_OTG_HS_FS - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the GPIO configuration to the default reset state ****/ -void GPIO_DeInit(GPIO_TypeDef* GPIOx); - -/* Initialization and Configuration functions *********************************/ -void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); -void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); -void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); - -/* GPIO Read and Write functions **********************************************/ -uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); -uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); -void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); -void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); -void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); -void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); - -/* GPIO Alternate functions configuration function ****************************/ -void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_GPIO_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_hash.c b/car_hw/src/lib/stdperiph/stm32f4xx_hash.c deleted file mode 100644 index ff2f8df2940..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_hash.c +++ /dev/null @@ -1,701 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hash.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the HASH / HMAC Processor (HASH) peripheral: - * - Initialization and Configuration functions - * - Message Digest generation functions - * - context swapping functions - * - DMA interface function - * - Interrupts and flags management - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - * HASH operation : - * ---------------- - * 1. Enable the HASH controller clock using - * RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_HASH, ENABLE) function. - * - * 2. Initialise the HASH using HASH_Init() function. - * - * 3 . Reset the HASH processor core, so that the HASH will be ready - * to compute he message digest of a new message by using - * HASH_Reset() function. - * - * 4. Enable the HASH controller using the HASH_Cmd() function. - * - * 5. if using DMA for Data input transfer, Activate the DMA Request - * using HASH_DMACmd() function - * - * 6. if DMA is not used for data transfer, use HASH_DataIn() function - * to enter data to IN FIFO. - * - * - * 7. Configure the Number of valid bits in last word of the message - * using HASH_SetLastWordValidBitsNbr() function. - * - * 8. if the message length is not an exact multiple of 512 bits, - * then the function HASH_StartDigest() must be called to - * launch the computation of the final digest. - * - * 9. Once computed, the digest can be read using HASH_GetDigest() - * function. - * - * 10. To control HASH events you can use one of the following - * two methods: - * a- Check on HASH flags using the HASH_GetFlagStatus() function. - * b- Use HASH interrupts through the function HASH_ITConfig() at - * initialization phase and HASH_GetITStatus() function into - * interrupt routines in hashing phase. - * After checking on a flag you should clear it using HASH_ClearFlag() - * function. And after checking on an interrupt event you should - * clear it using HASH_ClearITPendingBit() function. - * - * 11. Save and restore hash processor context using - * HASH_SaveContext() and HASH_RestoreContext() functions. - * - * - * - * HMAC operation : - * ---------------- - * The HMAC algorithm is used for message authentication, by - * irreversibly binding the message being processed to a key chosen - * by the user. - * For HMAC specifications, refer to "HMAC: keyed-hashing for message - * authentication, H. Krawczyk, M. Bellare, R. Canetti, February 1997" - * - * Basically, the HMAC algorithm consists of two nested hash operations: - * HMAC(message) = Hash[((key | pad) XOR 0x5C) | Hash(((key | pad) XOR 0x36) | message)] - * where: - * - "pad" is a sequence of zeroes needed to extend the key to the - * length of the underlying hash function data block (that is - * 512 bits for both the SHA-1 and MD5 hash algorithms) - * - "|" represents the concatenation operator - * - * - * To compute the HMAC, four different phases are required: - * - * 1. Initialise the HASH using HASH_Init() function to do HMAC - * operation. - * - * 2. The key (to be used for the inner hash function) is then given - * to the core. This operation follows the same mechanism as the - * one used to send the message in the hash operation (that is, - * by HASH_DataIn() function and, finally, - * HASH_StartDigest() function. - * - * 3. Once the last word has been entered and computation has started, - * the hash processor elaborates the key. It is then ready to - * accept the message text using the same mechanism as the one - * used to send the message in the hash operation. - * - * 4. After the first hash round, the hash processor returns "ready" - * to indicate that it is ready to receive the key to be used for - * the outer hash function (normally, this key is the same as the - * one used for the inner hash function). When the last word of - * the key is entered and computation starts, the HMAC result is - * made available using HASH_GetDigest() function. - * - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_hash.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup HASH - * @brief HASH driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup HASH_Private_Functions - * @{ - */ - -/** @defgroup HASH_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - Initialization and Configuration functions - =============================================================================== - This section provides functions allowing to - - Initialize the HASH peripheral - - Configure the HASH Processor - - MD5/SHA1, - - HASH/HMAC, - - datatype - - HMAC Key (if mode = HMAC) - - Reset the HASH Processor - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the HASH peripheral registers to their default reset values - * @param None - * @retval None - */ -void HASH_DeInit(void) -{ - /* Enable HASH reset state */ - RCC_AHB2PeriphResetCmd(RCC_AHB2Periph_HASH, ENABLE); - /* Release HASH from reset state */ - RCC_AHB2PeriphResetCmd(RCC_AHB2Periph_HASH, DISABLE); -} - -/** - * @brief Initializes the HASH peripheral according to the specified parameters - * in the HASH_InitStruct structure. - * @note the hash processor is reset when calling this function so that the - * HASH will be ready to compute the message digest of a new message. - * There is no need to call HASH_Reset() function. - * @param HASH_InitStruct: pointer to a HASH_InitTypeDef structure that contains - * the configuration information for the HASH peripheral. - * @note The field HASH_HMACKeyType in HASH_InitTypeDef must be filled only - * if the algorithm mode is HMAC. - * @retval None - */ -void HASH_Init(HASH_InitTypeDef* HASH_InitStruct) -{ - /* Check the parameters */ - assert_param(IS_HASH_ALGOSELECTION(HASH_InitStruct->HASH_AlgoSelection)); - assert_param(IS_HASH_DATATYPE(HASH_InitStruct->HASH_DataType)); - assert_param(IS_HASH_ALGOMODE(HASH_InitStruct->HASH_AlgoMode)); - - /* Configure the Algorithm used, algorithm mode and the datatype */ - HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE); - HASH->CR |= (HASH_InitStruct->HASH_AlgoSelection | \ - HASH_InitStruct->HASH_DataType | \ - HASH_InitStruct->HASH_AlgoMode); - - /* if algorithm mode is HMAC, set the Key */ - if(HASH_InitStruct->HASH_AlgoMode == HASH_AlgoMode_HMAC) - { - assert_param(IS_HASH_HMAC_KEYTYPE(HASH_InitStruct->HASH_HMACKeyType)); - HASH->CR &= ~HASH_CR_LKEY; - HASH->CR |= HASH_InitStruct->HASH_HMACKeyType; - } - - /* Reset the HASH processor core, so that the HASH will be ready to compute - the message digest of a new message */ - HASH->CR |= HASH_CR_INIT; -} - -/** - * @brief Fills each HASH_InitStruct member with its default value. - * @param HASH_InitStruct : pointer to a HASH_InitTypeDef structure which will - * be initialized. - * @note The default values set are : Processor mode is HASH, Algorithm selected is SHA1, - * Data type selected is 32b and HMAC Key Type is short key. - * @retval None - */ -void HASH_StructInit(HASH_InitTypeDef* HASH_InitStruct) -{ - /* Initialize the HASH_AlgoSelection member */ - HASH_InitStruct->HASH_AlgoSelection = HASH_AlgoSelection_SHA1; - - /* Initialize the HASH_AlgoMode member */ - HASH_InitStruct->HASH_AlgoMode = HASH_AlgoMode_HASH; - - /* Initialize the HASH_DataType member */ - HASH_InitStruct->HASH_DataType = HASH_DataType_32b; - - /* Initialize the HASH_HMACKeyType member */ - HASH_InitStruct->HASH_HMACKeyType = HASH_HMACKeyType_ShortKey; -} - -/** - * @brief Resets the HASH processor core, so that the HASH will be ready - * to compute the message digest of a new message. - * @note Calling this function will clear the HASH_SR_DCIS (Digest calculation - * completion interrupt status) bit corresponding to HASH_IT_DCI - * interrupt and HASH_FLAG_DCIS flag. - * @param None - * @retval None - */ -void HASH_Reset(void) -{ - /* Reset the HASH processor core */ - HASH->CR |= HASH_CR_INIT; -} -/** - * @} - */ - -/** @defgroup HASH_Group2 Message Digest generation functions - * @brief Message Digest generation functions - * -@verbatim - =============================================================================== - Message Digest generation functions - =============================================================================== - This section provides functions allowing the generation of message digest: - - Push data in the IN FIFO : using HASH_DataIn() - - Get the number of words set in IN FIFO, use HASH_GetInFIFOWordsNbr() - - set the last word valid bits number using HASH_SetLastWordValidBitsNbr() - - start digest calculation : using HASH_StartDigest() - - Get the Digest message : using HASH_GetDigest() - -@endverbatim - * @{ - */ - - -/** - * @brief Configure the Number of valid bits in last word of the message - * @param ValidNumber: Number of valid bits in last word of the message. - * This parameter must be a number between 0 and 0x1F. - * - 0x00: All 32 bits of the last data written are valid - * - 0x01: Only bit [0] of the last data written is valid - * - 0x02: Only bits[1:0] of the last data written are valid - * - 0x03: Only bits[2:0] of the last data written are valid - * - ... - * - 0x1F: Only bits[30:0] of the last data written are valid - * @note The Number of valid bits must be set before to start the message - * digest competition (in Hash and HMAC) and key treatment(in HMAC). - * @retval None - */ -void HASH_SetLastWordValidBitsNbr(uint16_t ValidNumber) -{ - /* Check the parameters */ - assert_param(IS_HASH_VALIDBITSNUMBER(ValidNumber)); - - /* Configure the Number of valid bits in last word of the message */ - HASH->STR &= ~(HASH_STR_NBW); - HASH->STR |= ValidNumber; -} - -/** - * @brief Writes data in the Data Input FIFO - * @param Data: new data of the message to be processed. - * @retval None - */ -void HASH_DataIn(uint32_t Data) -{ - /* Write in the DIN register a new data */ - HASH->DIN = Data; -} - -/** - * @brief Returns the number of words already pushed into the IN FIFO. - * @param None - * @retval The value of words already pushed into the IN FIFO. - */ -uint8_t HASH_GetInFIFOWordsNbr(void) -{ - /* Return the value of NBW bits */ - return ((HASH->CR & HASH_CR_NBW) >> 8); -} - -/** - * @brief Provides the message digest result. - * @note In MD5 mode, Data[4] filed of HASH_MsgDigest structure is not used - * and is read as zero. - * @param HASH_MessageDigest: pointer to a HASH_MsgDigest structure which will - * hold the message digest result - * @retval None - */ -void HASH_GetDigest(HASH_MsgDigest* HASH_MessageDigest) -{ - /* Get the data field */ - HASH_MessageDigest->Data[0] = HASH->HR[0]; - HASH_MessageDigest->Data[1] = HASH->HR[1]; - HASH_MessageDigest->Data[2] = HASH->HR[2]; - HASH_MessageDigest->Data[3] = HASH->HR[3]; - HASH_MessageDigest->Data[4] = HASH->HR[4]; -} - -/** - * @brief Starts the message padding and calculation of the final message - * @param None - * @retval None - */ -void HASH_StartDigest(void) -{ - /* Start the Digest calculation */ - HASH->STR |= HASH_STR_DCAL; -} -/** - * @} - */ - -/** @defgroup HASH_Group3 Context swapping functions - * @brief Context swapping functions - * -@verbatim - =============================================================================== - Context swapping functions - =============================================================================== - - This section provides functions allowing to save and store HASH Context - - It is possible to interrupt a HASH/HMAC process to perform another processing - with a higher priority, and to complete the interrupted process later on, when - the higher priority task is complete. To do so, the context of the interrupted - task must be saved from the HASH registers to memory, and then be restored - from memory to the HASH registers. - - 1. To save the current context, use HASH_SaveContext() function - 2. To restore the saved context, use HASH_RestoreContext() function - - -@endverbatim - * @{ - */ - -/** - * @brief Save the Hash peripheral Context. - * @note The context can be saved only when no block is currently being - * processed. So user must wait for DINIS = 1 (the last block has been - * processed and the input FIFO is empty) or NBW != 0 (the FIFO is not - * full and no processing is ongoing). - * @param HASH_ContextSave: pointer to a HASH_Context structure that contains - * the repository for current context. - * @retval None - */ -void HASH_SaveContext(HASH_Context* HASH_ContextSave) -{ - uint8_t i = 0; - - /* save context registers */ - HASH_ContextSave->HASH_IMR = HASH->IMR; - HASH_ContextSave->HASH_STR = HASH->STR; - HASH_ContextSave->HASH_CR = HASH->CR; - for(i=0; i<=50;i++) - { - HASH_ContextSave->HASH_CSR[i] = HASH->CSR[i]; - } -} - -/** - * @brief Restore the Hash peripheral Context. - * @note After calling this function, user can restart the processing from the - * point where it has been interrupted. - * @param HASH_ContextRestore: pointer to a HASH_Context structure that contains - * the repository for saved context. - * @retval None - */ -void HASH_RestoreContext(HASH_Context* HASH_ContextRestore) -{ - uint8_t i = 0; - - /* restore context registers */ - HASH->IMR = HASH_ContextRestore->HASH_IMR; - HASH->STR = HASH_ContextRestore->HASH_STR; - HASH->CR = HASH_ContextRestore->HASH_CR; - - /* Initialize the hash processor */ - HASH->CR |= HASH_CR_INIT; - - /* continue restoring context registers */ - for(i=0; i<=50;i++) - { - HASH->CSR[i] = HASH_ContextRestore->HASH_CSR[i]; - } -} -/** - * @} - */ - -/** @defgroup HASH_Group4 HASH's DMA interface Configuration function - * @brief HASH's DMA interface Configuration function - * -@verbatim - =============================================================================== - HASH's DMA interface Configuration function - =============================================================================== - - This section provides functions allowing to configure the DMA interface for - HASH/ HMAC data input transfer. - - When the DMA mode is enabled (using the HASH_DMACmd() function), data can be - sent to the IN FIFO using the DMA peripheral. - - - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the HASH DMA interface. - * @note The DMA is disabled by hardware after the end of transfer. - * @param NewState: new state of the selected HASH DMA transfer request. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void HASH_DMACmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the HASH DMA request */ - HASH->CR |= HASH_CR_DMAE; - } - else - { - /* Disable the HASH DMA request */ - HASH->CR &= ~HASH_CR_DMAE; - } -} -/** - * @} - */ - -/** @defgroup HASH_Group5 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - - This section provides functions allowing to configure the HASH Interrupts and - to get the status and clear flags and Interrupts pending bits. - - The HASH provides 2 Interrupts sources and 5 Flags: - - Flags : - ---------- - 1. HASH_FLAG_DINIS : set when 16 locations are free in the Data IN FIFO - which means that a new block (512 bit) can be entered - into the input buffer. - - 2. HASH_FLAG_DCIS : set when Digest calculation is complete - - 3. HASH_FLAG_DMAS : set when HASH's DMA interface is enabled (DMAE=1) or - a transfer is ongoing. - This Flag is cleared only by hardware. - - 4. HASH_FLAG_BUSY : set when The hash core is processing a block of data - This Flag is cleared only by hardware. - - 5. HASH_FLAG_DINNE : set when Data IN FIFO is not empty which means that - the Data IN FIFO contains at least one word of data. - This Flag is cleared only by hardware. - - Interrupts : - ------------ - - 1. HASH_IT_DINI : if enabled, this interrupt source is pending when 16 - locations are free in the Data IN FIFO which means that - a new block (512 bit) can be entered into the input buffer. - This interrupt source is cleared using - HASH_ClearITPendingBit(HASH_IT_DINI) function. - - 2. HASH_IT_DCI : if enabled, this interrupt source is pending when Digest - calculation is complete. - This interrupt source is cleared using - HASH_ClearITPendingBit(HASH_IT_DCI) function. - - Managing the HASH controller events : - ------------------------------------ - The user should identify which mode will be used in his application to manage - the HASH controller events: Polling mode or Interrupt mode. - - 1. In the Polling Mode it is advised to use the following functions: - - HASH_GetFlagStatus() : to check if flags events occur. - - HASH_ClearFlag() : to clear the flags events. - - 2. In the Interrupt Mode it is advised to use the following functions: - - HASH_ITConfig() : to enable or disable the interrupt source. - - HASH_GetITStatus() : to check if Interrupt occurs. - - HASH_ClearITPendingBit() : to clear the Interrupt pending Bit - (corresponding Flag). - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified HASH interrupts. - * @param HASH_IT: specifies the HASH interrupt source to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg HASH_IT_DINI: Data Input interrupt - * @arg HASH_IT_DCI: Digest Calculation Completion Interrupt - * @param NewState: new state of the specified HASH interrupt. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void HASH_ITConfig(uint8_t HASH_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_HASH_IT(HASH_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected HASH interrupt */ - HASH->IMR |= HASH_IT; - } - else - { - /* Disable the selected HASH interrupt */ - HASH->IMR &= (uint8_t) ~HASH_IT; - } -} - -/** - * @brief Checks whether the specified HASH flag is set or not. - * @param HASH_FLAG: specifies the HASH flag to check. - * This parameter can be one of the following values: - * @arg HASH_FLAG_DINIS: Data input interrupt status flag - * @arg HASH_FLAG_DCIS: Digest calculation completion interrupt status flag - * @arg HASH_FLAG_BUSY: Busy flag - * @arg HASH_FLAG_DMAS: DMAS Status flag - * @arg HASH_FLAG_DINNE: Data Input register (DIN) not empty status flag - * @retval The new state of HASH_FLAG (SET or RESET) - */ -FlagStatus HASH_GetFlagStatus(uint16_t HASH_FLAG) -{ - FlagStatus bitstatus = RESET; - uint32_t tempreg = 0; - - /* Check the parameters */ - assert_param(IS_HASH_GET_FLAG(HASH_FLAG)); - - /* check if the FLAG is in CR register */ - if ((HASH_FLAG & HASH_FLAG_DINNE) != (uint16_t)RESET ) - { - tempreg = HASH->CR; - } - else /* The FLAG is in SR register */ - { - tempreg = HASH->SR; - } - - /* Check the status of the specified HASH flag */ - if ((tempreg & HASH_FLAG) != (uint16_t)RESET) - { - /* HASH is set */ - bitstatus = SET; - } - else - { - /* HASH_FLAG is reset */ - bitstatus = RESET; - } - - /* Return the HASH_FLAG status */ - return bitstatus; -} -/** - * @brief Clears the HASH flags. - * @param HASH_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg HASH_FLAG_DINIS: Data Input Flag - * @arg HASH_FLAG_DCIS: Digest Calculation Completion Flag - * @retval None - */ -void HASH_ClearFlag(uint16_t HASH_FLAG) -{ - /* Check the parameters */ - assert_param(IS_HASH_CLEAR_FLAG(HASH_FLAG)); - - /* Clear the selected HASH flags */ - HASH->SR = ~(uint32_t)HASH_FLAG; -} -/** - * @brief Checks whether the specified HASH interrupt has occurred or not. - * @param HASH_IT: specifies the HASH interrupt source to check. - * This parameter can be one of the following values: - * @arg HASH_IT_DINI: Data Input interrupt - * @arg HASH_IT_DCI: Digest Calculation Completion Interrupt - * @retval The new state of HASH_IT (SET or RESET). - */ -ITStatus HASH_GetITStatus(uint8_t HASH_IT) -{ - ITStatus bitstatus = RESET; - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_HASH_GET_IT(HASH_IT)); - - - /* Check the status of the specified HASH interrupt */ - tmpreg = HASH->SR; - - if (((HASH->IMR & tmpreg) & HASH_IT) != RESET) - { - /* HASH_IT is set */ - bitstatus = SET; - } - else - { - /* HASH_IT is reset */ - bitstatus = RESET; - } - /* Return the HASH_IT status */ - return bitstatus; -} - -/** - * @brief Clears the HASH interrupt pending bit(s). - * @param HASH_IT: specifies the HASH interrupt pending bit(s) to clear. - * This parameter can be any combination of the following values: - * @arg HASH_IT_DINI: Data Input interrupt - * @arg HASH_IT_DCI: Digest Calculation Completion Interrupt - * @retval None - */ -void HASH_ClearITPendingBit(uint8_t HASH_IT) -{ - /* Check the parameters */ - assert_param(IS_HASH_IT(HASH_IT)); - - /* Clear the selected HASH interrupt pending bit */ - HASH->SR = (uint8_t)~HASH_IT; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_hash.h b/car_hw/src/lib/stdperiph/stm32f4xx_hash.h deleted file mode 100644 index 23d07110dfb..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_hash.h +++ /dev/null @@ -1,244 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hash.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the HASH - * firmware library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HASH_H -#define __STM32F4xx_HASH_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup HASH - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief HASH Init structure definition - */ -typedef struct -{ - uint32_t HASH_AlgoSelection; /*!< SHA-1 or MD5. This parameter can be a value - of @ref HASH_Algo_Selection */ - uint32_t HASH_AlgoMode; /*!< HASH or HMAC. This parameter can be a value - of @ref HASH_processor_Algorithm_Mode */ - uint32_t HASH_DataType; /*!< 32-bit data, 16-bit data, 8-bit data or - bit-string. This parameter can be a value of - @ref HASH_Data_Type */ - uint32_t HASH_HMACKeyType; /*!< HMAC Short key or HMAC Long Key. This parameter - can be a value of @ref HASH_HMAC_Long_key_only_for_HMAC_mode */ -}HASH_InitTypeDef; - -/** - * @brief HASH message digest result structure definition - */ -typedef struct -{ - uint32_t Data[5]; /*!< Message digest result : 5x 32bit words for SHA1 or - 4x 32bit words for MD5 */ -} HASH_MsgDigest; - -/** - * @brief HASH context swapping structure definition - */ -typedef struct -{ - uint32_t HASH_IMR; - uint32_t HASH_STR; - uint32_t HASH_CR; - uint32_t HASH_CSR[51]; -}HASH_Context; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup HASH_Exported_Constants - * @{ - */ - -/** @defgroup HASH_Algo_Selection - * @{ - */ -#define HASH_AlgoSelection_SHA1 ((uint16_t)0x0000) /*!< HASH function is SHA1 */ -#define HASH_AlgoSelection_MD5 ((uint16_t)0x0080) /*!< HASH function is MD5 */ - -#define IS_HASH_ALGOSELECTION(ALGOSELECTION) (((ALGOSELECTION) == HASH_AlgoSelection_SHA1) || \ - ((ALGOSELECTION) == HASH_AlgoSelection_MD5)) -/** - * @} - */ - -/** @defgroup HASH_processor_Algorithm_Mode - * @{ - */ -#define HASH_AlgoMode_HASH ((uint16_t)0x0000) /*!< Algorithm is HASH */ -#define HASH_AlgoMode_HMAC ((uint16_t)0x0040) /*!< Algorithm is HMAC */ - -#define IS_HASH_ALGOMODE(ALGOMODE) (((ALGOMODE) == HASH_AlgoMode_HASH) || \ - ((ALGOMODE) == HASH_AlgoMode_HMAC)) -/** - * @} - */ - -/** @defgroup HASH_Data_Type - * @{ - */ -#define HASH_DataType_32b ((uint16_t)0x0000) -#define HASH_DataType_16b ((uint16_t)0x0010) -#define HASH_DataType_8b ((uint16_t)0x0020) -#define HASH_DataType_1b ((uint16_t)0x0030) - -#define IS_HASH_DATATYPE(DATATYPE) (((DATATYPE) == HASH_DataType_32b)|| \ - ((DATATYPE) == HASH_DataType_16b)|| \ - ((DATATYPE) == HASH_DataType_8b)|| \ - ((DATATYPE) == HASH_DataType_1b)) -/** - * @} - */ - -/** @defgroup HASH_HMAC_Long_key_only_for_HMAC_mode - * @{ - */ -#define HASH_HMACKeyType_ShortKey ((uint32_t)0x00000000) /*!< HMAC Key is <= 64 bytes */ -#define HASH_HMACKeyType_LongKey ((uint32_t)0x00010000) /*!< HMAC Key is > 64 bytes */ - -#define IS_HASH_HMAC_KEYTYPE(KEYTYPE) (((KEYTYPE) == HASH_HMACKeyType_ShortKey) || \ - ((KEYTYPE) == HASH_HMACKeyType_LongKey)) -/** - * @} - */ - -/** @defgroup Number_of_valid_bits_in_last_word_of_the_message - * @{ - */ -#define IS_HASH_VALIDBITSNUMBER(VALIDBITS) ((VALIDBITS) <= 0x1F) - -/** - * @} - */ - -/** @defgroup HASH_interrupts_definition - * @{ - */ -#define HASH_IT_DINI ((uint8_t)0x01) /*!< A new block can be entered into the input buffer (DIN)*/ -#define HASH_IT_DCI ((uint8_t)0x02) /*!< Digest calculation complete */ - -#define IS_HASH_IT(IT) ((((IT) & (uint8_t)0xFC) == 0x00) && ((IT) != 0x00)) -#define IS_HASH_GET_IT(IT) (((IT) == HASH_IT_DINI) || ((IT) == HASH_IT_DCI)) - -/** - * @} - */ - -/** @defgroup HASH_flags_definition - * @{ - */ -#define HASH_FLAG_DINIS ((uint16_t)0x0001) /*!< 16 locations are free in the DIN : A new block can be entered into the input buffer.*/ -#define HASH_FLAG_DCIS ((uint16_t)0x0002) /*!< Digest calculation complete */ -#define HASH_FLAG_DMAS ((uint16_t)0x0004) /*!< DMA interface is enabled (DMAE=1) or a transfer is ongoing */ -#define HASH_FLAG_BUSY ((uint16_t)0x0008) /*!< The hash core is Busy : processing a block of data */ -#define HASH_FLAG_DINNE ((uint16_t)0x1000) /*!< DIN not empty : The input buffer contains at least one word of data */ - -#define IS_HASH_GET_FLAG(FLAG) (((FLAG) == HASH_FLAG_DINIS) || \ - ((FLAG) == HASH_FLAG_DCIS) || \ - ((FLAG) == HASH_FLAG_DMAS) || \ - ((FLAG) == HASH_FLAG_BUSY) || \ - ((FLAG) == HASH_FLAG_DINNE)) - -#define IS_HASH_CLEAR_FLAG(FLAG)(((FLAG) == HASH_FLAG_DINIS) || \ - ((FLAG) == HASH_FLAG_DCIS)) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the HASH configuration to the default reset state ****/ -void HASH_DeInit(void); - -/* HASH Configuration function ************************************************/ -void HASH_Init(HASH_InitTypeDef* HASH_InitStruct); -void HASH_StructInit(HASH_InitTypeDef* HASH_InitStruct); -void HASH_Reset(void); - -/* HASH Message Digest generation functions ***********************************/ -void HASH_DataIn(uint32_t Data); -uint8_t HASH_GetInFIFOWordsNbr(void); -void HASH_SetLastWordValidBitsNbr(uint16_t ValidNumber); -void HASH_StartDigest(void); -void HASH_GetDigest(HASH_MsgDigest* HASH_MessageDigest); - -/* HASH Context swapping functions ********************************************/ -void HASH_SaveContext(HASH_Context* HASH_ContextSave); -void HASH_RestoreContext(HASH_Context* HASH_ContextRestore); - -/* HASH's DMA interface function **********************************************/ -void HASH_DMACmd(FunctionalState NewState); - -/* HASH Interrupts and flags management functions *****************************/ -void HASH_ITConfig(uint8_t HASH_IT, FunctionalState NewState); -FlagStatus HASH_GetFlagStatus(uint16_t HASH_FLAG); -void HASH_ClearFlag(uint16_t HASH_FLAG); -ITStatus HASH_GetITStatus(uint8_t HASH_IT); -void HASH_ClearITPendingBit(uint8_t HASH_IT); - -/* High Level SHA1 functions **************************************************/ -ErrorStatus HASH_SHA1(uint8_t *Input, uint32_t Ilen, uint8_t Output[20]); -ErrorStatus HMAC_SHA1(uint8_t *Key, uint32_t Keylen, - uint8_t *Input, uint32_t Ilen, - uint8_t Output[20]); - -/* High Level MD5 functions ***************************************************/ -ErrorStatus HASH_MD5(uint8_t *Input, uint32_t Ilen, uint8_t Output[16]); -ErrorStatus HMAC_MD5(uint8_t *Key, uint32_t Keylen, - uint8_t *Input, uint32_t Ilen, - uint8_t Output[16]); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_HASH_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_hash_md5.c b/car_hw/src/lib/stdperiph/stm32f4xx_hash_md5.c deleted file mode 100644 index 40e850a4427..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_hash_md5.c +++ /dev/null @@ -1,314 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hash_md5.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides high level functions to compute the HASH MD5 and - * HMAC MD5 Digest of an input message. - * It uses the stm32f4xx_hash.c/.h drivers to access the STM32F4xx HASH - * peripheral. - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - * 1. Enable The HASH controller clock using - * RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_HASH, ENABLE); function. - * - * 2. Calculate the HASH MD5 Digest using HASH_MD5() function. - * - * 3. Calculate the HMAC MD5 Digest using HMAC_MD5() function. - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hash.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup HASH - * @brief HASH driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define MD5BUSY_TIMEOUT ((uint32_t) 0x00010000) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup HASH_Private_Functions - * @{ - */ - -/** @defgroup HASH_Group7 High Level MD5 functions - * @brief High Level MD5 Hash and HMAC functions - * -@verbatim - =============================================================================== - High Level MD5 Hash and HMAC functions - =============================================================================== - - -@endverbatim - * @{ - */ - -/** - * @brief Compute the HASH MD5 digest. - * @param Input: pointer to the Input buffer to be treated. - * @param Ilen: length of the Input buffer. - * @param Output: the returned digest - * @retval An ErrorStatus enumeration value: - * - SUCCESS: digest computation done - * - ERROR: digest computation failed - */ -ErrorStatus HASH_MD5(uint8_t *Input, uint32_t Ilen, uint8_t Output[16]) -{ - HASH_InitTypeDef MD5_HASH_InitStructure; - HASH_MsgDigest MD5_MessageDigest; - __IO uint16_t nbvalidbitsdata = 0; - uint32_t i = 0; - __IO uint32_t counter = 0; - uint32_t busystatus = 0; - ErrorStatus status = SUCCESS; - uint32_t inputaddr = (uint32_t)Input; - uint32_t outputaddr = (uint32_t)Output; - - - /* Number of valid bits in last word of the Input data */ - nbvalidbitsdata = 8 * (Ilen % 4); - - /* HASH peripheral initialization */ - HASH_DeInit(); - - /* HASH Configuration */ - MD5_HASH_InitStructure.HASH_AlgoSelection = HASH_AlgoSelection_MD5; - MD5_HASH_InitStructure.HASH_AlgoMode = HASH_AlgoMode_HASH; - MD5_HASH_InitStructure.HASH_DataType = HASH_DataType_8b; - HASH_Init(&MD5_HASH_InitStructure); - - /* Configure the number of valid bits in last word of the data */ - HASH_SetLastWordValidBitsNbr(nbvalidbitsdata); - - /* Write the Input block in the IN FIFO */ - for(i=0; i 64) - { - /* HMAC long Key */ - MD5_HASH_InitStructure.HASH_HMACKeyType = HASH_HMACKeyType_LongKey; - } - else - { - /* HMAC short Key */ - MD5_HASH_InitStructure.HASH_HMACKeyType = HASH_HMACKeyType_ShortKey; - } - HASH_Init(&MD5_HASH_InitStructure); - - /* Configure the number of valid bits in last word of the Key */ - HASH_SetLastWordValidBitsNbr(nbvalidbitskey); - - /* Write the Key */ - for(i=0; i
© COPYRIGHT 2011 STMicroelectronics
- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_hash.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup HASH - * @brief HASH driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define SHA1BUSY_TIMEOUT ((uint32_t) 0x00010000) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup HASH_Private_Functions - * @{ - */ - -/** @defgroup HASH_Group6 High Level SHA1 functions - * @brief High Level SHA1 Hash and HMAC functions - * -@verbatim - =============================================================================== - High Level SHA1 Hash and HMAC functions - =============================================================================== - - -@endverbatim - * @{ - */ - -/** - * @brief Compute the HASH SHA1 digest. - * @param Input: pointer to the Input buffer to be treated. - * @param Ilen: length of the Input buffer. - * @param Output: the returned digest - * @retval An ErrorStatus enumeration value: - * - SUCCESS: digest computation done - * - ERROR: digest computation failed - */ -ErrorStatus HASH_SHA1(uint8_t *Input, uint32_t Ilen, uint8_t Output[20]) -{ - HASH_InitTypeDef SHA1_HASH_InitStructure; - HASH_MsgDigest SHA1_MessageDigest; - __IO uint16_t nbvalidbitsdata = 0; - uint32_t i = 0; - __IO uint32_t counter = 0; - uint32_t busystatus = 0; - ErrorStatus status = SUCCESS; - uint32_t inputaddr = (uint32_t)Input; - uint32_t outputaddr = (uint32_t)Output; - - /* Number of valid bits in last word of the Input data */ - nbvalidbitsdata = 8 * (Ilen % 4); - - /* HASH peripheral initialization */ - HASH_DeInit(); - - /* HASH Configuration */ - SHA1_HASH_InitStructure.HASH_AlgoSelection = HASH_AlgoSelection_SHA1; - SHA1_HASH_InitStructure.HASH_AlgoMode = HASH_AlgoMode_HASH; - SHA1_HASH_InitStructure.HASH_DataType = HASH_DataType_8b; - HASH_Init(&SHA1_HASH_InitStructure); - - /* Configure the number of valid bits in last word of the data */ - HASH_SetLastWordValidBitsNbr(nbvalidbitsdata); - - /* Write the Input block in the IN FIFO */ - for(i=0; i 64) - { - /* HMAC long Key */ - SHA1_HASH_InitStructure.HASH_HMACKeyType = HASH_HMACKeyType_LongKey; - } - else - { - /* HMAC short Key */ - SHA1_HASH_InitStructure.HASH_HMACKeyType = HASH_HMACKeyType_ShortKey; - } - HASH_Init(&SHA1_HASH_InitStructure); - - /* Configure the number of valid bits in last word of the Key */ - HASH_SetLastWordValidBitsNbr(nbvalidbitskey); - - /* Write the Key */ - for(i=0; iGPIO_Mode = GPIO_Mode_AF - * - Select the type, pull-up/pull-down and output speed via - * GPIO_PuPd, GPIO_OType and GPIO_Speed members - * - Call GPIO_Init() function - * Recommended configuration is Push-Pull, Pull-up, Open-Drain. - * Add an external pull up if necessary (typically 4.7 KOhm). - * - * 4. Program the Mode, duty cycle , Own address, Ack, Speed and Acknowledged - * Address using the I2C_Init() function. - * - * 5. Optionally you can enable/configure the following parameters without - * re-initialization (i.e there is no need to call again I2C_Init() function): - * - Enable the acknowledge feature using I2C_AcknowledgeConfig() function - * - Enable the dual addressing mode using I2C_DualAddressCmd() function - * - Enable the general call using the I2C_GeneralCallCmd() function - * - Enable the clock stretching using I2C_StretchClockCmd() function - * - Enable the fast mode duty cycle using the I2C_FastModeDutyCycleConfig() - * function. - * - Configure the NACK position for Master Receiver mode in case of - * 2 bytes reception using the function I2C_NACKPositionConfig(). - * - Enable the PEC Calculation using I2C_CalculatePEC() function - * - For SMBus Mode: - * - Enable the Address Resolution Protocol (ARP) using I2C_ARPCmd() function - * - Configure the SMBusAlert pin using I2C_SMBusAlertConfig() function - * - * 6. Enable the NVIC and the corresponding interrupt using the function - * I2C_ITConfig() if you need to use interrupt mode. - * - * 7. When using the DMA mode - * - Configure the DMA using DMA_Init() function - * - Active the needed channel Request using I2C_DMACmd() or - * I2C_DMALastTransferCmd() function. - * @note When using DMA mode, I2C interrupts may be used at the same time to - * control the communication flow (Start/Stop/Ack... events and errors). - * - * 8. Enable the I2C using the I2C_Cmd() function. - * - * 9. Enable the DMA using the DMA_Cmd() function when using DMA mode in the - * transfers. - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_i2c.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup I2C - * @brief I2C driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -#define CR1_CLEAR_MASK ((uint16_t)0xFBF5) /*I2C_ClockSpeed)); - assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode)); - assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle)); - assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1)); - assert_param(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack)); - assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress)); - -/*---------------------------- I2Cx CR2 Configuration ------------------------*/ - /* Get the I2Cx CR2 value */ - tmpreg = I2Cx->CR2; - /* Clear frequency FREQ[5:0] bits */ - tmpreg &= (uint16_t)~((uint16_t)I2C_CR2_FREQ); - /* Get pclk1 frequency value */ - RCC_GetClocksFreq(&rcc_clocks); - pclk1 = rcc_clocks.PCLK1_Frequency; - /* Set frequency bits depending on pclk1 value */ - freqrange = (uint16_t)(pclk1 / 1000000); - tmpreg |= freqrange; - /* Write to I2Cx CR2 */ - I2Cx->CR2 = tmpreg; - -/*---------------------------- I2Cx CCR Configuration ------------------------*/ - /* Disable the selected I2C peripheral to configure TRISE */ - I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_PE); - /* Reset tmpreg value */ - /* Clear F/S, DUTY and CCR[11:0] bits */ - tmpreg = 0; - - /* Configure speed in standard mode */ - if (I2C_InitStruct->I2C_ClockSpeed <= 100000) - { - /* Standard mode speed calculate */ - result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1)); - /* Test if CCR value is under 0x4*/ - if (result < 0x04) - { - /* Set minimum allowed value */ - result = 0x04; - } - /* Set speed value for standard mode */ - tmpreg |= result; - /* Set Maximum Rise Time for standard mode */ - I2Cx->TRISE = freqrange + 1; - } - /* Configure speed in fast mode */ - /* To use the I2C at 400 KHz (in fast mode), the PCLK1 frequency (I2C peripheral - input clock) must be a multiple of 10 MHz */ - else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/ - { - if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2) - { - /* Fast mode speed calculate: Tlow/Thigh = 2 */ - result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3)); - } - else /*I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_16_9*/ - { - /* Fast mode speed calculate: Tlow/Thigh = 16/9 */ - result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25)); - /* Set DUTY bit */ - result |= I2C_DutyCycle_16_9; - } - - /* Test if CCR value is under 0x1*/ - if ((result & I2C_CCR_CCR) == 0) - { - /* Set minimum allowed value */ - result |= (uint16_t)0x0001; - } - /* Set speed value and set F/S bit for fast mode */ - tmpreg |= (uint16_t)(result | I2C_CCR_FS); - /* Set Maximum Rise Time for fast mode */ - I2Cx->TRISE = (uint16_t)(((freqrange * (uint16_t)300) / (uint16_t)1000) + (uint16_t)1); - } - - /* Write to I2Cx CCR */ - I2Cx->CCR = tmpreg; - /* Enable the selected I2C peripheral */ - I2Cx->CR1 |= I2C_CR1_PE; - -/*---------------------------- I2Cx CR1 Configuration ------------------------*/ - /* Get the I2Cx CR1 value */ - tmpreg = I2Cx->CR1; - /* Clear ACK, SMBTYPE and SMBUS bits */ - tmpreg &= CR1_CLEAR_MASK; - /* Configure I2Cx: mode and acknowledgement */ - /* Set SMBTYPE and SMBUS bits according to I2C_Mode value */ - /* Set ACK bit according to I2C_Ack value */ - tmpreg |= (uint16_t)((uint32_t)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack); - /* Write to I2Cx CR1 */ - I2Cx->CR1 = tmpreg; - -/*---------------------------- I2Cx OAR1 Configuration -----------------------*/ - /* Set I2Cx Own Address1 and acknowledged address */ - I2Cx->OAR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1); -} - -/** - * @brief Fills each I2C_InitStruct member with its default value. - * @param I2C_InitStruct: pointer to an I2C_InitTypeDef structure which will be initialized. - * @retval None - */ -void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct) -{ -/*---------------- Reset I2C init structure parameters values ----------------*/ - /* initialize the I2C_ClockSpeed member */ - I2C_InitStruct->I2C_ClockSpeed = 5000; - /* Initialize the I2C_Mode member */ - I2C_InitStruct->I2C_Mode = I2C_Mode_I2C; - /* Initialize the I2C_DutyCycle member */ - I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2; - /* Initialize the I2C_OwnAddress1 member */ - I2C_InitStruct->I2C_OwnAddress1 = 0; - /* Initialize the I2C_Ack member */ - I2C_InitStruct->I2C_Ack = I2C_Ack_Disable; - /* Initialize the I2C_AcknowledgedAddress member */ - I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; -} - -/** - * @brief Enables or disables the specified I2C peripheral. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2Cx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected I2C peripheral */ - I2Cx->CR1 |= I2C_CR1_PE; - } - else - { - /* Disable the selected I2C peripheral */ - I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_PE); - } -} - -/** - * @brief Generates I2Cx communication START condition. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2C START condition generation. - * This parameter can be: ENABLE or DISABLE. - * @retval None. - */ -void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Generate a START condition */ - I2Cx->CR1 |= I2C_CR1_START; - } - else - { - /* Disable the START condition generation */ - I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_START); - } -} - -/** - * @brief Generates I2Cx communication STOP condition. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2C STOP condition generation. - * This parameter can be: ENABLE or DISABLE. - * @retval None. - */ -void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Generate a STOP condition */ - I2Cx->CR1 |= I2C_CR1_STOP; - } - else - { - /* Disable the STOP condition generation */ - I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_STOP); - } -} - -/** - * @brief Transmits the address byte to select the slave device. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param Address: specifies the slave address which will be transmitted - * @param I2C_Direction: specifies whether the I2C device will be a Transmitter - * or a Receiver. - * This parameter can be one of the following values - * @arg I2C_Direction_Transmitter: Transmitter mode - * @arg I2C_Direction_Receiver: Receiver mode - * @retval None. - */ -void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_DIRECTION(I2C_Direction)); - /* Test on the direction to set/reset the read/write bit */ - if (I2C_Direction != I2C_Direction_Transmitter) - { - /* Set the address bit0 for read */ - Address |= I2C_OAR1_ADD0; - } - else - { - /* Reset the address bit0 for write */ - Address &= (uint8_t)~((uint8_t)I2C_OAR1_ADD0); - } - /* Send the address */ - I2Cx->DR = Address; -} - -/** - * @brief Enables or disables the specified I2C acknowledge feature. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2C Acknowledgement. - * This parameter can be: ENABLE or DISABLE. - * @retval None. - */ -void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the acknowledgement */ - I2Cx->CR1 |= I2C_CR1_ACK; - } - else - { - /* Disable the acknowledgement */ - I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_ACK); - } -} - -/** - * @brief Configures the specified I2C own address2. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param Address: specifies the 7bit I2C own address2. - * @retval None. - */ -void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address) -{ - uint16_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - - /* Get the old register value */ - tmpreg = I2Cx->OAR2; - - /* Reset I2Cx Own address2 bit [7:1] */ - tmpreg &= (uint16_t)~((uint16_t)I2C_OAR2_ADD2); - - /* Set I2Cx Own address2 */ - tmpreg |= (uint16_t)((uint16_t)Address & (uint16_t)0x00FE); - - /* Store the new register value */ - I2Cx->OAR2 = tmpreg; -} - -/** - * @brief Enables or disables the specified I2C dual addressing mode. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2C dual addressing mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable dual addressing mode */ - I2Cx->OAR2 |= I2C_OAR2_ENDUAL; - } - else - { - /* Disable dual addressing mode */ - I2Cx->OAR2 &= (uint16_t)~((uint16_t)I2C_OAR2_ENDUAL); - } -} - -/** - * @brief Enables or disables the specified I2C general call feature. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2C General call. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable generall call */ - I2Cx->CR1 |= I2C_CR1_ENGC; - } - else - { - /* Disable generall call */ - I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_ENGC); - } -} - -/** - * @brief Enables or disables the specified I2C software reset. - * @note When software reset is enabled, the I2C IOs are released (this can - * be useful to recover from bus errors). - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2C software reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Peripheral under reset */ - I2Cx->CR1 |= I2C_CR1_SWRST; - } - else - { - /* Peripheral not under reset */ - I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_SWRST); - } -} - -/** - * @brief Enables or disables the specified I2C Clock stretching. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2Cx Clock stretching. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState == DISABLE) - { - /* Enable the selected I2C Clock stretching */ - I2Cx->CR1 |= I2C_CR1_NOSTRETCH; - } - else - { - /* Disable the selected I2C Clock stretching */ - I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_NOSTRETCH); - } -} - -/** - * @brief Selects the specified I2C fast mode duty cycle. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param I2C_DutyCycle: specifies the fast mode duty cycle. - * This parameter can be one of the following values: - * @arg I2C_DutyCycle_2: I2C fast mode Tlow/Thigh = 2 - * @arg I2C_DutyCycle_16_9: I2C fast mode Tlow/Thigh = 16/9 - * @retval None - */ -void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_DUTY_CYCLE(I2C_DutyCycle)); - if (I2C_DutyCycle != I2C_DutyCycle_16_9) - { - /* I2C fast mode Tlow/Thigh=2 */ - I2Cx->CCR &= I2C_DutyCycle_2; - } - else - { - /* I2C fast mode Tlow/Thigh=16/9 */ - I2Cx->CCR |= I2C_DutyCycle_16_9; - } -} - -/** - * @brief Selects the specified I2C NACK position in master receiver mode. - * @note This function is useful in I2C Master Receiver mode when the number - * of data to be received is equal to 2. In this case, this function - * should be called (with parameter I2C_NACKPosition_Next) before data - * reception starts,as described in the 2-byte reception procedure - * recommended in Reference Manual in Section: Master receiver. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param I2C_NACKPosition: specifies the NACK position. - * This parameter can be one of the following values: - * @arg I2C_NACKPosition_Next: indicates that the next byte will be the last - * received byte. - * @arg I2C_NACKPosition_Current: indicates that current byte is the last - * received byte. - * - * @note This function configures the same bit (POS) as I2C_PECPositionConfig() - * but is intended to be used in I2C mode while I2C_PECPositionConfig() - * is intended to used in SMBUS mode. - * - * @retval None - */ -void I2C_NACKPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_NACKPosition) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_NACK_POSITION(I2C_NACKPosition)); - - /* Check the input parameter */ - if (I2C_NACKPosition == I2C_NACKPosition_Next) - { - /* Next byte in shift register is the last received byte */ - I2Cx->CR1 |= I2C_NACKPosition_Next; - } - else - { - /* Current byte in shift register is the last received byte */ - I2Cx->CR1 &= I2C_NACKPosition_Current; - } -} - -/** - * @brief Drives the SMBusAlert pin high or low for the specified I2C. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param I2C_SMBusAlert: specifies SMBAlert pin level. - * This parameter can be one of the following values: - * @arg I2C_SMBusAlert_Low: SMBAlert pin driven low - * @arg I2C_SMBusAlert_High: SMBAlert pin driven high - * @retval None - */ -void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_SMBUS_ALERT(I2C_SMBusAlert)); - if (I2C_SMBusAlert == I2C_SMBusAlert_Low) - { - /* Drive the SMBusAlert pin Low */ - I2Cx->CR1 |= I2C_SMBusAlert_Low; - } - else - { - /* Drive the SMBusAlert pin High */ - I2Cx->CR1 &= I2C_SMBusAlert_High; - } -} - -/** - * @brief Enables or disables the specified I2C ARP. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2Cx ARP. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected I2C ARP */ - I2Cx->CR1 |= I2C_CR1_ENARP; - } - else - { - /* Disable the selected I2C ARP */ - I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_ENARP); - } -} -/** - * @} - */ - -/** @defgroup I2C_Group2 Data transfers functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - Data transfers functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Sends a data byte through the I2Cx peripheral. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param Data: Byte to be transmitted.. - * @retval None - */ -void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - /* Write in the DR register the data to be sent */ - I2Cx->DR = Data; -} - -/** - * @brief Returns the most recent received data by the I2Cx peripheral. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @retval The value of the received data. - */ -uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - /* Return the data in the DR register */ - return (uint8_t)I2Cx->DR; -} - -/** - * @} - */ - -/** @defgroup I2C_Group3 PEC management functions - * @brief PEC management functions - * -@verbatim - =============================================================================== - PEC management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified I2C PEC transfer. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2C PEC transmission. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected I2C PEC transmission */ - I2Cx->CR1 |= I2C_CR1_PEC; - } - else - { - /* Disable the selected I2C PEC transmission */ - I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_PEC); - } -} - -/** - * @brief Selects the specified I2C PEC position. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param I2C_PECPosition: specifies the PEC position. - * This parameter can be one of the following values: - * @arg I2C_PECPosition_Next: indicates that the next byte is PEC - * @arg I2C_PECPosition_Current: indicates that current byte is PEC - * - * @note This function configures the same bit (POS) as I2C_NACKPositionConfig() - * but is intended to be used in SMBUS mode while I2C_NACKPositionConfig() - * is intended to used in I2C mode. - * - * @retval None - */ -void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_PEC_POSITION(I2C_PECPosition)); - if (I2C_PECPosition == I2C_PECPosition_Next) - { - /* Next byte in shift register is PEC */ - I2Cx->CR1 |= I2C_PECPosition_Next; - } - else - { - /* Current byte in shift register is PEC */ - I2Cx->CR1 &= I2C_PECPosition_Current; - } -} - -/** - * @brief Enables or disables the PEC value calculation of the transferred bytes. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2Cx PEC value calculation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected I2C PEC calculation */ - I2Cx->CR1 |= I2C_CR1_ENPEC; - } - else - { - /* Disable the selected I2C PEC calculation */ - I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_ENPEC); - } -} - -/** - * @brief Returns the PEC value for the specified I2C. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @retval The PEC value. - */ -uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - /* Return the selected I2C PEC value */ - return ((I2Cx->SR2) >> 8); -} - -/** - * @} - */ - -/** @defgroup I2C_Group4 DMA transfers management functions - * @brief DMA transfers management functions - * -@verbatim - =============================================================================== - DMA transfers management functions - =============================================================================== - This section provides functions allowing to configure the I2C DMA channels - requests. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified I2C DMA requests. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2C DMA transfer. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected I2C DMA requests */ - I2Cx->CR2 |= I2C_CR2_DMAEN; - } - else - { - /* Disable the selected I2C DMA requests */ - I2Cx->CR2 &= (uint16_t)~((uint16_t)I2C_CR2_DMAEN); - } -} - -/** - * @brief Specifies that the next DMA transfer is the last one. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param NewState: new state of the I2C DMA last transfer. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Next DMA transfer is the last transfer */ - I2Cx->CR2 |= I2C_CR2_LAST; - } - else - { - /* Next DMA transfer is not the last transfer */ - I2Cx->CR2 &= (uint16_t)~((uint16_t)I2C_CR2_LAST); - } -} - -/** - * @} - */ - -/** @defgroup I2C_Group5 Interrupts events and flags management functions - * @brief Interrupts, events and flags management functions - * -@verbatim - =============================================================================== - Interrupts, events and flags management functions - =============================================================================== - This section provides functions allowing to configure the I2C Interrupts - sources and check or clear the flags or pending bits status. - The user should identify which mode will be used in his application to manage - the communication: Polling mode, Interrupt mode or DMA mode. - - =============================================================================== - I2C State Monitoring Functions - =============================================================================== - This I2C driver provides three different ways for I2C state monitoring - depending on the application requirements and constraints: - - - 1. Basic state monitoring (Using I2C_CheckEvent() function) - ----------------------------------------------------------- - It compares the status registers (SR1 and SR2) content to a given event - (can be the combination of one or more flags). - It returns SUCCESS if the current status includes the given flags - and returns ERROR if one or more flags are missing in the current status. - - - When to use - - This function is suitable for most applications as well as for startup - activity since the events are fully described in the product reference - manual (RM0090). - - It is also suitable for users who need to define their own events. - - - Limitations - - If an error occurs (ie. error flags are set besides to the monitored - flags), the I2C_CheckEvent() function may return SUCCESS despite - the communication hold or corrupted real state. - In this case, it is advised to use error interrupts to monitor - the error events and handle them in the interrupt IRQ handler. - - @note - For error management, it is advised to use the following functions: - - I2C_ITConfig() to configure and enable the error interrupts (I2C_IT_ERR). - - I2Cx_ER_IRQHandler() which is called when the error interrupt occurs. - Where x is the peripheral instance (I2C1, I2C2 ...) - - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into the - I2Cx_ER_IRQHandler() function in order to determine which error occurred. - - I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd() - and/or I2C_GenerateStop() in order to clear the error flag and source - and return to correct communication status. - - - 2. Advanced state monitoring (Using the function I2C_GetLastEvent()) - -------------------------------------------------------------------- - Using the function I2C_GetLastEvent() which returns the image of both status - registers in a single word (uint32_t) (Status Register 2 value is shifted left - by 16 bits and concatenated to Status Register 1). - - - When to use - - This function is suitable for the same applications above but it - allows to overcome the mentioned limitation of I2C_GetFlagStatus() - function. - - The returned value could be compared to events already defined in - the library (stm32f4xx_i2c.h) or to custom values defined by user. - This function is suitable when multiple flags are monitored at the - same time. - - At the opposite of I2C_CheckEvent() function, this function allows - user to choose when an event is accepted (when all events flags are - set and no other flags are set or just when the needed flags are set - like I2C_CheckEvent() function. - - - Limitations - - User may need to define his own events. - - Same remark concerning the error management is applicable for this - function if user decides to check only regular communication flags - (and ignores error flags). - - - 3. Flag-based state monitoring (Using the function I2C_GetFlagStatus()) - ----------------------------------------------------------------------- - - Using the function I2C_GetFlagStatus() which simply returns the status of - one single flag (ie. I2C_FLAG_RXNE ...). - - - When to use - - This function could be used for specific applications or in debug - phase. - - It is suitable when only one flag checking is needed (most I2C - events are monitored through multiple flags). - - Limitations: - - When calling this function, the Status register is accessed. - Some flags are cleared when the status register is accessed. - So checking the status of one Flag, may clear other ones. - - Function may need to be called twice or more in order to monitor - one single event. - - For detailed description of Events, please refer to section I2C_Events in - stm32f4xx_i2c.h file. - -@endverbatim - * @{ - */ - -/** - * @brief Reads the specified I2C register and returns its value. - * @param I2C_Register: specifies the register to read. - * This parameter can be one of the following values: - * @arg I2C_Register_CR1: CR1 register. - * @arg I2C_Register_CR2: CR2 register. - * @arg I2C_Register_OAR1: OAR1 register. - * @arg I2C_Register_OAR2: OAR2 register. - * @arg I2C_Register_DR: DR register. - * @arg I2C_Register_SR1: SR1 register. - * @arg I2C_Register_SR2: SR2 register. - * @arg I2C_Register_CCR: CCR register. - * @arg I2C_Register_TRISE: TRISE register. - * @retval The value of the read register. - */ -uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_REGISTER(I2C_Register)); - - tmp = (uint32_t) I2Cx; - tmp += I2C_Register; - - /* Return the selected register value */ - return (*(__IO uint16_t *) tmp); -} - -/** - * @brief Enables or disables the specified I2C interrupts. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param I2C_IT: specifies the I2C interrupts sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg I2C_IT_BUF: Buffer interrupt mask - * @arg I2C_IT_EVT: Event interrupt mask - * @arg I2C_IT_ERR: Error interrupt mask - * @param NewState: new state of the specified I2C interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_I2C_CONFIG_IT(I2C_IT)); - - if (NewState != DISABLE) - { - /* Enable the selected I2C interrupts */ - I2Cx->CR2 |= I2C_IT; - } - else - { - /* Disable the selected I2C interrupts */ - I2Cx->CR2 &= (uint16_t)~I2C_IT; - } -} - -/* - =============================================================================== - 1. Basic state monitoring - =============================================================================== - */ - -/** - * @brief Checks whether the last I2Cx Event is equal to the one passed - * as parameter. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param I2C_EVENT: specifies the event to be checked. - * This parameter can be one of the following values: - * @arg I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: EV1 - * @arg I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: EV1 - * @arg I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED: EV1 - * @arg I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED: EV1 - * @arg I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED: EV1 - * @arg I2C_EVENT_SLAVE_BYTE_RECEIVED: EV2 - * @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF): EV2 - * @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL): EV2 - * @arg I2C_EVENT_SLAVE_BYTE_TRANSMITTED: EV3 - * @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF): EV3 - * @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL): EV3 - * @arg I2C_EVENT_SLAVE_ACK_FAILURE: EV3_2 - * @arg I2C_EVENT_SLAVE_STOP_DETECTED: EV4 - * @arg I2C_EVENT_MASTER_MODE_SELECT: EV5 - * @arg I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: EV6 - * @arg I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED: EV6 - * @arg I2C_EVENT_MASTER_BYTE_RECEIVED: EV7 - * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTING: EV8 - * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTED: EV8_2 - * @arg I2C_EVENT_MASTER_MODE_ADDRESS10: EV9 - * - * @note For detailed description of Events, please refer to section I2C_Events - * in stm32f4xx_i2c.h file. - * - * @retval An ErrorStatus enumeration value: - * - SUCCESS: Last event is equal to the I2C_EVENT - * - ERROR: Last event is different from the I2C_EVENT - */ -ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT) -{ - uint32_t lastevent = 0; - uint32_t flag1 = 0, flag2 = 0; - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_EVENT(I2C_EVENT)); - - /* Read the I2Cx status register */ - flag1 = I2Cx->SR1; - flag2 = I2Cx->SR2; - flag2 = flag2 << 16; - - /* Get the last event value from I2C status register */ - lastevent = (flag1 | flag2) & FLAG_MASK; - - /* Check whether the last event contains the I2C_EVENT */ - if ((lastevent & I2C_EVENT) == I2C_EVENT) - { - /* SUCCESS: last event is equal to I2C_EVENT */ - status = SUCCESS; - } - else - { - /* ERROR: last event is different from I2C_EVENT */ - status = ERROR; - } - /* Return status */ - return status; -} - -/* - =============================================================================== - 2. Advanced state monitoring - =============================================================================== - */ - -/** - * @brief Returns the last I2Cx Event. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * - * @note For detailed description of Events, please refer to section I2C_Events - * in stm32f4xx_i2c.h file. - * - * @retval The last event - */ -uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx) -{ - uint32_t lastevent = 0; - uint32_t flag1 = 0, flag2 = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - - /* Read the I2Cx status register */ - flag1 = I2Cx->SR1; - flag2 = I2Cx->SR2; - flag2 = flag2 << 16; - - /* Get the last event value from I2C status register */ - lastevent = (flag1 | flag2) & FLAG_MASK; - - /* Return status */ - return lastevent; -} - -/* - =============================================================================== - 3. Flag-based state monitoring - =============================================================================== - */ - -/** - * @brief Checks whether the specified I2C flag is set or not. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param I2C_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg I2C_FLAG_DUALF: Dual flag (Slave mode) - * @arg I2C_FLAG_SMBHOST: SMBus host header (Slave mode) - * @arg I2C_FLAG_SMBDEFAULT: SMBus default header (Slave mode) - * @arg I2C_FLAG_GENCALL: General call header flag (Slave mode) - * @arg I2C_FLAG_TRA: Transmitter/Receiver flag - * @arg I2C_FLAG_BUSY: Bus busy flag - * @arg I2C_FLAG_MSL: Master/Slave flag - * @arg I2C_FLAG_SMBALERT: SMBus Alert flag - * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag - * @arg I2C_FLAG_PECERR: PEC error in reception flag - * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) - * @arg I2C_FLAG_AF: Acknowledge failure flag - * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) - * @arg I2C_FLAG_BERR: Bus error flag - * @arg I2C_FLAG_TXE: Data register empty flag (Transmitter) - * @arg I2C_FLAG_RXNE: Data register not empty (Receiver) flag - * @arg I2C_FLAG_STOPF: Stop detection flag (Slave mode) - * @arg I2C_FLAG_ADD10: 10-bit header sent flag (Master mode) - * @arg I2C_FLAG_BTF: Byte transfer finished flag - * @arg I2C_FLAG_ADDR: Address sent flag (Master mode) "ADSL" - * Address matched flag (Slave mode)"ENDAD" - * @arg I2C_FLAG_SB: Start bit flag (Master mode) - * @retval The new state of I2C_FLAG (SET or RESET). - */ -FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) -{ - FlagStatus bitstatus = RESET; - __IO uint32_t i2creg = 0, i2cxbase = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_GET_FLAG(I2C_FLAG)); - - /* Get the I2Cx peripheral base address */ - i2cxbase = (uint32_t)I2Cx; - - /* Read flag register index */ - i2creg = I2C_FLAG >> 28; - - /* Get bit[23:0] of the flag */ - I2C_FLAG &= FLAG_MASK; - - if(i2creg != 0) - { - /* Get the I2Cx SR1 register address */ - i2cxbase += 0x14; - } - else - { - /* Flag in I2Cx SR2 Register */ - I2C_FLAG = (uint32_t)(I2C_FLAG >> 16); - /* Get the I2Cx SR2 register address */ - i2cxbase += 0x18; - } - - if(((*(__IO uint32_t *)i2cxbase) & I2C_FLAG) != (uint32_t)RESET) - { - /* I2C_FLAG is set */ - bitstatus = SET; - } - else - { - /* I2C_FLAG is reset */ - bitstatus = RESET; - } - - /* Return the I2C_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the I2Cx's pending flags. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param I2C_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg I2C_FLAG_SMBALERT: SMBus Alert flag - * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag - * @arg I2C_FLAG_PECERR: PEC error in reception flag - * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) - * @arg I2C_FLAG_AF: Acknowledge failure flag - * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) - * @arg I2C_FLAG_BERR: Bus error flag - * - * @note STOPF (STOP detection) is cleared by software sequence: a read operation - * to I2C_SR1 register (I2C_GetFlagStatus()) followed by a write operation - * to I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral). - * @note ADD10 (10-bit header sent) is cleared by software sequence: a read - * operation to I2C_SR1 (I2C_GetFlagStatus()) followed by writing the - * second byte of the address in DR register. - * @note BTF (Byte Transfer Finished) is cleared by software sequence: a read - * operation to I2C_SR1 register (I2C_GetFlagStatus()) followed by a - * read/write to I2C_DR register (I2C_SendData()). - * @note ADDR (Address sent) is cleared by software sequence: a read operation to - * I2C_SR1 register (I2C_GetFlagStatus()) followed by a read operation to - * I2C_SR2 register ((void)(I2Cx->SR2)). - * @note SB (Start Bit) is cleared software sequence: a read operation to I2C_SR1 - * register (I2C_GetFlagStatus()) followed by a write operation to I2C_DR - * register (I2C_SendData()). - * - * @retval None - */ -void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG) -{ - uint32_t flagpos = 0; - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_CLEAR_FLAG(I2C_FLAG)); - /* Get the I2C flag position */ - flagpos = I2C_FLAG & FLAG_MASK; - /* Clear the selected I2C flag */ - I2Cx->SR1 = (uint16_t)~flagpos; -} - -/** - * @brief Checks whether the specified I2C interrupt has occurred or not. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param I2C_IT: specifies the interrupt source to check. - * This parameter can be one of the following values: - * @arg I2C_IT_SMBALERT: SMBus Alert flag - * @arg I2C_IT_TIMEOUT: Timeout or Tlow error flag - * @arg I2C_IT_PECERR: PEC error in reception flag - * @arg I2C_IT_OVR: Overrun/Underrun flag (Slave mode) - * @arg I2C_IT_AF: Acknowledge failure flag - * @arg I2C_IT_ARLO: Arbitration lost flag (Master mode) - * @arg I2C_IT_BERR: Bus error flag - * @arg I2C_IT_TXE: Data register empty flag (Transmitter) - * @arg I2C_IT_RXNE: Data register not empty (Receiver) flag - * @arg I2C_IT_STOPF: Stop detection flag (Slave mode) - * @arg I2C_IT_ADD10: 10-bit header sent flag (Master mode) - * @arg I2C_IT_BTF: Byte transfer finished flag - * @arg I2C_IT_ADDR: Address sent flag (Master mode) "ADSL" - * Address matched flag (Slave mode)"ENDAD" - * @arg I2C_IT_SB: Start bit flag (Master mode) - * @retval The new state of I2C_IT (SET or RESET). - */ -ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT) -{ - ITStatus bitstatus = RESET; - uint32_t enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_GET_IT(I2C_IT)); - - /* Check if the interrupt source is enabled or not */ - enablestatus = (uint32_t)(((I2C_IT & ITEN_MASK) >> 16) & (I2Cx->CR2)) ; - - /* Get bit[23:0] of the flag */ - I2C_IT &= FLAG_MASK; - - /* Check the status of the specified I2C flag */ - if (((I2Cx->SR1 & I2C_IT) != (uint32_t)RESET) && enablestatus) - { - /* I2C_IT is set */ - bitstatus = SET; - } - else - { - /* I2C_IT is reset */ - bitstatus = RESET; - } - /* Return the I2C_IT status */ - return bitstatus; -} - -/** - * @brief Clears the I2Cx's interrupt pending bits. - * @param I2Cx: where x can be 1, 2 or 3 to select the I2C peripheral. - * @param I2C_IT: specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg I2C_IT_SMBALERT: SMBus Alert interrupt - * @arg I2C_IT_TIMEOUT: Timeout or Tlow error interrupt - * @arg I2C_IT_PECERR: PEC error in reception interrupt - * @arg I2C_IT_OVR: Overrun/Underrun interrupt (Slave mode) - * @arg I2C_IT_AF: Acknowledge failure interrupt - * @arg I2C_IT_ARLO: Arbitration lost interrupt (Master mode) - * @arg I2C_IT_BERR: Bus error interrupt - * - * @note STOPF (STOP detection) is cleared by software sequence: a read operation - * to I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to - * I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral). - * @note ADD10 (10-bit header sent) is cleared by software sequence: a read - * operation to I2C_SR1 (I2C_GetITStatus()) followed by writing the second - * byte of the address in I2C_DR register. - * @note BTF (Byte Transfer Finished) is cleared by software sequence: a read - * operation to I2C_SR1 register (I2C_GetITStatus()) followed by a - * read/write to I2C_DR register (I2C_SendData()). - * @note ADDR (Address sent) is cleared by software sequence: a read operation to - * I2C_SR1 register (I2C_GetITStatus()) followed by a read operation to - * I2C_SR2 register ((void)(I2Cx->SR2)). - * @note SB (Start Bit) is cleared by software sequence: a read operation to - * I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to - * I2C_DR register (I2C_SendData()). - * @retval None - */ -void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT) -{ - uint32_t flagpos = 0; - /* Check the parameters */ - assert_param(IS_I2C_ALL_PERIPH(I2Cx)); - assert_param(IS_I2C_CLEAR_IT(I2C_IT)); - - /* Get the I2C flag position */ - flagpos = I2C_IT & FLAG_MASK; - - /* Clear the selected I2C flag */ - I2Cx->SR1 = (uint16_t)~flagpos; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_i2c.h b/car_hw/src/lib/stdperiph/stm32f4xx_i2c.h deleted file mode 100644 index c782c3b956f..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_i2c.h +++ /dev/null @@ -1,692 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_i2c.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the I2C firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_I2C_H -#define __STM32F4xx_I2C_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup I2C - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief I2C Init structure definition - */ - -typedef struct -{ - uint32_t I2C_ClockSpeed; /*!< Specifies the clock frequency. - This parameter must be set to a value lower than 400kHz */ - - uint16_t I2C_Mode; /*!< Specifies the I2C mode. - This parameter can be a value of @ref I2C_mode */ - - uint16_t I2C_DutyCycle; /*!< Specifies the I2C fast mode duty cycle. - This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ - - uint16_t I2C_OwnAddress1; /*!< Specifies the first device own address. - This parameter can be a 7-bit or 10-bit address. */ - - uint16_t I2C_Ack; /*!< Enables or disables the acknowledgement. - This parameter can be a value of @ref I2C_acknowledgement */ - - uint16_t I2C_AcknowledgedAddress; /*!< Specifies if 7-bit or 10-bit address is acknowledged. - This parameter can be a value of @ref I2C_acknowledged_address */ -}I2C_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - - -/** @defgroup I2C_Exported_Constants - * @{ - */ - -#define IS_I2C_ALL_PERIPH(PERIPH) (((PERIPH) == I2C1) || \ - ((PERIPH) == I2C2) || \ - ((PERIPH) == I2C3)) -/** @defgroup I2C_mode - * @{ - */ - -#define I2C_Mode_I2C ((uint16_t)0x0000) -#define I2C_Mode_SMBusDevice ((uint16_t)0x0002) -#define I2C_Mode_SMBusHost ((uint16_t)0x000A) -#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \ - ((MODE) == I2C_Mode_SMBusDevice) || \ - ((MODE) == I2C_Mode_SMBusHost)) -/** - * @} - */ - -/** @defgroup I2C_duty_cycle_in_fast_mode - * @{ - */ - -#define I2C_DutyCycle_16_9 ((uint16_t)0x4000) /*!< I2C fast mode Tlow/Thigh = 16/9 */ -#define I2C_DutyCycle_2 ((uint16_t)0xBFFF) /*!< I2C fast mode Tlow/Thigh = 2 */ -#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DutyCycle_16_9) || \ - ((CYCLE) == I2C_DutyCycle_2)) -/** - * @} - */ - -/** @defgroup I2C_acknowledgement - * @{ - */ - -#define I2C_Ack_Enable ((uint16_t)0x0400) -#define I2C_Ack_Disable ((uint16_t)0x0000) -#define IS_I2C_ACK_STATE(STATE) (((STATE) == I2C_Ack_Enable) || \ - ((STATE) == I2C_Ack_Disable)) -/** - * @} - */ - -/** @defgroup I2C_transfer_direction - * @{ - */ - -#define I2C_Direction_Transmitter ((uint8_t)0x00) -#define I2C_Direction_Receiver ((uint8_t)0x01) -#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \ - ((DIRECTION) == I2C_Direction_Receiver)) -/** - * @} - */ - -/** @defgroup I2C_acknowledged_address - * @{ - */ - -#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000) -#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000) -#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \ - ((ADDRESS) == I2C_AcknowledgedAddress_10bit)) -/** - * @} - */ - -/** @defgroup I2C_registers - * @{ - */ - -#define I2C_Register_CR1 ((uint8_t)0x00) -#define I2C_Register_CR2 ((uint8_t)0x04) -#define I2C_Register_OAR1 ((uint8_t)0x08) -#define I2C_Register_OAR2 ((uint8_t)0x0C) -#define I2C_Register_DR ((uint8_t)0x10) -#define I2C_Register_SR1 ((uint8_t)0x14) -#define I2C_Register_SR2 ((uint8_t)0x18) -#define I2C_Register_CCR ((uint8_t)0x1C) -#define I2C_Register_TRISE ((uint8_t)0x20) -#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \ - ((REGISTER) == I2C_Register_CR2) || \ - ((REGISTER) == I2C_Register_OAR1) || \ - ((REGISTER) == I2C_Register_OAR2) || \ - ((REGISTER) == I2C_Register_DR) || \ - ((REGISTER) == I2C_Register_SR1) || \ - ((REGISTER) == I2C_Register_SR2) || \ - ((REGISTER) == I2C_Register_CCR) || \ - ((REGISTER) == I2C_Register_TRISE)) -/** - * @} - */ - -/** @defgroup I2C_NACK_position - * @{ - */ - -#define I2C_NACKPosition_Next ((uint16_t)0x0800) -#define I2C_NACKPosition_Current ((uint16_t)0xF7FF) -#define IS_I2C_NACK_POSITION(POSITION) (((POSITION) == I2C_NACKPosition_Next) || \ - ((POSITION) == I2C_NACKPosition_Current)) -/** - * @} - */ - -/** @defgroup I2C_SMBus_alert_pin_level - * @{ - */ - -#define I2C_SMBusAlert_Low ((uint16_t)0x2000) -#define I2C_SMBusAlert_High ((uint16_t)0xDFFF) -#define IS_I2C_SMBUS_ALERT(ALERT) (((ALERT) == I2C_SMBusAlert_Low) || \ - ((ALERT) == I2C_SMBusAlert_High)) -/** - * @} - */ - -/** @defgroup I2C_PEC_position - * @{ - */ - -#define I2C_PECPosition_Next ((uint16_t)0x0800) -#define I2C_PECPosition_Current ((uint16_t)0xF7FF) -#define IS_I2C_PEC_POSITION(POSITION) (((POSITION) == I2C_PECPosition_Next) || \ - ((POSITION) == I2C_PECPosition_Current)) -/** - * @} - */ - -/** @defgroup I2C_interrupts_definition - * @{ - */ - -#define I2C_IT_BUF ((uint16_t)0x0400) -#define I2C_IT_EVT ((uint16_t)0x0200) -#define I2C_IT_ERR ((uint16_t)0x0100) -#define IS_I2C_CONFIG_IT(IT) ((((IT) & (uint16_t)0xF8FF) == 0x00) && ((IT) != 0x00)) -/** - * @} - */ - -/** @defgroup I2C_interrupts_definition - * @{ - */ - -#define I2C_IT_SMBALERT ((uint32_t)0x01008000) -#define I2C_IT_TIMEOUT ((uint32_t)0x01004000) -#define I2C_IT_PECERR ((uint32_t)0x01001000) -#define I2C_IT_OVR ((uint32_t)0x01000800) -#define I2C_IT_AF ((uint32_t)0x01000400) -#define I2C_IT_ARLO ((uint32_t)0x01000200) -#define I2C_IT_BERR ((uint32_t)0x01000100) -#define I2C_IT_TXE ((uint32_t)0x06000080) -#define I2C_IT_RXNE ((uint32_t)0x06000040) -#define I2C_IT_STOPF ((uint32_t)0x02000010) -#define I2C_IT_ADD10 ((uint32_t)0x02000008) -#define I2C_IT_BTF ((uint32_t)0x02000004) -#define I2C_IT_ADDR ((uint32_t)0x02000002) -#define I2C_IT_SB ((uint32_t)0x02000001) - -#define IS_I2C_CLEAR_IT(IT) ((((IT) & (uint16_t)0x20FF) == 0x00) && ((IT) != (uint16_t)0x00)) - -#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \ - ((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \ - ((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \ - ((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_TXE) || \ - ((IT) == I2C_IT_RXNE) || ((IT) == I2C_IT_STOPF) || \ - ((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \ - ((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB)) -/** - * @} - */ - -/** @defgroup I2C_flags_definition - * @{ - */ - -/** - * @brief SR2 register flags - */ - -#define I2C_FLAG_DUALF ((uint32_t)0x00800000) -#define I2C_FLAG_SMBHOST ((uint32_t)0x00400000) -#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00200000) -#define I2C_FLAG_GENCALL ((uint32_t)0x00100000) -#define I2C_FLAG_TRA ((uint32_t)0x00040000) -#define I2C_FLAG_BUSY ((uint32_t)0x00020000) -#define I2C_FLAG_MSL ((uint32_t)0x00010000) - -/** - * @brief SR1 register flags - */ - -#define I2C_FLAG_SMBALERT ((uint32_t)0x10008000) -#define I2C_FLAG_TIMEOUT ((uint32_t)0x10004000) -#define I2C_FLAG_PECERR ((uint32_t)0x10001000) -#define I2C_FLAG_OVR ((uint32_t)0x10000800) -#define I2C_FLAG_AF ((uint32_t)0x10000400) -#define I2C_FLAG_ARLO ((uint32_t)0x10000200) -#define I2C_FLAG_BERR ((uint32_t)0x10000100) -#define I2C_FLAG_TXE ((uint32_t)0x10000080) -#define I2C_FLAG_RXNE ((uint32_t)0x10000040) -#define I2C_FLAG_STOPF ((uint32_t)0x10000010) -#define I2C_FLAG_ADD10 ((uint32_t)0x10000008) -#define I2C_FLAG_BTF ((uint32_t)0x10000004) -#define I2C_FLAG_ADDR ((uint32_t)0x10000002) -#define I2C_FLAG_SB ((uint32_t)0x10000001) - -#define IS_I2C_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0x20FF) == 0x00) && ((FLAG) != (uint16_t)0x00)) - -#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_DUALF) || ((FLAG) == I2C_FLAG_SMBHOST) || \ - ((FLAG) == I2C_FLAG_SMBDEFAULT) || ((FLAG) == I2C_FLAG_GENCALL) || \ - ((FLAG) == I2C_FLAG_TRA) || ((FLAG) == I2C_FLAG_BUSY) || \ - ((FLAG) == I2C_FLAG_MSL) || ((FLAG) == I2C_FLAG_SMBALERT) || \ - ((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_PECERR) || \ - ((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_AF) || \ - ((FLAG) == I2C_FLAG_ARLO) || ((FLAG) == I2C_FLAG_BERR) || \ - ((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_RXNE) || \ - ((FLAG) == I2C_FLAG_STOPF) || ((FLAG) == I2C_FLAG_ADD10) || \ - ((FLAG) == I2C_FLAG_BTF) || ((FLAG) == I2C_FLAG_ADDR) || \ - ((FLAG) == I2C_FLAG_SB)) -/** - * @} - */ - -/** @defgroup I2C_Events - * @{ - */ - -/** - =============================================================================== - I2C Master Events (Events grouped in order of communication) - =============================================================================== - */ - -/** - * @brief Communication start - * - * After sending the START condition (I2C_GenerateSTART() function) the master - * has to wait for this event. It means that the Start condition has been correctly - * released on the I2C bus (the bus is free, no other devices is communicating). - * - */ -/* --EV5 */ -#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */ - -/** - * @brief Address Acknowledge - * - * After checking on EV5 (start condition correctly released on the bus), the - * master sends the address of the slave(s) with which it will communicate - * (I2C_Send7bitAddress() function, it also determines the direction of the communication: - * Master transmitter or Receiver). Then the master has to wait that a slave acknowledges - * his address. If an acknowledge is sent on the bus, one of the following events will - * be set: - * - * 1) In case of Master Receiver (7-bit addressing): the I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED - * event is set. - * - * 2) In case of Master Transmitter (7-bit addressing): the I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED - * is set - * - * 3) In case of 10-Bit addressing mode, the master (just after generating the START - * and checking on EV5) has to send the header of 10-bit addressing mode (I2C_SendData() - * function). Then master should wait on EV9. It means that the 10-bit addressing - * header has been correctly sent on the bus. Then master should send the second part of - * the 10-bit address (LSB) using the function I2C_Send7bitAddress(). Then master - * should wait for event EV6. - * - */ - -/* --EV6 */ -#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */ -#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */ -/* --EV9 */ -#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((uint32_t)0x00030008) /* BUSY, MSL and ADD10 flags */ - -/** - * @brief Communication events - * - * If a communication is established (START condition generated and slave address - * acknowledged) then the master has to check on one of the following events for - * communication procedures: - * - * 1) Master Receiver mode: The master has to wait on the event EV7 then to read - * the data received from the slave (I2C_ReceiveData() function). - * - * 2) Master Transmitter mode: The master has to send data (I2C_SendData() - * function) then to wait on event EV8 or EV8_2. - * These two events are similar: - * - EV8 means that the data has been written in the data register and is - * being shifted out. - * - EV8_2 means that the data has been physically shifted out and output - * on the bus. - * In most cases, using EV8 is sufficient for the application. - * Using EV8_2 leads to a slower communication but ensure more reliable test. - * EV8_2 is also more suitable than EV8 for testing on the last data transmission - * (before Stop condition generation). - * - * @note In case the user software does not guarantee that this event EV7 is - * managed before the current byte end of transfer, then user may check on EV7 - * and BTF flag at the same time (ie. (I2C_EVENT_MASTER_BYTE_RECEIVED | I2C_FLAG_BTF)). - * In this case the communication may be slower. - * - */ - -/* Master RECEIVER mode -----------------------------*/ -/* --EV7 */ -#define I2C_EVENT_MASTER_BYTE_RECEIVED ((uint32_t)0x00030040) /* BUSY, MSL and RXNE flags */ - -/* Master TRANSMITTER mode --------------------------*/ -/* --EV8 */ -#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */ -/* --EV8_2 */ -#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */ - - -/** - =============================================================================== - I2C Slave Events (Events grouped in order of communication) - =============================================================================== - */ - - -/** - * @brief Communication start events - * - * Wait on one of these events at the start of the communication. It means that - * the I2C peripheral detected a Start condition on the bus (generated by master - * device) followed by the peripheral address. The peripheral generates an ACK - * condition on the bus (if the acknowledge feature is enabled through function - * I2C_AcknowledgeConfig()) and the events listed above are set : - * - * 1) In normal case (only one address managed by the slave), when the address - * sent by the master matches the own address of the peripheral (configured by - * I2C_OwnAddress1 field) the I2C_EVENT_SLAVE_XXX_ADDRESS_MATCHED event is set - * (where XXX could be TRANSMITTER or RECEIVER). - * - * 2) In case the address sent by the master matches the second address of the - * peripheral (configured by the function I2C_OwnAddress2Config() and enabled - * by the function I2C_DualAddressCmd()) the events I2C_EVENT_SLAVE_XXX_SECONDADDRESS_MATCHED - * (where XXX could be TRANSMITTER or RECEIVER) are set. - * - * 3) In case the address sent by the master is General Call (address 0x00) and - * if the General Call is enabled for the peripheral (using function I2C_GeneralCallCmd()) - * the following event is set I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED. - * - */ - -/* --EV1 (all the events below are variants of EV1) */ -/* 1) Case of One Single Address managed by the slave */ -#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002) /* BUSY and ADDR flags */ -#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082) /* TRA, BUSY, TXE and ADDR flags */ - -/* 2) Case of Dual address managed by the slave */ -#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000) /* DUALF and BUSY flags */ -#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080) /* DUALF, TRA, BUSY and TXE flags */ - -/* 3) Case of General Call enabled for the slave */ -#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000) /* GENCALL and BUSY flags */ - -/** - * @brief Communication events - * - * Wait on one of these events when EV1 has already been checked and: - * - * - Slave RECEIVER mode: - * - EV2: When the application is expecting a data byte to be received. - * - EV4: When the application is expecting the end of the communication: master - * sends a stop condition and data transmission is stopped. - * - * - Slave Transmitter mode: - * - EV3: When a byte has been transmitted by the slave and the application is expecting - * the end of the byte transmission. The two events I2C_EVENT_SLAVE_BYTE_TRANSMITTED and - * I2C_EVENT_SLAVE_BYTE_TRANSMITTING are similar. The second one can optionally be - * used when the user software doesn't guarantee the EV3 is managed before the - * current byte end of transfer. - * - EV3_2: When the master sends a NACK in order to tell slave that data transmission - * shall end (before sending the STOP condition). In this case slave has to stop sending - * data bytes and expect a Stop condition on the bus. - * - * @note In case the user software does not guarantee that the event EV2 is - * managed before the current byte end of transfer, then user may check on EV2 - * and BTF flag at the same time (ie. (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_BTF)). - * In this case the communication may be slower. - * - */ - -/* Slave RECEIVER mode --------------------------*/ -/* --EV2 */ -#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040) /* BUSY and RXNE flags */ -/* --EV4 */ -#define I2C_EVENT_SLAVE_STOP_DETECTED ((uint32_t)0x00000010) /* STOPF flag */ - -/* Slave TRANSMITTER mode -----------------------*/ -/* --EV3 */ -#define I2C_EVENT_SLAVE_BYTE_TRANSMITTED ((uint32_t)0x00060084) /* TRA, BUSY, TXE and BTF flags */ -#define I2C_EVENT_SLAVE_BYTE_TRANSMITTING ((uint32_t)0x00060080) /* TRA, BUSY and TXE flags */ -/* --EV3_2 */ -#define I2C_EVENT_SLAVE_ACK_FAILURE ((uint32_t)0x00000400) /* AF flag */ - -/* - =============================================================================== - End of Events Description - =============================================================================== - */ - -#define IS_I2C_EVENT(EVENT) (((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED) || \ - ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED) || \ - ((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED) || \ - ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED) || \ - ((EVENT) == I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED) || \ - ((EVENT) == I2C_EVENT_SLAVE_BYTE_RECEIVED) || \ - ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF)) || \ - ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL)) || \ - ((EVENT) == I2C_EVENT_SLAVE_BYTE_TRANSMITTED) || \ - ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)) || \ - ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL)) || \ - ((EVENT) == I2C_EVENT_SLAVE_STOP_DETECTED) || \ - ((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \ - ((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \ - ((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \ - ((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \ - ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \ - ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTING) || \ - ((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10) || \ - ((EVENT) == I2C_EVENT_SLAVE_ACK_FAILURE)) -/** - * @} - */ - -/** @defgroup I2C_own_address1 - * @{ - */ - -#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x3FF) -/** - * @} - */ - -/** @defgroup I2C_clock_speed - * @{ - */ - -#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) >= 0x1) && ((SPEED) <= 400000)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the I2C configuration to the default reset state *****/ -void I2C_DeInit(I2C_TypeDef* I2Cx); - -/* Initialization and Configuration functions *********************************/ -void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct); -void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct); -void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction); -void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address); -void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle); -void I2C_NACKPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_NACKPosition); -void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert); -void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); - -/* Data transfers functions ***************************************************/ -void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data); -uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx); - -/* PEC management functions ***************************************************/ -void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition); -void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState); -uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx); - -/* DMA transfers management functions *****************************************/ -void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState); -void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); - -/* Interrupts, events and flags management functions **************************/ -uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register); -void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState); - -/* - =============================================================================== - I2C State Monitoring Functions - =============================================================================== - This I2C driver provides three different ways for I2C state monitoring - depending on the application requirements and constraints: - - - 1. Basic state monitoring (Using I2C_CheckEvent() function) - ----------------------------------------------------------- - It compares the status registers (SR1 and SR2) content to a given event - (can be the combination of one or more flags). - It returns SUCCESS if the current status includes the given flags - and returns ERROR if one or more flags are missing in the current status. - - - When to use - - This function is suitable for most applications as well as for startup - activity since the events are fully described in the product reference - manual (RM0090). - - It is also suitable for users who need to define their own events. - - - Limitations - - If an error occurs (ie. error flags are set besides to the monitored - flags), the I2C_CheckEvent() function may return SUCCESS despite - the communication hold or corrupted real state. - In this case, it is advised to use error interrupts to monitor - the error events and handle them in the interrupt IRQ handler. - - Note - For error management, it is advised to use the following functions: - - I2C_ITConfig() to configure and enable the error interrupts (I2C_IT_ERR). - - I2Cx_ER_IRQHandler() which is called when the error interrupt occurs. - Where x is the peripheral instance (I2C1, I2C2 ...) - - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into the - I2Cx_ER_IRQHandler() function in order to determine which error occurred. - - I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd() - and/or I2C_GenerateStop() in order to clear the error flag and source - and return to correct communication status. - - - 2. Advanced state monitoring (Using the function I2C_GetLastEvent()) - -------------------------------------------------------------------- - Using the function I2C_GetLastEvent() which returns the image of both status - registers in a single word (uint32_t) (Status Register 2 value is shifted left - by 16 bits and concatenated to Status Register 1). - - - When to use - - This function is suitable for the same applications above but it - allows to overcome the mentioned limitation of I2C_GetFlagStatus() - function. - - The returned value could be compared to events already defined in - this file or to custom values defined by user. - This function is suitable when multiple flags are monitored at the - same time. - - At the opposite of I2C_CheckEvent() function, this function allows - user to choose when an event is accepted (when all events flags are - set and no other flags are set or just when the needed flags are set - like I2C_CheckEvent() function. - - - Limitations - - User may need to define his own events. - - Same remark concerning the error management is applicable for this - function if user decides to check only regular communication flags - (and ignores error flags). - - - 3. Flag-based state monitoring (Using the function I2C_GetFlagStatus()) - ----------------------------------------------------------------------- - - Using the function I2C_GetFlagStatus() which simply returns the status of - one single flag (ie. I2C_FLAG_RXNE ...). - - - When to use - - This function could be used for specific applications or in debug - phase. - - It is suitable when only one flag checking is needed (most I2C - events are monitored through multiple flags). - - Limitations: - - When calling this function, the Status register is accessed. - Some flags are cleared when the status register is accessed. - So checking the status of one Flag, may clear other ones. - - Function may need to be called twice or more in order to monitor - one single event. - */ - -/* - =============================================================================== - 1. Basic state monitoring - =============================================================================== - */ -ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT); -/* - =============================================================================== - 2. Advanced state monitoring - =============================================================================== - */ -uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx); -/* - =============================================================================== - 3. Flag-based state monitoring - =============================================================================== - */ -FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); - - -void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); -ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT); -void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_I2C_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_iwdg.c b/car_hw/src/lib/stdperiph/stm32f4xx_iwdg.c deleted file mode 100644 index 510979804cc..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_iwdg.c +++ /dev/null @@ -1,264 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_iwdg.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Independent watchdog (IWDG) peripheral: - * - Prescaler and Counter configuration - * - IWDG activation - * - Flag management - * - * @verbatim - * - * =================================================================== - * IWDG features - * =================================================================== - * - * The IWDG can be started by either software or hardware (configurable - * through option byte). - * - * The IWDG is clocked by its own dedicated low-speed clock (LSI) and - * thus stays active even if the main clock fails. - * Once the IWDG is started, the LSI is forced ON and cannot be disabled - * (LSI cannot be disabled too), and the counter starts counting down from - * the reset value of 0xFFF. When it reaches the end of count value (0x000) - * a system reset is generated. - * The IWDG counter should be reloaded at regular intervals to prevent - * an MCU reset. - * - * The IWDG is implemented in the VDD voltage domain that is still functional - * in STOP and STANDBY mode (IWDG reset can wake-up from STANDBY). - * - * IWDGRST flag in RCC_CSR register can be used to inform when a IWDG - * reset occurs. - * - * Min-max timeout value @32KHz (LSI): ~125us / ~32.7s - * The IWDG timeout may vary due to LSI frequency dispersion. STM32F4xx - * devices provide the capability to measure the LSI frequency (LSI clock - * connected internally to TIM5 CH4 input capture). The measured value - * can be used to have an IWDG timeout with an acceptable accuracy. - * For more information, please refer to the STM32F4xx Reference manual - * - * - * =================================================================== - * How to use this driver - * =================================================================== - * 1. Enable write access to IWDG_PR and IWDG_RLR registers using - * IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable) function - * - * 2. Configure the IWDG prescaler using IWDG_SetPrescaler() function - * - * 3. Configure the IWDG counter value using IWDG_SetReload() function. - * This value will be loaded in the IWDG counter each time the counter - * is reloaded, then the IWDG will start counting down from this value. - * - * 4. Start the IWDG using IWDG_Enable() function, when the IWDG is used - * in software mode (no need to enable the LSI, it will be enabled - * by hardware) - * - * 5. Then the application program must reload the IWDG counter at regular - * intervals during normal operation to prevent an MCU reset, using - * IWDG_ReloadCounter() function. - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_iwdg.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup IWDG - * @brief IWDG driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* KR register bit mask */ -#define KR_KEY_RELOAD ((uint16_t)0xAAAA) -#define KR_KEY_ENABLE ((uint16_t)0xCCCC) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup IWDG_Private_Functions - * @{ - */ - -/** @defgroup IWDG_Group1 Prescaler and Counter configuration functions - * @brief Prescaler and Counter configuration functions - * -@verbatim - =============================================================================== - Prescaler and Counter configuration functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables write access to IWDG_PR and IWDG_RLR registers. - * @param IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers. - * This parameter can be one of the following values: - * @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers - * @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers - * @retval None - */ -void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) -{ - /* Check the parameters */ - assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess)); - IWDG->KR = IWDG_WriteAccess; -} - -/** - * @brief Sets IWDG Prescaler value. - * @param IWDG_Prescaler: specifies the IWDG Prescaler value. - * This parameter can be one of the following values: - * @arg IWDG_Prescaler_4: IWDG prescaler set to 4 - * @arg IWDG_Prescaler_8: IWDG prescaler set to 8 - * @arg IWDG_Prescaler_16: IWDG prescaler set to 16 - * @arg IWDG_Prescaler_32: IWDG prescaler set to 32 - * @arg IWDG_Prescaler_64: IWDG prescaler set to 64 - * @arg IWDG_Prescaler_128: IWDG prescaler set to 128 - * @arg IWDG_Prescaler_256: IWDG prescaler set to 256 - * @retval None - */ -void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) -{ - /* Check the parameters */ - assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler)); - IWDG->PR = IWDG_Prescaler; -} - -/** - * @brief Sets IWDG Reload value. - * @param Reload: specifies the IWDG Reload value. - * This parameter must be a number between 0 and 0x0FFF. - * @retval None - */ -void IWDG_SetReload(uint16_t Reload) -{ - /* Check the parameters */ - assert_param(IS_IWDG_RELOAD(Reload)); - IWDG->RLR = Reload; -} - -/** - * @brief Reloads IWDG counter with value defined in the reload register - * (write access to IWDG_PR and IWDG_RLR registers disabled). - * @param None - * @retval None - */ -void IWDG_ReloadCounter(void) -{ - IWDG->KR = KR_KEY_RELOAD; -} - -/** - * @} - */ - -/** @defgroup IWDG_Group2 IWDG activation function - * @brief IWDG activation function - * -@verbatim - =============================================================================== - IWDG activation function - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled). - * @param None - * @retval None - */ -void IWDG_Enable(void) -{ - IWDG->KR = KR_KEY_ENABLE; -} - -/** - * @} - */ - -/** @defgroup IWDG_Group3 Flag management function - * @brief Flag management function - * -@verbatim - =============================================================================== - Flag management function - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Checks whether the specified IWDG flag is set or not. - * @param IWDG_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg IWDG_FLAG_PVU: Prescaler Value Update on going - * @arg IWDG_FLAG_RVU: Reload Value Update on going - * @retval The new state of IWDG_FLAG (SET or RESET). - */ -FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_IWDG_FLAG(IWDG_FLAG)); - if ((IWDG->SR & IWDG_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the flag status */ - return bitstatus; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_iwdg.h b/car_hw/src/lib/stdperiph/stm32f4xx_iwdg.h deleted file mode 100644 index b7b25f9ccda..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_iwdg.h +++ /dev/null @@ -1,125 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_iwdg.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the IWDG - * firmware library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_IWDG_H -#define __STM32F4xx_IWDG_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup IWDG - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup IWDG_Exported_Constants - * @{ - */ - -/** @defgroup IWDG_WriteAccess - * @{ - */ -#define IWDG_WriteAccess_Enable ((uint16_t)0x5555) -#define IWDG_WriteAccess_Disable ((uint16_t)0x0000) -#define IS_IWDG_WRITE_ACCESS(ACCESS) (((ACCESS) == IWDG_WriteAccess_Enable) || \ - ((ACCESS) == IWDG_WriteAccess_Disable)) -/** - * @} - */ - -/** @defgroup IWDG_prescaler - * @{ - */ -#define IWDG_Prescaler_4 ((uint8_t)0x00) -#define IWDG_Prescaler_8 ((uint8_t)0x01) -#define IWDG_Prescaler_16 ((uint8_t)0x02) -#define IWDG_Prescaler_32 ((uint8_t)0x03) -#define IWDG_Prescaler_64 ((uint8_t)0x04) -#define IWDG_Prescaler_128 ((uint8_t)0x05) -#define IWDG_Prescaler_256 ((uint8_t)0x06) -#define IS_IWDG_PRESCALER(PRESCALER) (((PRESCALER) == IWDG_Prescaler_4) || \ - ((PRESCALER) == IWDG_Prescaler_8) || \ - ((PRESCALER) == IWDG_Prescaler_16) || \ - ((PRESCALER) == IWDG_Prescaler_32) || \ - ((PRESCALER) == IWDG_Prescaler_64) || \ - ((PRESCALER) == IWDG_Prescaler_128)|| \ - ((PRESCALER) == IWDG_Prescaler_256)) -/** - * @} - */ - -/** @defgroup IWDG_Flag - * @{ - */ -#define IWDG_FLAG_PVU ((uint16_t)0x0001) -#define IWDG_FLAG_RVU ((uint16_t)0x0002) -#define IS_IWDG_FLAG(FLAG) (((FLAG) == IWDG_FLAG_PVU) || ((FLAG) == IWDG_FLAG_RVU)) -#define IS_IWDG_RELOAD(RELOAD) ((RELOAD) <= 0xFFF) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Prescaler and Counter configuration functions ******************************/ -void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess); -void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); -void IWDG_SetReload(uint16_t Reload); -void IWDG_ReloadCounter(void); - -/* IWDG activation function ***************************************************/ -void IWDG_Enable(void); - -/* Flag management function ***************************************************/ -FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_IWDG_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_pwr.c b/car_hw/src/lib/stdperiph/stm32f4xx_pwr.c deleted file mode 100644 index afd5cbc0717..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_pwr.c +++ /dev/null @@ -1,657 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_pwr.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Power Controller (PWR) peripheral: - * - Backup Domain Access - * - PVD configuration - * - WakeUp pin configuration - * - Main and Backup Regulators configuration - * - FLASH Power Down configuration - * - Low Power modes configuration - * - Flags management - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_pwr.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup PWR - * @brief PWR driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* --------- PWR registers bit address in the alias region ---------- */ -#define PWR_OFFSET (PWR_BASE - PERIPH_BASE) - -/* --- CR Register ---*/ - -/* Alias word address of DBP bit */ -#define CR_OFFSET (PWR_OFFSET + 0x00) -#define DBP_BitNumber 0x08 -#define CR_DBP_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (DBP_BitNumber * 4)) - -/* Alias word address of PVDE bit */ -#define PVDE_BitNumber 0x04 -#define CR_PVDE_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PVDE_BitNumber * 4)) - -/* Alias word address of FPDS bit */ -#define FPDS_BitNumber 0x09 -#define CR_FPDS_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (FPDS_BitNumber * 4)) - -/* Alias word address of PMODE bit */ -#define PMODE_BitNumber 0x0E -#define CR_PMODE_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PMODE_BitNumber * 4)) - - -/* --- CSR Register ---*/ - -/* Alias word address of EWUP bit */ -#define CSR_OFFSET (PWR_OFFSET + 0x04) -#define EWUP_BitNumber 0x08 -#define CSR_EWUP_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (EWUP_BitNumber * 4)) - -/* Alias word address of BRE bit */ -#define BRE_BitNumber 0x09 -#define CSR_BRE_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (BRE_BitNumber * 4)) - -/* ------------------ PWR registers bit mask ------------------------ */ - -/* CR register bit mask */ -#define CR_DS_MASK ((uint32_t)0xFFFFFFFC) -#define CR_PLS_MASK ((uint32_t)0xFFFFFF1F) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup PWR_Private_Functions - * @{ - */ - -/** @defgroup PWR_Group1 Backup Domain Access function - * @brief Backup Domain Access function - * -@verbatim - =============================================================================== - Backup Domain Access function - =============================================================================== - - After reset, the backup domain (RTC registers, RTC backup data - registers and backup SRAM) is protected against possible unwanted - write accesses. - To enable access to the RTC Domain and RTC registers, proceed as follows: - - Enable the Power Controller (PWR) APB1 interface clock using the - RCC_APB1PeriphClockCmd() function. - - Enable access to RTC domain using the PWR_BackupAccessCmd() function. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the PWR peripheral registers to their default reset values. - * @param None - * @retval None - */ -void PWR_DeInit(void) -{ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE); -} - -/** - * @brief Enables or disables access to the backup domain (RTC registers, RTC - * backup data registers and backup SRAM). - * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the - * Backup Domain Access should be kept enabled. - * @param NewState: new state of the access to the backup domain. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void PWR_BackupAccessCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState; -} - -/** - * @} - */ - -/** @defgroup PWR_Group2 PVD configuration functions - * @brief PVD configuration functions - * -@verbatim - =============================================================================== - PVD configuration functions - =============================================================================== - - - The PVD is used to monitor the VDD power supply by comparing it to a threshold - selected by the PVD Level (PLS[2:0] bits in the PWR_CR). - - A PVDO flag is available to indicate if VDD/VDDA is higher or lower than the - PVD threshold. This event is internally connected to the EXTI line16 - and can generate an interrupt if enabled through the EXTI registers. - - The PVD is stopped in Standby mode. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). - * @param PWR_PVDLevel: specifies the PVD detection level - * This parameter can be one of the following values: - * @arg PWR_PVDLevel_0: PVD detection level set to 2.0V - * @arg PWR_PVDLevel_1: PVD detection level set to 2.2V - * @arg PWR_PVDLevel_2: PVD detection level set to 2.3V - * @arg PWR_PVDLevel_3: PVD detection level set to 2.5V - * @arg PWR_PVDLevel_4: PVD detection level set to 2.7V - * @arg PWR_PVDLevel_5: PVD detection level set to 2.8V - * @arg PWR_PVDLevel_6: PVD detection level set to 2.9V - * @arg PWR_PVDLevel_7: PVD detection level set to 3.0V - * @note Refer to the electrical characteristics of you device datasheet for more details. - * @retval None - */ -void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_PWR_PVD_LEVEL(PWR_PVDLevel)); - - tmpreg = PWR->CR; - - /* Clear PLS[7:5] bits */ - tmpreg &= CR_PLS_MASK; - - /* Set PLS[7:5] bits according to PWR_PVDLevel value */ - tmpreg |= PWR_PVDLevel; - - /* Store the new value */ - PWR->CR = tmpreg; -} - -/** - * @brief Enables or disables the Power Voltage Detector(PVD). - * @param NewState: new state of the PVD. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void PWR_PVDCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)NewState; -} - -/** - * @} - */ - -/** @defgroup PWR_Group3 WakeUp pin configuration functions - * @brief WakeUp pin configuration functions - * -@verbatim - =============================================================================== - WakeUp pin configuration functions - =============================================================================== - - - WakeUp pin is used to wakeup the system from Standby mode. This pin is - forced in input pull down configuration and is active on rising edges. - - There is only one WakeUp pin: WakeUp Pin 1 on PA.00. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the WakeUp Pin functionality. - * @param NewState: new state of the WakeUp Pin functionality. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void PWR_WakeUpPinCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CSR_EWUP_BB = (uint32_t)NewState; -} - -/** - * @} - */ - -/** @defgroup PWR_Group4 Main and Backup Regulators configuration functions - * @brief Main and Backup Regulators configuration functions - * -@verbatim - =============================================================================== - Main and Backup Regulators configuration functions - =============================================================================== - - - The backup domain includes 4 Kbytes of backup SRAM accessible only from the - CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is retained - even in Standby or VBAT mode when the low power backup regulator is enabled. - It can be considered as an internal EEPROM when VBAT is always present. - You can use the PWR_BackupRegulatorCmd() function to enable the low power - backup regulator and use the PWR_GetFlagStatus(PWR_FLAG_BRR) to check if it is - ready or not. - - - When the backup domain is supplied by VDD (analog switch connected to VDD) - the backup SRAM is powered from VDD which replaces the VBAT power supply to - save battery life. - - - The backup SRAM is not mass erased by an tamper event. It is read protected - to prevent confidential data, such as cryptographic private key, from being - accessed. The backup SRAM can be erased only through the Flash interface when - a protection level change from level 1 to level 0 is requested. - Refer to the description of Read protection (RDP) in the Flash programming manual. - - - The main internal regulator can be configured to have a tradeoff between performance - and power consumption when the device does not operate at the maximum frequency. - This is done through PWR_MainRegulatorModeConfig() function which configure VOS bit - in PWR_CR register: - - When this bit is set (Regulator voltage output Scale 1 mode selected) the System - frequency can go up to 168 MHz. - - When this bit is reset (Regulator voltage output Scale 2 mode selected) the System - frequency can go up to 144 MHz. - Refer to the datasheets for more details. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the Backup Regulator. - * @param NewState: new state of the Backup Regulator. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void PWR_BackupRegulatorCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)NewState; -} - -/** - * @brief Configures the main internal regulator output voltage. - * @param PWR_Regulator_Voltage: specifies the regulator output voltage to achieve - * a tradeoff between performance and power consumption when the device does - * not operate at the maximum frequency (refer to the datasheets for more details). - * This parameter can be one of the following values: - * @arg PWR_Regulator_Voltage_Scale1: Regulator voltage output Scale 1 mode, - * System frequency up to 168 MHz. - * @arg PWR_Regulator_Voltage_Scale2: Regulator voltage output Scale 2 mode, - * System frequency up to 144 MHz. - * @retval None - */ -void PWR_MainRegulatorModeConfig(uint32_t PWR_Regulator_Voltage) -{ - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR_VOLTAGE(PWR_Regulator_Voltage)); - - if (PWR_Regulator_Voltage == PWR_Regulator_Voltage_Scale2) - { - PWR->CR &= ~PWR_Regulator_Voltage_Scale1; - } - else - { - PWR->CR |= PWR_Regulator_Voltage_Scale1; - } -} - -/** - * @} - */ - -/** @defgroup PWR_Group5 FLASH Power Down configuration functions - * @brief FLASH Power Down configuration functions - * -@verbatim - =============================================================================== - FLASH Power Down configuration functions - =============================================================================== - - - By setting the FPDS bit in the PWR_CR register by using the PWR_FlashPowerDownCmd() - function, the Flash memory also enters power down mode when the device enters - Stop mode. When the Flash memory is in power down mode, an additional startup - delay is incurred when waking up from Stop mode. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the Flash Power Down in STOP mode. - * @param NewState: new state of the Flash power mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void PWR_FlashPowerDownCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)NewState; -} - -/** - * @} - */ - -/** @defgroup PWR_Group6 Low Power modes configuration functions - * @brief Low Power modes configuration functions - * -@verbatim - =============================================================================== - Low Power modes configuration functions - =============================================================================== - - The devices feature 3 low-power modes: - - Sleep mode: Cortex-M4 core stopped, peripherals kept running. - - Stop mode: all clocks are stopped, regulator running, regulator in low power mode - - Standby mode: 1.2V domain powered off. - - Sleep mode - =========== - - Entry: - - The Sleep mode is entered by using the __WFI() or __WFE() functions. - - Exit: - - Any peripheral interrupt acknowledged by the nested vectored interrupt - controller (NVIC) can wake up the device from Sleep mode. - - Stop mode - ========== - In Stop mode, all clocks in the 1.2V domain are stopped, the PLL, the HSI, - and the HSE RC oscillators are disabled. Internal SRAM and register contents - are preserved. - The voltage regulator can be configured either in normal or low-power mode. - To minimize the consumption In Stop mode, FLASH can be powered off before - entering the Stop mode. It can be switched on again by software after exiting - the Stop mode using the PWR_FlashPowerDownCmd() function. - - - Entry: - - The Stop mode is entered using the PWR_EnterSTOPMode(PWR_Regulator_LowPower,) - function with regulator in LowPower or with Regulator ON. - - Exit: - - Any EXTI Line (Internal or External) configured in Interrupt/Event mode. - - Standby mode - ============ - The Standby mode allows to achieve the lowest power consumption. It is based - on the Cortex-M4 deepsleep mode, with the voltage regulator disabled. - The 1.2V domain is consequently powered off. The PLL, the HSI oscillator and - the HSE oscillator are also switched off. SRAM and register contents are lost - except for the RTC registers, RTC backup registers, backup SRAM and Standby - circuitry. - - The voltage regulator is OFF. - - - Entry: - - The Standby mode is entered using the PWR_EnterSTANDBYMode() function. - - Exit: - - WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wakeup, - tamper event, time-stamp event, external reset in NRST pin, IWDG reset. - - Auto-wakeup (AWU) from low-power mode - ===================================== - The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC - Wakeup event, a tamper event, a time-stamp event, or a comparator event, - without depending on an external interrupt (Auto-wakeup mode). - - - RTC auto-wakeup (AWU) from the Stop mode - ---------------------------------------- - - - To wake up from the Stop mode with an RTC alarm event, it is necessary to: - - Configure the EXTI Line 17 to be sensitive to rising edges (Interrupt - or Event modes) using the EXTI_Init() function. - - Enable the RTC Alarm Interrupt using the RTC_ITConfig() function - - Configure the RTC to generate the RTC alarm using the RTC_SetAlarm() - and RTC_AlarmCmd() functions. - - To wake up from the Stop mode with an RTC Tamper or time stamp event, it - is necessary to: - - Configure the EXTI Line 21 to be sensitive to rising edges (Interrupt - or Event modes) using the EXTI_Init() function. - - Enable the RTC Tamper or time stamp Interrupt using the RTC_ITConfig() - function - - Configure the RTC to detect the tamper or time stamp event using the - RTC_TimeStampConfig(), RTC_TamperTriggerConfig() and RTC_TamperCmd() - functions. - - To wake up from the Stop mode with an RTC WakeUp event, it is necessary to: - - Configure the EXTI Line 22 to be sensitive to rising edges (Interrupt - or Event modes) using the EXTI_Init() function. - - Enable the RTC WakeUp Interrupt using the RTC_ITConfig() function - - Configure the RTC to generate the RTC WakeUp event using the RTC_WakeUpClockConfig(), - RTC_SetWakeUpCounter() and RTC_WakeUpCmd() functions. - - - RTC auto-wakeup (AWU) from the Standby mode - ------------------------------------------- - - To wake up from the Standby mode with an RTC alarm event, it is necessary to: - - Enable the RTC Alarm Interrupt using the RTC_ITConfig() function - - Configure the RTC to generate the RTC alarm using the RTC_SetAlarm() - and RTC_AlarmCmd() functions. - - To wake up from the Standby mode with an RTC Tamper or time stamp event, it - is necessary to: - - Enable the RTC Tamper or time stamp Interrupt using the RTC_ITConfig() - function - - Configure the RTC to detect the tamper or time stamp event using the - RTC_TimeStampConfig(), RTC_TamperTriggerConfig() and RTC_TamperCmd() - functions. - - To wake up from the Standby mode with an RTC WakeUp event, it is necessary to: - - Enable the RTC WakeUp Interrupt using the RTC_ITConfig() function - - Configure the RTC to generate the RTC WakeUp event using the RTC_WakeUpClockConfig(), - RTC_SetWakeUpCounter() and RTC_WakeUpCmd() functions. - -@endverbatim - * @{ - */ - -/** - * @brief Enters STOP mode. - * - * @note In Stop mode, all I/O pins keep the same state as in Run mode. - * @note When exiting Stop mode by issuing an interrupt or a wakeup event, - * the HSI RC oscillator is selected as system clock. - * @note When the voltage regulator operates in low power mode, an additional - * startup delay is incurred when waking up from Stop mode. - * By keeping the internal regulator ON during Stop mode, the consumption - * is higher although the startup time is reduced. - * - * @param PWR_Regulator: specifies the regulator state in STOP mode. - * This parameter can be one of the following values: - * @arg PWR_Regulator_ON: STOP mode with regulator ON - * @arg PWR_Regulator_LowPower: STOP mode with regulator in low power mode - * @param PWR_STOPEntry: specifies if STOP mode in entered with WFI or WFE instruction. - * This parameter can be one of the following values: - * @arg PWR_STOPEntry_WFI: enter STOP mode with WFI instruction - * @arg PWR_STOPEntry_WFE: enter STOP mode with WFE instruction - * @retval None - */ -void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_PWR_REGULATOR(PWR_Regulator)); - assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry)); - - /* Select the regulator state in STOP mode ---------------------------------*/ - tmpreg = PWR->CR; - /* Clear PDDS and LPDSR bits */ - tmpreg &= CR_DS_MASK; - - /* Set LPDSR bit according to PWR_Regulator value */ - tmpreg |= PWR_Regulator; - - /* Store the new value */ - PWR->CR = tmpreg; - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - - /* Select STOP mode entry --------------------------------------------------*/ - if(PWR_STOPEntry == PWR_STOPEntry_WFI) - { - /* Request Wait For Interrupt */ - __WFI(); - } - else - { - /* Request Wait For Event */ - __WFE(); - } - /* Reset SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); -} - -/** - * @brief Enters STANDBY mode. - * @note In Standby mode, all I/O pins are high impedance except for: - * - Reset pad (still available) - * - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC - * Alarm out, or RTC clock calibration out. - * - RTC_AF2 pin (PI8) if configured for tamper or time-stamp. - * - WKUP pin 1 (PA0) if enabled. - * @param None - * @retval None - */ -void PWR_EnterSTANDBYMode(void) -{ - /* Clear Wakeup flag */ - PWR->CR |= PWR_CR_CWUF; - - /* Select STANDBY mode */ - PWR->CR |= PWR_CR_PDDS; - - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - -/* This option is used to ensure that store operations are completed */ -#if defined ( __CC_ARM ) - __force_stores(); -#endif - /* Request Wait For Interrupt */ - __WFI(); -} - -/** - * @} - */ - -/** @defgroup PWR_Group7 Flags management functions - * @brief Flags management functions - * -@verbatim - =============================================================================== - Flags management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Checks whether the specified PWR flag is set or not. - * @param PWR_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag. This flag indicates that a wakeup event - * was received from the WKUP pin or from the RTC alarm (Alarm A - * or Alarm B), RTC Tamper event, RTC TimeStamp event or RTC Wakeup. - * An additional wakeup event is detected if the WKUP pin is enabled - * (by setting the EWUP bit) when the WKUP pin level is already high. - * @arg PWR_FLAG_SB: StandBy flag. This flag indicates that the system was - * resumed from StandBy mode. - * @arg PWR_FLAG_PVDO: PVD Output. This flag is valid only if PVD is enabled - * by the PWR_PVDCmd() function. The PVD is stopped by Standby mode - * For this reason, this bit is equal to 0 after Standby or reset - * until the PVDE bit is set. - * @arg PWR_FLAG_BRR: Backup regulator ready flag. This bit is not reset - * when the device wakes up from Standby mode or by a system reset - * or power reset. - * @arg PWR_FLAG_VOSRDY: This flag indicates that the Regulator voltage - * scaling output selection is ready. - * @retval The new state of PWR_FLAG (SET or RESET). - */ -FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG) -{ - FlagStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_PWR_GET_FLAG(PWR_FLAG)); - - if ((PWR->CSR & PWR_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the flag status */ - return bitstatus; -} - -/** - * @brief Clears the PWR's pending flags. - * @param PWR_FLAG: specifies the flag to clear. - * This parameter can be one of the following values: - * @arg PWR_FLAG_WU: Wake Up flag - * @arg PWR_FLAG_SB: StandBy flag - * @retval None - */ -void PWR_ClearFlag(uint32_t PWR_FLAG) -{ - /* Check the parameters */ - assert_param(IS_PWR_CLEAR_FLAG(PWR_FLAG)); - - PWR->CR |= PWR_FLAG << 2; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_pwr.h b/car_hw/src/lib/stdperiph/stm32f4xx_pwr.h deleted file mode 100644 index 6bc0404362c..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_pwr.h +++ /dev/null @@ -1,179 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_pwr.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the PWR firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_PWR_H -#define __STM32F4xx_PWR_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup PWR - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup PWR_Exported_Constants - * @{ - */ - -/** @defgroup PWR_PVD_detection_level - * @{ - */ - -#define PWR_PVDLevel_0 PWR_CR_PLS_LEV0 -#define PWR_PVDLevel_1 PWR_CR_PLS_LEV1 -#define PWR_PVDLevel_2 PWR_CR_PLS_LEV2 -#define PWR_PVDLevel_3 PWR_CR_PLS_LEV3 -#define PWR_PVDLevel_4 PWR_CR_PLS_LEV4 -#define PWR_PVDLevel_5 PWR_CR_PLS_LEV5 -#define PWR_PVDLevel_6 PWR_CR_PLS_LEV6 -#define PWR_PVDLevel_7 PWR_CR_PLS_LEV7 - -#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLevel_0) || ((LEVEL) == PWR_PVDLevel_1)|| \ - ((LEVEL) == PWR_PVDLevel_2) || ((LEVEL) == PWR_PVDLevel_3)|| \ - ((LEVEL) == PWR_PVDLevel_4) || ((LEVEL) == PWR_PVDLevel_5)|| \ - ((LEVEL) == PWR_PVDLevel_6) || ((LEVEL) == PWR_PVDLevel_7)) -/** - * @} - */ - - -/** @defgroup PWR_Regulator_state_in_STOP_mode - * @{ - */ - -#define PWR_Regulator_ON ((uint32_t)0x00000000) -#define PWR_Regulator_LowPower PWR_CR_LPDS -#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_Regulator_ON) || \ - ((REGULATOR) == PWR_Regulator_LowPower)) -/** - * @} - */ - -/** @defgroup PWR_STOP_mode_entry - * @{ - */ - -#define PWR_STOPEntry_WFI ((uint8_t)0x01) -#define PWR_STOPEntry_WFE ((uint8_t)0x02) -#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPEntry_WFI) || ((ENTRY) == PWR_STOPEntry_WFE)) - -/** @defgroup PWR_Regulator_Voltage_Scale - * @{ - */ - -#define PWR_Regulator_Voltage_Scale1 ((uint32_t)0x00004000) -#define PWR_Regulator_Voltage_Scale2 ((uint32_t)0x00000000) -#define IS_PWR_REGULATOR_VOLTAGE(VOLTAGE) (((VOLTAGE) == PWR_Regulator_Voltage_Scale1) || ((VOLTAGE) == PWR_Regulator_Voltage_Scale2)) - -/** - * @} - */ - -/** @defgroup PWR_Flag - * @{ - */ - -#define PWR_FLAG_WU PWR_CSR_WUF -#define PWR_FLAG_SB PWR_CSR_SBF -#define PWR_FLAG_PVDO PWR_CSR_PVDO -#define PWR_FLAG_BRR PWR_CSR_BRR -#define PWR_FLAG_VOSRDY PWR_CSR_VOSRDY - -/** @defgroup PWR_Flag_Legacy - * @{ - */ -#define PWR_FLAG_REGRDY PWR_FLAG_VOSRDY -/** - * @} - */ - -#define IS_PWR_GET_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB) || \ - ((FLAG) == PWR_FLAG_PVDO) || ((FLAG) == PWR_FLAG_BRR) || \ - ((FLAG) == PWR_FLAG_VOSRDY)) - -#define IS_PWR_CLEAR_FLAG(FLAG) (((FLAG) == PWR_FLAG_WU) || ((FLAG) == PWR_FLAG_SB)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the PWR configuration to the default reset state ******/ -void PWR_DeInit(void); - -/* Backup Domain Access function **********************************************/ -void PWR_BackupAccessCmd(FunctionalState NewState); - -/* PVD configuration functions ************************************************/ -void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel); -void PWR_PVDCmd(FunctionalState NewState); - -/* WakeUp pins configuration functions ****************************************/ -void PWR_WakeUpPinCmd(FunctionalState NewState); - -/* Main and Backup Regulators configuration functions *************************/ -void PWR_BackupRegulatorCmd(FunctionalState NewState); -void PWR_MainRegulatorModeConfig(uint32_t PWR_Regulator_Voltage); - -/* FLASH Power Down configuration functions ***********************************/ -void PWR_FlashPowerDownCmd(FunctionalState NewState); - -/* Low Power modes configuration functions ************************************/ -void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); -void PWR_EnterSTANDBYMode(void); - -/* Flags management functions *************************************************/ -FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG); -void PWR_ClearFlag(uint32_t PWR_FLAG); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_PWR_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_rcc.c b/car_hw/src/lib/stdperiph/stm32f4xx_rcc.c deleted file mode 100644 index 4d6e7d199cd..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_rcc.c +++ /dev/null @@ -1,1809 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_rcc.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Reset and clock control (RCC) peripheral: - * - Internal/external clocks, PLL, CSS and MCO configuration - * - System, AHB and APB busses clocks configuration - * - Peripheral clocks configuration - * - Interrupts and flags management - * - * @verbatim - * - * =================================================================== - * RCC specific features - * =================================================================== - * - * After reset the device is running from Internal High Speed oscillator - * (HSI 16MHz) with Flash 0 wait state, Flash prefetch buffer, D-Cache - * and I-Cache are disabled, and all peripherals are off except internal - * SRAM, Flash and JTAG. - * - There is no prescaler on High speed (AHB) and Low speed (APB) busses; - * all peripherals mapped on these busses are running at HSI speed. - * - The clock for all peripherals is switched off, except the SRAM and FLASH. - * - All GPIOs are in input floating state, except the JTAG pins which - * are assigned to be used for debug purpose. - * - * Once the device started from reset, the user application has to: - * - Configure the clock source to be used to drive the System clock - * (if the application needs higher frequency/performance) - * - Configure the System clock frequency and Flash settings - * - Configure the AHB and APB busses prescalers - * - Enable the clock for the peripheral(s) to be used - * - Configure the clock source(s) for peripherals which clocks are not - * derived from the System clock (I2S, RTC, ADC, USB OTG FS/SDIO/RNG) - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup RCC - * @brief RCC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* ------------ RCC registers bit address in the alias region ----------- */ -#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) -/* --- CR Register ---*/ -/* Alias word address of HSION bit */ -#define CR_OFFSET (RCC_OFFSET + 0x00) -#define HSION_BitNumber 0x00 -#define CR_HSION_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (HSION_BitNumber * 4)) -/* Alias word address of CSSON bit */ -#define CSSON_BitNumber 0x13 -#define CR_CSSON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (CSSON_BitNumber * 4)) -/* Alias word address of PLLON bit */ -#define PLLON_BitNumber 0x18 -#define CR_PLLON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLLON_BitNumber * 4)) -/* Alias word address of PLLI2SON bit */ -#define PLLI2SON_BitNumber 0x1A -#define CR_PLLI2SON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLLI2SON_BitNumber * 4)) - -/* --- CFGR Register ---*/ -/* Alias word address of I2SSRC bit */ -#define CFGR_OFFSET (RCC_OFFSET + 0x08) -#define I2SSRC_BitNumber 0x17 -#define CFGR_I2SSRC_BB (PERIPH_BB_BASE + (CFGR_OFFSET * 32) + (I2SSRC_BitNumber * 4)) - -/* --- BDCR Register ---*/ -/* Alias word address of RTCEN bit */ -#define BDCR_OFFSET (RCC_OFFSET + 0x70) -#define RTCEN_BitNumber 0x0F -#define BDCR_RTCEN_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (RTCEN_BitNumber * 4)) -/* Alias word address of BDRST bit */ -#define BDRST_BitNumber 0x10 -#define BDCR_BDRST_BB (PERIPH_BB_BASE + (BDCR_OFFSET * 32) + (BDRST_BitNumber * 4)) -/* --- CSR Register ---*/ -/* Alias word address of LSION bit */ -#define CSR_OFFSET (RCC_OFFSET + 0x74) -#define LSION_BitNumber 0x00 -#define CSR_LSION_BB (PERIPH_BB_BASE + (CSR_OFFSET * 32) + (LSION_BitNumber * 4)) -/* ---------------------- RCC registers bit mask ------------------------ */ -/* CFGR register bit mask */ -#define CFGR_MCO2_RESET_MASK ((uint32_t)0x07FFFFFF) -#define CFGR_MCO1_RESET_MASK ((uint32_t)0xF89FFFFF) - -/* RCC Flag Mask */ -#define FLAG_MASK ((uint8_t)0x1F) - -/* CR register byte 3 (Bits[23:16]) base address */ -#define CR_BYTE3_ADDRESS ((uint32_t)0x40023802) - -/* CIR register byte 2 (Bits[15:8]) base address */ -#define CIR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + 0x0C + 0x01)) - -/* CIR register byte 3 (Bits[23:16]) base address */ -#define CIR_BYTE3_ADDRESS ((uint32_t)(RCC_BASE + 0x0C + 0x02)) - -/* BDCR register base address */ -#define BDCR_ADDRESS (PERIPH_BASE + BDCR_OFFSET) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; - -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup RCC_Private_Functions - * @{ - */ - -/** @defgroup RCC_Group1 Internal and external clocks, PLL, CSS and MCO configuration functions - * @brief Internal and external clocks, PLL, CSS and MCO configuration functions - * -@verbatim - =============================================================================== - Internal/external clocks, PLL, CSS and MCO configuration functions - =============================================================================== - - This section provide functions allowing to configure the internal/external clocks, - PLLs, CSS and MCO pins. - - 1. HSI (high-speed internal), 16 MHz factory-trimmed RC used directly or through - the PLL as System clock source. - - 2. LSI (low-speed internal), 32 KHz low consumption RC used as IWDG and/or RTC - clock source. - - 3. HSE (high-speed external), 4 to 26 MHz crystal oscillator used directly or - through the PLL as System clock source. Can be used also as RTC clock source. - - 4. LSE (low-speed external), 32 KHz oscillator used as RTC clock source. - - 5. PLL (clocked by HSI or HSE), featuring two different output clocks: - - The first output is used to generate the high speed system clock (up to 168 MHz) - - The second output is used to generate the clock for the USB OTG FS (48 MHz), - the random analog generator (<=48 MHz) and the SDIO (<= 48 MHz). - - 6. PLLI2S (clocked by HSI or HSE), used to generate an accurate clock to achieve - high-quality audio performance on the I2S interface. - - 7. CSS (Clock security system), once enable and if a HSE clock failure occurs - (HSE used directly or through PLL as System clock source), the System clock - is automatically switched to HSI and an interrupt is generated if enabled. - The interrupt is linked to the Cortex-M4 NMI (Non-Maskable Interrupt) - exception vector. - - 8. MCO1 (microcontroller clock output), used to output HSI, LSE, HSE or PLL - clock (through a configurable prescaler) on PA8 pin. - - 9. MCO2 (microcontroller clock output), used to output HSE, PLL, SYSCLK or PLLI2S - clock (through a configurable prescaler) on PC9 pin. - -@endverbatim - * @{ - */ - -/** - * @brief Resets the RCC clock configuration to the default reset state. - * @note The default reset state of the clock configuration is given below: - * - HSI ON and used as system clock source - * - HSE, PLL and PLLI2S OFF - * - AHB, APB1 and APB2 prescaler set to 1. - * - CSS, MCO1 and MCO2 OFF - * - All interrupts disabled - * @note This function doesn't modify the configuration of the - * - Peripheral clocks - * - LSI, LSE and RTC clocks - * @param None - * @retval None - */ -void RCC_DeInit(void) -{ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset CFGR register */ - RCC->CFGR = 0x00000000; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset PLLCFGR register */ - RCC->PLLCFGR = 0x24003010; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; -} - -/** - * @brief Configures the External High Speed oscillator (HSE). - * @note After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application - * software should wait on HSERDY flag to be set indicating that HSE clock - * is stable and can be used to clock the PLL and/or system clock. - * @note HSE state can not be changed if it is used directly or through the - * PLL as system clock. In this case, you have to select another source - * of the system clock then change the HSE state (ex. disable it). - * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. - * @note This function reset the CSSON bit, so if the Clock security system(CSS) - * was previously enabled you have to enable it again after calling this - * function. - * @param RCC_HSE: specifies the new state of the HSE. - * This parameter can be one of the following values: - * @arg RCC_HSE_OFF: turn OFF the HSE oscillator, HSERDY flag goes low after - * 6 HSE oscillator clock cycles. - * @arg RCC_HSE_ON: turn ON the HSE oscillator - * @arg RCC_HSE_Bypass: HSE oscillator bypassed with external clock - * @retval None - */ -void RCC_HSEConfig(uint8_t RCC_HSE) -{ - /* Check the parameters */ - assert_param(IS_RCC_HSE(RCC_HSE)); - - /* Reset HSEON and HSEBYP bits before configuring the HSE ------------------*/ - *(__IO uint8_t *) CR_BYTE3_ADDRESS = RCC_HSE_OFF; - - /* Set the new HSE configuration -------------------------------------------*/ - *(__IO uint8_t *) CR_BYTE3_ADDRESS = RCC_HSE; -} - -/** - * @brief Waits for HSE start-up. - * @note This functions waits on HSERDY flag to be set and return SUCCESS if - * this flag is set, otherwise returns ERROR if the timeout is reached - * and this flag is not set. The timeout value is defined by the constant - * HSE_STARTUP_TIMEOUT in stm32f4xx.h file. You can tailor it depending - * on the HSE crystal used in your application. - * @param None - * @retval An ErrorStatus enumeration value: - * - SUCCESS: HSE oscillator is stable and ready to use - * - ERROR: HSE oscillator not yet ready - */ -ErrorStatus RCC_WaitForHSEStartUp(void) -{ - __IO uint32_t startupcounter = 0; - ErrorStatus status = ERROR; - FlagStatus hsestatus = RESET; - /* Wait till HSE is ready and if Time out is reached exit */ - do - { - hsestatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY); - startupcounter++; - } while((startupcounter != HSE_STARTUP_TIMEOUT) && (hsestatus == RESET)); - - if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET) - { - status = SUCCESS; - } - else - { - status = ERROR; - } - return (status); -} - -/** - * @brief Adjusts the Internal High Speed oscillator (HSI) calibration value. - * @note The calibration is used to compensate for the variations in voltage - * and temperature that influence the frequency of the internal HSI RC. - * @param HSICalibrationValue: specifies the calibration trimming value. - * This parameter must be a number between 0 and 0x1F. - * @retval None - */ -void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_RCC_CALIBRATION_VALUE(HSICalibrationValue)); - - tmpreg = RCC->CR; - - /* Clear HSITRIM[4:0] bits */ - tmpreg &= ~RCC_CR_HSITRIM; - - /* Set the HSITRIM[4:0] bits according to HSICalibrationValue value */ - tmpreg |= (uint32_t)HSICalibrationValue << 3; - - /* Store the new value */ - RCC->CR = tmpreg; -} - -/** - * @brief Enables or disables the Internal High Speed oscillator (HSI). - * @note The HSI is stopped by hardware when entering STOP and STANDBY modes. - * It is used (enabled by hardware) as system clock source after startup - * from Reset, wakeup from STOP and STANDBY mode, or in case of failure - * of the HSE used directly or indirectly as system clock (if the Clock - * Security System CSS is enabled). - * @note HSI can not be stopped if it is used as system clock source. In this case, - * you have to select another source of the system clock then stop the HSI. - * @note After enabling the HSI, the application software should wait on HSIRDY - * flag to be set indicating that HSI clock is stable and can be used as - * system clock source. - * @param NewState: new state of the HSI. - * This parameter can be: ENABLE or DISABLE. - * @note When the HSI is stopped, HSIRDY flag goes low after 6 HSI oscillator - * clock cycles. - * @retval None - */ -void RCC_HSICmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CR_HSION_BB = (uint32_t)NewState; -} - -/** - * @brief Configures the External Low Speed oscillator (LSE). - * @note As the LSE is in the Backup domain and write access is denied to - * this domain after reset, you have to enable write access using - * PWR_BackupAccessCmd(ENABLE) function before to configure the LSE - * (to be done once after reset). - * @note After enabling the LSE (RCC_LSE_ON or RCC_LSE_Bypass), the application - * software should wait on LSERDY flag to be set indicating that LSE clock - * is stable and can be used to clock the RTC. - * @param RCC_LSE: specifies the new state of the LSE. - * This parameter can be one of the following values: - * @arg RCC_LSE_OFF: turn OFF the LSE oscillator, LSERDY flag goes low after - * 6 LSE oscillator clock cycles. - * @arg RCC_LSE_ON: turn ON the LSE oscillator - * @arg RCC_LSE_Bypass: LSE oscillator bypassed with external clock - * @retval None - */ -void RCC_LSEConfig(uint8_t RCC_LSE) -{ - /* Check the parameters */ - assert_param(IS_RCC_LSE(RCC_LSE)); - - /* Reset LSEON and LSEBYP bits before configuring the LSE ------------------*/ - /* Reset LSEON bit */ - *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF; - - /* Reset LSEBYP bit */ - *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_OFF; - - /* Configure LSE (RCC_LSE_OFF is already covered by the code section above) */ - switch (RCC_LSE) - { - case RCC_LSE_ON: - /* Set LSEON bit */ - *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_ON; - break; - case RCC_LSE_Bypass: - /* Set LSEBYP and LSEON bits */ - *(__IO uint8_t *) BDCR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON; - break; - default: - break; - } -} - -/** - * @brief Enables or disables the Internal Low Speed oscillator (LSI). - * @note After enabling the LSI, the application software should wait on - * LSIRDY flag to be set indicating that LSI clock is stable and can - * be used to clock the IWDG and/or the RTC. - * @note LSI can not be disabled if the IWDG is running. - * @param NewState: new state of the LSI. - * This parameter can be: ENABLE or DISABLE. - * @note When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator - * clock cycles. - * @retval None - */ -void RCC_LSICmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CSR_LSION_BB = (uint32_t)NewState; -} - -/** - * @brief Configures the main PLL clock source, multiplication and division factors. - * @note This function must be used only when the main PLL is disabled. - * - * @param RCC_PLLSource: specifies the PLL entry clock source. - * This parameter can be one of the following values: - * @arg RCC_PLLSource_HSI: HSI oscillator clock selected as PLL clock entry - * @arg RCC_PLLSource_HSE: HSE oscillator clock selected as PLL clock entry - * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. - * - * @param PLLM: specifies the division factor for PLL VCO input clock - * This parameter must be a number between 0 and 63. - * @note You have to set the PLLM parameter correctly to ensure that the VCO input - * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency - * of 2 MHz to limit PLL jitter. - * - * @param PLLN: specifies the multiplication factor for PLL VCO output clock - * This parameter must be a number between 192 and 432. - * @note You have to set the PLLN parameter correctly to ensure that the VCO - * output frequency is between 192 and 432 MHz. - * - * @param PLLP: specifies the division factor for main system clock (SYSCLK) - * This parameter must be a number in the range {2, 4, 6, or 8}. - * @note You have to set the PLLP parameter correctly to not exceed 168 MHz on - * the System clock frequency. - * - * @param PLLQ: specifies the division factor for OTG FS, SDIO and RNG clocks - * This parameter must be a number between 4 and 15. - * @note If the USB OTG FS is used in your application, you have to set the - * PLLQ parameter correctly to have 48 MHz clock for the USB. However, - * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work - * correctly. - * - * @retval None - */ -void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ) -{ - /* Check the parameters */ - assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource)); - assert_param(IS_RCC_PLLM_VALUE(PLLM)); - assert_param(IS_RCC_PLLN_VALUE(PLLN)); - assert_param(IS_RCC_PLLP_VALUE(PLLP)); - assert_param(IS_RCC_PLLQ_VALUE(PLLQ)); - - RCC->PLLCFGR = PLLM | (PLLN << 6) | (((PLLP >> 1) -1) << 16) | (RCC_PLLSource) | - (PLLQ << 24); -} - -/** - * @brief Enables or disables the main PLL. - * @note After enabling the main PLL, the application software should wait on - * PLLRDY flag to be set indicating that PLL clock is stable and can - * be used as system clock source. - * @note The main PLL can not be disabled if it is used as system clock source - * @note The main PLL is disabled by hardware when entering STOP and STANDBY modes. - * @param NewState: new state of the main PLL. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_PLLCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) CR_PLLON_BB = (uint32_t)NewState; -} - -/** - * @brief Configures the PLLI2S clock multiplication and division factors. - * - * @note This function must be used only when the PLLI2S is disabled. - * @note PLLI2S clock source is common with the main PLL (configured in - * RCC_PLLConfig function ) - * - * @param PLLI2SN: specifies the multiplication factor for PLLI2S VCO output clock - * This parameter must be a number between 192 and 432. - * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO - * output frequency is between 192 and 432 MHz. - * - * @param PLLI2SR: specifies the division factor for I2S clock - * This parameter must be a number between 2 and 7. - * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz - * on the I2S clock frequency. - * - * @retval None - */ -void RCC_PLLI2SConfig(uint32_t PLLI2SN, uint32_t PLLI2SR) -{ - /* Check the parameters */ - assert_param(IS_RCC_PLLI2SN_VALUE(PLLI2SN)); - assert_param(IS_RCC_PLLI2SR_VALUE(PLLI2SR)); - - RCC->PLLI2SCFGR = (PLLI2SN << 6) | (PLLI2SR << 28); -} - -/** - * @brief Enables or disables the PLLI2S. - * @note The PLLI2S is disabled by hardware when entering STOP and STANDBY modes. - * @param NewState: new state of the PLLI2S. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_PLLI2SCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) CR_PLLI2SON_BB = (uint32_t)NewState; -} - -/** - * @brief Enables or disables the Clock Security System. - * @note If a failure is detected on the HSE oscillator clock, this oscillator - * is automatically disabled and an interrupt is generated to inform the - * software about the failure (Clock Security System Interrupt, CSSI), - * allowing the MCU to perform rescue operations. The CSSI is linked to - * the Cortex-M4 NMI (Non-Maskable Interrupt) exception vector. - * @param NewState: new state of the Clock Security System. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_ClockSecuritySystemCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) CR_CSSON_BB = (uint32_t)NewState; -} - -/** - * @brief Selects the clock source to output on MCO1 pin(PA8). - * @note PA8 should be configured in alternate function mode. - * @param RCC_MCO1Source: specifies the clock source to output. - * This parameter can be one of the following values: - * @arg RCC_MCO1Source_HSI: HSI clock selected as MCO1 source - * @arg RCC_MCO1Source_LSE: LSE clock selected as MCO1 source - * @arg RCC_MCO1Source_HSE: HSE clock selected as MCO1 source - * @arg RCC_MCO1Source_PLLCLK: main PLL clock selected as MCO1 source - * @param RCC_MCO1Div: specifies the MCO1 prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCO1Div_1: no division applied to MCO1 clock - * @arg RCC_MCO1Div_2: division by 2 applied to MCO1 clock - * @arg RCC_MCO1Div_3: division by 3 applied to MCO1 clock - * @arg RCC_MCO1Div_4: division by 4 applied to MCO1 clock - * @arg RCC_MCO1Div_5: division by 5 applied to MCO1 clock - * @retval None - */ -void RCC_MCO1Config(uint32_t RCC_MCO1Source, uint32_t RCC_MCO1Div) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_MCO1SOURCE(RCC_MCO1Source)); - assert_param(IS_RCC_MCO1DIV(RCC_MCO1Div)); - - tmpreg = RCC->CFGR; - - /* Clear MCO1[1:0] and MCO1PRE[2:0] bits */ - tmpreg &= CFGR_MCO1_RESET_MASK; - - /* Select MCO1 clock source and prescaler */ - tmpreg |= RCC_MCO1Source | RCC_MCO1Div; - - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @brief Selects the clock source to output on MCO2 pin(PC9). - * @note PC9 should be configured in alternate function mode. - * @param RCC_MCO2Source: specifies the clock source to output. - * This parameter can be one of the following values: - * @arg RCC_MCO2Source_SYSCLK: System clock (SYSCLK) selected as MCO2 source - * @arg RCC_MCO2Source_PLLI2SCLK: PLLI2S clock selected as MCO2 source - * @arg RCC_MCO2Source_HSE: HSE clock selected as MCO2 source - * @arg RCC_MCO2Source_PLLCLK: main PLL clock selected as MCO2 source - * @param RCC_MCO2Div: specifies the MCO2 prescaler. - * This parameter can be one of the following values: - * @arg RCC_MCO2Div_1: no division applied to MCO2 clock - * @arg RCC_MCO2Div_2: division by 2 applied to MCO2 clock - * @arg RCC_MCO2Div_3: division by 3 applied to MCO2 clock - * @arg RCC_MCO2Div_4: division by 4 applied to MCO2 clock - * @arg RCC_MCO2Div_5: division by 5 applied to MCO2 clock - * @retval None - */ -void RCC_MCO2Config(uint32_t RCC_MCO2Source, uint32_t RCC_MCO2Div) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_MCO2SOURCE(RCC_MCO2Source)); - assert_param(IS_RCC_MCO2DIV(RCC_MCO2Div)); - - tmpreg = RCC->CFGR; - - /* Clear MCO2 and MCO2PRE[2:0] bits */ - tmpreg &= CFGR_MCO2_RESET_MASK; - - /* Select MCO2 clock source and prescaler */ - tmpreg |= RCC_MCO2Source | RCC_MCO2Div; - - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @} - */ - -/** @defgroup RCC_Group2 System AHB and APB busses clocks configuration functions - * @brief System, AHB and APB busses clocks configuration functions - * -@verbatim - =============================================================================== - System, AHB and APB busses clocks configuration functions - =============================================================================== - - This section provide functions allowing to configure the System, AHB, APB1 and - APB2 busses clocks. - - 1. Several clock sources can be used to drive the System clock (SYSCLK): HSI, - HSE and PLL. - The AHB clock (HCLK) is derived from System clock through configurable prescaler - and used to clock the CPU, memory and peripherals mapped on AHB bus (DMA, GPIO...). - APB1 (PCLK1) and APB2 (PCLK2) clocks are derived from AHB clock through - configurable prescalers and used to clock the peripherals mapped on these busses. - You can use "RCC_GetClocksFreq()" function to retrieve the frequencies of these clocks. - -@note All the peripheral clocks are derived from the System clock (SYSCLK) except: - - I2S: the I2S clock can be derived either from a specific PLL (PLLI2S) or - from an external clock mapped on the I2S_CKIN pin. - You have to use RCC_I2SCLKConfig() function to configure this clock. - - RTC: the RTC clock can be derived either from the LSI, LSE or HSE clock - divided by 2 to 31. You have to use RCC_RTCCLKConfig() and RCC_RTCCLKCmd() - functions to configure this clock. - - USB OTG FS, SDIO and RTC: USB OTG FS require a frequency equal to 48 MHz - to work correctly, while the SDIO require a frequency equal or lower than - to 48. This clock is derived of the main PLL through PLLQ divider. - - IWDG clock which is always the LSI clock. - - 2. The maximum frequency of the SYSCLK and HCLK is 168 MHz, PCLK2 82 MHz and PCLK1 42 MHz. - Depending on the device voltage range, the maximum frequency should be - adapted accordingly: - +-------------------------------------------------------------------------------------+ - | Latency | HCLK clock frequency (MHz) | - | |---------------------------------------------------------------------| - | | voltage range | voltage range | voltage range | voltage range | - | | 2.7 V - 3.6 V | 2.4 V - 2.7 V | 2.1 V - 2.4 V | 1.8 V - 2.1 V | - |---------------|----------------|----------------|-----------------|-----------------| - |0WS(1CPU cycle)|0 < HCLK <= 30 |0 < HCLK <= 24 |0 < HCLK <= 18 |0 < HCLK <= 16 | - |---------------|----------------|----------------|-----------------|-----------------| - |1WS(2CPU cycle)|30 < HCLK <= 60 |24 < HCLK <= 48 |18 < HCLK <= 36 |16 < HCLK <= 32 | - |---------------|----------------|----------------|-----------------|-----------------| - |2WS(3CPU cycle)|60 < HCLK <= 90 |48 < HCLK <= 72 |36 < HCLK <= 54 |32 < HCLK <= 48 | - |---------------|----------------|----------------|-----------------|-----------------| - |3WS(4CPU cycle)|90 < HCLK <= 120|72 < HCLK <= 96 |54 < HCLK <= 72 |48 < HCLK <= 64 | - |---------------|----------------|----------------|-----------------|-----------------| - |4WS(5CPU cycle)|120< HCLK <= 150|96 < HCLK <= 120|72 < HCLK <= 90 |64 < HCLK <= 80 | - |---------------|----------------|----------------|-----------------|-----------------| - |5WS(6CPU cycle)|120< HCLK <= 168|120< HCLK <= 144|90 < HCLK <= 108 |80 < HCLK <= 96 | - |---------------|----------------|----------------|-----------------|-----------------| - |6WS(7CPU cycle)| NA |144< HCLK <= 168|108 < HCLK <= 120|96 < HCLK <= 112 | - |---------------|----------------|----------------|-----------------|-----------------| - |7WS(8CPU cycle)| NA | NA |120 < HCLK <= 138|112 < HCLK <= 120| - +-------------------------------------------------------------------------------------+ - @note When VOS bit (in PWR_CR register) is reset to '0’, the maximum value of HCLK is 144 MHz. - You can use PWR_MainRegulatorModeConfig() function to set or reset this bit. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the system clock (SYSCLK). - * @note The HSI is used (enabled by hardware) as system clock source after - * startup from Reset, wake-up from STOP and STANDBY mode, or in case - * of failure of the HSE used directly or indirectly as system clock - * (if the Clock Security System CSS is enabled). - * @note A switch from one clock source to another occurs only if the target - * clock source is ready (clock stable after startup delay or PLL locked). - * If a clock source which is not yet ready is selected, the switch will - * occur when the clock source will be ready. - * You can use RCC_GetSYSCLKSource() function to know which clock is - * currently used as system clock source. - * @param RCC_SYSCLKSource: specifies the clock source used as system clock. - * This parameter can be one of the following values: - * @arg RCC_SYSCLKSource_HSI: HSI selected as system clock source - * @arg RCC_SYSCLKSource_HSE: HSE selected as system clock source - * @arg RCC_SYSCLKSource_PLLCLK: PLL selected as system clock source - * @retval None - */ -void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource)); - - tmpreg = RCC->CFGR; - - /* Clear SW[1:0] bits */ - tmpreg &= ~RCC_CFGR_SW; - - /* Set SW[1:0] bits according to RCC_SYSCLKSource value */ - tmpreg |= RCC_SYSCLKSource; - - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @brief Returns the clock source used as system clock. - * @param None - * @retval The clock source used as system clock. The returned value can be one - * of the following: - * - 0x00: HSI used as system clock - * - 0x04: HSE used as system clock - * - 0x08: PLL used as system clock - */ -uint8_t RCC_GetSYSCLKSource(void) -{ - return ((uint8_t)(RCC->CFGR & RCC_CFGR_SWS)); -} - -/** - * @brief Configures the AHB clock (HCLK). - * @note Depending on the device voltage range, the software has to set correctly - * these bits to ensure that HCLK not exceed the maximum allowed frequency - * (for more details refer to section above - * "CPU, AHB and APB busses clocks configuration functions") - * @param RCC_SYSCLK: defines the AHB clock divider. This clock is derived from - * the system clock (SYSCLK). - * This parameter can be one of the following values: - * @arg RCC_SYSCLK_Div1: AHB clock = SYSCLK - * @arg RCC_SYSCLK_Div2: AHB clock = SYSCLK/2 - * @arg RCC_SYSCLK_Div4: AHB clock = SYSCLK/4 - * @arg RCC_SYSCLK_Div8: AHB clock = SYSCLK/8 - * @arg RCC_SYSCLK_Div16: AHB clock = SYSCLK/16 - * @arg RCC_SYSCLK_Div64: AHB clock = SYSCLK/64 - * @arg RCC_SYSCLK_Div128: AHB clock = SYSCLK/128 - * @arg RCC_SYSCLK_Div256: AHB clock = SYSCLK/256 - * @arg RCC_SYSCLK_Div512: AHB clock = SYSCLK/512 - * @retval None - */ -void RCC_HCLKConfig(uint32_t RCC_SYSCLK) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_HCLK(RCC_SYSCLK)); - - tmpreg = RCC->CFGR; - - /* Clear HPRE[3:0] bits */ - tmpreg &= ~RCC_CFGR_HPRE; - - /* Set HPRE[3:0] bits according to RCC_SYSCLK value */ - tmpreg |= RCC_SYSCLK; - - /* Store the new value */ - RCC->CFGR = tmpreg; -} - - -/** - * @brief Configures the Low Speed APB clock (PCLK1). - * @param RCC_HCLK: defines the APB1 clock divider. This clock is derived from - * the AHB clock (HCLK). - * This parameter can be one of the following values: - * @arg RCC_HCLK_Div1: APB1 clock = HCLK - * @arg RCC_HCLK_Div2: APB1 clock = HCLK/2 - * @arg RCC_HCLK_Div4: APB1 clock = HCLK/4 - * @arg RCC_HCLK_Div8: APB1 clock = HCLK/8 - * @arg RCC_HCLK_Div16: APB1 clock = HCLK/16 - * @retval None - */ -void RCC_PCLK1Config(uint32_t RCC_HCLK) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_PCLK(RCC_HCLK)); - - tmpreg = RCC->CFGR; - - /* Clear PPRE1[2:0] bits */ - tmpreg &= ~RCC_CFGR_PPRE1; - - /* Set PPRE1[2:0] bits according to RCC_HCLK value */ - tmpreg |= RCC_HCLK; - - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @brief Configures the High Speed APB clock (PCLK2). - * @param RCC_HCLK: defines the APB2 clock divider. This clock is derived from - * the AHB clock (HCLK). - * This parameter can be one of the following values: - * @arg RCC_HCLK_Div1: APB2 clock = HCLK - * @arg RCC_HCLK_Div2: APB2 clock = HCLK/2 - * @arg RCC_HCLK_Div4: APB2 clock = HCLK/4 - * @arg RCC_HCLK_Div8: APB2 clock = HCLK/8 - * @arg RCC_HCLK_Div16: APB2 clock = HCLK/16 - * @retval None - */ -void RCC_PCLK2Config(uint32_t RCC_HCLK) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_PCLK(RCC_HCLK)); - - tmpreg = RCC->CFGR; - - /* Clear PPRE2[2:0] bits */ - tmpreg &= ~RCC_CFGR_PPRE2; - - /* Set PPRE2[2:0] bits according to RCC_HCLK value */ - tmpreg |= RCC_HCLK << 3; - - /* Store the new value */ - RCC->CFGR = tmpreg; -} - -/** - * @brief Returns the frequencies of different on chip clocks; SYSCLK, HCLK, - * PCLK1 and PCLK2. - * - * @note The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) - * @note If SYSCLK source is HSE, function returns values based on HSE_VALUE(**) - * @note If SYSCLK source is PLL, function returns values based on HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * @note (*) HSI_VALUE is a constant defined in stm32f4xx.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * @note (**) HSE_VALUE is a constant defined in stm32f4xx.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * @note The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param RCC_Clocks: pointer to a RCC_ClocksTypeDef structure which will hold - * the clocks frequencies. - * - * @note This function can be used by the user application to compute the - * baudrate for the communication peripherals or configure other parameters. - * @note Each time SYSCLK, HCLK, PCLK1 and/or PCLK2 clock changes, this function - * must be called to update the structure's field. Otherwise, any - * configuration based on this function will be incorrect. - * - * @retval None - */ -void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks) -{ - uint32_t tmp = 0, presc = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - RCC_Clocks->SYSCLK_Frequency = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLP - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - RCC_Clocks->SYSCLK_Frequency = pllvco/pllp; - break; - default: - RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; - break; - } - /* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/ - - /* Get HCLK prescaler */ - tmp = RCC->CFGR & RCC_CFGR_HPRE; - tmp = tmp >> 4; - presc = APBAHBPrescTable[tmp]; - /* HCLK clock frequency */ - RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc; - - /* Get PCLK1 prescaler */ - tmp = RCC->CFGR & RCC_CFGR_PPRE1; - tmp = tmp >> 10; - presc = APBAHBPrescTable[tmp]; - /* PCLK1 clock frequency */ - RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc; - - /* Get PCLK2 prescaler */ - tmp = RCC->CFGR & RCC_CFGR_PPRE2; - tmp = tmp >> 13; - presc = APBAHBPrescTable[tmp]; - /* PCLK2 clock frequency */ - RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc; -} - -/** - * @} - */ - -/** @defgroup RCC_Group3 Peripheral clocks configuration functions - * @brief Peripheral clocks configuration functions - * -@verbatim - =============================================================================== - Peripheral clocks configuration functions - =============================================================================== - - This section provide functions allowing to configure the Peripheral clocks. - - 1. The RTC clock which is derived from the LSI, LSE or HSE clock divided by 2 to 31. - - 2. After restart from Reset or wakeup from STANDBY, all peripherals are off - except internal SRAM, Flash and JTAG. Before to start using a peripheral you - have to enable its interface clock. You can do this using RCC_AHBPeriphClockCmd() - , RCC_APB2PeriphClockCmd() and RCC_APB1PeriphClockCmd() functions. - - 3. To reset the peripherals configuration (to the default state after device reset) - you can use RCC_AHBPeriphResetCmd(), RCC_APB2PeriphResetCmd() and - RCC_APB1PeriphResetCmd() functions. - - 4. To further reduce power consumption in SLEEP mode the peripheral clocks can - be disabled prior to executing the WFI or WFE instructions. You can do this - using RCC_AHBPeriphClockLPModeCmd(), RCC_APB2PeriphClockLPModeCmd() and - RCC_APB1PeriphClockLPModeCmd() functions. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the RTC clock (RTCCLK). - * @note As the RTC clock configuration bits are in the Backup domain and write - * access is denied to this domain after reset, you have to enable write - * access using PWR_BackupAccessCmd(ENABLE) function before to configure - * the RTC clock source (to be done once after reset). - * @note Once the RTC clock is configured it can't be changed unless the - * Backup domain is reset using RCC_BackupResetCmd() function, or by - * a Power On Reset (POR). - * - * @param RCC_RTCCLKSource: specifies the RTC clock source. - * This parameter can be one of the following values: - * @arg RCC_RTCCLKSource_LSE: LSE selected as RTC clock - * @arg RCC_RTCCLKSource_LSI: LSI selected as RTC clock - * @arg RCC_RTCCLKSource_HSE_Divx: HSE clock divided by x selected - * as RTC clock, where x:[2,31] - * - * @note If the LSE or LSI is used as RTC clock source, the RTC continues to - * work in STOP and STANDBY modes, and can be used as wakeup source. - * However, when the HSE clock is used as RTC clock source, the RTC - * cannot be used in STOP and STANDBY modes. - * @note The maximum input clock frequency for RTC is 1MHz (when using HSE as - * RTC clock source). - * - * @retval None - */ -void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource)); - - if ((RCC_RTCCLKSource & 0x00000300) == 0x00000300) - { /* If HSE is selected as RTC clock source, configure HSE division factor for RTC clock */ - tmpreg = RCC->CFGR; - - /* Clear RTCPRE[4:0] bits */ - tmpreg &= ~RCC_CFGR_RTCPRE; - - /* Configure HSE division factor for RTC clock */ - tmpreg |= (RCC_RTCCLKSource & 0xFFFFCFF); - - /* Store the new value */ - RCC->CFGR = tmpreg; - } - - /* Select the RTC clock source */ - RCC->BDCR |= (RCC_RTCCLKSource & 0x00000FFF); -} - -/** - * @brief Enables or disables the RTC clock. - * @note This function must be used only after the RTC clock source was selected - * using the RCC_RTCCLKConfig function. - * @param NewState: new state of the RTC clock. This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_RTCCLKCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) BDCR_RTCEN_BB = (uint32_t)NewState; -} - -/** - * @brief Forces or releases the Backup domain reset. - * @note This function resets the RTC peripheral (including the backup registers) - * and the RTC clock source selection in RCC_CSR register. - * @note The BKPSRAM is not affected by this reset. - * @param NewState: new state of the Backup domain reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_BackupResetCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - *(__IO uint32_t *) BDCR_BDRST_BB = (uint32_t)NewState; -} - -/** - * @brief Configures the I2S clock source (I2SCLK). - * @note This function must be called before enabling the I2S APB clock. - * @param RCC_I2SCLKSource: specifies the I2S clock source. - * This parameter can be one of the following values: - * @arg RCC_I2S2CLKSource_PLLI2S: PLLI2S clock used as I2S clock source - * @arg RCC_I2S2CLKSource_Ext: External clock mapped on the I2S_CKIN pin - * used as I2S clock source - * @retval None - */ -void RCC_I2SCLKConfig(uint32_t RCC_I2SCLKSource) -{ - /* Check the parameters */ - assert_param(IS_RCC_I2SCLK_SOURCE(RCC_I2SCLKSource)); - - *(__IO uint32_t *) CFGR_I2SSRC_BB = RCC_I2SCLKSource; -} - -/** - * @brief Enables or disables the AHB1 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @param RCC_AHBPeriph: specifies the AHB1 peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_AHB1Periph_GPIOA: GPIOA clock - * @arg RCC_AHB1Periph_GPIOB: GPIOB clock - * @arg RCC_AHB1Periph_GPIOC: GPIOC clock - * @arg RCC_AHB1Periph_GPIOD: GPIOD clock - * @arg RCC_AHB1Periph_GPIOE: GPIOE clock - * @arg RCC_AHB1Periph_GPIOF: GPIOF clock - * @arg RCC_AHB1Periph_GPIOG: GPIOG clock - * @arg RCC_AHB1Periph_GPIOG: GPIOG clock - * @arg RCC_AHB1Periph_GPIOI: GPIOI clock - * @arg RCC_AHB1Periph_CRC: CRC clock - * @arg RCC_AHB1Periph_BKPSRAM: BKPSRAM interface clock - * @arg RCC_AHB1Periph_CCMDATARAMEN CCM data RAM interface clock - * @arg RCC_AHB1Periph_DMA1: DMA1 clock - * @arg RCC_AHB1Periph_DMA2: DMA2 clock - * @arg RCC_AHB1Periph_ETH_MAC: Ethernet MAC clock - * @arg RCC_AHB1Periph_ETH_MAC_Tx: Ethernet Transmission clock - * @arg RCC_AHB1Periph_ETH_MAC_Rx: Ethernet Reception clock - * @arg RCC_AHB1Periph_ETH_MAC_PTP: Ethernet PTP clock - * @arg RCC_AHB1Periph_OTG_HS: USB OTG HS clock - * @arg RCC_AHB1Periph_OTG_HS_ULPI: USB OTG HS ULPI clock - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph)); - - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - RCC->AHB1ENR |= RCC_AHB1Periph; - } - else - { - RCC->AHB1ENR &= ~RCC_AHB1Periph; - } -} - -/** - * @brief Enables or disables the AHB2 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @param RCC_AHBPeriph: specifies the AHB2 peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_AHB2Periph_DCMI: DCMI clock - * @arg RCC_AHB2Periph_CRYP: CRYP clock - * @arg RCC_AHB2Periph_HASH: HASH clock - * @arg RCC_AHB2Periph_RNG: RNG clock - * @arg RCC_AHB2Periph_OTG_FS: USB OTG FS clock - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB2_PERIPH(RCC_AHB2Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->AHB2ENR |= RCC_AHB2Periph; - } - else - { - RCC->AHB2ENR &= ~RCC_AHB2Periph; - } -} - -/** - * @brief Enables or disables the AHB3 peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @param RCC_AHBPeriph: specifies the AHB3 peripheral to gates its clock. - * This parameter must be: RCC_AHB3Periph_FSMC - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB3_PERIPH(RCC_AHB3Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->AHB3ENR |= RCC_AHB3Periph; - } - else - { - RCC->AHB3ENR &= ~RCC_AHB3Periph; - } -} - -/** - * @brief Enables or disables the Low Speed APB (APB1) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @param RCC_APB1Periph: specifies the APB1 peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_APB1Periph_TIM2: TIM2 clock - * @arg RCC_APB1Periph_TIM3: TIM3 clock - * @arg RCC_APB1Periph_TIM4: TIM4 clock - * @arg RCC_APB1Periph_TIM5: TIM5 clock - * @arg RCC_APB1Periph_TIM6: TIM6 clock - * @arg RCC_APB1Periph_TIM7: TIM7 clock - * @arg RCC_APB1Periph_TIM12: TIM12 clock - * @arg RCC_APB1Periph_TIM13: TIM13 clock - * @arg RCC_APB1Periph_TIM14: TIM14 clock - * @arg RCC_APB1Periph_WWDG: WWDG clock - * @arg RCC_APB1Periph_SPI2: SPI2 clock - * @arg RCC_APB1Periph_SPI3: SPI3 clock - * @arg RCC_APB1Periph_USART2: USART2 clock - * @arg RCC_APB1Periph_USART3: USART3 clock - * @arg RCC_APB1Periph_UART4: UART4 clock - * @arg RCC_APB1Periph_UART5: UART5 clock - * @arg RCC_APB1Periph_I2C1: I2C1 clock - * @arg RCC_APB1Periph_I2C2: I2C2 clock - * @arg RCC_APB1Periph_I2C3: I2C3 clock - * @arg RCC_APB1Periph_CAN1: CAN1 clock - * @arg RCC_APB1Periph_CAN2: CAN2 clock - * @arg RCC_APB1Periph_PWR: PWR clock - * @arg RCC_APB1Periph_DAC: DAC clock - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->APB1ENR |= RCC_APB1Periph; - } - else - { - RCC->APB1ENR &= ~RCC_APB1Periph; - } -} - -/** - * @brief Enables or disables the High Speed APB (APB2) peripheral clock. - * @note After reset, the peripheral clock (used for registers read/write access) - * is disabled and the application software has to enable this clock before - * using it. - * @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_APB2Periph_TIM1: TIM1 clock - * @arg RCC_APB2Periph_TIM8: TIM8 clock - * @arg RCC_APB2Periph_USART1: USART1 clock - * @arg RCC_APB2Periph_USART6: USART6 clock - * @arg RCC_APB2Periph_ADC1: ADC1 clock - * @arg RCC_APB2Periph_ADC2: ADC2 clock - * @arg RCC_APB2Periph_ADC3: ADC3 clock - * @arg RCC_APB2Periph_SDIO: SDIO clock - * @arg RCC_APB2Periph_SPI1: SPI1 clock - * @arg RCC_APB2Periph_SYSCFG: SYSCFG clock - * @arg RCC_APB2Periph_TIM9: TIM9 clock - * @arg RCC_APB2Periph_TIM10: TIM10 clock - * @arg RCC_APB2Periph_TIM11: TIM11 clock - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->APB2ENR |= RCC_APB2Periph; - } - else - { - RCC->APB2ENR &= ~RCC_APB2Periph; - } -} - -/** - * @brief Forces or releases AHB1 peripheral reset. - * @param RCC_AHB1Periph: specifies the AHB1 peripheral to reset. - * This parameter can be any combination of the following values: - * @arg RCC_AHB1Periph_GPIOA: GPIOA clock - * @arg RCC_AHB1Periph_GPIOB: GPIOB clock - * @arg RCC_AHB1Periph_GPIOC: GPIOC clock - * @arg RCC_AHB1Periph_GPIOD: GPIOD clock - * @arg RCC_AHB1Periph_GPIOE: GPIOE clock - * @arg RCC_AHB1Periph_GPIOF: GPIOF clock - * @arg RCC_AHB1Periph_GPIOG: GPIOG clock - * @arg RCC_AHB1Periph_GPIOG: GPIOG clock - * @arg RCC_AHB1Periph_GPIOI: GPIOI clock - * @arg RCC_AHB1Periph_CRC: CRC clock - * @arg RCC_AHB1Periph_DMA1: DMA1 clock - * @arg RCC_AHB1Periph_DMA2: DMA2 clock - * @arg RCC_AHB1Periph_ETH_MAC: Ethernet MAC clock - * @arg RCC_AHB1Periph_OTG_HS: USB OTG HS clock - * - * @param NewState: new state of the specified peripheral reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB1_RESET_PERIPH(RCC_AHB1Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->AHB1RSTR |= RCC_AHB1Periph; - } - else - { - RCC->AHB1RSTR &= ~RCC_AHB1Periph; - } -} - -/** - * @brief Forces or releases AHB2 peripheral reset. - * @param RCC_AHB2Periph: specifies the AHB2 peripheral to reset. - * This parameter can be any combination of the following values: - * @arg RCC_AHB2Periph_DCMI: DCMI clock - * @arg RCC_AHB2Periph_CRYP: CRYP clock - * @arg RCC_AHB2Periph_HASH: HASH clock - * @arg RCC_AHB2Periph_RNG: RNG clock - * @arg RCC_AHB2Periph_OTG_FS: USB OTG FS clock - * @param NewState: new state of the specified peripheral reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHB2PeriphResetCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB2_PERIPH(RCC_AHB2Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->AHB2RSTR |= RCC_AHB2Periph; - } - else - { - RCC->AHB2RSTR &= ~RCC_AHB2Periph; - } -} - -/** - * @brief Forces or releases AHB3 peripheral reset. - * @param RCC_AHB3Periph: specifies the AHB3 peripheral to reset. - * This parameter must be: RCC_AHB3Periph_FSMC - * @param NewState: new state of the specified peripheral reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHB3PeriphResetCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB3_PERIPH(RCC_AHB3Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - RCC->AHB3RSTR |= RCC_AHB3Periph; - } - else - { - RCC->AHB3RSTR &= ~RCC_AHB3Periph; - } -} - -/** - * @brief Forces or releases Low Speed APB (APB1) peripheral reset. - * @param RCC_APB1Periph: specifies the APB1 peripheral to reset. - * This parameter can be any combination of the following values: - * @arg RCC_APB1Periph_TIM2: TIM2 clock - * @arg RCC_APB1Periph_TIM3: TIM3 clock - * @arg RCC_APB1Periph_TIM4: TIM4 clock - * @arg RCC_APB1Periph_TIM5: TIM5 clock - * @arg RCC_APB1Periph_TIM6: TIM6 clock - * @arg RCC_APB1Periph_TIM7: TIM7 clock - * @arg RCC_APB1Periph_TIM12: TIM12 clock - * @arg RCC_APB1Periph_TIM13: TIM13 clock - * @arg RCC_APB1Periph_TIM14: TIM14 clock - * @arg RCC_APB1Periph_WWDG: WWDG clock - * @arg RCC_APB1Periph_SPI2: SPI2 clock - * @arg RCC_APB1Periph_SPI3: SPI3 clock - * @arg RCC_APB1Periph_USART2: USART2 clock - * @arg RCC_APB1Periph_USART3: USART3 clock - * @arg RCC_APB1Periph_UART4: UART4 clock - * @arg RCC_APB1Periph_UART5: UART5 clock - * @arg RCC_APB1Periph_I2C1: I2C1 clock - * @arg RCC_APB1Periph_I2C2: I2C2 clock - * @arg RCC_APB1Periph_I2C3: I2C3 clock - * @arg RCC_APB1Periph_CAN1: CAN1 clock - * @arg RCC_APB1Periph_CAN2: CAN2 clock - * @arg RCC_APB1Periph_PWR: PWR clock - * @arg RCC_APB1Periph_DAC: DAC clock - * @param NewState: new state of the specified peripheral reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - RCC->APB1RSTR |= RCC_APB1Periph; - } - else - { - RCC->APB1RSTR &= ~RCC_APB1Periph; - } -} - -/** - * @brief Forces or releases High Speed APB (APB2) peripheral reset. - * @param RCC_APB2Periph: specifies the APB2 peripheral to reset. - * This parameter can be any combination of the following values: - * @arg RCC_APB2Periph_TIM1: TIM1 clock - * @arg RCC_APB2Periph_TIM8: TIM8 clock - * @arg RCC_APB2Periph_USART1: USART1 clock - * @arg RCC_APB2Periph_USART6: USART6 clock - * @arg RCC_APB2Periph_ADC1: ADC1 clock - * @arg RCC_APB2Periph_ADC2: ADC2 clock - * @arg RCC_APB2Periph_ADC3: ADC3 clock - * @arg RCC_APB2Periph_SDIO: SDIO clock - * @arg RCC_APB2Periph_SPI1: SPI1 clock - * @arg RCC_APB2Periph_SYSCFG: SYSCFG clock - * @arg RCC_APB2Periph_TIM9: TIM9 clock - * @arg RCC_APB2Periph_TIM10: TIM10 clock - * @arg RCC_APB2Periph_TIM11: TIM11 clock - * @param NewState: new state of the specified peripheral reset. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB2_RESET_PERIPH(RCC_APB2Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - RCC->APB2RSTR |= RCC_APB2Periph; - } - else - { - RCC->APB2RSTR &= ~RCC_APB2Periph; - } -} - -/** - * @brief Enables or disables the AHB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @param RCC_AHBPeriph: specifies the AHB1 peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_AHB1Periph_GPIOA: GPIOA clock - * @arg RCC_AHB1Periph_GPIOB: GPIOB clock - * @arg RCC_AHB1Periph_GPIOC: GPIOC clock - * @arg RCC_AHB1Periph_GPIOD: GPIOD clock - * @arg RCC_AHB1Periph_GPIOE: GPIOE clock - * @arg RCC_AHB1Periph_GPIOF: GPIOF clock - * @arg RCC_AHB1Periph_GPIOG: GPIOG clock - * @arg RCC_AHB1Periph_GPIOG: GPIOG clock - * @arg RCC_AHB1Periph_GPIOI: GPIOI clock - * @arg RCC_AHB1Periph_CRC: CRC clock - * @arg RCC_AHB1Periph_BKPSRAM: BKPSRAM interface clock - * @arg RCC_AHB1Periph_DMA1: DMA1 clock - * @arg RCC_AHB1Periph_DMA2: DMA2 clock - * @arg RCC_AHB1Periph_ETH_MAC: Ethernet MAC clock - * @arg RCC_AHB1Periph_ETH_MAC_Tx: Ethernet Transmission clock - * @arg RCC_AHB1Periph_ETH_MAC_Rx: Ethernet Reception clock - * @arg RCC_AHB1Periph_ETH_MAC_PTP: Ethernet PTP clock - * @arg RCC_AHB1Periph_OTG_HS: USB OTG HS clock - * @arg RCC_AHB1Periph_OTG_HS_ULPI: USB OTG HS ULPI clock - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHB1PeriphClockLPModeCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB1_LPMODE_PERIPH(RCC_AHB1Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - RCC->AHB1LPENR |= RCC_AHB1Periph; - } - else - { - RCC->AHB1LPENR &= ~RCC_AHB1Periph; - } -} - -/** - * @brief Enables or disables the AHB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @param RCC_AHBPeriph: specifies the AHB2 peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_AHB2Periph_DCMI: DCMI clock - * @arg RCC_AHB2Periph_CRYP: CRYP clock - * @arg RCC_AHB2Periph_HASH: HASH clock - * @arg RCC_AHB2Periph_RNG: RNG clock - * @arg RCC_AHB2Periph_OTG_FS: USB OTG FS clock - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHB2PeriphClockLPModeCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB2_PERIPH(RCC_AHB2Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - RCC->AHB2LPENR |= RCC_AHB2Periph; - } - else - { - RCC->AHB2LPENR &= ~RCC_AHB2Periph; - } -} - -/** - * @brief Enables or disables the AHB3 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @param RCC_AHBPeriph: specifies the AHB3 peripheral to gates its clock. - * This parameter must be: RCC_AHB3Periph_FSMC - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_AHB3PeriphClockLPModeCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_AHB3_PERIPH(RCC_AHB3Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - RCC->AHB3LPENR |= RCC_AHB3Periph; - } - else - { - RCC->AHB3LPENR &= ~RCC_AHB3Periph; - } -} - -/** - * @brief Enables or disables the APB1 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @param RCC_APB1Periph: specifies the APB1 peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_APB1Periph_TIM2: TIM2 clock - * @arg RCC_APB1Periph_TIM3: TIM3 clock - * @arg RCC_APB1Periph_TIM4: TIM4 clock - * @arg RCC_APB1Periph_TIM5: TIM5 clock - * @arg RCC_APB1Periph_TIM6: TIM6 clock - * @arg RCC_APB1Periph_TIM7: TIM7 clock - * @arg RCC_APB1Periph_TIM12: TIM12 clock - * @arg RCC_APB1Periph_TIM13: TIM13 clock - * @arg RCC_APB1Periph_TIM14: TIM14 clock - * @arg RCC_APB1Periph_WWDG: WWDG clock - * @arg RCC_APB1Periph_SPI2: SPI2 clock - * @arg RCC_APB1Periph_SPI3: SPI3 clock - * @arg RCC_APB1Periph_USART2: USART2 clock - * @arg RCC_APB1Periph_USART3: USART3 clock - * @arg RCC_APB1Periph_UART4: UART4 clock - * @arg RCC_APB1Periph_UART5: UART5 clock - * @arg RCC_APB1Periph_I2C1: I2C1 clock - * @arg RCC_APB1Periph_I2C2: I2C2 clock - * @arg RCC_APB1Periph_I2C3: I2C3 clock - * @arg RCC_APB1Periph_CAN1: CAN1 clock - * @arg RCC_APB1Periph_CAN2: CAN2 clock - * @arg RCC_APB1Periph_PWR: PWR clock - * @arg RCC_APB1Periph_DAC: DAC clock - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB1PeriphClockLPModeCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - RCC->APB1LPENR |= RCC_APB1Periph; - } - else - { - RCC->APB1LPENR &= ~RCC_APB1Periph; - } -} - -/** - * @brief Enables or disables the APB2 peripheral clock during Low Power (Sleep) mode. - * @note Peripheral clock gating in SLEEP mode can be used to further reduce - * power consumption. - * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. - * @note By default, all peripheral clocks are enabled during SLEEP mode. - * @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock. - * This parameter can be any combination of the following values: - * @arg RCC_APB2Periph_TIM1: TIM1 clock - * @arg RCC_APB2Periph_TIM8: TIM8 clock - * @arg RCC_APB2Periph_USART1: USART1 clock - * @arg RCC_APB2Periph_USART6: USART6 clock - * @arg RCC_APB2Periph_ADC1: ADC1 clock - * @arg RCC_APB2Periph_ADC2: ADC2 clock - * @arg RCC_APB2Periph_ADC3: ADC3 clock - * @arg RCC_APB2Periph_SDIO: SDIO clock - * @arg RCC_APB2Periph_SPI1: SPI1 clock - * @arg RCC_APB2Periph_SYSCFG: SYSCFG clock - * @arg RCC_APB2Periph_TIM9: TIM9 clock - * @arg RCC_APB2Periph_TIM10: TIM10 clock - * @arg RCC_APB2Periph_TIM11: TIM11 clock - * @param NewState: new state of the specified peripheral clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_APB2PeriphClockLPModeCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - RCC->APB2LPENR |= RCC_APB2Periph; - } - else - { - RCC->APB2LPENR &= ~RCC_APB2Periph; - } -} - -/** - * @} - */ - -/** @defgroup RCC_Group4 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified RCC interrupts. - * @param RCC_IT: specifies the RCC interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt - * @arg RCC_IT_LSERDY: LSE ready interrupt - * @arg RCC_IT_HSIRDY: HSI ready interrupt - * @arg RCC_IT_HSERDY: HSE ready interrupt - * @arg RCC_IT_PLLRDY: main PLL ready interrupt - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt - * @param NewState: new state of the specified RCC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RCC_IT(RCC_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Perform Byte access to RCC_CIR[14:8] bits to enable the selected interrupts */ - *(__IO uint8_t *) CIR_BYTE2_ADDRESS |= RCC_IT; - } - else - { - /* Perform Byte access to RCC_CIR[14:8] bits to disable the selected interrupts */ - *(__IO uint8_t *) CIR_BYTE2_ADDRESS &= (uint8_t)~RCC_IT; - } -} - -/** - * @brief Checks whether the specified RCC flag is set or not. - * @param RCC_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready - * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready - * @arg RCC_FLAG_PLLRDY: main PLL clock ready - * @arg RCC_FLAG_PLLI2SRDY: PLLI2S clock ready - * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready - * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready - * @arg RCC_FLAG_BORRST: POR/PDR or BOR reset - * @arg RCC_FLAG_PINRST: Pin reset - * @arg RCC_FLAG_PORRST: POR/PDR reset - * @arg RCC_FLAG_SFTRST: Software reset - * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset - * @arg RCC_FLAG_WWDGRST: Window Watchdog reset - * @arg RCC_FLAG_LPWRRST: Low Power reset - * @retval The new state of RCC_FLAG (SET or RESET). - */ -FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) -{ - uint32_t tmp = 0; - uint32_t statusreg = 0; - FlagStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_FLAG(RCC_FLAG)); - - /* Get the RCC register index */ - tmp = RCC_FLAG >> 5; - if (tmp == 1) /* The flag to check is in CR register */ - { - statusreg = RCC->CR; - } - else if (tmp == 2) /* The flag to check is in BDCR register */ - { - statusreg = RCC->BDCR; - } - else /* The flag to check is in CSR register */ - { - statusreg = RCC->CSR; - } - - /* Get the flag position */ - tmp = RCC_FLAG & FLAG_MASK; - if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the flag status */ - return bitstatus; -} - -/** - * @brief Clears the RCC reset flags. - * The reset flags are: RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST, - * RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST - * @param None - * @retval None - */ -void RCC_ClearFlag(void) -{ - /* Set RMVF bit to clear the reset flags */ - RCC->CSR |= RCC_CSR_RMVF; -} - -/** - * @brief Checks whether the specified RCC interrupt has occurred or not. - * @param RCC_IT: specifies the RCC interrupt source to check. - * This parameter can be one of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt - * @arg RCC_IT_LSERDY: LSE ready interrupt - * @arg RCC_IT_HSIRDY: HSI ready interrupt - * @arg RCC_IT_HSERDY: HSE ready interrupt - * @arg RCC_IT_PLLRDY: main PLL ready interrupt - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt - * @arg RCC_IT_CSS: Clock Security System interrupt - * @retval The new state of RCC_IT (SET or RESET). - */ -ITStatus RCC_GetITStatus(uint8_t RCC_IT) -{ - ITStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_RCC_GET_IT(RCC_IT)); - - /* Check the status of the specified RCC interrupt */ - if ((RCC->CIR & RCC_IT) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - /* Return the RCC_IT status */ - return bitstatus; -} - -/** - * @brief Clears the RCC's interrupt pending bits. - * @param RCC_IT: specifies the interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg RCC_IT_LSIRDY: LSI ready interrupt - * @arg RCC_IT_LSERDY: LSE ready interrupt - * @arg RCC_IT_HSIRDY: HSI ready interrupt - * @arg RCC_IT_HSERDY: HSE ready interrupt - * @arg RCC_IT_PLLRDY: main PLL ready interrupt - * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt - * @arg RCC_IT_CSS: Clock Security System interrupt - * @retval None - */ -void RCC_ClearITPendingBit(uint8_t RCC_IT) -{ - /* Check the parameters */ - assert_param(IS_RCC_CLEAR_IT(RCC_IT)); - - /* Perform Byte access to RCC_CIR[23:16] bits to clear the selected interrupt - pending bits */ - *(__IO uint8_t *) CIR_BYTE3_ADDRESS = RCC_IT; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_rcc.h b/car_hw/src/lib/stdperiph/stm32f4xx_rcc.h deleted file mode 100644 index 378185646ea..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_rcc.h +++ /dev/null @@ -1,510 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_rcc.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the RCC firmware library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_RCC_H -#define __STM32F4xx_RCC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup RCC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -typedef struct -{ - uint32_t SYSCLK_Frequency; /*!< SYSCLK clock frequency expressed in Hz */ - uint32_t HCLK_Frequency; /*!< HCLK clock frequency expressed in Hz */ - uint32_t PCLK1_Frequency; /*!< PCLK1 clock frequency expressed in Hz */ - uint32_t PCLK2_Frequency; /*!< PCLK2 clock frequency expressed in Hz */ -}RCC_ClocksTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup RCC_Exported_Constants - * @{ - */ - -/** @defgroup RCC_HSE_configuration - * @{ - */ -#define RCC_HSE_OFF ((uint8_t)0x00) -#define RCC_HSE_ON ((uint8_t)0x01) -#define RCC_HSE_Bypass ((uint8_t)0x05) -#define IS_RCC_HSE(HSE) (((HSE) == RCC_HSE_OFF) || ((HSE) == RCC_HSE_ON) || \ - ((HSE) == RCC_HSE_Bypass)) -/** - * @} - */ - -/** @defgroup RCC_PLL_Clock_Source - * @{ - */ -#define RCC_PLLSource_HSI ((uint32_t)0x00000000) -#define RCC_PLLSource_HSE ((uint32_t)0x00400000) -#define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI) || \ - ((SOURCE) == RCC_PLLSource_HSE)) -#define IS_RCC_PLLM_VALUE(VALUE) ((VALUE) <= 63) -#define IS_RCC_PLLN_VALUE(VALUE) ((192 <= (VALUE)) && ((VALUE) <= 432)) -#define IS_RCC_PLLP_VALUE(VALUE) (((VALUE) == 2) || ((VALUE) == 4) || ((VALUE) == 6) || ((VALUE) == 8)) -#define IS_RCC_PLLQ_VALUE(VALUE) ((4 <= (VALUE)) && ((VALUE) <= 15)) - -#define IS_RCC_PLLI2SN_VALUE(VALUE) ((192 <= (VALUE)) && ((VALUE) <= 432)) -#define IS_RCC_PLLI2SR_VALUE(VALUE) ((2 <= (VALUE)) && ((VALUE) <= 7)) -/** - * @} - */ - -/** @defgroup RCC_System_Clock_Source - * @{ - */ -#define RCC_SYSCLKSource_HSI ((uint32_t)0x00000000) -#define RCC_SYSCLKSource_HSE ((uint32_t)0x00000001) -#define RCC_SYSCLKSource_PLLCLK ((uint32_t)0x00000002) -#define IS_RCC_SYSCLK_SOURCE(SOURCE) (((SOURCE) == RCC_SYSCLKSource_HSI) || \ - ((SOURCE) == RCC_SYSCLKSource_HSE) || \ - ((SOURCE) == RCC_SYSCLKSource_PLLCLK)) -/** - * @} - */ - -/** @defgroup RCC_AHB_Clock_Source - * @{ - */ -#define RCC_SYSCLK_Div1 ((uint32_t)0x00000000) -#define RCC_SYSCLK_Div2 ((uint32_t)0x00000080) -#define RCC_SYSCLK_Div4 ((uint32_t)0x00000090) -#define RCC_SYSCLK_Div8 ((uint32_t)0x000000A0) -#define RCC_SYSCLK_Div16 ((uint32_t)0x000000B0) -#define RCC_SYSCLK_Div64 ((uint32_t)0x000000C0) -#define RCC_SYSCLK_Div128 ((uint32_t)0x000000D0) -#define RCC_SYSCLK_Div256 ((uint32_t)0x000000E0) -#define RCC_SYSCLK_Div512 ((uint32_t)0x000000F0) -#define IS_RCC_HCLK(HCLK) (((HCLK) == RCC_SYSCLK_Div1) || ((HCLK) == RCC_SYSCLK_Div2) || \ - ((HCLK) == RCC_SYSCLK_Div4) || ((HCLK) == RCC_SYSCLK_Div8) || \ - ((HCLK) == RCC_SYSCLK_Div16) || ((HCLK) == RCC_SYSCLK_Div64) || \ - ((HCLK) == RCC_SYSCLK_Div128) || ((HCLK) == RCC_SYSCLK_Div256) || \ - ((HCLK) == RCC_SYSCLK_Div512)) -/** - * @} - */ - -/** @defgroup RCC_APB1_APB2_Clock_Source - * @{ - */ -#define RCC_HCLK_Div1 ((uint32_t)0x00000000) -#define RCC_HCLK_Div2 ((uint32_t)0x00001000) -#define RCC_HCLK_Div4 ((uint32_t)0x00001400) -#define RCC_HCLK_Div8 ((uint32_t)0x00001800) -#define RCC_HCLK_Div16 ((uint32_t)0x00001C00) -#define IS_RCC_PCLK(PCLK) (((PCLK) == RCC_HCLK_Div1) || ((PCLK) == RCC_HCLK_Div2) || \ - ((PCLK) == RCC_HCLK_Div4) || ((PCLK) == RCC_HCLK_Div8) || \ - ((PCLK) == RCC_HCLK_Div16)) -/** - * @} - */ - -/** @defgroup RCC_Interrupt_Source - * @{ - */ -#define RCC_IT_LSIRDY ((uint8_t)0x01) -#define RCC_IT_LSERDY ((uint8_t)0x02) -#define RCC_IT_HSIRDY ((uint8_t)0x04) -#define RCC_IT_HSERDY ((uint8_t)0x08) -#define RCC_IT_PLLRDY ((uint8_t)0x10) -#define RCC_IT_PLLI2SRDY ((uint8_t)0x20) -#define RCC_IT_CSS ((uint8_t)0x80) -#define IS_RCC_IT(IT) ((((IT) & (uint8_t)0xC0) == 0x00) && ((IT) != 0x00)) -#define IS_RCC_GET_IT(IT) (((IT) == RCC_IT_LSIRDY) || ((IT) == RCC_IT_LSERDY) || \ - ((IT) == RCC_IT_HSIRDY) || ((IT) == RCC_IT_HSERDY) || \ - ((IT) == RCC_IT_PLLRDY) || ((IT) == RCC_IT_CSS) || \ - ((IT) == RCC_IT_PLLI2SRDY)) -#define IS_RCC_CLEAR_IT(IT) ((((IT) & (uint8_t)0x40) == 0x00) && ((IT) != 0x00)) -/** - * @} - */ - -/** @defgroup RCC_LSE_Configuration - * @{ - */ -#define RCC_LSE_OFF ((uint8_t)0x00) -#define RCC_LSE_ON ((uint8_t)0x01) -#define RCC_LSE_Bypass ((uint8_t)0x04) -#define IS_RCC_LSE(LSE) (((LSE) == RCC_LSE_OFF) || ((LSE) == RCC_LSE_ON) || \ - ((LSE) == RCC_LSE_Bypass)) -/** - * @} - */ - -/** @defgroup RCC_RTC_Clock_Source - * @{ - */ -#define RCC_RTCCLKSource_LSE ((uint32_t)0x00000100) -#define RCC_RTCCLKSource_LSI ((uint32_t)0x00000200) -#define RCC_RTCCLKSource_HSE_Div2 ((uint32_t)0x00020300) -#define RCC_RTCCLKSource_HSE_Div3 ((uint32_t)0x00030300) -#define RCC_RTCCLKSource_HSE_Div4 ((uint32_t)0x00040300) -#define RCC_RTCCLKSource_HSE_Div5 ((uint32_t)0x00050300) -#define RCC_RTCCLKSource_HSE_Div6 ((uint32_t)0x00060300) -#define RCC_RTCCLKSource_HSE_Div7 ((uint32_t)0x00070300) -#define RCC_RTCCLKSource_HSE_Div8 ((uint32_t)0x00080300) -#define RCC_RTCCLKSource_HSE_Div9 ((uint32_t)0x00090300) -#define RCC_RTCCLKSource_HSE_Div10 ((uint32_t)0x000A0300) -#define RCC_RTCCLKSource_HSE_Div11 ((uint32_t)0x000B0300) -#define RCC_RTCCLKSource_HSE_Div12 ((uint32_t)0x000C0300) -#define RCC_RTCCLKSource_HSE_Div13 ((uint32_t)0x000D0300) -#define RCC_RTCCLKSource_HSE_Div14 ((uint32_t)0x000E0300) -#define RCC_RTCCLKSource_HSE_Div15 ((uint32_t)0x000F0300) -#define RCC_RTCCLKSource_HSE_Div16 ((uint32_t)0x00100300) -#define RCC_RTCCLKSource_HSE_Div17 ((uint32_t)0x00110300) -#define RCC_RTCCLKSource_HSE_Div18 ((uint32_t)0x00120300) -#define RCC_RTCCLKSource_HSE_Div19 ((uint32_t)0x00130300) -#define RCC_RTCCLKSource_HSE_Div20 ((uint32_t)0x00140300) -#define RCC_RTCCLKSource_HSE_Div21 ((uint32_t)0x00150300) -#define RCC_RTCCLKSource_HSE_Div22 ((uint32_t)0x00160300) -#define RCC_RTCCLKSource_HSE_Div23 ((uint32_t)0x00170300) -#define RCC_RTCCLKSource_HSE_Div24 ((uint32_t)0x00180300) -#define RCC_RTCCLKSource_HSE_Div25 ((uint32_t)0x00190300) -#define RCC_RTCCLKSource_HSE_Div26 ((uint32_t)0x001A0300) -#define RCC_RTCCLKSource_HSE_Div27 ((uint32_t)0x001B0300) -#define RCC_RTCCLKSource_HSE_Div28 ((uint32_t)0x001C0300) -#define RCC_RTCCLKSource_HSE_Div29 ((uint32_t)0x001D0300) -#define RCC_RTCCLKSource_HSE_Div30 ((uint32_t)0x001E0300) -#define RCC_RTCCLKSource_HSE_Div31 ((uint32_t)0x001F0300) -#define IS_RCC_RTCCLK_SOURCE(SOURCE) (((SOURCE) == RCC_RTCCLKSource_LSE) || \ - ((SOURCE) == RCC_RTCCLKSource_LSI) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div2) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div3) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div4) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div5) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div6) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div7) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div8) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div9) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div10) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div11) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div12) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div13) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div14) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div15) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div16) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div17) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div18) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div19) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div20) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div21) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div22) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div23) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div24) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div25) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div26) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div27) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div28) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div29) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div30) || \ - ((SOURCE) == RCC_RTCCLKSource_HSE_Div31)) -/** - * @} - */ - -/** @defgroup RCC_I2S_Clock_Source - * @{ - */ -#define RCC_I2S2CLKSource_PLLI2S ((uint8_t)0x00) -#define RCC_I2S2CLKSource_Ext ((uint8_t)0x01) - -#define IS_RCC_I2SCLK_SOURCE(SOURCE) (((SOURCE) == RCC_I2S2CLKSource_PLLI2S) || ((SOURCE) == RCC_I2S2CLKSource_Ext)) -/** - * @} - */ - -/** @defgroup RCC_AHB1_Peripherals - * @{ - */ -#define RCC_AHB1Periph_GPIOA ((uint32_t)0x00000001) -#define RCC_AHB1Periph_GPIOB ((uint32_t)0x00000002) -#define RCC_AHB1Periph_GPIOC ((uint32_t)0x00000004) -#define RCC_AHB1Periph_GPIOD ((uint32_t)0x00000008) -#define RCC_AHB1Periph_GPIOE ((uint32_t)0x00000010) -#define RCC_AHB1Periph_GPIOF ((uint32_t)0x00000020) -#define RCC_AHB1Periph_GPIOG ((uint32_t)0x00000040) -#define RCC_AHB1Periph_GPIOH ((uint32_t)0x00000080) -#define RCC_AHB1Periph_GPIOI ((uint32_t)0x00000100) -#define RCC_AHB1Periph_CRC ((uint32_t)0x00001000) -#define RCC_AHB1Periph_FLITF ((uint32_t)0x00008000) -#define RCC_AHB1Periph_SRAM1 ((uint32_t)0x00010000) -#define RCC_AHB1Periph_SRAM2 ((uint32_t)0x00020000) -#define RCC_AHB1Periph_BKPSRAM ((uint32_t)0x00040000) -#define RCC_AHB1Periph_CCMDATARAMEN ((uint32_t)0x00100000) -#define RCC_AHB1Periph_DMA1 ((uint32_t)0x00200000) -#define RCC_AHB1Periph_DMA2 ((uint32_t)0x00400000) -#define RCC_AHB1Periph_ETH_MAC ((uint32_t)0x02000000) -#define RCC_AHB1Periph_ETH_MAC_Tx ((uint32_t)0x04000000) -#define RCC_AHB1Periph_ETH_MAC_Rx ((uint32_t)0x08000000) -#define RCC_AHB1Periph_ETH_MAC_PTP ((uint32_t)0x10000000) -#define RCC_AHB1Periph_OTG_HS ((uint32_t)0x20000000) -#define RCC_AHB1Periph_OTG_HS_ULPI ((uint32_t)0x40000000) -#define IS_RCC_AHB1_CLOCK_PERIPH(PERIPH) ((((PERIPH) & 0x818BEE00) == 0x00) && ((PERIPH) != 0x00)) -#define IS_RCC_AHB1_RESET_PERIPH(PERIPH) ((((PERIPH) & 0xDD9FEE00) == 0x00) && ((PERIPH) != 0x00)) -#define IS_RCC_AHB1_LPMODE_PERIPH(PERIPH) ((((PERIPH) & 0x81986E00) == 0x00) && ((PERIPH) != 0x00)) -/** - * @} - */ - -/** @defgroup RCC_AHB2_Peripherals - * @{ - */ -#define RCC_AHB2Periph_DCMI ((uint32_t)0x00000001) -#define RCC_AHB2Periph_CRYP ((uint32_t)0x00000010) -#define RCC_AHB2Periph_HASH ((uint32_t)0x00000020) -#define RCC_AHB2Periph_RNG ((uint32_t)0x00000040) -#define RCC_AHB2Periph_OTG_FS ((uint32_t)0x00000080) -#define IS_RCC_AHB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFF0E) == 0x00) && ((PERIPH) != 0x00)) -/** - * @} - */ - -/** @defgroup RCC_AHB3_Peripherals - * @{ - */ -#define RCC_AHB3Periph_FSMC ((uint32_t)0x00000001) -#define IS_RCC_AHB3_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFFFE) == 0x00) && ((PERIPH) != 0x00)) -/** - * @} - */ - -/** @defgroup RCC_APB1_Peripherals - * @{ - */ -#define RCC_APB1Periph_TIM2 ((uint32_t)0x00000001) -#define RCC_APB1Periph_TIM3 ((uint32_t)0x00000002) -#define RCC_APB1Periph_TIM4 ((uint32_t)0x00000004) -#define RCC_APB1Periph_TIM5 ((uint32_t)0x00000008) -#define RCC_APB1Periph_TIM6 ((uint32_t)0x00000010) -#define RCC_APB1Periph_TIM7 ((uint32_t)0x00000020) -#define RCC_APB1Periph_TIM12 ((uint32_t)0x00000040) -#define RCC_APB1Periph_TIM13 ((uint32_t)0x00000080) -#define RCC_APB1Periph_TIM14 ((uint32_t)0x00000100) -#define RCC_APB1Periph_WWDG ((uint32_t)0x00000800) -#define RCC_APB1Periph_SPI2 ((uint32_t)0x00004000) -#define RCC_APB1Periph_SPI3 ((uint32_t)0x00008000) -#define RCC_APB1Periph_USART2 ((uint32_t)0x00020000) -#define RCC_APB1Periph_USART3 ((uint32_t)0x00040000) -#define RCC_APB1Periph_UART4 ((uint32_t)0x00080000) -#define RCC_APB1Periph_UART5 ((uint32_t)0x00100000) -#define RCC_APB1Periph_I2C1 ((uint32_t)0x00200000) -#define RCC_APB1Periph_I2C2 ((uint32_t)0x00400000) -#define RCC_APB1Periph_I2C3 ((uint32_t)0x00800000) -#define RCC_APB1Periph_CAN1 ((uint32_t)0x02000000) -#define RCC_APB1Periph_CAN2 ((uint32_t)0x04000000) -#define RCC_APB1Periph_PWR ((uint32_t)0x10000000) -#define RCC_APB1Periph_DAC ((uint32_t)0x20000000) -#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0xC9013600) == 0x00) && ((PERIPH) != 0x00)) -/** - * @} - */ - -/** @defgroup RCC_APB2_Peripherals - * @{ - */ -#define RCC_APB2Periph_TIM1 ((uint32_t)0x00000001) -#define RCC_APB2Periph_TIM8 ((uint32_t)0x00000002) -#define RCC_APB2Periph_USART1 ((uint32_t)0x00000010) -#define RCC_APB2Periph_USART6 ((uint32_t)0x00000020) -#define RCC_APB2Periph_ADC ((uint32_t)0x00000100) -#define RCC_APB2Periph_ADC1 ((uint32_t)0x00000100) -#define RCC_APB2Periph_ADC2 ((uint32_t)0x00000200) -#define RCC_APB2Periph_ADC3 ((uint32_t)0x00000400) -#define RCC_APB2Periph_SDIO ((uint32_t)0x00000800) -#define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000) -#define RCC_APB2Periph_SYSCFG ((uint32_t)0x00004000) -#define RCC_APB2Periph_TIM9 ((uint32_t)0x00010000) -#define RCC_APB2Periph_TIM10 ((uint32_t)0x00020000) -#define RCC_APB2Periph_TIM11 ((uint32_t)0x00040000) -#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFF8A0CC) == 0x00) && ((PERIPH) != 0x00)) -#define IS_RCC_APB2_RESET_PERIPH(PERIPH) ((((PERIPH) & 0xFFF8A6CC) == 0x00) && ((PERIPH) != 0x00)) -/** - * @} - */ - -/** @defgroup RCC_MCO1_Clock_Source_Prescaler - * @{ - */ -#define RCC_MCO1Source_HSI ((uint32_t)0x00000000) -#define RCC_MCO1Source_LSE ((uint32_t)0x00200000) -#define RCC_MCO1Source_HSE ((uint32_t)0x00400000) -#define RCC_MCO1Source_PLLCLK ((uint32_t)0x00600000) -#define RCC_MCO1Div_1 ((uint32_t)0x00000000) -#define RCC_MCO1Div_2 ((uint32_t)0x04000000) -#define RCC_MCO1Div_3 ((uint32_t)0x05000000) -#define RCC_MCO1Div_4 ((uint32_t)0x06000000) -#define RCC_MCO1Div_5 ((uint32_t)0x07000000) -#define IS_RCC_MCO1SOURCE(SOURCE) (((SOURCE) == RCC_MCO1Source_HSI) || ((SOURCE) == RCC_MCO1Source_LSE) || \ - ((SOURCE) == RCC_MCO1Source_HSE) || ((SOURCE) == RCC_MCO1Source_PLLCLK)) - -#define IS_RCC_MCO1DIV(DIV) (((DIV) == RCC_MCO1Div_1) || ((DIV) == RCC_MCO1Div_2) || \ - ((DIV) == RCC_MCO1Div_3) || ((DIV) == RCC_MCO1Div_4) || \ - ((DIV) == RCC_MCO1Div_5)) -/** - * @} - */ - -/** @defgroup RCC_MCO2_Clock_Source_Prescaler - * @{ - */ -#define RCC_MCO2Source_SYSCLK ((uint32_t)0x00000000) -#define RCC_MCO2Source_PLLI2SCLK ((uint32_t)0x40000000) -#define RCC_MCO2Source_HSE ((uint32_t)0x80000000) -#define RCC_MCO2Source_PLLCLK ((uint32_t)0xC0000000) -#define RCC_MCO2Div_1 ((uint32_t)0x00000000) -#define RCC_MCO2Div_2 ((uint32_t)0x20000000) -#define RCC_MCO2Div_3 ((uint32_t)0x28000000) -#define RCC_MCO2Div_4 ((uint32_t)0x30000000) -#define RCC_MCO2Div_5 ((uint32_t)0x38000000) -#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2Source_SYSCLK) || ((SOURCE) == RCC_MCO2Source_PLLI2SCLK)|| \ - ((SOURCE) == RCC_MCO2Source_HSE) || ((SOURCE) == RCC_MCO2Source_PLLCLK)) - -#define IS_RCC_MCO2DIV(DIV) (((DIV) == RCC_MCO2Div_1) || ((DIV) == RCC_MCO2Div_2) || \ - ((DIV) == RCC_MCO2Div_3) || ((DIV) == RCC_MCO2Div_4) || \ - ((DIV) == RCC_MCO2Div_5)) -/** - * @} - */ - -/** @defgroup RCC_Flag - * @{ - */ -#define RCC_FLAG_HSIRDY ((uint8_t)0x21) -#define RCC_FLAG_HSERDY ((uint8_t)0x31) -#define RCC_FLAG_PLLRDY ((uint8_t)0x39) -#define RCC_FLAG_PLLI2SRDY ((uint8_t)0x3B) -#define RCC_FLAG_LSERDY ((uint8_t)0x41) -#define RCC_FLAG_LSIRDY ((uint8_t)0x61) -#define RCC_FLAG_BORRST ((uint8_t)0x79) -#define RCC_FLAG_PINRST ((uint8_t)0x7A) -#define RCC_FLAG_PORRST ((uint8_t)0x7B) -#define RCC_FLAG_SFTRST ((uint8_t)0x7C) -#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) -#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) -#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) -#define IS_RCC_FLAG(FLAG) (((FLAG) == RCC_FLAG_HSIRDY) || ((FLAG) == RCC_FLAG_HSERDY) || \ - ((FLAG) == RCC_FLAG_PLLRDY) || ((FLAG) == RCC_FLAG_LSERDY) || \ - ((FLAG) == RCC_FLAG_LSIRDY) || ((FLAG) == RCC_FLAG_BORRST) || \ - ((FLAG) == RCC_FLAG_PINRST) || ((FLAG) == RCC_FLAG_PORRST) || \ - ((FLAG) == RCC_FLAG_SFTRST) || ((FLAG) == RCC_FLAG_IWDGRST)|| \ - ((FLAG) == RCC_FLAG_WWDGRST)|| ((FLAG) == RCC_FLAG_LPWRRST)|| \ - ((FLAG) == RCC_FLAG_PLLI2SRDY)) -#define IS_RCC_CALIBRATION_VALUE(VALUE) ((VALUE) <= 0x1F) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the RCC clock configuration to the default reset state */ -void RCC_DeInit(void); - -/* Internal/external clocks, PLL, CSS and MCO configuration functions *********/ -void RCC_HSEConfig(uint8_t RCC_HSE); -ErrorStatus RCC_WaitForHSEStartUp(void); -void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue); -void RCC_HSICmd(FunctionalState NewState); -void RCC_LSEConfig(uint8_t RCC_LSE); -void RCC_LSICmd(FunctionalState NewState); - -void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ); -void RCC_PLLCmd(FunctionalState NewState); -void RCC_PLLI2SConfig(uint32_t PLLI2SN, uint32_t PLLI2SR); -void RCC_PLLI2SCmd(FunctionalState NewState); - -void RCC_ClockSecuritySystemCmd(FunctionalState NewState); -void RCC_MCO1Config(uint32_t RCC_MCO1Source, uint32_t RCC_MCO1Div); -void RCC_MCO2Config(uint32_t RCC_MCO2Source, uint32_t RCC_MCO2Div); - -/* System, AHB and APB busses clocks configuration functions ******************/ -void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource); -uint8_t RCC_GetSYSCLKSource(void); -void RCC_HCLKConfig(uint32_t RCC_SYSCLK); -void RCC_PCLK1Config(uint32_t RCC_HCLK); -void RCC_PCLK2Config(uint32_t RCC_HCLK); -void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks); - -/* Peripheral clocks configuration functions **********************************/ -void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource); -void RCC_RTCCLKCmd(FunctionalState NewState); -void RCC_BackupResetCmd(FunctionalState NewState); -void RCC_I2SCLKConfig(uint32_t RCC_I2SCLKSource); - -void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState); -void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState); -void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState); -void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); -void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); - -void RCC_AHB1PeriphResetCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState); -void RCC_AHB2PeriphResetCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState); -void RCC_AHB3PeriphResetCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState); -void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); -void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); - -void RCC_AHB1PeriphClockLPModeCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState); -void RCC_AHB2PeriphClockLPModeCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState); -void RCC_AHB3PeriphClockLPModeCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState); -void RCC_APB1PeriphClockLPModeCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); -void RCC_APB2PeriphClockLPModeCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); - -/* Interrupts and flags management functions **********************************/ -void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState); -FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG); -void RCC_ClearFlag(void); -ITStatus RCC_GetITStatus(uint8_t RCC_IT); -void RCC_ClearITPendingBit(uint8_t RCC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_RCC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_rng.c b/car_hw/src/lib/stdperiph/stm32f4xx_rng.c deleted file mode 100644 index 05f428d369c..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_rng.c +++ /dev/null @@ -1,400 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_rng.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Random Number Generator (RNG) peripheral: - * - Initialization and Configuration - * - Get 32 bit Random number - * - Interrupts and flags management - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - * 1. Enable The RNG controller clock using - * RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE) function. - * - * 2. Activate the RNG peripheral using RNG_Cmd() function. - * - * 3. Wait until the 32 bit Random number Generator contains a valid - * random data (using polling/interrupt mode). For more details, - * refer to "Interrupts and flags management functions" module - * description. - * - * 4. Get the 32 bit Random number using RNG_GetRandomNumber() function - * - * 5. To get another 32 bit Random number, go to step 3. - * - * - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_rng.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup RNG - * @brief RNG driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup RNG_Private_Functions - * @{ - */ - -/** @defgroup RNG_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - Initialization and Configuration functions - =============================================================================== - This section provides functions allowing to - - Initialize the RNG peripheral - - Enable or disable the RNG peripheral - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the RNG peripheral registers to their default reset values. - * @param None - * @retval None - */ -void RNG_DeInit(void) -{ - /* Enable RNG reset state */ - RCC_AHB2PeriphResetCmd(RCC_AHB2Periph_RNG, ENABLE); - - /* Release RNG from reset state */ - RCC_AHB2PeriphResetCmd(RCC_AHB2Periph_RNG, DISABLE); -} - -/** - * @brief Enables or disables the RNG peripheral. - * @param NewState: new state of the RNG peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RNG_Cmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the RNG */ - RNG->CR |= RNG_CR_RNGEN; - } - else - { - /* Disable the RNG */ - RNG->CR &= ~RNG_CR_RNGEN; - } -} -/** - * @} - */ - -/** @defgroup RNG_Group2 Get 32 bit Random number function - * @brief Get 32 bit Random number function - * - -@verbatim - =============================================================================== - Get 32 bit Random number function - =============================================================================== - This section provides a function allowing to get the 32 bit Random number - - @note Before to call this function you have to wait till DRDY flag is set, - using RNG_GetFlagStatus(RNG_FLAG_DRDY) function. - -@endverbatim - * @{ - */ - - -/** - * @brief Returns a 32-bit random number. - * - * @note Before to call this function you have to wait till DRDY (data ready) - * flag is set, using RNG_GetFlagStatus(RNG_FLAG_DRDY) function. - * @note Each time the the Random number data is read (using RNG_GetRandomNumber() - * function), the RNG_FLAG_DRDY flag is automatically cleared. - * @note In the case of a seed error, the generation of random numbers is - * interrupted for as long as the SECS bit is '1'. If a number is - * available in the RNG_DR register, it must not be used because it may - * not have enough entropy. In this case, it is recommended to clear the - * SEIS bit(using RNG_ClearFlag(RNG_FLAG_SECS) function), then disable - * and enable the RNG peripheral (using RNG_Cmd() function) to - * reinitialize and restart the RNG. - * @note In the case of a clock error, the RNG is no more able to generate - * random numbers because the PLL48CLK clock is not correct. User have - * to check that the clock controller is correctly configured to provide - * the RNG clock and clear the CEIS bit (using RNG_ClearFlag(RNG_FLAG_CECS) - * function) . The clock error has no impact on the previously generated - * random numbers, and the RNG_DR register contents can be used. - * - * @param None - * @retval 32-bit random number. - */ -uint32_t RNG_GetRandomNumber(void) -{ - /* Return the 32 bit random number from the DR register */ - return RNG->DR; -} - - -/** - * @} - */ - -/** @defgroup RNG_Group3 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - - This section provides functions allowing to configure the RNG Interrupts and - to get the status and clear flags and Interrupts pending bits. - - The RNG provides 3 Interrupts sources and 3 Flags: - - Flags : - ---------- - 1. RNG_FLAG_DRDY : In the case of the RNG_DR register contains valid - random data. it is cleared by reading the valid data - (using RNG_GetRandomNumber() function). - - 2. RNG_FLAG_CECS : In the case of a seed error detection. - - 3. RNG_FLAG_SECS : In the case of a clock error detection. - - - Interrupts : - ------------ - if enabled, an RNG interrupt is pending : - - 1. In the case of the RNG_DR register contains valid random data. - This interrupt source is cleared once the RNG_DR register has been read - (using RNG_GetRandomNumber() function) until a new valid value is - computed. - - or - 2. In the case of a seed error : One of the following faulty sequences has - been detected: - - More than 64 consecutive bits at the same value (0 or 1) - - More than 32 consecutive alternance of 0 and 1 (0101010101...01) - This interrupt source is cleared using RNG_ClearITPendingBit(RNG_IT_SEI) - function. - - or - 3. In the case of a clock error : the PLL48CLK (RNG peripheral clock source) - was not correctly detected (fPLL48CLK< fHCLK/16). - This interrupt source is cleared using RNG_ClearITPendingBit(RNG_IT_CEI) - function. - @note In this case, User have to check that the clock controller is - correctly configured to provide the RNG clock. - - Managing the RNG controller events : - ------------------------------------ - The user should identify which mode will be used in his application to manage - the RNG controller events: Polling mode or Interrupt mode. - - 1. In the Polling Mode it is advised to use the following functions: - - RNG_GetFlagStatus() : to check if flags events occur. - - RNG_ClearFlag() : to clear the flags events. - - @note RNG_FLAG_DRDY can not be cleared by RNG_ClearFlag(). it is cleared only - by reading the Random number data. - - 2. In the Interrupt Mode it is advised to use the following functions: - - RNG_ITConfig() : to enable or disable the interrupt source. - - RNG_GetITStatus() : to check if Interrupt occurs. - - RNG_ClearITPendingBit() : to clear the Interrupt pending Bit - (corresponding Flag). - - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the RNG interrupt. - * @note The RNG provides 3 interrupt sources, - * - Computed data is ready event (DRDY), and - * - Seed error Interrupt (SEI) and - * - Clock error Interrupt (CEI), - * all these interrupts sources are enabled by setting the IE bit in - * CR register. However, each interrupt have its specific status bit - * (see RNG_GetITStatus() function) and clear bit except the DRDY event - * (see RNG_ClearITPendingBit() function). - * @param NewState: new state of the RNG interrupt. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RNG_ITConfig(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the RNG interrupt */ - RNG->CR |= RNG_CR_IE; - } - else - { - /* Disable the RNG interrupt */ - RNG->CR &= ~RNG_CR_IE; - } -} - -/** - * @brief Checks whether the specified RNG flag is set or not. - * @param RNG_FLAG: specifies the RNG flag to check. - * This parameter can be one of the following values: - * @arg RNG_FLAG_DRDY: Data Ready flag. - * @arg RNG_FLAG_CECS: Clock Error Current flag. - * @arg RNG_FLAG_SECS: Seed Error Current flag. - * @retval The new state of RNG_FLAG (SET or RESET). - */ -FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_RNG_GET_FLAG(RNG_FLAG)); - - /* Check the status of the specified RNG flag */ - if ((RNG->SR & RNG_FLAG) != (uint8_t)RESET) - { - /* RNG_FLAG is set */ - bitstatus = SET; - } - else - { - /* RNG_FLAG is reset */ - bitstatus = RESET; - } - /* Return the RNG_FLAG status */ - return bitstatus; -} - - -/** - * @brief Clears the RNG flags. - * @param RNG_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg RNG_FLAG_CECS: Clock Error Current flag. - * @arg RNG_FLAG_SECS: Seed Error Current flag. - * @note RNG_FLAG_DRDY can not be cleared by RNG_ClearFlag() function. - * This flag is cleared only by reading the Random number data (using - * RNG_GetRandomNumber() function). - * @retval None - */ -void RNG_ClearFlag(uint8_t RNG_FLAG) -{ - /* Check the parameters */ - assert_param(IS_RNG_CLEAR_FLAG(RNG_FLAG)); - /* Clear the selected RNG flags */ - RNG->SR = ~(uint32_t)(((uint32_t)RNG_FLAG) << 4); -} - -/** - * @brief Checks whether the specified RNG interrupt has occurred or not. - * @param RNG_IT: specifies the RNG interrupt source to check. - * This parameter can be one of the following values: - * @arg RNG_IT_CEI: Clock Error Interrupt. - * @arg RNG_IT_SEI: Seed Error Interrupt. - * @retval The new state of RNG_IT (SET or RESET). - */ -ITStatus RNG_GetITStatus(uint8_t RNG_IT) -{ - ITStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_RNG_GET_IT(RNG_IT)); - - /* Check the status of the specified RNG interrupt */ - if ((RNG->SR & RNG_IT) != (uint8_t)RESET) - { - /* RNG_IT is set */ - bitstatus = SET; - } - else - { - /* RNG_IT is reset */ - bitstatus = RESET; - } - /* Return the RNG_IT status */ - return bitstatus; -} - - -/** - * @brief Clears the RNG interrupt pending bit(s). - * @param RNG_IT: specifies the RNG interrupt pending bit(s) to clear. - * This parameter can be any combination of the following values: - * @arg RNG_IT_CEI: Clock Error Interrupt. - * @arg RNG_IT_SEI: Seed Error Interrupt. - * @retval None - */ -void RNG_ClearITPendingBit(uint8_t RNG_IT) -{ - /* Check the parameters */ - assert_param(IS_RNG_IT(RNG_IT)); - - /* Clear the selected RNG interrupt pending bit */ - RNG->SR = (uint8_t)~RNG_IT; -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ - - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_rng.h b/car_hw/src/lib/stdperiph/stm32f4xx_rng.h deleted file mode 100644 index 5e4703ee1f1..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_rng.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_rng.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the Random - * Number Generator(RNG) firmware library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_RNG_H -#define __STM32F4xx_RNG_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup RNG - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup RNG_Exported_Constants - * @{ - */ - -/** @defgroup RNG_flags_definition - * @{ - */ -#define RNG_FLAG_DRDY ((uint8_t)0x0001) /*!< Data ready */ -#define RNG_FLAG_CECS ((uint8_t)0x0002) /*!< Clock error current status */ -#define RNG_FLAG_SECS ((uint8_t)0x0004) /*!< Seed error current status */ - -#define IS_RNG_GET_FLAG(RNG_FLAG) (((RNG_FLAG) == RNG_FLAG_DRDY) || \ - ((RNG_FLAG) == RNG_FLAG_CECS) || \ - ((RNG_FLAG) == RNG_FLAG_SECS)) -#define IS_RNG_CLEAR_FLAG(RNG_FLAG) (((RNG_FLAG) == RNG_FLAG_CECS) || \ - ((RNG_FLAG) == RNG_FLAG_SECS)) -/** - * @} - */ - -/** @defgroup RNG_interrupts_definition - * @{ - */ -#define RNG_IT_CEI ((uint8_t)0x20) /*!< Clock error interrupt */ -#define RNG_IT_SEI ((uint8_t)0x40) /*!< Seed error interrupt */ - -#define IS_RNG_IT(IT) ((((IT) & (uint8_t)0x9F) == 0x00) && ((IT) != 0x00)) -#define IS_RNG_GET_IT(RNG_IT) (((RNG_IT) == RNG_IT_CEI) || ((RNG_IT) == RNG_IT_SEI)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the RNG configuration to the default reset state *****/ -void RNG_DeInit(void); - -/* Configuration function *****************************************************/ -void RNG_Cmd(FunctionalState NewState); - -/* Get 32 bit Random number function ******************************************/ -uint32_t RNG_GetRandomNumber(void); - -/* Interrupts and flags management functions **********************************/ -void RNG_ITConfig(FunctionalState NewState); -FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG); -void RNG_ClearFlag(uint8_t RNG_FLAG); -ITStatus RNG_GetITStatus(uint8_t RNG_IT); -void RNG_ClearITPendingBit(uint8_t RNG_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_RNG_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_rtc.c b/car_hw/src/lib/stdperiph/stm32f4xx_rtc.c deleted file mode 100644 index 0ab10cef042..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_rtc.c +++ /dev/null @@ -1,2733 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_rtc.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Real-Time Clock (RTC) peripheral: - * - Initialization - * - Calendar (Time and Date) configuration - * - Alarms (Alarm A and Alarm B) configuration - * - WakeUp Timer configuration - * - Daylight Saving configuration - * - Output pin Configuration - * - Coarse digital Calibration configuration - * - Smooth digital Calibration configuration - * - TimeStamp configuration - * - Tampers configuration - * - Backup Data Registers configuration - * - Shift control synchronisation - * - RTC Tamper and TimeStamp Pins Selection and Output Type Config configuration - * - Interrupts and flags management - * - * @verbatim - * - * =================================================================== - * Backup Domain Operating Condition - * =================================================================== - * The real-time clock (RTC), the RTC backup registers, and the backup - * SRAM (BKP SRAM) can be powered from the VBAT voltage when the main - * VDD supply is powered off. - * To retain the content of the RTC backup registers, backup SRAM, - * and supply the RTC when VDD is turned off, VBAT pin can be connected - * to an optional standby voltage supplied by a battery or by another - * source. - * - * To allow the RTC to operate even when the main digital supply (VDD) - * is turned off, the VBAT pin powers the following blocks: - * 1 - The RTC - * 2 - The LSE oscillator - * 3 - The backup SRAM when the low power backup regulator is enabled - * 4 - PC13 to PC15 I/Os, plus PI8 I/O (when available) - * - * When the backup domain is supplied by VDD (analog switch connected - * to VDD), the following functions are available: - * 1 - PC14 and PC15 can be used as either GPIO or LSE pins - * 2 - PC13 can be used as a GPIO or as the RTC_AF1 pin - * 3 - PI8 can be used as a GPIO or as the RTC_AF2 pin - * - * When the backup domain is supplied by VBAT (analog switch connected - * to VBAT because VDD is not present), the following functions are available: - * 1 - PC14 and PC15 can be used as LSE pins only - * 2 - PC13 can be used as the RTC_AF1 pin - * 3 - PI8 can be used as the RTC_AF2 pin - * - * =================================================================== - * Backup Domain Reset - * =================================================================== - * The backup domain reset sets all RTC registers and the RCC_BDCR - * register to their reset values. The BKPSRAM is not affected by this - * reset. The only way of resetting the BKPSRAM is through the Flash - * interface by requesting a protection level change from 1 to 0. - * A backup domain reset is generated when one of the following events - * occurs: - * 1 - Software reset, triggered by setting the BDRST bit in the - * RCC Backup domain control register (RCC_BDCR). You can use the - * RCC_BackupResetCmd(). - * 2 - VDD or VBAT power on, if both supplies have previously been - * powered off. - * - * =================================================================== - * Backup Domain Access - * =================================================================== - * After reset, the backup domain (RTC registers, RTC backup data - * registers and backup SRAM) is protected against possible unwanted - * write accesses. - * To enable access to the RTC Domain and RTC registers, proceed as follows: - * - Enable the Power Controller (PWR) APB1 interface clock using the - * RCC_APB1PeriphClockCmd() function. - * - Enable access to RTC domain using the PWR_BackupAccessCmd() function. - * - Select the RTC clock source using the RCC_RTCCLKConfig() function. - * - Enable RTC Clock using the RCC_RTCCLKCmd() function. - * - * =================================================================== - * RTC Driver: how to use it - * =================================================================== - * - Enable the RTC domain access (see description in the section above) - * - Configure the RTC Prescaler (Asynchronous and Synchronous) and - * RTC hour format using the RTC_Init() function. - * - * Time and Date configuration - * =========================== - * - To configure the RTC Calendar (Time and Date) use the RTC_SetTime() - * and RTC_SetDate() functions. - * - To read the RTC Calendar, use the RTC_GetTime() and RTC_GetDate() - * functions. - * - Use the RTC_DayLightSavingConfig() function to add or sub one - * hour to the RTC Calendar. - * - * Alarm configuration - * =================== - * - To configure the RTC Alarm use the RTC_SetAlarm() function. - * - Enable the selected RTC Alarm using the RTC_AlarmCmd() function - * - To read the RTC Alarm, use the RTC_GetAlarm() function. - * - To read the RTC alarm SubSecond, use the RTC_GetAlarmSubSecond() function. - * - * RTC Wakeup configuration - * ======================== - * - Configure the RTC Wakeup Clock source use the RTC_WakeUpClockConfig() - * function. - * - Configure the RTC WakeUp Counter using the RTC_SetWakeUpCounter() - * function - * - Enable the RTC WakeUp using the RTC_WakeUpCmd() function - * - To read the RTC WakeUp Counter register, use the RTC_GetWakeUpCounter() - * function. - * - * Outputs configuration - * ===================== - * The RTC has 2 different outputs: - * - AFO_ALARM: this output is used to manage the RTC Alarm A, Alarm B - * and WaKeUp signals. - * To output the selected RTC signal on RTC_AF1 pin, use the - * RTC_OutputConfig() function. - * - AFO_CALIB: this output is 512Hz signal or 1Hz . - * To output the RTC Clock on RTC_AF1 pin, use the RTC_CalibOutputCmd() - * function. - * - * Smooth digital Calibration configuration - * ================================= - * - Configure the RTC Original Digital Calibration Value and the corresponding - * calibration cycle period (32s,16s and 8s) using the RTC_SmoothCalibConfig() - * function. - * - * Coarse digital Calibration configuration - * ================================= - * - Configure the RTC Coarse Calibration Value and the corresponding - * sign using the RTC_CoarseCalibConfig() function. - * - Enable the RTC Coarse Calibration using the RTC_CoarseCalibCmd() - * function - * - * TimeStamp configuration - * ======================= - * - Configure the RTC_AF1 trigger and enables the RTC TimeStamp - * using the RTC_TimeStampCmd() function. - * - To read the RTC TimeStamp Time and Date register, use the - * RTC_GetTimeStamp() function. - * - To read the RTC TimeStamp SubSecond register, use the - * RTC_GetTimeStampSubSecond() function. - * - The TAMPER1 alternate function can be mapped either to RTC_AF1(PC13) - * or RTC_AF2 (PI8) depending on the value of TAMP1INSEL bit in - * RTC_TAFCR register. You can use the RTC_TamperPinSelection() - * function to select the corresponding pin. - * - * Tamper configuration - * ==================== - * - Enable the RTC Tamper using the RTC_TamperCmd() function. - * - Configure the Tamper filter count using RTC_TamperFilterConfig() - * function. - * - Configure the RTC Tamper trigger Edge or Level according to the Tamper - * filter (if equal to 0 Edge else Level) value using the RTC_TamperConfig() function. - * - Configure the Tamper sampling frequency using RTC_TamperSamplingFreqConfig() - * function. - * - Configure the Tamper precharge or discharge duration using - * RTC_TamperPinsPrechargeDuration() function. - * - Enable the Tamper Pull-UP using RTC_TamperPullUpDisableCmd() function. - * - Enable the Time stamp on Tamper detection event using - * RTC_TSOnTamperDetecCmd() function. - * - The TIMESTAMP alternate function can be mapped to either RTC_AF1 - * or RTC_AF2 depending on the value of the TSINSEL bit in the - * RTC_TAFCR register. You can use the RTC_TimeStampPinSelection() - * function to select the corresponding pin. - * - * Backup Data Registers configuration - * =================================== - * - To write to the RTC Backup Data registers, use the RTC_WriteBackupRegister() - * function. - * - To read the RTC Backup Data registers, use the RTC_ReadBackupRegister() - * function. - * - * =================================================================== - * RTC and low power modes - * =================================================================== - * The MCU can be woken up from a low power mode by an RTC alternate - * function. - * The RTC alternate functions are the RTC alarms (Alarm A and Alarm B), - * RTC wakeup, RTC tamper event detection and RTC time stamp event detection. - * These RTC alternate functions can wake up the system from the Stop - * and Standby lowpower modes. - * The system can also wake up from low power modes without depending - * on an external interrupt (Auto-wakeup mode), by using the RTC alarm - * or the RTC wakeup events. - * The RTC provides a programmable time base for waking up from the - * Stop or Standby mode at regular intervals. - * Wakeup from STOP and Standby modes is possible only when the RTC - * clock source is LSE or LSI. - * - * =================================================================== - * Selection of RTC_AF1 alternate functions - * =================================================================== - * The RTC_AF1 pin (PC13) can be used for the following purposes: - * - AFO_ALARM output - * - AFO_CALIB output - * - AFI_TAMPER - * - AFI_TIMESTAMP - * - * +-------------------------------------------------------------------------------------------------------------+ - * | Pin |AFO_ALARM |AFO_CALIB |AFI_TAMPER |AFI_TIMESTAMP | TAMP1INSEL | TSINSEL |ALARMOUTTYPE | - * | configuration | ENABLED | ENABLED | ENABLED | ENABLED |TAMPER1 pin |TIMESTAMP pin | AFO_ALARM | - * | and function | | | | | selection | selection |Configuration | - * |-----------------|----------|----------|-----------|--------------|------------|--------------|--------------| - * | Alarm out | | | | | Don't | Don't | | - * | output OD | 1 |Don't care|Don't care | Don't care | care | care | 0 | - * |-----------------|----------|----------|-----------|--------------|------------|--------------|--------------| - * | Alarm out | | | | | Don't | Don't | | - * | output PP | 1 |Don't care|Don't care | Don't care | care | care | 1 | - * |-----------------|----------|----------|-----------|--------------|------------|--------------|--------------| - * | Calibration out | | | | | Don't | Don't | | - * | output PP | 0 | 1 |Don't care | Don't care | care | care | Don't care | - * |-----------------|----------|----------|-----------|--------------|------------|--------------|--------------| - * | TAMPER input | | | | | | Don't | | - * | floating | 0 | 0 | 1 | 0 | 0 | care | Don't care | - * |-----------------|----------|----------|-----------|--------------|------------|--------------|--------------| - * | TIMESTAMP and | | | | | | | | - * | TAMPER input | 0 | 0 | 1 | 1 | 0 | 0 | Don't care | - * | floating | | | | | | | | - * |-----------------|----------|----------|-----------|--------------|------------|--------------|--------------| - * | TIMESTAMP input | | | | | Don't | | | - * | floating | 0 | 0 | 0 | 1 | care | 0 | Don't care | - * |-----------------|----------|----------|-----------|--------------|------------|--------------|--------------| - * | Standard GPIO | 0 | 0 | 0 | 0 | Don't care | Don't care | Don't care | - * +-------------------------------------------------------------------------------------------------------------+ - * - * - * =================================================================== - * Selection of RTC_AF2 alternate functions - * =================================================================== - * The RTC_AF2 pin (PI8) can be used for the following purposes: - * - AFI_TAMPER - * - AFI_TIMESTAMP - * - * +---------------------------------------------------------------------------------------+ - * | Pin |AFI_TAMPER |AFI_TIMESTAMP | TAMP1INSEL | TSINSEL |ALARMOUTTYPE | - * | configuration | ENABLED | ENABLED |TAMPER1 pin |TIMESTAMP pin | AFO_ALARM | - * | and function | | | selection | selection |Configuration | - * |-----------------|-----------|--------------|------------|--------------|--------------| - * | TAMPER input | | | | Don't | | - * | floating | 1 | 0 | 1 | care | Don't care | - * |-----------------|-----------|--------------|------------|--------------|--------------| - * | TIMESTAMP and | | | | | | - * | TAMPER input | 1 | 1 | 1 | 1 | Don't care | - * | floating | | | | | | - * |-----------------|-----------|--------------|------------|--------------|--------------| - * | TIMESTAMP input | | | Don't | | | - * | floating | 0 | 1 | care | 1 | Don't care | - * |-----------------|-----------|--------------|------------|--------------|--------------| - * | Standard GPIO | 0 | 0 | Don't care | Don't care | Don't care | - * +---------------------------------------------------------------------------------------+ - * - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_rtc.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup RTC - * @brief RTC driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* Masks Definition */ -#define RTC_TR_RESERVED_MASK ((uint32_t)0x007F7F7F) -#define RTC_DR_RESERVED_MASK ((uint32_t)0x00FFFF3F) -#define RTC_INIT_MASK ((uint32_t)0xFFFFFFFF) -#define RTC_RSF_MASK ((uint32_t)0xFFFFFF5F) -#define RTC_FLAGS_MASK ((uint32_t)(RTC_FLAG_TSOVF | RTC_FLAG_TSF | RTC_FLAG_WUTF | \ - RTC_FLAG_ALRBF | RTC_FLAG_ALRAF | RTC_FLAG_INITF | \ - RTC_FLAG_RSF | RTC_FLAG_INITS | RTC_FLAG_WUTWF | \ - RTC_FLAG_ALRBWF | RTC_FLAG_ALRAWF | RTC_FLAG_TAMP1F )) - -#define INITMODE_TIMEOUT ((uint32_t) 0x00010000) -#define SYNCHRO_TIMEOUT ((uint32_t) 0x00020000) -#define RECALPF_TIMEOUT ((uint32_t) 0x00020000) -#define SHPF_TIMEOUT ((uint32_t) 0x00001000) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static uint8_t RTC_ByteToBcd2(uint8_t Value); -static uint8_t RTC_Bcd2ToByte(uint8_t Value); - -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup RTC_Private_Functions - * @{ - */ - -/** @defgroup RTC_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - Initialization and Configuration functions - =============================================================================== - - This section provide functions allowing to initialize and configure the RTC - Prescaler (Synchronous and Asynchronous), RTC Hour format, disable RTC registers - Write protection, enter and exit the RTC initialization mode, RTC registers - synchronization check and reference clock detection enable. - - 1. The RTC Prescaler is programmed to generate the RTC 1Hz time base. It is - split into 2 programmable prescalers to minimize power consumption. - - A 7-bit asynchronous prescaler and A 13-bit synchronous prescaler. - - When both prescalers are used, it is recommended to configure the asynchronous - prescaler to a high value to minimize consumption. - - 2. All RTC registers are Write protected. Writing to the RTC registers - is enabled by writing a key into the Write Protection register, RTC_WPR. - - 3. To Configure the RTC Calendar, user application should enter initialization - mode. In this mode, the calendar counter is stopped and its value can be - updated. When the initialization sequence is complete, the calendar restarts - counting after 4 RTCCLK cycles. - - 4. To read the calendar through the shadow registers after Calendar initialization, - calendar update or after wakeup from low power modes the software must first - clear the RSF flag. The software must then wait until it is set again before - reading the calendar, which means that the calendar registers have been - correctly copied into the RTC_TR and RTC_DR shadow registers. - The RTC_WaitForSynchro() function implements the above software sequence - (RSF clear and RSF check). - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the RTC registers to their default reset values. - * @note This function doesn't reset the RTC Clock source and RTC Backup Data - * registers. - * @param None - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC registers are deinitialized - * - ERROR: RTC registers are not deinitialized - */ -ErrorStatus RTC_DeInit(void) -{ - __IO uint32_t wutcounter = 0x00; - uint32_t wutwfstatus = 0x00; - ErrorStatus status = ERROR; - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Set Initialization mode */ - if (RTC_EnterInitMode() == ERROR) - { - status = ERROR; - } - else - { - /* Reset TR, DR and CR registers */ - RTC->TR = (uint32_t)0x00000000; - RTC->DR = (uint32_t)0x00002101; - /* Reset All CR bits except CR[2:0] */ - RTC->CR &= (uint32_t)0x00000007; - - /* Wait till RTC WUTWF flag is set and if Time out is reached exit */ - do - { - wutwfstatus = RTC->ISR & RTC_ISR_WUTWF; - wutcounter++; - } while((wutcounter != INITMODE_TIMEOUT) && (wutwfstatus == 0x00)); - - if ((RTC->ISR & RTC_ISR_WUTWF) == RESET) - { - status = ERROR; - } - else - { - /* Reset all RTC CR register bits */ - RTC->CR &= (uint32_t)0x00000000; - RTC->WUTR = (uint32_t)0x0000FFFF; - RTC->PRER = (uint32_t)0x007F00FF; - RTC->CALIBR = (uint32_t)0x00000000; - RTC->ALRMAR = (uint32_t)0x00000000; - RTC->ALRMBR = (uint32_t)0x00000000; - - /* Reset ISR register and exit initialization mode */ - RTC->ISR = (uint32_t)0x00000000; - - /* Reset Tamper and alternate functions configuration register */ - RTC->TAFCR = 0x00000000; - - if(RTC_WaitForSynchro() == ERROR) - { - status = ERROR; - } - else - { - status = SUCCESS; - } - } - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Initializes the RTC registers according to the specified parameters - * in RTC_InitStruct. - * @param RTC_InitStruct: pointer to a RTC_InitTypeDef structure that contains - * the configuration information for the RTC peripheral. - * @note The RTC Prescaler register is write protected and can be written in - * initialization mode only. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC registers are initialized - * - ERROR: RTC registers are not initialized - */ -ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct) -{ - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_RTC_HOUR_FORMAT(RTC_InitStruct->RTC_HourFormat)); - assert_param(IS_RTC_ASYNCH_PREDIV(RTC_InitStruct->RTC_AsynchPrediv)); - assert_param(IS_RTC_SYNCH_PREDIV(RTC_InitStruct->RTC_SynchPrediv)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Set Initialization mode */ - if (RTC_EnterInitMode() == ERROR) - { - status = ERROR; - } - else - { - /* Clear RTC CR FMT Bit */ - RTC->CR &= ((uint32_t)~(RTC_CR_FMT)); - /* Set RTC_CR register */ - RTC->CR |= ((uint32_t)(RTC_InitStruct->RTC_HourFormat)); - - /* Configure the RTC PRER */ - RTC->PRER = (uint32_t)(RTC_InitStruct->RTC_SynchPrediv); - RTC->PRER |= (uint32_t)(RTC_InitStruct->RTC_AsynchPrediv << 16); - - /* Exit Initialization mode */ - RTC_ExitInitMode(); - - status = SUCCESS; - } - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Fills each RTC_InitStruct member with its default value. - * @param RTC_InitStruct: pointer to a RTC_InitTypeDef structure which will be - * initialized. - * @retval None - */ -void RTC_StructInit(RTC_InitTypeDef* RTC_InitStruct) -{ - /* Initialize the RTC_HourFormat member */ - RTC_InitStruct->RTC_HourFormat = RTC_HourFormat_24; - - /* Initialize the RTC_AsynchPrediv member */ - RTC_InitStruct->RTC_AsynchPrediv = (uint32_t)0x7F; - - /* Initialize the RTC_SynchPrediv member */ - RTC_InitStruct->RTC_SynchPrediv = (uint32_t)0xFF; -} - -/** - * @brief Enables or disables the RTC registers write protection. - * @note All the RTC registers are write protected except for RTC_ISR[13:8], - * RTC_TAFCR and RTC_BKPxR. - * @note Writing a wrong key reactivates the write protection. - * @note The protection mechanism is not affected by system reset. - * @param NewState: new state of the write protection. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_WriteProtectionCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - } - else - { - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - } -} - -/** - * @brief Enters the RTC Initialization mode. - * @note The RTC Initialization mode is write protected, use the - * RTC_WriteProtectionCmd(DISABLE) before calling this function. - * @param None - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC is in Init mode - * - ERROR: RTC is not in Init mode - */ -ErrorStatus RTC_EnterInitMode(void) -{ - __IO uint32_t initcounter = 0x00; - ErrorStatus status = ERROR; - uint32_t initstatus = 0x00; - - /* Check if the Initialization mode is set */ - if ((RTC->ISR & RTC_ISR_INITF) == (uint32_t)RESET) - { - /* Set the Initialization mode */ - RTC->ISR = (uint32_t)RTC_INIT_MASK; - - /* Wait till RTC is in INIT state and if Time out is reached exit */ - do - { - initstatus = RTC->ISR & RTC_ISR_INITF; - initcounter++; - } while((initcounter != INITMODE_TIMEOUT) && (initstatus == 0x00)); - - if ((RTC->ISR & RTC_ISR_INITF) != RESET) - { - status = SUCCESS; - } - else - { - status = ERROR; - } - } - else - { - status = SUCCESS; - } - - return (status); -} - -/** - * @brief Exits the RTC Initialization mode. - * @note When the initialization sequence is complete, the calendar restarts - * counting after 4 RTCCLK cycles. - * @note The RTC Initialization mode is write protected, use the - * RTC_WriteProtectionCmd(DISABLE) before calling this function. - * @param None - * @retval None - */ -void RTC_ExitInitMode(void) -{ - /* Exit Initialization mode */ - RTC->ISR &= (uint32_t)~RTC_ISR_INIT; -} - -/** - * @brief Waits until the RTC Time and Date registers (RTC_TR and RTC_DR) are - * synchronized with RTC APB clock. - * @note The RTC Resynchronization mode is write protected, use the - * RTC_WriteProtectionCmd(DISABLE) before calling this function. - * @note To read the calendar through the shadow registers after Calendar - * initialization, calendar update or after wakeup from low power modes - * the software must first clear the RSF flag. - * The software must then wait until it is set again before reading - * the calendar, which means that the calendar registers have been - * correctly copied into the RTC_TR and RTC_DR shadow registers. - * @param None - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC registers are synchronised - * - ERROR: RTC registers are not synchronised - */ -ErrorStatus RTC_WaitForSynchro(void) -{ - __IO uint32_t synchrocounter = 0; - ErrorStatus status = ERROR; - uint32_t synchrostatus = 0x00; - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Clear RSF flag */ - RTC->ISR &= (uint32_t)RTC_RSF_MASK; - - /* Wait the registers to be synchronised */ - do - { - synchrostatus = RTC->ISR & RTC_ISR_RSF; - synchrocounter++; - } while((synchrocounter != SYNCHRO_TIMEOUT) && (synchrostatus == 0x00)); - - if ((RTC->ISR & RTC_ISR_RSF) != RESET) - { - status = SUCCESS; - } - else - { - status = ERROR; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return (status); -} - -/** - * @brief Enables or disables the RTC reference clock detection. - * @param NewState: new state of the RTC reference clock. - * This parameter can be: ENABLE or DISABLE. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC reference clock detection is enabled - * - ERROR: RTC reference clock detection is disabled - */ -ErrorStatus RTC_RefClockCmd(FunctionalState NewState) -{ - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Set Initialization mode */ - if (RTC_EnterInitMode() == ERROR) - { - status = ERROR; - } - else - { - if (NewState != DISABLE) - { - /* Enable the RTC reference clock detection */ - RTC->CR |= RTC_CR_REFCKON; - } - else - { - /* Disable the RTC reference clock detection */ - RTC->CR &= ~RTC_CR_REFCKON; - } - /* Exit Initialization mode */ - RTC_ExitInitMode(); - - status = SUCCESS; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Enables or Disables the Bypass Shadow feature. - * @note When the Bypass Shadow is enabled the calendar value are taken - * directly from the Calendar counter. - * @param NewState: new state of the Bypass Shadow feature. - * This parameter can be: ENABLE or DISABLE. - * @retval None -*/ -void RTC_BypassShadowCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - if (NewState != DISABLE) - { - /* Set the BYPSHAD bit */ - RTC->CR |= (uint8_t)RTC_CR_BYPSHAD; - } - else - { - /* Reset the BYPSHAD bit */ - RTC->CR &= (uint8_t)~RTC_CR_BYPSHAD; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @} - */ - -/** @defgroup RTC_Group2 Time and Date configuration functions - * @brief Time and Date configuration functions - * -@verbatim - =============================================================================== - Time and Date configuration functions - =============================================================================== - - This section provide functions allowing to program and read the RTC Calendar - (Time and Date). - -@endverbatim - * @{ - */ - -/** - * @brief Set the RTC current time. - * @param RTC_Format: specifies the format of the entered parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure that contains - * the time configuration information for the RTC. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC Time register is configured - * - ERROR: RTC Time register is not configured - */ -ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct) -{ - uint32_t tmpreg = 0; - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - - if (RTC_Format == RTC_Format_BIN) - { - if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET) - { - assert_param(IS_RTC_HOUR12(RTC_TimeStruct->RTC_Hours)); - assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12)); - } - else - { - RTC_TimeStruct->RTC_H12 = 0x00; - assert_param(IS_RTC_HOUR24(RTC_TimeStruct->RTC_Hours)); - } - assert_param(IS_RTC_MINUTES(RTC_TimeStruct->RTC_Minutes)); - assert_param(IS_RTC_SECONDS(RTC_TimeStruct->RTC_Seconds)); - } - else - { - if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET) - { - tmpreg = RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours); - assert_param(IS_RTC_HOUR12(tmpreg)); - assert_param(IS_RTC_H12(RTC_TimeStruct->RTC_H12)); - } - else - { - RTC_TimeStruct->RTC_H12 = 0x00; - assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours))); - } - assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Minutes))); - assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Seconds))); - } - - /* Check the input parameters format */ - if (RTC_Format != RTC_Format_BIN) - { - tmpreg = (((uint32_t)(RTC_TimeStruct->RTC_Hours) << 16) | \ - ((uint32_t)(RTC_TimeStruct->RTC_Minutes) << 8) | \ - ((uint32_t)RTC_TimeStruct->RTC_Seconds) | \ - ((uint32_t)(RTC_TimeStruct->RTC_H12) << 16)); - } - else - { - tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Hours) << 16) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Minutes) << 8) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_TimeStruct->RTC_Seconds)) | \ - (((uint32_t)RTC_TimeStruct->RTC_H12) << 16)); - } - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Set Initialization mode */ - if (RTC_EnterInitMode() == ERROR) - { - status = ERROR; - } - else - { - /* Set the RTC_TR register */ - RTC->TR = (uint32_t)(tmpreg & RTC_TR_RESERVED_MASK); - - /* Exit Initialization mode */ - RTC_ExitInitMode(); - - if(RTC_WaitForSynchro() == ERROR) - { - status = ERROR; - } - else - { - status = SUCCESS; - } - - } - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Fills each RTC_TimeStruct member with its default value - * (Time = 00h:00min:00sec). - * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure which will be - * initialized. - * @retval None - */ -void RTC_TimeStructInit(RTC_TimeTypeDef* RTC_TimeStruct) -{ - /* Time = 00h:00min:00sec */ - RTC_TimeStruct->RTC_H12 = RTC_H12_AM; - RTC_TimeStruct->RTC_Hours = 0; - RTC_TimeStruct->RTC_Minutes = 0; - RTC_TimeStruct->RTC_Seconds = 0; -} - -/** - * @brief Get the RTC current Time. - * @param RTC_Format: specifies the format of the returned parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_TimeStruct: pointer to a RTC_TimeTypeDef structure that will - * contain the returned current time configuration. - * @retval None - */ -void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - - /* Get the RTC_TR register */ - tmpreg = (uint32_t)(RTC->TR & RTC_TR_RESERVED_MASK); - - /* Fill the structure fields with the read parameters */ - RTC_TimeStruct->RTC_Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16); - RTC_TimeStruct->RTC_Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8); - RTC_TimeStruct->RTC_Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU)); - RTC_TimeStruct->RTC_H12 = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16); - - /* Check the input parameters format */ - if (RTC_Format == RTC_Format_BIN) - { - /* Convert the structure parameters to Binary format */ - RTC_TimeStruct->RTC_Hours = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Hours); - RTC_TimeStruct->RTC_Minutes = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Minutes); - RTC_TimeStruct->RTC_Seconds = (uint8_t)RTC_Bcd2ToByte(RTC_TimeStruct->RTC_Seconds); - } -} - -/** - * @brief Gets the RTC current Calendar Subseconds value. - * @note This function freeze the Time and Date registers after reading the - * SSR register. - * @param None - * @retval RTC current Calendar Subseconds value. - */ -uint32_t RTC_GetSubSecond(void) -{ - uint32_t tmpreg = 0; - - /* Get subseconds values from the correspondent registers*/ - tmpreg = (uint32_t)(RTC->SSR); - - /* Read DR register to unfroze calendar registers */ - (void) (RTC->DR); - - return (tmpreg); -} - -/** - * @brief Set the RTC current date. - * @param RTC_Format: specifies the format of the entered parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that contains - * the date configuration information for the RTC. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC Date register is configured - * - ERROR: RTC Date register is not configured - */ -ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct) -{ - uint32_t tmpreg = 0; - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - - if ((RTC_Format == RTC_Format_BIN) && ((RTC_DateStruct->RTC_Month & 0x10) == 0x10)) - { - RTC_DateStruct->RTC_Month = (RTC_DateStruct->RTC_Month & (uint32_t)~(0x10)) + 0x0A; - } - if (RTC_Format == RTC_Format_BIN) - { - assert_param(IS_RTC_YEAR(RTC_DateStruct->RTC_Year)); - assert_param(IS_RTC_MONTH(RTC_DateStruct->RTC_Month)); - assert_param(IS_RTC_DATE(RTC_DateStruct->RTC_Date)); - } - else - { - assert_param(IS_RTC_YEAR(RTC_Bcd2ToByte(RTC_DateStruct->RTC_Year))); - tmpreg = RTC_Bcd2ToByte(RTC_DateStruct->RTC_Month); - assert_param(IS_RTC_MONTH(tmpreg)); - tmpreg = RTC_Bcd2ToByte(RTC_DateStruct->RTC_Date); - assert_param(IS_RTC_DATE(tmpreg)); - } - assert_param(IS_RTC_WEEKDAY(RTC_DateStruct->RTC_WeekDay)); - - /* Check the input parameters format */ - if (RTC_Format != RTC_Format_BIN) - { - tmpreg = ((((uint32_t)RTC_DateStruct->RTC_Year) << 16) | \ - (((uint32_t)RTC_DateStruct->RTC_Month) << 8) | \ - ((uint32_t)RTC_DateStruct->RTC_Date) | \ - (((uint32_t)RTC_DateStruct->RTC_WeekDay) << 13)); - } - else - { - tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Year) << 16) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Month) << 8) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_DateStruct->RTC_Date)) | \ - ((uint32_t)RTC_DateStruct->RTC_WeekDay << 13)); - } - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Set Initialization mode */ - if (RTC_EnterInitMode() == ERROR) - { - status = ERROR; - } - else - { - /* Set the RTC_DR register */ - RTC->DR = (uint32_t)(tmpreg & RTC_DR_RESERVED_MASK); - - /* Exit Initialization mode */ - RTC_ExitInitMode(); - - if(RTC_WaitForSynchro() == ERROR) - { - status = ERROR; - } - else - { - status = SUCCESS; - } - } - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Fills each RTC_DateStruct member with its default value - * (Monday, January 01 xx00). - * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure which will be - * initialized. - * @retval None - */ -void RTC_DateStructInit(RTC_DateTypeDef* RTC_DateStruct) -{ - /* Monday, January 01 xx00 */ - RTC_DateStruct->RTC_WeekDay = RTC_Weekday_Monday; - RTC_DateStruct->RTC_Date = 1; - RTC_DateStruct->RTC_Month = RTC_Month_January; - RTC_DateStruct->RTC_Year = 0; -} - -/** - * @brief Get the RTC current date. - * @param RTC_Format: specifies the format of the returned parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that will - * contain the returned current date configuration. - * @retval None - */ -void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - - /* Get the RTC_TR register */ - tmpreg = (uint32_t)(RTC->DR & RTC_DR_RESERVED_MASK); - - /* Fill the structure fields with the read parameters */ - RTC_DateStruct->RTC_Year = (uint8_t)((tmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16); - RTC_DateStruct->RTC_Month = (uint8_t)((tmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8); - RTC_DateStruct->RTC_Date = (uint8_t)(tmpreg & (RTC_DR_DT | RTC_DR_DU)); - RTC_DateStruct->RTC_WeekDay = (uint8_t)((tmpreg & (RTC_DR_WDU)) >> 13); - - /* Check the input parameters format */ - if (RTC_Format == RTC_Format_BIN) - { - /* Convert the structure parameters to Binary format */ - RTC_DateStruct->RTC_Year = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Year); - RTC_DateStruct->RTC_Month = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Month); - RTC_DateStruct->RTC_Date = (uint8_t)RTC_Bcd2ToByte(RTC_DateStruct->RTC_Date); - } -} - -/** - * @} - */ - -/** @defgroup RTC_Group3 Alarms configuration functions - * @brief Alarms (Alarm A and Alarm B) configuration functions - * -@verbatim - =============================================================================== - Alarms (Alarm A and Alarm B) configuration functions - =============================================================================== - - This section provide functions allowing to program and read the RTC Alarms. - -@endverbatim - * @{ - */ - -/** - * @brief Set the specified RTC Alarm. - * @note The Alarm register can only be written when the corresponding Alarm - * is disabled (Use the RTC_AlarmCmd(DISABLE)). - * @param RTC_Format: specifies the format of the returned parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_Alarm: specifies the alarm to be configured. - * This parameter can be one of the following values: - * @arg RTC_Alarm_A: to select Alarm A - * @arg RTC_Alarm_B: to select Alarm B - * @param RTC_AlarmStruct: pointer to a RTC_AlarmTypeDef structure that - * contains the alarm configuration parameters. - * @retval None - */ -void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - assert_param(IS_RTC_ALARM(RTC_Alarm)); - assert_param(IS_ALARM_MASK(RTC_AlarmStruct->RTC_AlarmMask)); - assert_param(IS_RTC_ALARM_DATE_WEEKDAY_SEL(RTC_AlarmStruct->RTC_AlarmDateWeekDaySel)); - - if (RTC_Format == RTC_Format_BIN) - { - if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET) - { - assert_param(IS_RTC_HOUR12(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours)); - assert_param(IS_RTC_H12(RTC_AlarmStruct->RTC_AlarmTime.RTC_H12)); - } - else - { - RTC_AlarmStruct->RTC_AlarmTime.RTC_H12 = 0x00; - assert_param(IS_RTC_HOUR24(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours)); - } - assert_param(IS_RTC_MINUTES(RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes)); - assert_param(IS_RTC_SECONDS(RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds)); - - if(RTC_AlarmStruct->RTC_AlarmDateWeekDaySel == RTC_AlarmDateWeekDaySel_Date) - { - assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(RTC_AlarmStruct->RTC_AlarmDateWeekDay)); - } - else - { - assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(RTC_AlarmStruct->RTC_AlarmDateWeekDay)); - } - } - else - { - if ((RTC->CR & RTC_CR_FMT) != (uint32_t)RESET) - { - tmpreg = RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours); - assert_param(IS_RTC_HOUR12(tmpreg)); - assert_param(IS_RTC_H12(RTC_AlarmStruct->RTC_AlarmTime.RTC_H12)); - } - else - { - RTC_AlarmStruct->RTC_AlarmTime.RTC_H12 = 0x00; - assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours))); - } - - assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes))); - assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds))); - - if(RTC_AlarmStruct->RTC_AlarmDateWeekDaySel == RTC_AlarmDateWeekDaySel_Date) - { - tmpreg = RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmDateWeekDay); - assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(tmpreg)); - } - else - { - tmpreg = RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmDateWeekDay); - assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(tmpreg)); - } - } - - /* Check the input parameters format */ - if (RTC_Format != RTC_Format_BIN) - { - tmpreg = (((uint32_t)(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours) << 16) | \ - ((uint32_t)(RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes) << 8) | \ - ((uint32_t)RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds) | \ - ((uint32_t)(RTC_AlarmStruct->RTC_AlarmTime.RTC_H12) << 16) | \ - ((uint32_t)(RTC_AlarmStruct->RTC_AlarmDateWeekDay) << 24) | \ - ((uint32_t)RTC_AlarmStruct->RTC_AlarmDateWeekDaySel) | \ - ((uint32_t)RTC_AlarmStruct->RTC_AlarmMask)); - } - else - { - tmpreg = (((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours) << 16) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes) << 8) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds)) | \ - ((uint32_t)(RTC_AlarmStruct->RTC_AlarmTime.RTC_H12) << 16) | \ - ((uint32_t)RTC_ByteToBcd2(RTC_AlarmStruct->RTC_AlarmDateWeekDay) << 24) | \ - ((uint32_t)RTC_AlarmStruct->RTC_AlarmDateWeekDaySel) | \ - ((uint32_t)RTC_AlarmStruct->RTC_AlarmMask)); - } - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Configure the Alarm register */ - if (RTC_Alarm == RTC_Alarm_A) - { - RTC->ALRMAR = (uint32_t)tmpreg; - } - else - { - RTC->ALRMBR = (uint32_t)tmpreg; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Fills each RTC_AlarmStruct member with its default value - * (Time = 00h:00mn:00sec / Date = 1st day of the month/Mask = - * all fields are masked). - * @param RTC_AlarmStruct: pointer to a @ref RTC_AlarmTypeDef structure which - * will be initialized. - * @retval None - */ -void RTC_AlarmStructInit(RTC_AlarmTypeDef* RTC_AlarmStruct) -{ - /* Alarm Time Settings : Time = 00h:00mn:00sec */ - RTC_AlarmStruct->RTC_AlarmTime.RTC_H12 = RTC_H12_AM; - RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours = 0; - RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes = 0; - RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds = 0; - - /* Alarm Date Settings : Date = 1st day of the month */ - RTC_AlarmStruct->RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date; - RTC_AlarmStruct->RTC_AlarmDateWeekDay = 1; - - /* Alarm Masks Settings : Mask = all fields are not masked */ - RTC_AlarmStruct->RTC_AlarmMask = RTC_AlarmMask_None; -} - -/** - * @brief Get the RTC Alarm value and masks. - * @param RTC_Format: specifies the format of the output parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_Alarm: specifies the alarm to be read. - * This parameter can be one of the following values: - * @arg RTC_Alarm_A: to select Alarm A - * @arg RTC_Alarm_B: to select Alarm B - * @param RTC_AlarmStruct: pointer to a RTC_AlarmTypeDef structure that will - * contains the output alarm configuration values. - * @retval None - */ -void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - assert_param(IS_RTC_ALARM(RTC_Alarm)); - - /* Get the RTC_ALRMxR register */ - if (RTC_Alarm == RTC_Alarm_A) - { - tmpreg = (uint32_t)(RTC->ALRMAR); - } - else - { - tmpreg = (uint32_t)(RTC->ALRMBR); - } - - /* Fill the structure with the read parameters */ - RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours = (uint32_t)((tmpreg & (RTC_ALRMAR_HT | \ - RTC_ALRMAR_HU)) >> 16); - RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes = (uint32_t)((tmpreg & (RTC_ALRMAR_MNT | \ - RTC_ALRMAR_MNU)) >> 8); - RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds = (uint32_t)(tmpreg & (RTC_ALRMAR_ST | \ - RTC_ALRMAR_SU)); - RTC_AlarmStruct->RTC_AlarmTime.RTC_H12 = (uint32_t)((tmpreg & RTC_ALRMAR_PM) >> 16); - RTC_AlarmStruct->RTC_AlarmDateWeekDay = (uint32_t)((tmpreg & (RTC_ALRMAR_DT | RTC_ALRMAR_DU)) >> 24); - RTC_AlarmStruct->RTC_AlarmDateWeekDaySel = (uint32_t)(tmpreg & RTC_ALRMAR_WDSEL); - RTC_AlarmStruct->RTC_AlarmMask = (uint32_t)(tmpreg & RTC_AlarmMask_All); - - if (RTC_Format == RTC_Format_BIN) - { - RTC_AlarmStruct->RTC_AlarmTime.RTC_Hours = RTC_Bcd2ToByte(RTC_AlarmStruct-> \ - RTC_AlarmTime.RTC_Hours); - RTC_AlarmStruct->RTC_AlarmTime.RTC_Minutes = RTC_Bcd2ToByte(RTC_AlarmStruct-> \ - RTC_AlarmTime.RTC_Minutes); - RTC_AlarmStruct->RTC_AlarmTime.RTC_Seconds = RTC_Bcd2ToByte(RTC_AlarmStruct-> \ - RTC_AlarmTime.RTC_Seconds); - RTC_AlarmStruct->RTC_AlarmDateWeekDay = RTC_Bcd2ToByte(RTC_AlarmStruct->RTC_AlarmDateWeekDay); - } -} - -/** - * @brief Enables or disables the specified RTC Alarm. - * @param RTC_Alarm: specifies the alarm to be configured. - * This parameter can be any combination of the following values: - * @arg RTC_Alarm_A: to select Alarm A - * @arg RTC_Alarm_B: to select Alarm B - * @param NewState: new state of the specified alarm. - * This parameter can be: ENABLE or DISABLE. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC Alarm is enabled/disabled - * - ERROR: RTC Alarm is not enabled/disabled - */ -ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm, FunctionalState NewState) -{ - __IO uint32_t alarmcounter = 0x00; - uint32_t alarmstatus = 0x00; - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_RTC_CMD_ALARM(RTC_Alarm)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Configure the Alarm state */ - if (NewState != DISABLE) - { - RTC->CR |= (uint32_t)RTC_Alarm; - - status = SUCCESS; - } - else - { - /* Disable the Alarm in RTC_CR register */ - RTC->CR &= (uint32_t)~RTC_Alarm; - - /* Wait till RTC ALRxWF flag is set and if Time out is reached exit */ - do - { - alarmstatus = RTC->ISR & (RTC_Alarm >> 8); - alarmcounter++; - } while((alarmcounter != INITMODE_TIMEOUT) && (alarmstatus == 0x00)); - - if ((RTC->ISR & (RTC_Alarm >> 8)) == RESET) - { - status = ERROR; - } - else - { - status = SUCCESS; - } - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Configure the RTC AlarmA/B Subseconds value and mask.* - * @note This function is performed only when the Alarm is disabled. - * @param RTC_Alarm: specifies the alarm to be configured. - * This parameter can be one of the following values: - * @arg RTC_Alarm_A: to select Alarm A - * @arg RTC_Alarm_B: to select Alarm B - * @param RTC_AlarmSubSecondValue: specifies the Subseconds value. - * This parameter can be a value from 0 to 0x00007FFF. - * @param RTC_AlarmSubSecondMask: specifies the Subseconds Mask. - * This parameter can be any combination of the following values: - * @arg RTC_AlarmSubSecondMask_All : All Alarm SS fields are masked. - * There is no comparison on sub seconds for Alarm. - * @arg RTC_AlarmSubSecondMask_SS14_1 : SS[14:1] are don't care in Alarm comparison. - * Only SS[0] is compared - * @arg RTC_AlarmSubSecondMask_SS14_2 : SS[14:2] are don't care in Alarm comparison. - * Only SS[1:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_3 : SS[14:3] are don't care in Alarm comparison. - * Only SS[2:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_4 : SS[14:4] are don't care in Alarm comparison. - * Only SS[3:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_5 : SS[14:5] are don't care in Alarm comparison. - * Only SS[4:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_6 : SS[14:6] are don't care in Alarm comparison. - * Only SS[5:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_7 : SS[14:7] are don't care in Alarm comparison. - * Only SS[6:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_8 : SS[14:8] are don't care in Alarm comparison. - * Only SS[7:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_9 : SS[14:9] are don't care in Alarm comparison. - * Only SS[8:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_10: SS[14:10] are don't care in Alarm comparison. - * Only SS[9:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_11: SS[14:11] are don't care in Alarm comparison. - * Only SS[10:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_12: SS[14:12] are don't care in Alarm comparison. - * Only SS[11:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14_13: SS[14:13] are don't care in Alarm comparison. - * Only SS[12:0] are compared - * @arg RTC_AlarmSubSecondMask_SS14 : SS[14] is don't care in Alarm comparison. - * Only SS[13:0] are compared - * @arg RTC_AlarmSubSecondMask_None : SS[14:0] are compared and must match - * to activate alarm - * @retval None - */ -void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue, uint32_t RTC_AlarmSubSecondMask) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_ALARM(RTC_Alarm)); - assert_param(IS_RTC_ALARM_SUB_SECOND_VALUE(RTC_AlarmSubSecondValue)); - assert_param(IS_RTC_ALARM_SUB_SECOND_MASK(RTC_AlarmSubSecondMask)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Configure the Alarm A or Alarm B SubSecond registers */ - tmpreg = (uint32_t) (uint32_t)(RTC_AlarmSubSecondValue) | (uint32_t)(RTC_AlarmSubSecondMask); - - if (RTC_Alarm == RTC_Alarm_A) - { - /* Configure the AlarmA SubSecond register */ - RTC->ALRMASSR = tmpreg; - } - else - { - /* Configure the Alarm B SubSecond register */ - RTC->ALRMBSSR = tmpreg; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - -} - -/** - * @brief Gets the RTC Alarm Subseconds value. - * @param RTC_Alarm: specifies the alarm to be read. - * This parameter can be one of the following values: - * @arg RTC_Alarm_A: to select Alarm A - * @arg RTC_Alarm_B: to select Alarm B - * @param None - * @retval RTC Alarm Subseconds value. - */ -uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm) -{ - uint32_t tmpreg = 0; - - /* Get the RTC_ALRMxR register */ - if (RTC_Alarm == RTC_Alarm_A) - { - tmpreg = (uint32_t)((RTC->ALRMASSR) & RTC_ALRMASSR_SS); - } - else - { - tmpreg = (uint32_t)((RTC->ALRMBSSR) & RTC_ALRMBSSR_SS); - } - - return (tmpreg); -} - -/** - * @} - */ - -/** @defgroup RTC_Group4 WakeUp Timer configuration functions - * @brief WakeUp Timer configuration functions - * -@verbatim - =============================================================================== - WakeUp Timer configuration functions - =============================================================================== - - This section provide functions allowing to program and read the RTC WakeUp. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the RTC Wakeup clock source. - * @note The WakeUp Clock source can only be changed when the RTC WakeUp - * is disabled (Use the RTC_WakeUpCmd(DISABLE)). - * @param RTC_WakeUpClock: Wakeup Clock source. - * This parameter can be one of the following values: - * @arg RTC_WakeUpClock_RTCCLK_Div16: RTC Wakeup Counter Clock = RTCCLK/16 - * @arg RTC_WakeUpClock_RTCCLK_Div8: RTC Wakeup Counter Clock = RTCCLK/8 - * @arg RTC_WakeUpClock_RTCCLK_Div4: RTC Wakeup Counter Clock = RTCCLK/4 - * @arg RTC_WakeUpClock_RTCCLK_Div2: RTC Wakeup Counter Clock = RTCCLK/2 - * @arg RTC_WakeUpClock_CK_SPRE_16bits: RTC Wakeup Counter Clock = CK_SPRE - * @arg RTC_WakeUpClock_CK_SPRE_17bits: RTC Wakeup Counter Clock = CK_SPRE - * @retval None - */ -void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock) -{ - /* Check the parameters */ - assert_param(IS_RTC_WAKEUP_CLOCK(RTC_WakeUpClock)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Clear the Wakeup Timer clock source bits in CR register */ - RTC->CR &= (uint32_t)~RTC_CR_WUCKSEL; - - /* Configure the clock source */ - RTC->CR |= (uint32_t)RTC_WakeUpClock; - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Configures the RTC Wakeup counter. - * @note The RTC WakeUp counter can only be written when the RTC WakeUp - * is disabled (Use the RTC_WakeUpCmd(DISABLE)). - * @param RTC_WakeUpCounter: specifies the WakeUp counter. - * This parameter can be a value from 0x0000 to 0xFFFF. - * @retval None - */ -void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter) -{ - /* Check the parameters */ - assert_param(IS_RTC_WAKEUP_COUNTER(RTC_WakeUpCounter)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Configure the Wakeup Timer counter */ - RTC->WUTR = (uint32_t)RTC_WakeUpCounter; - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Returns the RTC WakeUp timer counter value. - * @param None - * @retval The RTC WakeUp Counter value. - */ -uint32_t RTC_GetWakeUpCounter(void) -{ - /* Get the counter value */ - return ((uint32_t)(RTC->WUTR & RTC_WUTR_WUT)); -} - -/** - * @brief Enables or Disables the RTC WakeUp timer. - * @param NewState: new state of the WakeUp timer. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -ErrorStatus RTC_WakeUpCmd(FunctionalState NewState) -{ - __IO uint32_t wutcounter = 0x00; - uint32_t wutwfstatus = 0x00; - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - if (NewState != DISABLE) - { - /* Enable the Wakeup Timer */ - RTC->CR |= (uint32_t)RTC_CR_WUTE; - status = SUCCESS; - } - else - { - /* Disable the Wakeup Timer */ - RTC->CR &= (uint32_t)~RTC_CR_WUTE; - /* Wait till RTC WUTWF flag is set and if Time out is reached exit */ - do - { - wutwfstatus = RTC->ISR & RTC_ISR_WUTWF; - wutcounter++; - } while((wutcounter != INITMODE_TIMEOUT) && (wutwfstatus == 0x00)); - - if ((RTC->ISR & RTC_ISR_WUTWF) == RESET) - { - status = ERROR; - } - else - { - status = SUCCESS; - } - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @} - */ - -/** @defgroup RTC_Group5 Daylight Saving configuration functions - * @brief Daylight Saving configuration functions - * -@verbatim - =============================================================================== - Daylight Saving configuration functions - =============================================================================== - - This section provide functions allowing to configure the RTC DayLight Saving. - -@endverbatim - * @{ - */ - -/** - * @brief Adds or substract one hour from the current time. - * @param RTC_DayLightSaveOperation: the value of hour adjustment. - * This parameter can be one of the following values: - * @arg RTC_DayLightSaving_SUB1H: Substract one hour (winter time) - * @arg RTC_DayLightSaving_ADD1H: Add one hour (summer time) - * @param RTC_StoreOperation: Specifies the value to be written in the BCK bit - * in CR register to store the operation. - * This parameter can be one of the following values: - * @arg RTC_StoreOperation_Reset: BCK Bit Reset - * @arg RTC_StoreOperation_Set: BCK Bit Set - * @retval None - */ -void RTC_DayLightSavingConfig(uint32_t RTC_DayLightSaving, uint32_t RTC_StoreOperation) -{ - /* Check the parameters */ - assert_param(IS_RTC_DAYLIGHT_SAVING(RTC_DayLightSaving)); - assert_param(IS_RTC_STORE_OPERATION(RTC_StoreOperation)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Clear the bits to be configured */ - RTC->CR &= (uint32_t)~(RTC_CR_BCK); - - /* Configure the RTC_CR register */ - RTC->CR |= (uint32_t)(RTC_DayLightSaving | RTC_StoreOperation); - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Returns the RTC Day Light Saving stored operation. - * @param None - * @retval RTC Day Light Saving stored operation. - * - RTC_StoreOperation_Reset - * - RTC_StoreOperation_Set - */ -uint32_t RTC_GetStoreOperation(void) -{ - return (RTC->CR & RTC_CR_BCK); -} - -/** - * @} - */ - -/** @defgroup RTC_Group6 Output pin Configuration function - * @brief Output pin Configuration function - * -@verbatim - =============================================================================== - Output pin Configuration function - =============================================================================== - - This section provide functions allowing to configure the RTC Output source. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the RTC output source (AFO_ALARM). - * @param RTC_Output: Specifies which signal will be routed to the RTC output. - * This parameter can be one of the following values: - * @arg RTC_Output_Disable: No output selected - * @arg RTC_Output_AlarmA: signal of AlarmA mapped to output - * @arg RTC_Output_AlarmB: signal of AlarmB mapped to output - * @arg RTC_Output_WakeUp: signal of WakeUp mapped to output - * @param RTC_OutputPolarity: Specifies the polarity of the output signal. - * This parameter can be one of the following: - * @arg RTC_OutputPolarity_High: The output pin is high when the - * ALRAF/ALRBF/WUTF is high (depending on OSEL) - * @arg RTC_OutputPolarity_Low: The output pin is low when the - * ALRAF/ALRBF/WUTF is high (depending on OSEL) - * @retval None - */ -void RTC_OutputConfig(uint32_t RTC_Output, uint32_t RTC_OutputPolarity) -{ - /* Check the parameters */ - assert_param(IS_RTC_OUTPUT(RTC_Output)); - assert_param(IS_RTC_OUTPUT_POL(RTC_OutputPolarity)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Clear the bits to be configured */ - RTC->CR &= (uint32_t)~(RTC_CR_OSEL | RTC_CR_POL); - - /* Configure the output selection and polarity */ - RTC->CR |= (uint32_t)(RTC_Output | RTC_OutputPolarity); - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @} - */ - -/** @defgroup RTC_Group7 Digital Calibration configuration functions - * @brief Coarse Calibration configuration functions - * -@verbatim - =============================================================================== - Digital Calibration configuration functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Configures the Coarse calibration parameters. - * @param RTC_CalibSign: specifies the sign of the coarse calibration value. - * This parameter can be one of the following values: - * @arg RTC_CalibSign_Positive: The value sign is positive - * @arg RTC_CalibSign_Negative: The value sign is negative - * @param Value: value of coarse calibration expressed in ppm (coded on 5 bits). - * - * @note This Calibration value should be between 0 and 63 when using negative - * sign with a 2-ppm step. - * - * @note This Calibration value should be between 0 and 126 when using positive - * sign with a 4-ppm step. - * - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC Coarse calibration are initialized - * - ERROR: RTC Coarse calibration are not initialized - */ -ErrorStatus RTC_CoarseCalibConfig(uint32_t RTC_CalibSign, uint32_t Value) -{ - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_RTC_CALIB_SIGN(RTC_CalibSign)); - assert_param(IS_RTC_CALIB_VALUE(Value)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Set Initialization mode */ - if (RTC_EnterInitMode() == ERROR) - { - status = ERROR; - } - else - { - /* Set the coarse calibration value */ - RTC->CALIBR = (uint32_t)(RTC_CalibSign | Value); - /* Exit Initialization mode */ - RTC_ExitInitMode(); - - status = SUCCESS; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Enables or disables the Coarse calibration process. - * @param NewState: new state of the Coarse calibration. - * This parameter can be: ENABLE or DISABLE. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC Coarse calibration are enabled/disabled - * - ERROR: RTC Coarse calibration are not enabled/disabled - */ -ErrorStatus RTC_CoarseCalibCmd(FunctionalState NewState) -{ - ErrorStatus status = ERROR; - - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Set Initialization mode */ - if (RTC_EnterInitMode() == ERROR) - { - status = ERROR; - } - else - { - if (NewState != DISABLE) - { - /* Enable the Coarse Calibration */ - RTC->CR |= (uint32_t)RTC_CR_DCE; - } - else - { - /* Disable the Coarse Calibration */ - RTC->CR &= (uint32_t)~RTC_CR_DCE; - } - /* Exit Initialization mode */ - RTC_ExitInitMode(); - - status = SUCCESS; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return status; -} - -/** - * @brief Enables or disables the RTC clock to be output through the relative pin. - * @param NewState: new state of the digital calibration Output. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_CalibOutputCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - if (NewState != DISABLE) - { - /* Enable the RTC clock output */ - RTC->CR |= (uint32_t)RTC_CR_COE; - } - else - { - /* Disable the RTC clock output */ - RTC->CR &= (uint32_t)~RTC_CR_COE; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Configure the Calibration Pinout (RTC_CALIB) Selection (1Hz or 512Hz). - * @param RTC_CalibOutput : Select the Calibration output Selection . - * This parameter can be one of the following values: - * @arg RTC_CalibOutput_512Hz: A signal has a regular waveform at 512Hz. - * @arg RTC_CalibOutput_1Hz : A signal has a regular waveform at 1Hz. - * @retval None -*/ -void RTC_CalibOutputConfig(uint32_t RTC_CalibOutput) -{ - /* Check the parameters */ - assert_param(IS_RTC_CALIB_OUTPUT(RTC_CalibOutput)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /*clear flags before config*/ - RTC->CR &= (uint32_t)~(RTC_CR_COSEL); - - /* Configure the RTC_CR register */ - RTC->CR |= (uint32_t)RTC_CalibOutput; - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Configures the Smooth Calibration Settings. - * @param RTC_SmoothCalibPeriod : Select the Smooth Calibration Period. - * This parameter can be can be one of the following values: - * @arg RTC_SmoothCalibPeriod_32sec : The smooth calibration periode is 32s. - * @arg RTC_SmoothCalibPeriod_16sec : The smooth calibration periode is 16s. - * @arg RTC_SmoothCalibPeriod_8sec : The smooth calibartion periode is 8s. - * @param RTC_SmoothCalibPlusPulses : Select to Set or reset the CALP bit. - * This parameter can be one of the following values: - * @arg RTC_SmoothCalibPlusPulses_Set : Add one RTCCLK puls every 2**11 pulses. - * @arg RTC_SmoothCalibPlusPulses_Reset: No RTCCLK pulses are added. - * @param RTC_SmouthCalibMinusPulsesValue: Select the value of CALM[8:0] bits. - * This parameter can be one any value from 0 to 0x000001FF. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC Calib registers are configured - * - ERROR: RTC Calib registers are not configured -*/ -ErrorStatus RTC_SmoothCalibConfig(uint32_t RTC_SmoothCalibPeriod, - uint32_t RTC_SmoothCalibPlusPulses, - uint32_t RTC_SmouthCalibMinusPulsesValue) -{ - ErrorStatus status = ERROR; - uint32_t recalpfcount = 0; - - /* Check the parameters */ - assert_param(IS_RTC_SMOOTH_CALIB_PERIOD(RTC_SmoothCalibPeriod)); - assert_param(IS_RTC_SMOOTH_CALIB_PLUS(RTC_SmoothCalibPlusPulses)); - assert_param(IS_RTC_SMOOTH_CALIB_MINUS(RTC_SmouthCalibMinusPulsesValue)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* check if a calibration is pending*/ - if ((RTC->ISR & RTC_ISR_RECALPF) != RESET) - { - /* wait until the Calibration is completed*/ - while (((RTC->ISR & RTC_ISR_RECALPF) != RESET) && (recalpfcount != RECALPF_TIMEOUT)) - { - recalpfcount++; - } - } - - /* check if the calibration pending is completed or if there is no calibration operation at all*/ - if ((RTC->ISR & RTC_ISR_RECALPF) == RESET) - { - /* Configure the Smooth calibration settings */ - RTC->CALR = (uint32_t)((uint32_t)RTC_SmoothCalibPeriod | (uint32_t)RTC_SmoothCalibPlusPulses | (uint32_t)RTC_SmouthCalibMinusPulsesValue); - - status = SUCCESS; - } - else - { - status = ERROR; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return (ErrorStatus)(status); -} - -/** - * @} - */ - - -/** @defgroup RTC_Group8 TimeStamp configuration functions - * @brief TimeStamp configuration functions - * -@verbatim - =============================================================================== - TimeStamp configuration functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or Disables the RTC TimeStamp functionality with the - * specified time stamp pin stimulating edge. - * @param RTC_TimeStampEdge: Specifies the pin edge on which the TimeStamp is - * activated. - * This parameter can be one of the following: - * @arg RTC_TimeStampEdge_Rising: the Time stamp event occurs on the rising - * edge of the related pin. - * @arg RTC_TimeStampEdge_Falling: the Time stamp event occurs on the - * falling edge of the related pin. - * @param NewState: new state of the TimeStamp. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_TimeStampCmd(uint32_t RTC_TimeStampEdge, FunctionalState NewState) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_TIMESTAMP_EDGE(RTC_TimeStampEdge)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Get the RTC_CR register and clear the bits to be configured */ - tmpreg = (uint32_t)(RTC->CR & (uint32_t)~(RTC_CR_TSEDGE | RTC_CR_TSE)); - - /* Get the new configuration */ - if (NewState != DISABLE) - { - tmpreg |= (uint32_t)(RTC_TimeStampEdge | RTC_CR_TSE); - } - else - { - tmpreg |= (uint32_t)(RTC_TimeStampEdge); - } - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Configure the Time Stamp TSEDGE and Enable bits */ - RTC->CR = (uint32_t)tmpreg; - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Get the RTC TimeStamp value and masks. - * @param RTC_Format: specifies the format of the output parameters. - * This parameter can be one of the following values: - * @arg RTC_Format_BIN: Binary data format - * @arg RTC_Format_BCD: BCD data format - * @param RTC_StampTimeStruct: pointer to a RTC_TimeTypeDef structure that will - * contains the TimeStamp time values. - * @param RTC_StampDateStruct: pointer to a RTC_DateTypeDef structure that will - * contains the TimeStamp date values. - * @retval None - */ -void RTC_GetTimeStamp(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_StampTimeStruct, - RTC_DateTypeDef* RTC_StampDateStruct) -{ - uint32_t tmptime = 0, tmpdate = 0; - - /* Check the parameters */ - assert_param(IS_RTC_FORMAT(RTC_Format)); - - /* Get the TimeStamp time and date registers values */ - tmptime = (uint32_t)(RTC->TSTR & RTC_TR_RESERVED_MASK); - tmpdate = (uint32_t)(RTC->TSDR & RTC_DR_RESERVED_MASK); - - /* Fill the Time structure fields with the read parameters */ - RTC_StampTimeStruct->RTC_Hours = (uint8_t)((tmptime & (RTC_TR_HT | RTC_TR_HU)) >> 16); - RTC_StampTimeStruct->RTC_Minutes = (uint8_t)((tmptime & (RTC_TR_MNT | RTC_TR_MNU)) >> 8); - RTC_StampTimeStruct->RTC_Seconds = (uint8_t)(tmptime & (RTC_TR_ST | RTC_TR_SU)); - RTC_StampTimeStruct->RTC_H12 = (uint8_t)((tmptime & (RTC_TR_PM)) >> 16); - - /* Fill the Date structure fields with the read parameters */ - RTC_StampDateStruct->RTC_Year = 0; - RTC_StampDateStruct->RTC_Month = (uint8_t)((tmpdate & (RTC_DR_MT | RTC_DR_MU)) >> 8); - RTC_StampDateStruct->RTC_Date = (uint8_t)(tmpdate & (RTC_DR_DT | RTC_DR_DU)); - RTC_StampDateStruct->RTC_WeekDay = (uint8_t)((tmpdate & (RTC_DR_WDU)) >> 13); - - /* Check the input parameters format */ - if (RTC_Format == RTC_Format_BIN) - { - /* Convert the Time structure parameters to Binary format */ - RTC_StampTimeStruct->RTC_Hours = (uint8_t)RTC_Bcd2ToByte(RTC_StampTimeStruct->RTC_Hours); - RTC_StampTimeStruct->RTC_Minutes = (uint8_t)RTC_Bcd2ToByte(RTC_StampTimeStruct->RTC_Minutes); - RTC_StampTimeStruct->RTC_Seconds = (uint8_t)RTC_Bcd2ToByte(RTC_StampTimeStruct->RTC_Seconds); - - /* Convert the Date structure parameters to Binary format */ - RTC_StampDateStruct->RTC_Month = (uint8_t)RTC_Bcd2ToByte(RTC_StampDateStruct->RTC_Month); - RTC_StampDateStruct->RTC_Date = (uint8_t)RTC_Bcd2ToByte(RTC_StampDateStruct->RTC_Date); - RTC_StampDateStruct->RTC_WeekDay = (uint8_t)RTC_Bcd2ToByte(RTC_StampDateStruct->RTC_WeekDay); - } -} - -/** - * @brief Get the RTC timestamp Subseconds value. - * @param None - * @retval RTC current timestamp Subseconds value. - */ -uint32_t RTC_GetTimeStampSubSecond(void) -{ - /* Get timestamp subseconds values from the correspondent registers */ - return (uint32_t)(RTC->TSSSR); -} - -/** - * @} - */ - -/** @defgroup RTC_Group9 Tampers configuration functions - * @brief Tampers configuration functions - * -@verbatim - =============================================================================== - Tampers configuration functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Configures the select Tamper pin edge. - * @param RTC_Tamper: Selected tamper pin. - * This parameter can be RTC_Tamper_1. - * @param RTC_TamperTrigger: Specifies the trigger on the tamper pin that - * stimulates tamper event. - * This parameter can be one of the following values: - * @arg RTC_TamperTrigger_RisingEdge: Rising Edge of the tamper pin causes tamper event. - * @arg RTC_TamperTrigger_FallingEdge: Falling Edge of the tamper pin causes tamper event. - * @arg RTC_TamperTrigger_LowLevel: Low Level of the tamper pin causes tamper event. - * @arg RTC_TamperTrigger_HighLevel: High Level of the tamper pin causes tamper event. - * @retval None - */ -void RTC_TamperTriggerConfig(uint32_t RTC_Tamper, uint32_t RTC_TamperTrigger) -{ - /* Check the parameters */ - assert_param(IS_RTC_TAMPER(RTC_Tamper)); - assert_param(IS_RTC_TAMPER_TRIGGER(RTC_TamperTrigger)); - - if (RTC_TamperTrigger == RTC_TamperTrigger_RisingEdge) - { - /* Configure the RTC_TAFCR register */ - RTC->TAFCR &= (uint32_t)((uint32_t)~(RTC_Tamper << 1)); - } - else - { - /* Configure the RTC_TAFCR register */ - RTC->TAFCR |= (uint32_t)(RTC_Tamper << 1); - } -} - -/** - * @brief Enables or Disables the Tamper detection. - * @param RTC_Tamper: Selected tamper pin. - * This parameter can be RTC_Tamper_1. - * @param NewState: new state of the tamper pin. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_TamperCmd(uint32_t RTC_Tamper, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RTC_TAMPER(RTC_Tamper)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected Tamper pin */ - RTC->TAFCR |= (uint32_t)RTC_Tamper; - } - else - { - /* Disable the selected Tamper pin */ - RTC->TAFCR &= (uint32_t)~RTC_Tamper; - } -} - -/** - * @brief Configures the Tampers Filter. - * @param RTC_TamperFilter: Specifies the tampers filter. - * This parameter can be one of the following values: - * @arg RTC_TamperFilter_Disable: Tamper filter is disabled. - * @arg RTC_TamperFilter_2Sample: Tamper is activated after 2 consecutive - * samples at the active level - * @arg RTC_TamperFilter_4Sample: Tamper is activated after 4 consecutive - * samples at the active level - * @arg RTC_TamperFilter_8Sample: Tamper is activated after 8 consecutive - * samples at the active level - * @retval None - */ -void RTC_TamperFilterConfig(uint32_t RTC_TamperFilter) -{ - /* Check the parameters */ - assert_param(IS_RTC_TAMPER_FILTER(RTC_TamperFilter)); - - /* Clear TAMPFLT[1:0] bits in the RTC_TAFCR register */ - RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_TAMPFLT); - - /* Configure the RTC_TAFCR register */ - RTC->TAFCR |= (uint32_t)RTC_TamperFilter; -} - -/** - * @brief Configures the Tampers Sampling Frequency. - * @param RTC_TamperSamplingFreq: Specifies the tampers Sampling Frequency. - * This parameter can be one of the following values: - * @arg RTC_TamperSamplingFreq_RTCCLK_Div32768: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 32768 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div16384: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 16384 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div8192: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 8192 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div4096: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 4096 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div2048: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 2048 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div1024: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 1024 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div512: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 512 - * @arg RTC_TamperSamplingFreq_RTCCLK_Div256: Each of the tamper inputs are sampled - * with a frequency = RTCCLK / 256 - * @retval None - */ -void RTC_TamperSamplingFreqConfig(uint32_t RTC_TamperSamplingFreq) -{ - /* Check the parameters */ - assert_param(IS_RTC_TAMPER_SAMPLING_FREQ(RTC_TamperSamplingFreq)); - - /* Clear TAMPFREQ[2:0] bits in the RTC_TAFCR register */ - RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_TAMPFREQ); - - /* Configure the RTC_TAFCR register */ - RTC->TAFCR |= (uint32_t)RTC_TamperSamplingFreq; -} - -/** - * @brief Configures the Tampers Pins input Precharge Duration. - * @param RTC_TamperPrechargeDuration: Specifies the Tampers Pins input - * Precharge Duration. - * This parameter can be one of the following values: - * @arg RTC_TamperPrechargeDuration_1RTCCLK: Tamper pins are pre-charged before sampling during 1 RTCCLK cycle - * @arg RTC_TamperPrechargeDuration_2RTCCLK: Tamper pins are pre-charged before sampling during 2 RTCCLK cycle - * @arg RTC_TamperPrechargeDuration_4RTCCLK: Tamper pins are pre-charged before sampling during 4 RTCCLK cycle - * @arg RTC_TamperPrechargeDuration_8RTCCLK: Tamper pins are pre-charged before sampling during 8 RTCCLK cycle - * @retval None - */ -void RTC_TamperPinsPrechargeDuration(uint32_t RTC_TamperPrechargeDuration) -{ - /* Check the parameters */ - assert_param(IS_RTC_TAMPER_PRECHARGE_DURATION(RTC_TamperPrechargeDuration)); - - /* Clear TAMPPRCH[1:0] bits in the RTC_TAFCR register */ - RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_TAMPPRCH); - - /* Configure the RTC_TAFCR register */ - RTC->TAFCR |= (uint32_t)RTC_TamperPrechargeDuration; -} - -/** - * @brief Enables or Disables the TimeStamp on Tamper Detection Event. - * @note The timestamp is valid even the TSE bit in tamper control register - * is reset. - * @param NewState: new state of the timestamp on tamper event. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_TimeStampOnTamperDetectionCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Save timestamp on tamper detection event */ - RTC->TAFCR |= (uint32_t)RTC_TAFCR_TAMPTS; - } - else - { - /* Tamper detection does not cause a timestamp to be saved */ - RTC->TAFCR &= (uint32_t)~RTC_TAFCR_TAMPTS; - } -} - -/** - * @brief Enables or Disables the Precharge of Tamper pin. - * @param NewState: new state of tamper pull up. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_TamperPullUpCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable precharge of the selected Tamper pin */ - RTC->TAFCR &= (uint32_t)~RTC_TAFCR_TAMPPUDIS; - } - else - { - /* Disable precharge of the selected Tamper pin */ - RTC->TAFCR |= (uint32_t)RTC_TAFCR_TAMPPUDIS; - } -} - -/** - * @} - */ - -/** @defgroup RTC_Group10 Backup Data Registers configuration functions - * @brief Backup Data Registers configuration functions - * -@verbatim - =============================================================================== - Backup Data Registers configuration functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Writes a data in a specified RTC Backup data register. - * @param RTC_BKP_DR: RTC Backup data Register number. - * This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to - * specify the register. - * @param Data: Data to be written in the specified RTC Backup data register. - * @retval None - */ -void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_RTC_BKP(RTC_BKP_DR)); - - tmp = RTC_BASE + 0x50; - tmp += (RTC_BKP_DR * 4); - - /* Write the specified register */ - *(__IO uint32_t *)tmp = (uint32_t)Data; -} - -/** - * @brief Reads data from the specified RTC Backup data Register. - * @param RTC_BKP_DR: RTC Backup data Register number. - * This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to - * specify the register. - * @retval None - */ -uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_RTC_BKP(RTC_BKP_DR)); - - tmp = RTC_BASE + 0x50; - tmp += (RTC_BKP_DR * 4); - - /* Read the specified register */ - return (*(__IO uint32_t *)tmp); -} - -/** - * @} - */ - -/** @defgroup RTC_Group11 RTC Tamper and TimeStamp Pins Selection and Output Type Config configuration functions - * @brief RTC Tamper and TimeStamp Pins Selection and Output Type Config - * configuration functions - * -@verbatim - =============================================================================== - RTC Tamper and TimeStamp Pins Selection and Output Type Config configuration - functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Selects the RTC Tamper Pin. - * @param RTC_TamperPin: specifies the RTC Tamper Pin. - * This parameter can be one of the following values: - * @arg RTC_TamperPin_PC13: PC13 is selected as RTC Tamper Pin. - * @arg RTC_TamperPin_PI8: PI8 is selected as RTC Tamper Pin. - * @retval None - */ -void RTC_TamperPinSelection(uint32_t RTC_TamperPin) -{ - /* Check the parameters */ - assert_param(IS_RTC_TAMPER_PIN(RTC_TamperPin)); - - RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_TAMPINSEL); - RTC->TAFCR |= (uint32_t)(RTC_TamperPin); -} - -/** - * @brief Selects the RTC TimeStamp Pin. - * @param RTC_TimeStampPin: specifies the RTC TimeStamp Pin. - * This parameter can be one of the following values: - * @arg RTC_TimeStampPin_PC13: PC13 is selected as RTC TimeStamp Pin. - * @arg RTC_TimeStampPin_PI8: PI8 is selected as RTC TimeStamp Pin. - * @retval None - */ -void RTC_TimeStampPinSelection(uint32_t RTC_TimeStampPin) -{ - /* Check the parameters */ - assert_param(IS_RTC_TIMESTAMP_PIN(RTC_TimeStampPin)); - - RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_TSINSEL); - RTC->TAFCR |= (uint32_t)(RTC_TimeStampPin); -} - -/** - * @brief Configures the RTC Output Pin mode. - * @param RTC_OutputType: specifies the RTC Output (PC13) pin mode. - * This parameter can be one of the following values: - * @arg RTC_OutputType_OpenDrain: RTC Output (PC13) is configured in - * Open Drain mode. - * @arg RTC_OutputType_PushPull: RTC Output (PC13) is configured in - * Push Pull mode. - * @retval None - */ -void RTC_OutputTypeConfig(uint32_t RTC_OutputType) -{ - /* Check the parameters */ - assert_param(IS_RTC_OUTPUT_TYPE(RTC_OutputType)); - - RTC->TAFCR &= (uint32_t)~(RTC_TAFCR_ALARMOUTTYPE); - RTC->TAFCR |= (uint32_t)(RTC_OutputType); -} - -/** - * @} - */ - -/** @defgroup RTC_Group12 Shift control synchronisation functions - * @brief Shift control synchronisation functions - * -@verbatim - =============================================================================== - Shift control synchronisation functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Configures the Synchronization Shift Control Settings. - * @note When REFCKON is set, firmware must not write to Shift control register - * @param RTC_ShiftAdd1S : Select to add or not 1 second to the time Calendar. - * This parameter can be one of the following values : - * @arg RTC_ShiftAdd1S_Set : Add one second to the clock calendar. - * @arg RTC_ShiftAdd1S_Reset: No effect. - * @param RTC_ShiftSubFS: Select the number of Second Fractions to Substitute. - * This parameter can be one any value from 0 to 0x7FFF. - * @retval An ErrorStatus enumeration value: - * - SUCCESS: RTC Shift registers are configured - * - ERROR: RTC Shift registers are not configured -*/ -ErrorStatus RTC_SynchroShiftConfig(uint32_t RTC_ShiftAdd1S, uint32_t RTC_ShiftSubFS) -{ - ErrorStatus status = ERROR; - uint32_t shpfcount = 0; - - /* Check the parameters */ - assert_param(IS_RTC_SHIFT_ADD1S(RTC_ShiftAdd1S)); - assert_param(IS_RTC_SHIFT_SUBFS(RTC_ShiftSubFS)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - /* Check if a Shift is pending*/ - if ((RTC->ISR & RTC_ISR_SHPF) != RESET) - { - /* Wait until the shift is completed*/ - while (((RTC->ISR & RTC_ISR_SHPF) != RESET) && (shpfcount != SHPF_TIMEOUT)) - { - shpfcount++; - } - } - - /* Check if the Shift pending is completed or if there is no Shift operation at all*/ - if ((RTC->ISR & RTC_ISR_SHPF) == RESET) - { - /* check if the reference clock detection is disabled */ - if((RTC->CR & RTC_CR_REFCKON) == RESET) - { - /* Configure the Shift settings */ - RTC->SHIFTR = (uint32_t)(uint32_t)(RTC_ShiftSubFS) | (uint32_t)(RTC_ShiftAdd1S); - - if(RTC_WaitForSynchro() == ERROR) - { - status = ERROR; - } - else - { - status = SUCCESS; - } - } - else - { - status = ERROR; - } - } - else - { - status = ERROR; - } - - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; - - return (ErrorStatus)(status); -} - -/** - * @} - */ - -/** @defgroup RTC_Group13 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - All RTC interrupts are connected to the EXTI controller. - - - To enable the RTC Alarm interrupt, the following sequence is required: - - Configure and enable the EXTI Line 17 in interrupt mode and select the rising - edge sensitivity using the EXTI_Init() function. - - Configure and enable the RTC_Alarm IRQ channel in the NVIC using the NVIC_Init() - function. - - Configure the RTC to generate RTC alarms (Alarm A and/or Alarm B) using - the RTC_SetAlarm() and RTC_AlarmCmd() functions. - - - To enable the RTC Wakeup interrupt, the following sequence is required: - - Configure and enable the EXTI Line 22 in interrupt mode and select the rising - edge sensitivity using the EXTI_Init() function. - - Configure and enable the RTC_WKUP IRQ channel in the NVIC using the NVIC_Init() - function. - - Configure the RTC to generate the RTC wakeup timer event using the - RTC_WakeUpClockConfig(), RTC_SetWakeUpCounter() and RTC_WakeUpCmd() functions. - - - To enable the RTC Tamper interrupt, the following sequence is required: - - Configure and enable the EXTI Line 21 in interrupt mode and select the rising - edge sensitivity using the EXTI_Init() function. - - Configure and enable the TAMP_STAMP IRQ channel in the NVIC using the NVIC_Init() - function. - - Configure the RTC to detect the RTC tamper event using the - RTC_TamperTriggerConfig() and RTC_TamperCmd() functions. - - - To enable the RTC TimeStamp interrupt, the following sequence is required: - - Configure and enable the EXTI Line 21 in interrupt mode and select the rising - edge sensitivity using the EXTI_Init() function. - - Configure and enable the TAMP_STAMP IRQ channel in the NVIC using the NVIC_Init() - function. - - Configure the RTC to detect the RTC time-stamp event using the - RTC_TimeStampCmd() functions. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified RTC interrupts. - * @param RTC_IT: specifies the RTC interrupt sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg RTC_IT_TS: Time Stamp interrupt mask - * @arg RTC_IT_WUT: WakeUp Timer interrupt mask - * @arg RTC_IT_ALRB: Alarm B interrupt mask - * @arg RTC_IT_ALRA: Alarm A interrupt mask - * @arg RTC_IT_TAMP: Tamper event interrupt mask - * @param NewState: new state of the specified RTC interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_RTC_CONFIG_IT(RTC_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* Disable the write protection for RTC registers */ - RTC->WPR = 0xCA; - RTC->WPR = 0x53; - - if (NewState != DISABLE) - { - /* Configure the Interrupts in the RTC_CR register */ - RTC->CR |= (uint32_t)(RTC_IT & ~RTC_TAFCR_TAMPIE); - /* Configure the Tamper Interrupt in the RTC_TAFCR */ - RTC->TAFCR |= (uint32_t)(RTC_IT & RTC_TAFCR_TAMPIE); - } - else - { - /* Configure the Interrupts in the RTC_CR register */ - RTC->CR &= (uint32_t)~(RTC_IT & (uint32_t)~RTC_TAFCR_TAMPIE); - /* Configure the Tamper Interrupt in the RTC_TAFCR */ - RTC->TAFCR &= (uint32_t)~(RTC_IT & RTC_TAFCR_TAMPIE); - } - /* Enable the write protection for RTC registers */ - RTC->WPR = 0xFF; -} - -/** - * @brief Checks whether the specified RTC flag is set or not. - * @param RTC_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg RTC_FLAG_TAMP1F: Tamper 1 event flag - * @arg RTC_FLAG_TSOVF: Time Stamp OverFlow flag - * @arg RTC_FLAG_TSF: Time Stamp event flag - * @arg RTC_FLAG_WUTF: WakeUp Timer flag - * @arg RTC_FLAG_ALRBF: Alarm B flag - * @arg RTC_FLAG_ALRAF: Alarm A flag - * @arg RTC_FLAG_INITF: Initialization mode flag - * @arg RTC_FLAG_RSF: Registers Synchronized flag - * @arg RTC_FLAG_INITS: Registers Configured flag - * @arg RTC_FLAG_WUTWF: WakeUp Timer Write flag - * @arg RTC_FLAG_ALRBWF: Alarm B Write flag - * @arg RTC_FLAG_ALRAWF: Alarm A write flag - * @retval The new state of RTC_FLAG (SET or RESET). - */ -FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG) -{ - FlagStatus bitstatus = RESET; - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_GET_FLAG(RTC_FLAG)); - - /* Get all the flags */ - tmpreg = (uint32_t)(RTC->ISR & RTC_FLAGS_MASK); - - /* Return the status of the flag */ - if ((tmpreg & RTC_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the RTC's pending flags. - * @param RTC_FLAG: specifies the RTC flag to clear. - * This parameter can be any combination of the following values: - * @arg RTC_FLAG_TAMP1F: Tamper 1 event flag - * @arg RTC_FLAG_TSOVF: Time Stamp Overflow flag - * @arg RTC_FLAG_TSF: Time Stamp event flag - * @arg RTC_FLAG_WUTF: WakeUp Timer flag - * @arg RTC_FLAG_ALRBF: Alarm B flag - * @arg RTC_FLAG_ALRAF: Alarm A flag - * @arg RTC_FLAG_RSF: Registers Synchronized flag - * @retval None - */ -void RTC_ClearFlag(uint32_t RTC_FLAG) -{ - /* Check the parameters */ - assert_param(IS_RTC_CLEAR_FLAG(RTC_FLAG)); - - /* Clear the Flags in the RTC_ISR register */ - RTC->ISR = (uint32_t)((uint32_t)(~((RTC_FLAG | RTC_ISR_INIT)& 0x0000FFFF) | (uint32_t)(RTC->ISR & RTC_ISR_INIT))); -} - -/** - * @brief Checks whether the specified RTC interrupt has occurred or not. - * @param RTC_IT: specifies the RTC interrupt source to check. - * This parameter can be one of the following values: - * @arg RTC_IT_TS: Time Stamp interrupt - * @arg RTC_IT_WUT: WakeUp Timer interrupt - * @arg RTC_IT_ALRB: Alarm B interrupt - * @arg RTC_IT_ALRA: Alarm A interrupt - * @arg RTC_IT_TAMP1: Tamper 1 event interrupt - * @retval The new state of RTC_IT (SET or RESET). - */ -ITStatus RTC_GetITStatus(uint32_t RTC_IT) -{ - ITStatus bitstatus = RESET; - uint32_t tmpreg = 0, enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_RTC_GET_IT(RTC_IT)); - - /* Get the TAMPER Interrupt enable bit and pending bit */ - tmpreg = (uint32_t)(RTC->TAFCR & (RTC_TAFCR_TAMPIE)); - - /* Get the Interrupt enable Status */ - enablestatus = (uint32_t)((RTC->CR & RTC_IT) | (tmpreg & (RTC_IT >> 15))); - - /* Get the Interrupt pending bit */ - tmpreg = (uint32_t)((RTC->ISR & (uint32_t)(RTC_IT >> 4))); - - /* Get the status of the Interrupt */ - if ((enablestatus != (uint32_t)RESET) && ((tmpreg & 0x0000FFFF) != (uint32_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the RTC's interrupt pending bits. - * @param RTC_IT: specifies the RTC interrupt pending bit to clear. - * This parameter can be any combination of the following values: - * @arg RTC_IT_TS: Time Stamp interrupt - * @arg RTC_IT_WUT: WakeUp Timer interrupt - * @arg RTC_IT_ALRB: Alarm B interrupt - * @arg RTC_IT_ALRA: Alarm A interrupt - * @arg RTC_IT_TAMP1: Tamper 1 event interrupt - * @retval None - */ -void RTC_ClearITPendingBit(uint32_t RTC_IT) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_RTC_CLEAR_IT(RTC_IT)); - - /* Get the RTC_ISR Interrupt pending bits mask */ - tmpreg = (uint32_t)(RTC_IT >> 4); - - /* Clear the interrupt pending bits in the RTC_ISR register */ - RTC->ISR = (uint32_t)((uint32_t)(~((tmpreg | RTC_ISR_INIT)& 0x0000FFFF) | (uint32_t)(RTC->ISR & RTC_ISR_INIT))); -} - -/** - * @} - */ - -/** - * @brief Converts a 2 digit decimal to BCD format. - * @param Value: Byte to be converted. - * @retval Converted byte - */ -static uint8_t RTC_ByteToBcd2(uint8_t Value) -{ - uint8_t bcdhigh = 0; - - while (Value >= 10) - { - bcdhigh++; - Value -= 10; - } - - return ((uint8_t)(bcdhigh << 4) | Value); -} - -/** - * @brief Convert from 2 digit BCD to Binary. - * @param Value: BCD value to be converted. - * @retval Converted word - */ -static uint8_t RTC_Bcd2ToByte(uint8_t Value) -{ - uint8_t tmp = 0; - tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10; - return (tmp + (Value & (uint8_t)0x0F)); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_rtc.h b/car_hw/src/lib/stdperiph/stm32f4xx_rtc.h deleted file mode 100644 index 94ffb658164..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_rtc.h +++ /dev/null @@ -1,875 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_rtc.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the RTC firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_RTC_H -#define __STM32F4xx_RTC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup RTC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief RTC Init structures definition - */ -typedef struct -{ - uint32_t RTC_HourFormat; /*!< Specifies the RTC Hour Format. - This parameter can be a value of @ref RTC_Hour_Formats */ - - uint32_t RTC_AsynchPrediv; /*!< Specifies the RTC Asynchronous Predivider value. - This parameter must be set to a value lower than 0x7F */ - - uint32_t RTC_SynchPrediv; /*!< Specifies the RTC Synchronous Predivider value. - This parameter must be set to a value lower than 0x7FFF */ -}RTC_InitTypeDef; - -/** - * @brief RTC Time structure definition - */ -typedef struct -{ - uint8_t RTC_Hours; /*!< Specifies the RTC Time Hour. - This parameter must be set to a value in the 0-12 range - if the RTC_HourFormat_12 is selected or 0-23 range if - the RTC_HourFormat_24 is selected. */ - - uint8_t RTC_Minutes; /*!< Specifies the RTC Time Minutes. - This parameter must be set to a value in the 0-59 range. */ - - uint8_t RTC_Seconds; /*!< Specifies the RTC Time Seconds. - This parameter must be set to a value in the 0-59 range. */ - - uint8_t RTC_H12; /*!< Specifies the RTC AM/PM Time. - This parameter can be a value of @ref RTC_AM_PM_Definitions */ -}RTC_TimeTypeDef; - -/** - * @brief RTC Date structure definition - */ -typedef struct -{ - uint8_t RTC_WeekDay; /*!< Specifies the RTC Date WeekDay. - This parameter can be a value of @ref RTC_WeekDay_Definitions */ - - uint8_t RTC_Month; /*!< Specifies the RTC Date Month (in BCD format). - This parameter can be a value of @ref RTC_Month_Date_Definitions */ - - uint8_t RTC_Date; /*!< Specifies the RTC Date. - This parameter must be set to a value in the 1-31 range. */ - - uint8_t RTC_Year; /*!< Specifies the RTC Date Year. - This parameter must be set to a value in the 0-99 range. */ -}RTC_DateTypeDef; - -/** - * @brief RTC Alarm structure definition - */ -typedef struct -{ - RTC_TimeTypeDef RTC_AlarmTime; /*!< Specifies the RTC Alarm Time members. */ - - uint32_t RTC_AlarmMask; /*!< Specifies the RTC Alarm Masks. - This parameter can be a value of @ref RTC_AlarmMask_Definitions */ - - uint32_t RTC_AlarmDateWeekDaySel; /*!< Specifies the RTC Alarm is on Date or WeekDay. - This parameter can be a value of @ref RTC_AlarmDateWeekDay_Definitions */ - - uint8_t RTC_AlarmDateWeekDay; /*!< Specifies the RTC Alarm Date/WeekDay. - If the Alarm Date is selected, this parameter - must be set to a value in the 1-31 range. - If the Alarm WeekDay is selected, this - parameter can be a value of @ref RTC_WeekDay_Definitions */ -}RTC_AlarmTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup RTC_Exported_Constants - * @{ - */ - - -/** @defgroup RTC_Hour_Formats - * @{ - */ -#define RTC_HourFormat_24 ((uint32_t)0x00000000) -#define RTC_HourFormat_12 ((uint32_t)0x00000040) -#define IS_RTC_HOUR_FORMAT(FORMAT) (((FORMAT) == RTC_HourFormat_12) || \ - ((FORMAT) == RTC_HourFormat_24)) -/** - * @} - */ - -/** @defgroup RTC_Asynchronous_Predivider - * @{ - */ -#define IS_RTC_ASYNCH_PREDIV(PREDIV) ((PREDIV) <= 0x7F) - -/** - * @} - */ - - -/** @defgroup RTC_Synchronous_Predivider - * @{ - */ -#define IS_RTC_SYNCH_PREDIV(PREDIV) ((PREDIV) <= 0x7FFF) - -/** - * @} - */ - -/** @defgroup RTC_Time_Definitions - * @{ - */ -#define IS_RTC_HOUR12(HOUR) (((HOUR) > 0) && ((HOUR) <= 12)) -#define IS_RTC_HOUR24(HOUR) ((HOUR) <= 23) -#define IS_RTC_MINUTES(MINUTES) ((MINUTES) <= 59) -#define IS_RTC_SECONDS(SECONDS) ((SECONDS) <= 59) - -/** - * @} - */ - -/** @defgroup RTC_AM_PM_Definitions - * @{ - */ -#define RTC_H12_AM ((uint8_t)0x00) -#define RTC_H12_PM ((uint8_t)0x40) -#define IS_RTC_H12(PM) (((PM) == RTC_H12_AM) || ((PM) == RTC_H12_PM)) - -/** - * @} - */ - -/** @defgroup RTC_Year_Date_Definitions - * @{ - */ -#define IS_RTC_YEAR(YEAR) ((YEAR) <= 99) - -/** - * @} - */ - -/** @defgroup RTC_Month_Date_Definitions - * @{ - */ - -/* Coded in BCD format */ -#define RTC_Month_January ((uint8_t)0x01) -#define RTC_Month_February ((uint8_t)0x02) -#define RTC_Month_March ((uint8_t)0x03) -#define RTC_Month_April ((uint8_t)0x04) -#define RTC_Month_May ((uint8_t)0x05) -#define RTC_Month_June ((uint8_t)0x06) -#define RTC_Month_July ((uint8_t)0x07) -#define RTC_Month_August ((uint8_t)0x08) -#define RTC_Month_September ((uint8_t)0x09) -#define RTC_Month_October ((uint8_t)0x10) -#define RTC_Month_November ((uint8_t)0x11) -#define RTC_Month_December ((uint8_t)0x12) -#define IS_RTC_MONTH(MONTH) (((MONTH) >= 1) && ((MONTH) <= 12)) -#define IS_RTC_DATE(DATE) (((DATE) >= 1) && ((DATE) <= 31)) - -/** - * @} - */ - -/** @defgroup RTC_WeekDay_Definitions - * @{ - */ - -#define RTC_Weekday_Monday ((uint8_t)0x01) -#define RTC_Weekday_Tuesday ((uint8_t)0x02) -#define RTC_Weekday_Wednesday ((uint8_t)0x03) -#define RTC_Weekday_Thursday ((uint8_t)0x04) -#define RTC_Weekday_Friday ((uint8_t)0x05) -#define RTC_Weekday_Saturday ((uint8_t)0x06) -#define RTC_Weekday_Sunday ((uint8_t)0x07) -#define IS_RTC_WEEKDAY(WEEKDAY) (((WEEKDAY) == RTC_Weekday_Monday) || \ - ((WEEKDAY) == RTC_Weekday_Tuesday) || \ - ((WEEKDAY) == RTC_Weekday_Wednesday) || \ - ((WEEKDAY) == RTC_Weekday_Thursday) || \ - ((WEEKDAY) == RTC_Weekday_Friday) || \ - ((WEEKDAY) == RTC_Weekday_Saturday) || \ - ((WEEKDAY) == RTC_Weekday_Sunday)) -/** - * @} - */ - - -/** @defgroup RTC_Alarm_Definitions - * @{ - */ -#define IS_RTC_ALARM_DATE_WEEKDAY_DATE(DATE) (((DATE) > 0) && ((DATE) <= 31)) -#define IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(WEEKDAY) (((WEEKDAY) == RTC_Weekday_Monday) || \ - ((WEEKDAY) == RTC_Weekday_Tuesday) || \ - ((WEEKDAY) == RTC_Weekday_Wednesday) || \ - ((WEEKDAY) == RTC_Weekday_Thursday) || \ - ((WEEKDAY) == RTC_Weekday_Friday) || \ - ((WEEKDAY) == RTC_Weekday_Saturday) || \ - ((WEEKDAY) == RTC_Weekday_Sunday)) - -/** - * @} - */ - - -/** @defgroup RTC_AlarmDateWeekDay_Definitions - * @{ - */ -#define RTC_AlarmDateWeekDaySel_Date ((uint32_t)0x00000000) -#define RTC_AlarmDateWeekDaySel_WeekDay ((uint32_t)0x40000000) - -#define IS_RTC_ALARM_DATE_WEEKDAY_SEL(SEL) (((SEL) == RTC_AlarmDateWeekDaySel_Date) || \ - ((SEL) == RTC_AlarmDateWeekDaySel_WeekDay)) - -/** - * @} - */ - - -/** @defgroup RTC_AlarmMask_Definitions - * @{ - */ -#define RTC_AlarmMask_None ((uint32_t)0x00000000) -#define RTC_AlarmMask_DateWeekDay ((uint32_t)0x80000000) -#define RTC_AlarmMask_Hours ((uint32_t)0x00800000) -#define RTC_AlarmMask_Minutes ((uint32_t)0x00008000) -#define RTC_AlarmMask_Seconds ((uint32_t)0x00000080) -#define RTC_AlarmMask_All ((uint32_t)0x80808080) -#define IS_ALARM_MASK(MASK) (((MASK) & 0x7F7F7F7F) == (uint32_t)RESET) - -/** - * @} - */ - -/** @defgroup RTC_Alarms_Definitions - * @{ - */ -#define RTC_Alarm_A ((uint32_t)0x00000100) -#define RTC_Alarm_B ((uint32_t)0x00000200) -#define IS_RTC_ALARM(ALARM) (((ALARM) == RTC_Alarm_A) || ((ALARM) == RTC_Alarm_B)) -#define IS_RTC_CMD_ALARM(ALARM) (((ALARM) & (RTC_Alarm_A | RTC_Alarm_B)) != (uint32_t)RESET) - -/** - * @} - */ - - /** @defgroup RTC_Alarm_Sub_Seconds_Masks_Definitions - * @{ - */ -#define RTC_AlarmSubSecondMask_All ((uint32_t)0x00000000) /*!< All Alarm SS fields are masked. - There is no comparison on sub seconds - for Alarm */ -#define RTC_AlarmSubSecondMask_SS14_1 ((uint32_t)0x01000000) /*!< SS[14:1] are don't care in Alarm - comparison. Only SS[0] is compared. */ -#define RTC_AlarmSubSecondMask_SS14_2 ((uint32_t)0x02000000) /*!< SS[14:2] are don't care in Alarm - comparison. Only SS[1:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_3 ((uint32_t)0x03000000) /*!< SS[14:3] are don't care in Alarm - comparison. Only SS[2:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_4 ((uint32_t)0x04000000) /*!< SS[14:4] are don't care in Alarm - comparison. Only SS[3:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_5 ((uint32_t)0x05000000) /*!< SS[14:5] are don't care in Alarm - comparison. Only SS[4:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_6 ((uint32_t)0x06000000) /*!< SS[14:6] are don't care in Alarm - comparison. Only SS[5:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_7 ((uint32_t)0x07000000) /*!< SS[14:7] are don't care in Alarm - comparison. Only SS[6:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_8 ((uint32_t)0x08000000) /*!< SS[14:8] are don't care in Alarm - comparison. Only SS[7:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_9 ((uint32_t)0x09000000) /*!< SS[14:9] are don't care in Alarm - comparison. Only SS[8:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_10 ((uint32_t)0x0A000000) /*!< SS[14:10] are don't care in Alarm - comparison. Only SS[9:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_11 ((uint32_t)0x0B000000) /*!< SS[14:11] are don't care in Alarm - comparison. Only SS[10:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_12 ((uint32_t)0x0C000000) /*!< SS[14:12] are don't care in Alarm - comparison.Only SS[11:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14_13 ((uint32_t)0x0D000000) /*!< SS[14:13] are don't care in Alarm - comparison. Only SS[12:0] are compared */ -#define RTC_AlarmSubSecondMask_SS14 ((uint32_t)0x0E000000) /*!< SS[14] is don't care in Alarm - comparison.Only SS[13:0] are compared */ -#define RTC_AlarmSubSecondMask_None ((uint32_t)0x0F000000) /*!< SS[14:0] are compared and must match - to activate alarm. */ -#define IS_RTC_ALARM_SUB_SECOND_MASK(MASK) (((MASK) == RTC_AlarmSubSecondMask_All) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_1) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_2) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_3) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_4) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_5) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_6) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_7) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_8) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_9) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_10) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_11) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_12) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14_13) || \ - ((MASK) == RTC_AlarmSubSecondMask_SS14) || \ - ((MASK) == RTC_AlarmSubSecondMask_None)) -/** - * @} - */ - -/** @defgroup RTC_Alarm_Sub_Seconds_Value - * @{ - */ - -#define IS_RTC_ALARM_SUB_SECOND_VALUE(VALUE) ((VALUE) <= 0x00007FFF) - -/** - * @} - */ - -/** @defgroup RTC_Wakeup_Timer_Definitions - * @{ - */ -#define RTC_WakeUpClock_RTCCLK_Div16 ((uint32_t)0x00000000) -#define RTC_WakeUpClock_RTCCLK_Div8 ((uint32_t)0x00000001) -#define RTC_WakeUpClock_RTCCLK_Div4 ((uint32_t)0x00000002) -#define RTC_WakeUpClock_RTCCLK_Div2 ((uint32_t)0x00000003) -#define RTC_WakeUpClock_CK_SPRE_16bits ((uint32_t)0x00000004) -#define RTC_WakeUpClock_CK_SPRE_17bits ((uint32_t)0x00000006) -#define IS_RTC_WAKEUP_CLOCK(CLOCK) (((CLOCK) == RTC_WakeUpClock_RTCCLK_Div16) || \ - ((CLOCK) == RTC_WakeUpClock_RTCCLK_Div8) || \ - ((CLOCK) == RTC_WakeUpClock_RTCCLK_Div4) || \ - ((CLOCK) == RTC_WakeUpClock_RTCCLK_Div2) || \ - ((CLOCK) == RTC_WakeUpClock_CK_SPRE_16bits) || \ - ((CLOCK) == RTC_WakeUpClock_CK_SPRE_17bits)) -#define IS_RTC_WAKEUP_COUNTER(COUNTER) ((COUNTER) <= 0xFFFF) -/** - * @} - */ - -/** @defgroup RTC_Time_Stamp_Edges_definitions - * @{ - */ -#define RTC_TimeStampEdge_Rising ((uint32_t)0x00000000) -#define RTC_TimeStampEdge_Falling ((uint32_t)0x00000008) -#define IS_RTC_TIMESTAMP_EDGE(EDGE) (((EDGE) == RTC_TimeStampEdge_Rising) || \ - ((EDGE) == RTC_TimeStampEdge_Falling)) -/** - * @} - */ - -/** @defgroup RTC_Output_selection_Definitions - * @{ - */ -#define RTC_Output_Disable ((uint32_t)0x00000000) -#define RTC_Output_AlarmA ((uint32_t)0x00200000) -#define RTC_Output_AlarmB ((uint32_t)0x00400000) -#define RTC_Output_WakeUp ((uint32_t)0x00600000) - -#define IS_RTC_OUTPUT(OUTPUT) (((OUTPUT) == RTC_Output_Disable) || \ - ((OUTPUT) == RTC_Output_AlarmA) || \ - ((OUTPUT) == RTC_Output_AlarmB) || \ - ((OUTPUT) == RTC_Output_WakeUp)) - -/** - * @} - */ - -/** @defgroup RTC_Output_Polarity_Definitions - * @{ - */ -#define RTC_OutputPolarity_High ((uint32_t)0x00000000) -#define RTC_OutputPolarity_Low ((uint32_t)0x00100000) -#define IS_RTC_OUTPUT_POL(POL) (((POL) == RTC_OutputPolarity_High) || \ - ((POL) == RTC_OutputPolarity_Low)) -/** - * @} - */ - - -/** @defgroup RTC_Digital_Calibration_Definitions - * @{ - */ -#define RTC_CalibSign_Positive ((uint32_t)0x00000000) -#define RTC_CalibSign_Negative ((uint32_t)0x00000080) -#define IS_RTC_CALIB_SIGN(SIGN) (((SIGN) == RTC_CalibSign_Positive) || \ - ((SIGN) == RTC_CalibSign_Negative)) -#define IS_RTC_CALIB_VALUE(VALUE) ((VALUE) < 0x20) - -/** - * @} - */ - - /** @defgroup RTC_Calib_Output_selection_Definitions - * @{ - */ -#define RTC_CalibOutput_512Hz ((uint32_t)0x00000000) -#define RTC_CalibOutput_1Hz ((uint32_t)0x00080000) -#define IS_RTC_CALIB_OUTPUT(OUTPUT) (((OUTPUT) == RTC_CalibOutput_512Hz) || \ - ((OUTPUT) == RTC_CalibOutput_1Hz)) -/** - * @} - */ - -/** @defgroup RTC_Smooth_calib_period_Definitions - * @{ - */ -#define RTC_SmoothCalibPeriod_32sec ((uint32_t)0x00000000) /*!< if RTCCLK = 32768 Hz, Smooth calibation - period is 32s, else 2exp20 RTCCLK seconds */ -#define RTC_SmoothCalibPeriod_16sec ((uint32_t)0x00002000) /*!< if RTCCLK = 32768 Hz, Smooth calibation - period is 16s, else 2exp19 RTCCLK seconds */ -#define RTC_SmoothCalibPeriod_8sec ((uint32_t)0x00004000) /*!< if RTCCLK = 32768 Hz, Smooth calibation - period is 8s, else 2exp18 RTCCLK seconds */ -#define IS_RTC_SMOOTH_CALIB_PERIOD(PERIOD) (((PERIOD) == RTC_SmoothCalibPeriod_32sec) || \ - ((PERIOD) == RTC_SmoothCalibPeriod_16sec) || \ - ((PERIOD) == RTC_SmoothCalibPeriod_8sec)) - -/** - * @} - */ - -/** @defgroup RTC_Smooth_calib_Plus_pulses_Definitions - * @{ - */ -#define RTC_SmoothCalibPlusPulses_Set ((uint32_t)0x00008000) /*!< The number of RTCCLK pulses added - during a X -second window = Y - CALM[8:0]. - with Y = 512, 256, 128 when X = 32, 16, 8 */ -#define RTC_SmoothCalibPlusPulses_Reset ((uint32_t)0x00000000) /*!< The number of RTCCLK pulses subbstited - during a 32-second window = CALM[8:0]. */ -#define IS_RTC_SMOOTH_CALIB_PLUS(PLUS) (((PLUS) == RTC_SmoothCalibPlusPulses_Set) || \ - ((PLUS) == RTC_SmoothCalibPlusPulses_Reset)) - -/** - * @} - */ - -/** @defgroup RTC_Smooth_calib_Minus_pulses_Definitions - * @{ - */ -#define IS_RTC_SMOOTH_CALIB_MINUS(VALUE) ((VALUE) <= 0x000001FF) - -/** - * @} - */ - -/** @defgroup RTC_DayLightSaving_Definitions - * @{ - */ -#define RTC_DayLightSaving_SUB1H ((uint32_t)0x00020000) -#define RTC_DayLightSaving_ADD1H ((uint32_t)0x00010000) -#define IS_RTC_DAYLIGHT_SAVING(SAVE) (((SAVE) == RTC_DayLightSaving_SUB1H) || \ - ((SAVE) == RTC_DayLightSaving_ADD1H)) - -#define RTC_StoreOperation_Reset ((uint32_t)0x00000000) -#define RTC_StoreOperation_Set ((uint32_t)0x00040000) -#define IS_RTC_STORE_OPERATION(OPERATION) (((OPERATION) == RTC_StoreOperation_Reset) || \ - ((OPERATION) == RTC_StoreOperation_Set)) -/** - * @} - */ - -/** @defgroup RTC_Tamper_Trigger_Definitions - * @{ - */ -#define RTC_TamperTrigger_RisingEdge ((uint32_t)0x00000000) -#define RTC_TamperTrigger_FallingEdge ((uint32_t)0x00000001) -#define RTC_TamperTrigger_LowLevel ((uint32_t)0x00000000) -#define RTC_TamperTrigger_HighLevel ((uint32_t)0x00000001) -#define IS_RTC_TAMPER_TRIGGER(TRIGGER) (((TRIGGER) == RTC_TamperTrigger_RisingEdge) || \ - ((TRIGGER) == RTC_TamperTrigger_FallingEdge) || \ - ((TRIGGER) == RTC_TamperTrigger_LowLevel) || \ - ((TRIGGER) == RTC_TamperTrigger_HighLevel)) - -/** - * @} - */ - -/** @defgroup RTC_Tamper_Filter_Definitions - * @{ - */ -#define RTC_TamperFilter_Disable ((uint32_t)0x00000000) /*!< Tamper filter is disabled */ - -#define RTC_TamperFilter_2Sample ((uint32_t)0x00000800) /*!< Tamper is activated after 2 - consecutive samples at the active level */ -#define RTC_TamperFilter_4Sample ((uint32_t)0x00001000) /*!< Tamper is activated after 4 - consecutive samples at the active level */ -#define RTC_TamperFilter_8Sample ((uint32_t)0x00001800) /*!< Tamper is activated after 8 - consecutive samples at the active leve. */ -#define IS_RTC_TAMPER_FILTER(FILTER) (((FILTER) == RTC_TamperFilter_Disable) || \ - ((FILTER) == RTC_TamperFilter_2Sample) || \ - ((FILTER) == RTC_TamperFilter_4Sample) || \ - ((FILTER) == RTC_TamperFilter_8Sample)) -/** - * @} - */ - -/** @defgroup RTC_Tamper_Sampling_Frequencies_Definitions - * @{ - */ -#define RTC_TamperSamplingFreq_RTCCLK_Div32768 ((uint32_t)0x00000000) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 32768 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div16384 ((uint32_t)0x000000100) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 16384 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div8192 ((uint32_t)0x00000200) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 8192 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div4096 ((uint32_t)0x00000300) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 4096 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div2048 ((uint32_t)0x00000400) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 2048 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div1024 ((uint32_t)0x00000500) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 1024 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div512 ((uint32_t)0x00000600) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 512 */ -#define RTC_TamperSamplingFreq_RTCCLK_Div256 ((uint32_t)0x00000700) /*!< Each of the tamper inputs are sampled - with a frequency = RTCCLK / 256 */ -#define IS_RTC_TAMPER_SAMPLING_FREQ(FREQ) (((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div32768) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div16384) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div8192) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div4096) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div2048) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div1024) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div512) || \ - ((FREQ) ==RTC_TamperSamplingFreq_RTCCLK_Div256)) - -/** - * @} - */ - - /** @defgroup RTC_Tamper_Pin_Precharge_Duration_Definitions - * @{ - */ -#define RTC_TamperPrechargeDuration_1RTCCLK ((uint32_t)0x00000000) /*!< Tamper pins are pre-charged before - sampling during 1 RTCCLK cycle */ -#define RTC_TamperPrechargeDuration_2RTCCLK ((uint32_t)0x00002000) /*!< Tamper pins are pre-charged before - sampling during 2 RTCCLK cycles */ -#define RTC_TamperPrechargeDuration_4RTCCLK ((uint32_t)0x00004000) /*!< Tamper pins are pre-charged before - sampling during 4 RTCCLK cycles */ -#define RTC_TamperPrechargeDuration_8RTCCLK ((uint32_t)0x00006000) /*!< Tamper pins are pre-charged before - sampling during 8 RTCCLK cycles */ - -#define IS_RTC_TAMPER_PRECHARGE_DURATION(DURATION) (((DURATION) == RTC_TamperPrechargeDuration_1RTCCLK) || \ - ((DURATION) == RTC_TamperPrechargeDuration_2RTCCLK) || \ - ((DURATION) == RTC_TamperPrechargeDuration_4RTCCLK) || \ - ((DURATION) == RTC_TamperPrechargeDuration_8RTCCLK)) -/** - * @} - */ - -/** @defgroup RTC_Tamper_Pins_Definitions - * @{ - */ -#define RTC_Tamper_1 RTC_TAFCR_TAMP1E -#define IS_RTC_TAMPER(TAMPER) (((TAMPER) == RTC_Tamper_1)) - -/** - * @} - */ - -/** @defgroup RTC_Tamper_Pin_Selection - * @{ - */ -#define RTC_TamperPin_PC13 ((uint32_t)0x00000000) -#define RTC_TamperPin_PI8 ((uint32_t)0x00010000) -#define IS_RTC_TAMPER_PIN(PIN) (((PIN) == RTC_TamperPin_PC13) || \ - ((PIN) == RTC_TamperPin_PI8)) -/** - * @} - */ - -/** @defgroup RTC_TimeStamp_Pin_Selection - * @{ - */ -#define RTC_TimeStampPin_PC13 ((uint32_t)0x00000000) -#define RTC_TimeStampPin_PI8 ((uint32_t)0x00020000) -#define IS_RTC_TIMESTAMP_PIN(PIN) (((PIN) == RTC_TimeStampPin_PC13) || \ - ((PIN) == RTC_TimeStampPin_PI8)) -/** - * @} - */ - -/** @defgroup RTC_Output_Type_ALARM_OUT - * @{ - */ -#define RTC_OutputType_OpenDrain ((uint32_t)0x00000000) -#define RTC_OutputType_PushPull ((uint32_t)0x00040000) -#define IS_RTC_OUTPUT_TYPE(TYPE) (((TYPE) == RTC_OutputType_OpenDrain) || \ - ((TYPE) == RTC_OutputType_PushPull)) - -/** - * @} - */ - -/** @defgroup RTC_Add_1_Second_Parameter_Definitions - * @{ - */ -#define RTC_ShiftAdd1S_Reset ((uint32_t)0x00000000) -#define RTC_ShiftAdd1S_Set ((uint32_t)0x80000000) -#define IS_RTC_SHIFT_ADD1S(SEL) (((SEL) == RTC_ShiftAdd1S_Reset) || \ - ((SEL) == RTC_ShiftAdd1S_Set)) -/** - * @} - */ - -/** @defgroup RTC_Substract_Fraction_Of_Second_Value - * @{ - */ -#define IS_RTC_SHIFT_SUBFS(FS) ((FS) <= 0x00007FFF) - -/** - * @} - */ - -/** @defgroup RTC_Backup_Registers_Definitions - * @{ - */ - -#define RTC_BKP_DR0 ((uint32_t)0x00000000) -#define RTC_BKP_DR1 ((uint32_t)0x00000001) -#define RTC_BKP_DR2 ((uint32_t)0x00000002) -#define RTC_BKP_DR3 ((uint32_t)0x00000003) -#define RTC_BKP_DR4 ((uint32_t)0x00000004) -#define RTC_BKP_DR5 ((uint32_t)0x00000005) -#define RTC_BKP_DR6 ((uint32_t)0x00000006) -#define RTC_BKP_DR7 ((uint32_t)0x00000007) -#define RTC_BKP_DR8 ((uint32_t)0x00000008) -#define RTC_BKP_DR9 ((uint32_t)0x00000009) -#define RTC_BKP_DR10 ((uint32_t)0x0000000A) -#define RTC_BKP_DR11 ((uint32_t)0x0000000B) -#define RTC_BKP_DR12 ((uint32_t)0x0000000C) -#define RTC_BKP_DR13 ((uint32_t)0x0000000D) -#define RTC_BKP_DR14 ((uint32_t)0x0000000E) -#define RTC_BKP_DR15 ((uint32_t)0x0000000F) -#define RTC_BKP_DR16 ((uint32_t)0x00000010) -#define RTC_BKP_DR17 ((uint32_t)0x00000011) -#define RTC_BKP_DR18 ((uint32_t)0x00000012) -#define RTC_BKP_DR19 ((uint32_t)0x00000013) -#define IS_RTC_BKP(BKP) (((BKP) == RTC_BKP_DR0) || \ - ((BKP) == RTC_BKP_DR1) || \ - ((BKP) == RTC_BKP_DR2) || \ - ((BKP) == RTC_BKP_DR3) || \ - ((BKP) == RTC_BKP_DR4) || \ - ((BKP) == RTC_BKP_DR5) || \ - ((BKP) == RTC_BKP_DR6) || \ - ((BKP) == RTC_BKP_DR7) || \ - ((BKP) == RTC_BKP_DR8) || \ - ((BKP) == RTC_BKP_DR9) || \ - ((BKP) == RTC_BKP_DR10) || \ - ((BKP) == RTC_BKP_DR11) || \ - ((BKP) == RTC_BKP_DR12) || \ - ((BKP) == RTC_BKP_DR13) || \ - ((BKP) == RTC_BKP_DR14) || \ - ((BKP) == RTC_BKP_DR15) || \ - ((BKP) == RTC_BKP_DR16) || \ - ((BKP) == RTC_BKP_DR17) || \ - ((BKP) == RTC_BKP_DR18) || \ - ((BKP) == RTC_BKP_DR19)) -/** - * @} - */ - -/** @defgroup RTC_Input_parameter_format_definitions - * @{ - */ -#define RTC_Format_BIN ((uint32_t)0x000000000) -#define RTC_Format_BCD ((uint32_t)0x000000001) -#define IS_RTC_FORMAT(FORMAT) (((FORMAT) == RTC_Format_BIN) || ((FORMAT) == RTC_Format_BCD)) - -/** - * @} - */ - -/** @defgroup RTC_Flags_Definitions - * @{ - */ -#define RTC_FLAG_RECALPF ((uint32_t)0x00010000) -#define RTC_FLAG_TAMP1F ((uint32_t)0x00002000) -#define RTC_FLAG_TSOVF ((uint32_t)0x00001000) -#define RTC_FLAG_TSF ((uint32_t)0x00000800) -#define RTC_FLAG_WUTF ((uint32_t)0x00000400) -#define RTC_FLAG_ALRBF ((uint32_t)0x00000200) -#define RTC_FLAG_ALRAF ((uint32_t)0x00000100) -#define RTC_FLAG_INITF ((uint32_t)0x00000040) -#define RTC_FLAG_RSF ((uint32_t)0x00000020) -#define RTC_FLAG_INITS ((uint32_t)0x00000010) -#define RTC_FLAG_SHPF ((uint32_t)0x00000008) -#define RTC_FLAG_WUTWF ((uint32_t)0x00000004) -#define RTC_FLAG_ALRBWF ((uint32_t)0x00000002) -#define RTC_FLAG_ALRAWF ((uint32_t)0x00000001) -#define IS_RTC_GET_FLAG(FLAG) (((FLAG) == RTC_FLAG_TSOVF) || ((FLAG) == RTC_FLAG_TSF) || \ - ((FLAG) == RTC_FLAG_WUTF) || ((FLAG) == RTC_FLAG_ALRBF) || \ - ((FLAG) == RTC_FLAG_ALRAF) || ((FLAG) == RTC_FLAG_INITF) || \ - ((FLAG) == RTC_FLAG_RSF) || ((FLAG) == RTC_FLAG_WUTWF) || \ - ((FLAG) == RTC_FLAG_ALRBWF) || ((FLAG) == RTC_FLAG_ALRAWF) || \ - ((FLAG) == RTC_FLAG_TAMP1F) || ((FLAG) == RTC_FLAG_RECALPF) || \ - ((FLAG) == RTC_FLAG_SHPF)) -#define IS_RTC_CLEAR_FLAG(FLAG) (((FLAG) != (uint32_t)RESET) && (((FLAG) & 0xFFFF00DF) == (uint32_t)RESET)) -/** - * @} - */ - -/** @defgroup RTC_Interrupts_Definitions - * @{ - */ -#define RTC_IT_TS ((uint32_t)0x00008000) -#define RTC_IT_WUT ((uint32_t)0x00004000) -#define RTC_IT_ALRB ((uint32_t)0x00002000) -#define RTC_IT_ALRA ((uint32_t)0x00001000) -#define RTC_IT_TAMP ((uint32_t)0x00000004) /* Used only to Enable the Tamper Interrupt */ -#define RTC_IT_TAMP1 ((uint32_t)0x00020000) - -#define IS_RTC_CONFIG_IT(IT) (((IT) != (uint32_t)RESET) && (((IT) & 0xFFFF0FFB) == (uint32_t)RESET)) -#define IS_RTC_GET_IT(IT) (((IT) == RTC_IT_TS) || ((IT) == RTC_IT_WUT) || \ - ((IT) == RTC_IT_ALRB) || ((IT) == RTC_IT_ALRA) || \ - ((IT) == RTC_IT_TAMP1)) -#define IS_RTC_CLEAR_IT(IT) (((IT) != (uint32_t)RESET) && (((IT) & 0xFFFD0FFF) == (uint32_t)RESET)) - -/** - * @} - */ - -/** @defgroup RTC_Legacy - * @{ - */ -#define RTC_DigitalCalibConfig RTC_CoarseCalibConfig -#define RTC_DigitalCalibCmd RTC_CoarseCalibCmd - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the RTC configuration to the default reset state *****/ -ErrorStatus RTC_DeInit(void); - -/* Initialization and Configuration functions *********************************/ -ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct); -void RTC_StructInit(RTC_InitTypeDef* RTC_InitStruct); -void RTC_WriteProtectionCmd(FunctionalState NewState); -ErrorStatus RTC_EnterInitMode(void); -void RTC_ExitInitMode(void); -ErrorStatus RTC_WaitForSynchro(void); -ErrorStatus RTC_RefClockCmd(FunctionalState NewState); -void RTC_BypassShadowCmd(FunctionalState NewState); - -/* Time and Date configuration functions **************************************/ -ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct); -void RTC_TimeStructInit(RTC_TimeTypeDef* RTC_TimeStruct); -void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct); -uint32_t RTC_GetSubSecond(void); -ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct); -void RTC_DateStructInit(RTC_DateTypeDef* RTC_DateStruct); -void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct); - -/* Alarms (Alarm A and Alarm B) configuration functions **********************/ -void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct); -void RTC_AlarmStructInit(RTC_AlarmTypeDef* RTC_AlarmStruct); -void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef* RTC_AlarmStruct); -ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm, FunctionalState NewState); -void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue, uint32_t RTC_AlarmSubSecondMask); -uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm); - -/* WakeUp Timer configuration functions ***************************************/ -void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock); -void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter); -uint32_t RTC_GetWakeUpCounter(void); -ErrorStatus RTC_WakeUpCmd(FunctionalState NewState); - -/* Daylight Saving configuration functions ************************************/ -void RTC_DayLightSavingConfig(uint32_t RTC_DayLightSaving, uint32_t RTC_StoreOperation); -uint32_t RTC_GetStoreOperation(void); - -/* Output pin Configuration function ******************************************/ -void RTC_OutputConfig(uint32_t RTC_Output, uint32_t RTC_OutputPolarity); - -/* Digital Calibration configuration functions *********************************/ -ErrorStatus RTC_CoarseCalibConfig(uint32_t RTC_CalibSign, uint32_t Value); -ErrorStatus RTC_CoarseCalibCmd(FunctionalState NewState); -void RTC_CalibOutputCmd(FunctionalState NewState); -void RTC_CalibOutputConfig(uint32_t RTC_CalibOutput); -ErrorStatus RTC_SmoothCalibConfig(uint32_t RTC_SmoothCalibPeriod, - uint32_t RTC_SmoothCalibPlusPulses, - uint32_t RTC_SmouthCalibMinusPulsesValue); - -/* TimeStamp configuration functions ******************************************/ -void RTC_TimeStampCmd(uint32_t RTC_TimeStampEdge, FunctionalState NewState); -void RTC_GetTimeStamp(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_StampTimeStruct, - RTC_DateTypeDef* RTC_StampDateStruct); -uint32_t RTC_GetTimeStampSubSecond(void); - -/* Tampers configuration functions ********************************************/ -void RTC_TamperTriggerConfig(uint32_t RTC_Tamper, uint32_t RTC_TamperTrigger); -void RTC_TamperCmd(uint32_t RTC_Tamper, FunctionalState NewState); -void RTC_TamperFilterConfig(uint32_t RTC_TamperFilter); -void RTC_TamperSamplingFreqConfig(uint32_t RTC_TamperSamplingFreq); -void RTC_TamperPinsPrechargeDuration(uint32_t RTC_TamperPrechargeDuration); -void RTC_TimeStampOnTamperDetectionCmd(FunctionalState NewState); -void RTC_TamperPullUpCmd(FunctionalState NewState); - -/* Backup Data Registers configuration functions ******************************/ -void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data); -uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR); - -/* RTC Tamper and TimeStamp Pins Selection and Output Type Config configuration - functions ******************************************************************/ -void RTC_TamperPinSelection(uint32_t RTC_TamperPin); -void RTC_TimeStampPinSelection(uint32_t RTC_TimeStampPin); -void RTC_OutputTypeConfig(uint32_t RTC_OutputType); - -/* RTC_Shift_control_synchonisation_functions *********************************/ -ErrorStatus RTC_SynchroShiftConfig(uint32_t RTC_ShiftAdd1S, uint32_t RTC_ShiftSubFS); - -/* Interrupts and flags management functions **********************************/ -void RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState); -FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG); -void RTC_ClearFlag(uint32_t RTC_FLAG); -ITStatus RTC_GetITStatus(uint32_t RTC_IT); -void RTC_ClearITPendingBit(uint32_t RTC_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_RTC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_sdio.c b/car_hw/src/lib/stdperiph/stm32f4xx_sdio.c deleted file mode 100644 index df31c9f45e8..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_sdio.c +++ /dev/null @@ -1,1005 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_sdio.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Secure digital input/output interface (SDIO) - * peripheral: - * - Initialization and Configuration - * - Command path state machine (CPSM) management - * - Data path state machine (DPSM) management - * - SDIO IO Cards mode management - * - CE-ATA mode management - * - DMA transfers management - * - Interrupts and flags management - * - * @verbatim - * - * - * =================================================================== - * How to use this driver - * =================================================================== - * 1. The SDIO clock (SDIOCLK = 48 MHz) is coming from a specific output - * of PLL (PLL48CLK). Before to start working with SDIO peripheral - * make sure that the PLL is well configured. - * The SDIO peripheral uses two clock signals: - * - SDIO adapter clock (SDIOCLK = 48 MHz) - * - APB2 bus clock (PCLK2) - * PCLK2 and SDIO_CK clock frequencies must respect the following condition: - * Frequenc(PCLK2) >= (3 / 8 x Frequency(SDIO_CK)) - * - * 2. Enable peripheral clock using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE). - * - * 3. According to the SDIO mode, enable the GPIO clocks using - * RCC_AHB1PeriphClockCmd() function. - * The I/O can be one of the following configurations: - * - 1-bit data length: SDIO_CMD, SDIO_CK and D0. - * - 4-bit data length: SDIO_CMD, SDIO_CK and D[3:0]. - * - 8-bit data length: SDIO_CMD, SDIO_CK and D[7:0]. - * - * 4. Peripheral's alternate function: - * - Connect the pin to the desired peripherals' Alternate - * Function (AF) using GPIO_PinAFConfig() function - * - Configure the desired pin in alternate function by: - * GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF - * - Select the type, pull-up/pull-down and output speed via - * GPIO_PuPd, GPIO_OType and GPIO_Speed members - * - Call GPIO_Init() function - * - * 5. Program the Clock Edge, Clock Bypass, Clock Power Save, Bus Wide, - * hardware, flow control and the Clock Divider using the SDIO_Init() - * function. - * - * 6. Enable the Power ON State using the SDIO_SetPowerState(SDIO_PowerState_ON) - * function. - * - * 7. Enable the clock using the SDIO_ClockCmd() function. - * - * 8. Enable the NVIC and the corresponding interrupt using the function - * SDIO_ITConfig() if you need to use interrupt mode. - * - * 9. When using the DMA mode - * - Configure the DMA using DMA_Init() function - * - Active the needed channel Request using SDIO_DMACmd() function - * - * 10. Enable the DMA using the DMA_Cmd() function, when using DMA mode. - * - * 11. To control the CPSM (Command Path State Machine) and send - * commands to the card use the SDIO_SendCommand(), - * SDIO_GetCommandResponse() and SDIO_GetResponse() functions. - * First, user has to fill the command structure (pointer to - * SDIO_CmdInitTypeDef) according to the selected command to be sent. - * The parameters that should be filled are: - * - Command Argument - * - Command Index - * - Command Response type - * - Command Wait - * - CPSM Status (Enable or Disable) - * - * To check if the command is well received, read the SDIO_CMDRESP - * register using the SDIO_GetCommandResponse(). - * The SDIO responses registers (SDIO_RESP1 to SDIO_RESP2), use the - * SDIO_GetResponse() function. - * - * 12. To control the DPSM (Data Path State Machine) and send/receive - * data to/from the card use the SDIO_DataConfig(), SDIO_GetDataCounter(), - * SDIO_ReadData(), SDIO_WriteData() and SDIO_GetFIFOCount() functions. - * - * Read Operations - * --------------- - * a) First, user has to fill the data structure (pointer to - * SDIO_DataInitTypeDef) according to the selected data type to - * be received. - * The parameters that should be filled are: - * - Data TimeOut - * - Data Length - * - Data Block size - * - Data Transfer direction: should be from card (To SDIO) - * - Data Transfer mode - * - DPSM Status (Enable or Disable) - * - * b) Configure the SDIO resources to receive the data from the card - * according to selected transfer mode (Refer to Step 8, 9 and 10). - * - * c) Send the selected Read command (refer to step 11). - * - * d) Use the SDIO flags/interrupts to check the transfer status. - * - * Write Operations - * --------------- - * a) First, user has to fill the data structure (pointer to - * SDIO_DataInitTypeDef) according to the selected data type to - * be received. - * The parameters that should be filled are: - * - Data TimeOut - * - Data Length - * - Data Block size - * - Data Transfer direction: should be to card (To CARD) - * - Data Transfer mode - * - DPSM Status (Enable or Disable) - * - * b) Configure the SDIO resources to send the data to the card - * according to selected transfer mode (Refer to Step 8, 9 and 10). - * - * c) Send the selected Write command (refer to step 11). - * - * d) Use the SDIO flags/interrupts to check the transfer status. - * - * - * @endverbatim - * - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_sdio.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup SDIO - * @brief SDIO driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* ------------ SDIO registers bit address in the alias region ----------- */ -#define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE) - -/* --- CLKCR Register ---*/ -/* Alias word address of CLKEN bit */ -#define CLKCR_OFFSET (SDIO_OFFSET + 0x04) -#define CLKEN_BitNumber 0x08 -#define CLKCR_CLKEN_BB (PERIPH_BB_BASE + (CLKCR_OFFSET * 32) + (CLKEN_BitNumber * 4)) - -/* --- CMD Register ---*/ -/* Alias word address of SDIOSUSPEND bit */ -#define CMD_OFFSET (SDIO_OFFSET + 0x0C) -#define SDIOSUSPEND_BitNumber 0x0B -#define CMD_SDIOSUSPEND_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSUSPEND_BitNumber * 4)) - -/* Alias word address of ENCMDCOMPL bit */ -#define ENCMDCOMPL_BitNumber 0x0C -#define CMD_ENCMDCOMPL_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ENCMDCOMPL_BitNumber * 4)) - -/* Alias word address of NIEN bit */ -#define NIEN_BitNumber 0x0D -#define CMD_NIEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (NIEN_BitNumber * 4)) - -/* Alias word address of ATACMD bit */ -#define ATACMD_BitNumber 0x0E -#define CMD_ATACMD_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4)) - -/* --- DCTRL Register ---*/ -/* Alias word address of DMAEN bit */ -#define DCTRL_OFFSET (SDIO_OFFSET + 0x2C) -#define DMAEN_BitNumber 0x03 -#define DCTRL_DMAEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4)) - -/* Alias word address of RWSTART bit */ -#define RWSTART_BitNumber 0x08 -#define DCTRL_RWSTART_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTART_BitNumber * 4)) - -/* Alias word address of RWSTOP bit */ -#define RWSTOP_BitNumber 0x09 -#define DCTRL_RWSTOP_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4)) - -/* Alias word address of RWMOD bit */ -#define RWMOD_BitNumber 0x0A -#define DCTRL_RWMOD_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWMOD_BitNumber * 4)) - -/* Alias word address of SDIOEN bit */ -#define SDIOEN_BitNumber 0x0B -#define DCTRL_SDIOEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOEN_BitNumber * 4)) - -/* ---------------------- SDIO registers bit mask ------------------------ */ -/* --- CLKCR Register ---*/ -/* CLKCR register clear mask */ -#define CLKCR_CLEAR_MASK ((uint32_t)0xFFFF8100) - -/* --- PWRCTRL Register ---*/ -/* SDIO PWRCTRL Mask */ -#define PWR_PWRCTRL_MASK ((uint32_t)0xFFFFFFFC) - -/* --- DCTRL Register ---*/ -/* SDIO DCTRL Clear Mask */ -#define DCTRL_CLEAR_MASK ((uint32_t)0xFFFFFF08) - -/* --- CMD Register ---*/ -/* CMD Register clear mask */ -#define CMD_CLEAR_MASK ((uint32_t)0xFFFFF800) - -/* SDIO RESP Registers Address */ -#define SDIO_RESP_ADDR ((uint32_t)(SDIO_BASE + 0x14)) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup SDIO_Private_Functions - * @{ - */ - -/** @defgroup SDIO_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - Initialization and Configuration functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the SDIO peripheral registers to their default reset values. - * @param None - * @retval None - */ -void SDIO_DeInit(void) -{ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, DISABLE); -} - -/** - * @brief Initializes the SDIO peripheral according to the specified - * parameters in the SDIO_InitStruct. - * @param SDIO_InitStruct : pointer to a SDIO_InitTypeDef structure - * that contains the configuration information for the SDIO peripheral. - * @retval None - */ -void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge)); - assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass)); - assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave)); - assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide)); - assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl)); - -/*---------------------------- SDIO CLKCR Configuration ------------------------*/ - /* Get the SDIO CLKCR value */ - tmpreg = SDIO->CLKCR; - - /* Clear CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN bits */ - tmpreg &= CLKCR_CLEAR_MASK; - - /* Set CLKDIV bits according to SDIO_ClockDiv value */ - /* Set PWRSAV bit according to SDIO_ClockPowerSave value */ - /* Set BYPASS bit according to SDIO_ClockBypass value */ - /* Set WIDBUS bits according to SDIO_BusWide value */ - /* Set NEGEDGE bits according to SDIO_ClockEdge value */ - /* Set HWFC_EN bits according to SDIO_HardwareFlowControl value */ - tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv | SDIO_InitStruct->SDIO_ClockPowerSave | - SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide | - SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl); - - /* Write to SDIO CLKCR */ - SDIO->CLKCR = tmpreg; -} - -/** - * @brief Fills each SDIO_InitStruct member with its default value. - * @param SDIO_InitStruct: pointer to an SDIO_InitTypeDef structure which - * will be initialized. - * @retval None - */ -void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct) -{ - /* SDIO_InitStruct members default value */ - SDIO_InitStruct->SDIO_ClockDiv = 0x00; - SDIO_InitStruct->SDIO_ClockEdge = SDIO_ClockEdge_Rising; - SDIO_InitStruct->SDIO_ClockBypass = SDIO_ClockBypass_Disable; - SDIO_InitStruct->SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; - SDIO_InitStruct->SDIO_BusWide = SDIO_BusWide_1b; - SDIO_InitStruct->SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; -} - -/** - * @brief Enables or disables the SDIO Clock. - * @param NewState: new state of the SDIO Clock. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_ClockCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CLKCR_CLKEN_BB = (uint32_t)NewState; -} - -/** - * @brief Sets the power status of the controller. - * @param SDIO_PowerState: new state of the Power state. - * This parameter can be one of the following values: - * @arg SDIO_PowerState_OFF: SDIO Power OFF - * @arg SDIO_PowerState_ON: SDIO Power ON - * @retval None - */ -void SDIO_SetPowerState(uint32_t SDIO_PowerState) -{ - /* Check the parameters */ - assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState)); - - SDIO->POWER = SDIO_PowerState; -} - -/** - * @brief Gets the power status of the controller. - * @param None - * @retval Power status of the controller. The returned value can be one of the - * following values: - * - 0x00: Power OFF - * - 0x02: Power UP - * - 0x03: Power ON - */ -uint32_t SDIO_GetPowerState(void) -{ - return (SDIO->POWER & (~PWR_PWRCTRL_MASK)); -} - -/** - * @} - */ - -/** @defgroup SDIO_Group2 Command path state machine (CPSM) management functions - * @brief Command path state machine (CPSM) management functions - * -@verbatim - =============================================================================== - Command path state machine (CPSM) management functions - =============================================================================== - - This section provide functions allowing to program and read the Command path - state machine (CPSM). - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the SDIO Command according to the specified - * parameters in the SDIO_CmdInitStruct and send the command. - * @param SDIO_CmdInitStruct : pointer to a SDIO_CmdInitTypeDef - * structure that contains the configuration information for the SDIO - * command. - * @retval None - */ -void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->SDIO_CmdIndex)); - assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->SDIO_Response)); - assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->SDIO_Wait)); - assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->SDIO_CPSM)); - -/*---------------------------- SDIO ARG Configuration ------------------------*/ - /* Set the SDIO Argument value */ - SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument; - -/*---------------------------- SDIO CMD Configuration ------------------------*/ - /* Get the SDIO CMD value */ - tmpreg = SDIO->CMD; - /* Clear CMDINDEX, WAITRESP, WAITINT, WAITPEND, CPSMEN bits */ - tmpreg &= CMD_CLEAR_MASK; - /* Set CMDINDEX bits according to SDIO_CmdIndex value */ - /* Set WAITRESP bits according to SDIO_Response value */ - /* Set WAITINT and WAITPEND bits according to SDIO_Wait value */ - /* Set CPSMEN bits according to SDIO_CPSM value */ - tmpreg |= (uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex | SDIO_CmdInitStruct->SDIO_Response - | SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM; - - /* Write to SDIO CMD */ - SDIO->CMD = tmpreg; -} - -/** - * @brief Fills each SDIO_CmdInitStruct member with its default value. - * @param SDIO_CmdInitStruct: pointer to an SDIO_CmdInitTypeDef - * structure which will be initialized. - * @retval None - */ -void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct) -{ - /* SDIO_CmdInitStruct members default value */ - SDIO_CmdInitStruct->SDIO_Argument = 0x00; - SDIO_CmdInitStruct->SDIO_CmdIndex = 0x00; - SDIO_CmdInitStruct->SDIO_Response = SDIO_Response_No; - SDIO_CmdInitStruct->SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStruct->SDIO_CPSM = SDIO_CPSM_Disable; -} - -/** - * @brief Returns command index of last command for which response received. - * @param None - * @retval Returns the command index of the last command response received. - */ -uint8_t SDIO_GetCommandResponse(void) -{ - return (uint8_t)(SDIO->RESPCMD); -} - -/** - * @brief Returns response received from the card for the last command. - * @param SDIO_RESP: Specifies the SDIO response register. - * This parameter can be one of the following values: - * @arg SDIO_RESP1: Response Register 1 - * @arg SDIO_RESP2: Response Register 2 - * @arg SDIO_RESP3: Response Register 3 - * @arg SDIO_RESP4: Response Register 4 - * @retval The Corresponding response register value. - */ -uint32_t SDIO_GetResponse(uint32_t SDIO_RESP) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_SDIO_RESP(SDIO_RESP)); - - tmp = SDIO_RESP_ADDR + SDIO_RESP; - - return (*(__IO uint32_t *) tmp); -} - -/** - * @} - */ - -/** @defgroup SDIO_Group3 Data path state machine (DPSM) management functions - * @brief Data path state machine (DPSM) management functions - * -@verbatim - =============================================================================== - Data path state machine (DPSM) management functions - =============================================================================== - - This section provide functions allowing to program and read the Data path - state machine (DPSM). - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the SDIO data path according to the specified - * parameters in the SDIO_DataInitStruct. - * @param SDIO_DataInitStruct : pointer to a SDIO_DataInitTypeDef structure - * that contains the configuration information for the SDIO command. - * @retval None - */ -void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->SDIO_DataLength)); - assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->SDIO_DataBlockSize)); - assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->SDIO_TransferDir)); - assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->SDIO_TransferMode)); - assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->SDIO_DPSM)); - -/*---------------------------- SDIO DTIMER Configuration ---------------------*/ - /* Set the SDIO Data TimeOut value */ - SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut; - -/*---------------------------- SDIO DLEN Configuration -----------------------*/ - /* Set the SDIO DataLength value */ - SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength; - -/*---------------------------- SDIO DCTRL Configuration ----------------------*/ - /* Get the SDIO DCTRL value */ - tmpreg = SDIO->DCTRL; - /* Clear DEN, DTMODE, DTDIR and DBCKSIZE bits */ - tmpreg &= DCTRL_CLEAR_MASK; - /* Set DEN bit according to SDIO_DPSM value */ - /* Set DTMODE bit according to SDIO_TransferMode value */ - /* Set DTDIR bit according to SDIO_TransferDir value */ - /* Set DBCKSIZE bits according to SDIO_DataBlockSize value */ - tmpreg |= (uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir - | SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM; - - /* Write to SDIO DCTRL */ - SDIO->DCTRL = tmpreg; -} - -/** - * @brief Fills each SDIO_DataInitStruct member with its default value. - * @param SDIO_DataInitStruct: pointer to an SDIO_DataInitTypeDef structure - * which will be initialized. - * @retval None - */ -void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct) -{ - /* SDIO_DataInitStruct members default value */ - SDIO_DataInitStruct->SDIO_DataTimeOut = 0xFFFFFFFF; - SDIO_DataInitStruct->SDIO_DataLength = 0x00; - SDIO_DataInitStruct->SDIO_DataBlockSize = SDIO_DataBlockSize_1b; - SDIO_DataInitStruct->SDIO_TransferDir = SDIO_TransferDir_ToCard; - SDIO_DataInitStruct->SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStruct->SDIO_DPSM = SDIO_DPSM_Disable; -} - -/** - * @brief Returns number of remaining data bytes to be transferred. - * @param None - * @retval Number of remaining data bytes to be transferred - */ -uint32_t SDIO_GetDataCounter(void) -{ - return SDIO->DCOUNT; -} - -/** - * @brief Read one data word from Rx FIFO. - * @param None - * @retval Data received - */ -uint32_t SDIO_ReadData(void) -{ - return SDIO->FIFO; -} - -/** - * @brief Write one data word to Tx FIFO. - * @param Data: 32-bit data word to write. - * @retval None - */ -void SDIO_WriteData(uint32_t Data) -{ - SDIO->FIFO = Data; -} - -/** - * @brief Returns the number of words left to be written to or read from FIFO. - * @param None - * @retval Remaining number of words. - */ -uint32_t SDIO_GetFIFOCount(void) -{ - return SDIO->FIFOCNT; -} - -/** - * @} - */ - -/** @defgroup SDIO_Group4 SDIO IO Cards mode management functions - * @brief SDIO IO Cards mode management functions - * -@verbatim - =============================================================================== - SDIO IO Cards mode management functions - =============================================================================== - - This section provide functions allowing to program and read the SDIO IO Cards. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the SD I/O Read Wait operation. - * @param NewState: new state of the Start SDIO Read Wait operation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_StartSDIOReadWait(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) DCTRL_RWSTART_BB = (uint32_t) NewState; -} - -/** - * @brief Stops the SD I/O Read Wait operation. - * @param NewState: new state of the Stop SDIO Read Wait operation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_StopSDIOReadWait(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) DCTRL_RWSTOP_BB = (uint32_t) NewState; -} - -/** - * @brief Sets one of the two options of inserting read wait interval. - * @param SDIO_ReadWaitMode: SD I/O Read Wait operation mode. - * This parameter can be: - * @arg SDIO_ReadWaitMode_CLK: Read Wait control by stopping SDIOCLK - * @arg SDIO_ReadWaitMode_DATA2: Read Wait control using SDIO_DATA2 - * @retval None - */ -void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode) -{ - /* Check the parameters */ - assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode)); - - *(__IO uint32_t *) DCTRL_RWMOD_BB = SDIO_ReadWaitMode; -} - -/** - * @brief Enables or disables the SD I/O Mode Operation. - * @param NewState: new state of SDIO specific operation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_SetSDIOOperation(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) DCTRL_SDIOEN_BB = (uint32_t)NewState; -} - -/** - * @brief Enables or disables the SD I/O Mode suspend command sending. - * @param NewState: new state of the SD I/O Mode suspend command. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_SendSDIOSuspendCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CMD_SDIOSUSPEND_BB = (uint32_t)NewState; -} - -/** - * @} - */ - -/** @defgroup SDIO_Group5 CE-ATA mode management functions - * @brief CE-ATA mode management functions - * -@verbatim - =============================================================================== - CE-ATA mode management functions - =============================================================================== - - This section provide functions allowing to program and read the CE-ATA card. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the command completion signal. - * @param NewState: new state of command completion signal. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_CommandCompletionCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CMD_ENCMDCOMPL_BB = (uint32_t)NewState; -} - -/** - * @brief Enables or disables the CE-ATA interrupt. - * @param NewState: new state of CE-ATA interrupt. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_CEATAITCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CMD_NIEN_BB = (uint32_t)((~((uint32_t)NewState)) & ((uint32_t)0x1)); -} - -/** - * @brief Sends CE-ATA command (CMD61). - * @param NewState: new state of CE-ATA command. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_SendCEATACmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CMD_ATACMD_BB = (uint32_t)NewState; -} - -/** - * @} - */ - -/** @defgroup SDIO_Group6 DMA transfers management functions - * @brief DMA transfers management functions - * -@verbatim - =============================================================================== - DMA transfers management functions - =============================================================================== - - This section provide functions allowing to program SDIO DMA transfer. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the SDIO DMA request. - * @param NewState: new state of the selected SDIO DMA request. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_DMACmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)NewState; -} - -/** - * @} - */ - -/** @defgroup SDIO_Group7 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the SDIO interrupts. - * @param SDIO_IT: specifies the SDIO interrupt sources to be enabled or disabled. - * This parameter can be one or a combination of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt - * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt - * @arg SDIO_IT_TXACT: Data transmit in progress interrupt - * @arg SDIO_IT_RXACT: Data receive in progress interrupt - * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt - * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt - * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt - * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt - * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt - * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt - * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt - * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt - * @param NewState: new state of the specified SDIO interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SDIO_IT(SDIO_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the SDIO interrupts */ - SDIO->MASK |= SDIO_IT; - } - else - { - /* Disable the SDIO interrupts */ - SDIO->MASK &= ~SDIO_IT; - } -} - -/** - * @brief Checks whether the specified SDIO flag is set or not. - * @param SDIO_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) - * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) - * @arg SDIO_FLAG_CTIMEOUT: Command response timeout - * @arg SDIO_FLAG_DTIMEOUT: Data timeout - * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error - * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error - * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) - * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) - * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) - * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide bus mode. - * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) - * @arg SDIO_FLAG_CMDACT: Command transfer in progress - * @arg SDIO_FLAG_TXACT: Data transmit in progress - * @arg SDIO_FLAG_RXACT: Data receive in progress - * @arg SDIO_FLAG_TXFIFOHE: Transmit FIFO Half Empty - * @arg SDIO_FLAG_RXFIFOHF: Receive FIFO Half Full - * @arg SDIO_FLAG_TXFIFOF: Transmit FIFO full - * @arg SDIO_FLAG_RXFIFOF: Receive FIFO full - * @arg SDIO_FLAG_TXFIFOE: Transmit FIFO empty - * @arg SDIO_FLAG_RXFIFOE: Receive FIFO empty - * @arg SDIO_FLAG_TXDAVL: Data available in transmit FIFO - * @arg SDIO_FLAG_RXDAVL: Data available in receive FIFO - * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received - * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 - * @retval The new state of SDIO_FLAG (SET or RESET). - */ -FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG) -{ - FlagStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_SDIO_FLAG(SDIO_FLAG)); - - if ((SDIO->STA & SDIO_FLAG) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the SDIO's pending flags. - * @param SDIO_FLAG: specifies the flag to clear. - * This parameter can be one or a combination of the following values: - * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) - * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) - * @arg SDIO_FLAG_CTIMEOUT: Command response timeout - * @arg SDIO_FLAG_DTIMEOUT: Data timeout - * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error - * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error - * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) - * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) - * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) - * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide bus mode - * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) - * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received - * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 - * @retval None - */ -void SDIO_ClearFlag(uint32_t SDIO_FLAG) -{ - /* Check the parameters */ - assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG)); - - SDIO->ICR = SDIO_FLAG; -} - -/** - * @brief Checks whether the specified SDIO interrupt has occurred or not. - * @param SDIO_IT: specifies the SDIO interrupt source to check. - * This parameter can be one of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt - * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt - * @arg SDIO_IT_TXACT: Data transmit in progress interrupt - * @arg SDIO_IT_RXACT: Data receive in progress interrupt - * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt - * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt - * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt - * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt - * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt - * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt - * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt - * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt - * @retval The new state of SDIO_IT (SET or RESET). - */ -ITStatus SDIO_GetITStatus(uint32_t SDIO_IT) -{ - ITStatus bitstatus = RESET; - - /* Check the parameters */ - assert_param(IS_SDIO_GET_IT(SDIO_IT)); - if ((SDIO->STA & SDIO_IT) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the SDIO's interrupt pending bits. - * @param SDIO_IT: specifies the interrupt pending bit to clear. - * This parameter can be one or a combination of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIO_DCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 - * @retval None - */ -void SDIO_ClearITPendingBit(uint32_t SDIO_IT) -{ - /* Check the parameters */ - assert_param(IS_SDIO_CLEAR_IT(SDIO_IT)); - - SDIO->ICR = SDIO_IT; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_sdio.h b/car_hw/src/lib/stdperiph/stm32f4xx_sdio.h deleted file mode 100644 index 98f9098ee7e..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_sdio.h +++ /dev/null @@ -1,530 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_sdio.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the SDIO firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_SDIO_H -#define __STM32F4xx_SDIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup SDIO - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -typedef struct -{ - uint32_t SDIO_ClockEdge; /*!< Specifies the clock transition on which the bit capture is made. - This parameter can be a value of @ref SDIO_Clock_Edge */ - - uint32_t SDIO_ClockBypass; /*!< Specifies whether the SDIO Clock divider bypass is - enabled or disabled. - This parameter can be a value of @ref SDIO_Clock_Bypass */ - - uint32_t SDIO_ClockPowerSave; /*!< Specifies whether SDIO Clock output is enabled or - disabled when the bus is idle. - This parameter can be a value of @ref SDIO_Clock_Power_Save */ - - uint32_t SDIO_BusWide; /*!< Specifies the SDIO bus width. - This parameter can be a value of @ref SDIO_Bus_Wide */ - - uint32_t SDIO_HardwareFlowControl; /*!< Specifies whether the SDIO hardware flow control is enabled or disabled. - This parameter can be a value of @ref SDIO_Hardware_Flow_Control */ - - uint8_t SDIO_ClockDiv; /*!< Specifies the clock frequency of the SDIO controller. - This parameter can be a value between 0x00 and 0xFF. */ - -} SDIO_InitTypeDef; - -typedef struct -{ - uint32_t SDIO_Argument; /*!< Specifies the SDIO command argument which is sent - to a card as part of a command message. If a command - contains an argument, it must be loaded into this register - before writing the command to the command register */ - - uint32_t SDIO_CmdIndex; /*!< Specifies the SDIO command index. It must be lower than 0x40. */ - - uint32_t SDIO_Response; /*!< Specifies the SDIO response type. - This parameter can be a value of @ref SDIO_Response_Type */ - - uint32_t SDIO_Wait; /*!< Specifies whether SDIO wait-for-interrupt request is enabled or disabled. - This parameter can be a value of @ref SDIO_Wait_Interrupt_State */ - - uint32_t SDIO_CPSM; /*!< Specifies whether SDIO Command path state machine (CPSM) - is enabled or disabled. - This parameter can be a value of @ref SDIO_CPSM_State */ -} SDIO_CmdInitTypeDef; - -typedef struct -{ - uint32_t SDIO_DataTimeOut; /*!< Specifies the data timeout period in card bus clock periods. */ - - uint32_t SDIO_DataLength; /*!< Specifies the number of data bytes to be transferred. */ - - uint32_t SDIO_DataBlockSize; /*!< Specifies the data block size for block transfer. - This parameter can be a value of @ref SDIO_Data_Block_Size */ - - uint32_t SDIO_TransferDir; /*!< Specifies the data transfer direction, whether the transfer - is a read or write. - This parameter can be a value of @ref SDIO_Transfer_Direction */ - - uint32_t SDIO_TransferMode; /*!< Specifies whether data transfer is in stream or block mode. - This parameter can be a value of @ref SDIO_Transfer_Type */ - - uint32_t SDIO_DPSM; /*!< Specifies whether SDIO Data path state machine (DPSM) - is enabled or disabled. - This parameter can be a value of @ref SDIO_DPSM_State */ -} SDIO_DataInitTypeDef; - - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup SDIO_Exported_Constants - * @{ - */ - -/** @defgroup SDIO_Clock_Edge - * @{ - */ - -#define SDIO_ClockEdge_Rising ((uint32_t)0x00000000) -#define SDIO_ClockEdge_Falling ((uint32_t)0x00002000) -#define IS_SDIO_CLOCK_EDGE(EDGE) (((EDGE) == SDIO_ClockEdge_Rising) || \ - ((EDGE) == SDIO_ClockEdge_Falling)) -/** - * @} - */ - -/** @defgroup SDIO_Clock_Bypass - * @{ - */ - -#define SDIO_ClockBypass_Disable ((uint32_t)0x00000000) -#define SDIO_ClockBypass_Enable ((uint32_t)0x00000400) -#define IS_SDIO_CLOCK_BYPASS(BYPASS) (((BYPASS) == SDIO_ClockBypass_Disable) || \ - ((BYPASS) == SDIO_ClockBypass_Enable)) -/** - * @} - */ - -/** @defgroup SDIO_Clock_Power_Save - * @{ - */ - -#define SDIO_ClockPowerSave_Disable ((uint32_t)0x00000000) -#define SDIO_ClockPowerSave_Enable ((uint32_t)0x00000200) -#define IS_SDIO_CLOCK_POWER_SAVE(SAVE) (((SAVE) == SDIO_ClockPowerSave_Disable) || \ - ((SAVE) == SDIO_ClockPowerSave_Enable)) -/** - * @} - */ - -/** @defgroup SDIO_Bus_Wide - * @{ - */ - -#define SDIO_BusWide_1b ((uint32_t)0x00000000) -#define SDIO_BusWide_4b ((uint32_t)0x00000800) -#define SDIO_BusWide_8b ((uint32_t)0x00001000) -#define IS_SDIO_BUS_WIDE(WIDE) (((WIDE) == SDIO_BusWide_1b) || ((WIDE) == SDIO_BusWide_4b) || \ - ((WIDE) == SDIO_BusWide_8b)) - -/** - * @} - */ - -/** @defgroup SDIO_Hardware_Flow_Control - * @{ - */ - -#define SDIO_HardwareFlowControl_Disable ((uint32_t)0x00000000) -#define SDIO_HardwareFlowControl_Enable ((uint32_t)0x00004000) -#define IS_SDIO_HARDWARE_FLOW_CONTROL(CONTROL) (((CONTROL) == SDIO_HardwareFlowControl_Disable) || \ - ((CONTROL) == SDIO_HardwareFlowControl_Enable)) -/** - * @} - */ - -/** @defgroup SDIO_Power_State - * @{ - */ - -#define SDIO_PowerState_OFF ((uint32_t)0x00000000) -#define SDIO_PowerState_ON ((uint32_t)0x00000003) -#define IS_SDIO_POWER_STATE(STATE) (((STATE) == SDIO_PowerState_OFF) || ((STATE) == SDIO_PowerState_ON)) -/** - * @} - */ - - -/** @defgroup SDIO_Interrupt_sources - * @{ - */ - -#define SDIO_IT_CCRCFAIL ((uint32_t)0x00000001) -#define SDIO_IT_DCRCFAIL ((uint32_t)0x00000002) -#define SDIO_IT_CTIMEOUT ((uint32_t)0x00000004) -#define SDIO_IT_DTIMEOUT ((uint32_t)0x00000008) -#define SDIO_IT_TXUNDERR ((uint32_t)0x00000010) -#define SDIO_IT_RXOVERR ((uint32_t)0x00000020) -#define SDIO_IT_CMDREND ((uint32_t)0x00000040) -#define SDIO_IT_CMDSENT ((uint32_t)0x00000080) -#define SDIO_IT_DATAEND ((uint32_t)0x00000100) -#define SDIO_IT_STBITERR ((uint32_t)0x00000200) -#define SDIO_IT_DBCKEND ((uint32_t)0x00000400) -#define SDIO_IT_CMDACT ((uint32_t)0x00000800) -#define SDIO_IT_TXACT ((uint32_t)0x00001000) -#define SDIO_IT_RXACT ((uint32_t)0x00002000) -#define SDIO_IT_TXFIFOHE ((uint32_t)0x00004000) -#define SDIO_IT_RXFIFOHF ((uint32_t)0x00008000) -#define SDIO_IT_TXFIFOF ((uint32_t)0x00010000) -#define SDIO_IT_RXFIFOF ((uint32_t)0x00020000) -#define SDIO_IT_TXFIFOE ((uint32_t)0x00040000) -#define SDIO_IT_RXFIFOE ((uint32_t)0x00080000) -#define SDIO_IT_TXDAVL ((uint32_t)0x00100000) -#define SDIO_IT_RXDAVL ((uint32_t)0x00200000) -#define SDIO_IT_SDIOIT ((uint32_t)0x00400000) -#define SDIO_IT_CEATAEND ((uint32_t)0x00800000) -#define IS_SDIO_IT(IT) ((((IT) & (uint32_t)0xFF000000) == 0x00) && ((IT) != (uint32_t)0x00)) -/** - * @} - */ - -/** @defgroup SDIO_Command_Index - * @{ - */ - -#define IS_SDIO_CMD_INDEX(INDEX) ((INDEX) < 0x40) -/** - * @} - */ - -/** @defgroup SDIO_Response_Type - * @{ - */ - -#define SDIO_Response_No ((uint32_t)0x00000000) -#define SDIO_Response_Short ((uint32_t)0x00000040) -#define SDIO_Response_Long ((uint32_t)0x000000C0) -#define IS_SDIO_RESPONSE(RESPONSE) (((RESPONSE) == SDIO_Response_No) || \ - ((RESPONSE) == SDIO_Response_Short) || \ - ((RESPONSE) == SDIO_Response_Long)) -/** - * @} - */ - -/** @defgroup SDIO_Wait_Interrupt_State - * @{ - */ - -#define SDIO_Wait_No ((uint32_t)0x00000000) /*!< SDIO No Wait, TimeOut is enabled */ -#define SDIO_Wait_IT ((uint32_t)0x00000100) /*!< SDIO Wait Interrupt Request */ -#define SDIO_Wait_Pend ((uint32_t)0x00000200) /*!< SDIO Wait End of transfer */ -#define IS_SDIO_WAIT(WAIT) (((WAIT) == SDIO_Wait_No) || ((WAIT) == SDIO_Wait_IT) || \ - ((WAIT) == SDIO_Wait_Pend)) -/** - * @} - */ - -/** @defgroup SDIO_CPSM_State - * @{ - */ - -#define SDIO_CPSM_Disable ((uint32_t)0x00000000) -#define SDIO_CPSM_Enable ((uint32_t)0x00000400) -#define IS_SDIO_CPSM(CPSM) (((CPSM) == SDIO_CPSM_Enable) || ((CPSM) == SDIO_CPSM_Disable)) -/** - * @} - */ - -/** @defgroup SDIO_Response_Registers - * @{ - */ - -#define SDIO_RESP1 ((uint32_t)0x00000000) -#define SDIO_RESP2 ((uint32_t)0x00000004) -#define SDIO_RESP3 ((uint32_t)0x00000008) -#define SDIO_RESP4 ((uint32_t)0x0000000C) -#define IS_SDIO_RESP(RESP) (((RESP) == SDIO_RESP1) || ((RESP) == SDIO_RESP2) || \ - ((RESP) == SDIO_RESP3) || ((RESP) == SDIO_RESP4)) -/** - * @} - */ - -/** @defgroup SDIO_Data_Length - * @{ - */ - -#define IS_SDIO_DATA_LENGTH(LENGTH) ((LENGTH) <= 0x01FFFFFF) -/** - * @} - */ - -/** @defgroup SDIO_Data_Block_Size - * @{ - */ - -#define SDIO_DataBlockSize_1b ((uint32_t)0x00000000) -#define SDIO_DataBlockSize_2b ((uint32_t)0x00000010) -#define SDIO_DataBlockSize_4b ((uint32_t)0x00000020) -#define SDIO_DataBlockSize_8b ((uint32_t)0x00000030) -#define SDIO_DataBlockSize_16b ((uint32_t)0x00000040) -#define SDIO_DataBlockSize_32b ((uint32_t)0x00000050) -#define SDIO_DataBlockSize_64b ((uint32_t)0x00000060) -#define SDIO_DataBlockSize_128b ((uint32_t)0x00000070) -#define SDIO_DataBlockSize_256b ((uint32_t)0x00000080) -#define SDIO_DataBlockSize_512b ((uint32_t)0x00000090) -#define SDIO_DataBlockSize_1024b ((uint32_t)0x000000A0) -#define SDIO_DataBlockSize_2048b ((uint32_t)0x000000B0) -#define SDIO_DataBlockSize_4096b ((uint32_t)0x000000C0) -#define SDIO_DataBlockSize_8192b ((uint32_t)0x000000D0) -#define SDIO_DataBlockSize_16384b ((uint32_t)0x000000E0) -#define IS_SDIO_BLOCK_SIZE(SIZE) (((SIZE) == SDIO_DataBlockSize_1b) || \ - ((SIZE) == SDIO_DataBlockSize_2b) || \ - ((SIZE) == SDIO_DataBlockSize_4b) || \ - ((SIZE) == SDIO_DataBlockSize_8b) || \ - ((SIZE) == SDIO_DataBlockSize_16b) || \ - ((SIZE) == SDIO_DataBlockSize_32b) || \ - ((SIZE) == SDIO_DataBlockSize_64b) || \ - ((SIZE) == SDIO_DataBlockSize_128b) || \ - ((SIZE) == SDIO_DataBlockSize_256b) || \ - ((SIZE) == SDIO_DataBlockSize_512b) || \ - ((SIZE) == SDIO_DataBlockSize_1024b) || \ - ((SIZE) == SDIO_DataBlockSize_2048b) || \ - ((SIZE) == SDIO_DataBlockSize_4096b) || \ - ((SIZE) == SDIO_DataBlockSize_8192b) || \ - ((SIZE) == SDIO_DataBlockSize_16384b)) -/** - * @} - */ - -/** @defgroup SDIO_Transfer_Direction - * @{ - */ - -#define SDIO_TransferDir_ToCard ((uint32_t)0x00000000) -#define SDIO_TransferDir_ToSDIO ((uint32_t)0x00000002) -#define IS_SDIO_TRANSFER_DIR(DIR) (((DIR) == SDIO_TransferDir_ToCard) || \ - ((DIR) == SDIO_TransferDir_ToSDIO)) -/** - * @} - */ - -/** @defgroup SDIO_Transfer_Type - * @{ - */ - -#define SDIO_TransferMode_Block ((uint32_t)0x00000000) -#define SDIO_TransferMode_Stream ((uint32_t)0x00000004) -#define IS_SDIO_TRANSFER_MODE(MODE) (((MODE) == SDIO_TransferMode_Stream) || \ - ((MODE) == SDIO_TransferMode_Block)) -/** - * @} - */ - -/** @defgroup SDIO_DPSM_State - * @{ - */ - -#define SDIO_DPSM_Disable ((uint32_t)0x00000000) -#define SDIO_DPSM_Enable ((uint32_t)0x00000001) -#define IS_SDIO_DPSM(DPSM) (((DPSM) == SDIO_DPSM_Enable) || ((DPSM) == SDIO_DPSM_Disable)) -/** - * @} - */ - -/** @defgroup SDIO_Flags - * @{ - */ - -#define SDIO_FLAG_CCRCFAIL ((uint32_t)0x00000001) -#define SDIO_FLAG_DCRCFAIL ((uint32_t)0x00000002) -#define SDIO_FLAG_CTIMEOUT ((uint32_t)0x00000004) -#define SDIO_FLAG_DTIMEOUT ((uint32_t)0x00000008) -#define SDIO_FLAG_TXUNDERR ((uint32_t)0x00000010) -#define SDIO_FLAG_RXOVERR ((uint32_t)0x00000020) -#define SDIO_FLAG_CMDREND ((uint32_t)0x00000040) -#define SDIO_FLAG_CMDSENT ((uint32_t)0x00000080) -#define SDIO_FLAG_DATAEND ((uint32_t)0x00000100) -#define SDIO_FLAG_STBITERR ((uint32_t)0x00000200) -#define SDIO_FLAG_DBCKEND ((uint32_t)0x00000400) -#define SDIO_FLAG_CMDACT ((uint32_t)0x00000800) -#define SDIO_FLAG_TXACT ((uint32_t)0x00001000) -#define SDIO_FLAG_RXACT ((uint32_t)0x00002000) -#define SDIO_FLAG_TXFIFOHE ((uint32_t)0x00004000) -#define SDIO_FLAG_RXFIFOHF ((uint32_t)0x00008000) -#define SDIO_FLAG_TXFIFOF ((uint32_t)0x00010000) -#define SDIO_FLAG_RXFIFOF ((uint32_t)0x00020000) -#define SDIO_FLAG_TXFIFOE ((uint32_t)0x00040000) -#define SDIO_FLAG_RXFIFOE ((uint32_t)0x00080000) -#define SDIO_FLAG_TXDAVL ((uint32_t)0x00100000) -#define SDIO_FLAG_RXDAVL ((uint32_t)0x00200000) -#define SDIO_FLAG_SDIOIT ((uint32_t)0x00400000) -#define SDIO_FLAG_CEATAEND ((uint32_t)0x00800000) -#define IS_SDIO_FLAG(FLAG) (((FLAG) == SDIO_FLAG_CCRCFAIL) || \ - ((FLAG) == SDIO_FLAG_DCRCFAIL) || \ - ((FLAG) == SDIO_FLAG_CTIMEOUT) || \ - ((FLAG) == SDIO_FLAG_DTIMEOUT) || \ - ((FLAG) == SDIO_FLAG_TXUNDERR) || \ - ((FLAG) == SDIO_FLAG_RXOVERR) || \ - ((FLAG) == SDIO_FLAG_CMDREND) || \ - ((FLAG) == SDIO_FLAG_CMDSENT) || \ - ((FLAG) == SDIO_FLAG_DATAEND) || \ - ((FLAG) == SDIO_FLAG_STBITERR) || \ - ((FLAG) == SDIO_FLAG_DBCKEND) || \ - ((FLAG) == SDIO_FLAG_CMDACT) || \ - ((FLAG) == SDIO_FLAG_TXACT) || \ - ((FLAG) == SDIO_FLAG_RXACT) || \ - ((FLAG) == SDIO_FLAG_TXFIFOHE) || \ - ((FLAG) == SDIO_FLAG_RXFIFOHF) || \ - ((FLAG) == SDIO_FLAG_TXFIFOF) || \ - ((FLAG) == SDIO_FLAG_RXFIFOF) || \ - ((FLAG) == SDIO_FLAG_TXFIFOE) || \ - ((FLAG) == SDIO_FLAG_RXFIFOE) || \ - ((FLAG) == SDIO_FLAG_TXDAVL) || \ - ((FLAG) == SDIO_FLAG_RXDAVL) || \ - ((FLAG) == SDIO_FLAG_SDIOIT) || \ - ((FLAG) == SDIO_FLAG_CEATAEND)) - -#define IS_SDIO_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFF3FF800) == 0x00) && ((FLAG) != (uint32_t)0x00)) - -#define IS_SDIO_GET_IT(IT) (((IT) == SDIO_IT_CCRCFAIL) || \ - ((IT) == SDIO_IT_DCRCFAIL) || \ - ((IT) == SDIO_IT_CTIMEOUT) || \ - ((IT) == SDIO_IT_DTIMEOUT) || \ - ((IT) == SDIO_IT_TXUNDERR) || \ - ((IT) == SDIO_IT_RXOVERR) || \ - ((IT) == SDIO_IT_CMDREND) || \ - ((IT) == SDIO_IT_CMDSENT) || \ - ((IT) == SDIO_IT_DATAEND) || \ - ((IT) == SDIO_IT_STBITERR) || \ - ((IT) == SDIO_IT_DBCKEND) || \ - ((IT) == SDIO_IT_CMDACT) || \ - ((IT) == SDIO_IT_TXACT) || \ - ((IT) == SDIO_IT_RXACT) || \ - ((IT) == SDIO_IT_TXFIFOHE) || \ - ((IT) == SDIO_IT_RXFIFOHF) || \ - ((IT) == SDIO_IT_TXFIFOF) || \ - ((IT) == SDIO_IT_RXFIFOF) || \ - ((IT) == SDIO_IT_TXFIFOE) || \ - ((IT) == SDIO_IT_RXFIFOE) || \ - ((IT) == SDIO_IT_TXDAVL) || \ - ((IT) == SDIO_IT_RXDAVL) || \ - ((IT) == SDIO_IT_SDIOIT) || \ - ((IT) == SDIO_IT_CEATAEND)) - -#define IS_SDIO_CLEAR_IT(IT) ((((IT) & (uint32_t)0xFF3FF800) == 0x00) && ((IT) != (uint32_t)0x00)) - -/** - * @} - */ - -/** @defgroup SDIO_Read_Wait_Mode - * @{ - */ - -#define SDIO_ReadWaitMode_CLK ((uint32_t)0x00000000) -#define SDIO_ReadWaitMode_DATA2 ((uint32_t)0x00000001) -#define IS_SDIO_READWAIT_MODE(MODE) (((MODE) == SDIO_ReadWaitMode_CLK) || \ - ((MODE) == SDIO_ReadWaitMode_DATA2)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/* Function used to set the SDIO configuration to the default reset state ****/ -void SDIO_DeInit(void); - -/* Initialization and Configuration functions *********************************/ -void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct); -void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct); -void SDIO_ClockCmd(FunctionalState NewState); -void SDIO_SetPowerState(uint32_t SDIO_PowerState); -uint32_t SDIO_GetPowerState(void); - -/* Command path state machine (CPSM) management functions *********************/ -void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct); -void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct); -uint8_t SDIO_GetCommandResponse(void); -uint32_t SDIO_GetResponse(uint32_t SDIO_RESP); - -/* Data path state machine (DPSM) management functions ************************/ -void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct); -void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct); -uint32_t SDIO_GetDataCounter(void); -uint32_t SDIO_ReadData(void); -void SDIO_WriteData(uint32_t Data); -uint32_t SDIO_GetFIFOCount(void); - -/* SDIO IO Cards mode management functions ************************************/ -void SDIO_StartSDIOReadWait(FunctionalState NewState); -void SDIO_StopSDIOReadWait(FunctionalState NewState); -void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode); -void SDIO_SetSDIOOperation(FunctionalState NewState); -void SDIO_SendSDIOSuspendCmd(FunctionalState NewState); - -/* CE-ATA mode management functions *******************************************/ -void SDIO_CommandCompletionCmd(FunctionalState NewState); -void SDIO_CEATAITCmd(FunctionalState NewState); -void SDIO_SendCEATACmd(FunctionalState NewState); - -/* DMA transfers management functions *****************************************/ -void SDIO_DMACmd(FunctionalState NewState); - -/* Interrupts and flags management functions **********************************/ -void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState); -FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG); -void SDIO_ClearFlag(uint32_t SDIO_FLAG); -ITStatus SDIO_GetITStatus(uint32_t SDIO_IT); -void SDIO_ClearITPendingBit(uint32_t SDIO_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_SDIO_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_spi.c b/car_hw/src/lib/stdperiph/stm32f4xx_spi.c deleted file mode 100644 index 5ffcf0fab71..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_spi.c +++ /dev/null @@ -1,1287 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_spi.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Serial peripheral interface (SPI): - * - Initialization and Configuration - * - Data transfers functions - * - Hardware CRC Calculation - * - DMA transfers management - * - Interrupts and flags management - * - * @verbatim - * - * - * =================================================================== - * How to use this driver - * =================================================================== - * - * 1. Enable peripheral clock using the following functions - * RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE) for SPI1 - * RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE) for SPI2 - * RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE) for SPI3. - * - * 2. Enable SCK, MOSI, MISO and NSS GPIO clocks using RCC_AHB1PeriphClockCmd() - * function. - * In I2S mode, if an external clock source is used then the I2S CKIN pin GPIO - * clock should also be enabled. - * - * 3. Peripherals alternate function: - * - Connect the pin to the desired peripherals' Alternate - * Function (AF) using GPIO_PinAFConfig() function - * - Configure the desired pin in alternate function by: - * GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF - * - Select the type, pull-up/pull-down and output speed via - * GPIO_PuPd, GPIO_OType and GPIO_Speed members - * - Call GPIO_Init() function - * In I2S mode, if an external clock source is used then the I2S CKIN pin - * should be also configured in Alternate function Push-pull pull-up mode. - * - * 4. Program the Polarity, Phase, First Data, Baud Rate Prescaler, Slave - * Management, Peripheral Mode and CRC Polynomial values using the SPI_Init() - * function. - * In I2S mode, program the Mode, Standard, Data Format, MCLK Output, Audio - * frequency and Polarity using I2S_Init() function. - * For I2S mode, make sure that either: - * - I2S PLL is configured using the functions RCC_I2SCLKConfig(RCC_I2S2CLKSource_PLLI2S), - * RCC_PLLI2SCmd(ENABLE) and RCC_GetFlagStatus(RCC_FLAG_PLLI2SRDY). - * or - * - External clock source is configured using the function - * RCC_I2SCLKConfig(RCC_I2S2CLKSource_Ext) and after setting correctly the define constant - * I2S_EXTERNAL_CLOCK_VAL in the stm32f4xx_conf.h file. - * - * 5. Enable the NVIC and the corresponding interrupt using the function - * SPI_ITConfig() if you need to use interrupt mode. - * - * 6. When using the DMA mode - * - Configure the DMA using DMA_Init() function - * - Active the needed channel Request using SPI_I2S_DMACmd() function - * - * 7. Enable the SPI using the SPI_Cmd() function or enable the I2S using - * I2S_Cmd(). - * - * 8. Enable the DMA using the DMA_Cmd() function when using DMA mode. - * - * 9. Optionally, you can enable/configure the following parameters without - * re-initialization (i.e there is no need to call again SPI_Init() function): - * - When bidirectional mode (SPI_Direction_1Line_Rx or SPI_Direction_1Line_Tx) - * is programmed as Data direction parameter using the SPI_Init() function - * it can be possible to switch between SPI_Direction_Tx or SPI_Direction_Rx - * using the SPI_BiDirectionalLineConfig() function. - * - When SPI_NSS_Soft is selected as Slave Select Management parameter - * using the SPI_Init() function it can be possible to manage the - * NSS internal signal using the SPI_NSSInternalSoftwareConfig() function. - * - Reconfigure the data size using the SPI_DataSizeConfig() function - * - Enable or disable the SS output using the SPI_SSOutputCmd() function - * - * 10. To use the CRC Hardware calculation feature refer to the Peripheral - * CRC hardware Calculation subsection. - * - * - * It is possible to use SPI in I2S full duplex mode, in this case, each SPI - * peripheral is able to manage sending and receiving data simultaneously - * using two data lines. Each SPI peripheral has an extended block called I2Sxext - * (ie. I2S2ext for SPI2 and I2S3ext for SPI3). - * The extension block is not a full SPI IP, it is used only as I2S slave to - * implement full duplex mode. The extension block uses the same clock sources - * as its master. - * To configure I2S full duplex you have to: - * - * 1. Configure SPIx in I2S mode (I2S_Init() function) as described above. - * - * 2. Call the I2S_FullDuplexConfig() function using the same strucutre passed to - * I2S_Init() function. - * - * 3. Call I2S_Cmd() for SPIx then for its extended block. - * - * 4. To configure interrupts or DMA requests and to get/clear flag status, - * use I2Sxext instance for the extension block. - * - * Functions that can be called with I2Sxext instances are: - * I2S_Cmd(), I2S_FullDuplexConfig(), SPI_I2S_ReceiveData(), SPI_I2S_SendData(), - * SPI_I2S_DMACmd(), SPI_I2S_ITConfig(), SPI_I2S_GetFlagStatus(), SPI_I2S_ClearFlag(), - * SPI_I2S_GetITStatus() and SPI_I2S_ClearITPendingBit(). - * - * Example: To use SPI3 in Full duplex mode (SPI3 is Master Tx, I2S3ext is Slave Rx): - * - * RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); - * I2S_StructInit(&I2SInitStruct); - * I2SInitStruct.Mode = I2S_Mode_MasterTx; - * I2S_Init(SPI3, &I2SInitStruct); - * I2S_FullDuplexConfig(SPI3ext, &I2SInitStruct) - * I2S_Cmd(SPI3, ENABLE); - * I2S_Cmd(SPI3ext, ENABLE); - * ... - * while (SPI_I2S_GetFlagStatus(SPI2, SPI_FLAG_TXE) == RESET) - * {} - * SPI_I2S_SendData(SPI3, txdata[i]); - * ... - * while (SPI_I2S_GetFlagStatus(I2S3ext, SPI_FLAG_RXNE) == RESET) - * {} - * rxdata[i] = SPI_I2S_ReceiveData(I2S3ext); - * ... - * - * - * @note In I2S mode: if an external clock is used as source clock for the I2S, - * then the define I2S_EXTERNAL_CLOCK_VAL in file stm32f4xx_conf.h should - * be enabled and set to the value of the source clock frequency (in Hz). - * - * @note In SPI mode: To use the SPI TI mode, call the function SPI_TIModeCmd() - * just after calling the function SPI_Init(). - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_spi.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup SPI - * @brief SPI driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* SPI registers Masks */ -#define CR1_CLEAR_MASK ((uint16_t)0x3040) -#define I2SCFGR_CLEAR_MASK ((uint16_t)0xF040) - -/* RCC PLLs masks */ -#define PLLCFGR_PPLR_MASK ((uint32_t)0x70000000) -#define PLLCFGR_PPLN_MASK ((uint32_t)0x00007FC0) - -#define SPI_CR2_FRF ((uint16_t)0x0010) -#define SPI_SR_TIFRFE ((uint16_t)0x0100) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup SPI_Private_Functions - * @{ - */ - -/** @defgroup SPI_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - Initialization and Configuration functions - =============================================================================== - - This section provides a set of functions allowing to initialize the SPI Direction, - SPI Mode, SPI Data Size, SPI Polarity, SPI Phase, SPI NSS Management, SPI Baud - Rate Prescaler, SPI First Bit and SPI CRC Polynomial. - - The SPI_Init() function follows the SPI configuration procedures for Master mode - and Slave mode (details for these procedures are available in reference manual - (RM0090)). - -@endverbatim - * @{ - */ - -/** - * @brief Deinitialize the SPIx peripheral registers to their default reset values. - * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 - * in SPI mode or 2 or 3 in I2S mode. - * - * @note The extended I2S blocks (ie. I2S2ext and I2S3ext blocks) are deinitialized - * when the relative I2S peripheral is deinitialized (the extended block's clock - * is managed by the I2S peripheral clock). - * - * @retval None - */ -void SPI_I2S_DeInit(SPI_TypeDef* SPIx) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - if (SPIx == SPI1) - { - /* Enable SPI1 reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE); - /* Release SPI1 from reset state */ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE); - } - else if (SPIx == SPI2) - { - /* Enable SPI2 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE); - /* Release SPI2 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE); - } - else - { - if (SPIx == SPI3) - { - /* Enable SPI3 reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE); - /* Release SPI3 from reset state */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, DISABLE); - } - } -} - -/** - * @brief Initializes the SPIx peripheral according to the specified - * parameters in the SPI_InitStruct. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param SPI_InitStruct: pointer to a SPI_InitTypeDef structure that - * contains the configuration information for the specified SPI peripheral. - * @retval None - */ -void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct) -{ - uint16_t tmpreg = 0; - - /* check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - /* Check the SPI parameters */ - assert_param(IS_SPI_DIRECTION_MODE(SPI_InitStruct->SPI_Direction)); - assert_param(IS_SPI_MODE(SPI_InitStruct->SPI_Mode)); - assert_param(IS_SPI_DATASIZE(SPI_InitStruct->SPI_DataSize)); - assert_param(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL)); - assert_param(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA)); - assert_param(IS_SPI_NSS(SPI_InitStruct->SPI_NSS)); - assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_InitStruct->SPI_BaudRatePrescaler)); - assert_param(IS_SPI_FIRST_BIT(SPI_InitStruct->SPI_FirstBit)); - assert_param(IS_SPI_CRC_POLYNOMIAL(SPI_InitStruct->SPI_CRCPolynomial)); - -/*---------------------------- SPIx CR1 Configuration ------------------------*/ - /* Get the SPIx CR1 value */ - tmpreg = SPIx->CR1; - /* Clear BIDIMode, BIDIOE, RxONLY, SSM, SSI, LSBFirst, BR, MSTR, CPOL and CPHA bits */ - tmpreg &= CR1_CLEAR_MASK; - /* Configure SPIx: direction, NSS management, first transmitted bit, BaudRate prescaler - master/salve mode, CPOL and CPHA */ - /* Set BIDImode, BIDIOE and RxONLY bits according to SPI_Direction value */ - /* Set SSM, SSI and MSTR bits according to SPI_Mode and SPI_NSS values */ - /* Set LSBFirst bit according to SPI_FirstBit value */ - /* Set BR bits according to SPI_BaudRatePrescaler value */ - /* Set CPOL bit according to SPI_CPOL value */ - /* Set CPHA bit according to SPI_CPHA value */ - tmpreg |= (uint16_t)((uint32_t)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode | - SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL | - SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS | - SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit); - /* Write to SPIx CR1 */ - SPIx->CR1 = tmpreg; - - /* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */ - SPIx->I2SCFGR &= (uint16_t)~((uint16_t)SPI_I2SCFGR_I2SMOD); -/*---------------------------- SPIx CRCPOLY Configuration --------------------*/ - /* Write to SPIx CRCPOLY */ - SPIx->CRCPR = SPI_InitStruct->SPI_CRCPolynomial; -} - -/** - * @brief Initializes the SPIx peripheral according to the specified - * parameters in the I2S_InitStruct. - * @param SPIx: where x can be 2 or 3 to select the SPI peripheral (configured in I2S mode). - * @param I2S_InitStruct: pointer to an I2S_InitTypeDef structure that - * contains the configuration information for the specified SPI peripheral - * configured in I2S mode. - * - * @note The function calculates the optimal prescaler needed to obtain the most - * accurate audio frequency (depending on the I2S clock source, the PLL values - * and the product configuration). But in case the prescaler value is greater - * than 511, the default value (0x02) will be configured instead. - * - * @note if an external clock is used as source clock for the I2S, then the define - * I2S_EXTERNAL_CLOCK_VAL in file stm32f4xx_conf.h should be enabled and set - * to the value of the the source clock frequency (in Hz). - * - * @retval None - */ -void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct) -{ - uint16_t tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1; - uint32_t tmp = 0, i2sclk = 0; -#ifndef I2S_EXTERNAL_CLOCK_VAL - uint32_t pllm = 0, plln = 0, pllr = 0; -#endif /* I2S_EXTERNAL_CLOCK_VAL */ - - /* Check the I2S parameters */ - assert_param(IS_SPI_23_PERIPH(SPIx)); - assert_param(IS_I2S_MODE(I2S_InitStruct->I2S_Mode)); - assert_param(IS_I2S_STANDARD(I2S_InitStruct->I2S_Standard)); - assert_param(IS_I2S_DATA_FORMAT(I2S_InitStruct->I2S_DataFormat)); - assert_param(IS_I2S_MCLK_OUTPUT(I2S_InitStruct->I2S_MCLKOutput)); - assert_param(IS_I2S_AUDIO_FREQ(I2S_InitStruct->I2S_AudioFreq)); - assert_param(IS_I2S_CPOL(I2S_InitStruct->I2S_CPOL)); - -/*----------------------- SPIx I2SCFGR & I2SPR Configuration -----------------*/ - /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ - SPIx->I2SCFGR &= I2SCFGR_CLEAR_MASK; - SPIx->I2SPR = 0x0002; - - /* Get the I2SCFGR register value */ - tmpreg = SPIx->I2SCFGR; - - /* If the default value has to be written, reinitialize i2sdiv and i2sodd*/ - if(I2S_InitStruct->I2S_AudioFreq == I2S_AudioFreq_Default) - { - i2sodd = (uint16_t)0; - i2sdiv = (uint16_t)2; - } - /* If the requested audio frequency is not the default, compute the prescaler */ - else - { - /* Check the frame length (For the Prescaler computing) *******************/ - if(I2S_InitStruct->I2S_DataFormat == I2S_DataFormat_16b) - { - /* Packet length is 16 bits */ - packetlength = 1; - } - else - { - /* Packet length is 32 bits */ - packetlength = 2; - } - - /* Get I2S source Clock frequency ****************************************/ - - /* If an external I2S clock has to be used, this define should be set - in the project configuration or in the stm32f4xx_conf.h file */ - #ifdef I2S_EXTERNAL_CLOCK_VAL - /* Set external clock as I2S clock source */ - if ((RCC->CFGR & RCC_CFGR_I2SSRC) == 0) - { - RCC->CFGR |= (uint32_t)RCC_CFGR_I2SSRC; - } - - /* Set the I2S clock to the external clock value */ - i2sclk = I2S_EXTERNAL_CLOCK_VAL; - - #else /* There is no define for External I2S clock source */ - /* Set PLLI2S as I2S clock source */ - if ((RCC->CFGR & RCC_CFGR_I2SSRC) != 0) - { - RCC->CFGR &= ~(uint32_t)RCC_CFGR_I2SSRC; - } - - /* Get the PLLI2SN value */ - plln = (uint32_t)(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6) & \ - (RCC_PLLI2SCFGR_PLLI2SN >> 6)); - - /* Get the PLLI2SR value */ - pllr = (uint32_t)(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28) & \ - (RCC_PLLI2SCFGR_PLLI2SR >> 28)); - - /* Get the PLLM value */ - pllm = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); - - /* Get the I2S source clock value */ - i2sclk = (uint32_t)(((HSE_VALUE / pllm) * plln) / pllr); - #endif /* I2S_EXTERNAL_CLOCK_VAL */ - - /* Compute the Real divider depending on the MCLK output state, with a floating point */ - if(I2S_InitStruct->I2S_MCLKOutput == I2S_MCLKOutput_Enable) - { - /* MCLK output is enabled */ - tmp = (uint16_t)(((((i2sclk / 256) * 10) / I2S_InitStruct->I2S_AudioFreq)) + 5); - } - else - { - /* MCLK output is disabled */ - tmp = (uint16_t)(((((i2sclk / (32 * packetlength)) *10 ) / I2S_InitStruct->I2S_AudioFreq)) + 5); - } - - /* Remove the flatting point */ - tmp = tmp / 10; - - /* Check the parity of the divider */ - i2sodd = (uint16_t)(tmp & (uint16_t)0x0001); - - /* Compute the i2sdiv prescaler */ - i2sdiv = (uint16_t)((tmp - i2sodd) / 2); - - /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */ - i2sodd = (uint16_t) (i2sodd << 8); - } - - /* Test if the divider is 1 or 0 or greater than 0xFF */ - if ((i2sdiv < 2) || (i2sdiv > 0xFF)) - { - /* Set the default values */ - i2sdiv = 2; - i2sodd = 0; - } - - /* Write to SPIx I2SPR register the computed value */ - SPIx->I2SPR = (uint16_t)((uint16_t)i2sdiv | (uint16_t)(i2sodd | (uint16_t)I2S_InitStruct->I2S_MCLKOutput)); - - /* Configure the I2S with the SPI_InitStruct values */ - tmpreg |= (uint16_t)((uint16_t)SPI_I2SCFGR_I2SMOD | (uint16_t)(I2S_InitStruct->I2S_Mode | \ - (uint16_t)(I2S_InitStruct->I2S_Standard | (uint16_t)(I2S_InitStruct->I2S_DataFormat | \ - (uint16_t)I2S_InitStruct->I2S_CPOL)))); - - /* Write to SPIx I2SCFGR */ - SPIx->I2SCFGR = tmpreg; -} - -/** - * @brief Fills each SPI_InitStruct member with its default value. - * @param SPI_InitStruct: pointer to a SPI_InitTypeDef structure which will be initialized. - * @retval None - */ -void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct) -{ -/*--------------- Reset SPI init structure parameters values -----------------*/ - /* Initialize the SPI_Direction member */ - SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex; - /* initialize the SPI_Mode member */ - SPI_InitStruct->SPI_Mode = SPI_Mode_Slave; - /* initialize the SPI_DataSize member */ - SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b; - /* Initialize the SPI_CPOL member */ - SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low; - /* Initialize the SPI_CPHA member */ - SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge; - /* Initialize the SPI_NSS member */ - SPI_InitStruct->SPI_NSS = SPI_NSS_Hard; - /* Initialize the SPI_BaudRatePrescaler member */ - SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; - /* Initialize the SPI_FirstBit member */ - SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB; - /* Initialize the SPI_CRCPolynomial member */ - SPI_InitStruct->SPI_CRCPolynomial = 7; -} - -/** - * @brief Fills each I2S_InitStruct member with its default value. - * @param I2S_InitStruct: pointer to a I2S_InitTypeDef structure which will be initialized. - * @retval None - */ -void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct) -{ -/*--------------- Reset I2S init structure parameters values -----------------*/ - /* Initialize the I2S_Mode member */ - I2S_InitStruct->I2S_Mode = I2S_Mode_SlaveTx; - - /* Initialize the I2S_Standard member */ - I2S_InitStruct->I2S_Standard = I2S_Standard_Phillips; - - /* Initialize the I2S_DataFormat member */ - I2S_InitStruct->I2S_DataFormat = I2S_DataFormat_16b; - - /* Initialize the I2S_MCLKOutput member */ - I2S_InitStruct->I2S_MCLKOutput = I2S_MCLKOutput_Disable; - - /* Initialize the I2S_AudioFreq member */ - I2S_InitStruct->I2S_AudioFreq = I2S_AudioFreq_Default; - - /* Initialize the I2S_CPOL member */ - I2S_InitStruct->I2S_CPOL = I2S_CPOL_Low; -} - -/** - * @brief Enables or disables the specified SPI peripheral. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param NewState: new state of the SPIx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected SPI peripheral */ - SPIx->CR1 |= SPI_CR1_SPE; - } - else - { - /* Disable the selected SPI peripheral */ - SPIx->CR1 &= (uint16_t)~((uint16_t)SPI_CR1_SPE); - } -} - -/** - * @brief Enables or disables the specified SPI peripheral (in I2S mode). - * @param SPIx: where x can be 2 or 3 to select the SPI peripheral (or I2Sxext - * for full duplex mode). - * @param NewState: new state of the SPIx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_23_PERIPH_EXT(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected SPI peripheral (in I2S mode) */ - SPIx->I2SCFGR |= SPI_I2SCFGR_I2SE; - } - else - { - /* Disable the selected SPI peripheral in I2S mode */ - SPIx->I2SCFGR &= (uint16_t)~((uint16_t)SPI_I2SCFGR_I2SE); - } -} - -/** - * @brief Configures the data size for the selected SPI. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param SPI_DataSize: specifies the SPI data size. - * This parameter can be one of the following values: - * @arg SPI_DataSize_16b: Set data frame format to 16bit - * @arg SPI_DataSize_8b: Set data frame format to 8bit - * @retval None - */ -void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_DATASIZE(SPI_DataSize)); - /* Clear DFF bit */ - SPIx->CR1 &= (uint16_t)~SPI_DataSize_16b; - /* Set new DFF bit value */ - SPIx->CR1 |= SPI_DataSize; -} - -/** - * @brief Selects the data transfer direction in bidirectional mode for the specified SPI. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param SPI_Direction: specifies the data transfer direction in bidirectional mode. - * This parameter can be one of the following values: - * @arg SPI_Direction_Tx: Selects Tx transmission direction - * @arg SPI_Direction_Rx: Selects Rx receive direction - * @retval None - */ -void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_DIRECTION(SPI_Direction)); - if (SPI_Direction == SPI_Direction_Tx) - { - /* Set the Tx only mode */ - SPIx->CR1 |= SPI_Direction_Tx; - } - else - { - /* Set the Rx only mode */ - SPIx->CR1 &= SPI_Direction_Rx; - } -} - -/** - * @brief Configures internally by software the NSS pin for the selected SPI. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param SPI_NSSInternalSoft: specifies the SPI NSS internal state. - * This parameter can be one of the following values: - * @arg SPI_NSSInternalSoft_Set: Set NSS pin internally - * @arg SPI_NSSInternalSoft_Reset: Reset NSS pin internally - * @retval None - */ -void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_NSS_INTERNAL(SPI_NSSInternalSoft)); - if (SPI_NSSInternalSoft != SPI_NSSInternalSoft_Reset) - { - /* Set NSS pin internally by software */ - SPIx->CR1 |= SPI_NSSInternalSoft_Set; - } - else - { - /* Reset NSS pin internally by software */ - SPIx->CR1 &= SPI_NSSInternalSoft_Reset; - } -} - -/** - * @brief Enables or disables the SS output for the selected SPI. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param NewState: new state of the SPIx SS output. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected SPI SS output */ - SPIx->CR2 |= (uint16_t)SPI_CR2_SSOE; - } - else - { - /* Disable the selected SPI SS output */ - SPIx->CR2 &= (uint16_t)~((uint16_t)SPI_CR2_SSOE); - } -} - -/** - * @brief Enables or disables the SPIx/I2Sx DMA interface. - * - * @note This function can be called only after the SPI_Init() function has - * been called. - * @note When TI mode is selected, the control bits SSM, SSI, CPOL and CPHA - * are not taken into consideration and are configured by hardware - * respectively to the TI mode requirements. - * - * @param SPIx: where x can be 1, 2 or 3 - * @param NewState: new state of the selected SPI TI communication mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_TIModeCmd(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the TI mode for the selected SPI peripheral */ - SPIx->CR2 |= SPI_CR2_FRF; - } - else - { - /* Disable the TI mode for the selected SPI peripheral */ - SPIx->CR2 &= (uint16_t)~SPI_CR2_FRF; - } -} - -/** - * @brief Configures the full duplex mode for the I2Sx peripheral using its - * extension I2Sxext according to the specified parameters in the - * I2S_InitStruct. - * @param I2Sxext: where x can be 2 or 3 to select the I2S peripheral extension block. - * @param I2S_InitStruct: pointer to an I2S_InitTypeDef structure that - * contains the configuration information for the specified I2S peripheral - * extension. - * - * @note The structure pointed by I2S_InitStruct parameter should be the same - * used for the master I2S peripheral. In this case, if the master is - * configured as transmitter, the slave will be receiver and vice versa. - * Or you can force a different mode by modifying the field I2S_Mode to the - * value I2S_SlaveRx or I2S_SlaveTx indepedently of the master configuration. - * - * @note The I2S full duplex extension can be configured in slave mode only. - * - * @retval None - */ -void I2S_FullDuplexConfig(SPI_TypeDef* I2Sxext, I2S_InitTypeDef* I2S_InitStruct) -{ - uint16_t tmpreg = 0, tmp = 0; - - /* Check the I2S parameters */ - assert_param(IS_I2S_EXT_PERIPH(I2Sxext)); - assert_param(IS_I2S_MODE(I2S_InitStruct->I2S_Mode)); - assert_param(IS_I2S_STANDARD(I2S_InitStruct->I2S_Standard)); - assert_param(IS_I2S_DATA_FORMAT(I2S_InitStruct->I2S_DataFormat)); - assert_param(IS_I2S_CPOL(I2S_InitStruct->I2S_CPOL)); - -/*----------------------- SPIx I2SCFGR & I2SPR Configuration -----------------*/ - /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ - I2Sxext->I2SCFGR &= I2SCFGR_CLEAR_MASK; - I2Sxext->I2SPR = 0x0002; - - /* Get the I2SCFGR register value */ - tmpreg = I2Sxext->I2SCFGR; - - /* Get the mode to be configured for the extended I2S */ - if ((I2S_InitStruct->I2S_Mode == I2S_Mode_MasterTx) || (I2S_InitStruct->I2S_Mode == I2S_Mode_SlaveTx)) - { - tmp = I2S_Mode_SlaveRx; - } - else - { - if ((I2S_InitStruct->I2S_Mode == I2S_Mode_MasterRx) || (I2S_InitStruct->I2S_Mode == I2S_Mode_SlaveRx)) - { - tmp = I2S_Mode_SlaveTx; - } - } - - - /* Configure the I2S with the SPI_InitStruct values */ - tmpreg |= (uint16_t)((uint16_t)SPI_I2SCFGR_I2SMOD | (uint16_t)(tmp | \ - (uint16_t)(I2S_InitStruct->I2S_Standard | (uint16_t)(I2S_InitStruct->I2S_DataFormat | \ - (uint16_t)I2S_InitStruct->I2S_CPOL)))); - - /* Write to SPIx I2SCFGR */ - I2Sxext->I2SCFGR = tmpreg; -} - -/** - * @} - */ - -/** @defgroup SPI_Group2 Data transfers functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - Data transfers functions - =============================================================================== - - This section provides a set of functions allowing to manage the SPI data transfers - - In reception, data are received and then stored into an internal Rx buffer while - In transmission, data are first stored into an internal Tx buffer before being - transmitted. - - The read access of the SPI_DR register can be done using the SPI_I2S_ReceiveData() - function and returns the Rx buffered value. Whereas a write access to the SPI_DR - can be done using SPI_I2S_SendData() function and stores the written data into - Tx buffer. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the most recent received data by the SPIx/I2Sx peripheral. - * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 - * in SPI mode or 2 or 3 in I2S mode or I2Sxext for I2S full duplex mode. - * @retval The value of the received data. - */ -uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH_EXT(SPIx)); - - /* Return the data in the DR register */ - return SPIx->DR; -} - -/** - * @brief Transmits a Data through the SPIx/I2Sx peripheral. - * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 - * in SPI mode or 2 or 3 in I2S mode or I2Sxext for I2S full duplex mode. - * @param Data: Data to be transmitted. - * @retval None - */ -void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH_EXT(SPIx)); - - /* Write in the DR register the data to be sent */ - SPIx->DR = Data; -} - -/** - * @} - */ - -/** @defgroup SPI_Group3 Hardware CRC Calculation functions - * @brief Hardware CRC Calculation functions - * -@verbatim - =============================================================================== - Hardware CRC Calculation functions - =============================================================================== - - This section provides a set of functions allowing to manage the SPI CRC hardware - calculation - - SPI communication using CRC is possible through the following procedure: - 1. Program the Data direction, Polarity, Phase, First Data, Baud Rate Prescaler, - Slave Management, Peripheral Mode and CRC Polynomial values using the SPI_Init() - function. - 2. Enable the CRC calculation using the SPI_CalculateCRC() function. - 3. Enable the SPI using the SPI_Cmd() function - 4. Before writing the last data to the TX buffer, set the CRCNext bit using the - SPI_TransmitCRC() function to indicate that after transmission of the last - data, the CRC should be transmitted. - 5. After transmitting the last data, the SPI transmits the CRC. The SPI_CR1_CRCNEXT - bit is reset. The CRC is also received and compared against the SPI_RXCRCR - value. - If the value does not match, the SPI_FLAG_CRCERR flag is set and an interrupt - can be generated when the SPI_I2S_IT_ERR interrupt is enabled. - -@note It is advised not to read the calculated CRC values during the communication. - -@note When the SPI is in slave mode, be careful to enable CRC calculation only - when the clock is stable, that is, when the clock is in the steady state. - If not, a wrong CRC calculation may be done. In fact, the CRC is sensitive - to the SCK slave input clock as soon as CRCEN is set, and this, whatever - the value of the SPE bit. - -@note With high bitrate frequencies, be careful when transmitting the CRC. - As the number of used CPU cycles has to be as low as possible in the CRC - transfer phase, it is forbidden to call software functions in the CRC - transmission sequence to avoid errors in the last data and CRC reception. - In fact, CRCNEXT bit has to be written before the end of the transmission/reception - of the last data. - -@note For high bit rate frequencies, it is advised to use the DMA mode to avoid the - degradation of the SPI speed performance due to CPU accesses impacting the - SPI bandwidth. - -@note When the STM32F4xx is configured as slave and the NSS hardware mode is - used, the NSS pin needs to be kept low between the data phase and the CRC - phase. - -@note When the SPI is configured in slave mode with the CRC feature enabled, CRC - calculation takes place even if a high level is applied on the NSS pin. - This may happen for example in case of a multi-slave environment where the - communication master addresses slaves alternately. - -@note Between a slave de-selection (high level on NSS) and a new slave selection - (low level on NSS), the CRC value should be cleared on both master and slave - sides in order to resynchronize the master and slave for their respective - CRC calculation. - -@note To clear the CRC, follow the procedure below: - 1. Disable SPI using the SPI_Cmd() function - 2. Disable the CRC calculation using the SPI_CalculateCRC() function. - 3. Enable the CRC calculation using the SPI_CalculateCRC() function. - 4. Enable SPI using the SPI_Cmd() function. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the CRC value calculation of the transferred bytes. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param NewState: new state of the SPIx CRC value calculation. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the selected SPI CRC calculation */ - SPIx->CR1 |= SPI_CR1_CRCEN; - } - else - { - /* Disable the selected SPI CRC calculation */ - SPIx->CR1 &= (uint16_t)~((uint16_t)SPI_CR1_CRCEN); - } -} - -/** - * @brief Transmit the SPIx CRC value. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @retval None - */ -void SPI_TransmitCRC(SPI_TypeDef* SPIx) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - /* Enable the selected SPI CRC transmission */ - SPIx->CR1 |= SPI_CR1_CRCNEXT; -} - -/** - * @brief Returns the transmit or the receive CRC register value for the specified SPI. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @param SPI_CRC: specifies the CRC register to be read. - * This parameter can be one of the following values: - * @arg SPI_CRC_Tx: Selects Tx CRC register - * @arg SPI_CRC_Rx: Selects Rx CRC register - * @retval The selected CRC register value.. - */ -uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC) -{ - uint16_t crcreg = 0; - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - assert_param(IS_SPI_CRC(SPI_CRC)); - if (SPI_CRC != SPI_CRC_Rx) - { - /* Get the Tx CRC register */ - crcreg = SPIx->TXCRCR; - } - else - { - /* Get the Rx CRC register */ - crcreg = SPIx->RXCRCR; - } - /* Return the selected CRC register */ - return crcreg; -} - -/** - * @brief Returns the CRC Polynomial register value for the specified SPI. - * @param SPIx: where x can be 1, 2 or 3 to select the SPI peripheral. - * @retval The CRC Polynomial register value. - */ -uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH(SPIx)); - - /* Return the CRC polynomial register */ - return SPIx->CRCPR; -} - -/** - * @} - */ - -/** @defgroup SPI_Group4 DMA transfers management functions - * @brief DMA transfers management functions - * -@verbatim - =============================================================================== - DMA transfers management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the SPIx/I2Sx DMA interface. - * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 - * in SPI mode or 2 or 3 in I2S mode or I2Sxext for I2S full duplex mode. - * @param SPI_I2S_DMAReq: specifies the SPI DMA transfer request to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg SPI_I2S_DMAReq_Tx: Tx buffer DMA transfer request - * @arg SPI_I2S_DMAReq_Rx: Rx buffer DMA transfer request - * @param NewState: new state of the selected SPI DMA transfer request. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH_EXT(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_SPI_I2S_DMAREQ(SPI_I2S_DMAReq)); - - if (NewState != DISABLE) - { - /* Enable the selected SPI DMA requests */ - SPIx->CR2 |= SPI_I2S_DMAReq; - } - else - { - /* Disable the selected SPI DMA requests */ - SPIx->CR2 &= (uint16_t)~SPI_I2S_DMAReq; - } -} - -/** - * @} - */ - -/** @defgroup SPI_Group5 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - - This section provides a set of functions allowing to configure the SPI Interrupts - sources and check or clear the flags or pending bits status. - The user should identify which mode will be used in his application to manage - the communication: Polling mode, Interrupt mode or DMA mode. - - Polling Mode - ============= - In Polling Mode, the SPI/I2S communication can be managed by 9 flags: - 1. SPI_I2S_FLAG_TXE : to indicate the status of the transmit buffer register - 2. SPI_I2S_FLAG_RXNE : to indicate the status of the receive buffer register - 3. SPI_I2S_FLAG_BSY : to indicate the state of the communication layer of the SPI. - 4. SPI_FLAG_CRCERR : to indicate if a CRC Calculation error occur - 5. SPI_FLAG_MODF : to indicate if a Mode Fault error occur - 6. SPI_I2S_FLAG_OVR : to indicate if an Overrun error occur - 7. I2S_FLAG_TIFRFE: to indicate a Frame Format error occurs. - 8. I2S_FLAG_UDR: to indicate an Underrun error occurs. - 9. I2S_FLAG_CHSIDE: to indicate Channel Side. - -@note Do not use the BSY flag to handle each data transmission or reception. It is - better to use the TXE and RXNE flags instead. - - In this Mode it is advised to use the following functions: - - FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); - - void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); - - Interrupt Mode - =============== - In Interrupt Mode, the SPI communication can be managed by 3 interrupt sources - and 7 pending bits: - Pending Bits: - ------------- - 1. SPI_I2S_IT_TXE : to indicate the status of the transmit buffer register - 2. SPI_I2S_IT_RXNE : to indicate the status of the receive buffer register - 3. SPI_IT_CRCERR : to indicate if a CRC Calculation error occur (available in SPI mode only) - 4. SPI_IT_MODF : to indicate if a Mode Fault error occur (available in SPI mode only) - 5. SPI_I2S_IT_OVR : to indicate if an Overrun error occur - 6. I2S_IT_UDR : to indicate an Underrun Error occurs (available in I2S mode only). - 7. I2S_FLAG_TIFRFE : to indicate a Frame Format error occurs (available in TI mode only). - - Interrupt Source: - ----------------- - 1. SPI_I2S_IT_TXE: specifies the interrupt source for the Tx buffer empty - interrupt. - 2. SPI_I2S_IT_RXNE : specifies the interrupt source for the Rx buffer not - empty interrupt. - 3. SPI_I2S_IT_ERR : specifies the interrupt source for the errors interrupt. - - In this Mode it is advised to use the following functions: - - void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); - - ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); - - void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); - - DMA Mode - ======== - In DMA Mode, the SPI communication can be managed by 2 DMA Channel requests: - 1. SPI_I2S_DMAReq_Tx: specifies the Tx buffer DMA transfer request - 2. SPI_I2S_DMAReq_Rx: specifies the Rx buffer DMA transfer request - - In this Mode it is advised to use the following function: - - void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState); - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified SPI/I2S interrupts. - * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 - * in SPI mode or 2 or 3 in I2S mode or I2Sxext for I2S full duplex mode. - * @param SPI_I2S_IT: specifies the SPI interrupt source to be enabled or disabled. - * This parameter can be one of the following values: - * @arg SPI_I2S_IT_TXE: Tx buffer empty interrupt mask - * @arg SPI_I2S_IT_RXNE: Rx buffer not empty interrupt mask - * @arg SPI_I2S_IT_ERR: Error interrupt mask - * @param NewState: new state of the specified SPI interrupt. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState) -{ - uint16_t itpos = 0, itmask = 0 ; - - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH_EXT(SPIx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - assert_param(IS_SPI_I2S_CONFIG_IT(SPI_I2S_IT)); - - /* Get the SPI IT index */ - itpos = SPI_I2S_IT >> 4; - - /* Set the IT mask */ - itmask = (uint16_t)1 << (uint16_t)itpos; - - if (NewState != DISABLE) - { - /* Enable the selected SPI interrupt */ - SPIx->CR2 |= itmask; - } - else - { - /* Disable the selected SPI interrupt */ - SPIx->CR2 &= (uint16_t)~itmask; - } -} - -/** - * @brief Checks whether the specified SPIx/I2Sx flag is set or not. - * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 - * in SPI mode or 2 or 3 in I2S mode or I2Sxext for I2S full duplex mode. - * @param SPI_I2S_FLAG: specifies the SPI flag to check. - * This parameter can be one of the following values: - * @arg SPI_I2S_FLAG_TXE: Transmit buffer empty flag. - * @arg SPI_I2S_FLAG_RXNE: Receive buffer not empty flag. - * @arg SPI_I2S_FLAG_BSY: Busy flag. - * @arg SPI_I2S_FLAG_OVR: Overrun flag. - * @arg SPI_FLAG_MODF: Mode Fault flag. - * @arg SPI_FLAG_CRCERR: CRC Error flag. - * @arg SPI_I2S_FLAG_TIFRFE: Format Error. - * @arg I2S_FLAG_UDR: Underrun Error flag. - * @arg I2S_FLAG_CHSIDE: Channel Side flag. - * @retval The new state of SPI_I2S_FLAG (SET or RESET). - */ -FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH_EXT(SPIx)); - assert_param(IS_SPI_I2S_GET_FLAG(SPI_I2S_FLAG)); - - /* Check the status of the specified SPI flag */ - if ((SPIx->SR & SPI_I2S_FLAG) != (uint16_t)RESET) - { - /* SPI_I2S_FLAG is set */ - bitstatus = SET; - } - else - { - /* SPI_I2S_FLAG is reset */ - bitstatus = RESET; - } - /* Return the SPI_I2S_FLAG status */ - return bitstatus; -} - -/** - * @brief Clears the SPIx CRC Error (CRCERR) flag. - * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 - * in SPI mode or 2 or 3 in I2S mode or I2Sxext for I2S full duplex mode. - * @param SPI_I2S_FLAG: specifies the SPI flag to clear. - * This function clears only CRCERR flag. - * @arg SPI_FLAG_CRCERR: CRC Error flag. - * - * @note OVR (OverRun error) flag is cleared by software sequence: a read - * operation to SPI_DR register (SPI_I2S_ReceiveData()) followed by a read - * operation to SPI_SR register (SPI_I2S_GetFlagStatus()). - * @note UDR (UnderRun error) flag is cleared by a read operation to - * SPI_SR register (SPI_I2S_GetFlagStatus()). - * @note MODF (Mode Fault) flag is cleared by software sequence: a read/write - * operation to SPI_SR register (SPI_I2S_GetFlagStatus()) followed by a - * write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI). - * - * @retval None - */ -void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG) -{ - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH_EXT(SPIx)); - assert_param(IS_SPI_I2S_CLEAR_FLAG(SPI_I2S_FLAG)); - - /* Clear the selected SPI CRC Error (CRCERR) flag */ - SPIx->SR = (uint16_t)~SPI_I2S_FLAG; -} - -/** - * @brief Checks whether the specified SPIx/I2Sx interrupt has occurred or not. - * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 - * in SPI mode or 2 or 3 in I2S mode or I2Sxext for I2S full duplex mode. - * @param SPI_I2S_IT: specifies the SPI interrupt source to check. - * This parameter can be one of the following values: - * @arg SPI_I2S_IT_TXE: Transmit buffer empty interrupt. - * @arg SPI_I2S_IT_RXNE: Receive buffer not empty interrupt. - * @arg SPI_I2S_IT_OVR: Overrun interrupt. - * @arg SPI_IT_MODF: Mode Fault interrupt. - * @arg SPI_IT_CRCERR: CRC Error interrupt. - * @arg I2S_IT_UDR: Underrun interrupt. - * @arg SPI_I2S_IT_TIFRFE: Format Error interrupt. - * @retval The new state of SPI_I2S_IT (SET or RESET). - */ -ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT) -{ - ITStatus bitstatus = RESET; - uint16_t itpos = 0, itmask = 0, enablestatus = 0; - - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH_EXT(SPIx)); - assert_param(IS_SPI_I2S_GET_IT(SPI_I2S_IT)); - - /* Get the SPI_I2S_IT index */ - itpos = 0x01 << (SPI_I2S_IT & 0x0F); - - /* Get the SPI_I2S_IT IT mask */ - itmask = SPI_I2S_IT >> 4; - - /* Set the IT mask */ - itmask = 0x01 << itmask; - - /* Get the SPI_I2S_IT enable bit status */ - enablestatus = (SPIx->CR2 & itmask) ; - - /* Check the status of the specified SPI interrupt */ - if (((SPIx->SR & itpos) != (uint16_t)RESET) && enablestatus) - { - /* SPI_I2S_IT is set */ - bitstatus = SET; - } - else - { - /* SPI_I2S_IT is reset */ - bitstatus = RESET; - } - /* Return the SPI_I2S_IT status */ - return bitstatus; -} - -/** - * @brief Clears the SPIx CRC Error (CRCERR) interrupt pending bit. - * @param SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3 - * in SPI mode or 2 or 3 in I2S mode or I2Sxext for I2S full duplex mode. - * @param SPI_I2S_IT: specifies the SPI interrupt pending bit to clear. - * This function clears only CRCERR interrupt pending bit. - * @arg SPI_IT_CRCERR: CRC Error interrupt. - * - * @note OVR (OverRun Error) interrupt pending bit is cleared by software - * sequence: a read operation to SPI_DR register (SPI_I2S_ReceiveData()) - * followed by a read operation to SPI_SR register (SPI_I2S_GetITStatus()). - * @note UDR (UnderRun Error) interrupt pending bit is cleared by a read - * operation to SPI_SR register (SPI_I2S_GetITStatus()). - * @note MODF (Mode Fault) interrupt pending bit is cleared by software sequence: - * a read/write operation to SPI_SR register (SPI_I2S_GetITStatus()) - * followed by a write operation to SPI_CR1 register (SPI_Cmd() to enable - * the SPI). - * @retval None - */ -void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT) -{ - uint16_t itpos = 0; - /* Check the parameters */ - assert_param(IS_SPI_ALL_PERIPH_EXT(SPIx)); - assert_param(IS_SPI_I2S_CLEAR_IT(SPI_I2S_IT)); - - /* Get the SPI_I2S IT index */ - itpos = 0x01 << (SPI_I2S_IT & 0x0F); - - /* Clear the selected SPI CRC Error (CRCERR) interrupt pending bit */ - SPIx->SR = (uint16_t)~itpos; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_spi.h b/car_hw/src/lib/stdperiph/stm32f4xx_spi.h deleted file mode 100644 index 095b63a1f2e..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_spi.h +++ /dev/null @@ -1,537 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_spi.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the SPI - * firmware library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_SPI_H -#define __STM32F4xx_SPI_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup SPI - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief SPI Init structure definition - */ - -typedef struct -{ - uint16_t SPI_Direction; /*!< Specifies the SPI unidirectional or bidirectional data mode. - This parameter can be a value of @ref SPI_data_direction */ - - uint16_t SPI_Mode; /*!< Specifies the SPI operating mode. - This parameter can be a value of @ref SPI_mode */ - - uint16_t SPI_DataSize; /*!< Specifies the SPI data size. - This parameter can be a value of @ref SPI_data_size */ - - uint16_t SPI_CPOL; /*!< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_Clock_Polarity */ - - uint16_t SPI_CPHA; /*!< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_Clock_Phase */ - - uint16_t SPI_NSS; /*!< Specifies whether the NSS signal is managed by - hardware (NSS pin) or by software using the SSI bit. - This parameter can be a value of @ref SPI_Slave_Select_management */ - - uint16_t SPI_BaudRatePrescaler; /*!< Specifies the Baud Rate prescaler value which will be - used to configure the transmit and receive SCK clock. - This parameter can be a value of @ref SPI_BaudRate_Prescaler - @note The communication clock is derived from the master - clock. The slave clock does not need to be set. */ - - uint16_t SPI_FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit. - This parameter can be a value of @ref SPI_MSB_LSB_transmission */ - - uint16_t SPI_CRCPolynomial; /*!< Specifies the polynomial used for the CRC calculation. */ -}SPI_InitTypeDef; - -/** - * @brief I2S Init structure definition - */ - -typedef struct -{ - - uint16_t I2S_Mode; /*!< Specifies the I2S operating mode. - This parameter can be a value of @ref I2S_Mode */ - - uint16_t I2S_Standard; /*!< Specifies the standard used for the I2S communication. - This parameter can be a value of @ref I2S_Standard */ - - uint16_t I2S_DataFormat; /*!< Specifies the data format for the I2S communication. - This parameter can be a value of @ref I2S_Data_Format */ - - uint16_t I2S_MCLKOutput; /*!< Specifies whether the I2S MCLK output is enabled or not. - This parameter can be a value of @ref I2S_MCLK_Output */ - - uint32_t I2S_AudioFreq; /*!< Specifies the frequency selected for the I2S communication. - This parameter can be a value of @ref I2S_Audio_Frequency */ - - uint16_t I2S_CPOL; /*!< Specifies the idle state of the I2S clock. - This parameter can be a value of @ref I2S_Clock_Polarity */ -}I2S_InitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup SPI_Exported_Constants - * @{ - */ - -#define IS_SPI_ALL_PERIPH(PERIPH) (((PERIPH) == SPI1) || \ - ((PERIPH) == SPI2) || \ - ((PERIPH) == SPI3)) - -#define IS_SPI_ALL_PERIPH_EXT(PERIPH) (((PERIPH) == SPI1) || \ - ((PERIPH) == SPI2) || \ - ((PERIPH) == SPI3) || \ - ((PERIPH) == I2S2ext) || \ - ((PERIPH) == I2S3ext)) - -#define IS_SPI_23_PERIPH(PERIPH) (((PERIPH) == SPI2) || \ - ((PERIPH) == SPI3)) - -#define IS_SPI_23_PERIPH_EXT(PERIPH) (((PERIPH) == SPI2) || \ - ((PERIPH) == SPI3) || \ - ((PERIPH) == I2S2ext) || \ - ((PERIPH) == I2S3ext)) - -#define IS_I2S_EXT_PERIPH(PERIPH) (((PERIPH) == I2S2ext) || \ - ((PERIPH) == I2S3ext)) - - -/** @defgroup SPI_data_direction - * @{ - */ - -#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000) -#define SPI_Direction_2Lines_RxOnly ((uint16_t)0x0400) -#define SPI_Direction_1Line_Rx ((uint16_t)0x8000) -#define SPI_Direction_1Line_Tx ((uint16_t)0xC000) -#define IS_SPI_DIRECTION_MODE(MODE) (((MODE) == SPI_Direction_2Lines_FullDuplex) || \ - ((MODE) == SPI_Direction_2Lines_RxOnly) || \ - ((MODE) == SPI_Direction_1Line_Rx) || \ - ((MODE) == SPI_Direction_1Line_Tx)) -/** - * @} - */ - -/** @defgroup SPI_mode - * @{ - */ - -#define SPI_Mode_Master ((uint16_t)0x0104) -#define SPI_Mode_Slave ((uint16_t)0x0000) -#define IS_SPI_MODE(MODE) (((MODE) == SPI_Mode_Master) || \ - ((MODE) == SPI_Mode_Slave)) -/** - * @} - */ - -/** @defgroup SPI_data_size - * @{ - */ - -#define SPI_DataSize_16b ((uint16_t)0x0800) -#define SPI_DataSize_8b ((uint16_t)0x0000) -#define IS_SPI_DATASIZE(DATASIZE) (((DATASIZE) == SPI_DataSize_16b) || \ - ((DATASIZE) == SPI_DataSize_8b)) -/** - * @} - */ - -/** @defgroup SPI_Clock_Polarity - * @{ - */ - -#define SPI_CPOL_Low ((uint16_t)0x0000) -#define SPI_CPOL_High ((uint16_t)0x0002) -#define IS_SPI_CPOL(CPOL) (((CPOL) == SPI_CPOL_Low) || \ - ((CPOL) == SPI_CPOL_High)) -/** - * @} - */ - -/** @defgroup SPI_Clock_Phase - * @{ - */ - -#define SPI_CPHA_1Edge ((uint16_t)0x0000) -#define SPI_CPHA_2Edge ((uint16_t)0x0001) -#define IS_SPI_CPHA(CPHA) (((CPHA) == SPI_CPHA_1Edge) || \ - ((CPHA) == SPI_CPHA_2Edge)) -/** - * @} - */ - -/** @defgroup SPI_Slave_Select_management - * @{ - */ - -#define SPI_NSS_Soft ((uint16_t)0x0200) -#define SPI_NSS_Hard ((uint16_t)0x0000) -#define IS_SPI_NSS(NSS) (((NSS) == SPI_NSS_Soft) || \ - ((NSS) == SPI_NSS_Hard)) -/** - * @} - */ - -/** @defgroup SPI_BaudRate_Prescaler - * @{ - */ - -#define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000) -#define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008) -#define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010) -#define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018) -#define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020) -#define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028) -#define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030) -#define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038) -#define IS_SPI_BAUDRATE_PRESCALER(PRESCALER) (((PRESCALER) == SPI_BaudRatePrescaler_2) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_4) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_8) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_16) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_32) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_64) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_128) || \ - ((PRESCALER) == SPI_BaudRatePrescaler_256)) -/** - * @} - */ - -/** @defgroup SPI_MSB_LSB_transmission - * @{ - */ - -#define SPI_FirstBit_MSB ((uint16_t)0x0000) -#define SPI_FirstBit_LSB ((uint16_t)0x0080) -#define IS_SPI_FIRST_BIT(BIT) (((BIT) == SPI_FirstBit_MSB) || \ - ((BIT) == SPI_FirstBit_LSB)) -/** - * @} - */ - -/** @defgroup SPI_I2S_Mode - * @{ - */ - -#define I2S_Mode_SlaveTx ((uint16_t)0x0000) -#define I2S_Mode_SlaveRx ((uint16_t)0x0100) -#define I2S_Mode_MasterTx ((uint16_t)0x0200) -#define I2S_Mode_MasterRx ((uint16_t)0x0300) -#define IS_I2S_MODE(MODE) (((MODE) == I2S_Mode_SlaveTx) || \ - ((MODE) == I2S_Mode_SlaveRx) || \ - ((MODE) == I2S_Mode_MasterTx)|| \ - ((MODE) == I2S_Mode_MasterRx)) -/** - * @} - */ - - -/** @defgroup SPI_I2S_Standard - * @{ - */ - -#define I2S_Standard_Phillips ((uint16_t)0x0000) -#define I2S_Standard_MSB ((uint16_t)0x0010) -#define I2S_Standard_LSB ((uint16_t)0x0020) -#define I2S_Standard_PCMShort ((uint16_t)0x0030) -#define I2S_Standard_PCMLong ((uint16_t)0x00B0) -#define IS_I2S_STANDARD(STANDARD) (((STANDARD) == I2S_Standard_Phillips) || \ - ((STANDARD) == I2S_Standard_MSB) || \ - ((STANDARD) == I2S_Standard_LSB) || \ - ((STANDARD) == I2S_Standard_PCMShort) || \ - ((STANDARD) == I2S_Standard_PCMLong)) -/** - * @} - */ - -/** @defgroup SPI_I2S_Data_Format - * @{ - */ - -#define I2S_DataFormat_16b ((uint16_t)0x0000) -#define I2S_DataFormat_16bextended ((uint16_t)0x0001) -#define I2S_DataFormat_24b ((uint16_t)0x0003) -#define I2S_DataFormat_32b ((uint16_t)0x0005) -#define IS_I2S_DATA_FORMAT(FORMAT) (((FORMAT) == I2S_DataFormat_16b) || \ - ((FORMAT) == I2S_DataFormat_16bextended) || \ - ((FORMAT) == I2S_DataFormat_24b) || \ - ((FORMAT) == I2S_DataFormat_32b)) -/** - * @} - */ - -/** @defgroup SPI_I2S_MCLK_Output - * @{ - */ - -#define I2S_MCLKOutput_Enable ((uint16_t)0x0200) -#define I2S_MCLKOutput_Disable ((uint16_t)0x0000) -#define IS_I2S_MCLK_OUTPUT(OUTPUT) (((OUTPUT) == I2S_MCLKOutput_Enable) || \ - ((OUTPUT) == I2S_MCLKOutput_Disable)) -/** - * @} - */ - -/** @defgroup SPI_I2S_Audio_Frequency - * @{ - */ - -#define I2S_AudioFreq_192k ((uint32_t)192000) -#define I2S_AudioFreq_96k ((uint32_t)96000) -#define I2S_AudioFreq_48k ((uint32_t)48000) -#define I2S_AudioFreq_44k ((uint32_t)44100) -#define I2S_AudioFreq_32k ((uint32_t)32000) -#define I2S_AudioFreq_22k ((uint32_t)22050) -#define I2S_AudioFreq_16k ((uint32_t)16000) -#define I2S_AudioFreq_11k ((uint32_t)11025) -#define I2S_AudioFreq_8k ((uint32_t)8000) -#define I2S_AudioFreq_Default ((uint32_t)2) - -#define IS_I2S_AUDIO_FREQ(FREQ) ((((FREQ) >= I2S_AudioFreq_8k) && \ - ((FREQ) <= I2S_AudioFreq_192k)) || \ - ((FREQ) == I2S_AudioFreq_Default)) -/** - * @} - */ - -/** @defgroup SPI_I2S_Clock_Polarity - * @{ - */ - -#define I2S_CPOL_Low ((uint16_t)0x0000) -#define I2S_CPOL_High ((uint16_t)0x0008) -#define IS_I2S_CPOL(CPOL) (((CPOL) == I2S_CPOL_Low) || \ - ((CPOL) == I2S_CPOL_High)) -/** - * @} - */ - -/** @defgroup SPI_I2S_DMA_transfer_requests - * @{ - */ - -#define SPI_I2S_DMAReq_Tx ((uint16_t)0x0002) -#define SPI_I2S_DMAReq_Rx ((uint16_t)0x0001) -#define IS_SPI_I2S_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFFFC) == 0x00) && ((DMAREQ) != 0x00)) -/** - * @} - */ - -/** @defgroup SPI_NSS_internal_software_management - * @{ - */ - -#define SPI_NSSInternalSoft_Set ((uint16_t)0x0100) -#define SPI_NSSInternalSoft_Reset ((uint16_t)0xFEFF) -#define IS_SPI_NSS_INTERNAL(INTERNAL) (((INTERNAL) == SPI_NSSInternalSoft_Set) || \ - ((INTERNAL) == SPI_NSSInternalSoft_Reset)) -/** - * @} - */ - -/** @defgroup SPI_CRC_Transmit_Receive - * @{ - */ - -#define SPI_CRC_Tx ((uint8_t)0x00) -#define SPI_CRC_Rx ((uint8_t)0x01) -#define IS_SPI_CRC(CRC) (((CRC) == SPI_CRC_Tx) || ((CRC) == SPI_CRC_Rx)) -/** - * @} - */ - -/** @defgroup SPI_direction_transmit_receive - * @{ - */ - -#define SPI_Direction_Rx ((uint16_t)0xBFFF) -#define SPI_Direction_Tx ((uint16_t)0x4000) -#define IS_SPI_DIRECTION(DIRECTION) (((DIRECTION) == SPI_Direction_Rx) || \ - ((DIRECTION) == SPI_Direction_Tx)) -/** - * @} - */ - -/** @defgroup SPI_I2S_interrupts_definition - * @{ - */ - -#define SPI_I2S_IT_TXE ((uint8_t)0x71) -#define SPI_I2S_IT_RXNE ((uint8_t)0x60) -#define SPI_I2S_IT_ERR ((uint8_t)0x50) -#define I2S_IT_UDR ((uint8_t)0x53) -#define SPI_I2S_IT_TIFRFE ((uint8_t)0x58) - -#define IS_SPI_I2S_CONFIG_IT(IT) (((IT) == SPI_I2S_IT_TXE) || \ - ((IT) == SPI_I2S_IT_RXNE) || \ - ((IT) == SPI_I2S_IT_ERR)) - -#define SPI_I2S_IT_OVR ((uint8_t)0x56) -#define SPI_IT_MODF ((uint8_t)0x55) -#define SPI_IT_CRCERR ((uint8_t)0x54) - -#define IS_SPI_I2S_CLEAR_IT(IT) (((IT) == SPI_IT_CRCERR)) - -#define IS_SPI_I2S_GET_IT(IT) (((IT) == SPI_I2S_IT_RXNE)|| ((IT) == SPI_I2S_IT_TXE) || \ - ((IT) == SPI_IT_CRCERR) || ((IT) == SPI_IT_MODF) || \ - ((IT) == SPI_I2S_IT_OVR) || ((IT) == I2S_IT_UDR) ||\ - ((IT) == SPI_I2S_IT_TIFRFE)) -/** - * @} - */ - -/** @defgroup SPI_I2S_flags_definition - * @{ - */ - -#define SPI_I2S_FLAG_RXNE ((uint16_t)0x0001) -#define SPI_I2S_FLAG_TXE ((uint16_t)0x0002) -#define I2S_FLAG_CHSIDE ((uint16_t)0x0004) -#define I2S_FLAG_UDR ((uint16_t)0x0008) -#define SPI_FLAG_CRCERR ((uint16_t)0x0010) -#define SPI_FLAG_MODF ((uint16_t)0x0020) -#define SPI_I2S_FLAG_OVR ((uint16_t)0x0040) -#define SPI_I2S_FLAG_BSY ((uint16_t)0x0080) -#define SPI_I2S_FLAG_TIFRFE ((uint16_t)0x0100) - -#define IS_SPI_I2S_CLEAR_FLAG(FLAG) (((FLAG) == SPI_FLAG_CRCERR)) -#define IS_SPI_I2S_GET_FLAG(FLAG) (((FLAG) == SPI_I2S_FLAG_BSY) || ((FLAG) == SPI_I2S_FLAG_OVR) || \ - ((FLAG) == SPI_FLAG_MODF) || ((FLAG) == SPI_FLAG_CRCERR) || \ - ((FLAG) == I2S_FLAG_UDR) || ((FLAG) == I2S_FLAG_CHSIDE) || \ - ((FLAG) == SPI_I2S_FLAG_TXE) || ((FLAG) == SPI_I2S_FLAG_RXNE)|| \ - ((FLAG) == SPI_I2S_FLAG_TIFRFE)) -/** - * @} - */ - -/** @defgroup SPI_CRC_polynomial - * @{ - */ - -#define IS_SPI_CRC_POLYNOMIAL(POLYNOMIAL) ((POLYNOMIAL) >= 0x1) -/** - * @} - */ - -/** @defgroup SPI_I2S_Legacy - * @{ - */ - -#define SPI_DMAReq_Tx SPI_I2S_DMAReq_Tx -#define SPI_DMAReq_Rx SPI_I2S_DMAReq_Rx -#define SPI_IT_TXE SPI_I2S_IT_TXE -#define SPI_IT_RXNE SPI_I2S_IT_RXNE -#define SPI_IT_ERR SPI_I2S_IT_ERR -#define SPI_IT_OVR SPI_I2S_IT_OVR -#define SPI_FLAG_RXNE SPI_I2S_FLAG_RXNE -#define SPI_FLAG_TXE SPI_I2S_FLAG_TXE -#define SPI_FLAG_OVR SPI_I2S_FLAG_OVR -#define SPI_FLAG_BSY SPI_I2S_FLAG_BSY -#define SPI_DeInit SPI_I2S_DeInit -#define SPI_ITConfig SPI_I2S_ITConfig -#define SPI_DMACmd SPI_I2S_DMACmd -#define SPI_SendData SPI_I2S_SendData -#define SPI_ReceiveData SPI_I2S_ReceiveData -#define SPI_GetFlagStatus SPI_I2S_GetFlagStatus -#define SPI_ClearFlag SPI_I2S_ClearFlag -#define SPI_GetITStatus SPI_I2S_GetITStatus -#define SPI_ClearITPendingBit SPI_I2S_ClearITPendingBit -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the SPI configuration to the default reset state *****/ -void SPI_I2S_DeInit(SPI_TypeDef* SPIx); - -/* Initialization and Configuration functions *********************************/ -void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct); -void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct); -void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct); -void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct); -void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); -void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); -void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize); -void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction); -void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft); -void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState); -void SPI_TIModeCmd(SPI_TypeDef* SPIx, FunctionalState NewState); - -void I2S_FullDuplexConfig(SPI_TypeDef* I2Sxext, I2S_InitTypeDef* I2S_InitStruct); - -/* Data transfers functions ***************************************************/ -void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); -uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); - -/* Hardware CRC Calculation functions *****************************************/ -void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState); -void SPI_TransmitCRC(SPI_TypeDef* SPIx); -uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC); -uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx); - -/* DMA transfers management functions *****************************************/ -void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState); - -/* Interrupts and flags management functions **********************************/ -void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); -FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); -void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); -ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); -void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_SPI_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_syscfg.c b/car_hw/src/lib/stdperiph/stm32f4xx_syscfg.c deleted file mode 100644 index 1773a0e0279..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_syscfg.c +++ /dev/null @@ -1,198 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_syscfg.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the SYSCFG peripheral. - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - * - * This driver provides functions for: - * - * 1. Remapping the memory accessible in the code area using SYSCFG_MemoryRemapConfig() - * - * 2. Manage the EXTI lines connection to the GPIOs using SYSCFG_EXTILineConfig() - * - * 3. Select the ETHERNET media interface (RMII/RII) using SYSCFG_ETH_MediaInterfaceConfig() - * - * @note SYSCFG APB clock must be enabled to get write access to SYSCFG registers, - * using RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_syscfg.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup SYSCFG - * @brief SYSCFG driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* ------------ RCC registers bit address in the alias region ----------- */ -#define SYSCFG_OFFSET (SYSCFG_BASE - PERIPH_BASE) -/* --- PMC Register ---*/ -/* Alias word address of MII_RMII_SEL bit */ -#define PMC_OFFSET (SYSCFG_OFFSET + 0x04) -#define MII_RMII_SEL_BitNumber ((uint8_t)0x17) -#define PMC_MII_RMII_SEL_BB (PERIPH_BB_BASE + (PMC_OFFSET * 32) + (MII_RMII_SEL_BitNumber * 4)) - -/* --- CMPCR Register ---*/ -/* Alias word address of CMP_PD bit */ -#define CMPCR_OFFSET (SYSCFG_OFFSET + 0x20) -#define CMP_PD_BitNumber ((uint8_t)0x00) -#define CMPCR_CMP_PD_BB (PERIPH_BB_BASE + (CMPCR_OFFSET * 32) + (CMP_PD_BitNumber * 4)) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup SYSCFG_Private_Functions - * @{ - */ - -/** - * @brief Deinitializes the Alternate Functions (remap and EXTI configuration) - * registers to their default reset values. - * @param None - * @retval None - */ -void SYSCFG_DeInit(void) -{ - RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, DISABLE); -} - -/** - * @brief Changes the mapping of the specified pin. - * @param SYSCFG_Memory: selects the memory remapping. - * This parameter can be one of the following values: - * @arg SYSCFG_MemoryRemap_Flash: Main Flash memory mapped at 0x00000000 - * @arg SYSCFG_MemoryRemap_SystemFlash: System Flash memory mapped at 0x00000000 - * @arg SYSCFG_MemoryRemap_FSMC: FSMC (Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 - * @arg SYSCFG_MemoryRemap_SRAM: Embedded SRAM (112kB) mapped at 0x00000000 - * @retval None - */ -void SYSCFG_MemoryRemapConfig(uint8_t SYSCFG_MemoryRemap) -{ - /* Check the parameters */ - assert_param(IS_SYSCFG_MEMORY_REMAP_CONFING(SYSCFG_MemoryRemap)); - - SYSCFG->MEMRMP = SYSCFG_MemoryRemap; -} - -/** - * @brief Selects the GPIO pin used as EXTI Line. - * @param EXTI_PortSourceGPIOx : selects the GPIO port to be used as source for - * EXTI lines where x can be (A..I). - * @param EXTI_PinSourcex: specifies the EXTI line to be configured. - * This parameter can be EXTI_PinSourcex where x can be (0..15, except - * for EXTI_PortSourceGPIOI x can be (0..11). - * @retval None - */ -void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex) -{ - uint32_t tmp = 0x00; - - /* Check the parameters */ - assert_param(IS_EXTI_PORT_SOURCE(EXTI_PortSourceGPIOx)); - assert_param(IS_EXTI_PIN_SOURCE(EXTI_PinSourcex)); - - tmp = ((uint32_t)0x0F) << (0x04 * (EXTI_PinSourcex & (uint8_t)0x03)); - SYSCFG->EXTICR[EXTI_PinSourcex >> 0x02] &= ~tmp; - SYSCFG->EXTICR[EXTI_PinSourcex >> 0x02] |= (((uint32_t)EXTI_PortSourceGPIOx) << (0x04 * (EXTI_PinSourcex & (uint8_t)0x03))); -} - -/** - * @brief Selects the ETHERNET media interface - * @param SYSCFG_ETH_MediaInterface: specifies the Media Interface mode. - * This parameter can be one of the following values: - * @arg SYSCFG_ETH_MediaInterface_MII: MII mode selected - * @arg SYSCFG_ETH_MediaInterface_RMII: RMII mode selected - * @retval None - */ -void SYSCFG_ETH_MediaInterfaceConfig(uint32_t SYSCFG_ETH_MediaInterface) -{ - assert_param(IS_SYSCFG_ETH_MEDIA_INTERFACE(SYSCFG_ETH_MediaInterface)); - /* Configure MII_RMII selection bit */ - *(__IO uint32_t *) PMC_MII_RMII_SEL_BB = SYSCFG_ETH_MediaInterface; -} - -/** - * @brief Enables or disables the I/O Compensation Cell. - * @note The I/O compensation cell can be used only when the device supply - * voltage ranges from 2.4 to 3.6 V. - * @param NewState: new state of the I/O Compensation Cell. - * This parameter can be one of the following values: - * @arg ENABLE: I/O compensation cell enabled - * @arg DISABLE: I/O compensation cell power-down mode - * @retval None - */ -void SYSCFG_CompensationCellCmd(FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - *(__IO uint32_t *) CMPCR_CMP_PD_BB = (uint32_t)NewState; -} - -/** - * @brief Checks whether the I/O Compensation Cell ready flag is set or not. - * @param None - * @retval The new state of the I/O Compensation Cell ready flag (SET or RESET) - */ -FlagStatus SYSCFG_GetCompensationCellStatus(void) -{ - FlagStatus bitstatus = RESET; - - if ((SYSCFG->CMPCR & SYSCFG_CMPCR_READY ) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_syscfg.h b/car_hw/src/lib/stdperiph/stm32f4xx_syscfg.h deleted file mode 100644 index 98eed9b70de..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_syscfg.h +++ /dev/null @@ -1,173 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_syscfg.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the SYSCFG firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_SYSCFG_H -#define __STM32F4xx_SYSCFG_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup SYSCFG - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup SYSCFG_Exported_Constants - * @{ - */ - -/** @defgroup SYSCFG_EXTI_Port_Sources - * @{ - */ -#define EXTI_PortSourceGPIOA ((uint8_t)0x00) -#define EXTI_PortSourceGPIOB ((uint8_t)0x01) -#define EXTI_PortSourceGPIOC ((uint8_t)0x02) -#define EXTI_PortSourceGPIOD ((uint8_t)0x03) -#define EXTI_PortSourceGPIOE ((uint8_t)0x04) -#define EXTI_PortSourceGPIOF ((uint8_t)0x05) -#define EXTI_PortSourceGPIOG ((uint8_t)0x06) -#define EXTI_PortSourceGPIOH ((uint8_t)0x07) -#define EXTI_PortSourceGPIOI ((uint8_t)0x08) - -#define IS_EXTI_PORT_SOURCE(PORTSOURCE) (((PORTSOURCE) == EXTI_PortSourceGPIOA) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOB) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOC) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOD) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOE) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOF) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOG) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOH) || \ - ((PORTSOURCE) == EXTI_PortSourceGPIOI)) -/** - * @} - */ - - -/** @defgroup SYSCFG_EXTI_Pin_Sources - * @{ - */ -#define EXTI_PinSource0 ((uint8_t)0x00) -#define EXTI_PinSource1 ((uint8_t)0x01) -#define EXTI_PinSource2 ((uint8_t)0x02) -#define EXTI_PinSource3 ((uint8_t)0x03) -#define EXTI_PinSource4 ((uint8_t)0x04) -#define EXTI_PinSource5 ((uint8_t)0x05) -#define EXTI_PinSource6 ((uint8_t)0x06) -#define EXTI_PinSource7 ((uint8_t)0x07) -#define EXTI_PinSource8 ((uint8_t)0x08) -#define EXTI_PinSource9 ((uint8_t)0x09) -#define EXTI_PinSource10 ((uint8_t)0x0A) -#define EXTI_PinSource11 ((uint8_t)0x0B) -#define EXTI_PinSource12 ((uint8_t)0x0C) -#define EXTI_PinSource13 ((uint8_t)0x0D) -#define EXTI_PinSource14 ((uint8_t)0x0E) -#define EXTI_PinSource15 ((uint8_t)0x0F) -#define IS_EXTI_PIN_SOURCE(PINSOURCE) (((PINSOURCE) == EXTI_PinSource0) || \ - ((PINSOURCE) == EXTI_PinSource1) || \ - ((PINSOURCE) == EXTI_PinSource2) || \ - ((PINSOURCE) == EXTI_PinSource3) || \ - ((PINSOURCE) == EXTI_PinSource4) || \ - ((PINSOURCE) == EXTI_PinSource5) || \ - ((PINSOURCE) == EXTI_PinSource6) || \ - ((PINSOURCE) == EXTI_PinSource7) || \ - ((PINSOURCE) == EXTI_PinSource8) || \ - ((PINSOURCE) == EXTI_PinSource9) || \ - ((PINSOURCE) == EXTI_PinSource10) || \ - ((PINSOURCE) == EXTI_PinSource11) || \ - ((PINSOURCE) == EXTI_PinSource12) || \ - ((PINSOURCE) == EXTI_PinSource13) || \ - ((PINSOURCE) == EXTI_PinSource14) || \ - ((PINSOURCE) == EXTI_PinSource15)) -/** - * @} - */ - - -/** @defgroup SYSCFG_Memory_Remap_Config - * @{ - */ -#define SYSCFG_MemoryRemap_Flash ((uint8_t)0x00) -#define SYSCFG_MemoryRemap_SystemFlash ((uint8_t)0x01) -#define SYSCFG_MemoryRemap_FSMC ((uint8_t)0x02) -#define SYSCFG_MemoryRemap_SRAM ((uint8_t)0x03) - -#define IS_SYSCFG_MEMORY_REMAP_CONFING(REMAP) (((REMAP) == SYSCFG_MemoryRemap_Flash) || \ - ((REMAP) == SYSCFG_MemoryRemap_SystemFlash) || \ - ((REMAP) == SYSCFG_MemoryRemap_SRAM) || \ - ((REMAP) == SYSCFG_MemoryRemap_FSMC)) -/** - * @} - */ - - -/** @defgroup SYSCFG_ETHERNET_Media_Interface - * @{ - */ -#define SYSCFG_ETH_MediaInterface_MII ((uint32_t)0x00000000) -#define SYSCFG_ETH_MediaInterface_RMII ((uint32_t)0x00000001) - -#define IS_SYSCFG_ETH_MEDIA_INTERFACE(INTERFACE) (((INTERFACE) == SYSCFG_ETH_MediaInterface_MII) || \ - ((INTERFACE) == SYSCFG_ETH_MediaInterface_RMII)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -void SYSCFG_DeInit(void); -void SYSCFG_MemoryRemapConfig(uint8_t SYSCFG_MemoryRemap); -void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex); -void SYSCFG_ETH_MediaInterfaceConfig(uint32_t SYSCFG_ETH_MediaInterface); -void SYSCFG_CompensationCellCmd(FunctionalState NewState); -FlagStatus SYSCFG_GetCompensationCellStatus(void); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_SYSCFG_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_tim.c b/car_hw/src/lib/stdperiph/stm32f4xx_tim.c deleted file mode 100644 index 8a2f8427f3d..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_tim.c +++ /dev/null @@ -1,3353 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_tim.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the TIM peripheral: - * - TimeBase management - * - Output Compare management - * - Input Capture management - * - Advanced-control timers (TIM1 and TIM8) specific features - * - Interrupts, DMA and flags management - * - Clocks management - * - Synchronization management - * - Specific interface management - * - Specific remapping management - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - * This driver provides functions to configure and program the TIM - * of all STM32F4xx devices. - * These functions are split in 9 groups: - * - * 1. TIM TimeBase management: this group includes all needed functions - * to configure the TM Timebase unit: - * - Set/Get Prescaler - * - Set/Get Autoreload - * - Counter modes configuration - * - Set Clock division - * - Select the One Pulse mode - * - Update Request Configuration - * - Update Disable Configuration - * - Auto-Preload Configuration - * - Enable/Disable the counter - * - * 2. TIM Output Compare management: this group includes all needed - * functions to configure the Capture/Compare unit used in Output - * compare mode: - * - Configure each channel, independently, in Output Compare mode - * - Select the output compare modes - * - Select the Polarities of each channel - * - Set/Get the Capture/Compare register values - * - Select the Output Compare Fast mode - * - Select the Output Compare Forced mode - * - Output Compare-Preload Configuration - * - Clear Output Compare Reference - * - Select the OCREF Clear signal - * - Enable/Disable the Capture/Compare Channels - * - * 3. TIM Input Capture management: this group includes all needed - * functions to configure the Capture/Compare unit used in - * Input Capture mode: - * - Configure each channel in input capture mode - * - Configure Channel1/2 in PWM Input mode - * - Set the Input Capture Prescaler - * - Get the Capture/Compare values - * - * 4. Advanced-control timers (TIM1 and TIM8) specific features - * - Configures the Break input, dead time, Lock level, the OSSI, - * the OSSR State and the AOE(automatic output enable) - * - Enable/Disable the TIM peripheral Main Outputs - * - Select the Commutation event - * - Set/Reset the Capture Compare Preload Control bit - * - * 5. TIM interrupts, DMA and flags management - * - Enable/Disable interrupt sources - * - Get flags status - * - Clear flags/ Pending bits - * - Enable/Disable DMA requests - * - Configure DMA burst mode - * - Select CaptureCompare DMA request - * - * 6. TIM clocks management: this group includes all needed functions - * to configure the clock controller unit: - * - Select internal/External clock - * - Select the external clock mode: ETR(Mode1/Mode2), TIx or ITRx - * - * 7. TIM synchronization management: this group includes all needed - * functions to configure the Synchronization unit: - * - Select Input Trigger - * - Select Output Trigger - * - Select Master Slave Mode - * - ETR Configuration when used as external trigger - * - * 8. TIM specific interface management, this group includes all - * needed functions to use the specific TIM interface: - * - Encoder Interface Configuration - * - Select Hall Sensor - * - * 9. TIM specific remapping management includes the Remapping - * configuration of specific timers - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_tim.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup TIM - * @brief TIM driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* ---------------------- TIM registers bit mask ------------------------ */ -#define SMCR_ETR_MASK ((uint16_t)0x00FF) -#define CCMR_OFFSET ((uint16_t)0x0018) -#define CCER_CCE_SET ((uint16_t)0x0001) -#define CCER_CCNE_SET ((uint16_t)0x0004) -#define CCMR_OC13M_MASK ((uint16_t)0xFF8F) -#define CCMR_OC24M_MASK ((uint16_t)0x8FFF) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter); -static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter); -static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter); -static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter); - -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup TIM_Private_Functions - * @{ - */ - -/** @defgroup TIM_Group1 TimeBase management functions - * @brief TimeBase management functions - * -@verbatim - =============================================================================== - TimeBase management functions - =============================================================================== - - =================================================================== - TIM Driver: how to use it in Timing(Time base) Mode - =================================================================== - To use the Timer in Timing(Time base) mode, the following steps are mandatory: - - 1. Enable TIM clock using RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) function - - 2. Fill the TIM_TimeBaseInitStruct with the desired parameters. - - 3. Call TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStruct) to configure the Time Base unit - with the corresponding configuration - - 4. Enable the NVIC if you need to generate the update interrupt. - - 5. Enable the corresponding interrupt using the function TIM_ITConfig(TIMx, TIM_IT_Update) - - 6. Call the TIM_Cmd(ENABLE) function to enable the TIM counter. - - Note1: All other functions can be used separately to modify, if needed, - a specific feature of the Timer. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the TIMx peripheral registers to their default reset values. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @retval None - - */ -void TIM_DeInit(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - if (TIMx == TIM1) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE); - } - else if (TIMx == TIM2) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE); - } - else if (TIMx == TIM3) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE); - } - else if (TIMx == TIM4) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE); - } - else if (TIMx == TIM5) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE); - } - else if (TIMx == TIM6) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE); - } - else if (TIMx == TIM7) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE); - } - else if (TIMx == TIM8) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, DISABLE); - } - else if (TIMx == TIM9) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, DISABLE); - } - else if (TIMx == TIM10) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, DISABLE); - } - else if (TIMx == TIM11) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, DISABLE); - } - else if (TIMx == TIM12) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM12, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM12, DISABLE); - } - else if (TIMx == TIM13) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM13, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM13, DISABLE); - } - else - { - if (TIMx == TIM14) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM14, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM14, DISABLE); - } - } -} - -/** - * @brief Initializes the TIMx Time Base Unit peripheral according to - * the specified parameters in the TIM_TimeBaseInitStruct. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef structure - * that contains the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) -{ - uint16_t tmpcr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode)); - assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision)); - - tmpcr1 = TIMx->CR1; - - if((TIMx == TIM1) || (TIMx == TIM8)|| - (TIMx == TIM2) || (TIMx == TIM3)|| - (TIMx == TIM4) || (TIMx == TIM5)) - { - /* Select the Counter Mode */ - tmpcr1 &= (uint16_t)(~(TIM_CR1_DIR | TIM_CR1_CMS)); - tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode; - } - - if((TIMx != TIM6) && (TIMx != TIM7)) - { - /* Set the clock division */ - tmpcr1 &= (uint16_t)(~TIM_CR1_CKD); - tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision; - } - - TIMx->CR1 = tmpcr1; - - /* Set the Autoreload value */ - TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ; - - /* Set the Prescaler value */ - TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler; - - if ((TIMx == TIM1) || (TIMx == TIM8)) - { - /* Set the Repetition Counter value */ - TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter; - } - - /* Generate an update event to reload the Prescaler - and the repetition counter(only for TIM1 and TIM8) value immediatly */ - TIMx->EGR = TIM_PSCReloadMode_Immediate; -} - -/** - * @brief Fills each TIM_TimeBaseInitStruct member with its default value. - * @param TIM_TimeBaseInitStruct : pointer to a TIM_TimeBaseInitTypeDef - * structure which will be initialized. - * @retval None - */ -void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) -{ - /* Set the default configuration */ - TIM_TimeBaseInitStruct->TIM_Period = 0xFFFFFFFF; - TIM_TimeBaseInitStruct->TIM_Prescaler = 0x0000; - TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1; - TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseInitStruct->TIM_RepetitionCounter = 0x0000; -} - -/** - * @brief Configures the TIMx Prescaler. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param Prescaler: specifies the Prescaler Register value - * @param TIM_PSCReloadMode: specifies the TIM Prescaler Reload mode - * This parameter can be one of the following values: - * @arg TIM_PSCReloadMode_Update: The Prescaler is loaded at the update event. - * @arg TIM_PSCReloadMode_Immediate: The Prescaler is loaded immediatly. - * @retval None - */ -void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_PRESCALER_RELOAD(TIM_PSCReloadMode)); - /* Set the Prescaler value */ - TIMx->PSC = Prescaler; - /* Set or reset the UG Bit */ - TIMx->EGR = TIM_PSCReloadMode; -} - -/** - * @brief Specifies the TIMx Counter Mode to be used. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_CounterMode: specifies the Counter Mode to be used - * This parameter can be one of the following values: - * @arg TIM_CounterMode_Up: TIM Up Counting Mode - * @arg TIM_CounterMode_Down: TIM Down Counting Mode - * @arg TIM_CounterMode_CenterAligned1: TIM Center Aligned Mode1 - * @arg TIM_CounterMode_CenterAligned2: TIM Center Aligned Mode2 - * @arg TIM_CounterMode_CenterAligned3: TIM Center Aligned Mode3 - * @retval None - */ -void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode) -{ - uint16_t tmpcr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_COUNTER_MODE(TIM_CounterMode)); - - tmpcr1 = TIMx->CR1; - - /* Reset the CMS and DIR Bits */ - tmpcr1 &= (uint16_t)~(TIM_CR1_DIR | TIM_CR1_CMS); - - /* Set the Counter Mode */ - tmpcr1 |= TIM_CounterMode; - - /* Write to TIMx CR1 register */ - TIMx->CR1 = tmpcr1; -} - -/** - * @brief Sets the TIMx Counter Register value - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param Counter: specifies the Counter register new value. - * @retval None - */ -void TIM_SetCounter(TIM_TypeDef* TIMx, uint32_t Counter) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - /* Set the Counter Register value */ - TIMx->CNT = Counter; -} - -/** - * @brief Sets the TIMx Autoreload Register value - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param Autoreload: specifies the Autoreload register new value. - * @retval None - */ -void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint32_t Autoreload) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - /* Set the Autoreload Register value */ - TIMx->ARR = Autoreload; -} - -/** - * @brief Gets the TIMx Counter value. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @retval Counter Register value - */ -uint32_t TIM_GetCounter(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - /* Get the Counter Register value */ - return TIMx->CNT; -} - -/** - * @brief Gets the TIMx Prescaler value. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @retval Prescaler Register value. - */ -uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - /* Get the Prescaler Register value */ - return TIMx->PSC; -} - -/** - * @brief Enables or Disables the TIMx Update event. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param NewState: new state of the TIMx UDIS bit - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Set the Update Disable Bit */ - TIMx->CR1 |= TIM_CR1_UDIS; - } - else - { - /* Reset the Update Disable Bit */ - TIMx->CR1 &= (uint16_t)~TIM_CR1_UDIS; - } -} - -/** - * @brief Configures the TIMx Update Request Interrupt source. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param TIM_UpdateSource: specifies the Update source. - * This parameter can be one of the following values: - * @arg TIM_UpdateSource_Global: Source of update is the counter - * overflow/underflow or the setting of UG bit, or an update - * generation through the slave mode controller. - * @arg TIM_UpdateSource_Regular: Source of update is counter overflow/underflow. - * @retval None - */ -void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_UPDATE_SOURCE(TIM_UpdateSource)); - - if (TIM_UpdateSource != TIM_UpdateSource_Global) - { - /* Set the URS Bit */ - TIMx->CR1 |= TIM_CR1_URS; - } - else - { - /* Reset the URS Bit */ - TIMx->CR1 &= (uint16_t)~TIM_CR1_URS; - } -} - -/** - * @brief Enables or disables TIMx peripheral Preload register on ARR. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param NewState: new state of the TIMx peripheral Preload register - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Set the ARR Preload Bit */ - TIMx->CR1 |= TIM_CR1_ARPE; - } - else - { - /* Reset the ARR Preload Bit */ - TIMx->CR1 &= (uint16_t)~TIM_CR1_ARPE; - } -} - -/** - * @brief Selects the TIMx's One Pulse Mode. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param TIM_OPMode: specifies the OPM Mode to be used. - * This parameter can be one of the following values: - * @arg TIM_OPMode_Single - * @arg TIM_OPMode_Repetitive - * @retval None - */ -void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_OPM_MODE(TIM_OPMode)); - - /* Reset the OPM Bit */ - TIMx->CR1 &= (uint16_t)~TIM_CR1_OPM; - - /* Configure the OPM Mode */ - TIMx->CR1 |= TIM_OPMode; -} - -/** - * @brief Sets the TIMx Clock Division value. - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @param TIM_CKD: specifies the clock division value. - * This parameter can be one of the following value: - * @arg TIM_CKD_DIV1: TDTS = Tck_tim - * @arg TIM_CKD_DIV2: TDTS = 2*Tck_tim - * @arg TIM_CKD_DIV4: TDTS = 4*Tck_tim - * @retval None - */ -void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_CKD_DIV(TIM_CKD)); - - /* Reset the CKD Bits */ - TIMx->CR1 &= (uint16_t)(~TIM_CR1_CKD); - - /* Set the CKD value */ - TIMx->CR1 |= TIM_CKD; -} - -/** - * @brief Enables or disables the specified TIM peripheral. - * @param TIMx: where x can be 1 to 14 to select the TIMx peripheral. - * @param NewState: new state of the TIMx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the TIM Counter */ - TIMx->CR1 |= TIM_CR1_CEN; - } - else - { - /* Disable the TIM Counter */ - TIMx->CR1 &= (uint16_t)~TIM_CR1_CEN; - } -} -/** - * @} - */ - -/** @defgroup TIM_Group2 Output Compare management functions - * @brief Output Compare management functions - * -@verbatim - =============================================================================== - Output Compare management functions - =============================================================================== - - =================================================================== - TIM Driver: how to use it in Output Compare Mode - =================================================================== - To use the Timer in Output Compare mode, the following steps are mandatory: - - 1. Enable TIM clock using RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) function - - 2. Configure the TIM pins by configuring the corresponding GPIO pins - - 2. Configure the Time base unit as described in the first part of this driver, - if needed, else the Timer will run with the default configuration: - - Autoreload value = 0xFFFF - - Prescaler value = 0x0000 - - Counter mode = Up counting - - Clock Division = TIM_CKD_DIV1 - - 3. Fill the TIM_OCInitStruct with the desired parameters including: - - The TIM Output Compare mode: TIM_OCMode - - TIM Output State: TIM_OutputState - - TIM Pulse value: TIM_Pulse - - TIM Output Compare Polarity : TIM_OCPolarity - - 4. Call TIM_OCxInit(TIMx, &TIM_OCInitStruct) to configure the desired channel with the - corresponding configuration - - 5. Call the TIM_Cmd(ENABLE) function to enable the TIM counter. - - Note1: All other functions can be used separately to modify, if needed, - a specific feature of the Timer. - - Note2: In case of PWM mode, this function is mandatory: - TIM_OCxPreloadConfig(TIMx, TIM_OCPreload_ENABLE); - - Note3: If the corresponding interrupt or DMA request are needed, the user should: - 1. Enable the NVIC (or the DMA) to use the TIM interrupts (or DMA requests). - 2. Enable the corresponding interrupt (or DMA request) using the function - TIM_ITConfig(TIMx, TIM_IT_CCx) (or TIM_DMA_Cmd(TIMx, TIM_DMA_CCx)) - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the TIMx Channel1 according to the specified parameters in - * the TIM_OCInitStruct. - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure that contains - * the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); - assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); - - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= (uint16_t)~TIM_CCER_CC1E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare Mode Bits */ - tmpccmrx &= (uint16_t)~TIM_CCMR1_OC1M; - tmpccmrx &= (uint16_t)~TIM_CCMR1_CC1S; - /* Select the Output Compare Mode */ - tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= (uint16_t)~TIM_CCER_CC1P; - /* Set the Output Compare Polarity */ - tmpccer |= TIM_OCInitStruct->TIM_OCPolarity; - - /* Set the Output State */ - tmpccer |= TIM_OCInitStruct->TIM_OutputState; - - if((TIMx == TIM1) || (TIMx == TIM8)) - { - assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); - assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); - - /* Reset the Output N Polarity level */ - tmpccer &= (uint16_t)~TIM_CCER_CC1NP; - /* Set the Output N Polarity */ - tmpccer |= TIM_OCInitStruct->TIM_OCNPolarity; - /* Reset the Output N State */ - tmpccer &= (uint16_t)~TIM_CCER_CC1NE; - - /* Set the Output N State */ - tmpccer |= TIM_OCInitStruct->TIM_OutputNState; - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= (uint16_t)~TIM_CR2_OIS1; - tmpcr2 &= (uint16_t)~TIM_CR2_OIS1N; - /* Set the Output Idle state */ - tmpcr2 |= TIM_OCInitStruct->TIM_OCIdleState; - /* Set the Output N Idle state */ - tmpcr2 |= TIM_OCInitStruct->TIM_OCNIdleState; - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Initializes the TIMx Channel2 according to the specified parameters - * in the TIM_OCInitStruct. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure that contains - * the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); - assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= (uint16_t)~TIM_CCER_CC2E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= (uint16_t)~TIM_CCMR1_OC2M; - tmpccmrx &= (uint16_t)~TIM_CCMR1_CC2S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); - - /* Reset the Output Polarity level */ - tmpccer &= (uint16_t)~TIM_CCER_CC2P; - /* Set the Output Compare Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4); - - /* Set the Output State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 4); - - if((TIMx == TIM1) || (TIMx == TIM8)) - { - assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); - assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); - - /* Reset the Output N Polarity level */ - tmpccer &= (uint16_t)~TIM_CCER_CC2NP; - /* Set the Output N Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 4); - /* Reset the Output N State */ - tmpccer &= (uint16_t)~TIM_CCER_CC2NE; - - /* Set the Output N State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 4); - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= (uint16_t)~TIM_CR2_OIS2; - tmpcr2 &= (uint16_t)~TIM_CR2_OIS2N; - /* Set the Output Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 2); - /* Set the Output N Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 2); - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR2 = TIM_OCInitStruct->TIM_Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Initializes the TIMx Channel3 according to the specified parameters - * in the TIM_OCInitStruct. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure that contains - * the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); - assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); - - /* Disable the Channel 3: Reset the CC2E Bit */ - TIMx->CCER &= (uint16_t)~TIM_CCER_CC3E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= (uint16_t)~TIM_CCMR2_OC3M; - tmpccmrx &= (uint16_t)~TIM_CCMR2_CC3S; - /* Select the Output Compare Mode */ - tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= (uint16_t)~TIM_CCER_CC3P; - /* Set the Output Compare Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 8); - - /* Set the Output State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 8); - - if((TIMx == TIM1) || (TIMx == TIM8)) - { - assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity)); - assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); - - /* Reset the Output N Polarity level */ - tmpccer &= (uint16_t)~TIM_CCER_CC3NP; - /* Set the Output N Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 8); - /* Reset the Output N State */ - tmpccer &= (uint16_t)~TIM_CCER_CC3NE; - - /* Set the Output N State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 8); - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= (uint16_t)~TIM_CR2_OIS3; - tmpcr2 &= (uint16_t)~TIM_CR2_OIS3N; - /* Set the Output Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 4); - /* Set the Output N Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 4); - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR3 = TIM_OCInitStruct->TIM_Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Initializes the TIMx Channel4 according to the specified parameters - * in the TIM_OCInitStruct. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure that contains - * the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode)); - assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity)); - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= (uint16_t)~TIM_CCER_CC4E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= (uint16_t)~TIM_CCMR2_OC4M; - tmpccmrx &= (uint16_t)~TIM_CCMR2_CC4S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); - - /* Reset the Output Polarity level */ - tmpccer &= (uint16_t)~TIM_CCER_CC4P; - /* Set the Output Compare Polarity */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 12); - - /* Set the Output State */ - tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 12); - - if((TIMx == TIM1) || (TIMx == TIM8)) - { - assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState)); - /* Reset the Output Compare IDLE State */ - tmpcr2 &=(uint16_t) ~TIM_CR2_OIS4; - /* Set the Output Idle state */ - tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 6); - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR4 = TIM_OCInitStruct->TIM_Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Fills each TIM_OCInitStruct member with its default value. - * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure which will - * be initialized. - * @retval None - */ -void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct) -{ - /* Set the default configuration */ - TIM_OCInitStruct->TIM_OCMode = TIM_OCMode_Timing; - TIM_OCInitStruct->TIM_OutputState = TIM_OutputState_Disable; - TIM_OCInitStruct->TIM_OutputNState = TIM_OutputNState_Disable; - TIM_OCInitStruct->TIM_Pulse = 0x00000000; - TIM_OCInitStruct->TIM_OCPolarity = TIM_OCPolarity_High; - TIM_OCInitStruct->TIM_OCNPolarity = TIM_OCPolarity_High; - TIM_OCInitStruct->TIM_OCIdleState = TIM_OCIdleState_Reset; - TIM_OCInitStruct->TIM_OCNIdleState = TIM_OCNIdleState_Reset; -} - -/** - * @brief Selects the TIM Output Compare Mode. - * @note This function disables the selected channel before changing the Output - * Compare Mode. If needed, user has to enable this channel using - * TIM_CCxCmd() and TIM_CCxNCmd() functions. - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @param TIM_Channel: specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_Channel_1: TIM Channel 1 - * @arg TIM_Channel_2: TIM Channel 2 - * @arg TIM_Channel_3: TIM Channel 3 - * @arg TIM_Channel_4: TIM Channel 4 - * @param TIM_OCMode: specifies the TIM Output Compare Mode. - * This parameter can be one of the following values: - * @arg TIM_OCMode_Timing - * @arg TIM_OCMode_Active - * @arg TIM_OCMode_Toggle - * @arg TIM_OCMode_PWM1 - * @arg TIM_OCMode_PWM2 - * @arg TIM_ForcedAction_Active - * @arg TIM_ForcedAction_InActive - * @retval None - */ -void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode) -{ - uint32_t tmp = 0; - uint16_t tmp1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_CHANNEL(TIM_Channel)); - assert_param(IS_TIM_OCM(TIM_OCMode)); - - tmp = (uint32_t) TIMx; - tmp += CCMR_OFFSET; - - tmp1 = CCER_CCE_SET << (uint16_t)TIM_Channel; - - /* Disable the Channel: Reset the CCxE Bit */ - TIMx->CCER &= (uint16_t) ~tmp1; - - if((TIM_Channel == TIM_Channel_1) ||(TIM_Channel == TIM_Channel_3)) - { - tmp += (TIM_Channel>>1); - - /* Reset the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp &= CCMR_OC13M_MASK; - - /* Configure the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp |= TIM_OCMode; - } - else - { - tmp += (uint16_t)(TIM_Channel - (uint16_t)4)>> (uint16_t)1; - - /* Reset the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp &= CCMR_OC24M_MASK; - - /* Configure the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp |= (uint16_t)(TIM_OCMode << 8); - } -} - -/** - * @brief Sets the TIMx Capture Compare1 Register value - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @param Compare1: specifies the Capture Compare1 register new value. - * @retval None - */ -void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - - /* Set the Capture Compare1 Register value */ - TIMx->CCR1 = Compare1; -} - -/** - * @brief Sets the TIMx Capture Compare2 Register value - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @param Compare2: specifies the Capture Compare2 register new value. - * @retval None - */ -void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare2) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - - /* Set the Capture Compare2 Register value */ - TIMx->CCR2 = Compare2; -} - -/** - * @brief Sets the TIMx Capture Compare3 Register value - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param Compare3: specifies the Capture Compare3 register new value. - * @retval None - */ -void TIM_SetCompare3(TIM_TypeDef* TIMx, uint32_t Compare3) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - - /* Set the Capture Compare3 Register value */ - TIMx->CCR3 = Compare3; -} - -/** - * @brief Sets the TIMx Capture Compare4 Register value - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param Compare4: specifies the Capture Compare4 register new value. - * @retval None - */ -void TIM_SetCompare4(TIM_TypeDef* TIMx, uint32_t Compare4) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - - /* Set the Capture Compare4 Register value */ - TIMx->CCR4 = Compare4; -} - -/** - * @brief Forces the TIMx output 1 waveform to active or inactive level. - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. - * This parameter can be one of the following values: - * @arg TIM_ForcedAction_Active: Force active level on OC1REF - * @arg TIM_ForcedAction_InActive: Force inactive level on OC1REF. - * @retval None - */ -void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); - tmpccmr1 = TIMx->CCMR1; - - /* Reset the OC1M Bits */ - tmpccmr1 &= (uint16_t)~TIM_CCMR1_OC1M; - - /* Configure The Forced output Mode */ - tmpccmr1 |= TIM_ForcedAction; - - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Forces the TIMx output 2 waveform to active or inactive level. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. - * This parameter can be one of the following values: - * @arg TIM_ForcedAction_Active: Force active level on OC2REF - * @arg TIM_ForcedAction_InActive: Force inactive level on OC2REF. - * @retval None - */ -void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); - tmpccmr1 = TIMx->CCMR1; - - /* Reset the OC2M Bits */ - tmpccmr1 &= (uint16_t)~TIM_CCMR1_OC2M; - - /* Configure The Forced output Mode */ - tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8); - - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Forces the TIMx output 3 waveform to active or inactive level. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. - * This parameter can be one of the following values: - * @arg TIM_ForcedAction_Active: Force active level on OC3REF - * @arg TIM_ForcedAction_InActive: Force inactive level on OC3REF. - * @retval None - */ -void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); - - tmpccmr2 = TIMx->CCMR2; - - /* Reset the OC1M Bits */ - tmpccmr2 &= (uint16_t)~TIM_CCMR2_OC3M; - - /* Configure The Forced output Mode */ - tmpccmr2 |= TIM_ForcedAction; - - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Forces the TIMx output 4 waveform to active or inactive level. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform. - * This parameter can be one of the following values: - * @arg TIM_ForcedAction_Active: Force active level on OC4REF - * @arg TIM_ForcedAction_InActive: Force inactive level on OC4REF. - * @retval None - */ -void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction)); - tmpccmr2 = TIMx->CCMR2; - - /* Reset the OC2M Bits */ - tmpccmr2 &= (uint16_t)~TIM_CCMR2_OC4M; - - /* Configure The Forced output Mode */ - tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8); - - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Enables or disables the TIMx peripheral Preload register on CCR1. - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @param TIM_OCPreload: new state of the TIMx peripheral Preload register - * This parameter can be one of the following values: - * @arg TIM_OCPreload_Enable - * @arg TIM_OCPreload_Disable - * @retval None - */ -void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); - - tmpccmr1 = TIMx->CCMR1; - - /* Reset the OC1PE Bit */ - tmpccmr1 &= (uint16_t)(~TIM_CCMR1_OC1PE); - - /* Enable or Disable the Output Compare Preload feature */ - tmpccmr1 |= TIM_OCPreload; - - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Enables or disables the TIMx peripheral Preload register on CCR2. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @param TIM_OCPreload: new state of the TIMx peripheral Preload register - * This parameter can be one of the following values: - * @arg TIM_OCPreload_Enable - * @arg TIM_OCPreload_Disable - * @retval None - */ -void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); - - tmpccmr1 = TIMx->CCMR1; - - /* Reset the OC2PE Bit */ - tmpccmr1 &= (uint16_t)(~TIM_CCMR1_OC2PE); - - /* Enable or Disable the Output Compare Preload feature */ - tmpccmr1 |= (uint16_t)(TIM_OCPreload << 8); - - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Enables or disables the TIMx peripheral Preload register on CCR3. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCPreload: new state of the TIMx peripheral Preload register - * This parameter can be one of the following values: - * @arg TIM_OCPreload_Enable - * @arg TIM_OCPreload_Disable - * @retval None - */ -void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); - - tmpccmr2 = TIMx->CCMR2; - - /* Reset the OC3PE Bit */ - tmpccmr2 &= (uint16_t)(~TIM_CCMR2_OC3PE); - - /* Enable or Disable the Output Compare Preload feature */ - tmpccmr2 |= TIM_OCPreload; - - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Enables or disables the TIMx peripheral Preload register on CCR4. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCPreload: new state of the TIMx peripheral Preload register - * This parameter can be one of the following values: - * @arg TIM_OCPreload_Enable - * @arg TIM_OCPreload_Disable - * @retval None - */ -void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload)); - - tmpccmr2 = TIMx->CCMR2; - - /* Reset the OC4PE Bit */ - tmpccmr2 &= (uint16_t)(~TIM_CCMR2_OC4PE); - - /* Enable or Disable the Output Compare Preload feature */ - tmpccmr2 |= (uint16_t)(TIM_OCPreload << 8); - - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Configures the TIMx Output Compare 1 Fast feature. - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCFast_Enable: TIM output compare fast enable - * @arg TIM_OCFast_Disable: TIM output compare fast disable - * @retval None - */ -void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); - - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = TIMx->CCMR1; - - /* Reset the OC1FE Bit */ - tmpccmr1 &= (uint16_t)~TIM_CCMR1_OC1FE; - - /* Enable or Disable the Output Compare Fast Bit */ - tmpccmr1 |= TIM_OCFast; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Configures the TIMx Output Compare 2 Fast feature. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCFast_Enable: TIM output compare fast enable - * @arg TIM_OCFast_Disable: TIM output compare fast disable - * @retval None - */ -void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); - - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = TIMx->CCMR1; - - /* Reset the OC2FE Bit */ - tmpccmr1 &= (uint16_t)(~TIM_CCMR1_OC2FE); - - /* Enable or Disable the Output Compare Fast Bit */ - tmpccmr1 |= (uint16_t)(TIM_OCFast << 8); - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Configures the TIMx Output Compare 3 Fast feature. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCFast_Enable: TIM output compare fast enable - * @arg TIM_OCFast_Disable: TIM output compare fast disable - * @retval None - */ -void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); - - /* Get the TIMx CCMR2 register value */ - tmpccmr2 = TIMx->CCMR2; - - /* Reset the OC3FE Bit */ - tmpccmr2 &= (uint16_t)~TIM_CCMR2_OC3FE; - - /* Enable or Disable the Output Compare Fast Bit */ - tmpccmr2 |= TIM_OCFast; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Configures the TIMx Output Compare 4 Fast feature. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCFast_Enable: TIM output compare fast enable - * @arg TIM_OCFast_Disable: TIM output compare fast disable - * @retval None - */ -void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast)); - - /* Get the TIMx CCMR2 register value */ - tmpccmr2 = TIMx->CCMR2; - - /* Reset the OC4FE Bit */ - tmpccmr2 &= (uint16_t)(~TIM_CCMR2_OC4FE); - - /* Enable or Disable the Output Compare Fast Bit */ - tmpccmr2 |= (uint16_t)(TIM_OCFast << 8); - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Clears or safeguards the OCREF1 signal on an external event - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCClear_Enable: TIM Output clear enable - * @arg TIM_OCClear_Disable: TIM Output clear disable - * @retval None - */ -void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); - - tmpccmr1 = TIMx->CCMR1; - - /* Reset the OC1CE Bit */ - tmpccmr1 &= (uint16_t)~TIM_CCMR1_OC1CE; - - /* Enable or Disable the Output Compare Clear Bit */ - tmpccmr1 |= TIM_OCClear; - - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Clears or safeguards the OCREF2 signal on an external event - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCClear_Enable: TIM Output clear enable - * @arg TIM_OCClear_Disable: TIM Output clear disable - * @retval None - */ -void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) -{ - uint16_t tmpccmr1 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); - - tmpccmr1 = TIMx->CCMR1; - - /* Reset the OC2CE Bit */ - tmpccmr1 &= (uint16_t)~TIM_CCMR1_OC2CE; - - /* Enable or Disable the Output Compare Clear Bit */ - tmpccmr1 |= (uint16_t)(TIM_OCClear << 8); - - /* Write to TIMx CCMR1 register */ - TIMx->CCMR1 = tmpccmr1; -} - -/** - * @brief Clears or safeguards the OCREF3 signal on an external event - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCClear_Enable: TIM Output clear enable - * @arg TIM_OCClear_Disable: TIM Output clear disable - * @retval None - */ -void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); - - tmpccmr2 = TIMx->CCMR2; - - /* Reset the OC3CE Bit */ - tmpccmr2 &= (uint16_t)~TIM_CCMR2_OC3CE; - - /* Enable or Disable the Output Compare Clear Bit */ - tmpccmr2 |= TIM_OCClear; - - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Clears or safeguards the OCREF4 signal on an external event - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit. - * This parameter can be one of the following values: - * @arg TIM_OCClear_Enable: TIM Output clear enable - * @arg TIM_OCClear_Disable: TIM Output clear disable - * @retval None - */ -void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear) -{ - uint16_t tmpccmr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear)); - - tmpccmr2 = TIMx->CCMR2; - - /* Reset the OC4CE Bit */ - tmpccmr2 &= (uint16_t)~TIM_CCMR2_OC4CE; - - /* Enable or Disable the Output Compare Clear Bit */ - tmpccmr2 |= (uint16_t)(TIM_OCClear << 8); - - /* Write to TIMx CCMR2 register */ - TIMx->CCMR2 = tmpccmr2; -} - -/** - * @brief Configures the TIMx channel 1 polarity. - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @param TIM_OCPolarity: specifies the OC1 Polarity - * This parameter can be one of the following values: - * @arg TIM_OCPolarity_High: Output Compare active high - * @arg TIM_OCPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) -{ - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); - - tmpccer = TIMx->CCER; - - /* Set or Reset the CC1P Bit */ - tmpccer &= (uint16_t)(~TIM_CCER_CC1P); - tmpccer |= TIM_OCPolarity; - - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx Channel 1N polarity. - * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. - * @param TIM_OCNPolarity: specifies the OC1N Polarity - * This parameter can be one of the following values: - * @arg TIM_OCNPolarity_High: Output Compare active high - * @arg TIM_OCNPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) -{ - uint16_t tmpccer = 0; - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); - - tmpccer = TIMx->CCER; - - /* Set or Reset the CC1NP Bit */ - tmpccer &= (uint16_t)~TIM_CCER_CC1NP; - tmpccer |= TIM_OCNPolarity; - - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx channel 2 polarity. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @param TIM_OCPolarity: specifies the OC2 Polarity - * This parameter can be one of the following values: - * @arg TIM_OCPolarity_High: Output Compare active high - * @arg TIM_OCPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) -{ - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); - - tmpccer = TIMx->CCER; - - /* Set or Reset the CC2P Bit */ - tmpccer &= (uint16_t)(~TIM_CCER_CC2P); - tmpccer |= (uint16_t)(TIM_OCPolarity << 4); - - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx Channel 2N polarity. - * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. - * @param TIM_OCNPolarity: specifies the OC2N Polarity - * This parameter can be one of the following values: - * @arg TIM_OCNPolarity_High: Output Compare active high - * @arg TIM_OCNPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) -{ - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); - - tmpccer = TIMx->CCER; - - /* Set or Reset the CC2NP Bit */ - tmpccer &= (uint16_t)~TIM_CCER_CC2NP; - tmpccer |= (uint16_t)(TIM_OCNPolarity << 4); - - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx channel 3 polarity. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCPolarity: specifies the OC3 Polarity - * This parameter can be one of the following values: - * @arg TIM_OCPolarity_High: Output Compare active high - * @arg TIM_OCPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) -{ - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); - - tmpccer = TIMx->CCER; - - /* Set or Reset the CC3P Bit */ - tmpccer &= (uint16_t)~TIM_CCER_CC3P; - tmpccer |= (uint16_t)(TIM_OCPolarity << 8); - - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx Channel 3N polarity. - * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. - * @param TIM_OCNPolarity: specifies the OC3N Polarity - * This parameter can be one of the following values: - * @arg TIM_OCNPolarity_High: Output Compare active high - * @arg TIM_OCNPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity) -{ - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity)); - - tmpccer = TIMx->CCER; - - /* Set or Reset the CC3NP Bit */ - tmpccer &= (uint16_t)~TIM_CCER_CC3NP; - tmpccer |= (uint16_t)(TIM_OCNPolarity << 8); - - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Configures the TIMx channel 4 polarity. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_OCPolarity: specifies the OC4 Polarity - * This parameter can be one of the following values: - * @arg TIM_OCPolarity_High: Output Compare active high - * @arg TIM_OCPolarity_Low: Output Compare active low - * @retval None - */ -void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity) -{ - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity)); - - tmpccer = TIMx->CCER; - - /* Set or Reset the CC4P Bit */ - tmpccer &= (uint16_t)~TIM_CCER_CC4P; - tmpccer |= (uint16_t)(TIM_OCPolarity << 12); - - /* Write to TIMx CCER register */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel x. - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @param TIM_Channel: specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_Channel_1: TIM Channel 1 - * @arg TIM_Channel_2: TIM Channel 2 - * @arg TIM_Channel_3: TIM Channel 3 - * @arg TIM_Channel_4: TIM Channel 4 - * @param TIM_CCx: specifies the TIM Channel CCxE bit new state. - * This parameter can be: TIM_CCx_Enable or TIM_CCx_Disable. - * @retval None - */ -void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx) -{ - uint16_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_CHANNEL(TIM_Channel)); - assert_param(IS_TIM_CCX(TIM_CCx)); - - tmp = CCER_CCE_SET << TIM_Channel; - - /* Reset the CCxE Bit */ - TIMx->CCER &= (uint16_t)~ tmp; - - /* Set or reset the CCxE Bit */ - TIMx->CCER |= (uint16_t)(TIM_CCx << TIM_Channel); -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel xN. - * @param TIMx: where x can be 1 or 8 to select the TIM peripheral. - * @param TIM_Channel: specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_Channel_1: TIM Channel 1 - * @arg TIM_Channel_2: TIM Channel 2 - * @arg TIM_Channel_3: TIM Channel 3 - * @param TIM_CCxN: specifies the TIM Channel CCxNE bit new state. - * This parameter can be: TIM_CCxN_Enable or TIM_CCxN_Disable. - * @retval None - */ -void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN) -{ - uint16_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_COMPLEMENTARY_CHANNEL(TIM_Channel)); - assert_param(IS_TIM_CCXN(TIM_CCxN)); - - tmp = CCER_CCNE_SET << TIM_Channel; - - /* Reset the CCxNE Bit */ - TIMx->CCER &= (uint16_t) ~tmp; - - /* Set or reset the CCxNE Bit */ - TIMx->CCER |= (uint16_t)(TIM_CCxN << TIM_Channel); -} -/** - * @} - */ - -/** @defgroup TIM_Group3 Input Capture management functions - * @brief Input Capture management functions - * -@verbatim - =============================================================================== - Input Capture management functions - =============================================================================== - - =================================================================== - TIM Driver: how to use it in Input Capture Mode - =================================================================== - To use the Timer in Input Capture mode, the following steps are mandatory: - - 1. Enable TIM clock using RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE) function - - 2. Configure the TIM pins by configuring the corresponding GPIO pins - - 2. Configure the Time base unit as described in the first part of this driver, - if needed, else the Timer will run with the default configuration: - - Autoreload value = 0xFFFF - - Prescaler value = 0x0000 - - Counter mode = Up counting - - Clock Division = TIM_CKD_DIV1 - - 3. Fill the TIM_ICInitStruct with the desired parameters including: - - TIM Channel: TIM_Channel - - TIM Input Capture polarity: TIM_ICPolarity - - TIM Input Capture selection: TIM_ICSelection - - TIM Input Capture Prescaler: TIM_ICPrescaler - - TIM Input CApture filter value: TIM_ICFilter - - 4. Call TIM_ICInit(TIMx, &TIM_ICInitStruct) to configure the desired channel with the - corresponding configuration and to measure only frequency or duty cycle of the input signal, - or, - Call TIM_PWMIConfig(TIMx, &TIM_ICInitStruct) to configure the desired channels with the - corresponding configuration and to measure the frequency and the duty cycle of the input signal - - 5. Enable the NVIC or the DMA to read the measured frequency. - - 6. Enable the corresponding interrupt (or DMA request) to read the Captured value, - using the function TIM_ITConfig(TIMx, TIM_IT_CCx) (or TIM_DMA_Cmd(TIMx, TIM_DMA_CCx)) - - 7. Call the TIM_Cmd(ENABLE) function to enable the TIM counter. - - 8. Use TIM_GetCapturex(TIMx); to read the captured value. - - Note1: All other functions can be used separately to modify, if needed, - a specific feature of the Timer. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the TIM peripheral according to the specified parameters - * in the TIM_ICInitStruct. - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure that contains - * the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity)); - assert_param(IS_TIM_IC_SELECTION(TIM_ICInitStruct->TIM_ICSelection)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICInitStruct->TIM_ICPrescaler)); - assert_param(IS_TIM_IC_FILTER(TIM_ICInitStruct->TIM_ICFilter)); - - if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) - { - /* TI1 Configuration */ - TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, - TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } - else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_2) - { - /* TI2 Configuration */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, - TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } - else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_3) - { - /* TI3 Configuration */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - TI3_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, - TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC3Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } - else - { - /* TI4 Configuration */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - TI4_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, - TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC4Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } -} - -/** - * @brief Fills each TIM_ICInitStruct member with its default value. - * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure which will - * be initialized. - * @retval None - */ -void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct) -{ - /* Set the default configuration */ - TIM_ICInitStruct->TIM_Channel = TIM_Channel_1; - TIM_ICInitStruct->TIM_ICPolarity = TIM_ICPolarity_Rising; - TIM_ICInitStruct->TIM_ICSelection = TIM_ICSelection_DirectTI; - TIM_ICInitStruct->TIM_ICPrescaler = TIM_ICPSC_DIV1; - TIM_ICInitStruct->TIM_ICFilter = 0x00; -} - -/** - * @brief Configures the TIM peripheral according to the specified parameters - * in the TIM_ICInitStruct to measure an external PWM signal. - * @param TIMx: where x can be 1, 2, 3, 4, 5,8, 9 or 12 to select the TIM - * peripheral. - * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure that contains - * the configuration information for the specified TIM peripheral. - * @retval None - */ -void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct) -{ - uint16_t icoppositepolarity = TIM_ICPolarity_Rising; - uint16_t icoppositeselection = TIM_ICSelection_DirectTI; - - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - - /* Select the Opposite Input Polarity */ - if (TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising) - { - icoppositepolarity = TIM_ICPolarity_Falling; - } - else - { - icoppositepolarity = TIM_ICPolarity_Rising; - } - /* Select the Opposite Input */ - if (TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI) - { - icoppositeselection = TIM_ICSelection_IndirectTI; - } - else - { - icoppositeselection = TIM_ICSelection_DirectTI; - } - if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) - { - /* TI1 Configuration */ - TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - /* TI2 Configuration */ - TI2_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } - else - { - /* TI2 Configuration */ - TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, - TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - /* TI1 Configuration */ - TI1_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); - /* Set the Input Capture Prescaler value */ - TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); - } -} - -/** - * @brief Gets the TIMx Input Capture 1 value. - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @retval Capture Compare 1 Register value. - */ -uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - - /* Get the Capture 1 Register value */ - return TIMx->CCR1; -} - -/** - * @brief Gets the TIMx Input Capture 2 value. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @retval Capture Compare 2 Register value. - */ -uint32_t TIM_GetCapture2(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - - /* Get the Capture 2 Register value */ - return TIMx->CCR2; -} - -/** - * @brief Gets the TIMx Input Capture 3 value. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @retval Capture Compare 3 Register value. - */ -uint32_t TIM_GetCapture3(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - - /* Get the Capture 3 Register value */ - return TIMx->CCR3; -} - -/** - * @brief Gets the TIMx Input Capture 4 value. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @retval Capture Compare 4 Register value. - */ -uint32_t TIM_GetCapture4(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - - /* Get the Capture 4 Register value */ - return TIMx->CCR4; -} - -/** - * @brief Sets the TIMx Input Capture 1 prescaler. - * @param TIMx: where x can be 1 to 14 except 6 and 7, to select the TIM peripheral. - * @param TIM_ICPSC: specifies the Input Capture1 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); - - /* Reset the IC1PSC Bits */ - TIMx->CCMR1 &= (uint16_t)~TIM_CCMR1_IC1PSC; - - /* Set the IC1PSC value */ - TIMx->CCMR1 |= TIM_ICPSC; -} - -/** - * @brief Sets the TIMx Input Capture 2 prescaler. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @param TIM_ICPSC: specifies the Input Capture2 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); - - /* Reset the IC2PSC Bits */ - TIMx->CCMR1 &= (uint16_t)~TIM_CCMR1_IC2PSC; - - /* Set the IC2PSC value */ - TIMx->CCMR1 |= (uint16_t)(TIM_ICPSC << 8); -} - -/** - * @brief Sets the TIMx Input Capture 3 prescaler. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICPSC: specifies the Input Capture3 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); - - /* Reset the IC3PSC Bits */ - TIMx->CCMR2 &= (uint16_t)~TIM_CCMR2_IC3PSC; - - /* Set the IC3PSC value */ - TIMx->CCMR2 |= TIM_ICPSC; -} - -/** - * @brief Sets the TIMx Input Capture 4 prescaler. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICPSC: specifies the Input Capture4 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC)); - - /* Reset the IC4PSC Bits */ - TIMx->CCMR2 &= (uint16_t)~TIM_CCMR2_IC4PSC; - - /* Set the IC4PSC value */ - TIMx->CCMR2 |= (uint16_t)(TIM_ICPSC << 8); -} -/** - * @} - */ - -/** @defgroup TIM_Group4 Advanced-control timers (TIM1 and TIM8) specific features - * @brief Advanced-control timers (TIM1 and TIM8) specific features - * -@verbatim - =============================================================================== - Advanced-control timers (TIM1 and TIM8) specific features - =============================================================================== - - =================================================================== - TIM Driver: how to use the Break feature - =================================================================== - After configuring the Timer channel(s) in the appropriate Output Compare mode: - - 1. Fill the TIM_BDTRInitStruct with the desired parameters for the Timer - Break Polarity, dead time, Lock level, the OSSI/OSSR State and the - AOE(automatic output enable). - - 2. Call TIM_BDTRConfig(TIMx, &TIM_BDTRInitStruct) to configure the Timer - - 3. Enable the Main Output using TIM_CtrlPWMOutputs(TIM1, ENABLE) - - 4. Once the break even occurs, the Timer's output signals are put in reset - state or in a known state (according to the configuration made in - TIM_BDTRConfig() function). - -@endverbatim - * @{ - */ - -/** - * @brief Configures the Break feature, dead time, Lock level, OSSI/OSSR State - * and the AOE(automatic output enable). - * @param TIMx: where x can be 1 or 8 to select the TIM - * @param TIM_BDTRInitStruct: pointer to a TIM_BDTRInitTypeDef structure that - * contains the BDTR Register configuration information for the TIM peripheral. - * @retval None - */ -void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_TIM_OSSR_STATE(TIM_BDTRInitStruct->TIM_OSSRState)); - assert_param(IS_TIM_OSSI_STATE(TIM_BDTRInitStruct->TIM_OSSIState)); - assert_param(IS_TIM_LOCK_LEVEL(TIM_BDTRInitStruct->TIM_LOCKLevel)); - assert_param(IS_TIM_BREAK_STATE(TIM_BDTRInitStruct->TIM_Break)); - assert_param(IS_TIM_BREAK_POLARITY(TIM_BDTRInitStruct->TIM_BreakPolarity)); - assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(TIM_BDTRInitStruct->TIM_AutomaticOutput)); - - /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State, - the OSSI State, the dead time value and the Automatic Output Enable Bit */ - TIMx->BDTR = (uint32_t)TIM_BDTRInitStruct->TIM_OSSRState | TIM_BDTRInitStruct->TIM_OSSIState | - TIM_BDTRInitStruct->TIM_LOCKLevel | TIM_BDTRInitStruct->TIM_DeadTime | - TIM_BDTRInitStruct->TIM_Break | TIM_BDTRInitStruct->TIM_BreakPolarity | - TIM_BDTRInitStruct->TIM_AutomaticOutput; -} - -/** - * @brief Fills each TIM_BDTRInitStruct member with its default value. - * @param TIM_BDTRInitStruct: pointer to a TIM_BDTRInitTypeDef structure which - * will be initialized. - * @retval None - */ -void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct) -{ - /* Set the default configuration */ - TIM_BDTRInitStruct->TIM_OSSRState = TIM_OSSRState_Disable; - TIM_BDTRInitStruct->TIM_OSSIState = TIM_OSSIState_Disable; - TIM_BDTRInitStruct->TIM_LOCKLevel = TIM_LOCKLevel_OFF; - TIM_BDTRInitStruct->TIM_DeadTime = 0x00; - TIM_BDTRInitStruct->TIM_Break = TIM_Break_Disable; - TIM_BDTRInitStruct->TIM_BreakPolarity = TIM_BreakPolarity_Low; - TIM_BDTRInitStruct->TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; -} - -/** - * @brief Enables or disables the TIM peripheral Main Outputs. - * @param TIMx: where x can be 1 or 8 to select the TIMx peripheral. - * @param NewState: new state of the TIM peripheral Main Outputs. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the TIM Main Output */ - TIMx->BDTR |= TIM_BDTR_MOE; - } - else - { - /* Disable the TIM Main Output */ - TIMx->BDTR &= (uint16_t)~TIM_BDTR_MOE; - } -} - -/** - * @brief Selects the TIM peripheral Commutation event. - * @param TIMx: where x can be 1 or 8 to select the TIMx peripheral - * @param NewState: new state of the Commutation event. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Set the COM Bit */ - TIMx->CR2 |= TIM_CR2_CCUS; - } - else - { - /* Reset the COM Bit */ - TIMx->CR2 &= (uint16_t)~TIM_CR2_CCUS; - } -} - -/** - * @brief Sets or Resets the TIM peripheral Capture Compare Preload Control bit. - * @param TIMx: where x can be 1 or 8 to select the TIMx peripheral - * @param NewState: new state of the Capture Compare Preload Control bit - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST4_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Set the CCPC Bit */ - TIMx->CR2 |= TIM_CR2_CCPC; - } - else - { - /* Reset the CCPC Bit */ - TIMx->CR2 &= (uint16_t)~TIM_CR2_CCPC; - } -} -/** - * @} - */ - -/** @defgroup TIM_Group5 Interrupts DMA and flags management functions - * @brief Interrupts, DMA and flags management functions - * -@verbatim - =============================================================================== - Interrupts, DMA and flags management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified TIM interrupts. - * @param TIMx: where x can be 1 to 14 to select the TIMx peripheral. - * @param TIM_IT: specifies the TIM interrupts sources to be enabled or disabled. - * This parameter can be any combination of the following values: - * @arg TIM_IT_Update: TIM update Interrupt source - * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source - * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source - * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source - * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source - * @arg TIM_IT_COM: TIM Commutation Interrupt source - * @arg TIM_IT_Trigger: TIM Trigger Interrupt source - * @arg TIM_IT_Break: TIM Break Interrupt source - * - * @note For TIM6 and TIM7 only the parameter TIM_IT_Update can be used - * @note For TIM9 and TIM12 only one of the following parameters can be used: TIM_IT_Update, - * TIM_IT_CC1, TIM_IT_CC2 or TIM_IT_Trigger. - * @note For TIM10, TIM11, TIM13 and TIM14 only one of the following parameters can - * be used: TIM_IT_Update or TIM_IT_CC1 - * @note TIM_IT_COM and TIM_IT_Break can be used only with TIM1 and TIM8 - * - * @param NewState: new state of the TIM interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_IT(TIM_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Interrupt sources */ - TIMx->DIER |= TIM_IT; - } - else - { - /* Disable the Interrupt sources */ - TIMx->DIER &= (uint16_t)~TIM_IT; - } -} - -/** - * @brief Configures the TIMx event to be generate by software. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param TIM_EventSource: specifies the event source. - * This parameter can be one or more of the following values: - * @arg TIM_EventSource_Update: Timer update Event source - * @arg TIM_EventSource_CC1: Timer Capture Compare 1 Event source - * @arg TIM_EventSource_CC2: Timer Capture Compare 2 Event source - * @arg TIM_EventSource_CC3: Timer Capture Compare 3 Event source - * @arg TIM_EventSource_CC4: Timer Capture Compare 4 Event source - * @arg TIM_EventSource_COM: Timer COM event source - * @arg TIM_EventSource_Trigger: Timer Trigger Event source - * @arg TIM_EventSource_Break: Timer Break event source - * - * @note TIM6 and TIM7 can only generate an update event. - * @note TIM_EventSource_COM and TIM_EventSource_Break are used only with TIM1 and TIM8. - * - * @retval None - */ -void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_EVENT_SOURCE(TIM_EventSource)); - - /* Set the event sources */ - TIMx->EGR = TIM_EventSource; -} - -/** - * @brief Checks whether the specified TIM flag is set or not. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param TIM_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg TIM_FLAG_Update: TIM update Flag - * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag - * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag - * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag - * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag - * @arg TIM_FLAG_COM: TIM Commutation Flag - * @arg TIM_FLAG_Trigger: TIM Trigger Flag - * @arg TIM_FLAG_Break: TIM Break Flag - * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 over capture Flag - * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 over capture Flag - * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 over capture Flag - * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 over capture Flag - * - * @note TIM6 and TIM7 can have only one update flag. - * @note TIM_FLAG_COM and TIM_FLAG_Break are used only with TIM1 and TIM8. - * - * @retval The new state of TIM_FLAG (SET or RESET). - */ -FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) -{ - ITStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_GET_FLAG(TIM_FLAG)); - - - if ((TIMx->SR & TIM_FLAG) != (uint16_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the TIMx's pending flags. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param TIM_FLAG: specifies the flag bit to clear. - * This parameter can be any combination of the following values: - * @arg TIM_FLAG_Update: TIM update Flag - * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag - * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag - * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag - * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag - * @arg TIM_FLAG_COM: TIM Commutation Flag - * @arg TIM_FLAG_Trigger: TIM Trigger Flag - * @arg TIM_FLAG_Break: TIM Break Flag - * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 over capture Flag - * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 over capture Flag - * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 over capture Flag - * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 over capture Flag - * - * @note TIM6 and TIM7 can have only one update flag. - * @note TIM_FLAG_COM and TIM_FLAG_Break are used only with TIM1 and TIM8. - * - * @retval None - */ -void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - /* Clear the flags */ - TIMx->SR = (uint16_t)~TIM_FLAG; -} - -/** - * @brief Checks whether the TIM interrupt has occurred or not. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param TIM_IT: specifies the TIM interrupt source to check. - * This parameter can be one of the following values: - * @arg TIM_IT_Update: TIM update Interrupt source - * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source - * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source - * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source - * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source - * @arg TIM_IT_COM: TIM Commutation Interrupt source - * @arg TIM_IT_Trigger: TIM Trigger Interrupt source - * @arg TIM_IT_Break: TIM Break Interrupt source - * - * @note TIM6 and TIM7 can generate only an update interrupt. - * @note TIM_IT_COM and TIM_IT_Break are used only with TIM1 and TIM8. - * - * @retval The new state of the TIM_IT(SET or RESET). - */ -ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT) -{ - ITStatus bitstatus = RESET; - uint16_t itstatus = 0x0, itenable = 0x0; - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - assert_param(IS_TIM_GET_IT(TIM_IT)); - - itstatus = TIMx->SR & TIM_IT; - - itenable = TIMx->DIER & TIM_IT; - if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the TIMx's interrupt pending bits. - * @param TIMx: where x can be 1 to 14 to select the TIM peripheral. - * @param TIM_IT: specifies the pending bit to clear. - * This parameter can be any combination of the following values: - * @arg TIM_IT_Update: TIM1 update Interrupt source - * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source - * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source - * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source - * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source - * @arg TIM_IT_COM: TIM Commutation Interrupt source - * @arg TIM_IT_Trigger: TIM Trigger Interrupt source - * @arg TIM_IT_Break: TIM Break Interrupt source - * - * @note TIM6 and TIM7 can generate only an update interrupt. - * @note TIM_IT_COM and TIM_IT_Break are used only with TIM1 and TIM8. - * - * @retval None - */ -void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT) -{ - /* Check the parameters */ - assert_param(IS_TIM_ALL_PERIPH(TIMx)); - - /* Clear the IT pending Bit */ - TIMx->SR = (uint16_t)~TIM_IT; -} - -/** - * @brief Configures the TIMx's DMA interface. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_DMABase: DMA Base address. - * This parameter can be one of the following values: - * @arg TIM_DMABase_CR1 - * @arg TIM_DMABase_CR2 - * @arg TIM_DMABase_SMCR - * @arg TIM_DMABase_DIER - * @arg TIM1_DMABase_SR - * @arg TIM_DMABase_EGR - * @arg TIM_DMABase_CCMR1 - * @arg TIM_DMABase_CCMR2 - * @arg TIM_DMABase_CCER - * @arg TIM_DMABase_CNT - * @arg TIM_DMABase_PSC - * @arg TIM_DMABase_ARR - * @arg TIM_DMABase_RCR - * @arg TIM_DMABase_CCR1 - * @arg TIM_DMABase_CCR2 - * @arg TIM_DMABase_CCR3 - * @arg TIM_DMABase_CCR4 - * @arg TIM_DMABase_BDTR - * @arg TIM_DMABase_DCR - * @param TIM_DMABurstLength: DMA Burst length. This parameter can be one value - * between: TIM_DMABurstLength_1Transfer and TIM_DMABurstLength_18Transfers. - * @retval None - */ -void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_DMA_BASE(TIM_DMABase)); - assert_param(IS_TIM_DMA_LENGTH(TIM_DMABurstLength)); - - /* Set the DMA Base and the DMA Burst Length */ - TIMx->DCR = TIM_DMABase | TIM_DMABurstLength; -} - -/** - * @brief Enables or disables the TIMx's DMA Requests. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8 to select the TIM peripheral. - * @param TIM_DMASource: specifies the DMA Request sources. - * This parameter can be any combination of the following values: - * @arg TIM_DMA_Update: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_Trigger: TIM Trigger DMA source - * @param NewState: new state of the DMA Request sources. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST5_PERIPH(TIMx)); - assert_param(IS_TIM_DMA_SOURCE(TIM_DMASource)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the DMA sources */ - TIMx->DIER |= TIM_DMASource; - } - else - { - /* Disable the DMA sources */ - TIMx->DIER &= (uint16_t)~TIM_DMASource; - } -} - -/** - * @brief Selects the TIMx peripheral Capture Compare DMA source. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param NewState: new state of the Capture Compare DMA source - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Set the CCDS Bit */ - TIMx->CR2 |= TIM_CR2_CCDS; - } - else - { - /* Reset the CCDS Bit */ - TIMx->CR2 &= (uint16_t)~TIM_CR2_CCDS; - } -} -/** - * @} - */ - -/** @defgroup TIM_Group6 Clocks management functions - * @brief Clocks management functions - * -@verbatim - =============================================================================== - Clocks management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Configures the TIMx internal Clock - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @retval None - */ -void TIM_InternalClockConfig(TIM_TypeDef* TIMx) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - - /* Disable slave mode to clock the prescaler directly with the internal clock */ - TIMx->SMCR &= (uint16_t)~TIM_SMCR_SMS; -} - -/** - * @brief Configures the TIMx Internal Trigger as External Clock - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @param TIM_InputTriggerSource: Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal Trigger 0 - * @arg TIM_TS_ITR1: Internal Trigger 1 - * @arg TIM_TS_ITR2: Internal Trigger 2 - * @arg TIM_TS_ITR3: Internal Trigger 3 - * @retval None - */ -void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_INTERNAL_TRIGGER_SELECTION(TIM_InputTriggerSource)); - - /* Select the Internal Trigger */ - TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource); - - /* Select the External clock mode1 */ - TIMx->SMCR |= TIM_SlaveMode_External1; -} - -/** - * @brief Configures the TIMx Trigger as External Clock - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13 or 14 - * to select the TIM peripheral. - * @param TIM_TIxExternalCLKSource: Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TIxExternalCLK1Source_TI1ED: TI1 Edge Detector - * @arg TIM_TIxExternalCLK1Source_TI1: Filtered Timer Input 1 - * @arg TIM_TIxExternalCLK1Source_TI2: Filtered Timer Input 2 - * @param TIM_ICPolarity: specifies the TIx Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @param ICFilter: specifies the filter value. - * This parameter must be a value between 0x0 and 0xF. - * @retval None - */ -void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, - uint16_t TIM_ICPolarity, uint16_t ICFilter) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_IC_POLARITY(TIM_ICPolarity)); - assert_param(IS_TIM_IC_FILTER(ICFilter)); - - /* Configure the Timer Input Clock Source */ - if (TIM_TIxExternalCLKSource == TIM_TIxExternalCLK1Source_TI2) - { - TI2_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); - } - else - { - TI1_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); - } - /* Select the Trigger source */ - TIM_SelectInputTrigger(TIMx, TIM_TIxExternalCLKSource); - /* Select the External clock mode1 */ - TIMx->SMCR |= TIM_SlaveMode_External1; -} - -/** - * @brief Configures the External clock Mode1 - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. - * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. - * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. - * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity: The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. - * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. - * @param ExtTRGFilter: External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, - uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter) -{ - uint16_t tmpsmcr = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); - assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); - assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); - /* Configure the ETR Clock source */ - TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - - /* Reset the SMS Bits */ - tmpsmcr &= (uint16_t)~TIM_SMCR_SMS; - - /* Select the External clock mode1 */ - tmpsmcr |= TIM_SlaveMode_External1; - - /* Select the Trigger selection : ETRF */ - tmpsmcr &= (uint16_t)~TIM_SMCR_TS; - tmpsmcr |= TIM_TS_ETRF; - - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Configures the External clock Mode2 - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. - * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. - * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. - * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity: The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. - * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. - * @param ExtTRGFilter: External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, - uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); - assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); - assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); - - /* Configure the ETR Clock source */ - TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); - - /* Enable the External clock mode2 */ - TIMx->SMCR |= TIM_SMCR_ECE; -} -/** - * @} - */ - -/** @defgroup TIM_Group7 Synchronization management functions - * @brief Synchronization management functions - * -@verbatim - =============================================================================== - Synchronization management functions - =============================================================================== - - =================================================================== - TIM Driver: how to use it in synchronization Mode - =================================================================== - Case of two/several Timers - ************************** - 1. Configure the Master Timers using the following functions: - - void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource); - - void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode); - 2. Configure the Slave Timers using the following functions: - - void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); - - void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); - - Case of Timers and external trigger(ETR pin) - ******************************************** - 1. Configure the External trigger using this function: - - void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, - uint16_t ExtTRGFilter); - 2. Configure the Slave Timers using the following functions: - - void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); - - void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); - -@endverbatim - * @{ - */ - -/** - * @brief Selects the Input Trigger source - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13 or 14 - * to select the TIM peripheral. - * @param TIM_InputTriggerSource: The Input Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal Trigger 0 - * @arg TIM_TS_ITR1: Internal Trigger 1 - * @arg TIM_TS_ITR2: Internal Trigger 2 - * @arg TIM_TS_ITR3: Internal Trigger 3 - * @arg TIM_TS_TI1F_ED: TI1 Edge Detector - * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 - * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 - * @arg TIM_TS_ETRF: External Trigger input - * @retval None - */ -void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource) -{ - uint16_t tmpsmcr = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource)); - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - - /* Reset the TS Bits */ - tmpsmcr &= (uint16_t)~TIM_SMCR_TS; - - /* Set the Input Trigger source */ - tmpsmcr |= TIM_InputTriggerSource; - - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Selects the TIMx Trigger Output Mode. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 6, 7 or 8 to select the TIM peripheral. - * - * @param TIM_TRGOSource: specifies the Trigger Output source. - * This parameter can be one of the following values: - * - * - For all TIMx - * @arg TIM_TRGOSource_Reset: The UG bit in the TIM_EGR register is used as the trigger output(TRGO) - * @arg TIM_TRGOSource_Enable: The Counter Enable CEN is used as the trigger output(TRGO) - * @arg TIM_TRGOSource_Update: The update event is selected as the trigger output(TRGO) - * - * - For all TIMx except TIM6 and TIM7 - * @arg TIM_TRGOSource_OC1: The trigger output sends a positive pulse when the CC1IF flag - * is to be set, as soon as a capture or compare match occurs(TRGO) - * @arg TIM_TRGOSource_OC1Ref: OC1REF signal is used as the trigger output(TRGO) - * @arg TIM_TRGOSource_OC2Ref: OC2REF signal is used as the trigger output(TRGO) - * @arg TIM_TRGOSource_OC3Ref: OC3REF signal is used as the trigger output(TRGO) - * @arg TIM_TRGOSource_OC4Ref: OC4REF signal is used as the trigger output(TRGO) - * - * @retval None - */ -void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST5_PERIPH(TIMx)); - assert_param(IS_TIM_TRGO_SOURCE(TIM_TRGOSource)); - - /* Reset the MMS Bits */ - TIMx->CR2 &= (uint16_t)~TIM_CR2_MMS; - /* Select the TRGO source */ - TIMx->CR2 |= TIM_TRGOSource; -} - -/** - * @brief Selects the TIMx Slave Mode. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM peripheral. - * @param TIM_SlaveMode: specifies the Timer Slave Mode. - * This parameter can be one of the following values: - * @arg TIM_SlaveMode_Reset: Rising edge of the selected trigger signal(TRGI) reinitialize - * the counter and triggers an update of the registers - * @arg TIM_SlaveMode_Gated: The counter clock is enabled when the trigger signal (TRGI) is high - * @arg TIM_SlaveMode_Trigger: The counter starts at a rising edge of the trigger TRGI - * @arg TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter - * @retval None - */ -void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_SLAVE_MODE(TIM_SlaveMode)); - - /* Reset the SMS Bits */ - TIMx->SMCR &= (uint16_t)~TIM_SMCR_SMS; - - /* Select the Slave Mode */ - TIMx->SMCR |= TIM_SlaveMode; -} - -/** - * @brief Sets or Resets the TIMx Master/Slave Mode. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM peripheral. - * @param TIM_MasterSlaveMode: specifies the Timer Master Slave Mode. - * This parameter can be one of the following values: - * @arg TIM_MasterSlaveMode_Enable: synchronization between the current timer - * and its slaves (through TRGO) - * @arg TIM_MasterSlaveMode_Disable: No action - * @retval None - */ -void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_MSM_STATE(TIM_MasterSlaveMode)); - - /* Reset the MSM Bit */ - TIMx->SMCR &= (uint16_t)~TIM_SMCR_MSM; - - /* Set or Reset the MSM Bit */ - TIMx->SMCR |= TIM_MasterSlaveMode; -} - -/** - * @brief Configures the TIMx External Trigger (ETR). - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF. - * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. - * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. - * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity: The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. - * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. - * @param ExtTRGFilter: External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, - uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter) -{ - uint16_t tmpsmcr = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST3_PERIPH(TIMx)); - assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler)); - assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity)); - assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter)); - - tmpsmcr = TIMx->SMCR; - - /* Reset the ETR Bits */ - tmpsmcr &= SMCR_ETR_MASK; - - /* Set the Prescaler, the Filter value and the Polarity */ - tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8))); - - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} -/** - * @} - */ - -/** @defgroup TIM_Group8 Specific interface management functions - * @brief Specific interface management functions - * -@verbatim - =============================================================================== - Specific interface management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Configures the TIMx Encoder Interface. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @param TIM_EncoderMode: specifies the TIMx Encoder Mode. - * This parameter can be one of the following values: - * @arg TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level. - * @arg TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level. - * @arg TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending - * on the level of the other input. - * @param TIM_IC1Polarity: specifies the IC1 Polarity - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Falling: IC Falling edge. - * @arg TIM_ICPolarity_Rising: IC Rising edge. - * @param TIM_IC2Polarity: specifies the IC2 Polarity - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Falling: IC Falling edge. - * @arg TIM_ICPolarity_Rising: IC Rising edge. - * @retval None - */ -void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, - uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity) -{ - uint16_t tmpsmcr = 0; - uint16_t tmpccmr1 = 0; - uint16_t tmpccer = 0; - - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_TIM_ENCODER_MODE(TIM_EncoderMode)); - assert_param(IS_TIM_IC_POLARITY(TIM_IC1Polarity)); - assert_param(IS_TIM_IC_POLARITY(TIM_IC2Polarity)); - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = TIMx->CCMR1; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - - /* Set the encoder Mode */ - tmpsmcr &= (uint16_t)~TIM_SMCR_SMS; - tmpsmcr |= TIM_EncoderMode; - - /* Select the Capture Compare 1 and the Capture Compare 2 as input */ - tmpccmr1 &= ((uint16_t)~TIM_CCMR1_CC1S) & ((uint16_t)~TIM_CCMR1_CC2S); - tmpccmr1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; - - /* Set the TI1 and the TI2 Polarities */ - tmpccer &= ((uint16_t)~TIM_CCER_CC1P) & ((uint16_t)~TIM_CCER_CC2P); - tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4)); - - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmr1; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Enables or disables the TIMx's Hall sensor interface. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @param NewState: new state of the TIMx Hall sensor interface. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST2_PERIPH(TIMx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Set the TI1S Bit */ - TIMx->CR2 |= TIM_CR2_TI1S; - } - else - { - /* Reset the TI1S Bit */ - TIMx->CR2 &= (uint16_t)~TIM_CR2_TI1S; - } -} -/** - * @} - */ - -/** @defgroup TIM_Group9 Specific remapping management function - * @brief Specific remapping management function - * -@verbatim - =============================================================================== - Specific remapping management function - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Configures the TIM2, TIM5 and TIM11 Remapping input capabilities. - * @param TIMx: where x can be 2, 5 or 11 to select the TIM peripheral. - * @param TIM_Remap: specifies the TIM input remapping source. - * This parameter can be one of the following values: - * @arg TIM2_TIM8_TRGO: TIM2 ITR1 input is connected to TIM8 Trigger output(default) - * @arg TIM2_ETH_PTP: TIM2 ITR1 input is connected to ETH PTP trogger output. - * @arg TIM2_USBFS_SOF: TIM2 ITR1 input is connected to USB FS SOF. - * @arg TIM2_USBHS_SOF: TIM2 ITR1 input is connected to USB HS SOF. - * @arg TIM5_GPIO: TIM5 CH4 input is connected to dedicated Timer pin(default) - * @arg TIM5_LSI: TIM5 CH4 input is connected to LSI clock. - * @arg TIM5_LSE: TIM5 CH4 input is connected to LSE clock. - * @arg TIM5_RTC: TIM5 CH4 input is connected to RTC Output event. - * @arg TIM11_GPIO: TIM11 CH4 input is connected to dedicated Timer pin(default) - * @arg TIM11_HSE: TIM11 CH4 input is connected to HSE_RTC clock - * (HSE divided by a programmable prescaler) - * @retval None - */ -void TIM_RemapConfig(TIM_TypeDef* TIMx, uint16_t TIM_Remap) -{ - /* Check the parameters */ - assert_param(IS_TIM_LIST6_PERIPH(TIMx)); - assert_param(IS_TIM_REMAP(TIM_Remap)); - - /* Set the Timer remapping configuration */ - TIMx->OR = TIM_Remap; -} -/** - * @} - */ - -/** - * @brief Configure the TI1 as Input. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13 or 14 - * to select the TIM peripheral. - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @arg TIM_ICPolarity_BothEdge - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 1 is selected to be connected to IC1. - * @arg TIM_ICSelection_IndirectTI: TIM Input 1 is selected to be connected to IC2. - * @arg TIM_ICSelection_TRC: TIM Input 1 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter) -{ - uint16_t tmpccmr1 = 0, tmpccer = 0; - - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= (uint16_t)~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - - /* Select the Input and set the filter */ - tmpccmr1 &= ((uint16_t)~TIM_CCMR1_CC1S) & ((uint16_t)~TIM_CCMR1_IC1F); - tmpccmr1 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= (uint16_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC1E); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI2 as Input. - * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9 or 12 to select the TIM - * peripheral. - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @arg TIM_ICPolarity_BothEdge - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 2 is selected to be connected to IC2. - * @arg TIM_ICSelection_IndirectTI: TIM Input 2 is selected to be connected to IC1. - * @arg TIM_ICSelection_TRC: TIM Input 2 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter) -{ - uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= (uint16_t)~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - tmp = (uint16_t)(TIM_ICPolarity << 4); - - /* Select the Input and set the filter */ - tmpccmr1 &= ((uint16_t)~TIM_CCMR1_CC2S) & ((uint16_t)~TIM_CCMR1_IC2F); - tmpccmr1 |= (uint16_t)(TIM_ICFilter << 12); - tmpccmr1 |= (uint16_t)(TIM_ICSelection << 8); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= (uint16_t)~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC2E); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI3 as Input. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @arg TIM_ICPolarity_BothEdge - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 3 is selected to be connected to IC3. - * @arg TIM_ICSelection_IndirectTI: TIM Input 3 is selected to be connected to IC4. - * @arg TIM_ICSelection_TRC: TIM Input 3 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter) -{ - uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; - - /* Disable the Channel 3: Reset the CC3E Bit */ - TIMx->CCER &= (uint16_t)~TIM_CCER_CC3E; - tmpccmr2 = TIMx->CCMR2; - tmpccer = TIMx->CCER; - tmp = (uint16_t)(TIM_ICPolarity << 8); - - /* Select the Input and set the filter */ - tmpccmr2 &= ((uint16_t)~TIM_CCMR1_CC1S) & ((uint16_t)~TIM_CCMR2_IC3F); - tmpccmr2 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); - - /* Select the Polarity and set the CC3E Bit */ - tmpccer &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP); - tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC3E); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI4 as Input. - * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @arg TIM_ICPolarity_BothEdge - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 4 is selected to be connected to IC4. - * @arg TIM_ICSelection_IndirectTI: TIM Input 4 is selected to be connected to IC3. - * @arg TIM_ICSelection_TRC: TIM Input 4 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, - uint16_t TIM_ICFilter) -{ - uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= (uint16_t)~TIM_CCER_CC4E; - tmpccmr2 = TIMx->CCMR2; - tmpccer = TIMx->CCER; - tmp = (uint16_t)(TIM_ICPolarity << 12); - - /* Select the Input and set the filter */ - tmpccmr2 &= ((uint16_t)~TIM_CCMR1_CC2S) & ((uint16_t)~TIM_CCMR1_IC2F); - tmpccmr2 |= (uint16_t)(TIM_ICSelection << 8); - tmpccmr2 |= (uint16_t)(TIM_ICFilter << 12); - - /* Select the Polarity and set the CC4E Bit */ - tmpccer &= (uint16_t)~(TIM_CCER_CC4P | TIM_CCER_CC4NP); - tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC4E); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer ; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_tim.h b/car_hw/src/lib/stdperiph/stm32f4xx_tim.h deleted file mode 100644 index a136f882073..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_tim.h +++ /dev/null @@ -1,1144 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_tim.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the TIM firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_TIM_H -#define __STM32F4xx_TIM_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup TIM - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief TIM Time Base Init structure definition - * @note This structure is used with all TIMx except for TIM6 and TIM7. - */ - -typedef struct -{ - uint16_t TIM_Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. - This parameter can be a number between 0x0000 and 0xFFFF */ - - uint16_t TIM_CounterMode; /*!< Specifies the counter mode. - This parameter can be a value of @ref TIM_Counter_Mode */ - - uint32_t TIM_Period; /*!< Specifies the period value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter must be a number between 0x0000 and 0xFFFF. */ - - uint16_t TIM_ClockDivision; /*!< Specifies the clock division. - This parameter can be a value of @ref TIM_Clock_Division_CKD */ - - uint8_t TIM_RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter - reaches zero, an update event is generated and counting restarts - from the RCR value (N). - This means in PWM mode that (N+1) corresponds to: - - the number of PWM periods in edge-aligned mode - - the number of half PWM period in center-aligned mode - This parameter must be a number between 0x00 and 0xFF. - @note This parameter is valid only for TIM1 and TIM8. */ -} TIM_TimeBaseInitTypeDef; - -/** - * @brief TIM Output Compare Init structure definition - */ - -typedef struct -{ - uint16_t TIM_OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint16_t TIM_OutputState; /*!< Specifies the TIM Output Compare state. - This parameter can be a value of @ref TIM_Output_Compare_State */ - - uint16_t TIM_OutputNState; /*!< Specifies the TIM complementary Output Compare state. - This parameter can be a value of @ref TIM_Output_Compare_N_State - @note This parameter is valid only for TIM1 and TIM8. */ - - uint32_t TIM_Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between 0x0000 and 0xFFFF */ - - uint16_t TIM_OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint16_t TIM_OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for TIM1 and TIM8. */ - - uint16_t TIM_OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for TIM1 and TIM8. */ - - uint16_t TIM_OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for TIM1 and TIM8. */ -} TIM_OCInitTypeDef; - -/** - * @brief TIM Input Capture Init structure definition - */ - -typedef struct -{ - - uint16_t TIM_Channel; /*!< Specifies the TIM channel. - This parameter can be a value of @ref TIM_Channel */ - - uint16_t TIM_ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint16_t TIM_ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint16_t TIM_ICPrescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint16_t TIM_ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between 0x0 and 0xF */ -} TIM_ICInitTypeDef; - -/** - * @brief BDTR structure definition - * @note This structure is used only with TIM1 and TIM8. - */ - -typedef struct -{ - - uint16_t TIM_OSSRState; /*!< Specifies the Off-State selection used in Run mode. - This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */ - - uint16_t TIM_OSSIState; /*!< Specifies the Off-State used in Idle state. - This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */ - - uint16_t TIM_LOCKLevel; /*!< Specifies the LOCK level parameters. - This parameter can be a value of @ref TIM_Lock_level */ - - uint16_t TIM_DeadTime; /*!< Specifies the delay time between the switching-off and the - switching-on of the outputs. - This parameter can be a number between 0x00 and 0xFF */ - - uint16_t TIM_Break; /*!< Specifies whether the TIM Break input is enabled or not. - This parameter can be a value of @ref TIM_Break_Input_enable_disable */ - - uint16_t TIM_BreakPolarity; /*!< Specifies the TIM Break Input pin polarity. - This parameter can be a value of @ref TIM_Break_Polarity */ - - uint16_t TIM_AutomaticOutput; /*!< Specifies whether the TIM Automatic Output feature is enabled or not. - This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ -} TIM_BDTRInitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup TIM_Exported_constants - * @{ - */ - -#define IS_TIM_ALL_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM4) || \ - ((PERIPH) == TIM5) || \ - ((PERIPH) == TIM6) || \ - ((PERIPH) == TIM7) || \ - ((PERIPH) == TIM8) || \ - ((PERIPH) == TIM9) || \ - ((PERIPH) == TIM10) || \ - ((PERIPH) == TIM11) || \ - ((PERIPH) == TIM12) || \ - (((PERIPH) == TIM13) || \ - ((PERIPH) == TIM14))) -/* LIST1: TIM1, TIM2, TIM3, TIM4, TIM5, TIM8, TIM9, TIM10, TIM11, TIM12, TIM13 and TIM14 */ -#define IS_TIM_LIST1_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM4) || \ - ((PERIPH) == TIM5) || \ - ((PERIPH) == TIM8) || \ - ((PERIPH) == TIM9) || \ - ((PERIPH) == TIM10) || \ - ((PERIPH) == TIM11) || \ - ((PERIPH) == TIM12) || \ - ((PERIPH) == TIM13) || \ - ((PERIPH) == TIM14)) - -/* LIST2: TIM1, TIM2, TIM3, TIM4, TIM5, TIM8, TIM9 and TIM12 */ -#define IS_TIM_LIST2_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM4) || \ - ((PERIPH) == TIM5) || \ - ((PERIPH) == TIM8) || \ - ((PERIPH) == TIM9) || \ - ((PERIPH) == TIM12)) -/* LIST3: TIM1, TIM2, TIM3, TIM4, TIM5 and TIM8 */ -#define IS_TIM_LIST3_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM4) || \ - ((PERIPH) == TIM5) || \ - ((PERIPH) == TIM8)) -/* LIST4: TIM1 and TIM8 */ -#define IS_TIM_LIST4_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM8)) -/* LIST5: TIM1, TIM2, TIM3, TIM4, TIM5, TIM6, TIM7 and TIM8 */ -#define IS_TIM_LIST5_PERIPH(PERIPH) (((PERIPH) == TIM1) || \ - ((PERIPH) == TIM2) || \ - ((PERIPH) == TIM3) || \ - ((PERIPH) == TIM4) || \ - ((PERIPH) == TIM5) || \ - ((PERIPH) == TIM6) || \ - ((PERIPH) == TIM7) || \ - ((PERIPH) == TIM8)) -/* LIST6: TIM2, TIM5 and TIM11 */ -#define IS_TIM_LIST6_PERIPH(TIMx)(((TIMx) == TIM2) || \ - ((TIMx) == TIM5) || \ - ((TIMx) == TIM11)) - -/** @defgroup TIM_Output_Compare_and_PWM_modes - * @{ - */ - -#define TIM_OCMode_Timing ((uint16_t)0x0000) -#define TIM_OCMode_Active ((uint16_t)0x0010) -#define TIM_OCMode_Inactive ((uint16_t)0x0020) -#define TIM_OCMode_Toggle ((uint16_t)0x0030) -#define TIM_OCMode_PWM1 ((uint16_t)0x0060) -#define TIM_OCMode_PWM2 ((uint16_t)0x0070) -#define IS_TIM_OC_MODE(MODE) (((MODE) == TIM_OCMode_Timing) || \ - ((MODE) == TIM_OCMode_Active) || \ - ((MODE) == TIM_OCMode_Inactive) || \ - ((MODE) == TIM_OCMode_Toggle)|| \ - ((MODE) == TIM_OCMode_PWM1) || \ - ((MODE) == TIM_OCMode_PWM2)) -#define IS_TIM_OCM(MODE) (((MODE) == TIM_OCMode_Timing) || \ - ((MODE) == TIM_OCMode_Active) || \ - ((MODE) == TIM_OCMode_Inactive) || \ - ((MODE) == TIM_OCMode_Toggle)|| \ - ((MODE) == TIM_OCMode_PWM1) || \ - ((MODE) == TIM_OCMode_PWM2) || \ - ((MODE) == TIM_ForcedAction_Active) || \ - ((MODE) == TIM_ForcedAction_InActive)) -/** - * @} - */ - -/** @defgroup TIM_One_Pulse_Mode - * @{ - */ - -#define TIM_OPMode_Single ((uint16_t)0x0008) -#define TIM_OPMode_Repetitive ((uint16_t)0x0000) -#define IS_TIM_OPM_MODE(MODE) (((MODE) == TIM_OPMode_Single) || \ - ((MODE) == TIM_OPMode_Repetitive)) -/** - * @} - */ - -/** @defgroup TIM_Channel - * @{ - */ - -#define TIM_Channel_1 ((uint16_t)0x0000) -#define TIM_Channel_2 ((uint16_t)0x0004) -#define TIM_Channel_3 ((uint16_t)0x0008) -#define TIM_Channel_4 ((uint16_t)0x000C) - -#define IS_TIM_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ - ((CHANNEL) == TIM_Channel_2) || \ - ((CHANNEL) == TIM_Channel_3) || \ - ((CHANNEL) == TIM_Channel_4)) - -#define IS_TIM_PWMI_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ - ((CHANNEL) == TIM_Channel_2)) -#define IS_TIM_COMPLEMENTARY_CHANNEL(CHANNEL) (((CHANNEL) == TIM_Channel_1) || \ - ((CHANNEL) == TIM_Channel_2) || \ - ((CHANNEL) == TIM_Channel_3)) -/** - * @} - */ - -/** @defgroup TIM_Clock_Division_CKD - * @{ - */ - -#define TIM_CKD_DIV1 ((uint16_t)0x0000) -#define TIM_CKD_DIV2 ((uint16_t)0x0100) -#define TIM_CKD_DIV4 ((uint16_t)0x0200) -#define IS_TIM_CKD_DIV(DIV) (((DIV) == TIM_CKD_DIV1) || \ - ((DIV) == TIM_CKD_DIV2) || \ - ((DIV) == TIM_CKD_DIV4)) -/** - * @} - */ - -/** @defgroup TIM_Counter_Mode - * @{ - */ - -#define TIM_CounterMode_Up ((uint16_t)0x0000) -#define TIM_CounterMode_Down ((uint16_t)0x0010) -#define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) -#define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) -#define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) -#define IS_TIM_COUNTER_MODE(MODE) (((MODE) == TIM_CounterMode_Up) || \ - ((MODE) == TIM_CounterMode_Down) || \ - ((MODE) == TIM_CounterMode_CenterAligned1) || \ - ((MODE) == TIM_CounterMode_CenterAligned2) || \ - ((MODE) == TIM_CounterMode_CenterAligned3)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Polarity - * @{ - */ - -#define TIM_OCPolarity_High ((uint16_t)0x0000) -#define TIM_OCPolarity_Low ((uint16_t)0x0002) -#define IS_TIM_OC_POLARITY(POLARITY) (((POLARITY) == TIM_OCPolarity_High) || \ - ((POLARITY) == TIM_OCPolarity_Low)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Polarity - * @{ - */ - -#define TIM_OCNPolarity_High ((uint16_t)0x0000) -#define TIM_OCNPolarity_Low ((uint16_t)0x0008) -#define IS_TIM_OCN_POLARITY(POLARITY) (((POLARITY) == TIM_OCNPolarity_High) || \ - ((POLARITY) == TIM_OCNPolarity_Low)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_State - * @{ - */ - -#define TIM_OutputState_Disable ((uint16_t)0x0000) -#define TIM_OutputState_Enable ((uint16_t)0x0001) -#define IS_TIM_OUTPUT_STATE(STATE) (((STATE) == TIM_OutputState_Disable) || \ - ((STATE) == TIM_OutputState_Enable)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_State - * @{ - */ - -#define TIM_OutputNState_Disable ((uint16_t)0x0000) -#define TIM_OutputNState_Enable ((uint16_t)0x0004) -#define IS_TIM_OUTPUTN_STATE(STATE) (((STATE) == TIM_OutputNState_Disable) || \ - ((STATE) == TIM_OutputNState_Enable)) -/** - * @} - */ - -/** @defgroup TIM_Capture_Compare_State - * @{ - */ - -#define TIM_CCx_Enable ((uint16_t)0x0001) -#define TIM_CCx_Disable ((uint16_t)0x0000) -#define IS_TIM_CCX(CCX) (((CCX) == TIM_CCx_Enable) || \ - ((CCX) == TIM_CCx_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Capture_Compare_N_State - * @{ - */ - -#define TIM_CCxN_Enable ((uint16_t)0x0004) -#define TIM_CCxN_Disable ((uint16_t)0x0000) -#define IS_TIM_CCXN(CCXN) (((CCXN) == TIM_CCxN_Enable) || \ - ((CCXN) == TIM_CCxN_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Break_Input_enable_disable - * @{ - */ - -#define TIM_Break_Enable ((uint16_t)0x1000) -#define TIM_Break_Disable ((uint16_t)0x0000) -#define IS_TIM_BREAK_STATE(STATE) (((STATE) == TIM_Break_Enable) || \ - ((STATE) == TIM_Break_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Break_Polarity - * @{ - */ - -#define TIM_BreakPolarity_Low ((uint16_t)0x0000) -#define TIM_BreakPolarity_High ((uint16_t)0x2000) -#define IS_TIM_BREAK_POLARITY(POLARITY) (((POLARITY) == TIM_BreakPolarity_Low) || \ - ((POLARITY) == TIM_BreakPolarity_High)) -/** - * @} - */ - -/** @defgroup TIM_AOE_Bit_Set_Reset - * @{ - */ - -#define TIM_AutomaticOutput_Enable ((uint16_t)0x4000) -#define TIM_AutomaticOutput_Disable ((uint16_t)0x0000) -#define IS_TIM_AUTOMATIC_OUTPUT_STATE(STATE) (((STATE) == TIM_AutomaticOutput_Enable) || \ - ((STATE) == TIM_AutomaticOutput_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Lock_level - * @{ - */ - -#define TIM_LOCKLevel_OFF ((uint16_t)0x0000) -#define TIM_LOCKLevel_1 ((uint16_t)0x0100) -#define TIM_LOCKLevel_2 ((uint16_t)0x0200) -#define TIM_LOCKLevel_3 ((uint16_t)0x0300) -#define IS_TIM_LOCK_LEVEL(LEVEL) (((LEVEL) == TIM_LOCKLevel_OFF) || \ - ((LEVEL) == TIM_LOCKLevel_1) || \ - ((LEVEL) == TIM_LOCKLevel_2) || \ - ((LEVEL) == TIM_LOCKLevel_3)) -/** - * @} - */ - -/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state - * @{ - */ - -#define TIM_OSSIState_Enable ((uint16_t)0x0400) -#define TIM_OSSIState_Disable ((uint16_t)0x0000) -#define IS_TIM_OSSI_STATE(STATE) (((STATE) == TIM_OSSIState_Enable) || \ - ((STATE) == TIM_OSSIState_Disable)) -/** - * @} - */ - -/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state - * @{ - */ - -#define TIM_OSSRState_Enable ((uint16_t)0x0800) -#define TIM_OSSRState_Disable ((uint16_t)0x0000) -#define IS_TIM_OSSR_STATE(STATE) (((STATE) == TIM_OSSRState_Enable) || \ - ((STATE) == TIM_OSSRState_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Idle_State - * @{ - */ - -#define TIM_OCIdleState_Set ((uint16_t)0x0100) -#define TIM_OCIdleState_Reset ((uint16_t)0x0000) -#define IS_TIM_OCIDLE_STATE(STATE) (((STATE) == TIM_OCIdleState_Set) || \ - ((STATE) == TIM_OCIdleState_Reset)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Idle_State - * @{ - */ - -#define TIM_OCNIdleState_Set ((uint16_t)0x0200) -#define TIM_OCNIdleState_Reset ((uint16_t)0x0000) -#define IS_TIM_OCNIDLE_STATE(STATE) (((STATE) == TIM_OCNIdleState_Set) || \ - ((STATE) == TIM_OCNIdleState_Reset)) -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Polarity - * @{ - */ - -#define TIM_ICPolarity_Rising ((uint16_t)0x0000) -#define TIM_ICPolarity_Falling ((uint16_t)0x0002) -#define TIM_ICPolarity_BothEdge ((uint16_t)0x000A) -#define IS_TIM_IC_POLARITY(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || \ - ((POLARITY) == TIM_ICPolarity_Falling)|| \ - ((POLARITY) == TIM_ICPolarity_BothEdge)) -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Selection - * @{ - */ - -#define TIM_ICSelection_DirectTI ((uint16_t)0x0001) /*!< TIM Input 1, 2, 3 or 4 is selected to be - connected to IC1, IC2, IC3 or IC4, respectively */ -#define TIM_ICSelection_IndirectTI ((uint16_t)0x0002) /*!< TIM Input 1, 2, 3 or 4 is selected to be - connected to IC2, IC1, IC4 or IC3, respectively. */ -#define TIM_ICSelection_TRC ((uint16_t)0x0003) /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC. */ -#define IS_TIM_IC_SELECTION(SELECTION) (((SELECTION) == TIM_ICSelection_DirectTI) || \ - ((SELECTION) == TIM_ICSelection_IndirectTI) || \ - ((SELECTION) == TIM_ICSelection_TRC)) -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Prescaler - * @{ - */ - -#define TIM_ICPSC_DIV1 ((uint16_t)0x0000) /*!< Capture performed each time an edge is detected on the capture input. */ -#define TIM_ICPSC_DIV2 ((uint16_t)0x0004) /*!< Capture performed once every 2 events. */ -#define TIM_ICPSC_DIV4 ((uint16_t)0x0008) /*!< Capture performed once every 4 events. */ -#define TIM_ICPSC_DIV8 ((uint16_t)0x000C) /*!< Capture performed once every 8 events. */ -#define IS_TIM_IC_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ICPSC_DIV1) || \ - ((PRESCALER) == TIM_ICPSC_DIV2) || \ - ((PRESCALER) == TIM_ICPSC_DIV4) || \ - ((PRESCALER) == TIM_ICPSC_DIV8)) -/** - * @} - */ - -/** @defgroup TIM_interrupt_sources - * @{ - */ - -#define TIM_IT_Update ((uint16_t)0x0001) -#define TIM_IT_CC1 ((uint16_t)0x0002) -#define TIM_IT_CC2 ((uint16_t)0x0004) -#define TIM_IT_CC3 ((uint16_t)0x0008) -#define TIM_IT_CC4 ((uint16_t)0x0010) -#define TIM_IT_COM ((uint16_t)0x0020) -#define TIM_IT_Trigger ((uint16_t)0x0040) -#define TIM_IT_Break ((uint16_t)0x0080) -#define IS_TIM_IT(IT) ((((IT) & (uint16_t)0xFF00) == 0x0000) && ((IT) != 0x0000)) - -#define IS_TIM_GET_IT(IT) (((IT) == TIM_IT_Update) || \ - ((IT) == TIM_IT_CC1) || \ - ((IT) == TIM_IT_CC2) || \ - ((IT) == TIM_IT_CC3) || \ - ((IT) == TIM_IT_CC4) || \ - ((IT) == TIM_IT_COM) || \ - ((IT) == TIM_IT_Trigger) || \ - ((IT) == TIM_IT_Break)) -/** - * @} - */ - -/** @defgroup TIM_DMA_Base_address - * @{ - */ - -#define TIM_DMABase_CR1 ((uint16_t)0x0000) -#define TIM_DMABase_CR2 ((uint16_t)0x0001) -#define TIM_DMABase_SMCR ((uint16_t)0x0002) -#define TIM_DMABase_DIER ((uint16_t)0x0003) -#define TIM_DMABase_SR ((uint16_t)0x0004) -#define TIM_DMABase_EGR ((uint16_t)0x0005) -#define TIM_DMABase_CCMR1 ((uint16_t)0x0006) -#define TIM_DMABase_CCMR2 ((uint16_t)0x0007) -#define TIM_DMABase_CCER ((uint16_t)0x0008) -#define TIM_DMABase_CNT ((uint16_t)0x0009) -#define TIM_DMABase_PSC ((uint16_t)0x000A) -#define TIM_DMABase_ARR ((uint16_t)0x000B) -#define TIM_DMABase_RCR ((uint16_t)0x000C) -#define TIM_DMABase_CCR1 ((uint16_t)0x000D) -#define TIM_DMABase_CCR2 ((uint16_t)0x000E) -#define TIM_DMABase_CCR3 ((uint16_t)0x000F) -#define TIM_DMABase_CCR4 ((uint16_t)0x0010) -#define TIM_DMABase_BDTR ((uint16_t)0x0011) -#define TIM_DMABase_DCR ((uint16_t)0x0012) -#define TIM_DMABase_OR ((uint16_t)0x0013) -#define IS_TIM_DMA_BASE(BASE) (((BASE) == TIM_DMABase_CR1) || \ - ((BASE) == TIM_DMABase_CR2) || \ - ((BASE) == TIM_DMABase_SMCR) || \ - ((BASE) == TIM_DMABase_DIER) || \ - ((BASE) == TIM_DMABase_SR) || \ - ((BASE) == TIM_DMABase_EGR) || \ - ((BASE) == TIM_DMABase_CCMR1) || \ - ((BASE) == TIM_DMABase_CCMR2) || \ - ((BASE) == TIM_DMABase_CCER) || \ - ((BASE) == TIM_DMABase_CNT) || \ - ((BASE) == TIM_DMABase_PSC) || \ - ((BASE) == TIM_DMABase_ARR) || \ - ((BASE) == TIM_DMABase_RCR) || \ - ((BASE) == TIM_DMABase_CCR1) || \ - ((BASE) == TIM_DMABase_CCR2) || \ - ((BASE) == TIM_DMABase_CCR3) || \ - ((BASE) == TIM_DMABase_CCR4) || \ - ((BASE) == TIM_DMABase_BDTR) || \ - ((BASE) == TIM_DMABase_DCR) || \ - ((BASE) == TIM_DMABase_OR)) -/** - * @} - */ - -/** @defgroup TIM_DMA_Burst_Length - * @{ - */ - -#define TIM_DMABurstLength_1Transfer ((uint16_t)0x0000) -#define TIM_DMABurstLength_2Transfers ((uint16_t)0x0100) -#define TIM_DMABurstLength_3Transfers ((uint16_t)0x0200) -#define TIM_DMABurstLength_4Transfers ((uint16_t)0x0300) -#define TIM_DMABurstLength_5Transfers ((uint16_t)0x0400) -#define TIM_DMABurstLength_6Transfers ((uint16_t)0x0500) -#define TIM_DMABurstLength_7Transfers ((uint16_t)0x0600) -#define TIM_DMABurstLength_8Transfers ((uint16_t)0x0700) -#define TIM_DMABurstLength_9Transfers ((uint16_t)0x0800) -#define TIM_DMABurstLength_10Transfers ((uint16_t)0x0900) -#define TIM_DMABurstLength_11Transfers ((uint16_t)0x0A00) -#define TIM_DMABurstLength_12Transfers ((uint16_t)0x0B00) -#define TIM_DMABurstLength_13Transfers ((uint16_t)0x0C00) -#define TIM_DMABurstLength_14Transfers ((uint16_t)0x0D00) -#define TIM_DMABurstLength_15Transfers ((uint16_t)0x0E00) -#define TIM_DMABurstLength_16Transfers ((uint16_t)0x0F00) -#define TIM_DMABurstLength_17Transfers ((uint16_t)0x1000) -#define TIM_DMABurstLength_18Transfers ((uint16_t)0x1100) -#define IS_TIM_DMA_LENGTH(LENGTH) (((LENGTH) == TIM_DMABurstLength_1Transfer) || \ - ((LENGTH) == TIM_DMABurstLength_2Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_3Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_4Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_5Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_6Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_7Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_8Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_9Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_10Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_11Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_12Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_13Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_14Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_15Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_16Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_17Transfers) || \ - ((LENGTH) == TIM_DMABurstLength_18Transfers)) -/** - * @} - */ - -/** @defgroup TIM_DMA_sources - * @{ - */ - -#define TIM_DMA_Update ((uint16_t)0x0100) -#define TIM_DMA_CC1 ((uint16_t)0x0200) -#define TIM_DMA_CC2 ((uint16_t)0x0400) -#define TIM_DMA_CC3 ((uint16_t)0x0800) -#define TIM_DMA_CC4 ((uint16_t)0x1000) -#define TIM_DMA_COM ((uint16_t)0x2000) -#define TIM_DMA_Trigger ((uint16_t)0x4000) -#define IS_TIM_DMA_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0x80FF) == 0x0000) && ((SOURCE) != 0x0000)) - -/** - * @} - */ - -/** @defgroup TIM_External_Trigger_Prescaler - * @{ - */ - -#define TIM_ExtTRGPSC_OFF ((uint16_t)0x0000) -#define TIM_ExtTRGPSC_DIV2 ((uint16_t)0x1000) -#define TIM_ExtTRGPSC_DIV4 ((uint16_t)0x2000) -#define TIM_ExtTRGPSC_DIV8 ((uint16_t)0x3000) -#define IS_TIM_EXT_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ExtTRGPSC_OFF) || \ - ((PRESCALER) == TIM_ExtTRGPSC_DIV2) || \ - ((PRESCALER) == TIM_ExtTRGPSC_DIV4) || \ - ((PRESCALER) == TIM_ExtTRGPSC_DIV8)) -/** - * @} - */ - -/** @defgroup TIM_Internal_Trigger_Selection - * @{ - */ - -#define TIM_TS_ITR0 ((uint16_t)0x0000) -#define TIM_TS_ITR1 ((uint16_t)0x0010) -#define TIM_TS_ITR2 ((uint16_t)0x0020) -#define TIM_TS_ITR3 ((uint16_t)0x0030) -#define TIM_TS_TI1F_ED ((uint16_t)0x0040) -#define TIM_TS_TI1FP1 ((uint16_t)0x0050) -#define TIM_TS_TI2FP2 ((uint16_t)0x0060) -#define TIM_TS_ETRF ((uint16_t)0x0070) -#define IS_TIM_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ - ((SELECTION) == TIM_TS_ITR1) || \ - ((SELECTION) == TIM_TS_ITR2) || \ - ((SELECTION) == TIM_TS_ITR3) || \ - ((SELECTION) == TIM_TS_TI1F_ED) || \ - ((SELECTION) == TIM_TS_TI1FP1) || \ - ((SELECTION) == TIM_TS_TI2FP2) || \ - ((SELECTION) == TIM_TS_ETRF)) -#define IS_TIM_INTERNAL_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ - ((SELECTION) == TIM_TS_ITR1) || \ - ((SELECTION) == TIM_TS_ITR2) || \ - ((SELECTION) == TIM_TS_ITR3)) -/** - * @} - */ - -/** @defgroup TIM_TIx_External_Clock_Source - * @{ - */ - -#define TIM_TIxExternalCLK1Source_TI1 ((uint16_t)0x0050) -#define TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060) -#define TIM_TIxExternalCLK1Source_TI1ED ((uint16_t)0x0040) - -/** - * @} - */ - -/** @defgroup TIM_External_Trigger_Polarity - * @{ - */ -#define TIM_ExtTRGPolarity_Inverted ((uint16_t)0x8000) -#define TIM_ExtTRGPolarity_NonInverted ((uint16_t)0x0000) -#define IS_TIM_EXT_POLARITY(POLARITY) (((POLARITY) == TIM_ExtTRGPolarity_Inverted) || \ - ((POLARITY) == TIM_ExtTRGPolarity_NonInverted)) -/** - * @} - */ - -/** @defgroup TIM_Prescaler_Reload_Mode - * @{ - */ - -#define TIM_PSCReloadMode_Update ((uint16_t)0x0000) -#define TIM_PSCReloadMode_Immediate ((uint16_t)0x0001) -#define IS_TIM_PRESCALER_RELOAD(RELOAD) (((RELOAD) == TIM_PSCReloadMode_Update) || \ - ((RELOAD) == TIM_PSCReloadMode_Immediate)) -/** - * @} - */ - -/** @defgroup TIM_Forced_Action - * @{ - */ - -#define TIM_ForcedAction_Active ((uint16_t)0x0050) -#define TIM_ForcedAction_InActive ((uint16_t)0x0040) -#define IS_TIM_FORCED_ACTION(ACTION) (((ACTION) == TIM_ForcedAction_Active) || \ - ((ACTION) == TIM_ForcedAction_InActive)) -/** - * @} - */ - -/** @defgroup TIM_Encoder_Mode - * @{ - */ - -#define TIM_EncoderMode_TI1 ((uint16_t)0x0001) -#define TIM_EncoderMode_TI2 ((uint16_t)0x0002) -#define TIM_EncoderMode_TI12 ((uint16_t)0x0003) -#define IS_TIM_ENCODER_MODE(MODE) (((MODE) == TIM_EncoderMode_TI1) || \ - ((MODE) == TIM_EncoderMode_TI2) || \ - ((MODE) == TIM_EncoderMode_TI12)) -/** - * @} - */ - - -/** @defgroup TIM_Event_Source - * @{ - */ - -#define TIM_EventSource_Update ((uint16_t)0x0001) -#define TIM_EventSource_CC1 ((uint16_t)0x0002) -#define TIM_EventSource_CC2 ((uint16_t)0x0004) -#define TIM_EventSource_CC3 ((uint16_t)0x0008) -#define TIM_EventSource_CC4 ((uint16_t)0x0010) -#define TIM_EventSource_COM ((uint16_t)0x0020) -#define TIM_EventSource_Trigger ((uint16_t)0x0040) -#define TIM_EventSource_Break ((uint16_t)0x0080) -#define IS_TIM_EVENT_SOURCE(SOURCE) ((((SOURCE) & (uint16_t)0xFF00) == 0x0000) && ((SOURCE) != 0x0000)) - -/** - * @} - */ - -/** @defgroup TIM_Update_Source - * @{ - */ - -#define TIM_UpdateSource_Global ((uint16_t)0x0000) /*!< Source of update is the counter overflow/underflow - or the setting of UG bit, or an update generation - through the slave mode controller. */ -#define TIM_UpdateSource_Regular ((uint16_t)0x0001) /*!< Source of update is counter overflow/underflow. */ -#define IS_TIM_UPDATE_SOURCE(SOURCE) (((SOURCE) == TIM_UpdateSource_Global) || \ - ((SOURCE) == TIM_UpdateSource_Regular)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Preload_State - * @{ - */ - -#define TIM_OCPreload_Enable ((uint16_t)0x0008) -#define TIM_OCPreload_Disable ((uint16_t)0x0000) -#define IS_TIM_OCPRELOAD_STATE(STATE) (((STATE) == TIM_OCPreload_Enable) || \ - ((STATE) == TIM_OCPreload_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Fast_State - * @{ - */ - -#define TIM_OCFast_Enable ((uint16_t)0x0004) -#define TIM_OCFast_Disable ((uint16_t)0x0000) -#define IS_TIM_OCFAST_STATE(STATE) (((STATE) == TIM_OCFast_Enable) || \ - ((STATE) == TIM_OCFast_Disable)) - -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Clear_State - * @{ - */ - -#define TIM_OCClear_Enable ((uint16_t)0x0080) -#define TIM_OCClear_Disable ((uint16_t)0x0000) -#define IS_TIM_OCCLEAR_STATE(STATE) (((STATE) == TIM_OCClear_Enable) || \ - ((STATE) == TIM_OCClear_Disable)) -/** - * @} - */ - -/** @defgroup TIM_Trigger_Output_Source - * @{ - */ - -#define TIM_TRGOSource_Reset ((uint16_t)0x0000) -#define TIM_TRGOSource_Enable ((uint16_t)0x0010) -#define TIM_TRGOSource_Update ((uint16_t)0x0020) -#define TIM_TRGOSource_OC1 ((uint16_t)0x0030) -#define TIM_TRGOSource_OC1Ref ((uint16_t)0x0040) -#define TIM_TRGOSource_OC2Ref ((uint16_t)0x0050) -#define TIM_TRGOSource_OC3Ref ((uint16_t)0x0060) -#define TIM_TRGOSource_OC4Ref ((uint16_t)0x0070) -#define IS_TIM_TRGO_SOURCE(SOURCE) (((SOURCE) == TIM_TRGOSource_Reset) || \ - ((SOURCE) == TIM_TRGOSource_Enable) || \ - ((SOURCE) == TIM_TRGOSource_Update) || \ - ((SOURCE) == TIM_TRGOSource_OC1) || \ - ((SOURCE) == TIM_TRGOSource_OC1Ref) || \ - ((SOURCE) == TIM_TRGOSource_OC2Ref) || \ - ((SOURCE) == TIM_TRGOSource_OC3Ref) || \ - ((SOURCE) == TIM_TRGOSource_OC4Ref)) -/** - * @} - */ - -/** @defgroup TIM_Slave_Mode - * @{ - */ - -#define TIM_SlaveMode_Reset ((uint16_t)0x0004) -#define TIM_SlaveMode_Gated ((uint16_t)0x0005) -#define TIM_SlaveMode_Trigger ((uint16_t)0x0006) -#define TIM_SlaveMode_External1 ((uint16_t)0x0007) -#define IS_TIM_SLAVE_MODE(MODE) (((MODE) == TIM_SlaveMode_Reset) || \ - ((MODE) == TIM_SlaveMode_Gated) || \ - ((MODE) == TIM_SlaveMode_Trigger) || \ - ((MODE) == TIM_SlaveMode_External1)) -/** - * @} - */ - -/** @defgroup TIM_Master_Slave_Mode - * @{ - */ - -#define TIM_MasterSlaveMode_Enable ((uint16_t)0x0080) -#define TIM_MasterSlaveMode_Disable ((uint16_t)0x0000) -#define IS_TIM_MSM_STATE(STATE) (((STATE) == TIM_MasterSlaveMode_Enable) || \ - ((STATE) == TIM_MasterSlaveMode_Disable)) -/** - * @} - */ -/** @defgroup TIM_Remap - * @{ - */ - -#define TIM2_TIM8_TRGO ((uint16_t)0x0000) -#define TIM2_ETH_PTP ((uint16_t)0x0400) -#define TIM2_USBFS_SOF ((uint16_t)0x0800) -#define TIM2_USBHS_SOF ((uint16_t)0x0C00) - -#define TIM5_GPIO ((uint16_t)0x0000) -#define TIM5_LSI ((uint16_t)0x0040) -#define TIM5_LSE ((uint16_t)0x0080) -#define TIM5_RTC ((uint16_t)0x00C0) - -#define TIM11_GPIO ((uint16_t)0x0000) -#define TIM11_HSE ((uint16_t)0x0002) - -#define IS_TIM_REMAP(TIM_REMAP) (((TIM_REMAP) == TIM2_TIM8_TRGO)||\ - ((TIM_REMAP) == TIM2_ETH_PTP)||\ - ((TIM_REMAP) == TIM2_USBFS_SOF)||\ - ((TIM_REMAP) == TIM2_USBHS_SOF)||\ - ((TIM_REMAP) == TIM5_GPIO)||\ - ((TIM_REMAP) == TIM5_LSI)||\ - ((TIM_REMAP) == TIM5_LSE)||\ - ((TIM_REMAP) == TIM5_RTC)||\ - ((TIM_REMAP) == TIM11_GPIO)||\ - ((TIM_REMAP) == TIM11_HSE)) - -/** - * @} - */ -/** @defgroup TIM_Flags - * @{ - */ - -#define TIM_FLAG_Update ((uint16_t)0x0001) -#define TIM_FLAG_CC1 ((uint16_t)0x0002) -#define TIM_FLAG_CC2 ((uint16_t)0x0004) -#define TIM_FLAG_CC3 ((uint16_t)0x0008) -#define TIM_FLAG_CC4 ((uint16_t)0x0010) -#define TIM_FLAG_COM ((uint16_t)0x0020) -#define TIM_FLAG_Trigger ((uint16_t)0x0040) -#define TIM_FLAG_Break ((uint16_t)0x0080) -#define TIM_FLAG_CC1OF ((uint16_t)0x0200) -#define TIM_FLAG_CC2OF ((uint16_t)0x0400) -#define TIM_FLAG_CC3OF ((uint16_t)0x0800) -#define TIM_FLAG_CC4OF ((uint16_t)0x1000) -#define IS_TIM_GET_FLAG(FLAG) (((FLAG) == TIM_FLAG_Update) || \ - ((FLAG) == TIM_FLAG_CC1) || \ - ((FLAG) == TIM_FLAG_CC2) || \ - ((FLAG) == TIM_FLAG_CC3) || \ - ((FLAG) == TIM_FLAG_CC4) || \ - ((FLAG) == TIM_FLAG_COM) || \ - ((FLAG) == TIM_FLAG_Trigger) || \ - ((FLAG) == TIM_FLAG_Break) || \ - ((FLAG) == TIM_FLAG_CC1OF) || \ - ((FLAG) == TIM_FLAG_CC2OF) || \ - ((FLAG) == TIM_FLAG_CC3OF) || \ - ((FLAG) == TIM_FLAG_CC4OF)) - -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Filer_Value - * @{ - */ - -#define IS_TIM_IC_FILTER(ICFILTER) ((ICFILTER) <= 0xF) -/** - * @} - */ - -/** @defgroup TIM_External_Trigger_Filter - * @{ - */ - -#define IS_TIM_EXT_FILTER(EXTFILTER) ((EXTFILTER) <= 0xF) -/** - * @} - */ - -/** @defgroup TIM_Legacy - * @{ - */ - -#define TIM_DMABurstLength_1Byte TIM_DMABurstLength_1Transfer -#define TIM_DMABurstLength_2Bytes TIM_DMABurstLength_2Transfers -#define TIM_DMABurstLength_3Bytes TIM_DMABurstLength_3Transfers -#define TIM_DMABurstLength_4Bytes TIM_DMABurstLength_4Transfers -#define TIM_DMABurstLength_5Bytes TIM_DMABurstLength_5Transfers -#define TIM_DMABurstLength_6Bytes TIM_DMABurstLength_6Transfers -#define TIM_DMABurstLength_7Bytes TIM_DMABurstLength_7Transfers -#define TIM_DMABurstLength_8Bytes TIM_DMABurstLength_8Transfers -#define TIM_DMABurstLength_9Bytes TIM_DMABurstLength_9Transfers -#define TIM_DMABurstLength_10Bytes TIM_DMABurstLength_10Transfers -#define TIM_DMABurstLength_11Bytes TIM_DMABurstLength_11Transfers -#define TIM_DMABurstLength_12Bytes TIM_DMABurstLength_12Transfers -#define TIM_DMABurstLength_13Bytes TIM_DMABurstLength_13Transfers -#define TIM_DMABurstLength_14Bytes TIM_DMABurstLength_14Transfers -#define TIM_DMABurstLength_15Bytes TIM_DMABurstLength_15Transfers -#define TIM_DMABurstLength_16Bytes TIM_DMABurstLength_16Transfers -#define TIM_DMABurstLength_17Bytes TIM_DMABurstLength_17Transfers -#define TIM_DMABurstLength_18Bytes TIM_DMABurstLength_18Transfers -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* TimeBase management ********************************************************/ -void TIM_DeInit(TIM_TypeDef* TIMx); -void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); -void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); -void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode); -void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode); -void TIM_SetCounter(TIM_TypeDef* TIMx, uint32_t Counter); -void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint32_t Autoreload); -uint32_t TIM_GetCounter(TIM_TypeDef* TIMx); -uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx); -void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource); -void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode); -void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD); -void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); - -/* Output Compare management **************************************************/ -void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct); -void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode); -void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1); -void TIM_SetCompare2(TIM_TypeDef* TIMx, uint32_t Compare2); -void TIM_SetCompare3(TIM_TypeDef* TIMx, uint32_t Compare3); -void TIM_SetCompare4(TIM_TypeDef* TIMx, uint32_t Compare4); -void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); -void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); -void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); -void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); -void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); -void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); -void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); -void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); -void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); -void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); -void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); -void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); -void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); -void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); -void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); -void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); -void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); -void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); -void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); -void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); -void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); -void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); -void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); -void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx); -void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN); - -/* Input Capture management ***************************************************/ -void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); -void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct); -void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); -uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx); -uint32_t TIM_GetCapture2(TIM_TypeDef* TIMx); -uint32_t TIM_GetCapture3(TIM_TypeDef* TIMx); -uint32_t TIM_GetCapture4(TIM_TypeDef* TIMx); -void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); -void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); -void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); -void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); - -/* Advanced-control timers (TIM1 and TIM8) specific features ******************/ -void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct); -void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct); -void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState); -void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState); - -/* Interrupts, DMA and flags management ***************************************/ -void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); -void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource); -FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); -void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); -ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT); -void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT); -void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength); -void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState); -void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState); - -/* Clocks management **********************************************************/ -void TIM_InternalClockConfig(TIM_TypeDef* TIMx); -void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); -void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, - uint16_t TIM_ICPolarity, uint16_t ICFilter); -void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, - uint16_t ExtTRGFilter); -void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, - uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter); - -/* Synchronization management *************************************************/ -void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); -void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource); -void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); -void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode); -void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, - uint16_t ExtTRGFilter); - -/* Specific interface management **********************************************/ -void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, - uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity); -void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState); - -/* Specific remapping management **********************************************/ -void TIM_RemapConfig(TIM_TypeDef* TIMx, uint16_t TIM_Remap); - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F4xx_TIM_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_usart.c b/car_hw/src/lib/stdperiph/stm32f4xx_usart.c deleted file mode 100644 index 5dcbcbc4dc2..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_usart.c +++ /dev/null @@ -1,1464 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_usart.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Universal synchronous asynchronous receiver - * transmitter (USART): - * - Initialization and Configuration - * - Data transfers - * - Multi-Processor Communication - * - LIN mode - * - Half-duplex mode - * - Smartcard mode - * - IrDA mode - * - DMA transfers management - * - Interrupts and flags management - * - * @verbatim - * - * =================================================================== - * How to use this driver - * =================================================================== - * 1. Enable peripheral clock using the follwoing functions - * RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE) for USART1 and USART6 - * RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE) for USART2, USART3, UART4 or UART5. - * - * 2. According to the USART mode, enable the GPIO clocks using - * RCC_AHB1PeriphClockCmd() function. (The I/O can be TX, RX, CTS, - * or/and SCLK). - * - * 3. Peripheral's alternate function: - * - Connect the pin to the desired peripherals' Alternate - * Function (AF) using GPIO_PinAFConfig() function - * - Configure the desired pin in alternate function by: - * GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF - * - Select the type, pull-up/pull-down and output speed via - * GPIO_PuPd, GPIO_OType and GPIO_Speed members - * - Call GPIO_Init() function - * - * 4. Program the Baud Rate, Word Length , Stop Bit, Parity, Hardware - * flow control and Mode(Receiver/Transmitter) using the USART_Init() - * function. - * - * 5. For synchronous mode, enable the clock and program the polarity, - * phase and last bit using the USART_ClockInit() function. - * - * 5. Enable the NVIC and the corresponding interrupt using the function - * USART_ITConfig() if you need to use interrupt mode. - * - * 6. When using the DMA mode - * - Configure the DMA using DMA_Init() function - * - Active the needed channel Request using USART_DMACmd() function - * - * 7. Enable the USART using the USART_Cmd() function. - * - * 8. Enable the DMA using the DMA_Cmd() function, when using DMA mode. - * - * Refer to Multi-Processor, LIN, half-duplex, Smartcard, IrDA sub-sections - * for more details - * - * In order to reach higher communication baudrates, it is possible to - * enable the oversampling by 8 mode using the function USART_OverSampling8Cmd(). - * This function should be called after enabling the USART clock (RCC_APBxPeriphClockCmd()) - * and before calling the function USART_Init(). - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_usart.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup USART - * @brief USART driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/*!< USART CR1 register clear Mask ((~(uint16_t)0xE9F3)) */ -#define CR1_CLEAR_MASK ((uint16_t)(USART_CR1_M | USART_CR1_PCE | \ - USART_CR1_PS | USART_CR1_TE | \ - USART_CR1_RE)) - -/*!< USART CR2 register clock bits clear Mask ((~(uint16_t)0xF0FF)) */ -#define CR2_CLOCK_CLEAR_MASK ((uint16_t)(USART_CR2_CLKEN | USART_CR2_CPOL | \ - USART_CR2_CPHA | USART_CR2_LBCL)) - -/*!< USART CR3 register clear Mask ((~(uint16_t)0xFCFF)) */ -#define CR3_CLEAR_MASK ((uint16_t)(USART_CR3_RTSE | USART_CR3_CTSE)) - -/*!< USART Interrupts mask */ -#define IT_MASK ((uint16_t)0x001F) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup USART_Private_Functions - * @{ - */ - -/** @defgroup USART_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - Initialization and Configuration functions - =============================================================================== - - This subsection provides a set of functions allowing to initialize the USART - in asynchronous and in synchronous modes. - - For the asynchronous mode only these parameters can be configured: - - Baud Rate - - Word Length - - Stop Bit - - Parity: If the parity is enabled, then the MSB bit of the data written - in the data register is transmitted but is changed by the parity bit. - Depending on the frame length defined by the M bit (8-bits or 9-bits), - the possible USART frame formats are as listed in the following table: - +-------------------------------------------------------------+ - | M bit | PCE bit | USART frame | - |---------------------|---------------------------------------| - | 0 | 0 | | SB | 8 bit data | STB | | - |---------|-----------|---------------------------------------| - | 0 | 1 | | SB | 7 bit data | PB | STB | | - |---------|-----------|---------------------------------------| - | 1 | 0 | | SB | 9 bit data | STB | | - |---------|-----------|---------------------------------------| - | 1 | 1 | | SB | 8 bit data | PB | STB | | - +-------------------------------------------------------------+ - - Hardware flow control - - Receiver/transmitter modes - - The USART_Init() function follows the USART asynchronous configuration procedure - (details for the procedure are available in reference manual (RM0090)). - - - For the synchronous mode in addition to the asynchronous mode parameters these - parameters should be also configured: - - USART Clock Enabled - - USART polarity - - USART phase - - USART LastBit - - These parameters can be configured using the USART_ClockInit() function. - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the USARTx peripheral registers to their default reset values. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @retval None - */ -void USART_DeInit(USART_TypeDef* USARTx) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - - if (USARTx == USART1) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); - } - else if (USARTx == USART2) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE); - } - else if (USARTx == USART3) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE); - } - else if (USARTx == UART4) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE); - } - else if (USARTx == UART5) - { - RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE); - } - else - { - if (USARTx == USART6) - { - RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE); - RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, DISABLE); - } - } -} - -/** - * @brief Initializes the USARTx peripheral according to the specified - * parameters in the USART_InitStruct . - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param USART_InitStruct: pointer to a USART_InitTypeDef structure that contains - * the configuration information for the specified USART peripheral. - * @retval None - */ -void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) -{ - uint32_t tmpreg = 0x00, apbclock = 0x00; - uint32_t integerdivider = 0x00; - uint32_t fractionaldivider = 0x00; - RCC_ClocksTypeDef RCC_ClocksStatus; - - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_BAUDRATE(USART_InitStruct->USART_BaudRate)); - assert_param(IS_USART_WORD_LENGTH(USART_InitStruct->USART_WordLength)); - assert_param(IS_USART_STOPBITS(USART_InitStruct->USART_StopBits)); - assert_param(IS_USART_PARITY(USART_InitStruct->USART_Parity)); - assert_param(IS_USART_MODE(USART_InitStruct->USART_Mode)); - assert_param(IS_USART_HARDWARE_FLOW_CONTROL(USART_InitStruct->USART_HardwareFlowControl)); - - /* The hardware flow control is available only for USART1, USART2, USART3 and USART6 */ - if (USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None) - { - assert_param(IS_USART_1236_PERIPH(USARTx)); - } - -/*---------------------------- USART CR2 Configuration -----------------------*/ - tmpreg = USARTx->CR2; - - /* Clear STOP[13:12] bits */ - tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP); - - /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit : - Set STOP[13:12] bits according to USART_StopBits value */ - tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits; - - /* Write to USART CR2 */ - USARTx->CR2 = (uint16_t)tmpreg; - -/*---------------------------- USART CR1 Configuration -----------------------*/ - tmpreg = USARTx->CR1; - - /* Clear M, PCE, PS, TE and RE bits */ - tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK); - - /* Configure the USART Word Length, Parity and mode: - Set the M bits according to USART_WordLength value - Set PCE and PS bits according to USART_Parity value - Set TE and RE bits according to USART_Mode value */ - tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity | - USART_InitStruct->USART_Mode; - - /* Write to USART CR1 */ - USARTx->CR1 = (uint16_t)tmpreg; - -/*---------------------------- USART CR3 Configuration -----------------------*/ - tmpreg = USARTx->CR3; - - /* Clear CTSE and RTSE bits */ - tmpreg &= (uint32_t)~((uint32_t)CR3_CLEAR_MASK); - - /* Configure the USART HFC : - Set CTSE and RTSE bits according to USART_HardwareFlowControl value */ - tmpreg |= USART_InitStruct->USART_HardwareFlowControl; - - /* Write to USART CR3 */ - USARTx->CR3 = (uint16_t)tmpreg; - -/*---------------------------- USART BRR Configuration -----------------------*/ - /* Configure the USART Baud Rate */ - RCC_GetClocksFreq(&RCC_ClocksStatus); - - if ((USARTx == USART1) || (USARTx == USART6)) - { - apbclock = RCC_ClocksStatus.PCLK2_Frequency; - } - else - { - apbclock = RCC_ClocksStatus.PCLK1_Frequency; - } - - /* Determine the integer part */ - if ((USARTx->CR1 & USART_CR1_OVER8) != 0) - { - /* Integer part computing in case Oversampling mode is 8 Samples */ - integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate))); - } - else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */ - { - /* Integer part computing in case Oversampling mode is 16 Samples */ - integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate))); - } - tmpreg = (integerdivider / 100) << 4; - - /* Determine the fractional part */ - fractionaldivider = integerdivider - (100 * (tmpreg >> 4)); - - /* Implement the fractional part in the register */ - if ((USARTx->CR1 & USART_CR1_OVER8) != 0) - { - tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07); - } - else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */ - { - tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F); - } - - /* Write to USART BRR register */ - USARTx->BRR = (uint16_t)tmpreg; -} - -/** - * @brief Fills each USART_InitStruct member with its default value. - * @param USART_InitStruct: pointer to a USART_InitTypeDef structure which will - * be initialized. - * @retval None - */ -void USART_StructInit(USART_InitTypeDef* USART_InitStruct) -{ - /* USART_InitStruct members default value */ - USART_InitStruct->USART_BaudRate = 9600; - USART_InitStruct->USART_WordLength = USART_WordLength_8b; - USART_InitStruct->USART_StopBits = USART_StopBits_1; - USART_InitStruct->USART_Parity = USART_Parity_No ; - USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None; -} - -/** - * @brief Initializes the USARTx peripheral Clock according to the - * specified parameters in the USART_ClockInitStruct . - * @param USARTx: where x can be 1, 2, 3 or 6 to select the USART peripheral. - * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef structure that - * contains the configuration information for the specified USART peripheral. - * @note The Smart Card and Synchronous modes are not available for UART4 and UART5. - * @retval None - */ -void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct) -{ - uint32_t tmpreg = 0x00; - /* Check the parameters */ - assert_param(IS_USART_1236_PERIPH(USARTx)); - assert_param(IS_USART_CLOCK(USART_ClockInitStruct->USART_Clock)); - assert_param(IS_USART_CPOL(USART_ClockInitStruct->USART_CPOL)); - assert_param(IS_USART_CPHA(USART_ClockInitStruct->USART_CPHA)); - assert_param(IS_USART_LASTBIT(USART_ClockInitStruct->USART_LastBit)); - -/*---------------------------- USART CR2 Configuration -----------------------*/ - tmpreg = USARTx->CR2; - /* Clear CLKEN, CPOL, CPHA and LBCL bits */ - tmpreg &= (uint32_t)~((uint32_t)CR2_CLOCK_CLEAR_MASK); - /* Configure the USART Clock, CPOL, CPHA and LastBit ------------*/ - /* Set CLKEN bit according to USART_Clock value */ - /* Set CPOL bit according to USART_CPOL value */ - /* Set CPHA bit according to USART_CPHA value */ - /* Set LBCL bit according to USART_LastBit value */ - tmpreg |= (uint32_t)USART_ClockInitStruct->USART_Clock | USART_ClockInitStruct->USART_CPOL | - USART_ClockInitStruct->USART_CPHA | USART_ClockInitStruct->USART_LastBit; - /* Write to USART CR2 */ - USARTx->CR2 = (uint16_t)tmpreg; -} - -/** - * @brief Fills each USART_ClockInitStruct member with its default value. - * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef structure - * which will be initialized. - * @retval None - */ -void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct) -{ - /* USART_ClockInitStruct members default value */ - USART_ClockInitStruct->USART_Clock = USART_Clock_Disable; - USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low; - USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge; - USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable; -} - -/** - * @brief Enables or disables the specified USART peripheral. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param NewState: new state of the USARTx peripheral. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the selected USART by setting the UE bit in the CR1 register */ - USARTx->CR1 |= USART_CR1_UE; - } - else - { - /* Disable the selected USART by clearing the UE bit in the CR1 register */ - USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE); - } -} - -/** - * @brief Sets the system clock prescaler. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param USART_Prescaler: specifies the prescaler clock. - * @note The function is used for IrDA mode with UART4 and UART5. - * @retval None - */ -void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - - /* Clear the USART prescaler */ - USARTx->GTPR &= USART_GTPR_GT; - /* Set the USART prescaler */ - USARTx->GTPR |= USART_Prescaler; -} - -/** - * @brief Enables or disables the USART's 8x oversampling mode. - * @note This function has to be called before calling USART_Init() function - * in order to have correct baudrate Divider value. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param NewState: new state of the USART 8x oversampling mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the 8x Oversampling mode by setting the OVER8 bit in the CR1 register */ - USARTx->CR1 |= USART_CR1_OVER8; - } - else - { - /* Disable the 8x Oversampling mode by clearing the OVER8 bit in the CR1 register */ - USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_OVER8); - } -} - -/** - * @brief Enables or disables the USART's one bit sampling method. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param NewState: new state of the USART one bit sampling method. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the one bit method by setting the ONEBITE bit in the CR3 register */ - USARTx->CR3 |= USART_CR3_ONEBIT; - } - else - { - /* Disable the one bit method by clearing the ONEBITE bit in the CR3 register */ - USARTx->CR3 &= (uint16_t)~((uint16_t)USART_CR3_ONEBIT); - } -} - -/** - * @} - */ - -/** @defgroup USART_Group2 Data transfers functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - Data transfers functions - =============================================================================== - - This subsection provides a set of functions allowing to manage the USART data - transfers. - - During an USART reception, data shifts in least significant bit first through - the RX pin. In this mode, the USART_DR register consists of a buffer (RDR) - between the internal bus and the received shift register. - - When a transmission is taking place, a write instruction to the USART_DR register - stores the data in the TDR register and which is copied in the shift register - at the end of the current transmission. - - The read access of the USART_DR register can be done using the USART_ReceiveData() - function and returns the RDR buffered value. Whereas a write access to the USART_DR - can be done using USART_SendData() function and stores the written data into - TDR buffer. - -@endverbatim - * @{ - */ - -/** - * @brief Transmits single data through the USARTx peripheral. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param Data: the data to transmit. - * @retval None - */ -void USART_SendData(USART_TypeDef* USARTx, uint16_t Data) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_DATA(Data)); - - /* Transmit Data */ - USARTx->DR = (Data & (uint16_t)0x01FF); -} - -/** - * @brief Returns the most recent received data by the USARTx peripheral. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @retval The received data. - */ -uint16_t USART_ReceiveData(USART_TypeDef* USARTx) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - - /* Receive Data */ - return (uint16_t)(USARTx->DR & (uint16_t)0x01FF); -} - -/** - * @} - */ - -/** @defgroup USART_Group3 MultiProcessor Communication functions - * @brief Multi-Processor Communication functions - * -@verbatim - =============================================================================== - Multi-Processor Communication functions - =============================================================================== - - This subsection provides a set of functions allowing to manage the USART - multiprocessor communication. - - For instance one of the USARTs can be the master, its TX output is connected to - the RX input of the other USART. The others are slaves, their respective TX outputs - are logically ANDed together and connected to the RX input of the master. - - USART multiprocessor communication is possible through the following procedure: - 1. Program the Baud rate, Word length = 9 bits, Stop bits, Parity, Mode transmitter - or Mode receiver and hardware flow control values using the USART_Init() - function. - 2. Configures the USART address using the USART_SetAddress() function. - 3. Configures the wake up method (USART_WakeUp_IdleLine or USART_WakeUp_AddressMark) - using USART_WakeUpConfig() function only for the slaves. - 4. Enable the USART using the USART_Cmd() function. - 5. Enter the USART slaves in mute mode using USART_ReceiverWakeUpCmd() function. - - The USART Slave exit from mute mode when receive the wake up condition. - -@endverbatim - * @{ - */ - -/** - * @brief Sets the address of the USART node. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param USART_Address: Indicates the address of the USART node. - * @retval None - */ -void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_ADDRESS(USART_Address)); - - /* Clear the USART address */ - USARTx->CR2 &= (uint16_t)~((uint16_t)USART_CR2_ADD); - /* Set the USART address node */ - USARTx->CR2 |= USART_Address; -} - -/** - * @brief Determines if the USART is in mute mode or not. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param NewState: new state of the USART mute mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the USART mute mode by setting the RWU bit in the CR1 register */ - USARTx->CR1 |= USART_CR1_RWU; - } - else - { - /* Disable the USART mute mode by clearing the RWU bit in the CR1 register */ - USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_RWU); - } -} -/** - * @brief Selects the USART WakeUp method. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param USART_WakeUp: specifies the USART wakeup method. - * This parameter can be one of the following values: - * @arg USART_WakeUp_IdleLine: WakeUp by an idle line detection - * @arg USART_WakeUp_AddressMark: WakeUp by an address mark - * @retval None - */ -void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_WAKEUP(USART_WakeUp)); - - USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_WAKE); - USARTx->CR1 |= USART_WakeUp; -} - -/** - * @} - */ - -/** @defgroup USART_Group4 LIN mode functions - * @brief LIN mode functions - * -@verbatim - =============================================================================== - LIN mode functions - =============================================================================== - - This subsection provides a set of functions allowing to manage the USART LIN - Mode communication. - - In LIN mode, 8-bit data format with 1 stop bit is required in accordance with - the LIN standard. - - Only this LIN Feature is supported by the USART IP: - - LIN Master Synchronous Break send capability and LIN slave break detection - capability : 13-bit break generation and 10/11 bit break detection - - - USART LIN Master transmitter communication is possible through the following procedure: - 1. Program the Baud rate, Word length = 8bits, Stop bits = 1bit, Parity, - Mode transmitter or Mode receiver and hardware flow control values using - the USART_Init() function. - 2. Enable the USART using the USART_Cmd() function. - 3. Enable the LIN mode using the USART_LINCmd() function. - 4. Send the break character using USART_SendBreak() function. - - USART LIN Master receiver communication is possible through the following procedure: - 1. Program the Baud rate, Word length = 8bits, Stop bits = 1bit, Parity, - Mode transmitter or Mode receiver and hardware flow control values using - the USART_Init() function. - 2. Enable the USART using the USART_Cmd() function. - 3. Configures the break detection length using the USART_LINBreakDetectLengthConfig() - function. - 4. Enable the LIN mode using the USART_LINCmd() function. - - -@note In LIN mode, the following bits must be kept cleared: - - CLKEN in the USART_CR2 register, - - STOP[1:0], SCEN, HDSEL and IREN in the USART_CR3 register. - -@endverbatim - * @{ - */ - -/** - * @brief Sets the USART LIN Break detection length. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param USART_LINBreakDetectLength: specifies the LIN break detection length. - * This parameter can be one of the following values: - * @arg USART_LINBreakDetectLength_10b: 10-bit break detection - * @arg USART_LINBreakDetectLength_11b: 11-bit break detection - * @retval None - */ -void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_LIN_BREAK_DETECT_LENGTH(USART_LINBreakDetectLength)); - - USARTx->CR2 &= (uint16_t)~((uint16_t)USART_CR2_LBDL); - USARTx->CR2 |= USART_LINBreakDetectLength; -} - -/** - * @brief Enables or disables the USART's LIN mode. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param NewState: new state of the USART LIN mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the LIN mode by setting the LINEN bit in the CR2 register */ - USARTx->CR2 |= USART_CR2_LINEN; - } - else - { - /* Disable the LIN mode by clearing the LINEN bit in the CR2 register */ - USARTx->CR2 &= (uint16_t)~((uint16_t)USART_CR2_LINEN); - } -} - -/** - * @brief Transmits break characters. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @retval None - */ -void USART_SendBreak(USART_TypeDef* USARTx) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - - /* Send break characters */ - USARTx->CR1 |= USART_CR1_SBK; -} - -/** - * @} - */ - -/** @defgroup USART_Group5 Halfduplex mode function - * @brief Half-duplex mode function - * -@verbatim - =============================================================================== - Half-duplex mode function - =============================================================================== - - This subsection provides a set of functions allowing to manage the USART - Half-duplex communication. - - The USART can be configured to follow a single-wire half-duplex protocol where - the TX and RX lines are internally connected. - - USART Half duplex communication is possible through the following procedure: - 1. Program the Baud rate, Word length, Stop bits, Parity, Mode transmitter - or Mode receiver and hardware flow control values using the USART_Init() - function. - 2. Configures the USART address using the USART_SetAddress() function. - 3. Enable the USART using the USART_Cmd() function. - 4. Enable the half duplex mode using USART_HalfDuplexCmd() function. - - -@note The RX pin is no longer used -@note In Half-duplex mode the following bits must be kept cleared: - - LINEN and CLKEN bits in the USART_CR2 register. - - SCEN and IREN bits in the USART_CR3 register. - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the USART's Half Duplex communication. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param NewState: new state of the USART Communication. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ - USARTx->CR3 |= USART_CR3_HDSEL; - } - else - { - /* Disable the Half-Duplex mode by clearing the HDSEL bit in the CR3 register */ - USARTx->CR3 &= (uint16_t)~((uint16_t)USART_CR3_HDSEL); - } -} - -/** - * @} - */ - - -/** @defgroup USART_Group6 Smartcard mode functions - * @brief Smartcard mode functions - * -@verbatim - =============================================================================== - Smartcard mode functions - =============================================================================== - - This subsection provides a set of functions allowing to manage the USART - Smartcard communication. - - The Smartcard interface is designed to support asynchronous protocol Smartcards as - defined in the ISO 7816-3 standard. - - The USART can provide a clock to the smartcard through the SCLK output. - In smartcard mode, SCLK is not associated to the communication but is simply derived - from the internal peripheral input clock through a 5-bit prescaler. - - Smartcard communication is possible through the following procedure: - 1. Configures the Smartcard Prescaler using the USART_SetPrescaler() function. - 2. Configures the Smartcard Guard Time using the USART_SetGuardTime() function. - 3. Program the USART clock using the USART_ClockInit() function as following: - - USART Clock enabled - - USART CPOL Low - - USART CPHA on first edge - - USART Last Bit Clock Enabled - 4. Program the Smartcard interface using the USART_Init() function as following: - - Word Length = 9 Bits - - 1.5 Stop Bit - - Even parity - - BaudRate = 12096 baud - - Hardware flow control disabled (RTS and CTS signals) - - Tx and Rx enabled - 5. Optionally you can enable the parity error interrupt using the USART_ITConfig() - function - 6. Enable the USART using the USART_Cmd() function. - 7. Enable the Smartcard NACK using the USART_SmartCardNACKCmd() function. - 8. Enable the Smartcard interface using the USART_SmartCardCmd() function. - - Please refer to the ISO 7816-3 specification for more details. - - -@note It is also possible to choose 0.5 stop bit for receiving but it is recommended - to use 1.5 stop bits for both transmitting and receiving to avoid switching - between the two configurations. -@note In smartcard mode, the following bits must be kept cleared: - - LINEN bit in the USART_CR2 register. - - HDSEL and IREN bits in the USART_CR3 register. -@note Smartcard mode is available on USART peripherals only (not available on UART4 - and UART5 peripherals). - -@endverbatim - * @{ - */ - -/** - * @brief Sets the specified USART guard time. - * @param USARTx: where x can be 1, 2, 3 or 6 to select the USART or - * UART peripheral. - * @param USART_GuardTime: specifies the guard time. - * @retval None - */ -void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime) -{ - /* Check the parameters */ - assert_param(IS_USART_1236_PERIPH(USARTx)); - - /* Clear the USART Guard time */ - USARTx->GTPR &= USART_GTPR_PSC; - /* Set the USART guard time */ - USARTx->GTPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08); -} - -/** - * @brief Enables or disables the USART's Smart Card mode. - * @param USARTx: where x can be 1, 2, 3 or 6 to select the USART or - * UART peripheral. - * @param NewState: new state of the Smart Card mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_1236_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the SC mode by setting the SCEN bit in the CR3 register */ - USARTx->CR3 |= USART_CR3_SCEN; - } - else - { - /* Disable the SC mode by clearing the SCEN bit in the CR3 register */ - USARTx->CR3 &= (uint16_t)~((uint16_t)USART_CR3_SCEN); - } -} - -/** - * @brief Enables or disables NACK transmission. - * @param USARTx: where x can be 1, 2, 3 or 6 to select the USART or - * UART peripheral. - * @param NewState: new state of the NACK transmission. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_1236_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - if (NewState != DISABLE) - { - /* Enable the NACK transmission by setting the NACK bit in the CR3 register */ - USARTx->CR3 |= USART_CR3_NACK; - } - else - { - /* Disable the NACK transmission by clearing the NACK bit in the CR3 register */ - USARTx->CR3 &= (uint16_t)~((uint16_t)USART_CR3_NACK); - } -} - -/** - * @} - */ - -/** @defgroup USART_Group7 IrDA mode functions - * @brief IrDA mode functions - * -@verbatim - =============================================================================== - IrDA mode functions - =============================================================================== - - This subsection provides a set of functions allowing to manage the USART - IrDA communication. - - IrDA is a half duplex communication protocol. If the Transmitter is busy, any data - on the IrDA receive line will be ignored by the IrDA decoder and if the Receiver - is busy, data on the TX from the USART to IrDA will not be encoded by IrDA. - While receiving data, transmission should be avoided as the data to be transmitted - could be corrupted. - - IrDA communication is possible through the following procedure: - 1. Program the Baud rate, Word length = 8 bits, Stop bits, Parity, Transmitter/Receiver - modes and hardware flow control values using the USART_Init() function. - 2. Enable the USART using the USART_Cmd() function. - 3. Configures the IrDA pulse width by configuring the prescaler using - the USART_SetPrescaler() function. - 4. Configures the IrDA USART_IrDAMode_LowPower or USART_IrDAMode_Normal mode - using the USART_IrDAConfig() function. - 5. Enable the IrDA using the USART_IrDACmd() function. - -@note A pulse of width less than two and greater than one PSC period(s) may or may - not be rejected. -@note The receiver set up time should be managed by software. The IrDA physical layer - specification specifies a minimum of 10 ms delay between transmission and - reception (IrDA is a half duplex protocol). -@note In IrDA mode, the following bits must be kept cleared: - - LINEN, STOP and CLKEN bits in the USART_CR2 register. - - SCEN and HDSEL bits in the USART_CR3 register. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the USART's IrDA interface. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param USART_IrDAMode: specifies the IrDA mode. - * This parameter can be one of the following values: - * @arg USART_IrDAMode_LowPower - * @arg USART_IrDAMode_Normal - * @retval None - */ -void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_IRDA_MODE(USART_IrDAMode)); - - USARTx->CR3 &= (uint16_t)~((uint16_t)USART_CR3_IRLP); - USARTx->CR3 |= USART_IrDAMode; -} - -/** - * @brief Enables or disables the USART's IrDA interface. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param NewState: new state of the IrDA mode. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the IrDA mode by setting the IREN bit in the CR3 register */ - USARTx->CR3 |= USART_CR3_IREN; - } - else - { - /* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ - USARTx->CR3 &= (uint16_t)~((uint16_t)USART_CR3_IREN); - } -} - -/** - * @} - */ - -/** @defgroup USART_Group8 DMA transfers management functions - * @brief DMA transfers management functions - * -@verbatim - =============================================================================== - DMA transfers management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the USART's DMA interface. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param USART_DMAReq: specifies the DMA request. - * This parameter can be any combination of the following values: - * @arg USART_DMAReq_Tx: USART DMA transmit request - * @arg USART_DMAReq_Rx: USART DMA receive request - * @param NewState: new state of the DMA Request sources. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_DMAREQ(USART_DMAReq)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - if (NewState != DISABLE) - { - /* Enable the DMA transfer for selected requests by setting the DMAT and/or - DMAR bits in the USART CR3 register */ - USARTx->CR3 |= USART_DMAReq; - } - else - { - /* Disable the DMA transfer for selected requests by clearing the DMAT and/or - DMAR bits in the USART CR3 register */ - USARTx->CR3 &= (uint16_t)~USART_DMAReq; - } -} - -/** - * @} - */ - -/** @defgroup USART_Group9 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - - This subsection provides a set of functions allowing to configure the USART - Interrupts sources, DMA channels requests and check or clear the flags or - pending bits status. - The user should identify which mode will be used in his application to manage - the communication: Polling mode, Interrupt mode or DMA mode. - - Polling Mode - ============= - In Polling Mode, the SPI communication can be managed by 10 flags: - 1. USART_FLAG_TXE : to indicate the status of the transmit buffer register - 2. USART_FLAG_RXNE : to indicate the status of the receive buffer register - 3. USART_FLAG_TC : to indicate the status of the transmit operation - 4. USART_FLAG_IDLE : to indicate the status of the Idle Line - 5. USART_FLAG_CTS : to indicate the status of the nCTS input - 6. USART_FLAG_LBD : to indicate the status of the LIN break detection - 7. USART_FLAG_NE : to indicate if a noise error occur - 8. USART_FLAG_FE : to indicate if a frame error occur - 9. USART_FLAG_PE : to indicate if a parity error occur - 10. USART_FLAG_ORE : to indicate if an Overrun error occur - - In this Mode it is advised to use the following functions: - - FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); - - void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG); - - Interrupt Mode - =============== - In Interrupt Mode, the USART communication can be managed by 8 interrupt sources - and 10 pending bits: - - Pending Bits: - ------------- - 1. USART_IT_TXE : to indicate the status of the transmit buffer register - 2. USART_IT_RXNE : to indicate the status of the receive buffer register - 3. USART_IT_TC : to indicate the status of the transmit operation - 4. USART_IT_IDLE : to indicate the status of the Idle Line - 5. USART_IT_CTS : to indicate the status of the nCTS input - 6. USART_IT_LBD : to indicate the status of the LIN break detection - 7. USART_IT_NE : to indicate if a noise error occur - 8. USART_IT_FE : to indicate if a frame error occur - 9. USART_IT_PE : to indicate if a parity error occur - 10. USART_IT_ORE : to indicate if an Overrun error occur - - Interrupt Source: - ----------------- - 1. USART_IT_TXE : specifies the interrupt source for the Tx buffer empty - interrupt. - 2. USART_IT_RXNE : specifies the interrupt source for the Rx buffer not - empty interrupt. - 3. USART_IT_TC : specifies the interrupt source for the Transmit complete - interrupt. - 4. USART_IT_IDLE : specifies the interrupt source for the Idle Line interrupt. - 5. USART_IT_CTS : specifies the interrupt source for the CTS interrupt. - 6. USART_IT_LBD : specifies the interrupt source for the LIN break detection - interrupt. - 7. USART_IT_PE : specifies the interrupt source for the parity error interrupt. - 8. USART_IT_ERR : specifies the interrupt source for the errors interrupt. - -@note Some parameters are coded in order to use them as interrupt source or as pending bits. - - In this Mode it is advised to use the following functions: - - void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); - - ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT); - - void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); - - DMA Mode - ======== - In DMA Mode, the USART communication can be managed by 2 DMA Channel requests: - 1. USART_DMAReq_Tx: specifies the Tx buffer DMA transfer request - 2. USART_DMAReq_Rx: specifies the Rx buffer DMA transfer request - - In this Mode it is advised to use the following function: - - void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState); - -@endverbatim - * @{ - */ - -/** - * @brief Enables or disables the specified USART interrupts. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param USART_IT: specifies the USART interrupt sources to be enabled or disabled. - * This parameter can be one of the following values: - * @arg USART_IT_CTS: CTS change interrupt - * @arg USART_IT_LBD: LIN Break detection interrupt - * @arg USART_IT_TXE: Transmit Data Register empty interrupt - * @arg USART_IT_TC: Transmission complete interrupt - * @arg USART_IT_RXNE: Receive Data register not empty interrupt - * @arg USART_IT_IDLE: Idle line detection interrupt - * @arg USART_IT_PE: Parity Error interrupt - * @arg USART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) - * @param NewState: new state of the specified USARTx interrupts. - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) -{ - uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00; - uint32_t usartxbase = 0x00; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_CONFIG_IT(USART_IT)); - assert_param(IS_FUNCTIONAL_STATE(NewState)); - - /* The CTS interrupt is not available for UART4 and UART5 */ - if (USART_IT == USART_IT_CTS) - { - assert_param(IS_USART_1236_PERIPH(USARTx)); - } - - usartxbase = (uint32_t)USARTx; - - /* Get the USART register index */ - usartreg = (((uint8_t)USART_IT) >> 0x05); - - /* Get the interrupt position */ - itpos = USART_IT & IT_MASK; - itmask = (((uint32_t)0x01) << itpos); - - if (usartreg == 0x01) /* The IT is in CR1 register */ - { - usartxbase += 0x0C; - } - else if (usartreg == 0x02) /* The IT is in CR2 register */ - { - usartxbase += 0x10; - } - else /* The IT is in CR3 register */ - { - usartxbase += 0x14; - } - if (NewState != DISABLE) - { - *(__IO uint32_t*)usartxbase |= itmask; - } - else - { - *(__IO uint32_t*)usartxbase &= ~itmask; - } -} - -/** - * @brief Checks whether the specified USART flag is set or not. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param USART_FLAG: specifies the flag to check. - * This parameter can be one of the following values: - * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5) - * @arg USART_FLAG_LBD: LIN Break detection flag - * @arg USART_FLAG_TXE: Transmit data register empty flag - * @arg USART_FLAG_TC: Transmission Complete flag - * @arg USART_FLAG_RXNE: Receive data register not empty flag - * @arg USART_FLAG_IDLE: Idle Line detection flag - * @arg USART_FLAG_ORE: OverRun Error flag - * @arg USART_FLAG_NE: Noise Error flag - * @arg USART_FLAG_FE: Framing Error flag - * @arg USART_FLAG_PE: Parity Error flag - * @retval The new state of USART_FLAG (SET or RESET). - */ -FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG) -{ - FlagStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_FLAG(USART_FLAG)); - - /* The CTS flag is not available for UART4 and UART5 */ - if (USART_FLAG == USART_FLAG_CTS) - { - assert_param(IS_USART_1236_PERIPH(USARTx)); - } - - if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears the USARTx's pending flags. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param USART_FLAG: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5). - * @arg USART_FLAG_LBD: LIN Break detection flag. - * @arg USART_FLAG_TC: Transmission Complete flag. - * @arg USART_FLAG_RXNE: Receive data register not empty flag. - * - * @note PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun - * error) and IDLE (Idle line detected) flags are cleared by software - * sequence: a read operation to USART_SR register (USART_GetFlagStatus()) - * followed by a read operation to USART_DR register (USART_ReceiveData()). - * @note RXNE flag can be also cleared by a read to the USART_DR register - * (USART_ReceiveData()). - * @note TC flag can be also cleared by software sequence: a read operation to - * USART_SR register (USART_GetFlagStatus()) followed by a write operation - * to USART_DR register (USART_SendData()). - * @note TXE flag is cleared only by a write to the USART_DR register - * (USART_SendData()). - * - * @retval None - */ -void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG) -{ - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_CLEAR_FLAG(USART_FLAG)); - - /* The CTS flag is not available for UART4 and UART5 */ - if ((USART_FLAG & USART_FLAG_CTS) == USART_FLAG_CTS) - { - assert_param(IS_USART_1236_PERIPH(USARTx)); - } - - USARTx->SR = (uint16_t)~USART_FLAG; -} - -/** - * @brief Checks whether the specified USART interrupt has occurred or not. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param USART_IT: specifies the USART interrupt source to check. - * This parameter can be one of the following values: - * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) - * @arg USART_IT_LBD: LIN Break detection interrupt - * @arg USART_IT_TXE: Transmit Data Register empty interrupt - * @arg USART_IT_TC: Transmission complete interrupt - * @arg USART_IT_RXNE: Receive Data register not empty interrupt - * @arg USART_IT_IDLE: Idle line detection interrupt - * @arg USART_IT_ORE_RX : OverRun Error interrupt if the RXNEIE bit is set - * @arg USART_IT_ORE_ER : OverRun Error interrupt if the EIE bit is set - * @arg USART_IT_NE: Noise Error interrupt - * @arg USART_IT_FE: Framing Error interrupt - * @arg USART_IT_PE: Parity Error interrupt - * @retval The new state of USART_IT (SET or RESET). - */ -ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) -{ - uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00; - ITStatus bitstatus = RESET; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_GET_IT(USART_IT)); - - /* The CTS interrupt is not available for UART4 and UART5 */ - if (USART_IT == USART_IT_CTS) - { - assert_param(IS_USART_1236_PERIPH(USARTx)); - } - - /* Get the USART register index */ - usartreg = (((uint8_t)USART_IT) >> 0x05); - /* Get the interrupt position */ - itmask = USART_IT & IT_MASK; - itmask = (uint32_t)0x01 << itmask; - - if (usartreg == 0x01) /* The IT is in CR1 register */ - { - itmask &= USARTx->CR1; - } - else if (usartreg == 0x02) /* The IT is in CR2 register */ - { - itmask &= USARTx->CR2; - } - else /* The IT is in CR3 register */ - { - itmask &= USARTx->CR3; - } - - bitpos = USART_IT >> 0x08; - bitpos = (uint32_t)0x01 << bitpos; - bitpos &= USARTx->SR; - if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET)) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - - return bitstatus; -} - -/** - * @brief Clears the USARTx's interrupt pending bits. - * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or - * UART peripheral. - * @param USART_IT: specifies the interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) - * @arg USART_IT_LBD: LIN Break detection interrupt - * @arg USART_IT_TC: Transmission complete interrupt. - * @arg USART_IT_RXNE: Receive Data register not empty interrupt. - * - * @note PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun - * error) and IDLE (Idle line detected) pending bits are cleared by - * software sequence: a read operation to USART_SR register - * (USART_GetITStatus()) followed by a read operation to USART_DR register - * (USART_ReceiveData()). - * @note RXNE pending bit can be also cleared by a read to the USART_DR register - * (USART_ReceiveData()). - * @note TC pending bit can be also cleared by software sequence: a read - * operation to USART_SR register (USART_GetITStatus()) followed by a write - * operation to USART_DR register (USART_SendData()). - * @note TXE pending bit is cleared only by a write to the USART_DR register - * (USART_SendData()). - * - * @retval None - */ -void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT) -{ - uint16_t bitpos = 0x00, itmask = 0x00; - /* Check the parameters */ - assert_param(IS_USART_ALL_PERIPH(USARTx)); - assert_param(IS_USART_CLEAR_IT(USART_IT)); - - /* The CTS interrupt is not available for UART4 and UART5 */ - if (USART_IT == USART_IT_CTS) - { - assert_param(IS_USART_1236_PERIPH(USARTx)); - } - - bitpos = USART_IT >> 0x08; - itmask = ((uint16_t)0x01 << (uint16_t)bitpos); - USARTx->SR = (uint16_t)~itmask; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_usart.h b/car_hw/src/lib/stdperiph/stm32f4xx_usart.h deleted file mode 100644 index 3a411228f76..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_usart.h +++ /dev/null @@ -1,423 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_usart.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the USART - * firmware library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_USART_H -#define __STM32F4xx_USART_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup USART - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief USART Init Structure definition - */ - -typedef struct -{ - uint32_t USART_BaudRate; /*!< This member configures the USART communication baud rate. - The baud rate is computed using the following formula: - - IntegerDivider = ((PCLKx) / (8 * (OVR8+1) * (USART_InitStruct->USART_BaudRate))) - - FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 8 * (OVR8+1)) + 0.5 - Where OVR8 is the "oversampling by 8 mode" configuration bit in the CR1 register. */ - - uint16_t USART_WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. - This parameter can be a value of @ref USART_Word_Length */ - - uint16_t USART_StopBits; /*!< Specifies the number of stop bits transmitted. - This parameter can be a value of @ref USART_Stop_Bits */ - - uint16_t USART_Parity; /*!< Specifies the parity mode. - This parameter can be a value of @ref USART_Parity - @note When parity is enabled, the computed parity is inserted - at the MSB position of the transmitted data (9th bit when - the word length is set to 9 data bits; 8th bit when the - word length is set to 8 data bits). */ - - uint16_t USART_Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or disabled. - This parameter can be a value of @ref USART_Mode */ - - uint16_t USART_HardwareFlowControl; /*!< Specifies wether the hardware flow control mode is enabled - or disabled. - This parameter can be a value of @ref USART_Hardware_Flow_Control */ -} USART_InitTypeDef; - -/** - * @brief USART Clock Init Structure definition - */ - -typedef struct -{ - - uint16_t USART_Clock; /*!< Specifies whether the USART clock is enabled or disabled. - This parameter can be a value of @ref USART_Clock */ - - uint16_t USART_CPOL; /*!< Specifies the steady state of the serial clock. - This parameter can be a value of @ref USART_Clock_Polarity */ - - uint16_t USART_CPHA; /*!< Specifies the clock transition on which the bit capture is made. - This parameter can be a value of @ref USART_Clock_Phase */ - - uint16_t USART_LastBit; /*!< Specifies whether the clock pulse corresponding to the last transmitted - data bit (MSB) has to be output on the SCLK pin in synchronous mode. - This parameter can be a value of @ref USART_Last_Bit */ -} USART_ClockInitTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup USART_Exported_Constants - * @{ - */ - -#define IS_USART_ALL_PERIPH(PERIPH) (((PERIPH) == USART1) || \ - ((PERIPH) == USART2) || \ - ((PERIPH) == USART3) || \ - ((PERIPH) == UART4) || \ - ((PERIPH) == UART5) || \ - ((PERIPH) == USART6)) - -#define IS_USART_1236_PERIPH(PERIPH) (((PERIPH) == USART1) || \ - ((PERIPH) == USART2) || \ - ((PERIPH) == USART3) || \ - ((PERIPH) == USART6)) - -/** @defgroup USART_Word_Length - * @{ - */ - -#define USART_WordLength_8b ((uint16_t)0x0000) -#define USART_WordLength_9b ((uint16_t)0x1000) - -#define IS_USART_WORD_LENGTH(LENGTH) (((LENGTH) == USART_WordLength_8b) || \ - ((LENGTH) == USART_WordLength_9b)) -/** - * @} - */ - -/** @defgroup USART_Stop_Bits - * @{ - */ - -#define USART_StopBits_1 ((uint16_t)0x0000) -#define USART_StopBits_0_5 ((uint16_t)0x1000) -#define USART_StopBits_2 ((uint16_t)0x2000) -#define USART_StopBits_1_5 ((uint16_t)0x3000) -#define IS_USART_STOPBITS(STOPBITS) (((STOPBITS) == USART_StopBits_1) || \ - ((STOPBITS) == USART_StopBits_0_5) || \ - ((STOPBITS) == USART_StopBits_2) || \ - ((STOPBITS) == USART_StopBits_1_5)) -/** - * @} - */ - -/** @defgroup USART_Parity - * @{ - */ - -#define USART_Parity_No ((uint16_t)0x0000) -#define USART_Parity_Even ((uint16_t)0x0400) -#define USART_Parity_Odd ((uint16_t)0x0600) -#define IS_USART_PARITY(PARITY) (((PARITY) == USART_Parity_No) || \ - ((PARITY) == USART_Parity_Even) || \ - ((PARITY) == USART_Parity_Odd)) -/** - * @} - */ - -/** @defgroup USART_Mode - * @{ - */ - -#define USART_Mode_Rx ((uint16_t)0x0004) -#define USART_Mode_Tx ((uint16_t)0x0008) -#define IS_USART_MODE(MODE) ((((MODE) & (uint16_t)0xFFF3) == 0x00) && ((MODE) != (uint16_t)0x00)) -/** - * @} - */ - -/** @defgroup USART_Hardware_Flow_Control - * @{ - */ -#define USART_HardwareFlowControl_None ((uint16_t)0x0000) -#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) -#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) -#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) -#define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\ - (((CONTROL) == USART_HardwareFlowControl_None) || \ - ((CONTROL) == USART_HardwareFlowControl_RTS) || \ - ((CONTROL) == USART_HardwareFlowControl_CTS) || \ - ((CONTROL) == USART_HardwareFlowControl_RTS_CTS)) -/** - * @} - */ - -/** @defgroup USART_Clock - * @{ - */ -#define USART_Clock_Disable ((uint16_t)0x0000) -#define USART_Clock_Enable ((uint16_t)0x0800) -#define IS_USART_CLOCK(CLOCK) (((CLOCK) == USART_Clock_Disable) || \ - ((CLOCK) == USART_Clock_Enable)) -/** - * @} - */ - -/** @defgroup USART_Clock_Polarity - * @{ - */ - -#define USART_CPOL_Low ((uint16_t)0x0000) -#define USART_CPOL_High ((uint16_t)0x0400) -#define IS_USART_CPOL(CPOL) (((CPOL) == USART_CPOL_Low) || ((CPOL) == USART_CPOL_High)) - -/** - * @} - */ - -/** @defgroup USART_Clock_Phase - * @{ - */ - -#define USART_CPHA_1Edge ((uint16_t)0x0000) -#define USART_CPHA_2Edge ((uint16_t)0x0200) -#define IS_USART_CPHA(CPHA) (((CPHA) == USART_CPHA_1Edge) || ((CPHA) == USART_CPHA_2Edge)) - -/** - * @} - */ - -/** @defgroup USART_Last_Bit - * @{ - */ - -#define USART_LastBit_Disable ((uint16_t)0x0000) -#define USART_LastBit_Enable ((uint16_t)0x0100) -#define IS_USART_LASTBIT(LASTBIT) (((LASTBIT) == USART_LastBit_Disable) || \ - ((LASTBIT) == USART_LastBit_Enable)) -/** - * @} - */ - -/** @defgroup USART_Interrupt_definition - * @{ - */ - -#define USART_IT_PE ((uint16_t)0x0028) -#define USART_IT_TXE ((uint16_t)0x0727) -#define USART_IT_TC ((uint16_t)0x0626) -#define USART_IT_RXNE ((uint16_t)0x0525) -#define USART_IT_ORE_RX ((uint16_t)0x0325) /* In case interrupt is generated if the RXNEIE bit is set */ -#define USART_IT_IDLE ((uint16_t)0x0424) -#define USART_IT_LBD ((uint16_t)0x0846) -#define USART_IT_CTS ((uint16_t)0x096A) -#define USART_IT_ERR ((uint16_t)0x0060) -#define USART_IT_ORE_ER ((uint16_t)0x0360) /* In case interrupt is generated if the EIE bit is set */ -#define USART_IT_NE ((uint16_t)0x0260) -#define USART_IT_FE ((uint16_t)0x0160) - -/** @defgroup USART_Legacy - * @{ - */ -#define USART_IT_ORE USART_IT_ORE_ER -/** - * @} - */ - -#define IS_USART_CONFIG_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \ - ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ - ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \ - ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ERR)) -#define IS_USART_GET_IT(IT) (((IT) == USART_IT_PE) || ((IT) == USART_IT_TXE) || \ - ((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ - ((IT) == USART_IT_IDLE) || ((IT) == USART_IT_LBD) || \ - ((IT) == USART_IT_CTS) || ((IT) == USART_IT_ORE) || \ - ((IT) == USART_IT_ORE_RX) || ((IT) == USART_IT_ORE_ER) || \ - ((IT) == USART_IT_NE) || ((IT) == USART_IT_FE)) -#define IS_USART_CLEAR_IT(IT) (((IT) == USART_IT_TC) || ((IT) == USART_IT_RXNE) || \ - ((IT) == USART_IT_LBD) || ((IT) == USART_IT_CTS)) -/** - * @} - */ - -/** @defgroup USART_DMA_Requests - * @{ - */ - -#define USART_DMAReq_Tx ((uint16_t)0x0080) -#define USART_DMAReq_Rx ((uint16_t)0x0040) -#define IS_USART_DMAREQ(DMAREQ) ((((DMAREQ) & (uint16_t)0xFF3F) == 0x00) && ((DMAREQ) != (uint16_t)0x00)) - -/** - * @} - */ - -/** @defgroup USART_WakeUp_methods - * @{ - */ - -#define USART_WakeUp_IdleLine ((uint16_t)0x0000) -#define USART_WakeUp_AddressMark ((uint16_t)0x0800) -#define IS_USART_WAKEUP(WAKEUP) (((WAKEUP) == USART_WakeUp_IdleLine) || \ - ((WAKEUP) == USART_WakeUp_AddressMark)) -/** - * @} - */ - -/** @defgroup USART_LIN_Break_Detection_Length - * @{ - */ - -#define USART_LINBreakDetectLength_10b ((uint16_t)0x0000) -#define USART_LINBreakDetectLength_11b ((uint16_t)0x0020) -#define IS_USART_LIN_BREAK_DETECT_LENGTH(LENGTH) \ - (((LENGTH) == USART_LINBreakDetectLength_10b) || \ - ((LENGTH) == USART_LINBreakDetectLength_11b)) -/** - * @} - */ - -/** @defgroup USART_IrDA_Low_Power - * @{ - */ - -#define USART_IrDAMode_LowPower ((uint16_t)0x0004) -#define USART_IrDAMode_Normal ((uint16_t)0x0000) -#define IS_USART_IRDA_MODE(MODE) (((MODE) == USART_IrDAMode_LowPower) || \ - ((MODE) == USART_IrDAMode_Normal)) -/** - * @} - */ - -/** @defgroup USART_Flags - * @{ - */ - -#define USART_FLAG_CTS ((uint16_t)0x0200) -#define USART_FLAG_LBD ((uint16_t)0x0100) -#define USART_FLAG_TXE ((uint16_t)0x0080) -#define USART_FLAG_TC ((uint16_t)0x0040) -#define USART_FLAG_RXNE ((uint16_t)0x0020) -#define USART_FLAG_IDLE ((uint16_t)0x0010) -#define USART_FLAG_ORE ((uint16_t)0x0008) -#define USART_FLAG_NE ((uint16_t)0x0004) -#define USART_FLAG_FE ((uint16_t)0x0002) -#define USART_FLAG_PE ((uint16_t)0x0001) -#define IS_USART_FLAG(FLAG) (((FLAG) == USART_FLAG_PE) || ((FLAG) == USART_FLAG_TXE) || \ - ((FLAG) == USART_FLAG_TC) || ((FLAG) == USART_FLAG_RXNE) || \ - ((FLAG) == USART_FLAG_IDLE) || ((FLAG) == USART_FLAG_LBD) || \ - ((FLAG) == USART_FLAG_CTS) || ((FLAG) == USART_FLAG_ORE) || \ - ((FLAG) == USART_FLAG_NE) || ((FLAG) == USART_FLAG_FE)) - -#define IS_USART_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0xFC9F) == 0x00) && ((FLAG) != (uint16_t)0x00)) - -#define IS_USART_BAUDRATE(BAUDRATE) (((BAUDRATE) > 0) && ((BAUDRATE) < 7500001)) -#define IS_USART_ADDRESS(ADDRESS) ((ADDRESS) <= 0xF) -#define IS_USART_DATA(DATA) ((DATA) <= 0x1FF) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the USART configuration to the default reset state ***/ -void USART_DeInit(USART_TypeDef* USARTx); - -/* Initialization and Configuration functions *********************************/ -void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); -void USART_StructInit(USART_InitTypeDef* USART_InitStruct); -void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct); -void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct); -void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler); -void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState); - -/* Data transfers functions ***************************************************/ -void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); -uint16_t USART_ReceiveData(USART_TypeDef* USARTx); - -/* Multi-Processor Communication functions ************************************/ -void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address); -void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp); -void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState); - -/* LIN mode functions *********************************************************/ -void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength); -void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_SendBreak(USART_TypeDef* USARTx); - -/* Half-duplex mode function **************************************************/ -void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState); - -/* Smartcard mode functions ***************************************************/ -void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState); -void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime); - -/* IrDA mode functions ********************************************************/ -void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode); -void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState); - -/* DMA transfers management functions *****************************************/ -void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState); - -/* Interrupts and flags management functions **********************************/ -void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); -FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); -void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG); -ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT); -void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_USART_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_wwdg.c b/car_hw/src/lib/stdperiph/stm32f4xx_wwdg.c deleted file mode 100644 index 8cf32e72d8e..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_wwdg.c +++ /dev/null @@ -1,304 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_wwdg.c - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file provides firmware functions to manage the following - * functionalities of the Window watchdog (WWDG) peripheral: - * - Prescaler, Refresh window and Counter configuration - * - WWDG activation - * - Interrupts and flags management - * - * @verbatim - * - * =================================================================== - * WWDG features - * =================================================================== - * - * Once enabled the WWDG generates a system reset on expiry of a programmed - * time period, unless the program refreshes the counter (downcounter) - * before to reach 0x3F value (i.e. a reset is generated when the counter - * value rolls over from 0x40 to 0x3F). - * An MCU reset is also generated if the counter value is refreshed - * before the counter has reached the refresh window value. This - * implies that the counter must be refreshed in a limited window. - * - * Once enabled the WWDG cannot be disabled except by a system reset. - * - * WWDGRST flag in RCC_CSR register can be used to inform when a WWDG - * reset occurs. - * - * The WWDG counter input clock is derived from the APB clock divided - * by a programmable prescaler. - * - * WWDG counter clock = PCLK1 / Prescaler - * WWDG timeout = (WWDG counter clock) * (counter value) - * - * Min-max timeout value @42 MHz(PCLK1): ~97.5 us / ~49.9 ms - * - * =================================================================== - * How to use this driver - * =================================================================== - * 1. Enable WWDG clock using RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE) function - * - * 2. Configure the WWDG prescaler using WWDG_SetPrescaler() function - * - * 3. Configure the WWDG refresh window using WWDG_SetWindowValue() function - * - * 4. Set the WWDG counter value and start it using WWDG_Enable() function. - * When the WWDG is enabled the counter value should be configured to - * a value greater than 0x40 to prevent generating an immediate reset. - * - * 5. Optionally you can enable the Early wakeup interrupt which is - * generated when the counter reach 0x40. - * Once enabled this interrupt cannot be disabled except by a system reset. - * - * 6. Then the application program must refresh the WWDG counter at regular - * intervals during normal operation to prevent an MCU reset, using - * WWDG_SetCounter() function. This operation must occur only when - * the counter value is lower than the refresh window value, - * programmed using WWDG_SetWindowValue(). - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" -#include "stm32f4xx_wwdg.h" -#include "stm32f4xx_rcc.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @defgroup WWDG - * @brief WWDG driver modules - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/* ----------- WWDG registers bit address in the alias region ----------- */ -#define WWDG_OFFSET (WWDG_BASE - PERIPH_BASE) -/* Alias word address of EWI bit */ -#define CFR_OFFSET (WWDG_OFFSET + 0x04) -#define EWI_BitNumber 0x09 -#define CFR_EWI_BB (PERIPH_BB_BASE + (CFR_OFFSET * 32) + (EWI_BitNumber * 4)) - -/* --------------------- WWDG registers bit mask ------------------------ */ -/* CFR register bit mask */ -#define CFR_WDGTB_MASK ((uint32_t)0xFFFFFE7F) -#define CFR_W_MASK ((uint32_t)0xFFFFFF80) -#define BIT_MASK ((uint8_t)0x7F) - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup WWDG_Private_Functions - * @{ - */ - -/** @defgroup WWDG_Group1 Prescaler, Refresh window and Counter configuration functions - * @brief Prescaler, Refresh window and Counter configuration functions - * -@verbatim - =============================================================================== - Prescaler, Refresh window and Counter configuration functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Deinitializes the WWDG peripheral registers to their default reset values. - * @param None - * @retval None - */ -void WWDG_DeInit(void) -{ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, DISABLE); -} - -/** - * @brief Sets the WWDG Prescaler. - * @param WWDG_Prescaler: specifies the WWDG Prescaler. - * This parameter can be one of the following values: - * @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1 - * @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2 - * @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4 - * @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8 - * @retval None - */ -void WWDG_SetPrescaler(uint32_t WWDG_Prescaler) -{ - uint32_t tmpreg = 0; - /* Check the parameters */ - assert_param(IS_WWDG_PRESCALER(WWDG_Prescaler)); - /* Clear WDGTB[1:0] bits */ - tmpreg = WWDG->CFR & CFR_WDGTB_MASK; - /* Set WDGTB[1:0] bits according to WWDG_Prescaler value */ - tmpreg |= WWDG_Prescaler; - /* Store the new value */ - WWDG->CFR = tmpreg; -} - -/** - * @brief Sets the WWDG window value. - * @param WindowValue: specifies the window value to be compared to the downcounter. - * This parameter value must be lower than 0x80. - * @retval None - */ -void WWDG_SetWindowValue(uint8_t WindowValue) -{ - __IO uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_WWDG_WINDOW_VALUE(WindowValue)); - /* Clear W[6:0] bits */ - - tmpreg = WWDG->CFR & CFR_W_MASK; - - /* Set W[6:0] bits according to WindowValue value */ - tmpreg |= WindowValue & (uint32_t) BIT_MASK; - - /* Store the new value */ - WWDG->CFR = tmpreg; -} - -/** - * @brief Enables the WWDG Early Wakeup interrupt(EWI). - * @note Once enabled this interrupt cannot be disabled except by a system reset. - * @param None - * @retval None - */ -void WWDG_EnableIT(void) -{ - *(__IO uint32_t *) CFR_EWI_BB = (uint32_t)ENABLE; -} - -/** - * @brief Sets the WWDG counter value. - * @param Counter: specifies the watchdog counter value. - * This parameter must be a number between 0x40 and 0x7F (to prevent generating - * an immediate reset) - * @retval None - */ -void WWDG_SetCounter(uint8_t Counter) -{ - /* Check the parameters */ - assert_param(IS_WWDG_COUNTER(Counter)); - /* Write to T[6:0] bits to configure the counter value, no need to do - a read-modify-write; writing a 0 to WDGA bit does nothing */ - WWDG->CR = Counter & BIT_MASK; -} -/** - * @} - */ - -/** @defgroup WWDG_Group2 WWDG activation functions - * @brief WWDG activation functions - * -@verbatim - =============================================================================== - WWDG activation function - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Enables WWDG and load the counter value. - * @param Counter: specifies the watchdog counter value. - * This parameter must be a number between 0x40 and 0x7F (to prevent generating - * an immediate reset) - * @retval None - */ -void WWDG_Enable(uint8_t Counter) -{ - /* Check the parameters */ - assert_param(IS_WWDG_COUNTER(Counter)); - WWDG->CR = WWDG_CR_WDGA | Counter; -} -/** - * @} - */ - -/** @defgroup WWDG_Group3 Interrupts and flags management functions - * @brief Interrupts and flags management functions - * -@verbatim - =============================================================================== - Interrupts and flags management functions - =============================================================================== - -@endverbatim - * @{ - */ - -/** - * @brief Checks whether the Early Wakeup interrupt flag is set or not. - * @param None - * @retval The new state of the Early Wakeup interrupt flag (SET or RESET) - */ -FlagStatus WWDG_GetFlagStatus(void) -{ - FlagStatus bitstatus = RESET; - - if ((WWDG->SR) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; -} - -/** - * @brief Clears Early Wakeup interrupt flag. - * @param None - * @retval None - */ -void WWDG_ClearFlag(void) -{ - WWDG->SR = (uint32_t)RESET; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stdperiph/stm32f4xx_wwdg.h b/car_hw/src/lib/stdperiph/stm32f4xx_wwdg.h deleted file mode 100644 index b789ad872e1..00000000000 --- a/car_hw/src/lib/stdperiph/stm32f4xx_wwdg.h +++ /dev/null @@ -1,105 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_wwdg.h - * @author MCD Application Team - * @version V1.0.0 - * @date 30-September-2011 - * @brief This file contains all the functions prototypes for the WWDG firmware - * library. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

© COPYRIGHT 2011 STMicroelectronics

- ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_WWDG_H -#define __STM32F4xx_WWDG_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup STM32F4xx_StdPeriph_Driver - * @{ - */ - -/** @addtogroup WWDG - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup WWDG_Exported_Constants - * @{ - */ - -/** @defgroup WWDG_Prescaler - * @{ - */ - -#define WWDG_Prescaler_1 ((uint32_t)0x00000000) -#define WWDG_Prescaler_2 ((uint32_t)0x00000080) -#define WWDG_Prescaler_4 ((uint32_t)0x00000100) -#define WWDG_Prescaler_8 ((uint32_t)0x00000180) -#define IS_WWDG_PRESCALER(PRESCALER) (((PRESCALER) == WWDG_Prescaler_1) || \ - ((PRESCALER) == WWDG_Prescaler_2) || \ - ((PRESCALER) == WWDG_Prescaler_4) || \ - ((PRESCALER) == WWDG_Prescaler_8)) -#define IS_WWDG_WINDOW_VALUE(VALUE) ((VALUE) <= 0x7F) -#define IS_WWDG_COUNTER(COUNTER) (((COUNTER) >= 0x40) && ((COUNTER) <= 0x7F)) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/* Function used to set the WWDG configuration to the default reset state ****/ -void WWDG_DeInit(void); - -/* Prescaler, Refresh window and Counter configuration functions **************/ -void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); -void WWDG_SetWindowValue(uint8_t WindowValue); -void WWDG_EnableIT(void); -void WWDG_SetCounter(uint8_t Counter); - -/* WWDG activation function ***************************************************/ -void WWDG_Enable(uint8_t Counter); - -/* Interrupts and flags management functions **********************************/ -FlagStatus WWDG_GetFlagStatus(void); -void WWDG_ClearFlag(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_WWDG_H */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stm32f4d/MCD-ST Image SW License Agreement 19Jul2011 v0.1.pdf b/car_hw/src/lib/stm32f4d/MCD-ST Image SW License Agreement 19Jul2011 v0.1.pdf deleted file mode 100644 index 08e27b5b2708e9fa5248fb1c4b7e7b382505e1c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129125 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

    tNpck;* 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⪻A-48&HDpZ#Sw^Q_W~T9Xu9s|Hyu)k!vZ zr0B~XN<0&MYZ_uP!V1--6FDD*jLO6fJeqG!>FV!Ryo2c#?fdw?ZfUoRo?9r^W0WlL zNZnqS>ZM(2d1A?uC@>-xN~y4EM_M2nIj6xXx*R0{JMEj1;!oKBz|b~3dq+zBIU%b7 zeTSE~RKx%%VRNeOvH7gDaxIg}0J)~OnYD=rRJ2c#+E@I?n)o|)D~`8?46XNn14V;(?iNiO*h7!-G2~(sne|#{PEd zdSX6ZE*<-~E03+!Jt_%elUrAX??wzO|Bw)@ePXWKNFzvbjuk4roAV7na640ZsqgXm zeu_TH;%}i&6p)oSGGL+1&eGd)vN?rQ-JiKTib)4`w4-sK)^3q|vdzrb_`WxM=0MB( za<%S$6~hH`R(!RGP}%THRLSMjVQe~I>Ip+5{S2{%EhWmv+gct8Z_cUIhDtnQ3H>&9~UyJ5Q&N*){R z)wnKLrl7V0^mpmfmdYpjuGpLuGQE38rOaX3o9*Jc^j&$y@$IFo6D>k9OSwJVO*8`KsNHi6qEe9mY~}*l)E(T zt-E1fnPBx3NFz_HG1owY5nVubtYv%akIoZERZAWX?PTAMMUcfu@u`14$`$4L+e&FsmGgS>MbF!dOah>IRx2<>7a!6K`rqQG)S z;4bQJ?_>|C0dlvub8r!Lm*D)hL==F}&|pr`FA|)s1gC+j1_x))Axun5cop*gFCMC-_gh{|o8>vHIUF2PXb7 z9Rxt4s*aWzD-Ss{99n`C27yBPAtJz^4iqX1fr~;B{1BKZ1Ok`{kjerXghT&dq>|!) z(>h{xfG|t`WgY0>!sm2mG2o7~ScrpvUm*@Yi^0D+;lJt@Rn`BuW9;qEvenE^|6%|wE&f*136Hh=mF|`nV6+|jOd}T{hQO;KK$aGwR*qPEGay;b zoSf`17G`HT3wxaqn^~hl+WH_Bj0M`k1r3t6#-e`-1wloW@pflvA^-^ZBT9A{$v=Q!?7{yM z2|yNS8RLlkL#j5~`7iO3c9v)t7c|EDHx|E0&RG1t@PA2!Unrn40678vyX{Dlf&NR! ze~;0>dM(hmB{<#AIw=7C*@^$`<*x`hYA5p0YU`CR9O@SgF&qT4iJQt z6$%am)(OH;aNu4s9FPD+^NbAm76QaVH34A|fFaNq{%gE+&T^0og+jrQNLLhGNKgXI z1IUDm*=gCjo*@B!5x@sf3<4Mg2b4hqN2Y}3Woxs;lTI|2h76-*-#KTR13fYvoNR# z0Gx$I8jrI9r1+dgKp!9lRDc7L;7E(J5CNz3zs~5w|4IXeUnf`)SQ}^NU}=W61cCKH zFwoy;bC@s)tObIDz#1TasIVX~qYmQIMq#t=jBA`%{g}tFZO$qSEmrM6wOhZ*j*Akm zJIXvI1$5B`aXnyoe==?wcVysb>1Rr<*MZ_{Rx?q1Pb~!1#7Xz{5hUV2aS*7mFktb2(47sSzy;LV@wW^J5+eAUEn?j ztc3w_{ar2$A_DtOKOk%nq2F;p2_k;CO;8vL|A$!?U9w7sjkptR=EJRuXDfxd>7?XkJ9W1aOPB;+!tWjuzfHHN# XnPG9iiWCYHh6*9b*xBXP70CVv5@&T6 diff --git a/car_hw/src/lib/stm32f4d/Makefile b/car_hw/src/lib/stm32f4d/Makefile deleted file mode 100644 index 50f70a5d0ce..00000000000 --- a/car_hw/src/lib/stm32f4d/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -LIB_STM32F4D_OBJ_PREFIX=libstm32f4d_ - -$(LIB_STM32F4D_OBJ): \ - $(BIN_DIR)/$(LIB_STDPRPH_OBJ_PREFIX)stm32f4_discovery.o - $(LD_ALL_DEPS) - -$(BIN_DIR)/$(LIB_STDPRPH_OBJ_PREFIX)%.o: $(LIB_STM32F4D_DIR)/%.c \ - $(LIB_STM32F4D_DIR)/stm32f4_discovery.h - $(CC_ALL_DEPS) diff --git a/car_hw/src/lib/stm32f4d/Release_Notes.html b/car_hw/src/lib/stm32f4d/Release_Notes.html deleted file mode 100644 index 3882ad6501c..00000000000 --- a/car_hw/src/lib/stm32f4d/Release_Notes.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - - - - Release Notes for STM32F4-Discovery Board Drivers - - - - - - - - - - -

    - - \ No newline at end of file diff --git a/car_hw/src/lib/stm32f4d/libPDMFilter_GCC.a b/car_hw/src/lib/stm32f4d/libPDMFilter_GCC.a deleted file mode 100644 index 4dcbbca7e515d217387860abdfbb830fb5b1a47a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6956 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 Qfn6_T?DT#)k%Oc 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 E0C?(@lK=n! diff --git a/car_hw/src/lib/stm32f4d/pdm_filter.h b/car_hw/src/lib/stm32f4d/pdm_filter.h deleted file mode 100644 index fb7d1057f82..00000000000 --- a/car_hw/src/lib/stm32f4d/pdm_filter.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - ****************************************************************************** - * @file pdm_filter.h - * @author MCD Application Team - * @version V1.1.0 - * @date 28-October-2011 - * @brief Header file for PDM audio software decoding Library. - * This Library is used to decode and reconstruct the audio signal - * produced by MP45DT02 MEMS microphone from STMicroelectronics. - * For more details about this Library, please refer to document - * "PDM audio software decoding on STM32 microcontrollers (AN3998)". - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __PDM_FILTER_H -#define __PDM_FILTER_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include - -/* Exported types ------------------------------------------------------------*/ -typedef struct { - uint16_t Fs; - float LP_HZ; - float HP_HZ; - uint16_t In_MicChannels; - uint16_t Out_MicChannels; - char InternalFilter[34]; -} PDMFilter_InitStruct; - -/* Exported constants --------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -#define HTONS(A) ((((u16)(A) & 0xff00) >> 8) | \ - (((u16)(A) & 0x00ff) << 8)) - -/* Exported functions ------------------------------------------------------- */ -void PDM_Filter_Init(PDMFilter_InitStruct * Filter); - -int32_t PDM_Filter_64_MSB(uint8_t* data, uint16_t* dataOut, uint16_t MicGain, PDMFilter_InitStruct * Filter); -int32_t PDM_Filter_80_MSB(uint8_t* data, uint16_t* dataOut, uint16_t MicGain, PDMFilter_InitStruct * Filter); -int32_t PDM_Filter_64_LSB(uint8_t* data, uint16_t* dataOut, uint16_t MicGain, PDMFilter_InitStruct * Filter); -int32_t PDM_Filter_80_LSB(uint8_t* data, uint16_t* dataOut, uint16_t MicGain, PDMFilter_InitStruct * Filter); - -#ifdef __cplusplus -} -#endif - -#endif /* __PDM_FILTER_H */ - -/*******************(C)COPYRIGHT 2011 STMicroelectronics *****END OF FILE******/ diff --git a/car_hw/src/lib/stm32f4d/stm32f4_discovery.c b/car_hw/src/lib/stm32f4d/stm32f4_discovery.c deleted file mode 100644 index 33993d0120e..00000000000 --- a/car_hw/src/lib/stm32f4d/stm32f4_discovery.c +++ /dev/null @@ -1,253 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4_discovery.c - * @author MCD Application Team - * @version V1.1.0 - * @date 28-October-2011 - * @brief This file provides set of firmware functions to manage Leds and - * push-button available on STM32F4-Discovery Kit from STMicroelectronics. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4_discovery.h" - -/** @addtogroup Utilities - * @{ - */ - -/** @addtogroup STM32F4_DISCOVERY - * @{ - */ - -/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL - * @brief This file provides set of firmware functions to manage Leds and push-button - * available on STM32F4-Discovery Kit from STMicroelectronics. - * @{ - */ - -/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Private_Variables - * @{ - */ -GPIO_TypeDef* GPIO_PORT[LEDn] = {LED4_GPIO_PORT, LED3_GPIO_PORT, LED5_GPIO_PORT, - LED6_GPIO_PORT}; -const uint16_t GPIO_PIN[LEDn] = {LED4_PIN, LED3_PIN, LED5_PIN, - LED6_PIN}; -const uint32_t GPIO_CLK[LEDn] = {LED4_GPIO_CLK, LED3_GPIO_CLK, LED5_GPIO_CLK, - LED6_GPIO_CLK}; - -GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {USER_BUTTON_GPIO_PORT }; - -const uint16_t BUTTON_PIN[BUTTONn] = {USER_BUTTON_PIN }; - -const uint32_t BUTTON_CLK[BUTTONn] = {USER_BUTTON_GPIO_CLK }; - -const uint16_t BUTTON_EXTI_LINE[BUTTONn] = {USER_BUTTON_EXTI_LINE }; - -const uint8_t BUTTON_PORT_SOURCE[BUTTONn] = {USER_BUTTON_EXTI_PORT_SOURCE}; - -const uint8_t BUTTON_PIN_SOURCE[BUTTONn] = {USER_BUTTON_EXTI_PIN_SOURCE }; -const uint8_t BUTTON_IRQn[BUTTONn] = {USER_BUTTON_EXTI_IRQn }; - -NVIC_InitTypeDef NVIC_InitStructure; - -/** - * @} - */ - - -/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Private_Functions - * @{ - */ - -/** - * @brief Configures LED GPIO. - * @param Led: Specifies the Led to be configured. - * This parameter can be one of following parameters: - * @arg LED4 - * @arg LED3 - * @arg LED5 - * @arg LED6 - * @retval None - */ -void STM_EVAL_LEDInit(Led_TypeDef Led) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - /* Enable the GPIO_LED Clock */ - RCC_AHB1PeriphClockCmd(GPIO_CLK[Led], ENABLE); - - /* Configure the GPIO_LED pin */ - GPIO_InitStructure.GPIO_Pin = GPIO_PIN[Led]; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure); -} - -/** - * @brief Turns selected LED On. - * @param Led: Specifies the Led to be set on. - * This parameter can be one of following parameters: - * @arg LED4 - * @arg LED3 - * @arg LED5 - * @arg LED6 - * @retval None - */ -void STM_EVAL_LEDOn(Led_TypeDef Led) -{ - GPIO_PORT[Led]->BSRRL = GPIO_PIN[Led]; -} - -/** - * @brief Turns selected LED Off. - * @param Led: Specifies the Led to be set off. - * This parameter can be one of following parameters: - * @arg LED4 - * @arg LED3 - * @arg LED5 - * @arg LED6 - * @retval None - */ -void STM_EVAL_LEDOff(Led_TypeDef Led) -{ - GPIO_PORT[Led]->BSRRH = GPIO_PIN[Led]; -} - -/** - * @brief Toggles the selected LED. - * @param Led: Specifies the Led to be toggled. - * This parameter can be one of following parameters: - * @arg LED4 - * @arg LED3 - * @arg LED5 - * @arg LED6 - * @retval None - */ -void STM_EVAL_LEDToggle(Led_TypeDef Led) -{ - GPIO_PORT[Led]->ODR ^= GPIO_PIN[Led]; -} - -/** - * @brief Configures Button GPIO and EXTI Line. - * @param Button: Specifies the Button to be configured. - * This parameter should be: BUTTON_USER - * @param Button_Mode: Specifies Button mode. - * This parameter can be one of following parameters: - * @arg BUTTON_MODE_GPIO: Button will be used as simple IO - * @arg BUTTON_MODE_EXTI: Button will be connected to EXTI line with interrupt - * generation capability - * @retval None - */ -void STM_EVAL_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode) -{ - GPIO_InitTypeDef GPIO_InitStructure; - EXTI_InitTypeDef EXTI_InitStructure; - NVIC_InitTypeDef NVIC_InitStructure; - - /* Enable the BUTTON Clock */ - RCC_AHB1PeriphClockCmd(BUTTON_CLK[Button], ENABLE); - RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); - - /* Configure Button pin as input */ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_InitStructure.GPIO_Pin = BUTTON_PIN[Button]; - GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStructure); - - if (Button_Mode == BUTTON_MODE_EXTI) - { - /* Connect Button EXTI Line to Button GPIO Pin */ - SYSCFG_EXTILineConfig(BUTTON_PORT_SOURCE[Button], BUTTON_PIN_SOURCE[Button]); - - /* Configure Button EXTI line */ - EXTI_InitStructure.EXTI_Line = BUTTON_EXTI_LINE[Button]; - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; - EXTI_InitStructure.EXTI_LineCmd = ENABLE; - EXTI_Init(&EXTI_InitStructure); - - /* Enable and set Button EXTI Interrupt to the lowest priority */ - NVIC_InitStructure.NVIC_IRQChannel = BUTTON_IRQn[Button]; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - - NVIC_Init(&NVIC_InitStructure); - } -} - -/** - * @brief Returns the selected Button state. - * @param Button: Specifies the Button to be checked. - * This parameter should be: BUTTON_USER - * @retval The Button GPIO pin value. - */ -uint32_t STM_EVAL_PBGetState(Button_TypeDef Button) -{ - return GPIO_ReadInputDataBit(BUTTON_PORT[Button], BUTTON_PIN[Button]); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stm32f4d/stm32f4_discovery.h b/car_hw/src/lib/stm32f4d/stm32f4_discovery.h deleted file mode 100644 index 13695cdbe03..00000000000 --- a/car_hw/src/lib/stm32f4d/stm32f4_discovery.h +++ /dev/null @@ -1,163 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4_discovery.h - * @author MCD Application Team - * @version V1.1.0 - * @date 28-October-2011 - * @brief This file contains definitions for STM32F4-Discovery Kit's Leds and - * push-button hardware resources. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4_DISCOVERY_H -#define __STM32F4_DISCOVERY_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include "stm32f4xx_gpio.h" -#include "stm32f4xx_rcc.h" -#include "stm32f4xx_exti.h" -#include "stm32f4xx_syscfg.h" -#include "misc.h" - -/** @addtogroup Utilities - * @{ - */ - -/** @addtogroup STM32F4_DISCOVERY - * @{ - */ - -/** @addtogroup STM32F4_DISCOVERY_LOW_LEVEL - * @{ - */ - -/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Exported_Types - * @{ - */ -typedef enum -{ - LED4 = 0, - LED3 = 1, - LED5 = 2, - LED6 = 3 -} Led_TypeDef; - -typedef enum -{ - BUTTON_USER = 0, -} Button_TypeDef; - -typedef enum -{ - BUTTON_MODE_GPIO = 0, - BUTTON_MODE_EXTI = 1 -} ButtonMode_TypeDef; -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Exported_Constants - * @{ - */ - -/** @addtogroup STM32F4_DISCOVERY_LOW_LEVEL_LED - * @{ - */ -#define LEDn 4 - -#define LED4_PIN GPIO_Pin_12 -#define LED4_GPIO_PORT GPIOD -#define LED4_GPIO_CLK RCC_AHB1Periph_GPIOD - -#define LED3_PIN GPIO_Pin_13 -#define LED3_GPIO_PORT GPIOD -#define LED3_GPIO_CLK RCC_AHB1Periph_GPIOD - -#define LED5_PIN GPIO_Pin_14 -#define LED5_GPIO_PORT GPIOD -#define LED5_GPIO_CLK RCC_AHB1Periph_GPIOD - -#define LED6_PIN GPIO_Pin_15 -#define LED6_GPIO_PORT GPIOD -#define LED6_GPIO_CLK RCC_AHB1Periph_GPIOD -/** - * @} - */ - -/** @addtogroup STM32F4_DISCOVERY_LOW_LEVEL_BUTTON - * @{ - */ -#define BUTTONn 1 - -/** - * @brief Wakeup push-button - */ -#define USER_BUTTON_PIN GPIO_Pin_0 -#define USER_BUTTON_GPIO_PORT GPIOA -#define USER_BUTTON_GPIO_CLK RCC_AHB1Periph_GPIOA -#define USER_BUTTON_EXTI_LINE EXTI_Line0 -#define USER_BUTTON_EXTI_PORT_SOURCE EXTI_PortSourceGPIOA -#define USER_BUTTON_EXTI_PIN_SOURCE EXTI_PinSource0 -#define USER_BUTTON_EXTI_IRQn EXTI0_IRQn -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Exported_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup STM32F4_DISCOVERY_LOW_LEVEL_Exported_Functions - * @{ - */ -void STM_EVAL_LEDInit(Led_TypeDef Led); -void STM_EVAL_LEDOn(Led_TypeDef Led); -void STM_EVAL_LEDOff(Led_TypeDef Led); -void STM_EVAL_LEDToggle(Led_TypeDef Led); -void STM_EVAL_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode); -uint32_t STM_EVAL_PBGetState(Button_TypeDef Button); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4_DISCOVERY_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stm32f4d/stm32f4_discovery_audio_codec.c b/car_hw/src/lib/stm32f4d/stm32f4_discovery_audio_codec.c deleted file mode 100644 index faa22267d53..00000000000 --- a/car_hw/src/lib/stm32f4d/stm32f4_discovery_audio_codec.c +++ /dev/null @@ -1,1650 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4_discovery_audio_codec.c - * @author MCD Application Team - * @version V1.1.0 - * @date 28-October-2011 - * @brief This file includes the low layer driver for CS43L22 Audio Codec - * available on STM32F4-Discovery Kit. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/*============================================================================================================================== - User NOTES -1. How To use this driver: --------------------------- - - This driver supports STM32F4xx devices on STM32F4-Discovery Kit. - - - Configure the options in file stm32f4_discovery_audio_codec.h in the section CONFIGURATION. - Refer to the sections 2 and 3 to have more details on the possible configurations. - - - Call the function EVAL_AUDIO_Init( - OutputDevice: physical output mode (OUTPUT_DEVICE_SPEAKER, - OUTPUT_DEVICE_HEADPHONE, OUTPUT_DEVICE_AUTO or - OUTPUT_DEVICE_BOTH) - Volume: initial volume to be set (0 is min (mute), 100 is max (100%) - AudioFreq: Audio frequency in Hz (8000, 16000, 22500, 32000 ...) - this parameter is relative to the audio file/stream type. - ) - This function configures all the hardware required for the audio application (codec, I2C, I2S, - GPIOs, DMA and interrupt if needed). This function returns 0 if configuration is OK. - if the returned value is different from 0 or the function is stuck then the communication with - the codec (try to un-plug the power or reset device in this case). - + OUTPUT_DEVICE_SPEAKER: only speaker will be set as output for the audio stream. - + OUTPUT_DEVICE_HEADPHONE: only headphones will be set as output for the audio stream. - + OUTPUT_DEVICE_AUTO: Selection of output device is made through external switch (implemented - into the audio jack on the evaluation board). When the Headphone is connected it is used - as output. When the headphone is disconnected from the audio jack, the output is - automatically switched to Speaker. - + OUTPUT_DEVICE_BOTH: both Speaker and Headphone are used as outputs for the audio stream - at the same time. - - - Call the function EVAL_AUDIO_Play( - pBuffer: pointer to the audio data file address - Size: size of the buffer to be sent in Bytes - ) - to start playing (for the first time) from the audio file/stream. - - - Call the function EVAL_AUDIO_PauseResume( - Cmd: AUDIO_PAUSE (or 0) to pause playing or AUDIO_RESUME (or - any value different from 0) to resume playing. - ) - Note. After calling EVAL_AUDIO_PauseResume() function for pause, only EVAL_AUDIO_PauseResume() should be called - for resume (it is not allowed to call EVAL_AUDIO_Play() in this case). - Note. This function should be called only when the audio file is played or paused (not stopped). - - - For each mode, you may need to implement the relative callback functions into your code. - The Callback functions are named EVAL_AUDIO_XXX_CallBack() and only their prototypes are declared in - the stm32f4_discovery_audio_codec.h file. (refer to the example for more details on the callbacks implementations) - - - To Stop playing, to modify the volume level or to mute, use the functions - EVAL_AUDIO_Stop(), EVAL_AUDIO_VolumeCtl() and EVAL_AUDIO_Mute(). - - - The driver API and the callback functions are at the end of the stm32f4_discovery_audio_codec.h file. - - - Driver architecture: - -------------------- - This driver is composed of three main layers: - o High Audio Layer: consists of the function API exported in the stm32f4_discovery_audio_codec.h file - (EVAL_AUDIO_Init(), EVAL_AUDIO_Play() ...) - o Codec Control layer: consists of the functions API controlling the audio codec (CS43L22) and - included as local functions in file stm32f4_discovery_audio_codec.c (Codec_Init(), Codec_Play() ...) - o Media Access Layer (MAL): which consists of functions allowing to access the media containing/ - providing the audio file/stream. These functions are also included as local functions into - the stm32f4_discovery_audio_codec.c file (Audio_MAL_Init(), Audio_MAL_Play() ...) - Each set of functions (layer) may be implemented independently of the others and customized when - needed. - -2. Modes description: ---------------------- - + AUDIO_MAL_MODE_NORMAL : is suitable when the audio file is in a memory location. - + AUDIO_MAL_MODE_CIRCULAR: is suitable when the audio data are read either from a - memory location or from a device at real time (double buffer could be used). - -3. DMA interrupts description: ------------------------------- - + EVAL_AUDIO_IT_TC_ENABLE: Enable this define to use the DMA end of transfer interrupt. - then, a callback should be implemented by user to perform specific actions - when the DMA has finished the transfer. - + EVAL_AUDIO_IT_HT_ENABLE: Enable this define to use the DMA end of half transfer interrupt. - then, a callback should be implemented by user to perform specific actions - when the DMA has reached the half of the buffer transfer (generally, it is useful - to load the first half of buffer while DMA is loading from the second half). - + EVAL_AUDIO_IT_ER_ENABLE: Enable this define to manage the cases of error on DMA transfer. - -4. Known Limitations: ---------------------- - 1- When using the Speaker, if the audio file quality is not high enough, the speaker output - may produce high and uncomfortable noise level. To avoid this issue, to use speaker - output properly, try to increase audio file sampling rate (typically higher than 48KHz). - This operation will lead to larger file size. - 2- Communication with the audio codec (through I2C) may be corrupted if it is interrupted by some - user interrupt routines (in this case, interrupts could be disabled just before the start of - communication then re-enabled when it is over). Note that this communication is only done at - the configuration phase (EVAL_AUDIO_Init() or EVAL_AUDIO_Stop()) and when Volume control modification is - performed (EVAL_AUDIO_VolumeCtl() or EVAL_AUDIO_Mute()). When the audio data is played, no communication is - required with the audio codec. - 3- Parsing of audio file is not implemented (in order to determine audio file properties: Mono/Stereo, Data size, - File size, Audio Frequency, Audio Data header size ...). The configuration is fixed for the given audio file. - 4- Mono audio streaming is not supported (in order to play mono audio streams, each data should be sent twice - on the I2S or should be duplicated on the source buffer. Or convert the stream in stereo before playing). - 5- Supports only 16-bit audio data size. -===============================================================================================================================*/ - - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4_discovery_audio_codec.h" - -/** @addtogroup Utilities - * @{ - */ - -/** @addtogroup STM32F4_DISCOVERY - * @{ - */ - -/** @addtogroup STM32F4_DISCOVERY_AUDIO_CODEC - * @brief This file includes the low layer driver for CS43L22 Audio Codec - * available on STM32F4-Discovery Kit. - * @{ - */ - -/** @defgroup STM32F4_DISCOVERY_AUDIO_CODEC_Private_Types - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_AUDIO_CODEC_Private_Defines - * @{ - */ - -/* Mask for the bit EN of the I2S CFGR register */ -#define I2S_ENABLE_MASK 0x0400 - -/* Delay for the Codec to be correctly reset */ -#define CODEC_RESET_DELAY 0x4FFF - -/* Codec audio Standards */ -#ifdef I2S_STANDARD_PHILLIPS - #define CODEC_STANDARD 0x04 - #define I2S_STANDARD I2S_Standard_Phillips -#elif defined(I2S_STANDARD_MSB) - #define CODEC_STANDARD 0x00 - #define I2S_STANDARD I2S_Standard_MSB -#elif defined(I2S_STANDARD_LSB) - #define CODEC_STANDARD 0x08 - #define I2S_STANDARD I2S_Standard_LSB -#else - #error "Error: No audio communication standard selected !" -#endif /* I2S_STANDARD */ - -/* The 7 bits Codec address (sent through I2C interface) */ -#define CODEC_ADDRESS 0x94 /* b00100111 */ -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_AUDIO_CODEC_Private_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_AUDIO_CODEC_Private_Variables - * @{ - */ -/* This structure is declared global because it is handled by two different functions */ -DMA_InitTypeDef DMA_InitStructure; -DMA_InitTypeDef AUDIO_MAL_DMA_InitStructure; - -uint32_t AudioTotalSize = 0xFFFF; /* This variable holds the total size of the audio file */ -uint32_t AudioRemSize = 0xFFFF; /* This variable holds the remaining data in audio file */ -uint16_t *CurrentPos ; /* This variable holds the current position of audio pointer */ - -__IO uint32_t CODECTimeout = CODEC_LONG_TIMEOUT; -__IO uint8_t OutputDev = 0; - - -__IO uint32_t CurrAudioInterface = AUDIO_INTERFACE_I2S; //AUDIO_INTERFACE_DAC -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_AUDIO_CODEC_Private_Function_Prototypes - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_AUDIO_CODEC_Private_Functions - * @{ - */ -static void Audio_MAL_IRQHandler(void); -/*----------------------------------- - Audio Codec functions - ------------------------------------------*/ -/* High Layer codec functions */ -static uint32_t Codec_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq); -static uint32_t Codec_DeInit(void); -static uint32_t Codec_Play(void); -static uint32_t Codec_PauseResume(uint32_t Cmd); -static uint32_t Codec_Stop(uint32_t Cmd); -static uint32_t Codec_VolumeCtrl(uint8_t Volume); -static uint32_t Codec_Mute(uint32_t Cmd); -/* Low layer codec functions */ -static void Codec_CtrlInterface_Init(void); -static void Codec_CtrlInterface_DeInit(void); -static void Codec_AudioInterface_Init(uint32_t AudioFreq); -static void Codec_AudioInterface_DeInit(void); -static void Codec_Reset(void); -static uint32_t Codec_WriteRegister(uint8_t RegisterAddr, uint8_t RegisterValue); -static uint32_t Codec_ReadRegister(uint8_t RegisterAddr); -static void Codec_GPIO_Init(void); -static void Codec_GPIO_DeInit(void); -static void Delay(__IO uint32_t nCount); -/*----------------------------------------------------------------------------*/ - -/*----------------------------------- - MAL (Media Access Layer) functions - ------------------------------------------*/ -/* Peripherals configuration functions */ -static void Audio_MAL_Init(void); -static void Audio_MAL_DeInit(void); -static void Audio_MAL_PauseResume(uint32_t Cmd, uint32_t Addr); -static void Audio_MAL_Stop(void); -/*----------------------------------------------------------------------------*/ - - /* DMA Stream definitions */ - uint32_t AUDIO_MAL_DMA_CLOCK = AUDIO_I2S_DMA_CLOCK; - DMA_Stream_TypeDef * AUDIO_MAL_DMA_STREAM = AUDIO_I2S_DMA_STREAM ; - uint32_t AUDIO_MAL_DMA_DREG = AUDIO_I2S_DMA_DREG; - uint32_t AUDIO_MAL_DMA_CHANNEL = AUDIO_I2S_DMA_CHANNEL; - uint32_t AUDIO_MAL_DMA_IRQ = AUDIO_I2S_DMA_IRQ ; - uint32_t AUDIO_MAL_DMA_FLAG_TC = AUDIO_I2S_DMA_FLAG_TC; - uint32_t AUDIO_MAL_DMA_FLAG_HT = AUDIO_I2S_DMA_FLAG_HT; - uint32_t AUDIO_MAL_DMA_FLAG_FE = AUDIO_I2S_DMA_FLAG_FE; - uint32_t AUDIO_MAL_DMA_FLAG_TE = AUDIO_I2S_DMA_FLAG_TE; - uint32_t AUDIO_MAL_DMA_FLAG_DME = AUDIO_I2S_DMA_FLAG_DME; - -/** - * @brief Set the current audio interface (I2S or DAC). - * @param Interface: AUDIO_INTERFACE_I2S or AUDIO_INTERFACE_DAC - * @retval None - */ -void EVAL_AUDIO_SetAudioInterface(uint32_t Interface) -{ - CurrAudioInterface = Interface; - - if (CurrAudioInterface == AUDIO_INTERFACE_I2S) - { - /* DMA Stream definitions */ - AUDIO_MAL_DMA_CLOCK = AUDIO_I2S_DMA_CLOCK; - AUDIO_MAL_DMA_STREAM = AUDIO_I2S_DMA_STREAM; - AUDIO_MAL_DMA_DREG = AUDIO_I2S_DMA_DREG; - AUDIO_MAL_DMA_CHANNEL = AUDIO_I2S_DMA_CHANNEL; - AUDIO_MAL_DMA_IRQ = AUDIO_I2S_DMA_IRQ ; - AUDIO_MAL_DMA_FLAG_TC = AUDIO_I2S_DMA_FLAG_TC; - AUDIO_MAL_DMA_FLAG_HT = AUDIO_I2S_DMA_FLAG_HT; - AUDIO_MAL_DMA_FLAG_FE = AUDIO_I2S_DMA_FLAG_FE; - AUDIO_MAL_DMA_FLAG_TE = AUDIO_I2S_DMA_FLAG_TE; - AUDIO_MAL_DMA_FLAG_DME = AUDIO_I2S_DMA_FLAG_DME; - } - else if (Interface == AUDIO_INTERFACE_DAC) - { - /* DMA Stream definitions */ - AUDIO_MAL_DMA_CLOCK = AUDIO_DAC_DMA_CLOCK; - AUDIO_MAL_DMA_STREAM = AUDIO_DAC_DMA_STREAM; - AUDIO_MAL_DMA_DREG = AUDIO_DAC_DMA_DREG; - AUDIO_MAL_DMA_CHANNEL = AUDIO_DAC_DMA_CHANNEL; - AUDIO_MAL_DMA_IRQ = AUDIO_DAC_DMA_IRQ ; - AUDIO_MAL_DMA_FLAG_TC = AUDIO_DAC_DMA_FLAG_TC; - AUDIO_MAL_DMA_FLAG_HT = AUDIO_DAC_DMA_FLAG_HT; - AUDIO_MAL_DMA_FLAG_FE = AUDIO_DAC_DMA_FLAG_FE; - AUDIO_MAL_DMA_FLAG_TE = AUDIO_DAC_DMA_FLAG_TE; - AUDIO_MAL_DMA_FLAG_DME = AUDIO_DAC_DMA_FLAG_DME; - } -} - -/** - * @brief Configure the audio peripherals. - * @param OutputDevice: OUTPUT_DEVICE_SPEAKER, OUTPUT_DEVICE_HEADPHONE, - * OUTPUT_DEVICE_BOTH or OUTPUT_DEVICE_AUTO . - * @param Volume: Initial volume level (from 0 (Mute) to 100 (Max)) - * @param AudioFreq: Audio frequency used to play the audio stream. - * @retval 0 if correct communication, else wrong communication - */ -uint32_t EVAL_AUDIO_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq) -{ - /* Perform low layer Codec initialization */ - if (Codec_Init(OutputDevice, VOLUME_CONVERT(Volume), AudioFreq) != 0) - { - return 1; - } - else - { - /* I2S data transfer preparation: - Prepare the Media to be used for the audio transfer from memory to I2S peripheral */ - Audio_MAL_Init(); - - /* Return 0 when all operations are OK */ - return 0; - } -} - -/** - * @brief Deinitializes all the resources used by the codec (those initialized - * by EVAL_AUDIO_Init() function). - * @param None - * @retval 0 if correct communication, else wrong communication - */ -uint32_t EVAL_AUDIO_DeInit(void) -{ - /* DeInitialize the Media layer */ - Audio_MAL_DeInit(); - - /* DeInitialize Codec */ - Codec_DeInit(); - - return 0; -} - -/** - * @brief Starts playing audio stream from a data buffer for a determined size. - * @param pBuffer: Pointer to the buffer - * @param Size: Number of audio data BYTES. - * @retval 0 if correct communication, else wrong communication - */ -uint32_t EVAL_AUDIO_Play(uint16_t* pBuffer, uint32_t Size) -{ - /* Set the total number of data to be played (count in half-word) */ - AudioTotalSize = Size; - - /* Call the audio Codec Play function */ - Codec_Play(); - - /* Update the Media layer and enable it for play */ - Audio_MAL_Play((uint32_t)pBuffer, (uint32_t)(DMA_MAX(Size/4))); - - /* Update the remaining number of data to be played */ - AudioRemSize = (Size/2) - DMA_MAX(AudioTotalSize); - - /* Update the current audio pointer position */ - CurrentPos = pBuffer + DMA_MAX(AudioTotalSize); - - return 0; -} - -/** - * @brief This function Pauses or Resumes the audio file stream. In case - * of using DMA, the DMA Pause feature is used. In all cases the I2S - * peripheral is disabled. - * - * @WARNING When calling EVAL_AUDIO_PauseResume() function for pause, only - * this function should be called for resume (use of EVAL_AUDIO_Play() - * function for resume could lead to unexpected behavior). - * - * @param Cmd: AUDIO_PAUSE (or 0) to pause, AUDIO_RESUME (or any value different - * from 0) to resume. - * @retval 0 if correct communication, else wrong communication - */ -uint32_t EVAL_AUDIO_PauseResume(uint32_t Cmd) -{ - /* Call the Audio Codec Pause/Resume function */ - if (Codec_PauseResume(Cmd) != 0) - { - return 1; - } - else - { - /* Call the Media layer pause/resume function */ - Audio_MAL_PauseResume(Cmd, 0); - - /* Return 0 if all operations are OK */ - return 0; - } -} - -/** - * @brief Stops audio playing and Power down the Audio Codec. - * @param Option: could be one of the following parameters - * - CODEC_PDWN_SW: for software power off (by writing registers). - * Then no need to reconfigure the Codec after power on. - * - CODEC_PDWN_HW: completely shut down the codec (physically). - * Then need to reconfigure the Codec after power on. - * @retval 0 if correct communication, else wrong communication - */ -uint32_t EVAL_AUDIO_Stop(uint32_t Option) -{ - /* Call Audio Codec Stop function */ - if (Codec_Stop(Option) != 0) - { - return 1; - } - else - { - /* Call Media layer Stop function */ - Audio_MAL_Stop(); - - /* Update the remaining data number */ - AudioRemSize = AudioTotalSize; - - /* Return 0 when all operations are correctly done */ - return 0; - } -} - -/** - * @brief Controls the current audio volume level. - * @param Volume: Volume level to be set in percentage from 0% to 100% (0 for - * Mute and 100 for Max volume level). - * @retval 0 if correct communication, else wrong communication - */ -uint32_t EVAL_AUDIO_VolumeCtl(uint8_t Volume) -{ - /* Call the codec volume control function with converted volume value */ - return (Codec_VolumeCtrl(VOLUME_CONVERT(Volume))); -} - -/** - * @brief Enables or disables the MUTE mode by software - * @param Command: could be AUDIO_MUTE_ON to mute sound or AUDIO_MUTE_OFF to - * unmute the codec and restore previous volume level. - * @retval 0 if correct communication, else wrong communication - */ -uint32_t EVAL_AUDIO_Mute(uint32_t Cmd) -{ - /* Call the Codec Mute function */ - return (Codec_Mute(Cmd)); -} - -/** - * @brief This function handles main Media layer interrupt. - * @param None - * @retval 0 if correct communication, else wrong communication - */ -static void Audio_MAL_IRQHandler(void) -{ -#ifndef AUDIO_MAL_MODE_NORMAL - uint16_t *pAddr = (uint16_t *)CurrentPos; - uint32_t Size = AudioRemSize; -#endif /* AUDIO_MAL_MODE_NORMAL */ - -#ifdef AUDIO_MAL_DMA_IT_TC_EN - /* Transfer complete interrupt */ - if (DMA_GetFlagStatus(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_TC) != RESET) - { - #ifdef AUDIO_MAL_MODE_NORMAL - /* Check if the end of file has been reached */ - if (AudioRemSize > 0) - { - /* Wait the DMA Stream to be effectively disabled */ - while (DMA_GetCmdStatus(AUDIO_MAL_DMA_STREAM) != DISABLE) - {} - - /* Clear the Interrupt flag */ - DMA_ClearFlag(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_TC); - - /* Re-Configure the buffer address and size */ - DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) CurrentPos; - DMA_InitStructure.DMA_BufferSize = (uint32_t) (DMA_MAX(AudioRemSize)); - - /* Configure the DMA Stream with the new parameters */ - DMA_Init(AUDIO_MAL_DMA_STREAM, &DMA_InitStructure); - - /* Enable the I2S DMA Stream*/ - DMA_Cmd(AUDIO_MAL_DMA_STREAM, ENABLE); - - /* Update the current pointer position */ - CurrentPos += DMA_MAX(AudioRemSize); - - /* Update the remaining number of data to be played */ - AudioRemSize -= DMA_MAX(AudioRemSize); - /* Enable the I2S DMA Stream*/ - DMA_Cmd(AUDIO_MAL_DMA_STREAM, ENABLE); - } - else - { - /* Disable the I2S DMA Stream*/ - DMA_Cmd(AUDIO_MAL_DMA_STREAM, DISABLE); - - /* Clear the Interrupt flag */ - DMA_ClearFlag(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_TC); - - /* Manage the remaining file size and new address offset: This function - should be coded by user (its prototype is already declared in stm32f4_discovery_audio_codec.h) */ - EVAL_AUDIO_TransferComplete_CallBack((uint32_t)CurrentPos, 0); - } - - #elif defined(AUDIO_MAL_MODE_CIRCULAR) - /* Manage the remaining file size and new address offset: This function - should be coded by user (its prototype is already declared in stm32f4_discovery_audio_codec.h) */ - EVAL_AUDIO_TransferComplete_CallBack(pAddr, Size); - - /* Clear the Interrupt flag */ - DMA_ClearFlag(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_TC); - #endif /* AUDIO_MAL_MODE_NORMAL */ - } -#endif /* AUDIO_MAL_DMA_IT_TC_EN */ - -#ifdef AUDIO_MAL_DMA_IT_HT_EN - /* Half Transfer complete interrupt */ - if (DMA_GetFlagStatus(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_HT) != RESET) - { - /* Manage the remaining file size and new address offset: This function - should be coded by user (its prototype is already declared in stm32f4_discovery_audio_codec.h) */ - EVAL_AUDIO_HalfTransfer_CallBack((uint32_t)pAddr, Size); - - /* Clear the Interrupt flag */ - DMA_ClearFlag(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_HT); - } -#endif /* AUDIO_MAL_DMA_IT_HT_EN */ - -#ifdef AUDIO_MAL_DMA_IT_TE_EN - /* FIFO Error interrupt */ - if ((DMA_GetFlagStatus(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_TE) != RESET) || \ - (DMA_GetFlagStatus(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_FE) != RESET) || \ - (DMA_GetFlagStatus(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_DME) != RESET)) - - { - /* Manage the error generated on DMA FIFO: This function - should be coded by user (its prototype is already declared in stm32f4_discovery_audio_codec.h) */ - EVAL_AUDIO_Error_CallBack((uint32_t*)&pAddr); - - /* Clear the Interrupt flag */ - DMA_ClearFlag(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_TE | AUDIO_MAL_DMA_FLAG_FE | \ - AUDIO_MAL_DMA_FLAG_DME); - } -#endif /* AUDIO_MAL_DMA_IT_TE_EN */ -} - -/** - * @brief This function handles main I2S interrupt. - * @param None - * @retval 0 if correct communication, else wrong communication - */ -void Audio_MAL_I2S_IRQHandler(void) -{ - Audio_MAL_IRQHandler(); -} - -/** - * @brief This function handles main DAC interrupt. - * @param None - * @retval 0 if correct communication, else wrong communication - */ -void Audio_MAL_DAC_IRQHandler(void) -{ - Audio_MAL_IRQHandler(); -} - -/** - * @brief I2S interrupt management - * @param None - * @retval None - */ -void Audio_I2S_IRQHandler(void) -{ - /* Check on the I2S TXE flag */ - if (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) != RESET) - { - if (CurrAudioInterface == AUDIO_INTERFACE_DAC) - { - /* Wirte data to the DAC interface */ - DAC_SetChannel1Data(DAC_Align_12b_L, EVAL_AUDIO_GetSampleCallBack()); - } - - /* Send dummy data on I2S to avoid the underrun condition */ - SPI_I2S_SendData(CODEC_I2S, EVAL_AUDIO_GetSampleCallBack()); - } -} -/*======================== - - CS43L22 Audio Codec Control Functions - ==============================*/ -/** - * @brief Initializes the audio codec and all related interfaces (control - * interface: I2C and audio interface: I2S) - * @param OutputDevice: can be OUTPUT_DEVICE_SPEAKER, OUTPUT_DEVICE_HEADPHONE, - * OUTPUT_DEVICE_BOTH or OUTPUT_DEVICE_AUTO . - * @param Volume: Initial volume level (from 0 (Mute) to 100 (Max)) - * @param AudioFreq: Audio frequency used to play the audio stream. - * @retval 0 if correct communication, else wrong communication - */ -static uint32_t Codec_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq) -{ - uint32_t counter = 0; - - /* Configure the Codec related IOs */ - Codec_GPIO_Init(); - - /* Reset the Codec Registers */ - Codec_Reset(); - - /* Initialize the Control interface of the Audio Codec */ - Codec_CtrlInterface_Init(); - - /* Keep Codec powered OFF */ - counter += Codec_WriteRegister(0x02, 0x01); - - counter += Codec_WriteRegister(0x04, 0xAF); /* SPK always OFF & HP always ON */ - OutputDev = 0xAF; - - /* Clock configuration: Auto detection */ - counter += Codec_WriteRegister(0x05, 0x81); - - /* Set the Slave Mode and the audio Standard */ - counter += Codec_WriteRegister(0x06, CODEC_STANDARD); - - /* Set the Master volume */ - Codec_VolumeCtrl(Volume); - - if (CurrAudioInterface == AUDIO_INTERFACE_DAC) - { - /* Enable the PassThrough on AIN1A and AIN1B */ - counter += Codec_WriteRegister(0x08, 0x01); - counter += Codec_WriteRegister(0x09, 0x01); - - /* Route the analog input to the HP line */ - counter += Codec_WriteRegister(0x0E, 0xC0); - - /* Set the Passthough volume */ - counter += Codec_WriteRegister(0x14, 0x00); - counter += Codec_WriteRegister(0x15, 0x00); - } - - /* Power on the Codec */ - counter += Codec_WriteRegister(0x02, 0x9E); - - /* Additional configuration for the CODEC. These configurations are done to reduce - the time needed for the Codec to power off. If these configurations are removed, - then a long delay should be added between powering off the Codec and switching - off the I2S peripheral MCLK clock (which is the operating clock for Codec). - If this delay is not inserted, then the codec will not shut down properly and - it results in high noise after shut down. */ - - /* Disable the analog soft ramp */ - counter += Codec_WriteRegister(0x0A, 0x00); - if (CurrAudioInterface != AUDIO_INTERFACE_DAC) - { - /* Disable the digital soft ramp */ - counter += Codec_WriteRegister(0x0E, 0x04); - } - /* Disable the limiter attack level */ - counter += Codec_WriteRegister(0x27, 0x00); - /* Adjust Bass and Treble levels */ - counter += Codec_WriteRegister(0x1F, 0x0F); - /* Adjust PCM volume level */ - counter += Codec_WriteRegister(0x1A, 0x0A); - counter += Codec_WriteRegister(0x1B, 0x0A); - - /* Configure the I2S peripheral */ - Codec_AudioInterface_Init(AudioFreq); - - /* Return communication control value */ - return counter; -} - -/** - * @brief Restore the audio codec state to default state and free all used - * resources. - * @param None - * @retval 0 if correct communication, else wrong communication - */ -static uint32_t Codec_DeInit(void) -{ - uint32_t counter = 0; - - /* Reset the Codec Registers */ - Codec_Reset(); - - /* Keep Codec powered OFF */ - counter += Codec_WriteRegister(0x02, 0x01); - - /* Deinitialize all use GPIOs */ - Codec_GPIO_DeInit(); - - /* Disable the Codec control interface */ - Codec_CtrlInterface_DeInit(); - - /* Deinitialize the Codec audio interface (I2S) */ - Codec_AudioInterface_DeInit(); - - /* Return communication control value */ - return counter; -} - -/** - * @brief Start the audio Codec play feature. - * @note For this codec no Play options are required. - * @param None - * @retval 0 if correct communication, else wrong communication - */ -static uint32_t Codec_Play(void) -{ - /* - No actions required on Codec level for play command - */ - - /* Return communication control value */ - return 0; -} - -/** - * @brief Pauses and resumes playing on the audio codec. - * @param Cmd: AUDIO_PAUSE (or 0) to pause, AUDIO_RESUME (or any value different - * from 0) to resume. - * @retval 0 if correct communication, else wrong communication - */ -static uint32_t Codec_PauseResume(uint32_t Cmd) -{ - uint32_t counter = 0; - - /* Pause the audio file playing */ - if (Cmd == AUDIO_PAUSE) - { - /* Mute the output first */ - counter += Codec_Mute(AUDIO_MUTE_ON); - - /* Put the Codec in Power save mode */ - counter += Codec_WriteRegister(0x02, 0x01); - } - else /* AUDIO_RESUME */ - { - /* Unmute the output first */ - counter += Codec_Mute(AUDIO_MUTE_OFF); - - counter += Codec_WriteRegister(0x04, OutputDev); - - /* Exit the Power save mode */ - counter += Codec_WriteRegister(0x02, 0x9E); - } - - return counter; -} - -/** - * @brief Stops audio Codec playing. It powers down the codec. - * @param CodecPdwnMode: selects the power down mode. - * - CODEC_PDWN_SW: only mutes the audio codec. When resuming from this - * mode the codec keeps the previous initialization - * (no need to re-Initialize the codec registers). - * - CODEC_PDWN_HW: Physically power down the codec. When resuming from this - * mode, the codec is set to default configuration - * (user should re-Initialize the codec in order to - * play again the audio stream). - * @retval 0 if correct communication, else wrong communication - */ -static uint32_t Codec_Stop(uint32_t CodecPdwnMode) -{ - uint32_t counter = 0; - - /* Mute the output first */ - Codec_Mute(AUDIO_MUTE_ON); - - if (CodecPdwnMode == CODEC_PDWN_SW) - { - /* Power down the DAC and the speaker (PMDAC and PMSPK bits)*/ - counter += Codec_WriteRegister(0x02, 0x9F); - } - else /* CODEC_PDWN_HW */ - { - /* Power down the DAC components */ - counter += Codec_WriteRegister(0x02, 0x9F); - - /* Wait at least 100us */ - Delay(0xFFF); - - /* Reset The pin */ - GPIO_WriteBit(AUDIO_RESET_GPIO, AUDIO_RESET_PIN, Bit_RESET); - } - - return counter; -} - -/** - * @brief Sets higher or lower the codec volume level. - * @param Volume: a byte value from 0 to 255 (refer to codec registers - * description for more details). - * @retval 0 if correct communication, else wrong communication - */ -static uint32_t Codec_VolumeCtrl(uint8_t Volume) -{ - uint32_t counter = 0; - - if (Volume > 0xE6) - { - /* Set the Master volume */ - counter += Codec_WriteRegister(0x20, Volume - 0xE7); - counter += Codec_WriteRegister(0x21, Volume - 0xE7); - } - else - { - /* Set the Master volume */ - counter += Codec_WriteRegister(0x20, Volume + 0x19); - counter += Codec_WriteRegister(0x21, Volume + 0x19); - } - - return counter; -} - -/** - * @brief Enables or disables the mute feature on the audio codec. - * @param Cmd: AUDIO_MUTE_ON to enable the mute or AUDIO_MUTE_OFF to disable the - * mute mode. - * @retval 0 if correct communication, else wrong communication - */ -static uint32_t Codec_Mute(uint32_t Cmd) -{ - uint32_t counter = 0; - - /* Set the Mute mode */ - if (Cmd == AUDIO_MUTE_ON) - { - counter += Codec_WriteRegister(0x04, 0xFF); - } - else /* AUDIO_MUTE_OFF Disable the Mute */ - { - counter += Codec_WriteRegister(0x04, OutputDev); - } - - return counter; -} - -/** - * @brief Resets the audio codec. It restores the default configuration of the - * codec (this function shall be called before initializing the codec). - * @note This function calls an external driver function: The IO Expander driver. - * @param None - * @retval None - */ -static void Codec_Reset(void) -{ - /* Power Down the codec */ - GPIO_WriteBit(AUDIO_RESET_GPIO, AUDIO_RESET_PIN, Bit_RESET); - - /* wait for a delay to insure registers erasing */ - Delay(CODEC_RESET_DELAY); - - /* Power on the codec */ - GPIO_WriteBit(AUDIO_RESET_GPIO, AUDIO_RESET_PIN, Bit_SET); -} - -/** - * @brief Writes a Byte to a given register into the audio codec through the - control interface (I2C) - * @param RegisterAddr: The address (location) of the register to be written. - * @param RegisterValue: the Byte value to be written into destination register. - * @retval 0 if correct communication, else wrong communication - */ -static uint32_t Codec_WriteRegister(uint8_t RegisterAddr, uint8_t RegisterValue) -{ - uint32_t result = 0; - - /*!< While the bus is busy */ - CODECTimeout = CODEC_LONG_TIMEOUT; - while(I2C_GetFlagStatus(CODEC_I2C, I2C_FLAG_BUSY)) - { - if((CODECTimeout--) == 0) return Codec_TIMEOUT_UserCallback(); - } - - /* Start the config sequence */ - I2C_GenerateSTART(CODEC_I2C, ENABLE); - - /* Test on EV5 and clear it */ - CODECTimeout = CODEC_FLAG_TIMEOUT; - while (!I2C_CheckEvent(CODEC_I2C, I2C_EVENT_MASTER_MODE_SELECT)) - { - if((CODECTimeout--) == 0) return Codec_TIMEOUT_UserCallback(); - } - - /* Transmit the slave address and enable writing operation */ - I2C_Send7bitAddress(CODEC_I2C, CODEC_ADDRESS, I2C_Direction_Transmitter); - - /* Test on EV6 and clear it */ - CODECTimeout = CODEC_FLAG_TIMEOUT; - while (!I2C_CheckEvent(CODEC_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) - { - if((CODECTimeout--) == 0) return Codec_TIMEOUT_UserCallback(); - } - - /* Transmit the first address for write operation */ - I2C_SendData(CODEC_I2C, RegisterAddr); - - /* Test on EV8 and clear it */ - CODECTimeout = CODEC_FLAG_TIMEOUT; - while (!I2C_CheckEvent(CODEC_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTING)) - { - if((CODECTimeout--) == 0) return Codec_TIMEOUT_UserCallback(); - } - - /* Prepare the register value to be sent */ - I2C_SendData(CODEC_I2C, RegisterValue); - - /*!< Wait till all data have been physically transferred on the bus */ - CODECTimeout = CODEC_LONG_TIMEOUT; - while(!I2C_GetFlagStatus(CODEC_I2C, I2C_FLAG_BTF)) - { - if((CODECTimeout--) == 0) Codec_TIMEOUT_UserCallback(); - } - - /* End the configuration sequence */ - I2C_GenerateSTOP(CODEC_I2C, ENABLE); - -#ifdef VERIFY_WRITTENDATA - /* Verify that the data has been correctly written */ - result = (Codec_ReadRegister(RegisterAddr) == RegisterValue)? 0:1; -#endif /* VERIFY_WRITTENDATA */ - - /* Return the verifying value: 0 (Passed) or 1 (Failed) */ - return result; -} - -/** - * @brief Reads and returns the value of an audio codec register through the - * control interface (I2C). - * @param RegisterAddr: Address of the register to be read. - * @retval Value of the register to be read or dummy value if the communication - * fails. - */ -static uint32_t Codec_ReadRegister(uint8_t RegisterAddr) -{ - uint32_t result = 0; - - /*!< While the bus is busy */ - CODECTimeout = CODEC_LONG_TIMEOUT; - while(I2C_GetFlagStatus(CODEC_I2C, I2C_FLAG_BUSY)) - { - if((CODECTimeout--) == 0) return Codec_TIMEOUT_UserCallback(); - } - - /* Start the config sequence */ - I2C_GenerateSTART(CODEC_I2C, ENABLE); - - /* Test on EV5 and clear it */ - CODECTimeout = CODEC_FLAG_TIMEOUT; - while (!I2C_CheckEvent(CODEC_I2C, I2C_EVENT_MASTER_MODE_SELECT)) - { - if((CODECTimeout--) == 0) return Codec_TIMEOUT_UserCallback(); - } - - /* Transmit the slave address and enable writing operation */ - I2C_Send7bitAddress(CODEC_I2C, CODEC_ADDRESS, I2C_Direction_Transmitter); - - /* Test on EV6 and clear it */ - CODECTimeout = CODEC_FLAG_TIMEOUT; - while (!I2C_CheckEvent(CODEC_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) - { - if((CODECTimeout--) == 0) return Codec_TIMEOUT_UserCallback(); - } - - /* Transmit the register address to be read */ - I2C_SendData(CODEC_I2C, RegisterAddr); - - /* Test on EV8 and clear it */ - CODECTimeout = CODEC_FLAG_TIMEOUT; - while (I2C_GetFlagStatus(CODEC_I2C, I2C_FLAG_BTF) == RESET) - { - if((CODECTimeout--) == 0) return Codec_TIMEOUT_UserCallback(); - } - - /*!< Send START condition a second time */ - I2C_GenerateSTART(CODEC_I2C, ENABLE); - - /*!< Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */ - CODECTimeout = CODEC_FLAG_TIMEOUT; - while(!I2C_CheckEvent(CODEC_I2C, I2C_EVENT_MASTER_MODE_SELECT)) - { - if((CODECTimeout--) == 0) return Codec_TIMEOUT_UserCallback(); - } - - /*!< Send Codec address for read */ - I2C_Send7bitAddress(CODEC_I2C, CODEC_ADDRESS, I2C_Direction_Receiver); - - /* Wait on ADDR flag to be set (ADDR is still not cleared at this level */ - CODECTimeout = CODEC_FLAG_TIMEOUT; - while(I2C_GetFlagStatus(CODEC_I2C, I2C_FLAG_ADDR) == RESET) - { - if((CODECTimeout--) == 0) return Codec_TIMEOUT_UserCallback(); - } - - /*!< Disable Acknowledgment */ - I2C_AcknowledgeConfig(CODEC_I2C, DISABLE); - - /* Clear ADDR register by reading SR1 then SR2 register (SR1 has already been read) */ - (void)CODEC_I2C->SR2; - - /*!< Send STOP Condition */ - I2C_GenerateSTOP(CODEC_I2C, ENABLE); - - /* Wait for the byte to be received */ - CODECTimeout = CODEC_FLAG_TIMEOUT; - while(I2C_GetFlagStatus(CODEC_I2C, I2C_FLAG_RXNE) == RESET) - { - if((CODECTimeout--) == 0) return Codec_TIMEOUT_UserCallback(); - } - - /*!< Read the byte received from the Codec */ - result = I2C_ReceiveData(CODEC_I2C); - - /* Wait to make sure that STOP flag has been cleared */ - CODECTimeout = CODEC_FLAG_TIMEOUT; - while(CODEC_I2C->CR1 & I2C_CR1_STOP) - { - if((CODECTimeout--) == 0) return Codec_TIMEOUT_UserCallback(); - } - - /*!< Re-Enable Acknowledgment to be ready for another reception */ - I2C_AcknowledgeConfig(CODEC_I2C, ENABLE); - - /* Clear AF flag for next communication */ - I2C_ClearFlag(CODEC_I2C, I2C_FLAG_AF); - - /* Return the byte read from Codec */ - return result; -} - -/** - * @brief Initializes the Audio Codec control interface (I2C). - * @param None - * @retval None - */ -static void Codec_CtrlInterface_Init(void) -{ - I2C_InitTypeDef I2C_InitStructure; - - /* Enable the CODEC_I2C peripheral clock */ - RCC_APB1PeriphClockCmd(CODEC_I2C_CLK, ENABLE); - - /* CODEC_I2C peripheral configuration */ - I2C_DeInit(CODEC_I2C); - I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; - I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; - I2C_InitStructure.I2C_OwnAddress1 = 0x33; - I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; - I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; - I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED; - /* Enable the I2C peripheral */ - I2C_Cmd(CODEC_I2C, ENABLE); - I2C_Init(CODEC_I2C, &I2C_InitStructure); -} - -/** - * @brief Restore the Audio Codec control interface to its default state. - * This function doesn't de-initialize the I2C because the I2C peripheral - * may be used by other modules. - * @param None - * @retval None - */ -static void Codec_CtrlInterface_DeInit(void) -{ - /* Disable the I2C peripheral */ /* This step is not done here because - the I2C interface can be used by other modules */ - /* I2C_DeInit(CODEC_I2C); */ -} - -/** - * @brief Initializes the Audio Codec audio interface (I2S) - * @note This function assumes that the I2S input clock (through PLL_R in - * Devices RevA/Z and through dedicated PLLI2S_R in Devices RevB/Y) - * is already configured and ready to be used. - * @param AudioFreq: Audio frequency to be configured for the I2S peripheral. - * @retval None - */ -static void Codec_AudioInterface_Init(uint32_t AudioFreq) -{ - I2S_InitTypeDef I2S_InitStructure; - DAC_InitTypeDef DAC_InitStructure; - - /* Enable the CODEC_I2S peripheral clock */ - RCC_APB1PeriphClockCmd(CODEC_I2S_CLK, ENABLE); - - /* CODEC_I2S peripheral configuration */ - SPI_I2S_DeInit(CODEC_I2S); - I2S_InitStructure.I2S_AudioFreq = AudioFreq; - I2S_InitStructure.I2S_Standard = I2S_STANDARD; - I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b; - I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low; -#ifdef DAC_USE_I2S_DMA - if (CurrAudioInterface == AUDIO_INTERFACE_DAC) - { - I2S_InitStructure.I2S_Mode = I2S_Mode_MasterRx; - } - else - { -#else - I2S_InitStructure.I2S_Mode = I2S_Mode_MasterTx; -#endif -#ifdef DAC_USE_I2S_DMA - } -#endif /* DAC_USE_I2S_DMA */ -#ifdef CODEC_MCLK_ENABLED - I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Enable; -#elif defined(CODEC_MCLK_DISABLED) - I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable; -#else -#error "No selection for the MCLK output has been defined !" -#endif /* CODEC_MCLK_ENABLED */ - - /* Initialize the I2S peripheral with the structure above */ - I2S_Init(CODEC_I2S, &I2S_InitStructure); - - - /* Configure the DAC interface */ - if (CurrAudioInterface == AUDIO_INTERFACE_DAC) - { - /* DAC Periph clock enable */ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); - - /* DAC channel1 Configuration */ - DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; - DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; - DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; - DAC_Init(AUDIO_DAC_CHANNEL, &DAC_InitStructure); - - /* Enable DAC Channel1 */ - DAC_Cmd(AUDIO_DAC_CHANNEL, ENABLE); - } - - /* The I2S peripheral will be enabled only in the EVAL_AUDIO_Play() function - or by user functions if DMA mode not enabled */ -} - -/** - * @brief Restores the Audio Codec audio interface to its default state. - * @param None - * @retval None - */ -static void Codec_AudioInterface_DeInit(void) -{ - /* Disable the CODEC_I2S peripheral (in case it hasn't already been disabled) */ - I2S_Cmd(CODEC_I2S, DISABLE); - - /* Deinitialize the CODEC_I2S peripheral */ - SPI_I2S_DeInit(CODEC_I2S); - - /* Disable the CODEC_I2S peripheral clock */ - RCC_APB1PeriphClockCmd(CODEC_I2S_CLK, DISABLE); -} - -/** - * @brief Initializes IOs used by the Audio Codec (on the control and audio - * interfaces). - * @param None - * @retval None - */ -static void Codec_GPIO_Init(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - /* Enable Reset GPIO Clock */ - RCC_AHB1PeriphClockCmd(AUDIO_RESET_GPIO_CLK,ENABLE); - - /* Audio reset pin configuration -------------------------------------------------*/ - GPIO_InitStructure.GPIO_Pin = AUDIO_RESET_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(AUDIO_RESET_GPIO, &GPIO_InitStructure); - - /* Enable I2S and I2C GPIO clocks */ - RCC_AHB1PeriphClockCmd(CODEC_I2C_GPIO_CLOCK | CODEC_I2S_GPIO_CLOCK, ENABLE); - - /* CODEC_I2C SCL and SDA pins configuration -------------------------------------*/ - GPIO_InitStructure.GPIO_Pin = CODEC_I2C_SCL_PIN | CODEC_I2C_SDA_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(CODEC_I2C_GPIO, &GPIO_InitStructure); - /* Connect pins to I2C peripheral */ - GPIO_PinAFConfig(CODEC_I2C_GPIO, CODEC_I2S_SCL_PINSRC, CODEC_I2C_GPIO_AF); - GPIO_PinAFConfig(CODEC_I2C_GPIO, CODEC_I2S_SDA_PINSRC, CODEC_I2C_GPIO_AF); - - /* CODEC_I2S pins configuration: WS, SCK and SD pins -----------------------------*/ - GPIO_InitStructure.GPIO_Pin = CODEC_I2S_SCK_PIN | CODEC_I2S_SD_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(CODEC_I2S_GPIO, &GPIO_InitStructure); - - /* Connect pins to I2S peripheral */ - GPIO_PinAFConfig(CODEC_I2S_WS_GPIO, CODEC_I2S_WS_PINSRC, CODEC_I2S_GPIO_AF); - GPIO_PinAFConfig(CODEC_I2S_GPIO, CODEC_I2S_SCK_PINSRC, CODEC_I2S_GPIO_AF); - - if (CurrAudioInterface != AUDIO_INTERFACE_DAC) - { - GPIO_InitStructure.GPIO_Pin = CODEC_I2S_WS_PIN ; - GPIO_Init(CODEC_I2S_WS_GPIO, &GPIO_InitStructure); - GPIO_PinAFConfig(CODEC_I2S_GPIO, CODEC_I2S_SD_PINSRC, CODEC_I2S_GPIO_AF); - } - else - { - /* GPIOA clock enable (to be used with DAC) */ - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - - /* DAC channel 1 & 2 (DAC_OUT1 = PA.4) configuration */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOA, &GPIO_InitStructure); - } - -#ifdef CODEC_MCLK_ENABLED - /* CODEC_I2S pins configuration: MCK pin */ - GPIO_InitStructure.GPIO_Pin = CODEC_I2S_MCK_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(CODEC_I2S_MCK_GPIO, &GPIO_InitStructure); - /* Connect pins to I2S peripheral */ - GPIO_PinAFConfig(CODEC_I2S_MCK_GPIO, CODEC_I2S_MCK_PINSRC, CODEC_I2S_GPIO_AF); -#endif /* CODEC_MCLK_ENABLED */ -} - -/** - * @brief Restores the IOs used by the Audio Codec interface to their default state. - * @param None - * @retval None - */ -static void Codec_GPIO_DeInit(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - - /* Deinitialize all the GPIOs used by the driver */ - GPIO_InitStructure.GPIO_Pin = CODEC_I2S_SCK_PIN | CODEC_I2S_SD_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(CODEC_I2S_GPIO, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = CODEC_I2S_WS_PIN ; - GPIO_Init(CODEC_I2S_WS_GPIO, &GPIO_InitStructure); - - /* Disconnect pins from I2S peripheral */ - GPIO_PinAFConfig(CODEC_I2S_WS_GPIO, CODEC_I2S_WS_PINSRC, 0x00); - GPIO_PinAFConfig(CODEC_I2S_GPIO, CODEC_I2S_SCK_PINSRC, 0x00); - GPIO_PinAFConfig(CODEC_I2S_GPIO, CODEC_I2S_SD_PINSRC, 0x00); - -#ifdef CODEC_MCLK_ENABLED - /* CODEC_I2S pins deinitialization: MCK pin */ - GPIO_InitStructure.GPIO_Pin = CODEC_I2S_MCK_PIN; - GPIO_Init(CODEC_I2S_MCK_GPIO, &GPIO_InitStructure); - /* Disconnect pins from I2S peripheral */ - GPIO_PinAFConfig(CODEC_I2S_MCK_GPIO, CODEC_I2S_MCK_PINSRC, CODEC_I2S_GPIO_AF); -#endif /* CODEC_MCLK_ENABLED */ -} - -/** - * @brief Inserts a delay time (not accurate timing). - * @param nCount: specifies the delay time length. - * @retval None - */ -static void Delay( __IO uint32_t nCount) -{ - for (; nCount != 0; nCount--); -} - -#ifdef USE_DEFAULT_TIMEOUT_CALLBACK -/** - * @brief Basic management of the timeout situation. - * @param None - * @retval None - */ -uint32_t Codec_TIMEOUT_UserCallback(void) -{ - /* Block communication and all processes */ - while (1) - { - } -} -#endif /* USE_DEFAULT_TIMEOUT_CALLBACK */ -/*======================== - - Audio MAL Interface Control Functions - - ==============================*/ - -/** - * @brief Initializes and prepares the Media to perform audio data transfer - * from Media to the I2S peripheral. - * @param None - * @retval None - */ -static void Audio_MAL_Init(void) -{ - -#ifdef I2S_INTERRUPT - NVIC_InitTypeDef NVIC_InitStructure; - - NVIC_InitStructure.NVIC_IRQChannel = SPI3_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_TXE, ENABLE); - - I2S_Cmd(SPI3, ENABLE); -#else -#if defined(AUDIO_MAL_DMA_IT_TC_EN) || defined(AUDIO_MAL_DMA_IT_HT_EN) || defined(AUDIO_MAL_DMA_IT_TE_EN) - NVIC_InitTypeDef NVIC_InitStructure; -#endif - - if (CurrAudioInterface == AUDIO_INTERFACE_I2S) - { - /* Enable the DMA clock */ - RCC_AHB1PeriphClockCmd(AUDIO_MAL_DMA_CLOCK, ENABLE); - - /* Configure the DMA Stream */ - DMA_Cmd(AUDIO_MAL_DMA_STREAM, DISABLE); - DMA_DeInit(AUDIO_MAL_DMA_STREAM); - /* Set the parameters to be configured */ - DMA_InitStructure.DMA_Channel = AUDIO_MAL_DMA_CHANNEL; - DMA_InitStructure.DMA_PeripheralBaseAddr = AUDIO_MAL_DMA_DREG; - DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)0; /* This field will be configured in play function */ - DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DMA_InitStructure.DMA_BufferSize = (uint32_t)0xFFFE; /* This field will be configured in play function */ - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DMA_InitStructure.DMA_PeripheralDataSize = AUDIO_MAL_DMA_PERIPH_DATA_SIZE; - DMA_InitStructure.DMA_MemoryDataSize = AUDIO_MAL_DMA_MEM_DATA_SIZE; -#ifdef AUDIO_MAL_MODE_NORMAL - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; -#elif defined(AUDIO_MAL_MODE_CIRCULAR) - DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; -#else -#error "AUDIO_MAL_MODE_NORMAL or AUDIO_MAL_MODE_CIRCULAR should be selected !!" -#endif /* AUDIO_MAL_MODE_NORMAL */ - DMA_InitStructure.DMA_Priority = DMA_Priority_High; - DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; - DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; - DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; - DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - DMA_Init(AUDIO_MAL_DMA_STREAM, &DMA_InitStructure); - - /* Enable the selected DMA interrupts (selected in "stm32f4_discovery_eval_audio_codec.h" defines) */ -#ifdef AUDIO_MAL_DMA_IT_TC_EN - DMA_ITConfig(AUDIO_MAL_DMA_STREAM, DMA_IT_TC, ENABLE); -#endif /* AUDIO_MAL_DMA_IT_TC_EN */ -#ifdef AUDIO_MAL_DMA_IT_HT_EN - DMA_ITConfig(AUDIO_MAL_DMA_STREAM, DMA_IT_HT, ENABLE); -#endif /* AUDIO_MAL_DMA_IT_HT_EN */ -#ifdef AUDIO_MAL_DMA_IT_TE_EN - DMA_ITConfig(AUDIO_MAL_DMA_STREAM, DMA_IT_TE | DMA_IT_FE | DMA_IT_DME, ENABLE); -#endif /* AUDIO_MAL_DMA_IT_TE_EN */ - -#if defined(AUDIO_MAL_DMA_IT_TC_EN) || defined(AUDIO_MAL_DMA_IT_HT_EN) || defined(AUDIO_MAL_DMA_IT_TE_EN) - /* I2S DMA IRQ Channel configuration */ - NVIC_InitStructure.NVIC_IRQChannel = AUDIO_MAL_DMA_IRQ; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EVAL_AUDIO_IRQ_PREPRIO; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = EVAL_AUDIO_IRQ_SUBRIO; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -#endif - } - -#ifdef DAC_USE_I2S_DMA - else - { - /* Enable the DMA clock */ - RCC_AHB1PeriphClockCmd(AUDIO_MAL_DMA_CLOCK, ENABLE); - - /* Configure the DMA Stream */ - DMA_Cmd(AUDIO_MAL_DMA_STREAM, DISABLE); - DMA_DeInit(AUDIO_MAL_DMA_STREAM); - /* Set the parameters to be configured */ - DMA_InitStructure.DMA_Channel = AUDIO_MAL_DMA_CHANNEL; - DMA_InitStructure.DMA_PeripheralBaseAddr = AUDIO_MAL_DMA_DREG; - DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)0; /* This field will be configured in play function */ - DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - DMA_InitStructure.DMA_BufferSize = (uint32_t)0xFFFE; /* This field will be configured in play function */ - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - DMA_InitStructure.DMA_PeripheralDataSize = AUDIO_MAL_DMA_PERIPH_DATA_SIZE; - DMA_InitStructure.DMA_MemoryDataSize = AUDIO_MAL_DMA_MEM_DATA_SIZE; -#ifdef AUDIO_MAL_MODE_NORMAL - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; -#elif defined(AUDIO_MAL_MODE_CIRCULAR) - DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; -#else -#error "AUDIO_MAL_MODE_NORMAL or AUDIO_MAL_MODE_CIRCULAR should be selected !!" -#endif /* AUDIO_MAL_MODE_NORMAL */ - DMA_InitStructure.DMA_Priority = DMA_Priority_High; - DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; - DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; - DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; - DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - DMA_Init(AUDIO_MAL_DMA_STREAM, &DMA_InitStructure); - - /* Enable the selected DMA interrupts (selected in "stm32f4_discovery_eval_audio_codec.h" defines) */ -#ifdef AUDIO_MAL_DMA_IT_TC_EN - DMA_ITConfig(AUDIO_MAL_DMA_STREAM, DMA_IT_TC, ENABLE); -#endif /* AUDIO_MAL_DMA_IT_TC_EN */ -#ifdef AUDIO_MAL_DMA_IT_HT_EN - DMA_ITConfig(AUDIO_MAL_DMA_STREAM, DMA_IT_HT, ENABLE); -#endif /* AUDIO_MAL_DMA_IT_HT_EN */ -#ifdef AUDIO_MAL_DMA_IT_TE_EN - DMA_ITConfig(AUDIO_MAL_DMA_STREAM, DMA_IT_TE | DMA_IT_FE | DMA_IT_DME, ENABLE); -#endif /* AUDIO_MAL_DMA_IT_TE_EN */ - -#if defined(AUDIO_MAL_DMA_IT_TC_EN) || defined(AUDIO_MAL_DMA_IT_HT_EN) || defined(AUDIO_MAL_DMA_IT_TE_EN) - /* I2S DMA IRQ Channel configuration */ - NVIC_InitStructure.NVIC_IRQChannel = AUDIO_MAL_DMA_IRQ; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EVAL_AUDIO_IRQ_PREPRIO; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = EVAL_AUDIO_IRQ_SUBRIO; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -#endif - } -#endif /* DAC_USE_I2S_DMA */ - - if (CurrAudioInterface == AUDIO_INTERFACE_I2S) - { - /* Enable the I2S DMA request */ - SPI_I2S_DMACmd(CODEC_I2S, SPI_I2S_DMAReq_Tx, ENABLE); - } - else - { - /* Configure the STM32 DAC to geenrate audio analog signal */ - DAC_Config(); - -#ifndef DAC_USE_I2S_DMA - /* Enable the I2S interrupt used to write into the DAC register */ - SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_TXE, ENABLE); - - /* I2S DMA IRQ Channel configuration */ - NVIC_InitStructure.NVIC_IRQChannel = CODEC_I2S_IRQ; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EVAL_AUDIO_IRQ_PREPRIO; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = EVAL_AUDIO_IRQ_SUBRIO; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -#else - /* Enable the I2S DMA request */ - SPI_I2S_DMACmd(CODEC_I2S, SPI_I2S_DMAReq_Rx, ENABLE); -#endif /* DAC_USE_I2S_DMA */ - } -#endif -} - -/** - * @brief Restore default state of the used Media. - * @param None - * @retval None - */ -static void Audio_MAL_DeInit(void) -{ -#if defined(AUDIO_MAL_DMA_IT_TC_EN) || defined(AUDIO_MAL_DMA_IT_HT_EN) || defined(AUDIO_MAL_DMA_IT_TE_EN) - NVIC_InitTypeDef NVIC_InitStructure; - - /* Deinitialize the NVIC interrupt for the I2S DMA Stream */ - NVIC_InitStructure.NVIC_IRQChannel = AUDIO_MAL_DMA_IRQ; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = EVAL_AUDIO_IRQ_PREPRIO; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = EVAL_AUDIO_IRQ_SUBRIO; - NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; - NVIC_Init(&NVIC_InitStructure); -#endif - - /* Disable the DMA stream before the deinit */ - DMA_Cmd(AUDIO_MAL_DMA_STREAM, DISABLE); - - /* Dinitialize the DMA Stream */ - DMA_DeInit(AUDIO_MAL_DMA_STREAM); - - /* - The DMA clock is not disabled, since it can be used by other streams - */ -} - -/** - * @brief Starts playing audio stream from the audio Media. - * @param None - * @retval None - */ -void Audio_MAL_Play(uint32_t Addr, uint32_t Size) -{ - if (CurrAudioInterface == AUDIO_INTERFACE_I2S) - { - /* Configure the buffer address and size */ - DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Addr; - DMA_InitStructure.DMA_BufferSize = (uint32_t)Size/2; - - /* Configure the DMA Stream with the new parameters */ - DMA_Init(AUDIO_MAL_DMA_STREAM, &DMA_InitStructure); - - /* Enable the I2S DMA Stream*/ - DMA_Cmd(AUDIO_MAL_DMA_STREAM, ENABLE); - } -#ifndef DAC_USE_I2S_DMA - else - { - /* Configure the buffer address and size */ - DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Addr; - DMA_InitStructure.DMA_BufferSize = (uint32_t)Size; - - /* Configure the DMA Stream with the new parameters */ - DMA_Init(AUDIO_MAL_DMA_STREAM, &DMA_InitStructure); - - /* Enable the I2S DMA Stream*/ - DMA_Cmd(AUDIO_MAL_DMA_STREAM, ENABLE); - } -#endif /* DAC_USE_I2S_DMA */ - - /* If the I2S peripheral is still not enabled, enable it */ - if ((CODEC_I2S->I2SCFGR & I2S_ENABLE_MASK) == 0) - { - I2S_Cmd(CODEC_I2S, ENABLE); - } -} - -/** - * @brief Pauses or Resumes the audio stream playing from the Media. - * @param Cmd: AUDIO_PAUSE (or 0) to pause, AUDIO_RESUME (or any value different - * from 0) to resume. - * @param Addr: Address from/at which the audio stream should resume/pause. - * @retval None - */ -static void Audio_MAL_PauseResume(uint32_t Cmd, uint32_t Addr) -{ - /* Pause the audio file playing */ - if (Cmd == AUDIO_PAUSE) - { - /* Disable the I2S DMA request */ - SPI_I2S_DMACmd(CODEC_I2S, SPI_I2S_DMAReq_Tx, DISABLE); - - /* Pause the I2S DMA Stream - Note. For the STM32F40x devices, the DMA implements a pause feature, - by disabling the stream, all configuration is preserved and data - transfer is paused till the next enable of the stream. - This feature is not available on STM32F40x devices. */ - DMA_Cmd(AUDIO_MAL_DMA_STREAM, DISABLE); - } - else /* AUDIO_RESUME */ - { - /* Enable the I2S DMA request */ - SPI_I2S_DMACmd(CODEC_I2S, SPI_I2S_DMAReq_Tx, ENABLE); - - /* Resume the I2S DMA Stream - Note. For the STM32F40x devices, the DMA implements a pause feature, - by disabling the stream, all configuration is preserved and data - transfer is paused till the next enable of the stream. - This feature is not available on STM32F40x devices. */ - DMA_Cmd(AUDIO_MAL_DMA_STREAM, ENABLE); - - /* If the I2S peripheral is still not enabled, enable it */ - if ((CODEC_I2S->I2SCFGR & I2S_ENABLE_MASK) == 0) - { - I2S_Cmd(CODEC_I2S, ENABLE); - } - } -} - -/** - * @brief Stops audio stream playing on the used Media. - * @param None - * @retval None - */ -static void Audio_MAL_Stop(void) -{ - /* Stop the Transfer on the I2S side: Stop and disable the DMA stream */ - DMA_Cmd(AUDIO_MAL_DMA_STREAM, DISABLE); - - /* Clear all the DMA flags for the next transfer */ - DMA_ClearFlag(AUDIO_MAL_DMA_STREAM, AUDIO_MAL_DMA_FLAG_TC |AUDIO_MAL_DMA_FLAG_HT | \ - AUDIO_MAL_DMA_FLAG_FE | AUDIO_MAL_DMA_FLAG_TE); - - /* - The I2S DMA requests are not disabled here. - */ - - /* In all modes, disable the I2S peripheral */ - I2S_Cmd(CODEC_I2S, DISABLE); -} - -/** - * @brief DAC Channel1 Configuration - * @param None - * @retval None - */ -void DAC_Config(void) -{ - DAC_InitTypeDef DAC_InitStructure; - GPIO_InitTypeDef GPIO_InitStructure; - - /* DMA1 clock and GPIOA clock enable (to be used with DAC) */ - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1 | RCC_AHB1Periph_GPIOA, ENABLE); - - /* DAC Periph clock enable */ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); - - /* DAC channel 1 & 2 (DAC_OUT1 = PA.4) configuration */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOA, &GPIO_InitStructure); - - /* DAC channel1 Configuration */ - DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; - DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; - DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; - DAC_Init(AUDIO_DAC_CHANNEL, &DAC_InitStructure); - - /* Enable DAC Channel1 */ - DAC_Cmd(AUDIO_DAC_CHANNEL, ENABLE); -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stm32f4d/stm32f4_discovery_audio_codec.h b/car_hw/src/lib/stm32f4d/stm32f4_discovery_audio_codec.h deleted file mode 100644 index 00e0a7f600d..00000000000 --- a/car_hw/src/lib/stm32f4d/stm32f4_discovery_audio_codec.h +++ /dev/null @@ -1,306 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4_discovery_audio_codec.h - * @author MCD Application Team - * @version V1.1.0 - * @date 28-October-2011 - * @brief This file contains all the functions prototypes for the - * stm32f4_discovery_audio_codec.c driver. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4_DISCOVERY_AUDIOCODEC_H -#define __STM32F4_DISCOVERY_AUDIOCODEC_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/** @addtogroup Utilities - * @{ - */ - - -/** @addtogroup STM32F4_DISCOVERY - * @{ - */ - -/** @defgroup STM32F4_DISCOVERY_AUDIO_CODEC - * @{ - */ - - -/** @defgroup STM32F4_DISCOVERY_AUDIO_CODEC_Exported_Types - * @{ - */ - -/** @defgroup STM32F4_DISCOVERY_AUDIO_CODEC_Exported_Constants - * @{ - */ - -/*------------------------------------ - CONFIGURATION: Audio Codec Driver Configuration parameters - ----------------------------------------*/ -/* Audio Transfer mode (I2S Interrupt) */ -//#define I2S_INTERRUPT /* Uncomment this line to enable audio transfert with I2S interrupt*/ - -/* Audio Transfer mode (DMA, Interrupt or Polling) */ -#define AUDIO_MAL_MODE_NORMAL /* Uncomment this line to enable the audio - Transfer using DMA */ -/* #define AUDIO_MAL_MODE_CIRCULAR */ /* Uncomment this line to enable the audio - Transfer using DMA */ - -/* For the DMA modes select the interrupt that will be used */ -#define AUDIO_MAL_DMA_IT_TC_EN /* Uncomment this line to enable DMA Transfer Complete interrupt */ -/* #define AUDIO_MAL_DMA_IT_HT_EN */ /* Uncomment this line to enable DMA Half Transfer Complete interrupt */ -/* #define AUDIO_MAL_DMA_IT_TE_EN */ /* Uncomment this line to enable DMA Transfer Error interrupt */ - -/* Select the interrupt preemption priority and subpriority for the DMA interrupt */ -#define EVAL_AUDIO_IRQ_PREPRIO 0 /* Select the preemption priority level(0 is the highest) */ -#define EVAL_AUDIO_IRQ_SUBRIO 0 /* Select the sub-priority level (0 is the highest) */ - -/* Uncomment the following line to use the default Codec_TIMEOUT_UserCallback() - function implemented in stm32f4_discovery_audio_codec.c file. - Codec_TIMEOUT_UserCallback() function is called whenever a timeout condition - occurs during communication (waiting on an event that doesn't occur, bus - errors, busy devices ...). */ -/* #define USE_DEFAULT_TIMEOUT_CALLBACK */ - -/* Enable this define to use the I2S DMA for writing into DAC register */ -//#define DAC_USE_I2S_DMA -/*----------------------------------------------------------------------------*/ - -/*------------------------------------ - OPTIONAL Configuration defines parameters - ----------------------------------------*/ -/* I2C clock speed configuration (in Hz) - WARNING: - Make sure that this define is not already declared in other files (ie. - stm322xg_eval.h file). It can be used in parallel by other modules. */ -#ifndef I2C_SPEED - #define I2C_SPEED 100000 -#endif /* I2C_SPEED */ - -/* Uncomment defines below to select standard for audio communication between - Codec and I2S peripheral */ -#define I2S_STANDARD_PHILLIPS -/* #define I2S_STANDARD_MSB */ -/* #define I2S_STANDARD_LSB */ - -/* Uncomment the defines below to select if the Master clock mode should be - enabled or not */ -#define CODEC_MCLK_ENABLED -/* #deine CODEC_MCLK_DISABLED */ - -/* Uncomment this line to enable verifying data sent to codec after each write - operation */ -#define VERIFY_WRITTENDATA -/*----------------------------------------------------------------------------*/ - -/*----------------------------------- - Hardware Configuration defines parameters - -----------------------------------------*/ -/* Audio Reset Pin definition */ -#define AUDIO_RESET_GPIO_CLK RCC_AHB1Periph_GPIOD -#define AUDIO_RESET_PIN GPIO_Pin_4 -#define AUDIO_RESET_GPIO GPIOD - -/* I2S peripheral configuration defines */ -#define CODEC_I2S SPI3 -#define CODEC_I2S_CLK RCC_APB1Periph_SPI3 -#define CODEC_I2S_ADDRESS 0x40003C0C -#define CODEC_I2S_GPIO_AF GPIO_AF_SPI3 -#define CODEC_I2S_IRQ SPI3_IRQn -#define CODEC_I2S_GPIO_CLOCK (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOA) -#define CODEC_I2S_WS_PIN GPIO_Pin_4 -#define CODEC_I2S_SCK_PIN GPIO_Pin_10 -#define CODEC_I2S_SD_PIN GPIO_Pin_12 -#define CODEC_I2S_MCK_PIN GPIO_Pin_7 -#define CODEC_I2S_WS_PINSRC GPIO_PinSource4 -#define CODEC_I2S_SCK_PINSRC GPIO_PinSource10 -#define CODEC_I2S_SD_PINSRC GPIO_PinSource12 -#define CODEC_I2S_MCK_PINSRC GPIO_PinSource7 -#define CODEC_I2S_GPIO GPIOC -#define CODEC_I2S_WS_GPIO GPIOA -#define CODEC_I2S_MCK_GPIO GPIOC -#define Audio_I2S_IRQHandler SPI3_IRQHandler - - - #define AUDIO_MAL_DMA_PERIPH_DATA_SIZE DMA_PeripheralDataSize_HalfWord - #define AUDIO_MAL_DMA_MEM_DATA_SIZE DMA_MemoryDataSize_HalfWord - #define DMA_MAX_SZE 0xFFFF - - - #define DAC_DHR12L1_ADDRESS 0x4000740C - #define DAC_DHR12R1_ADDRESS 0x40007408 - #define DAC_DHR8R1_ADDRESS 0x40007410 - #define AUDIO_DAC_CHANNEL DAC_Channel_1 - - /* I2S DMA Stream definitions */ - #define AUDIO_I2S_DMA_CLOCK RCC_AHB1Periph_DMA1 - #define AUDIO_I2S_DMA_STREAM DMA1_Stream7 - #define AUDIO_I2S_DMA_DREG CODEC_I2S_ADDRESS - #define AUDIO_I2S_DMA_CHANNEL DMA_Channel_0 - #define AUDIO_I2S_DMA_IRQ DMA1_Stream7_IRQn - #define AUDIO_I2S_DMA_FLAG_TC DMA_FLAG_TCIF7 - #define AUDIO_I2S_DMA_FLAG_HT DMA_FLAG_HTIF7 - #define AUDIO_I2S_DMA_FLAG_FE DMA_FLAG_FEIF7 - #define AUDIO_I2S_DMA_FLAG_TE DMA_FLAG_TEIF7 - #define AUDIO_I2S_DMA_FLAG_DME DMA_FLAG_DMEIF7 - - #define Audio_MAL_I2S_IRQHandler DMA1_Stream7_IRQHandler - - - /* DAC DMA Stream definitions */ - #define AUDIO_DAC_DMA_CLOCK RCC_AHB1Periph_DMA1 - #define AUDIO_DAC_DMA_STREAM DMA1_Stream0 - #define AUDIO_DAC_DMA_DREG DAC_DHR12L1_ADDRESS - #define AUDIO_DAC_DMA_CHANNEL DMA_Channel_0 - #define AUDIO_DAC_DMA_IRQ DMA1_Stream0_IRQn - #define AUDIO_DAC_DMA_FLAG_TC DMA_FLAG_TCIF0 - #define AUDIO_DAC_DMA_FLAG_HT DMA_FLAG_HTIF0 - #define AUDIO_DAC_DMA_FLAG_FE DMA_FLAG_FEIF0 - #define AUDIO_DAC_DMA_FLAG_TE DMA_FLAG_TEIF0 - #define AUDIO_DAC_DMA_FLAG_DME DMA_FLAG_DMEIF0 - - #define Audio_MAL_DAC_IRQHandler DMA1_Stream0_IRQHandler - - -/* I2C peripheral configuration defines (control interface of the audio codec) */ -#define CODEC_I2C I2C1 -#define CODEC_I2C_CLK RCC_APB1Periph_I2C1 -#define CODEC_I2C_GPIO_CLOCK RCC_AHB1Periph_GPIOB -#define CODEC_I2C_GPIO_AF GPIO_AF_I2C1 -#define CODEC_I2C_GPIO GPIOB -#define CODEC_I2C_SCL_PIN GPIO_Pin_6 -#define CODEC_I2C_SDA_PIN GPIO_Pin_9 -#define CODEC_I2S_SCL_PINSRC GPIO_PinSource6 -#define CODEC_I2S_SDA_PINSRC GPIO_PinSource9 - -/* Maximum Timeout values for flags and events waiting loops. These timeouts are - not based on accurate values, they just guarantee that the application will - not remain stuck if the I2C communication is corrupted. - You may modify these timeout values depending on CPU frequency and application - conditions (interrupts routines ...). */ -#define CODEC_FLAG_TIMEOUT ((uint32_t)0x1000) -#define CODEC_LONG_TIMEOUT ((uint32_t)(300 * CODEC_FLAG_TIMEOUT)) -/*----------------------------------------------------------------------------*/ - -/*----------------------------------- - Audio Codec User defines - -----------------------------------------*/ -/* Audio interface : I2S or DAC */ -#define AUDIO_INTERFACE_I2S 1 -#define AUDIO_INTERFACE_DAC 2 - -/* Codec output DEVICE */ -#define OUTPUT_DEVICE_SPEAKER 1 -#define OUTPUT_DEVICE_HEADPHONE 2 -#define OUTPUT_DEVICE_BOTH 3 -#define OUTPUT_DEVICE_AUTO 4 - -/* Volume Levels values */ -#define DEFAULT_VOLMIN 0x00 -#define DEFAULT_VOLMAX 0xFF -#define DEFAULT_VOLSTEP 0x04 - -#define AUDIO_PAUSE 0 -#define AUDIO_RESUME 1 - -/* Codec POWER DOWN modes */ -#define CODEC_PDWN_HW 1 -#define CODEC_PDWN_SW 2 - -/* MUTE commands */ -#define AUDIO_MUTE_ON 1 -#define AUDIO_MUTE_OFF 0 -/*----------------------------------------------------------------------------*/ -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_AUDIO_CODEC_Exported_Macros - * @{ - */ -#define VOLUME_CONVERT(x) ((Volume > 100)? 100:((uint8_t)((Volume * 255) / 100))) -#define DMA_MAX(x) (((x) <= DMA_MAX_SZE)? (x):DMA_MAX_SZE) - -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_AUDIO_CODEC_Exported_Functions - * @{ - */ -void EVAL_AUDIO_SetAudioInterface(uint32_t Interface); -uint32_t EVAL_AUDIO_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq); -uint32_t EVAL_AUDIO_DeInit(void); -uint32_t EVAL_AUDIO_Play(uint16_t* pBuffer, uint32_t Size); -uint32_t EVAL_AUDIO_PauseResume(uint32_t Cmd); -uint32_t EVAL_AUDIO_Stop(uint32_t CodecPowerDown_Mode); -uint32_t EVAL_AUDIO_VolumeCtl(uint8_t Volume); -uint32_t EVAL_AUDIO_Mute(uint32_t Command); -void Audio_MAL_Play(uint32_t Addr, uint32_t Size); -void DAC_Config(void); - -/* User Callbacks: user has to implement these functions in his code if - they are needed. -----------------------------------------------------------*/ - -uint16_t EVAL_AUDIO_GetSampleCallBack(void); - -/* This function is called when the requested data has been completely transferred. - In Normal mode (when the define AUDIO_MAL_MODE_NORMAL is enabled) this function - is called at the end of the whole audio file. - In circular mode (when the define AUDIO_MAL_MODE_CIRCULAR is enabled) this - function is called at the end of the current buffer transmission. */ -void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t Size); - -/* This function is called when half of the requested buffer has been transferred - This callback is useful in Circular mode only (when AUDIO_MAL_MODE_CIRCULAR - define is enabled)*/ -void EVAL_AUDIO_HalfTransfer_CallBack(uint32_t pBuffer, uint32_t Size); - -/* This function is called when an Interrupt due to transfer error on or peripheral - error occurs. */ -void EVAL_AUDIO_Error_CallBack(void* pData); - -/* Codec_TIMEOUT_UserCallback() function is called whenever a timeout condition - occurs during communication (waiting on an event that doesn't occur, bus - errors, busy devices ...) on the Codec control interface (I2C). - You can use the default timeout callback implementation by uncommenting the - define USE_DEFAULT_TIMEOUT_CALLBACK in stm32f4_discovery_audio_codec.h file. - Typically the user implementation of this callback should reset I2C peripheral - and re-initialize communication or in worst case reset all the application. */ -uint32_t Codec_TIMEOUT_UserCallback(void); - -#endif /* __STM32F4_DISCOVERY_AUDIOCODEC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stm32f4d/stm32f4_discovery_lis302dl.c b/car_hw/src/lib/stm32f4d/stm32f4_discovery_lis302dl.c deleted file mode 100644 index 4051fdd9cae..00000000000 --- a/car_hw/src/lib/stm32f4d/stm32f4_discovery_lis302dl.c +++ /dev/null @@ -1,502 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4_discovery_lis302dl.c - * @author MCD Application Team - * @version V1.1.0 - * @date 28-October-2011 - * @brief This file provides a set of functions needed to manage the LIS302DL - * MEMS accelerometer available on STM32F4-Discovery Kit. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4_discovery_lis302dl.h" - -/** @addtogroup Utilities - * @{ - */ - -/** @addtogroup STM32F4_DISCOVERY - * @{ - */ - -/** @addtogroup STM32F4_DISCOVERY_LIS302DL - * @{ - */ - - -/** @defgroup STM32F4_DISCOVERY_LIS302DL_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_LIS302DL_Private_Defines - * @{ - */ -__IO uint32_t LIS302DLTimeout = LIS302DL_FLAG_TIMEOUT; - -/* Read/Write command */ -#define READWRITE_CMD ((uint8_t)0x80) -/* Multiple byte read/write command */ -#define MULTIPLEBYTE_CMD ((uint8_t)0x40) -/* Dummy Byte Send by the SPI Master device in order to generate the Clock to the Slave device */ -#define DUMMY_BYTE ((uint8_t)0x00) - -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_LIS302DL_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_LIS302DL_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_LIS302DL_Private_FunctionPrototypes - * @{ - */ -static uint8_t LIS302DL_SendByte(uint8_t byte); -static void LIS302DL_LowLevel_Init(void); -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_LIS302DL_Private_Functions - * @{ - */ - - -/** - * @brief Set LIS302DL Initialization. - * @param LIS302DL_Config_Struct: pointer to a LIS302DL_Config_TypeDef structure - * that contains the configuration setting for the LIS302DL. - * @retval None - */ -void LIS302DL_Init(LIS302DL_InitTypeDef *LIS302DL_InitStruct) -{ - uint8_t ctrl = 0x00; - - /* Configure the low level interface ---------------------------------------*/ - LIS302DL_LowLevel_Init(); - - /* Configure MEMS: data rate, power mode, full scale, self test and axes */ - ctrl = (uint8_t) (LIS302DL_InitStruct->Output_DataRate | LIS302DL_InitStruct->Power_Mode | \ - LIS302DL_InitStruct->Full_Scale | LIS302DL_InitStruct->Self_Test | \ - LIS302DL_InitStruct->Axes_Enable); - - /* Write value to MEMS CTRL_REG1 regsister */ - LIS302DL_Write(&ctrl, LIS302DL_CTRL_REG1_ADDR, 1); -} - -/** - * @brief Set LIS302DL Internal High Pass Filter configuration. - * @param LIS302DL_Filter_ConfigTypeDef: pointer to a LIS302DL_FilterConfig_TypeDef - * structure that contains the configuration setting for the LIS302DL Filter. - * @retval None - */ -void LIS302DL_FilterConfig(LIS302DL_FilterConfigTypeDef *LIS302DL_FilterConfigStruct) -{ - uint8_t ctrl = 0x00; - - /* Read CTRL_REG2 register */ - LIS302DL_Read(&ctrl, LIS302DL_CTRL_REG2_ADDR, 1); - - /* Clear high pass filter cut-off level, interrupt and data selection bits*/ - ctrl &= (uint8_t)~(LIS302DL_FILTEREDDATASELECTION_OUTPUTREGISTER | \ - LIS302DL_HIGHPASSFILTER_LEVEL_3 | \ - LIS302DL_HIGHPASSFILTERINTERRUPT_1_2); - /* Configure MEMS high pass filter cut-off level, interrupt and data selection bits */ - ctrl |= (uint8_t)(LIS302DL_FilterConfigStruct->HighPassFilter_Data_Selection | \ - LIS302DL_FilterConfigStruct->HighPassFilter_CutOff_Frequency | \ - LIS302DL_FilterConfigStruct->HighPassFilter_Interrupt); - - /* Write value to MEMS CTRL_REG2 register */ - LIS302DL_Write(&ctrl, LIS302DL_CTRL_REG2_ADDR, 1); -} - -/** - * @brief Set LIS302DL Interrupt configuration - * @param LIS302DL_InterruptConfig_TypeDef: pointer to a LIS302DL_InterruptConfig_TypeDef - * structure that contains the configuration setting for the LIS302DL Interrupt. - * @retval None - */ -void LIS302DL_InterruptConfig(LIS302DL_InterruptConfigTypeDef *LIS302DL_IntConfigStruct) -{ - uint8_t ctrl = 0x00; - - /* Read CLICK_CFG register */ - LIS302DL_Read(&ctrl, LIS302DL_CLICK_CFG_REG_ADDR, 1); - - /* Configure latch Interrupt request, click interrupts and double click interrupts */ - ctrl = (uint8_t)(LIS302DL_IntConfigStruct->Latch_Request| \ - LIS302DL_IntConfigStruct->SingleClick_Axes | \ - LIS302DL_IntConfigStruct->DoubleClick_Axes); - - /* Write value to MEMS CLICK_CFG register */ - LIS302DL_Write(&ctrl, LIS302DL_CLICK_CFG_REG_ADDR, 1); -} - -/** - * @brief Change the lowpower mode for LIS302DL - * @param LowPowerMode: new state for the lowpower mode. - * This parameter can be one of the following values: - * @arg LIS302DL_LOWPOWERMODE_POWERDOWN: Power down mode - * @arg LIS302DL_LOWPOWERMODE_ACTIVE: Active mode - * @retval None - */ -void LIS302DL_LowpowerCmd(uint8_t LowPowerMode) -{ - uint8_t tmpreg; - - /* Read CTRL_REG1 register */ - LIS302DL_Read(&tmpreg, LIS302DL_CTRL_REG1_ADDR, 1); - - /* Set new low power mode configuration */ - tmpreg &= (uint8_t)~LIS302DL_LOWPOWERMODE_ACTIVE; - tmpreg |= LowPowerMode; - - /* Write value to MEMS CTRL_REG1 regsister */ - LIS302DL_Write(&tmpreg, LIS302DL_CTRL_REG1_ADDR, 1); -} - -/** - * @brief Data Rate command - * @param DataRateValue: Data rate value - * This parameter can be one of the following values: - * @arg LIS302DL_DATARATE_100: 100 Hz output data rate - * @arg LIS302DL_DATARATE_400: 400 Hz output data rate - * @retval None - */ -void LIS302DL_DataRateCmd(uint8_t DataRateValue) -{ - uint8_t tmpreg; - - /* Read CTRL_REG1 register */ - LIS302DL_Read(&tmpreg, LIS302DL_CTRL_REG1_ADDR, 1); - - /* Set new Data rate configuration */ - tmpreg &= (uint8_t)~LIS302DL_DATARATE_400; - tmpreg |= DataRateValue; - - /* Write value to MEMS CTRL_REG1 regsister */ - LIS302DL_Write(&tmpreg, LIS302DL_CTRL_REG1_ADDR, 1); -} - -/** - * @brief Change the Full Scale of LIS302DL - * @param FS_value: new full scale value. - * This parameter can be one of the following values: - * @arg LIS302DL_FULLSCALE_2_3: +-2.3g - * @arg LIS302DL_FULLSCALE_9_2: +-9.2g - * @retval None - */ -void LIS302DL_FullScaleCmd(uint8_t FS_value) -{ - uint8_t tmpreg; - - /* Read CTRL_REG1 register */ - LIS302DL_Read(&tmpreg, LIS302DL_CTRL_REG1_ADDR, 1); - - /* Set new full scale configuration */ - tmpreg &= (uint8_t)~LIS302DL_FULLSCALE_9_2; - tmpreg |= FS_value; - - /* Write value to MEMS CTRL_REG1 regsister */ - LIS302DL_Write(&tmpreg, LIS302DL_CTRL_REG1_ADDR, 1); -} - -/** - * @brief Reboot memory content of LIS302DL - * @param None - * @retval None - */ -void LIS302DL_RebootCmd(void) -{ - uint8_t tmpreg; - /* Read CTRL_REG2 register */ - LIS302DL_Read(&tmpreg, LIS302DL_CTRL_REG2_ADDR, 1); - - /* Enable or Disable the reboot memory */ - tmpreg |= LIS302DL_BOOT_REBOOTMEMORY; - - /* Write value to MEMS CTRL_REG2 regsister */ - LIS302DL_Write(&tmpreg, LIS302DL_CTRL_REG2_ADDR, 1); -} - -/** - * @brief Writes one byte to the LIS302DL. - * @param pBuffer : pointer to the buffer containing the data to be written to the LIS302DL. - * @param WriteAddr : LIS302DL's internal address to write to. - * @param NumByteToWrite: Number of bytes to write. - * @retval None - */ -void LIS302DL_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite) -{ - /* Configure the MS bit: - - When 0, the address will remain unchanged in multiple read/write commands. - - When 1, the address will be auto incremented in multiple read/write commands. - */ - if(NumByteToWrite > 0x01) - { - WriteAddr |= (uint8_t)MULTIPLEBYTE_CMD; - } - /* Set chip select Low at the start of the transmission */ - LIS302DL_CS_LOW(); - - /* Send the Address of the indexed register */ - LIS302DL_SendByte(WriteAddr); - /* Send the data that will be written into the device (MSB First) */ - while(NumByteToWrite >= 0x01) - { - LIS302DL_SendByte(*pBuffer); - NumByteToWrite--; - pBuffer++; - } - - /* Set chip select High at the end of the transmission */ - LIS302DL_CS_HIGH(); -} - -/** - * @brief Reads a block of data from the LIS302DL. - * @param pBuffer : pointer to the buffer that receives the data read from the LIS302DL. - * @param ReadAddr : LIS302DL's internal address to read from. - * @param NumByteToRead : number of bytes to read from the LIS302DL. - * @retval None - */ -void LIS302DL_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead) -{ - if(NumByteToRead > 0x01) - { - ReadAddr |= (uint8_t)(READWRITE_CMD | MULTIPLEBYTE_CMD); - } - else - { - ReadAddr |= (uint8_t)READWRITE_CMD; - } - /* Set chip select Low at the start of the transmission */ - LIS302DL_CS_LOW(); - - /* Send the Address of the indexed register */ - LIS302DL_SendByte(ReadAddr); - - /* Receive the data that will be read from the device (MSB First) */ - while(NumByteToRead > 0x00) - { - /* Send dummy byte (0x00) to generate the SPI clock to LIS302DL (Slave device) */ - *pBuffer = LIS302DL_SendByte(DUMMY_BYTE); - NumByteToRead--; - pBuffer++; - } - - /* Set chip select High at the end of the transmission */ - LIS302DL_CS_HIGH(); -} - -/** - * @brief Read LIS302DL output register, and calculate the acceleration - * ACC[mg]=SENSITIVITY* (out_h*256+out_l)/16 (12 bit rappresentation) - * @param s16 buffer to store data - * @retval None - */ -void LIS302DL_ReadACC(int32_t* out) -{ - uint8_t buffer[6]; - uint8_t crtl, i = 0x00; - - LIS302DL_Read(&crtl, LIS302DL_CTRL_REG1_ADDR, 1); - LIS302DL_Read(buffer, LIS302DL_OUT_X_ADDR, 6); - - switch(crtl & 0x20) - { - /* FS bit = 0 ==> Sensitivity typical value = 18milligals/digit*/ - case 0x00: - for(i=0; i<0x03; i++) - { - *out =(int32_t)(LIS302DL_SENSITIVITY_2_3G * (int8_t)buffer[2*i]); - out++; - } - break; - /* FS bit = 1 ==> Sensitivity typical value = 72milligals/digit*/ - case 0x20: - for(i=0; i<0x03; i++) - { - *out =(int32_t)(LIS302DL_SENSITIVITY_9_2G * (int8_t)buffer[2*i]); - out++; - } - break; - default: - break; - } - } - -/** - * @brief Initializes the low level interface used to drive the LIS302DL - * @param None - * @retval None - */ -static void LIS302DL_LowLevel_Init(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; - SPI_InitTypeDef SPI_InitStructure; - - /* Enable the SPI periph */ - RCC_APB2PeriphClockCmd(LIS302DL_SPI_CLK, ENABLE); - - /* Enable SCK, MOSI and MISO GPIO clocks */ - RCC_AHB1PeriphClockCmd(LIS302DL_SPI_SCK_GPIO_CLK | LIS302DL_SPI_MISO_GPIO_CLK | LIS302DL_SPI_MOSI_GPIO_CLK, ENABLE); - - /* Enable CS GPIO clock */ - RCC_AHB1PeriphClockCmd(LIS302DL_SPI_CS_GPIO_CLK, ENABLE); - - /* Enable INT1 GPIO clock */ - RCC_AHB1PeriphClockCmd(LIS302DL_SPI_INT1_GPIO_CLK, ENABLE); - - /* Enable INT2 GPIO clock */ - RCC_AHB1PeriphClockCmd(LIS302DL_SPI_INT2_GPIO_CLK, ENABLE); - - GPIO_PinAFConfig(LIS302DL_SPI_SCK_GPIO_PORT, LIS302DL_SPI_SCK_SOURCE, LIS302DL_SPI_SCK_AF); - GPIO_PinAFConfig(LIS302DL_SPI_MISO_GPIO_PORT, LIS302DL_SPI_MISO_SOURCE, LIS302DL_SPI_MISO_AF); - GPIO_PinAFConfig(LIS302DL_SPI_MOSI_GPIO_PORT, LIS302DL_SPI_MOSI_SOURCE, LIS302DL_SPI_MOSI_AF); - - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - - /* SPI SCK pin configuration */ - GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_SCK_PIN; - GPIO_Init(LIS302DL_SPI_SCK_GPIO_PORT, &GPIO_InitStructure); - - /* SPI MOSI pin configuration */ - GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_MOSI_PIN; - GPIO_Init(LIS302DL_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure); - - /* SPI MISO pin configuration */ - GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_MISO_PIN; - GPIO_Init(LIS302DL_SPI_MISO_GPIO_PORT, &GPIO_InitStructure); - - /* SPI configuration -------------------------------------------------------*/ - SPI_I2S_DeInit(LIS302DL_SPI); - SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; - SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; - SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; - SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; - SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; - SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; - SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; - SPI_InitStructure.SPI_CRCPolynomial = 7; - SPI_InitStructure.SPI_Mode = SPI_Mode_Master; - SPI_Init(LIS302DL_SPI, &SPI_InitStructure); - - /* Enable SPI1 */ - SPI_Cmd(LIS302DL_SPI, ENABLE); - - /* Configure GPIO PIN for Lis Chip select */ - GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_CS_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(LIS302DL_SPI_CS_GPIO_PORT, &GPIO_InitStructure); - - /* Deselect : Chip Select high */ - GPIO_SetBits(LIS302DL_SPI_CS_GPIO_PORT, LIS302DL_SPI_CS_PIN); - - /* Configure GPIO PINs to detect Interrupts */ - GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_INT1_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(LIS302DL_SPI_INT1_GPIO_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_INT2_PIN; - GPIO_Init(LIS302DL_SPI_INT2_GPIO_PORT, &GPIO_InitStructure); -} - -/** - * @brief Sends a Byte through the SPI interface and return the Byte received - * from the SPI bus. - * @param Byte : Byte send. - * @retval The received byte value - */ -static uint8_t LIS302DL_SendByte(uint8_t byte) -{ - /* Loop while DR register in not emplty */ - LIS302DLTimeout = LIS302DL_FLAG_TIMEOUT; - while (SPI_I2S_GetFlagStatus(LIS302DL_SPI, SPI_I2S_FLAG_TXE) == RESET) - { - if((LIS302DLTimeout--) == 0) return LIS302DL_TIMEOUT_UserCallback(); - } - - /* Send a Byte through the SPI peripheral */ - SPI_I2S_SendData(LIS302DL_SPI, byte); - - /* Wait to receive a Byte */ - LIS302DLTimeout = LIS302DL_FLAG_TIMEOUT; - while (SPI_I2S_GetFlagStatus(LIS302DL_SPI, SPI_I2S_FLAG_RXNE) == RESET) - { - if((LIS302DLTimeout--) == 0) return LIS302DL_TIMEOUT_UserCallback(); - } - - /* Return the Byte read from the SPI bus */ - return (uint8_t)SPI_I2S_ReceiveData(LIS302DL_SPI); -} - -#ifdef USE_DEFAULT_TIMEOUT_CALLBACK -/** - * @brief Basic management of the timeout situation. - * @param None. - * @retval None. - */ -uint32_t LIS302DL_TIMEOUT_UserCallback(void) -{ - /* Block communication and all processes */ - while (1) - { - } -} -#endif /* USE_DEFAULT_TIMEOUT_CALLBACK */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/stm32f4d/stm32f4_discovery_lis302dl.h b/car_hw/src/lib/stm32f4d/stm32f4_discovery_lis302dl.h deleted file mode 100644 index 2628af08b18..00000000000 --- a/car_hw/src/lib/stm32f4d/stm32f4_discovery_lis302dl.h +++ /dev/null @@ -1,772 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4_discovery_lis302dl.h - * @author MCD Application Team - * @version V1.1.0 - * @date 28-October-2011 - * @brief This file contains all the functions prototypes for the stm32f4_discovery_lis302dl.c - * firmware driver. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4_DISCOVERY_LIS302DL_H -#define __STM32F4_DISCOVERY_LIS302DL_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ - #include "stm32f4xx.h" - -/** @addtogroup Utilities - * @{ - */ - -/** @addtogroup STM32F4_DISCOVERY - * @{ - */ - -/** @addtogroup STM32F4_DISCOVERY_LIS302DL - * @{ - */ - - -/** @defgroup STM32F4_DISCOVERY_LIS302DL_Exported_Types - * @{ - */ - -/* LIS302DL struct */ -typedef struct -{ - uint8_t Power_Mode; /* Power-down/Active Mode */ - uint8_t Output_DataRate; /* OUT data rate 100 Hz / 400 Hz */ - uint8_t Axes_Enable; /* Axes enable */ - uint8_t Full_Scale; /* Full scale */ - uint8_t Self_Test; /* Self test */ -}LIS302DL_InitTypeDef; - -/* LIS302DL High Pass Filter struct */ -typedef struct -{ - uint8_t HighPassFilter_Data_Selection; /* Internal filter bypassed or data from internal filter send to output register*/ - uint8_t HighPassFilter_CutOff_Frequency; /* High pass filter cut-off frequency */ - uint8_t HighPassFilter_Interrupt; /* High pass filter enabled for Freefall/WakeUp #1 or #2 */ -}LIS302DL_FilterConfigTypeDef; - -/* LIS302DL Interrupt struct */ -typedef struct -{ - uint8_t Latch_Request; /* Latch interrupt request into CLICK_SRC register*/ - uint8_t SingleClick_Axes; /* Single Click Axes Interrupts */ - uint8_t DoubleClick_Axes; /* Double Click Axes Interrupts */ -}LIS302DL_InterruptConfigTypeDef; - -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_LIS302DL_Exported_Constants - * @{ - */ - -/* Uncomment the following line to use the default LIS302DL_TIMEOUT_UserCallback() - function implemented in stm32f4_discovery_lis302dl.c file. - LIS302DL_TIMEOUT_UserCallback() function is called whenever a timeout condition - occure during communication (waiting transmit data register empty flag(TXE) - or waiting receive data register is not empty flag (RXNE)). */ -/* #define USE_DEFAULT_TIMEOUT_CALLBACK */ - -/* Maximum Timeout values for flags waiting loops. These timeouts are not based - on accurate values, they just guarantee that the application will not remain - stuck if the SPI communication is corrupted. - You may modify these timeout values depending on CPU frequency and application - conditions (interrupts routines ...). */ -#define LIS302DL_FLAG_TIMEOUT ((uint32_t)0x1000) - -/** - * @brief LIS302DL SPI Interface pins - */ -#define LIS302DL_SPI SPI1 -#define LIS302DL_SPI_CLK RCC_APB2Periph_SPI1 - -#define LIS302DL_SPI_SCK_PIN GPIO_Pin_5 /* PA.05 */ -#define LIS302DL_SPI_SCK_GPIO_PORT GPIOA /* GPIOA */ -#define LIS302DL_SPI_SCK_GPIO_CLK RCC_AHB1Periph_GPIOA -#define LIS302DL_SPI_SCK_SOURCE GPIO_PinSource5 -#define LIS302DL_SPI_SCK_AF GPIO_AF_SPI1 - -#define LIS302DL_SPI_MISO_PIN GPIO_Pin_6 /* PA.6 */ -#define LIS302DL_SPI_MISO_GPIO_PORT GPIOA /* GPIOA */ -#define LIS302DL_SPI_MISO_GPIO_CLK RCC_AHB1Periph_GPIOA -#define LIS302DL_SPI_MISO_SOURCE GPIO_PinSource6 -#define LIS302DL_SPI_MISO_AF GPIO_AF_SPI1 - -#define LIS302DL_SPI_MOSI_PIN GPIO_Pin_7 /* PA.7 */ -#define LIS302DL_SPI_MOSI_GPIO_PORT GPIOA /* GPIOA */ -#define LIS302DL_SPI_MOSI_GPIO_CLK RCC_AHB1Periph_GPIOA -#define LIS302DL_SPI_MOSI_SOURCE GPIO_PinSource7 -#define LIS302DL_SPI_MOSI_AF GPIO_AF_SPI1 - -#define LIS302DL_SPI_CS_PIN GPIO_Pin_3 /* PE.03 */ -#define LIS302DL_SPI_CS_GPIO_PORT GPIOE /* GPIOE */ -#define LIS302DL_SPI_CS_GPIO_CLK RCC_AHB1Periph_GPIOE - -#define LIS302DL_SPI_INT1_PIN GPIO_Pin_0 /* PE.00 */ -#define LIS302DL_SPI_INT1_GPIO_PORT GPIOE /* GPIOE */ -#define LIS302DL_SPI_INT1_GPIO_CLK RCC_AHB1Periph_GPIOE -#define LIS302DL_SPI_INT1_EXTI_LINE EXTI_Line0 -#define LIS302DL_SPI_INT1_EXTI_PORT_SOURCE EXTI_PortSourceGPIOE -#define LIS302DL_SPI_INT1_EXTI_PIN_SOURCE EXTI_PinSource0 -#define LIS302DL_SPI_INT1_EXTI_IRQn EXTI0_IRQn - -#define LIS302DL_SPI_INT2_PIN GPIO_Pin_1 /* PE.01 */ -#define LIS302DL_SPI_INT2_GPIO_PORT GPIOE /* GPIOE */ -#define LIS302DL_SPI_INT2_GPIO_CLK RCC_AHB1Periph_GPIOE -#define LIS302DL_SPI_INT2_EXTI_LINE EXTI_Line1 -#define LIS302DL_SPI_INT2_EXTI_PORT_SOURCE EXTI_PortSourceGPIOE -#define LIS302DL_SPI_INT2_EXTI_PIN_SOURCE EXTI_PinSource1 -#define LIS302DL_SPI_INT2_EXTI_IRQn EXTI1_IRQn - - -/******************************************************************************/ -/*************************** START REGISTER MAPPING **************************/ -/******************************************************************************/ - -/******************************************************************************* -* WHO_AM_I Register: Device Identification Register -* Read only register -* Default value: 0x3B -*******************************************************************************/ -#define LIS302DL_WHO_AM_I_ADDR 0x0F - -/******************************************************************************* -* CTRL_REG1 Register: Control Register 1 -* Read Write register -* Default value: 0x07 -* 7 DR: Data Rate selection. -* 0 - 100 Hz output data rate -* 1 - 400 Hz output data rate -* 6 PD: Power Down control. -* 0 - power down mode -* 1 - active mode -* 5 FS: Full Scale selection. -* 0 - Typical measurement range 2.3 -* 1 - Typical measurement range 9.2 -* 4:3 STP-STM Self Test Enable: -* STP | STM | mode -* ---------------------------- -* 0 | 0 | Normal mode -* 0 | 1 | Self Test M -* 1 | 0 | Self Test P -* 2 Zen: Z axis enable. -* 0 - Z axis disabled -* 1- Z axis enabled -* 1 Yen: Y axis enable. -* 0 - Y axis disabled -* 1- Y axis enabled -* 0 Xen: X axis enable. -* 0 - X axis disabled -* 1- X axis enabled -********************************************************************************/ -#define LIS302DL_CTRL_REG1_ADDR 0x20 - -/******************************************************************************* -* CTRL_REG2 Regsiter: Control Register 2 -* Read Write register -* Default value: 0x00 -* 7 SIM: SPI Serial Interface Mode Selection. -* 0 - 4 wire interface -* 1 - 3 wire interface -* 6 BOOT: Reboot memory content -* 0 - normal mode -* 1 - reboot memory content -* 5 Reserved -* 4 FDS: Filtered data selection. -* 0 - internal filter bypassed -* 1 - data from internal filter sent to output register -* 3 HP FF_WU2: High pass filter enabled for FreeFall/WakeUp#2. -* 0 - filter bypassed -* 1 - filter enabled -* 2 HP FF_WU1: High pass filter enabled for FreeFall/WakeUp#1. -* 0 - filter bypassed -* 1 - filter enabled -* 1:0 HP coeff2-HP coeff1 High pass filter cut-off frequency (ft) configuration. -* ft= ODR[hz]/6*HP coeff -* HP coeff2 | HP coeff1 | HP coeff -* ------------------------------------------- -* 0 | 0 | 8 -* 0 | 1 | 16 -* 1 | 0 | 32 -* 1 | 1 | 64 -* HP coeff | ft[hz] | ft[hz] | -* |ODR 100Hz | ODR 400Hz | -* -------------------------------------------- -* 00 | 2 | 8 | -* 01 | 1 | 4 | -* 10 | 0.5 | 2 | -* 11 | 0.25 | 1 | -*******************************************************************************/ -#define LIS302DL_CTRL_REG2_ADDR 0x21 - -/******************************************************************************* -* CTRL_REG3 Register: Interrupt Control Register -* Read Write register -* Default value: 0x00 -* 7 IHL active: Interrupt active high/low. -* 0 - active high -* 1 - active low -* 6 PP_OD: push-pull/open-drain. -* 0 - push-pull -* 1 - open-drain -* 5:3 I2_CFG2 - I2_CFG0 Data signal on INT2 pad control bits -* 2:0 I1_CFG2 - I1_CFG0 Data signal on INT1 pad control bits -* I1(2)_CFG2 | I1(2)_CFG1 | I1(2)_CFG0 | INT1(2) Pad -* ---------------------------------------------------------- -* 0 | 0 | 0 | GND -* 0 | 0 | 1 | FreeFall/WakeUp#1 -* 0 | 1 | 0 | FreeFall/WakeUp#2 -* 0 | 1 | 1 | FreeFall/WakeUp#1 or FreeFall/WakeUp#2 -* 1 | 0 | 0 | Data ready -* 1 | 1 | 1 | Click interrupt -*******************************************************************************/ -#define LIS302DL_CTRL_REG3_ADDR 0x22 - -/******************************************************************************* -* HP_FILTER_RESET Register: Dummy register. Reading at this address zeroes -* instantaneously the content of the internal high pass filter. If the high pass -* filter is enabled all three axes are instantaneously set to 0g. -* This allows to overcome the settling time of the high pass filter. -* Read only register -* Default value: Dummy -*******************************************************************************/ -#define LIS302DL_HP_FILTER_RESET_REG_ADDR 0x23 - -/******************************************************************************* -* STATUS_REG Register: Status Register -* Default value: 0x00 -* 7 ZYXOR: X, Y and Z axis data overrun. -* 0: no overrun has occurred -* 1: new data has overwritten the previous one before it was read -* 6 ZOR: Z axis data overrun. -* 0: no overrun has occurred -* 1: new data for Z-axis has overwritten the previous one before it was read -* 5 yOR: y axis data overrun. -* 0: no overrun has occurred -* 1: new data for y-axis has overwritten the previous one before it was read -* 4 XOR: X axis data overrun. -* 0: no overrun has occurred -* 1: new data for X-axis has overwritten the previous one before it was read -* 3 ZYXDA: X, Y and Z axis new data available -* 0: a new set of data is not yet available -* 1: a new set of data is available -* 2 ZDA: Z axis new data available. -* 0: a new set of data is not yet available -* 1: a new data for Z axis is available -* 1 YDA: Y axis new data available -* 0: a new set of data is not yet available -* 1: a new data for Y axis is available -* 0 XDA: X axis new data available -* 0: a new set of data is not yet available -* 1: a new data for X axis is available -*******************************************************************************/ -#define LIS302DL_STATUS_REG_ADDR 0x27 - -/******************************************************************************* -* OUT_X Register: X-axis output Data -* Read only register -* Default value: output -* 7:0 XD7-XD0: X-axis output Data -*******************************************************************************/ -#define LIS302DL_OUT_X_ADDR 0x29 - -/******************************************************************************* -* OUT_Y Register: Y-axis output Data -* Read only register -* Default value: output -* 7:0 YD7-YD0: Y-axis output Data -*******************************************************************************/ -#define LIS302DL_OUT_Y_ADDR 0x2B - -/******************************************************************************* -* OUT_Z Register: Z-axis output Data -* Read only register -* Default value: output -* 7:0 ZD7-ZD0: Z-axis output Data -*******************************************************************************/ -#define LIS302DL_OUT_Z_ADDR 0x2D - -/******************************************************************************* -* FF_WW_CFG_1 Register: Configuration register for Interrupt 1 source. -* Read write register -* Default value: 0x00 -* 7 AOI: AND/OR combination of Interrupt events. -* 0: OR combination of interrupt events -* 1: AND combination of interrupt events -* 6 LIR: Latch/not latch interrupt request -* 0: interrupt request not latched -* 1: interrupt request latched -* 5 ZHIE: Enable interrupt generation on Z high event. -* 0: disable interrupt request -* 1: enable interrupt request on measured accel. value higher than preset threshold -* 4 ZLIE: Enable interrupt generation on Z low event. -* 0: disable interrupt request -* 1: enable interrupt request on measured accel. value lower than preset threshold -* 3 YHIE: Enable interrupt generation on Y high event. -* 0: disable interrupt request -* 1: enable interrupt request on measured accel. value higher than preset threshold -* 2 YLIE: Enable interrupt generation on Y low event. -* 0: disable interrupt request -* 1: enable interrupt request on measured accel. value lower than preset threshold -* 1 XHIE: Enable interrupt generation on X high event. -* 0: disable interrupt request -* 1: enable interrupt request on measured accel. value higher than preset threshold -* 0 XLIE: Enable interrupt generation on X low event. -* 0: disable interrupt request -* 1: enable interrupt request on measured accel. value lower than preset threshold -*******************************************************************************/ -#define LIS302DL_FF_WU_CFG1_REG_ADDR 0x30 - -/******************************************************************************* -* FF_WU_SRC_1 Register: Interrupt 1 source register. -* Reading at this address clears FF_WU_SRC_1 register and the FF, WU 1 interrupt -* and allow the refreshment of data in the FF_WU_SRC_1 register if the latched option -* was chosen. -* Read only register -* Default value: 0x00 -* 7 Reserved -* 6 IA: Interrupt active. -* 0: no interrupt has been generated -* 1: one or more interrupts have been generated -* 5 ZH: Z high. -* 0: no interrupt -* 1: ZH event has occurred -* 4 ZL: Z low. -* 0: no interrupt -* 1: ZL event has occurred -* 3 YH: Y high. -* 0: no interrupt -* 1: YH event has occurred -* 2 YL: Y low. -* 0: no interrupt -* 1: YL event has occurred -* 1 YH: X high. -* 0: no interrupt -* 1: XH event has occurred -* 0 YL: X low. -* 0: no interrupt -* 1: XL event has occurred -*******************************************************************************/ -#define LIS302DL_FF_WU_SRC1_REG_ADDR 0x31 - -/******************************************************************************* -* FF_WU_THS_1 Register: Threshold register -* Read Write register -* Default value: 0x00 -* 7 DCRM: Reset mode selection. -* 0 - counter resetted -* 1 - counter decremented -* 6 THS6-THS0: Free-fall/wake-up threshold value. -*******************************************************************************/ -#define LIS302DL_FF_WU_THS1_REG_ADDR 0x32 - -/******************************************************************************* -* FF_WU_DURATION_1 Register: duration Register -* Read Write register -* Default value: 0x00 -* 7:0 D7-D0 Duration value. (Duration steps and maximum values depend on the ODR chosen) - ******************************************************************************/ -#define LIS302DL_FF_WU_DURATION1_REG_ADDR 0x33 - -/******************************************************************************* -* FF_WW_CFG_2 Register: Configuration register for Interrupt 2 source. -* Read write register -* Default value: 0x00 -* 7 AOI: AND/OR combination of Interrupt events. -* 0: OR combination of interrupt events -* 1: AND combination of interrupt events -* 6 LIR: Latch/not latch interrupt request -* 0: interrupt request not latched -* 1: interrupt request latched -* 5 ZHIE: Enable interrupt generation on Z high event. -* 0: disable interrupt request -* 1: enable interrupt request on measured accel. value higher than preset threshold -* 4 ZLIE: Enable interrupt generation on Z low event. -* 0: disable interrupt request -* 1: enable interrupt request on measured accel. value lower than preset threshold -* 3 YHIE: Enable interrupt generation on Y high event. -* 0: disable interrupt request -* 1: enable interrupt request on measured accel. value higher than preset threshold -* 2 YLIE: Enable interrupt generation on Y low event. -* 0: disable interrupt request -* 1: enable interrupt request on measured accel. value lower than preset threshold -* 1 XHIE: Enable interrupt generation on X high event. -* 0: disable interrupt request -* 1: enable interrupt request on measured accel. value higher than preset threshold -* 0 XLIE: Enable interrupt generation on X low event. -* 0: disable interrupt request -* 1: enable interrupt request on measured accel. value lower than preset threshold -*******************************************************************************/ -#define LIS302DL_FF_WU_CFG2_REG_ADDR 0x34 - -/******************************************************************************* -* FF_WU_SRC_2 Register: Interrupt 2 source register. -* Reading at this address clears FF_WU_SRC_2 register and the FF, WU 2 interrupt -* and allow the refreshment of data in the FF_WU_SRC_2 register if the latched option -* was chosen. -* Read only register -* Default value: 0x00 -* 7 Reserved -* 6 IA: Interrupt active. -* 0: no interrupt has been generated -* 1: one or more interrupts have been generated -* 5 ZH: Z high. -* 0: no interrupt -* 1: ZH event has occurred -* 4 ZL: Z low. -* 0: no interrupt -* 1: ZL event has occurred -* 3 YH: Y high. -* 0: no interrupt -* 1: YH event has occurred -* 2 YL: Y low. -* 0: no interrupt -* 1: YL event has occurred -* 1 YH: X high. -* 0: no interrupt -* 1: XH event has occurred -* 0 YL: X low. -* 0: no interrupt -* 1: XL event has occurred -*******************************************************************************/ -#define LIS302DL_FF_WU_SRC2_REG_ADDR 0x35 - -/******************************************************************************* -* FF_WU_THS_2 Register: Threshold register -* Read Write register -* Default value: 0x00 -* 7 DCRM: Reset mode selection. -* 0 - counter resetted -* 1 - counter decremented -* 6 THS6-THS0: Free-fall/wake-up threshold value. -*******************************************************************************/ -#define LIS302DL_FF_WU_THS2_REG_ADDR 0x36 - -/******************************************************************************* -* FF_WU_DURATION_2 Register: duration Register -* Read Write register -* Default value: 0x00 -* 7:0 D7-D0 Duration value. (Duration steps and maximum values depend on the ODR chosen) - ******************************************************************************/ -#define LIS302DL_FF_WU_DURATION2_REG_ADDR 0x37 - -/****************************************************************************** -* CLICK_CFG Register: click Register -* Read Write register -* Default value: 0x00 -* 7 Reserved -* 6 LIR: Latch Interrupt request. -* 0: interrupt request not latched -* 1: interrupt request latched -* 5 Double_Z: Enable interrupt generation on double click event on Z axis. -* 0: disable interrupt request -* 1: enable interrupt request -* 4 Single_Z: Enable interrupt generation on single click event on Z axis. -* 0: disable interrupt request -* 1: enable interrupt request -* 3 Double_Y: Enable interrupt generation on double click event on Y axis. -* 0: disable interrupt request -* 1: enable interrupt request -* 2 Single_Y: Enable interrupt generation on single click event on Y axis. -* 0: disable interrupt request -* 1: enable interrupt request -* 1 Double_X: Enable interrupt generation on double click event on X axis. -* 0: disable interrupt request -* 1: enable interrupt request -* 0 Single_y: Enable interrupt generation on single click event on X axis. -* 0: disable interrupt request -* 1: enable interrupt request - ******************************************************************************/ -#define LIS302DL_CLICK_CFG_REG_ADDR 0x38 - -/****************************************************************************** -* CLICK_SRC Register: click status Register -* Read only register -* Default value: 0x00 -* 7 Reserved -* 6 IA: Interrupt active. -* 0: no interrupt has been generated -* 1: one or more interrupts have been generated -* 5 Double_Z: Double click on Z axis event. -* 0: no interrupt -* 1: Double Z event has occurred -* 4 Single_Z: Z low. -* 0: no interrupt -* 1: Single Z event has occurred -* 3 Double_Y: Y high. -* 0: no interrupt -* 1: Double Y event has occurred -* 2 Single_Y: Y low. -* 0: no interrupt -* 1: Single Y event has occurred -* 1 Double_X: X high. -* 0: no interrupt -* 1: Double X event has occurred -* 0 Single_X: X low. -* 0: no interrupt -* 1: Single X event has occurred -*******************************************************************************/ -#define LIS302DL_CLICK_SRC_REG_ADDR 0x39 - -/******************************************************************************* -* CLICK_THSY_X Register: Click threshold Y and X register -* Read Write register -* Default value: 0x00 -* 7:4 THSy3-THSy0: Click threshold on Y axis, step 0.5g -* 3:0 THSx3-THSx0: Click threshold on X axis, step 0.5g -*******************************************************************************/ -#define LIS302DL_CLICK_THSY_X_REG_ADDR 0x3B - -/******************************************************************************* -* CLICK_THSZ Register: Click threshold Z register -* Read Write register -* Default value: 0x00 -* 7:4 Reserved -* 3:0 THSz3-THSz0: Click threshold on Z axis, step 0.5g -*******************************************************************************/ -#define LIS302DL_CLICK_THSZ_REG_ADDR 0x3C - -/******************************************************************************* -* CLICK_TimeLimit Register: Time Limit register -* Read Write register -* Default value: 0x00 -* 7:0 Dur7-Dur0: Time Limit value, step 0.5g -*******************************************************************************/ -#define LIS302DL_CLICK_TIMELIMIT_REG_ADDR 0x3D - -/******************************************************************************* -* CLICK_Latency Register: Latency register -* Read Write register -* Default value: 0x00 -* 7:0 Lat7-Lat0: Latency value, step 1msec -*******************************************************************************/ -#define LIS302DL_CLICK_LATENCY_REG_ADDR 0x3E - -/******************************************************************************* -* CLICK_Window Register: Window register -* Read Write register -* Default value: 0x00 -* 7:0 Win7-Win0: Window value, step 1msec -*******************************************************************************/ -#define LIS302DL_CLICK_WINDOW_REG_ADDR 0x3F - -/******************************************************************************/ -/**************************** END REGISTER MAPPING ***************************/ -/******************************************************************************/ - -#define LIS302DL_SENSITIVITY_2_3G 18 /* 18 mg/digit*/ -#define LIS302DL_SENSITIVITY_9_2G 72 /* 72 mg/digit*/ - -/** @defgroup Data_Rate_selection - * @{ - */ -#define LIS302DL_DATARATE_100 ((uint8_t)0x00) -#define LIS302DL_DATARATE_400 ((uint8_t)0x80) -/** - * @} - */ - -/** @defgroup Power_Mode_selection - * @{ - */ -#define LIS302DL_LOWPOWERMODE_POWERDOWN ((uint8_t)0x00) -#define LIS302DL_LOWPOWERMODE_ACTIVE ((uint8_t)0x40) -/** - * @} - */ - -/** @defgroup Full_Scale_selection - * @{ - */ -#define LIS302DL_FULLSCALE_2_3 ((uint8_t)0x00) -#define LIS302DL_FULLSCALE_9_2 ((uint8_t)0x20) -/** - * @} - */ - -/** @defgroup Self_Test_selection - * @{ - */ -#define LIS302DL_SELFTEST_NORMAL ((uint8_t)0x00) -#define LIS302DL_SELFTEST_P ((uint8_t)0x10) -#define LIS302DL_SELFTEST_M ((uint8_t)0x08) -/** - * @} - */ - -/** @defgroup Direction_XYZ_selection - * @{ - */ -#define LIS302DL_X_ENABLE ((uint8_t)0x01) -#define LIS302DL_Y_ENABLE ((uint8_t)0x02) -#define LIS302DL_Z_ENABLE ((uint8_t)0x04) -#define LIS302DL_XYZ_ENABLE ((uint8_t)0x07) -/** - * @} - */ - - /** @defgroup SPI_Serial_Interface_Mode_selection - * @{ - */ -#define LIS302DL_SERIALINTERFACE_4WIRE ((uint8_t)0x00) -#define LIS302DL_SERIALINTERFACE_3WIRE ((uint8_t)0x80) -/** - * @} - */ - - /** @defgroup Boot_Mode_selection - * @{ - */ -#define LIS302DL_BOOT_NORMALMODE ((uint8_t)0x00) -#define LIS302DL_BOOT_REBOOTMEMORY ((uint8_t)0x40) -/** - * @} - */ - - /** @defgroup Filtered_Data_Selection_Mode_selection - * @{ - */ -#define LIS302DL_FILTEREDDATASELECTION_BYPASSED ((uint8_t)0x00) -#define LIS302DL_FILTEREDDATASELECTION_OUTPUTREGISTER ((uint8_t)0x20) -/** - * @} - */ - - /** @defgroup High_Pass_Filter_Interrupt_selection - * @{ - */ -#define LIS302DL_HIGHPASSFILTERINTERRUPT_OFF ((uint8_t)0x00) -#define LIS302DL_HIGHPASSFILTERINTERRUPT_1 ((uint8_t)0x04) -#define LIS302DL_HIGHPASSFILTERINTERRUPT_2 ((uint8_t)0x08) -#define LIS302DL_HIGHPASSFILTERINTERRUPT_1_2 ((uint8_t)0x0C) -/** - * @} - */ - - /** @defgroup High_Pass_Filter_selection - * @{ - */ -#define LIS302DL_HIGHPASSFILTER_LEVEL_0 ((uint8_t)0x00) -#define LIS302DL_HIGHPASSFILTER_LEVEL_1 ((uint8_t)0x01) -#define LIS302DL_HIGHPASSFILTER_LEVEL_2 ((uint8_t)0x02) -#define LIS302DL_HIGHPASSFILTER_LEVEL_3 ((uint8_t)0x03) -/** - * @} - */ - - -/** @defgroup latch_Interrupt_Request_selection - * @{ - */ -#define LIS302DL_INTERRUPTREQUEST_NOTLATCHED ((uint8_t)0x00) -#define LIS302DL_INTERRUPTREQUEST_LATCHED ((uint8_t)0x40) -/** - * @} - */ - -/** @defgroup Click_Interrupt_XYZ_selection - * @{ - */ -#define LIS302DL_CLICKINTERRUPT_XYZ_DISABLE ((uint8_t)0x00) -#define LIS302DL_CLICKINTERRUPT_X_ENABLE ((uint8_t)0x01) -#define LIS302DL_CLICKINTERRUPT_Y_ENABLE ((uint8_t)0x04) -#define LIS302DL_CLICKINTERRUPT_Z_ENABLE ((uint8_t)0x10) -#define LIS302DL_CLICKINTERRUPT_XYZ_ENABLE ((uint8_t)0x15) -/** - * @} - */ - -/** @defgroup Double_Click_Interrupt_XYZ_selection - * @{ - */ -#define LIS302DL_DOUBLECLICKINTERRUPT_XYZ_DISABLE ((uint8_t)0x00) -#define LIS302DL_DOUBLECLICKINTERRUPT_X_ENABLE ((uint8_t)0x02) -#define LIS302DL_DOUBLECLICKINTERRUPT_Y_ENABLE ((uint8_t)0x08) -#define LIS302DL_DOUBLECLICKINTERRUPT_Z_ENABLE ((uint8_t)0x20) -#define LIS302DL_DOUBLECLICKINTERRUPT_XYZ_ENABLE ((uint8_t)0x2A) -/** - * @} - */ -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_LIS302DL_Exported_Macros - * @{ - */ -#define LIS302DL_CS_LOW() GPIO_ResetBits(LIS302DL_SPI_CS_GPIO_PORT, LIS302DL_SPI_CS_PIN) -#define LIS302DL_CS_HIGH() GPIO_SetBits(LIS302DL_SPI_CS_GPIO_PORT, LIS302DL_SPI_CS_PIN) -/** - * @} - */ - -/** @defgroup STM32F4_DISCOVERY_LIS302DL_Exported_Functions - * @{ - */ -void LIS302DL_Init(LIS302DL_InitTypeDef *LIS302DL_InitStruct); -void LIS302DL_InterruptConfig(LIS302DL_InterruptConfigTypeDef *LIS302DL_InterruptConfigStruct); -void LIS302DL_FilterConfig(LIS302DL_FilterConfigTypeDef *LIS302DL_FilterConfigStruct); -void LIS302DL_LowpowerCmd(uint8_t LowPowerMode); -void LIS302DL_FullScaleCmd(uint8_t FS_value); -void LIS302DL_DataRateCmd(uint8_t DataRateValue); -void LIS302DL_RebootCmd(void); -void LIS302DL_ReadACC(int32_t* out); -void LIS302DL_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite); -void LIS302DL_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead); - -/* USER Callbacks: This is function for which prototype only is declared in - MEMS accelerometre driver and that should be implemented into user applicaiton. */ -/* LIS302DL_TIMEOUT_UserCallback() function is called whenever a timeout condition - occure during communication (waiting transmit data register empty flag(TXE) - or waiting receive data register is not empty flag (RXNE)). - You can use the default timeout callback implementation by uncommenting the - define USE_DEFAULT_TIMEOUT_CALLBACK in stm32f4_discovery_lis302dl.h file. - Typically the user implementation of this callback should reset MEMS peripheral - and re-initialize communication or in worst case reset all the application. */ -uint32_t LIS302DL_TIMEOUT_UserCallback(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4_DISCOVERY_LIS302DL_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usart/Makefile b/car_hw/src/lib/usart/Makefile deleted file mode 100644 index aecf5818a1b..00000000000 --- a/car_hw/src/lib/usart/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -LIB_USART_OBJ_PREFIX=libusart_ - -$(LIB_USART_OBJ): \ - $(call dircs_to_prefxd_objs,$(LIB_USART_DIR),$(LIB_USART_OBJ_PREFIX)) - $(LD_ALL_DEPS) - -$(BIN_DIR)/$(LIB_USART_OBJ_PREFIX)%.o: $(LIB_USART_DIR)/%.c \ - $(call dirhs,$(LIB_USART_DIR)) - $(CC_ALL_DEPS) diff --git a/car_hw/src/lib/usart/usart.c b/car_hw/src/lib/usart/usart.c deleted file mode 100644 index 048aa359b91..00000000000 --- a/car_hw/src/lib/usart/usart.c +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Reworker but not completely refactored lib from - * http://microtechnics.ru/biblioteka-dlya-raboty-s-usart-v-stm32/ - */ -#include "usart.h" -#include -#include -#include - -// Variables for GPIO and USART configuration -GPIO_InitTypeDef MT_USART_CfgGPIO; -USART_InitTypeDef MT_USART_CfgUSART; - -typedef struct { - USART_TypeDef *usart; - // Ready to transmit and ready to receive flags - volatile bool MT_USART_ReadyToExchange; - // Number of bytes to send - uint8_t MT_USART_NumOfDataToSend; - // Number of bytes to receive - uint8_t MT_USART_NumOfDataToReceive; - // Pointer to the data that will be sent - uint8_t *MT_USART_SendDataPtr; - // Pointer to the buffer where received data will be saved - uint8_t *MT_USART_ReceivedDataPtr; - // Number of sended bytes - volatile uint8_t MT_USART_NumOfDataSended; - // Number of received bytes - volatile uint8_t MT_USART_NumOfDataReceived; -} usart_state_t; - -static usart_state_t usart_states[3] = { - { - .usart = USART1, - .MT_USART_ReadyToExchange = true - }, - { - .usart = USART2, - .MT_USART_ReadyToExchange = true - }, - { - .usart = USART3, - .MT_USART_ReadyToExchange = true - } -}; - -static void usart1_init(void) -{ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - - GPIO_StructInit(&MT_USART_CfgGPIO); - MT_USART_CfgGPIO.GPIO_Mode = GPIO_Mode_AF; - MT_USART_CfgGPIO.GPIO_Pin = GPIO_Pin_9; - MT_USART_CfgGPIO.GPIO_Speed = GPIO_Speed_50MHz; - MT_USART_CfgGPIO.GPIO_OType = GPIO_OType_PP; - MT_USART_CfgGPIO.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(GPIOA, &MT_USART_CfgGPIO); - - MT_USART_CfgGPIO.GPIO_Mode = GPIO_Mode_AF; - MT_USART_CfgGPIO.GPIO_Pin = GPIO_Pin_10; - MT_USART_CfgGPIO.GPIO_Speed = GPIO_Speed_50MHz; - MT_USART_CfgGPIO.GPIO_OType = GPIO_OType_PP; - MT_USART_CfgGPIO.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(GPIOA, &MT_USART_CfgGPIO); - - GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); - GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); - - USART_StructInit(&MT_USART_CfgUSART); - MT_USART_CfgUSART.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - MT_USART_CfgUSART.USART_BaudRate = MT_USART_BAUDRATE; - USART_Init(USART1, &MT_USART_CfgUSART); - - //NVIC_EnableIRQ(USART1_IRQn); - USART_Cmd(USART1, ENABLE); -} - -static void usart2_init(void) -{ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - - GPIO_StructInit(&MT_USART_CfgGPIO); - MT_USART_CfgGPIO.GPIO_Mode = GPIO_Mode_AF; - MT_USART_CfgGPIO.GPIO_Pin = GPIO_Pin_2; - MT_USART_CfgGPIO.GPIO_Speed = GPIO_Speed_50MHz; - MT_USART_CfgGPIO.GPIO_OType = GPIO_OType_PP; - MT_USART_CfgGPIO.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(GPIOA, &MT_USART_CfgGPIO); - - GPIO_StructInit(&MT_USART_CfgGPIO); - MT_USART_CfgGPIO.GPIO_Mode = GPIO_Mode_AF; - MT_USART_CfgGPIO.GPIO_Pin = GPIO_Pin_3; - MT_USART_CfgGPIO.GPIO_Speed = GPIO_Speed_50MHz; - MT_USART_CfgGPIO.GPIO_OType = GPIO_OType_PP; - MT_USART_CfgGPIO.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(GPIOA, &MT_USART_CfgGPIO); - - GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); - GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); - - USART_StructInit(&MT_USART_CfgUSART); - MT_USART_CfgUSART.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - MT_USART_CfgUSART.USART_BaudRate = MT_USART_BAUDRATE; - USART_Init(USART2, &MT_USART_CfgUSART); - - //NVIC_EnableIRQ(USART2_IRQn); - USART_Cmd(USART2, ENABLE); - -} - -static void usart3_init(void) -{ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); - - GPIO_StructInit(&MT_USART_CfgGPIO); - MT_USART_CfgGPIO.GPIO_Mode = GPIO_Mode_AF; - MT_USART_CfgGPIO.GPIO_Pin = GPIO_Pin_10; - MT_USART_CfgGPIO.GPIO_Speed = GPIO_Speed_50MHz; - MT_USART_CfgGPIO.GPIO_OType = GPIO_OType_PP; - MT_USART_CfgGPIO.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(GPIOC, &MT_USART_CfgGPIO); - - MT_USART_CfgGPIO.GPIO_Mode = GPIO_Mode_AF; - MT_USART_CfgGPIO.GPIO_Pin = GPIO_Pin_11; - MT_USART_CfgGPIO.GPIO_Speed = GPIO_Speed_50MHz; - MT_USART_CfgGPIO.GPIO_OType = GPIO_OType_PP; - MT_USART_CfgGPIO.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(GPIOC, &MT_USART_CfgGPIO); - - GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3); - GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3); - - USART_StructInit(&MT_USART_CfgUSART); - MT_USART_CfgUSART.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; - MT_USART_CfgUSART.USART_BaudRate = MT_USART_BAUDRATE; - USART_Init(USART3, &MT_USART_CfgUSART); - - //NVIC_EnableIRQ(USART3_IRQn); - USART_Cmd(USART3, ENABLE); -} - -void usart_init(enum usart_id_t usart_id) -{ - switch(usart_id) { - case USART1_ID: - usart1_init(); - break; - case USART2_ID: - usart2_init(); - break; - case USART3_ID: - usart3_init(); - break; - } -} - -void usart_send_data(enum usart_id_t usart_id, uint8_t *data, size_t size) -{ - usart_state_t *usart = &usart_states[usart_id]; - while (!usart->MT_USART_ReadyToExchange); - - usart->MT_USART_SendDataPtr = data; - usart->MT_USART_NumOfDataToSend = size; - usart->MT_USART_NumOfDataSended = 0; - usart->MT_USART_ReadyToExchange = false; - //USART_ITConfig(usart->usart, USART_IT_TC, ENABLE); - - while (usart->MT_USART_NumOfDataSended != size) { - USART_SendData(usart->usart, (uint8_t)*usart->MT_USART_SendDataPtr); - while (USART_GetFlagStatus(usart->usart, USART_FLAG_TC) == RESET); - usart->MT_USART_SendDataPtr++; - usart->MT_USART_NumOfDataSended++; - } - usart->MT_USART_ReadyToExchange = true; -} - -void usart_rcv_data(enum usart_id_t usart_id, uint8_t *data, size_t size) -{ - usart_state_t *usart = &usart_states[usart_id]; - while (!usart->MT_USART_ReadyToExchange); - - usart->MT_USART_ReceivedDataPtr = data; - usart->MT_USART_NumOfDataToReceive = size; - usart->MT_USART_NumOfDataReceived = 0; - usart->MT_USART_ReadyToExchange = false; - //USART_ITConfig(usart->usart, USART_IT_RXNE, ENABLE); - - while (usart->MT_USART_NumOfDataReceived != size) { - while (USART_GetFlagStatus(usart->usart, USART_FLAG_RXNE) == RESET); - *usart->MT_USART_ReceivedDataPtr = USART_ReceiveData(usart->usart); - usart->MT_USART_ReceivedDataPtr++; - usart->MT_USART_NumOfDataReceived++; - } - usart->MT_USART_ReadyToExchange = true; -} - -void USART_IRQHandler(enum usart_id_t usart_id) -{ - usart_state_t *usart = &usart_states[usart_id]; - - if (USART_GetITStatus(usart->usart, USART_IT_RXNE) != RESET) - { - USART_ClearITPendingBit(usart->usart, USART_IT_RXNE); - *usart->MT_USART_ReceivedDataPtr = USART_ReceiveData(usart->usart); - usart->MT_USART_ReceivedDataPtr++; - usart->MT_USART_NumOfDataReceived++; - if (usart->MT_USART_NumOfDataReceived == usart->MT_USART_NumOfDataToReceive) - { - USART_ITConfig(usart->usart, USART_IT_RXNE, DISABLE); - usart->MT_USART_ReadyToExchange = true; - } - } - - if (USART_GetITStatus(usart->usart, USART_IT_TC) != RESET) - { - USART_ClearITPendingBit(usart->usart, USART_IT_TC); - USART_SendData(usart->usart, (uint8_t)*usart->MT_USART_SendDataPtr); - usart->MT_USART_SendDataPtr++; - usart->MT_USART_NumOfDataSended++; - if (usart->MT_USART_NumOfDataSended == usart->MT_USART_NumOfDataToSend) - { - USART_ITConfig(usart->usart, USART_IT_TC, DISABLE); - usart->MT_USART_ReadyToExchange = true; - } - } -} diff --git a/car_hw/src/lib/usart/usart.h b/car_hw/src/lib/usart/usart.h deleted file mode 100644 index 9187dfc5d77..00000000000 --- a/car_hw/src/lib/usart/usart.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include -#include - -// Warning: USART1 doesn't pass uarts_test -enum usart_id_t { - USART1_ID = 0, // PA9: TX, PA10: RX - USART2_ID = 1, // PA2: TX, PA3: RX - USART3_ID = 2, // PC10: TX, PC11: RX -}; - -void usart_init(enum usart_id_t usart_id); -void usart_send_data(enum usart_id_t usart_id, uint8_t *data, size_t size); -void usart_rcv_data(enum usart_id_t usart_id, uint8_t *data, size_t size); - -#define MT_USART_BAUDRATE 9600 diff --git a/car_hw/src/lib/usart/usart_test.c b/car_hw/src/lib/usart/usart_test.c deleted file mode 100644 index feafce9544c..00000000000 --- a/car_hw/src/lib/usart/usart_test.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include - -#include -#include -// 2, 1 - ok -// 2, 2 - ok -// 3, 3 - ok -// 2, 3 - ok -// 3, 2 - ok -void usart_test(enum usart_id_t src_usart_id, enum usart_id_t dst_usart_id) -{ - uint8_t byte_sent = 0; - uint8_t byte_rcvd = 0; - while (1) { - car_leds_clear_all(); - car_time_wait(500); - - usart_send_data(src_usart_id, &byte_sent, 1); - usart_rcv_data(dst_usart_id, &byte_rcvd, 1); - if (byte_rcvd == byte_sent) - car_led_set(CAR_LED_GREEN, true); - else - car_led_set(CAR_LED_RED, true); - ++byte_sent; - car_time_wait(500); - } -} diff --git a/car_hw/src/lib/usart/usart_test.h b/car_hw/src/lib/usart/usart_test.h deleted file mode 100644 index f1136df9d06..00000000000 --- a/car_hw/src/lib/usart/usart_test.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include "usart.h" - -void usart_test(enum usart_id_t src_usart_id, enum usart_id_t dst_usart_id); diff --git a/car_hw/src/lib/usb_conf/usb_conf.h b/car_hw/src/lib/usb_conf/usb_conf.h deleted file mode 100644 index 736e64926aa..00000000000 --- a/car_hw/src/lib/usb_conf/usb_conf.h +++ /dev/null @@ -1,287 +0,0 @@ -/** - ****************************************************************************** - * @file usb_conf.h - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief general low level driver configuration - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CONF__H__ -#define __USB_CONF__H__ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - - -/** @addtogroup USB_OTG_DRIVER - * @{ - */ - -/** @defgroup USB_CONF - * @brief USB low level driver configuration file - * @{ - */ - -/** @defgroup USB_CONF_Exported_Defines - * @{ - */ - -/* USB Core and PHY interface configuration. - Tip: To avoid modifying these defines each time you need to change the USB - configuration, you can declare the needed define in your toolchain - compiler preprocessor. - */ -#ifndef USE_USB_OTG_FS -#define USE_USB_OTG_FS -#endif /* USE_USB_OTG_FS */ - -#ifndef USE_USB_OTG_HS - //#define USE_USB_OTG_HS -#endif /* USE_USB_OTG_HS */ - -#ifndef USE_ULPI_PHY -#define USE_ULPI_PHY -#endif /* USE_ULPI_PHY */ - -#ifndef USE_EMBEDDED_PHY - //#define USE_EMBEDDED_PHY -#endif /* USE_EMBEDDED_PHY */ - -#ifndef USE_I2C_PHY - //#define USE_I2C_PHY -#endif /* USE_I2C_PHY */ - - -#ifdef USE_USB_OTG_FS - #define USB_OTG_FS_CORE -#endif - -#ifdef USE_USB_OTG_HS - #define USB_OTG_HS_CORE -#endif - -/******************************************************************************* -* FIFO Size Configuration in Device mode -* -* (i) Receive data FIFO size = RAM for setup packets + -* OUT endpoint control information + -* data OUT packets + miscellaneous -* Space = ONE 32-bits words -* --> RAM for setup packets = 10 spaces -* (n is the nbr of CTRL EPs the device core supports) -* --> OUT EP CTRL info = 1 space -* (one space for status information written to the FIFO along with each -* received packet) -* --> data OUT packets = (Largest Packet Size / 4) + 1 spaces -* (MINIMUM to receive packets) -* --> OR data OUT packets = at least 2*(Largest Packet Size / 4) + 1 spaces -* (if high-bandwidth EP is enabled or multiple isochronous EPs) -* --> miscellaneous = 1 space per OUT EP -* (one space for transfer complete status information also pushed to the -* FIFO with each endpoint's last packet) -* -* (ii)MINIMUM RAM space required for each IN EP Tx FIFO = MAX packet size for -* that particular IN EP. More space allocated in the IN EP Tx FIFO results -* in a better performance on the USB and can hide latencies on the AHB. -* -* (iii) TXn min size = 16 words. (n : Transmit FIFO index) -* (iv) When a TxFIFO is not used, the Configuration should be as follows: -* case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) -* --> Txm can use the space allocated for Txn. -* case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) -* --> Txn should be configured with the minimum space of 16 words -* (v) The FIFO is used optimally when used TxFIFOs are allocated in the top -* of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. -*******************************************************************************/ - -/******************************************************************************* -* FIFO Size Configuration in Host mode -* -* (i) Receive data FIFO size = (Largest Packet Size / 4) + 1 or -* 2x (Largest Packet Size / 4) + 1, If a -* high-bandwidth channel or multiple isochronous -* channels are enabled -* -* (ii) For the host nonperiodic Transmit FIFO is the largest maximum packet size -* for all supported nonperiodic OUT channels. Typically, a space -* corresponding to two Largest Packet Size is recommended. -* -* (iii) The minimum amount of RAM required for Host periodic Transmit FIFO is -* the largest maximum packet size for all supported periodic OUT channels. -* If there is at least one High Bandwidth Isochronous OUT endpoint, -* then the space must be at least two times the maximum packet size for -* that channel. -*******************************************************************************/ - -/****************** USB OTG HS CONFIGURATION **********************************/ -#ifdef USB_OTG_HS_CORE - #define RX_FIFO_HS_SIZE 512 - #define TX0_FIFO_HS_SIZE 512 - #define TX1_FIFO_HS_SIZE 512 - #define TX2_FIFO_HS_SIZE 0 - #define TX3_FIFO_HS_SIZE 0 - #define TX4_FIFO_HS_SIZE 0 - #define TX5_FIFO_HS_SIZE 0 - #define TXH_NP_HS_FIFOSIZ 96 - #define TXH_P_HS_FIFOSIZ 96 - - //#define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT - //#define USB_OTG_HS_SOF_OUTPUT_ENABLED - - //#define USB_OTG_INTERNAL_VBUS_ENABLED - #define USB_OTG_EXTERNAL_VBUS_ENABLED - - #ifdef USE_ULPI_PHY - #define USB_OTG_ULPI_PHY_ENABLED - #endif - #ifdef USE_EMBEDDED_PHY - #define USB_OTG_EMBEDDED_PHY_ENABLED - #endif - #ifdef USE_I2C_PHY - #define USB_OTG_I2C_PHY_ENABLED - #endif - #define USB_OTG_HS_INTERNAL_DMA_ENABLED - #define USB_OTG_HS_DEDICATED_EP1_ENABLED -#endif - -/****************** USB OTG FS CONFIGURATION **********************************/ -#ifdef USB_OTG_FS_CORE - #define RX_FIFO_FS_SIZE 128 - #define TX0_FIFO_FS_SIZE 64 - #define TX1_FIFO_FS_SIZE 128 - #define TX2_FIFO_FS_SIZE 0 - #define TX3_FIFO_FS_SIZE 0 - #define TXH_NP_FS_FIFOSIZ 96 - #define TXH_P_FS_FIFOSIZ 96 - - //#define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT - //#define USB_OTG_FS_SOF_OUTPUT_ENABLED -#endif - -/****************** USB OTG MODE CONFIGURATION ********************************/ -//#define USE_HOST_MODE -#define USE_DEVICE_MODE -//#define USE_OTG_MODE - - -#ifndef USB_OTG_FS_CORE - #ifndef USB_OTG_HS_CORE - #error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined" - #endif -#endif - - -#ifndef USE_DEVICE_MODE - #ifndef USE_HOST_MODE - #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" - #endif -#endif - -#ifndef USE_USB_OTG_HS - #ifndef USE_USB_OTG_FS - #error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined" - #endif -#else //USE_USB_OTG_HS - #ifndef USE_ULPI_PHY - #ifndef USE_EMBEDDED_PHY - #ifndef USE_I2C_PHY - #error "USE_ULPI_PHY or USE_EMBEDDED_PHY or USE_I2C_PHY should be defined" - #endif - #endif - #endif -#endif - -/****************** C Compilers dependant keywords ****************************/ -/* In HS mode and when the DMA is used, all variables and data structures dealing - with the DMA during the transaction process should be 4-bytes aligned */ -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined (__GNUC__) /* GNU Compiler */ - #define __ALIGN_END __attribute__ ((aligned (4))) - #define __ALIGN_BEGIN - #else - #define __ALIGN_END - #if defined (__CC_ARM) /* ARM Compiler */ - #define __ALIGN_BEGIN __align(4) - #elif defined (__ICCARM__) /* IAR Compiler */ - #define __ALIGN_BEGIN - #elif defined (__TASKING__) /* TASKING Compiler */ - #define __ALIGN_BEGIN __align(4) - #endif /* __CC_ARM */ - #endif /* __GNUC__ */ -#else - #define __ALIGN_BEGIN - #define __ALIGN_END -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ - -/* __packed keyword used to decrease the data type alignment to 1-byte */ -#if defined (__CC_ARM) /* ARM Compiler */ - #define __packed __packed -#elif defined (__ICCARM__) /* IAR Compiler */ - #define __packed __packed -#elif defined ( __GNUC__ ) /* GNU Compiler */ - #define __packed __attribute__ ((__packed__)) -#elif defined (__TASKING__) /* TASKING Compiler */ - #define __packed __unaligned -#endif /* __CC_ARM */ - -/** - * @} - */ - - -/** @defgroup USB_CONF_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_CONF_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_CONF_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_CONF_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ - - -#endif //__USB_CONF__H__ - - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_conf/usbd_conf.h b/car_hw/src/lib/usb_conf/usbd_conf.h deleted file mode 100644 index 6e96759d2e7..00000000000 --- a/car_hw/src/lib/usb_conf/usbd_conf.h +++ /dev/null @@ -1,95 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_conf.h - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief USB Device configuration file - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CONF__H__ -#define __USBD_CONF__H__ - -/** @defgroup USB_CONF_Exported_Defines - * @{ - */ -#define USBD_CFG_MAX_NUM 1 -#define USBD_ITF_MAX_NUM 1 -#define USB_MAX_STR_DESC_SIZ 70 - -/** @defgroup USB_VCP_Class_Layer_Parameter - * @{ - */ -#define CDC_IN_EP 0x81 /* EP1 for data IN */ -#define CDC_OUT_EP 0x01 /* EP1 for data OUT */ -#define CDC_CMD_EP 0x82 /* EP2 for CDC commands */ - -/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ -#ifdef USE_USB_OTG_HS - #define CDC_DATA_MAX_PACKET_SIZE 512 /* Endpoint IN & OUT Packet size */ - #define CDC_CMD_PACKET_SZE 8 /* Control Endpoint Packet size */ - - #define CDC_IN_FRAME_INTERVAL 40 /* Number of micro-frames between IN transfers */ - #define APP_RX_DATA_SIZE 2048 /* Total size of IN buffer: - APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL*8 */ -#else - #define CDC_DATA_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */ - #define CDC_CMD_PACKET_SZE 8 /* Control Endpoint Packet size */ - - #define CDC_IN_FRAME_INTERVAL 5 /* Number of frames between IN transfers */ - #define APP_RX_DATA_SIZE 2048 /* Total size of IN buffer: - APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be > CDC_IN_FRAME_INTERVAL */ -#endif /* USE_USB_OTG_HS */ - -#define APP_FOPS VCP_fops -/** - * @} - */ - -/** @defgroup USB_CONF_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_CONF_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_CONF_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_CONF_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ - - -#endif //__USBD_CONF__H__ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_conf/usbd_desc.h b/car_hw/src/lib/usb_conf/usbd_desc.h deleted file mode 100644 index ed999dc62a0..00000000000 --- a/car_hw/src/lib/usb_conf/usbd_desc.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_desc.h - * @author MCD Application Team - * @version V1.0.0 - * @date 19-September-2011 - * @brief header file for the usbd_desc.c file - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ - -#ifndef __USB_DESC_H -#define __USB_DESC_H - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USB_DESC - * @brief general defines for the usb device library file - * @{ - */ - -/** @defgroup USB_DESC_Exported_Defines - * @{ - */ -#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 -#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 -#define USB_STRING_DESCRIPTOR_TYPE 0x03 -#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 -#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 -#define USB_SIZ_DEVICE_DESC 18 -#define USB_SIZ_STRING_LANGID 4 - -/** - * @} - */ - - -/** @defgroup USBD_DESC_Exported_TypesDefinitions - * @{ - */ -/** - * @} - */ - - - -/** @defgroup USBD_DESC_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_Variables - * @{ - */ -extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC]; -extern uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ]; -extern uint8_t USBD_OtherSpeedCfgDesc[USB_LEN_CFG_DESC]; -extern uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC]; -extern uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID]; -extern USBD_DEVICE USR_desc; -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_FunctionsPrototype - * @{ - */ - - -uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length); -uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length); -uint8_t * USBD_USR_ManufacturerStrDescriptor ( uint8_t speed , uint16_t *length); -uint8_t * USBD_USR_ProductStrDescriptor ( uint8_t speed , uint16_t *length); -uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length); -uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length); -uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length); - -#ifdef USB_SUPPORT_USER_STRING_DESC -uint8_t * USBD_USR_USRStringDesc (uint8_t speed, uint8_t idx , uint16_t *length); -#endif /* USB_SUPPORT_USER_STRING_DESC */ - -/** - * @} - */ - -#endif /* __USBD_DESC_H */ - -/** - * @} - */ - -/** -* @} -*/ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_conf/usbh_conf.h b/car_hw/src/lib/usb_conf/usbh_conf.h deleted file mode 100644 index 67c32f6f852..00000000000 --- a/car_hw/src/lib/usb_conf/usbh_conf.h +++ /dev/null @@ -1,94 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_conf_template - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief General USB Host library configuration - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBH_CONF__H__ -#define __USBH_CONF__H__ - -/* Includes ------------------------------------------------------------------*/ -/** @addtogroup USBH_OTG_DRIVER - * @{ - */ - -/** @defgroup USBH_CONF - * @brief usb otg low level driver configuration file - * @{ - */ - -/** @defgroup USBH_CONF_Exported_Defines - * @{ - */ - -#define USBH_MAX_NUM_ENDPOINTS 2 -#define USBH_MAX_NUM_INTERFACES 2 -#ifdef USE_USB_OTG_FS -#define USBH_MSC_MPS_SIZE 0x40 -#else -#define USBH_MSC_MPS_SIZE 0x200 -#endif - -/** - * @} - */ - - -/** @defgroup USBH_CONF_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_CONF_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_CONF_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_CONF_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ - - -#endif //__USBH_CONF__H__ - - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_device/Makefile b/car_hw/src/lib/usb_device/Makefile deleted file mode 100644 index b61de73d3b7..00000000000 --- a/car_hw/src/lib/usb_device/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -LIB_USB_DEV_CORE_DIR=$(LIB_USB_DEV_DIR)/core -LIB_USB_DEV_CDC_CLASS_DIR=$(LIB_USB_DEV_DIR)/class/cdc - -LIB_USB_DEV_CORE_OBJ=$(BIN_DIR)/libusbdevice_core.o -LIB_USB_DEV_CDC_CLASS_OBJ=$(BIN_DIR)/libusbdevice_clcdc.o - -$(LIB_USB_DEV_OBJ): $(LIB_USB_DEV_CORE_OBJ) \ - $(LIB_USB_DEV_CDC_CLASS_OBJ) - $(LD_ALL_DEPS) - -LIB_USB_DEV_CORE_OBJ_PREFIX=libusbdevice_core_ - -# =========================================== -INCLUDES+=-I$(LIB_USB_DEV_CORE_DIR)/inc - -$(LIB_USB_DEV_CORE_OBJ): \ - $(call dircs_to_prefxd_objs,$(LIB_USB_DEV_CORE_DIR)/src,$(LIB_USB_DEV_CORE_OBJ_PREFIX)) - $(LD_ALL_DEPS) - -$(BIN_DIR)/$(LIB_USB_DEV_CORE_OBJ_PREFIX)%.o: $(LIB_USB_DEV_CORE_DIR)/src/%.c \ - $(call dirhs,$(LIB_USB_DEV_CORE_DIR)/inc) - $(CC_ALL_DEPS) - -# =========================================== -LIB_USB_DEV_CDC_CLASS_OBJ_PREFIX=libusbdevice_cdc_ - -INCLUDES+=-I$(LIB_USB_DEV_CDC_CLASS_DIR)/inc - -$(LIB_USB_DEV_CDC_CLASS_OBJ): \ - $(call dircs_to_prefxd_objs,$(LIB_USB_DEV_CDC_CLASS_DIR)/src,$(LIB_USB_DEV_CDC_CLASS_OBJ_PREFIX)) - $(LD_ALL_DEPS) - -$(BIN_DIR)/$(LIB_USB_DEV_CDC_CLASS_OBJ_PREFIX)%.o: $(LIB_USB_DEV_CDC_CLASS_DIR)/src/%.c \ - $(call dirhs,$(LIB_USB_DEV_CDC_CLASS_DIR)/inc) - $(CC_ALL_DEPS) diff --git a/car_hw/src/lib/usb_device/class/cdc/inc/usbd_cdc_core.h b/car_hw/src/lib/usb_device/class/cdc/inc/usbd_cdc_core.h deleted file mode 100644 index af352d882bb..00000000000 --- a/car_hw/src/lib/usb_device/class/cdc/inc/usbd_cdc_core.h +++ /dev/null @@ -1,137 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_core.h - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief header file for the usbd_cdc_core.c file. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ - -#ifndef __USB_CDC_CORE_H_ -#define __USB_CDC_CORE_H_ - -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup usbd_cdc - * @brief This file is the Header file for USBD_cdc.c - * @{ - */ - - -/** @defgroup usbd_cdc_Exported_Defines - * @{ - */ -#define USB_CDC_CONFIG_DESC_SIZ (67) -#define USB_CDC_DESC_SIZ (67-9) - -#define CDC_DESCRIPTOR_TYPE 0x21 - -#define DEVICE_CLASS_CDC 0x02 -#define DEVICE_SUBCLASS_CDC 0x00 - - -#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 -#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 -#define USB_STRING_DESCRIPTOR_TYPE 0x03 -#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 -#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 - -#define STANDARD_ENDPOINT_DESC_SIZE 0x09 - -#define CDC_DATA_IN_PACKET_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 57) - -#define CDC_DATA_OUT_PACKET_SIZE *(uint16_t *)(((USB_OTG_CORE_HANDLE *)pdev)->dev.pConfig_descriptor + 64) - -/*---------------------------------------------------------------------*/ -/* CDC definitions */ -/*---------------------------------------------------------------------*/ - -/**************************************************/ -/* CDC Requests */ -/**************************************************/ -#define SEND_ENCAPSULATED_COMMAND 0x00 -#define GET_ENCAPSULATED_RESPONSE 0x01 -#define SET_COMM_FEATURE 0x02 -#define GET_COMM_FEATURE 0x03 -#define CLEAR_COMM_FEATURE 0x04 -#define SET_LINE_CODING 0x20 -#define GET_LINE_CODING 0x21 -#define SET_CONTROL_LINE_STATE 0x22 -#define SEND_BREAK 0x23 -#define NO_CMD 0xFF - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ -typedef struct _CDC_IF_PROP -{ - uint16_t (*pIf_Init) (void); - uint16_t (*pIf_DeInit) (void); - uint16_t (*pIf_Ctrl) (uint32_t Cmd, uint8_t* Buf, uint32_t Len); - uint16_t (*pIf_DataTx) (uint8_t* Buf, uint32_t Len); - uint16_t (*pIf_DataRx) (uint8_t* Buf, uint32_t Len); -} -CDC_IF_Prop_TypeDef; -/** - * @} - */ - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_Class_cb_TypeDef USBD_CDC_cb; -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -/** - * @} - */ - -#endif // __USB_CDC_CORE_H_ -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_device/class/cdc/src/usbd_cdc_core.c b/car_hw/src/lib/usb_device/class/cdc/src/usbd_cdc_core.c deleted file mode 100644 index 2b7fa65014a..00000000000 --- a/car_hw/src/lib/usb_device/class/cdc/src/usbd_cdc_core.c +++ /dev/null @@ -1,811 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_core.c - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief This file provides the high layer firmware functions to manage the - * following functionalities of the USB CDC Class: - * - Initialization and Configuration of high and low layer - * - Enumeration as CDC Device (and enumeration for each implemented memory interface) - * - OUT/IN data transfer - * - Command IN transfer (class requests management) - * - Error management - * - * @verbatim - * - * =================================================================== - * CDC Class Driver Description - * =================================================================== - * This driver manages the "Universal Serial Bus Class Definitions for Communications Devices - * Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus - * Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) - * - Requests management (as described in section 6.2 in specification) - * - Abstract Control Model compliant - * - Union Functional collection (using 1 IN endpoint for control) - * - Data interface class - - * @note - * For the Abstract Control Model, this core allows only transmitting the requests to - * lower layer dispatcher (ie. usbd_cdc_vcp.c/.h) which should manage each request and - * perform relative actions. - * - * These aspects may be enriched or modified for a specific user application. - * - * This driver doesn't implement the following aspects of the specification - * (but it is possible to manage these features with some modifications on this driver): - * - Any class-specific aspect relative to communication classes should be managed by user application. - * - All communication classes other than PSTN are not managed - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_core.h" -#include "usbd_desc.h" -#include "usbd_req.h" - - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup usbd_cdc - * @brief usbd core module - * @{ - */ - -/** @defgroup usbd_cdc_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup usbd_cdc_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup usbd_cdc_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup usbd_cdc_Private_FunctionPrototypes - * @{ - */ - -/********************************************* - CDC Device library callbacks - *********************************************/ -static uint8_t usbd_cdc_Init (void *pdev, uint8_t cfgidx); -static uint8_t usbd_cdc_DeInit (void *pdev, uint8_t cfgidx); -static uint8_t usbd_cdc_Setup (void *pdev, USB_SETUP_REQ *req); -static uint8_t usbd_cdc_EP0_RxReady (void *pdev); -static uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum); -static uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum); -static uint8_t usbd_cdc_SOF (void *pdev); - -/********************************************* - CDC specific management functions - *********************************************/ -static void Handle_USBAsynchXfer (void *pdev); -static uint8_t *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length); -#ifdef USE_USB_OTG_HS -static uint8_t *USBD_cdc_GetOtherCfgDesc (uint8_t speed, uint16_t *length); -#endif -/** - * @} - */ - -/** @defgroup usbd_cdc_Private_Variables - * @{ - */ -extern CDC_IF_Prop_TypeDef APP_FOPS; -extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC]; - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ; - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -__ALIGN_BEGIN uint8_t usbd_cdc_OtherCfgDesc [USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END ; - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -__ALIGN_BEGIN static __IO uint32_t usbd_cdc_AltSet __ALIGN_END = 0; - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -__ALIGN_BEGIN uint8_t USB_Rx_Buffer [CDC_DATA_MAX_PACKET_SIZE] __ALIGN_END ; - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -__ALIGN_BEGIN uint8_t APP_Rx_Buffer [APP_RX_DATA_SIZE] __ALIGN_END ; - - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -__ALIGN_BEGIN uint8_t CmdBuff[CDC_CMD_PACKET_SZE] __ALIGN_END ; - -uint32_t APP_Rx_ptr_in = 0; -uint32_t APP_Rx_ptr_out = 0; -uint32_t APP_Rx_length = 0; - -uint8_t USB_Tx_State = 0; - -static uint32_t cdcCmd = 0xFF; -static uint32_t cdcLen = 0; - -/* CDC interface class callbacks structure */ -USBD_Class_cb_TypeDef USBD_CDC_cb = -{ - usbd_cdc_Init, - usbd_cdc_DeInit, - usbd_cdc_Setup, - NULL, /* EP0_TxSent, */ - usbd_cdc_EP0_RxReady, - usbd_cdc_DataIn, - usbd_cdc_DataOut, - usbd_cdc_SOF, - NULL, - NULL, - USBD_cdc_GetCfgDesc, -#ifdef USE_USB_OTG_HS - USBD_cdc_GetOtherCfgDesc, /* use same cobfig as per FS */ -#endif /* USE_USB_OTG_HS */ -}; - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -/* USB CDC device Configuration Descriptor */ -__ALIGN_BEGIN uint8_t usbd_cdc_CfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = -{ - /*Configuration Descriptor*/ - 0x09, /* bLength: Configuration Descriptor size */ - USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ - USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ - 0x00, - 0x02, /* bNumInterfaces: 2 interface */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ - 0xC0, /* bmAttributes: self powered */ - 0x32, /* MaxPower 0 mA */ - - /*---------------------------------------------------------------------------*/ - - /*Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ - - /*Header Functional Descriptor*/ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /*Call Management Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - 0x01, /* bDataInterface: 1 */ - - /*ACM Functional Descriptor*/ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /*Union Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - 0x00, /* bMasterInterface: Communication class interface */ - 0x01, /* bSlaveInterface0: Data Class Interface */ - - /*Endpoint 2 Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ - CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SZE), -#ifdef USE_USB_OTG_HS - 0x10, /* bInterval: */ -#else - 0xFF, /* bInterval: */ -#endif /* USE_USB_OTG_HS */ - - /*---------------------------------------------------------------------------*/ - - /*Data class interface descriptor*/ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ - 0x01, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /*Endpoint OUT Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ - CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /*Endpoint IN Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ - CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_MAX_PACKET_SIZE), - 0x00 /* bInterval: ignore for Bulk transfer */ -} ; - -#ifdef USE_USB_OTG_HS -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -__ALIGN_BEGIN uint8_t usbd_cdc_OtherCfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = -{ - 0x09, /* bLength: Configuation Descriptor size */ - USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, - USB_CDC_CONFIG_DESC_SIZ, - 0x00, - 0x02, /* bNumInterfaces: 2 interfaces */ - 0x01, /* bConfigurationValue: */ - 0x04, /* iConfiguration: */ - 0xC0, /* bmAttributes: */ - 0x32, /* MaxPower 100 mA */ - - /*Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ - - /*Header Functional Descriptor*/ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /*Call Management Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - 0x01, /* bDataInterface: 1 */ - - /*ACM Functional Descriptor*/ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /*Union Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - 0x00, /* bMasterInterface: Communication class interface */ - 0x01, /* bSlaveInterface0: Data Class Interface */ - - /*Endpoint 2 Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ - CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SZE), - 0xFF, /* bInterval: */ - - /*---------------------------------------------------------------------------*/ - - /*Data class interface descriptor*/ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ - 0x01, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /*Endpoint OUT Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ - CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - 0x40, /* wMaxPacketSize: */ - 0x00, - 0x00, /* bInterval: ignore for Bulk transfer */ - - /*Endpoint IN Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ - CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - 0x40, /* wMaxPacketSize: */ - 0x00, - 0x00 /* bInterval */ -}; -#endif /* USE_USB_OTG_HS */ - -/** - * @} - */ - -/** @defgroup usbd_cdc_Private_Functions - * @{ - */ - -/** - * @brief usbd_cdc_Init - * Initilaize the CDC interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t usbd_cdc_Init (void *pdev, - uint8_t cfgidx) -{ - uint8_t *pbuf; - - /* Open EP IN */ - DCD_EP_Open(pdev, - CDC_IN_EP, - CDC_DATA_IN_PACKET_SIZE, - USB_OTG_EP_BULK); - - /* Open EP OUT */ - DCD_EP_Open(pdev, - CDC_OUT_EP, - CDC_DATA_OUT_PACKET_SIZE, - USB_OTG_EP_BULK); - - /* Open Command IN EP */ - DCD_EP_Open(pdev, - CDC_CMD_EP, - CDC_CMD_PACKET_SZE, - USB_OTG_EP_INT); - - pbuf = (uint8_t *)USBD_DeviceDesc; - pbuf[4] = DEVICE_CLASS_CDC; - pbuf[5] = DEVICE_SUBCLASS_CDC; - - /* Initialize the Interface physical components */ - APP_FOPS.pIf_Init(); - - /* Prepare Out endpoint to receive next packet */ - DCD_EP_PrepareRx(pdev, - CDC_OUT_EP, - (uint8_t*)(USB_Rx_Buffer), - CDC_DATA_OUT_PACKET_SIZE); - - return USBD_OK; -} - -/** - * @brief usbd_cdc_Init - * DeInitialize the CDC layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t usbd_cdc_DeInit (void *pdev, - uint8_t cfgidx) -{ - /* Open EP IN */ - DCD_EP_Close(pdev, - CDC_IN_EP); - - /* Open EP OUT */ - DCD_EP_Close(pdev, - CDC_OUT_EP); - - /* Open Command IN EP */ - DCD_EP_Close(pdev, - CDC_CMD_EP); - - /* Restore default state of the Interface physical components */ - APP_FOPS.pIf_DeInit(); - - return USBD_OK; -} - -/** - * @brief usbd_cdc_Setup - * Handle the CDC specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t usbd_cdc_Setup (void *pdev, - USB_SETUP_REQ *req) -{ - uint16_t len; - uint8_t *pbuf; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - /* CDC Class Requests -------------------------------*/ - case USB_REQ_TYPE_CLASS : - /* Check if the request is a data setup packet */ - if (req->wLength) - { - /* Check if the request is Device-to-Host */ - if (req->bmRequest & 0x80) - { - /* Get the data to be sent to Host from interface layer */ - APP_FOPS.pIf_Ctrl(req->bRequest, CmdBuff, req->wLength); - - /* Send the data to the host */ - USBD_CtlSendData (pdev, - CmdBuff, - req->wLength); - } - else /* Host-to-Device requeset */ - { - /* Set the value of the current command to be processed */ - cdcCmd = req->bRequest; - cdcLen = req->wLength; - - /* Prepare the reception of the buffer over EP0 - Next step: the received data will be managed in usbd_cdc_EP0_TxSent() - function. */ - USBD_CtlPrepareRx (pdev, - CmdBuff, - req->wLength); - } - } - else /* No Data request */ - { - /* Transfer the command to the interface layer */ - APP_FOPS.pIf_Ctrl(req->bRequest, NULL, 0); - } - - return USBD_OK; - - default: - USBD_CtlError (pdev, req); - return USBD_FAIL; - - - - /* Standard Requests -------------------------------*/ - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - if( (req->wValue >> 8) == CDC_DESCRIPTOR_TYPE) - { -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - pbuf = usbd_cdc_Desc; -#else - pbuf = usbd_cdc_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM); -#endif - len = MIN(USB_CDC_DESC_SIZ , req->wLength); - } - - USBD_CtlSendData (pdev, - pbuf, - len); - break; - - case USB_REQ_GET_INTERFACE : - USBD_CtlSendData (pdev, - (uint8_t *)&usbd_cdc_AltSet, - 1); - break; - - case USB_REQ_SET_INTERFACE : - if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM) - { - usbd_cdc_AltSet = (uint8_t)(req->wValue); - } - else - { - /* Call the error management function (command will be nacked */ - USBD_CtlError (pdev, req); - } - break; - } - } - return USBD_OK; -} - -/** - * @brief usbd_cdc_EP0_RxReady - * Data received on control endpoint - * @param pdev: device device instance - * @retval status - */ -static uint8_t usbd_cdc_EP0_RxReady (void *pdev) -{ - if (cdcCmd != NO_CMD) - { - /* Process the data */ - APP_FOPS.pIf_Ctrl(cdcCmd, CmdBuff, cdcLen); - - /* Reset the command variable to default value */ - cdcCmd = NO_CMD; - } - - return USBD_OK; -} - -/** - * @brief usbd_audio_DataIn - * Data sent on non-control IN endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t usbd_cdc_DataIn (void *pdev, uint8_t epnum) -{ - uint16_t USB_Tx_ptr; - uint16_t USB_Tx_length; - - if (USB_Tx_State == 1) - { - if (APP_Rx_length == 0) - { - USB_Tx_State = 0; - } - else - { - if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE){ - USB_Tx_ptr = APP_Rx_ptr_out; - USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; - - APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE; - APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE; - } - else - { - USB_Tx_ptr = APP_Rx_ptr_out; - USB_Tx_length = APP_Rx_length; - - APP_Rx_ptr_out += APP_Rx_length; - APP_Rx_length = 0; - } - - /* Prepare the available data buffer to be sent on IN endpoint */ - DCD_EP_Tx (pdev, - CDC_IN_EP, - (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr], - USB_Tx_length); - } - } - - return USBD_OK; -} - -/** - * @brief usbd_audio_DataOut - * Data received on non-control Out endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t usbd_cdc_DataOut (void *pdev, uint8_t epnum) -{ - uint16_t USB_Rx_Cnt; - - /* Get the received data buffer and update the counter */ - USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count; - - /* USB data will be immediately processed, this allow next USB traffic being - NAKed till the end of the application Xfer */ - APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt); - - /* Prepare Out endpoint to receive next packet */ - DCD_EP_PrepareRx(pdev, - CDC_OUT_EP, - (uint8_t*)(USB_Rx_Buffer), - CDC_DATA_OUT_PACKET_SIZE); - - return USBD_OK; -} - -/** - * @brief usbd_audio_SOF - * Start Of Frame event management - * @param pdev: instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t usbd_cdc_SOF (void *pdev) -{ - static uint32_t FrameCount = 0; - - if (FrameCount++ == CDC_IN_FRAME_INTERVAL) - { - /* Reset the frame counter */ - FrameCount = 0; - - /* Check the data to be sent through IN pipe */ - Handle_USBAsynchXfer(pdev); - } - - return USBD_OK; -} - -/** - * @brief Handle_USBAsynchXfer - * Send data to USB - * @param pdev: instance - * @retval None - */ -static void Handle_USBAsynchXfer (void *pdev) -{ - uint16_t USB_Tx_ptr; - uint16_t USB_Tx_length; - - if(USB_Tx_State != 1) - { - if (APP_Rx_ptr_out == APP_RX_DATA_SIZE) - { - APP_Rx_ptr_out = 0; - } - - if(APP_Rx_ptr_out == APP_Rx_ptr_in) - { - USB_Tx_State = 0; - return; - } - - if(APP_Rx_ptr_out > APP_Rx_ptr_in) /* rollback */ - { - APP_Rx_length = APP_RX_DATA_SIZE - APP_Rx_ptr_out; - - } - else - { - APP_Rx_length = APP_Rx_ptr_in - APP_Rx_ptr_out; - - } -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - APP_Rx_length &= ~0x03; -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ - - if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE) - { - USB_Tx_ptr = APP_Rx_ptr_out; - USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; - - APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE; - APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE; - } - else - { - USB_Tx_ptr = APP_Rx_ptr_out; - USB_Tx_length = APP_Rx_length; - - APP_Rx_ptr_out += APP_Rx_length; - APP_Rx_length = 0; - } - USB_Tx_State = 1; - - DCD_EP_Tx (pdev, - CDC_IN_EP, - (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr], - USB_Tx_length); - } - -} - -/** - * @brief USBD_cdc_GetCfgDesc - * Return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_cdc_GetCfgDesc (uint8_t speed, uint16_t *length) -{ - *length = sizeof (usbd_cdc_CfgDesc); - return usbd_cdc_CfgDesc; -} - -/** - * @brief USBD_cdc_GetCfgDesc - * Return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -#ifdef USE_USB_OTG_HS -static uint8_t *USBD_cdc_GetOtherCfgDesc (uint8_t speed, uint16_t *length) -{ - *length = sizeof (usbd_cdc_OtherCfgDesc); - return usbd_cdc_OtherCfgDesc; -} -#endif -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_device/core/inc/usbd_core.h b/car_hw/src/lib/usb_device/core/inc/usbd_core.h deleted file mode 100644 index 884bd163030..00000000000 --- a/car_hw/src/lib/usb_device/core/inc/usbd_core.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_core.h - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief Header file for usbd_core.c - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CORE_H -#define __USBD_CORE_H - -/* Includes ------------------------------------------------------------------*/ -#include "usb_dcd.h" -#include "usbd_def.h" -#include "usbd_conf.h" - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_CORE - * @brief This file is the Header file for usbd_core.c file - * @{ - */ - - -/** @defgroup USBD_CORE_Exported_Defines - * @{ - */ - -typedef enum { - USBD_OK = 0, - USBD_BUSY, - USBD_FAIL, -}USBD_Status; -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_FunctionsPrototype - * @{ - */ -void USBD_Init(USB_OTG_CORE_HANDLE *pdev, - USB_OTG_CORE_ID_TypeDef coreID, - USBD_DEVICE *pDevice, - USBD_Class_cb_TypeDef *class_cb, - USBD_Usr_cb_TypeDef *usr_cb); - -USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev); - -USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx); - -USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx); - -/** - * @} - */ - -#endif /* __USBD_CORE_H */ - -/** - * @} - */ - -/** -* @} -*/ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - - - diff --git a/car_hw/src/lib/usb_device/core/inc/usbd_def.h b/car_hw/src/lib/usb_device/core/inc/usbd_def.h deleted file mode 100644 index a2efc5d6ee5..00000000000 --- a/car_hw/src/lib/usb_device/core/inc/usbd_def.h +++ /dev/null @@ -1,149 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_def.h - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief general defines for the usb device library - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ - -#ifndef __USBD_DEF_H -#define __USBD_DEF_H -/* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USB_DEF - * @brief general defines for the usb device library file - * @{ - */ - -/** @defgroup USB_DEF_Exported_Defines - * @{ - */ - -#ifndef NULL -#define NULL 0 -#endif - -#define USB_LEN_DEV_QUALIFIER_DESC 0x0A -#define USB_LEN_DEV_DESC 0x12 -#define USB_LEN_CFG_DESC 0x09 -#define USB_LEN_IF_DESC 0x09 -#define USB_LEN_EP_DESC 0x07 -#define USB_LEN_OTG_DESC 0x03 - -#define USBD_IDX_LANGID_STR 0x00 -#define USBD_IDX_MFC_STR 0x01 -#define USBD_IDX_PRODUCT_STR 0x02 -#define USBD_IDX_SERIAL_STR 0x03 -#define USBD_IDX_CONFIG_STR 0x04 -#define USBD_IDX_INTERFACE_STR 0x05 - -#define USB_REQ_TYPE_STANDARD 0x00 -#define USB_REQ_TYPE_CLASS 0x20 -#define USB_REQ_TYPE_VENDOR 0x40 -#define USB_REQ_TYPE_MASK 0x60 - -#define USB_REQ_RECIPIENT_DEVICE 0x00 -#define USB_REQ_RECIPIENT_INTERFACE 0x01 -#define USB_REQ_RECIPIENT_ENDPOINT 0x02 -#define USB_REQ_RECIPIENT_MASK 0x03 - -#define USB_REQ_GET_STATUS 0x00 -#define USB_REQ_CLEAR_FEATURE 0x01 -#define USB_REQ_SET_FEATURE 0x03 -#define USB_REQ_SET_ADDRESS 0x05 -#define USB_REQ_GET_DESCRIPTOR 0x06 -#define USB_REQ_SET_DESCRIPTOR 0x07 -#define USB_REQ_GET_CONFIGURATION 0x08 -#define USB_REQ_SET_CONFIGURATION 0x09 -#define USB_REQ_GET_INTERFACE 0x0A -#define USB_REQ_SET_INTERFACE 0x0B -#define USB_REQ_SYNCH_FRAME 0x0C - -#define USB_DESC_TYPE_DEVICE 1 -#define USB_DESC_TYPE_CONFIGURATION 2 -#define USB_DESC_TYPE_STRING 3 -#define USB_DESC_TYPE_INTERFACE 4 -#define USB_DESC_TYPE_ENDPOINT 5 -#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 -#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 - - -#define USB_CONFIG_REMOTE_WAKEUP 2 -#define USB_CONFIG_SELF_POWERED 1 - -#define USB_FEATURE_EP_HALT 0 -#define USB_FEATURE_REMOTE_WAKEUP 1 -#define USB_FEATURE_TEST_MODE 2 - -/** - * @} - */ - - -/** @defgroup USBD_DEF_Exported_TypesDefinitions - * @{ - */ -/** - * @} - */ - - - -/** @defgroup USBD_DEF_Exported_Macros - * @{ - */ -#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ - (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) - -#define LOBYTE(x) ((uint8_t)(x & 0x00FF)) -#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8)) -/** - * @} - */ - -/** @defgroup USBD_DEF_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_DEF_Exported_FunctionsPrototype - * @{ - */ - -/** - * @} - */ - -#endif /* __USBD_DEF_H */ - -/** - * @} - */ - -/** -* @} -*/ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_device/core/inc/usbd_ioreq.h b/car_hw/src/lib/usb_device/core/inc/usbd_ioreq.h deleted file mode 100644 index 4737ff8db91..00000000000 --- a/car_hw/src/lib/usb_device/core/inc/usbd_ioreq.h +++ /dev/null @@ -1,115 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ioreq.h - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief header file for the usbd_ioreq.c file - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ - -#ifndef __USBD_IOREQ_H_ -#define __USBD_IOREQ_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" -#include "usbd_core.h" - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_IOREQ - * @brief header file for the usbd_ioreq.c file - * @{ - */ - -/** @defgroup USBD_IOREQ_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Exported_Types - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup USBD_IOREQ_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype - * @{ - */ - -USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev, - uint8_t *buf, - uint16_t len); - -USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len); - -USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len); - -USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len); - -USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev); - -USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev); - -uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , - uint8_t epnum); - -/** - * @} - */ - -#endif /* __USBD_IOREQ_H_ */ - -/** - * @} - */ - -/** -* @} -*/ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_device/core/inc/usbd_req.h b/car_hw/src/lib/usb_device/core/inc/usbd_req.h deleted file mode 100644 index dcfa8930c7b..00000000000 --- a/car_hw/src/lib/usb_device/core/inc/usbd_req.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_req.h - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief header file for the usbd_req.c file - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ - -#ifndef __USB_REQUEST_H_ -#define __USB_REQUEST_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" -#include "usbd_core.h" -#include "usbd_conf.h" - - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_REQ - * @brief header file for the usbd_ioreq.c file - * @{ - */ - -/** @defgroup USBD_REQ_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_REQ_Exported_Types - * @{ - */ -/** - * @} - */ - - - -/** @defgroup USBD_REQ_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_REQ_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_REQ_Exported_FunctionsPrototype - * @{ - */ - -USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); -USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); -USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); -void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); -/** - * @} - */ - -#endif /* __USB_REQUEST_H_ */ - -/** - * @} - */ - -/** -* @} -*/ - - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_device/core/inc/usbd_usr.h b/car_hw/src/lib/usb_device/core/inc/usbd_usr.h deleted file mode 100644 index 096759b54ce..00000000000 --- a/car_hw/src/lib/usb_device/core/inc/usbd_usr.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_usr.h - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief Header file for usbd_usr.c - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_USR_H__ -#define __USBD_USR_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" - - -/** @addtogroup USBD_USER - * @{ - */ - -/** @addtogroup USBD_MSC_DEMO_USER_CALLBACKS - * @{ - */ - -/** @defgroup USBD_USR - * @brief This file is the Header file for usbd_usr.c - * @{ - */ - - -/** @defgroup USBD_USR_Exported_Types - * @{ - */ - -extern USBD_Usr_cb_TypeDef USR_cb; -extern USBD_Usr_cb_TypeDef USR_FS_cb; -extern USBD_Usr_cb_TypeDef USR_HS_cb; - - - -/** - * @} - */ - - - -/** @defgroup USBD_USR_Exported_Defines - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_USR_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_USR_Exported_Variables - * @{ - */ - -void USBD_USR_Init(void); -void USBD_USR_DeviceReset (uint8_t speed); -void USBD_USR_DeviceConfigured (void); -void USBD_USR_DeviceSuspended(void); -void USBD_USR_DeviceResumed(void); - -void USBD_USR_DeviceConnected(void); -void USBD_USR_DeviceDisconnected(void); - -void USBD_USR_FS_Init(void); -void USBD_USR_FS_DeviceReset (uint8_t speed); -void USBD_USR_FS_DeviceConfigured (void); -void USBD_USR_FS_DeviceSuspended(void); -void USBD_USR_FS_DeviceResumed(void); - -void USBD_USR_FS_DeviceConnected(void); -void USBD_USR_FS_DeviceDisconnected(void); - -void USBD_USR_HS_Init(void); -void USBD_USR_HS_DeviceReset (uint8_t speed); -void USBD_USR_HS_DeviceConfigured (void); -void USBD_USR_HS_DeviceSuspended(void); -void USBD_USR_HS_DeviceResumed(void); - -void USBD_USR_HS_DeviceConnected(void); -void USBD_USR_HS_DeviceDisconnected(void); - -/** - * @} - */ - -/** @defgroup USBD_USR_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ - -#endif /*__USBD_USR_H__*/ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - - - - diff --git a/car_hw/src/lib/usb_device/core/src/usbd_core.c b/car_hw/src/lib/usb_device/core/src/usbd_core.c deleted file mode 100644 index f12f3c80f96..00000000000 --- a/car_hw/src/lib/usb_device/core/src/usbd_core.c +++ /dev/null @@ -1,476 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_core.c - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief This file provides all the USBD core functions. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" -#include "usbd_req.h" -#include "usbd_ioreq.h" -#include "usb_dcd_int.h" -#include "usb_bsp.h" - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY -* @{ -*/ - - -/** @defgroup USBD_CORE -* @brief usbd core module -* @{ -*/ - -/** @defgroup USBD_CORE_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBD_CORE_Private_Defines -* @{ -*/ - -/** -* @} -*/ - - -/** @defgroup USBD_CORE_Private_Macros -* @{ -*/ -/** -* @} -*/ - - - - -/** @defgroup USBD_CORE_Private_FunctionPrototypes -* @{ -*/ -static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev); -static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); -static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); -static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev); -static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev); -static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev); -static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev); -#ifdef VBUS_SENSING_ENABLED -static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev); -static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev); -#endif -static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev); -static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev); -/** -* @} -*/ - -/** @defgroup USBD_CORE_Private_Variables -* @{ -*/ - - - -USBD_DCD_INT_cb_TypeDef USBD_DCD_INT_cb = -{ - USBD_DataOutStage, - USBD_DataInStage, - USBD_SetupStage, - USBD_SOF, - USBD_Reset, - USBD_Suspend, - USBD_Resume, - USBD_IsoINIncomplete, - USBD_IsoOUTIncomplete, -#ifdef VBUS_SENSING_ENABLED -USBD_DevConnected, -USBD_DevDisconnected, -#endif -}; - -USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops = &USBD_DCD_INT_cb; -/** -* @} -*/ - -/** @defgroup USBD_CORE_Private_Functions -* @{ -*/ - -/** -* @brief USBD_Init -* Initailizes the device stack and load the class driver -* @param pdev: device instance -* @param core_address: USB OTG core ID -* @param class_cb: Class callback structure address -* @param usr_cb: User callback structure address -* @retval None -*/ -void USBD_Init(USB_OTG_CORE_HANDLE *pdev, - USB_OTG_CORE_ID_TypeDef coreID, - USBD_DEVICE *pDevice, - USBD_Class_cb_TypeDef *class_cb, - USBD_Usr_cb_TypeDef *usr_cb) -{ - /* Hardware Init */ - USB_OTG_BSP_Init(pdev); - - USBD_DeInit(pdev); - - /*Register class and user callbacks */ - pdev->dev.class_cb = class_cb; - pdev->dev.usr_cb = usr_cb; - pdev->dev.usr_device = pDevice; - - /* set USB OTG core params */ - DCD_Init(pdev , coreID); - - /* Upon Init call usr callback */ - pdev->dev.usr_cb->Init(); - - /* Enable Interrupts */ - USB_OTG_BSP_EnableInterrupt(pdev); -} - -/** -* @brief USBD_DeInit -* Re-Initialize th deviuce library -* @param pdev: device instance -* @retval status: status -*/ -USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev) -{ - /* Software Init */ - - return USBD_OK; -} - -/** -* @brief USBD_SetupStage -* Handle the setup stage -* @param pdev: device instance -* @retval status -*/ -static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev) -{ - USB_SETUP_REQ req; - - USBD_ParseSetupRequest(pdev , &req); - - switch (req.bmRequest & 0x1F) - { - case USB_REQ_RECIPIENT_DEVICE: - USBD_StdDevReq (pdev, &req); - break; - - case USB_REQ_RECIPIENT_INTERFACE: - USBD_StdItfReq(pdev, &req); - break; - - case USB_REQ_RECIPIENT_ENDPOINT: - USBD_StdEPReq(pdev, &req); - break; - - default: - DCD_EP_Stall(pdev , req.bmRequest & 0x80); - break; - } - return USBD_OK; -} - -/** -* @brief USBD_DataOutStage -* Handle data out stage -* @param pdev: device instance -* @param epnum: endpoint index -* @retval status -*/ -static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) -{ - USB_OTG_EP *ep; - - if(epnum == 0) - { - ep = &pdev->dev.out_ep[0]; - if ( pdev->dev.device_state == USB_OTG_EP0_DATA_OUT) - { - if(ep->rem_data_len > ep->maxpacket) - { - ep->rem_data_len -= ep->maxpacket; - - if(pdev->cfg.dma_enable == 1) - { - /* in slave mode this, is handled by the RxSTSQLvl ISR */ - ep->xfer_buff += ep->maxpacket; - } - USBD_CtlContinueRx (pdev, - ep->xfer_buff, - MIN(ep->rem_data_len ,ep->maxpacket)); - } - else - { - if((pdev->dev.class_cb->EP0_RxReady != NULL)&& - (pdev->dev.device_status == USB_OTG_CONFIGURED)) - { - pdev->dev.class_cb->EP0_RxReady(pdev); - } - USBD_CtlSendStatus(pdev); - } - } - } - else if((pdev->dev.class_cb->DataOut != NULL)&& - (pdev->dev.device_status == USB_OTG_CONFIGURED)) - { - pdev->dev.class_cb->DataOut(pdev, epnum); - } - return USBD_OK; -} - -/** -* @brief USBD_DataInStage -* Handle data in stage -* @param pdev: device instance -* @param epnum: endpoint index -* @retval status -*/ -static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) -{ - USB_OTG_EP *ep; - - if(epnum == 0) - { - ep = &pdev->dev.in_ep[0]; - if ( pdev->dev.device_state == USB_OTG_EP0_DATA_IN) - { - if(ep->rem_data_len > ep->maxpacket) - { - ep->rem_data_len -= ep->maxpacket; - if(pdev->cfg.dma_enable == 1) - { - /* in slave mode this, is handled by the TxFifoEmpty ISR */ - ep->xfer_buff += ep->maxpacket; - } - USBD_CtlContinueSendData (pdev, - ep->xfer_buff, - ep->rem_data_len); - } - else - { /* last packet is MPS multiple, so send ZLP packet */ - if((ep->total_data_len % ep->maxpacket == 0) && - (ep->total_data_len >= ep->maxpacket) && - (ep->total_data_len < ep->ctl_data_len )) - { - - USBD_CtlContinueSendData(pdev , NULL, 0); - ep->ctl_data_len = 0; - } - else - { - if((pdev->dev.class_cb->EP0_TxSent != NULL)&& - (pdev->dev.device_status == USB_OTG_CONFIGURED)) - { - pdev->dev.class_cb->EP0_TxSent(pdev); - } - USBD_CtlReceiveStatus(pdev); - } - } - } - } - else if((pdev->dev.class_cb->DataIn != NULL)&& - (pdev->dev.device_status == USB_OTG_CONFIGURED)) - { - pdev->dev.class_cb->DataIn(pdev, epnum); - } - return USBD_OK; -} - -/** -* @brief USBD_Reset -* Handle Reset event -* @param pdev: device instance -* @retval status -*/ - -static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev) -{ - /* Open EP0 OUT */ - DCD_EP_Open(pdev, - 0x00, - USB_OTG_MAX_EP0_SIZE, - EP_TYPE_CTRL); - - /* Open EP0 IN */ - DCD_EP_Open(pdev, - 0x80, - USB_OTG_MAX_EP0_SIZE, - EP_TYPE_CTRL); - - /* Upon Reset call usr call back */ - pdev->dev.device_status = USB_OTG_DEFAULT; - pdev->dev.usr_cb->DeviceReset(pdev->cfg.speed); - - return USBD_OK; -} - -/** -* @brief USBD_Resume -* Handle Resume event -* @param pdev: device instance -* @retval status -*/ - -static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev) -{ - /* Upon Resume call usr call back */ - pdev->dev.usr_cb->DeviceResumed(); - pdev->dev.device_status = USB_OTG_CONFIGURED; - return USBD_OK; -} - - -/** -* @brief USBD_Suspend -* Handle Suspend event -* @param pdev: device instance -* @retval status -*/ - -static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev) -{ - - pdev->dev.device_status = USB_OTG_SUSPENDED; - /* Upon Resume call usr call back */ - pdev->dev.usr_cb->DeviceSuspended(); - return USBD_OK; -} - - -/** -* @brief USBD_SOF -* Handle SOF event -* @param pdev: device instance -* @retval status -*/ - -static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev) -{ - if(pdev->dev.class_cb->SOF) - { - pdev->dev.class_cb->SOF(pdev); - } - return USBD_OK; -} -/** -* @brief USBD_SetCfg -* Configure device and start the interface -* @param pdev: device instance -* @param cfgidx: configuration index -* @retval status -*/ - -USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx) -{ - pdev->dev.class_cb->Init(pdev, cfgidx); - - /* Upon set config call usr call back */ - pdev->dev.usr_cb->DeviceConfigured(); - return USBD_OK; -} - -/** -* @brief USBD_ClrCfg -* Clear current configuration -* @param pdev: device instance -* @param cfgidx: configuration index -* @retval status: USBD_Status -*/ -USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx) -{ - pdev->dev.class_cb->DeInit(pdev, cfgidx); - return USBD_OK; -} - -/** -* @brief USBD_IsoINIncomplete -* Handle iso in incomplete event -* @param pdev: device instance -* @retval status -*/ -static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev) -{ - pdev->dev.class_cb->IsoINIncomplete(pdev); - return USBD_OK; -} - -/** -* @brief USBD_IsoOUTIncomplete -* Handle iso out incomplete event -* @param pdev: device instance -* @retval status -*/ -static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev) -{ - pdev->dev.class_cb->IsoOUTIncomplete(pdev); - return USBD_OK; -} - -#ifdef VBUS_SENSING_ENABLED -/** -* @brief USBD_DevConnected -* Handle device connection event -* @param pdev: device instance -* @retval status -*/ -static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev) -{ - pdev->dev.usr_cb->DeviceConnected(); - return USBD_OK; -} - -/** -* @brief USBD_DevDisconnected -* Handle device disconnection event -* @param pdev: device instance -* @retval status -*/ -static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev) -{ - pdev->dev.usr_cb->DeviceDisconnected(); - pdev->dev.class_cb->DeInit(pdev, 0); - return USBD_OK; -} -#endif -/** -* @} -*/ - - -/** -* @} -*/ - - -/** -* @} -*/ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_device/core/src/usbd_ioreq.c b/car_hw/src/lib/usb_device/core/src/usbd_ioreq.c deleted file mode 100644 index 72cf3b1700e..00000000000 --- a/car_hw/src/lib/usb_device/core/src/usbd_ioreq.c +++ /dev/null @@ -1,237 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ioreq.c - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief This file provides the IO requests APIs for control endpoints. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_IOREQ - * @brief control I/O requests module - * @{ - */ - -/** @defgroup USBD_IOREQ_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_FunctionPrototypes - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Private_Functions - * @{ - */ - -/** -* @brief USBD_CtlSendData -* send data on the ctl pipe -* @param pdev: device instance -* @param buff: pointer to data buffer -* @param len: length of data to be sent -* @retval status -*/ -USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len) -{ - USBD_Status ret = USBD_OK; - - pdev->dev.in_ep[0].total_data_len = len; - pdev->dev.in_ep[0].rem_data_len = len; - pdev->dev.device_state = USB_OTG_EP0_DATA_IN; - - DCD_EP_Tx (pdev, 0, pbuf, len); - - return ret; -} - -/** -* @brief USBD_CtlContinueSendData -* continue sending data on the ctl pipe -* @param pdev: device instance -* @param buff: pointer to data buffer -* @param len: length of data to be sent -* @retval status -*/ -USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len) -{ - USBD_Status ret = USBD_OK; - - DCD_EP_Tx (pdev, 0, pbuf, len); - - - return ret; -} - -/** -* @brief USBD_CtlPrepareRx -* receive data on the ctl pipe -* @param pdev: USB OTG device instance -* @param buff: pointer to data buffer -* @param len: length of data to be received -* @retval status -*/ -USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len) -{ - USBD_Status ret = USBD_OK; - - pdev->dev.out_ep[0].total_data_len = len; - pdev->dev.out_ep[0].rem_data_len = len; - pdev->dev.device_state = USB_OTG_EP0_DATA_OUT; - - DCD_EP_PrepareRx (pdev, - 0, - pbuf, - len); - - - return ret; -} - -/** -* @brief USBD_CtlContinueRx -* continue receive data on the ctl pipe -* @param pdev: USB OTG device instance -* @param buff: pointer to data buffer -* @param len: length of data to be received -* @retval status -*/ -USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev, - uint8_t *pbuf, - uint16_t len) -{ - USBD_Status ret = USBD_OK; - - DCD_EP_PrepareRx (pdev, - 0, - pbuf, - len); - return ret; -} -/** -* @brief USBD_CtlSendStatus -* send zero lzngth packet on the ctl pipe -* @param pdev: USB OTG device instance -* @retval status -*/ -USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev) -{ - USBD_Status ret = USBD_OK; - pdev->dev.device_state = USB_OTG_EP0_STATUS_IN; - DCD_EP_Tx (pdev, - 0, - NULL, - 0); - - USB_OTG_EP0_OutStart(pdev); - - return ret; -} - -/** -* @brief USBD_CtlReceiveStatus -* receive zero lzngth packet on the ctl pipe -* @param pdev: USB OTG device instance -* @retval status -*/ -USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev) -{ - USBD_Status ret = USBD_OK; - pdev->dev.device_state = USB_OTG_EP0_STATUS_OUT; - DCD_EP_PrepareRx ( pdev, - 0, - NULL, - 0); - - USB_OTG_EP0_OutStart(pdev); - - return ret; -} - - -/** -* @brief USBD_GetRxCount -* returns the received data length -* @param pdev: USB OTG device instance -* epnum: endpoint index -* @retval Rx Data blength -*/ -uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) -{ - return pdev->dev.out_ep[epnum].xfer_count; -} - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_device/core/src/usbd_req.c b/car_hw/src/lib/usb_device/core/src/usbd_req.c deleted file mode 100644 index 9a9e8022de1..00000000000 --- a/car_hw/src/lib/usb_device/core/src/usbd_req.c +++ /dev/null @@ -1,868 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_req.c - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief This file provides the standard USB requests following chapter 9. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_req.h" -#include "usbd_ioreq.h" -#include "usbd_desc.h" - - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_REQ - * @brief USB standard requests module - * @{ - */ - -/** @defgroup USBD_REQ_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Variables - * @{ - */ - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -__ALIGN_BEGIN uint32_t USBD_ep_status __ALIGN_END = 0; - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -__ALIGN_BEGIN uint32_t USBD_default_cfg __ALIGN_END = 0; - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -__ALIGN_BEGIN uint32_t USBD_cfg_status __ALIGN_END = 0; - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -__ALIGN_BEGIN uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ] __ALIGN_END ; -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_FunctionPrototypes - * @{ - */ -static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req); - -static uint8_t USBD_GetLen(uint8_t *buf); -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Functions - * @{ - */ - - -/** -* @brief USBD_StdDevReq -* Handle standard usb device requests -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) -{ - USBD_Status ret = USBD_OK; - - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - - USBD_GetDescriptor (pdev, req) ; - break; - - case USB_REQ_SET_ADDRESS: - USBD_SetAddress(pdev, req); - break; - - case USB_REQ_SET_CONFIGURATION: - USBD_SetConfig (pdev , req); - break; - - case USB_REQ_GET_CONFIGURATION: - USBD_GetConfig (pdev , req); - break; - - case USB_REQ_GET_STATUS: - USBD_GetStatus (pdev , req); - break; - - - case USB_REQ_SET_FEATURE: - USBD_SetFeature (pdev , req); - break; - - case USB_REQ_CLEAR_FEATURE: - USBD_ClrFeature (pdev , req); - break; - - default: - USBD_CtlError(pdev , req); - break; - } - - return ret; -} - -/** -* @brief USBD_StdItfReq -* Handle standard usb interface requests -* @param pdev: USB OTG device instance -* @param req: usb request -* @retval status -*/ -USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) -{ - USBD_Status ret = USBD_OK; - - switch (pdev->dev.device_status) - { - case USB_OTG_CONFIGURED: - - if (LOBYTE(req->wIndex) <= USBD_ITF_MAX_NUM) - { - pdev->dev.class_cb->Setup (pdev, req); - - if((req->wLength == 0)&& (ret == USBD_OK)) - { - USBD_CtlSendStatus(pdev); - } - } - else - { - USBD_CtlError(pdev , req); - } - break; - - default: - USBD_CtlError(pdev , req); - break; - } - return ret; -} - -/** -* @brief USBD_StdEPReq -* Handle standard usb endpoint requests -* @param pdev: USB OTG device instance -* @param req: usb request -* @retval status -*/ -USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) -{ - - uint8_t ep_addr; - USBD_Status ret = USBD_OK; - - ep_addr = LOBYTE(req->wIndex); - - switch (req->bRequest) - { - - case USB_REQ_SET_FEATURE : - - switch (pdev->dev.device_status) - { - case USB_OTG_ADDRESSED: - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - DCD_EP_Stall(pdev , ep_addr); - } - break; - - case USB_OTG_CONFIGURED: - if (req->wValue == USB_FEATURE_EP_HALT) - { - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - DCD_EP_Stall(pdev , ep_addr); - - } - } - pdev->dev.class_cb->Setup (pdev, req); - USBD_CtlSendStatus(pdev); - - break; - - default: - USBD_CtlError(pdev , req); - break; - } - break; - - case USB_REQ_CLEAR_FEATURE : - - switch (pdev->dev.device_status) - { - case USB_OTG_ADDRESSED: - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - DCD_EP_Stall(pdev , ep_addr); - } - break; - - case USB_OTG_CONFIGURED: - if (req->wValue == USB_FEATURE_EP_HALT) - { - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - DCD_EP_ClrStall(pdev , ep_addr); - pdev->dev.class_cb->Setup (pdev, req); - } - USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev , req); - break; - } - break; - - case USB_REQ_GET_STATUS: - switch (pdev->dev.device_status) - { - case USB_OTG_ADDRESSED: - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - DCD_EP_Stall(pdev , ep_addr); - } - break; - - case USB_OTG_CONFIGURED: - - - if ((ep_addr & 0x80)== 0x80) - { - if(pdev->dev.in_ep[ep_addr & 0x7F].is_stall) - { - USBD_ep_status = 0x0001; - } - else - { - USBD_ep_status = 0x0000; - } - } - else if ((ep_addr & 0x80)== 0x00) - { - if(pdev->dev.out_ep[ep_addr].is_stall) - { - USBD_ep_status = 0x0001; - } - - else - { - USBD_ep_status = 0x0000; - } - } - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_ep_status, - 2); - break; - - default: - USBD_CtlError(pdev , req); - break; - } - break; - - default: - break; - } - return ret; -} -/** -* @brief USBD_GetDescriptor -* Handle Get Descriptor requests -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - uint16_t len; - uint8_t *pbuf; - - switch (req->wValue >> 8) - { - case USB_DESC_TYPE_DEVICE: - pbuf = pdev->dev.usr_device->GetDeviceDescriptor(pdev->cfg.speed, &len); - if ((req->wLength == 64) ||( pdev->dev.device_status == USB_OTG_DEFAULT)) - { - len = 8; - } - break; - - case USB_DESC_TYPE_CONFIGURATION: - pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len); -#ifdef USB_OTG_HS_CORE - if((pdev->cfg.speed == USB_OTG_SPEED_FULL )&& - (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY)) - { - pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len); - } -#endif - pbuf[1] = USB_DESC_TYPE_CONFIGURATION; - pdev->dev.pConfig_descriptor = pbuf; - break; - - case USB_DESC_TYPE_STRING: - switch ((uint8_t)(req->wValue)) - { - case USBD_IDX_LANGID_STR: - pbuf = pdev->dev.usr_device->GetLangIDStrDescriptor(pdev->cfg.speed, &len); - break; - - case USBD_IDX_MFC_STR: - pbuf = pdev->dev.usr_device->GetManufacturerStrDescriptor(pdev->cfg.speed, &len); - break; - - case USBD_IDX_PRODUCT_STR: - pbuf = pdev->dev.usr_device->GetProductStrDescriptor(pdev->cfg.speed, &len); - break; - - case USBD_IDX_SERIAL_STR: - pbuf = pdev->dev.usr_device->GetSerialStrDescriptor(pdev->cfg.speed, &len); - break; - - case USBD_IDX_CONFIG_STR: - pbuf = pdev->dev.usr_device->GetConfigurationStrDescriptor(pdev->cfg.speed, &len); - break; - - case USBD_IDX_INTERFACE_STR: - pbuf = pdev->dev.usr_device->GetInterfaceStrDescriptor(pdev->cfg.speed, &len); - break; - - default: -#ifdef USB_SUPPORT_USER_STRING_DESC - pbuf = pdev->dev.class_cb->GetUsrStrDescriptor(pdev->cfg.speed, (req->wValue) , &len); - break; -#else - USBD_CtlError(pdev , req); - return; -#endif /* USBD_CtlError(pdev , req); */ - } - break; - case USB_DESC_TYPE_DEVICE_QUALIFIER: -#ifdef USB_OTG_HS_CORE - if(pdev->cfg.speed == USB_OTG_SPEED_HIGH ) - { - - pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len); - - USBD_DeviceQualifierDesc[4]= pbuf[14]; - USBD_DeviceQualifierDesc[5]= pbuf[15]; - USBD_DeviceQualifierDesc[6]= pbuf[16]; - - pbuf = USBD_DeviceQualifierDesc; - len = USB_LEN_DEV_QUALIFIER_DESC; - break; - } - else - { - USBD_CtlError(pdev , req); - return; - } -#else - USBD_CtlError(pdev , req); - return; -#endif - - case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: -#ifdef USB_OTG_HS_CORE - - if(pdev->cfg.speed == USB_OTG_SPEED_HIGH ) - { - pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len); - pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; - break; - } - else - { - USBD_CtlError(pdev , req); - return; - } -#else - USBD_CtlError(pdev , req); - return; -#endif - - - default: - USBD_CtlError(pdev , req); - return; - } - - if((len != 0)&& (req->wLength != 0)) - { - - len = MIN(len , req->wLength); - - USBD_CtlSendData (pdev, - pbuf, - len); - } - -} - -/** -* @brief USBD_SetAddress -* Set device address -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - uint8_t dev_addr; - - if ((req->wIndex == 0) && (req->wLength == 0)) - { - dev_addr = (uint8_t)(req->wValue) & 0x7F; - - if (pdev->dev.device_status == USB_OTG_CONFIGURED) - { - USBD_CtlError(pdev , req); - } - else - { - pdev->dev.device_address = dev_addr; - DCD_EP_SetAddress(pdev, dev_addr); - USBD_CtlSendStatus(pdev); - - if (dev_addr != 0) - { - pdev->dev.device_status = USB_OTG_ADDRESSED; - } - else - { - pdev->dev.device_status = USB_OTG_DEFAULT; - } - } - } - else - { - USBD_CtlError(pdev , req); - } -} - -/** -* @brief USBD_SetConfig -* Handle Set device configuration request -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - - static uint8_t cfgidx; - - cfgidx = (uint8_t)(req->wValue); - - if (cfgidx > USBD_CFG_MAX_NUM ) - { - USBD_CtlError(pdev , req); - } - else - { - switch (pdev->dev.device_status) - { - case USB_OTG_ADDRESSED: - if (cfgidx) - { - pdev->dev.device_config = cfgidx; - pdev->dev.device_status = USB_OTG_CONFIGURED; - USBD_SetCfg(pdev , cfgidx); - USBD_CtlSendStatus(pdev); - } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - case USB_OTG_CONFIGURED: - if (cfgidx == 0) - { - pdev->dev.device_status = USB_OTG_ADDRESSED; - pdev->dev.device_config = cfgidx; - USBD_ClrCfg(pdev , cfgidx); - USBD_CtlSendStatus(pdev); - - } - else if (cfgidx != pdev->dev.device_config) - { - /* Clear old configuration */ - USBD_ClrCfg(pdev , pdev->dev.device_config); - - /* set new configuration */ - pdev->dev.device_config = cfgidx; - USBD_SetCfg(pdev , cfgidx); - USBD_CtlSendStatus(pdev); - } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev , req); - break; - } - } -} - -/** -* @brief USBD_GetConfig -* Handle Get device configuration request -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - - if (req->wLength != 1) - { - USBD_CtlError(pdev , req); - } - else - { - switch (pdev->dev.device_status ) - { - case USB_OTG_ADDRESSED: - - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_default_cfg, - 1); - break; - - case USB_OTG_CONFIGURED: - - USBD_CtlSendData (pdev, - &pdev->dev.device_config, - 1); - break; - - default: - USBD_CtlError(pdev , req); - break; - } - } -} - -/** -* @brief USBD_GetStatus -* Handle Get Status request -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - - switch (pdev->dev.device_status) - { - case USB_OTG_ADDRESSED: - case USB_OTG_CONFIGURED: - - if (pdev->dev.DevRemoteWakeup) - { - USBD_cfg_status = USB_CONFIG_SELF_POWERED | USB_CONFIG_REMOTE_WAKEUP; - } - else - { - USBD_cfg_status = USB_CONFIG_SELF_POWERED; - } - - USBD_CtlSendData (pdev, - (uint8_t *)&USBD_cfg_status, - 1); - break; - - default : - USBD_CtlError(pdev , req); - break; - } -} - - -/** -* @brief USBD_SetFeature -* Handle Set device feature request -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - - USB_OTG_DCTL_TypeDef dctl; - uint8_t test_mode = 0; - - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev.DevRemoteWakeup = 1; - pdev->dev.class_cb->Setup (pdev, req); - USBD_CtlSendStatus(pdev); - } - - else if ((req->wValue == USB_FEATURE_TEST_MODE) && - ((req->wIndex & 0xFF) == 0)) - { - dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); - - test_mode = req->wIndex >> 8; - switch (test_mode) - { - case 1: // TEST_J - dctl.b.tstctl = 1; - break; - - case 2: // TEST_K - dctl.b.tstctl = 2; - break; - - case 3: // TEST_SE0_NAK - dctl.b.tstctl = 3; - break; - - case 4: // TEST_PACKET - dctl.b.tstctl = 4; - break; - - case 5: // TEST_FORCE_ENABLE - dctl.b.tstctl = 5; - break; - } - USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); - USBD_CtlSendStatus(pdev); - } - -} - - -/** -* @brief USBD_ClrFeature -* Handle clear device feature request -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - switch (pdev->dev.device_status) - { - case USB_OTG_ADDRESSED: - case USB_OTG_CONFIGURED: - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev.DevRemoteWakeup = 0; - pdev->dev.class_cb->Setup (pdev, req); - USBD_CtlSendStatus(pdev); - } - break; - - default : - USBD_CtlError(pdev , req); - break; - } -} - -/** -* @brief USBD_ParseSetupRequest -* Copy buffer into setup structure -* @param pdev: device instance -* @param req: usb request -* @retval None -*/ - -void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet); - req->bRequest = *(uint8_t *) (pdev->dev.setup_packet + 1); - req->wValue = SWAPBYTE (pdev->dev.setup_packet + 2); - req->wIndex = SWAPBYTE (pdev->dev.setup_packet + 4); - req->wLength = SWAPBYTE (pdev->dev.setup_packet + 6); - - pdev->dev.in_ep[0].ctl_data_len = req->wLength ; - pdev->dev.device_state = USB_OTG_EP0_SETUP; -} - -/** -* @brief USBD_CtlError -* Handle USB low level Error -* @param pdev: device instance -* @param req: usb request -* @retval None -*/ - -void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, - USB_SETUP_REQ *req) -{ - if((req->bmRequest & 0x80) == 0x80) - { - DCD_EP_Stall(pdev , 0x80); - } - else - { - if(req->wLength == 0) - { - DCD_EP_Stall(pdev , 0x80); - } - else - { - DCD_EP_Stall(pdev , 0); - } - } - USB_OTG_EP0_OutStart(pdev); -} - - -/** - * @brief USBD_GetString - * Convert Ascii string into unicode one - * @param desc : descriptor buffer - * @param unicode : Formatted string buffer (unicode) - * @param len : descriptor length - * @retval None - */ -void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) -{ - uint8_t idx = 0; - - if (desc != NULL) - { - *len = USBD_GetLen(desc) * 2 + 2; - unicode[idx++] = *len; - unicode[idx++] = USB_DESC_TYPE_STRING; - - while (*desc != NULL) - { - unicode[idx++] = *desc++; - unicode[idx++] = 0x00; - } - } -} - -/** - * @brief USBD_GetLen - * return the string length - * @param buf : pointer to the ascii string buffer - * @retval string length - */ -static uint8_t USBD_GetLen(uint8_t *buf) -{ - uint8_t len = 0; - - while (*buf != NULL) - { - len++; - buf++; - } - - return len; -} -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_otg/Makefile b/car_hw/src/lib/usb_otg/Makefile deleted file mode 100644 index 94e1f50623b..00000000000 --- a/car_hw/src/lib/usb_otg/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -LIB_USB_OTG_OBJ_PREFIX=libusbotg_ - -INCLUDES+=-I$(LIB_USB_OTG_DIR)/inc - -$(LIB_USB_OTG_OBJ): \ - $(call dircs_to_prefxd_objs,$(LIB_USB_OTG_DIR)/src,$(LIB_USB_OTG_OBJ_PREFIX)) - $(LD_ALL_DEPS) - -$(BIN_DIR)/$(LIB_USB_OTG_OBJ_PREFIX)%.o: $(LIB_USB_OTG_DIR)/src/%.c \ - $(call dirhs,$(LIB_USB_OTG_DIR)/inc) - $(CC_ALL_DEPS) diff --git a/car_hw/src/lib/usb_otg/inc/usb_bsp.h b/car_hw/src/lib/usb_otg/inc/usb_bsp.h deleted file mode 100644 index cdec1e5be07..00000000000 --- a/car_hw/src/lib/usb_otg/inc/usb_bsp.h +++ /dev/null @@ -1,97 +0,0 @@ -/** - ****************************************************************************** - * @file usb_bsp.h - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief Specific api's relative to the used hardware platform - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_BSP__H__ -#define __USB_BSP__H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_core.h" -#include "stm32f4xx.h" - -/** @addtogroup USB_OTG_DRIVER - * @{ - */ - -/** @defgroup USB_BSP - * @brief This file is the - * @{ - */ - - -/** @defgroup USB_BSP_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_BSP_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_BSP_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_BSP_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_BSP_Exported_FunctionsPrototype - * @{ - */ -void BSP_Init(void); - -void USB_OTG_BSP_Init (USB_OTG_CORE_HANDLE *pdev); -void USB_OTG_BSP_uDelay (const uint32_t usec); -void USB_OTG_BSP_mDelay (const uint32_t msec); -void USB_OTG_BSP_EnableInterrupt (USB_OTG_CORE_HANDLE *pdev); -#ifdef USE_HOST_MODE -void USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE *pdev); -void USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE *pdev,uint8_t state); -#endif -/** - * @} - */ - -#endif //__USB_BSP__H__ - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_otg/inc/usb_core.h b/car_hw/src/lib/usb_otg/inc/usb_core.h deleted file mode 100644 index 7e9cb8c9094..00000000000 --- a/car_hw/src/lib/usb_otg/inc/usb_core.h +++ /dev/null @@ -1,408 +0,0 @@ -/** - ****************************************************************************** - * @file usb_core.h - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief Header of the Core Layer - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CORE_H__ -#define __USB_CORE_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" -#include "usb_regs.h" -#include "usb_defines.h" - - -/** @addtogroup USB_OTG_DRIVER - * @{ - */ - -/** @defgroup USB_CORE - * @brief usb otg driver core layer - * @{ - */ - - -/** @defgroup USB_CORE_Exported_Defines - * @{ - */ - -#define USB_OTG_EP0_IDLE 0 -#define USB_OTG_EP0_SETUP 1 -#define USB_OTG_EP0_DATA_IN 2 -#define USB_OTG_EP0_DATA_OUT 3 -#define USB_OTG_EP0_STATUS_IN 4 -#define USB_OTG_EP0_STATUS_OUT 5 -#define USB_OTG_EP0_STALL 6 - -#define USB_OTG_EP_TX_DIS 0x0000 -#define USB_OTG_EP_TX_STALL 0x0010 -#define USB_OTG_EP_TX_NAK 0x0020 -#define USB_OTG_EP_TX_VALID 0x0030 - -#define USB_OTG_EP_RX_DIS 0x0000 -#define USB_OTG_EP_RX_STALL 0x1000 -#define USB_OTG_EP_RX_NAK 0x2000 -#define USB_OTG_EP_RX_VALID 0x3000 -/** - * @} - */ -#define MAX_DATA_LENGTH 0xFF - -/** @defgroup USB_CORE_Exported_Types - * @{ - */ - - -typedef enum { - USB_OTG_OK = 0, - USB_OTG_FAIL -}USB_OTG_STS; - -typedef enum { - HC_IDLE = 0, - HC_XFRC, - HC_HALTED, - HC_NAK, - HC_NYET, - HC_STALL, - HC_XACTERR, - HC_BBLERR, - HC_DATATGLERR, -}HC_STATUS; - -typedef enum { - URB_IDLE = 0, - URB_DONE, - URB_NOTREADY, - URB_ERROR, - URB_STALL -}URB_STATE; - -typedef enum { - CTRL_START = 0, - CTRL_XFRC, - CTRL_HALTED, - CTRL_NAK, - CTRL_STALL, - CTRL_XACTERR, - CTRL_BBLERR, - CTRL_DATATGLERR, - CTRL_FAIL -}CTRL_STATUS; - - -typedef struct USB_OTG_hc -{ - uint8_t dev_addr ; - uint8_t ep_num; - uint8_t ep_is_in; - uint8_t speed; - uint8_t do_ping; - uint8_t ep_type; - uint16_t max_packet; - uint8_t data_pid; - uint8_t *xfer_buff; - uint32_t xfer_len; - uint32_t xfer_count; - uint8_t toggle_in; - uint8_t toggle_out; - uint32_t dma_addr; -} -USB_OTG_HC , *PUSB_OTG_HC; - -typedef struct USB_OTG_ep -{ - uint8_t num; - uint8_t is_in; - uint8_t is_stall; - uint8_t type; - uint8_t data_pid_start; - uint8_t even_odd_frame; - uint16_t tx_fifo_num; - uint32_t maxpacket; - /* transaction level variables*/ - uint8_t *xfer_buff; - uint32_t dma_addr; - uint32_t xfer_len; - uint32_t xfer_count; - /* Transfer level variables*/ - uint32_t rem_data_len; - uint32_t total_data_len; - uint32_t ctl_data_len; - -} - -USB_OTG_EP , *PUSB_OTG_EP; - - - -typedef struct USB_OTG_core_cfg -{ - uint8_t host_channels; - uint8_t dev_endpoints; - uint8_t speed; - uint8_t dma_enable; - uint16_t mps; - uint16_t TotalFifoSize; - uint8_t phy_itface; - uint8_t Sof_output; - uint8_t low_power; - uint8_t coreID; - -} -USB_OTG_CORE_CFGS, *PUSB_OTG_CORE_CFGS; - - - -typedef struct usb_setup_req { - - uint8_t bmRequest; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; -} USB_SETUP_REQ; - -typedef struct _Device_TypeDef -{ - uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length); - uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length); - uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length); - uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length); - uint8_t *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length); - uint8_t *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length); - uint8_t *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length); -} USBD_DEVICE, *pUSBD_DEVICE; - -typedef struct USB_OTG_hPort -{ - void (*Disconnect) (void *phost); - void (*Connect) (void *phost); - uint8_t ConnStatus; - uint8_t DisconnStatus; - uint8_t ConnHandled; - uint8_t DisconnHandled; -} USB_OTG_hPort_TypeDef; - -typedef struct _Device_cb -{ - uint8_t (*Init) (void *pdev , uint8_t cfgidx); - uint8_t (*DeInit) (void *pdev , uint8_t cfgidx); - /* Control Endpoints*/ - uint8_t (*Setup) (void *pdev , USB_SETUP_REQ *req); - uint8_t (*EP0_TxSent) (void *pdev ); - uint8_t (*EP0_RxReady) (void *pdev ); - /* Class Specific Endpoints*/ - uint8_t (*DataIn) (void *pdev , uint8_t epnum); - uint8_t (*DataOut) (void *pdev , uint8_t epnum); - uint8_t (*SOF) (void *pdev); - uint8_t (*IsoINIncomplete) (void *pdev); - uint8_t (*IsoOUTIncomplete) (void *pdev); - - uint8_t *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length); -#ifdef USB_OTG_HS_CORE - uint8_t *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length); -#endif - -#ifdef USB_SUPPORT_USER_STRING_DESC - uint8_t *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index, uint16_t *length); -#endif - -} USBD_Class_cb_TypeDef; - - - -typedef struct _USBD_USR_PROP -{ - void (*Init)(void); - void (*DeviceReset)(uint8_t speed); - void (*DeviceConfigured)(void); - void (*DeviceSuspended)(void); - void (*DeviceResumed)(void); - - void (*DeviceConnected)(void); - void (*DeviceDisconnected)(void); - -} -USBD_Usr_cb_TypeDef; - -typedef struct _DCD -{ - uint8_t device_config; - uint8_t device_state; - uint8_t device_status; - uint8_t device_address; - uint32_t DevRemoteWakeup; - USB_OTG_EP in_ep [USB_OTG_MAX_TX_FIFOS]; - USB_OTG_EP out_ep [USB_OTG_MAX_TX_FIFOS]; - uint8_t setup_packet [8*3]; - USBD_Class_cb_TypeDef *class_cb; - USBD_Usr_cb_TypeDef *usr_cb; - USBD_DEVICE *usr_device; - uint8_t *pConfig_descriptor; - } -DCD_DEV , *DCD_PDEV; - - -typedef struct _HCD -{ - uint8_t Rx_Buffer [MAX_DATA_LENGTH]; - __IO uint32_t ConnSts; - __IO uint32_t ErrCnt[USB_OTG_MAX_TX_FIFOS]; - __IO uint32_t XferCnt[USB_OTG_MAX_TX_FIFOS]; - __IO HC_STATUS HC_Status[USB_OTG_MAX_TX_FIFOS]; - __IO URB_STATE URB_State[USB_OTG_MAX_TX_FIFOS]; - USB_OTG_HC hc [USB_OTG_MAX_TX_FIFOS]; - uint16_t channel [USB_OTG_MAX_TX_FIFOS]; - USB_OTG_hPort_TypeDef *port_cb; -} -HCD_DEV , *USB_OTG_USBH_PDEV; - - -typedef struct _OTG -{ - uint8_t OTG_State; - uint8_t OTG_PrevState; - uint8_t OTG_Mode; -} -OTG_DEV , *USB_OTG_USBO_PDEV; - -typedef struct USB_OTG_handle -{ - USB_OTG_CORE_CFGS cfg; - USB_OTG_CORE_REGS regs; -#ifdef USE_DEVICE_MODE - DCD_DEV dev; -#endif -#ifdef USE_HOST_MODE - HCD_DEV host; -#endif -#ifdef USE_OTG_MODE - OTG_DEV otg; -#endif -} -USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE; - -/** - * @} - */ - - -/** @defgroup USB_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_FunctionsPrototype - * @{ - */ - - -USB_OTG_STS USB_OTG_CoreInit (USB_OTG_CORE_HANDLE *pdev); -USB_OTG_STS USB_OTG_SelectCore (USB_OTG_CORE_HANDLE *pdev, - USB_OTG_CORE_ID_TypeDef coreID); -USB_OTG_STS USB_OTG_EnableGlobalInt (USB_OTG_CORE_HANDLE *pdev); -USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev); -void* USB_OTG_ReadPacket (USB_OTG_CORE_HANDLE *pdev , - uint8_t *dest, - uint16_t len); -USB_OTG_STS USB_OTG_WritePacket (USB_OTG_CORE_HANDLE *pdev , - uint8_t *src, - uint8_t ch_ep_num, - uint16_t len); -USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num); -USB_OTG_STS USB_OTG_FlushRxFifo (USB_OTG_CORE_HANDLE *pdev); - -uint32_t USB_OTG_ReadCoreItr (USB_OTG_CORE_HANDLE *pdev); -uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev); -uint8_t USB_OTG_IsHostMode (USB_OTG_CORE_HANDLE *pdev); -uint8_t USB_OTG_IsDeviceMode (USB_OTG_CORE_HANDLE *pdev); -uint32_t USB_OTG_GetMode (USB_OTG_CORE_HANDLE *pdev); -USB_OTG_STS USB_OTG_PhyInit (USB_OTG_CORE_HANDLE *pdev); -USB_OTG_STS USB_OTG_SetCurrentMode (USB_OTG_CORE_HANDLE *pdev, - uint8_t mode); - -/*********************** HOST APIs ********************************************/ -#ifdef USE_HOST_MODE -USB_OTG_STS USB_OTG_CoreInitHost (USB_OTG_CORE_HANDLE *pdev); -USB_OTG_STS USB_OTG_EnableHostInt (USB_OTG_CORE_HANDLE *pdev); -USB_OTG_STS USB_OTG_HC_Init (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); -USB_OTG_STS USB_OTG_HC_Halt (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); -USB_OTG_STS USB_OTG_HC_StartXfer (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); -USB_OTG_STS USB_OTG_HC_DoPing (USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num); -uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev); -uint32_t USB_OTG_ResetPort (USB_OTG_CORE_HANDLE *pdev); -uint32_t USB_OTG_ReadHPRT0 (USB_OTG_CORE_HANDLE *pdev); -void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state); -void USB_OTG_InitFSLSPClkSel (USB_OTG_CORE_HANDLE *pdev ,uint8_t freq); -uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) ; -void USB_OTG_StopHost (USB_OTG_CORE_HANDLE *pdev); -#endif -/********************* DEVICE APIs ********************************************/ -#ifdef USE_DEVICE_MODE -USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev); -USB_OTG_STS USB_OTG_EnableDevInt (USB_OTG_CORE_HANDLE *pdev); -uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev); -enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev); -USB_OTG_STS USB_OTG_EP0Activate (USB_OTG_CORE_HANDLE *pdev); -USB_OTG_STS USB_OTG_EPActivate (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); -USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); -USB_OTG_STS USB_OTG_EPStartXfer (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); -USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); -USB_OTG_STS USB_OTG_EPSetStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); -USB_OTG_STS USB_OTG_EPClearStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); -uint32_t USB_OTG_ReadDevAllOutEp_itr (USB_OTG_CORE_HANDLE *pdev); -uint32_t USB_OTG_ReadDevOutEP_itr (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); -uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev); -void USB_OTG_InitDevSpeed (USB_OTG_CORE_HANDLE *pdev , uint8_t speed); -uint8_t USBH_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev); -void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev); -void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev); -void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev); -void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev); -void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status); -uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep); -#endif -/** - * @} - */ - -#endif /* __USB_CORE_H__ */ - - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_otg/inc/usb_dcd.h b/car_hw/src/lib/usb_otg/inc/usb_dcd.h deleted file mode 100644 index d8ae590b7e5..00000000000 --- a/car_hw/src/lib/usb_otg/inc/usb_dcd.h +++ /dev/null @@ -1,158 +0,0 @@ -/** - ****************************************************************************** - * @file usb_dcd.h - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief Peripheral Driver Header file - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __DCD_H__ -#define __DCD_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_core.h" - - -/** @addtogroup USB_OTG_DRIVER -* @{ -*/ - -/** @defgroup USB_DCD -* @brief This file is the -* @{ -*/ - - -/** @defgroup USB_DCD_Exported_Defines -* @{ -*/ -#define USB_OTG_EP_CONTROL 0 -#define USB_OTG_EP_ISOC 1 -#define USB_OTG_EP_BULK 2 -#define USB_OTG_EP_INT 3 -#define USB_OTG_EP_MASK 3 - -/* Device Status */ -#define USB_OTG_DEFAULT 1 -#define USB_OTG_ADDRESSED 2 -#define USB_OTG_CONFIGURED 3 -#define USB_OTG_SUSPENDED 4 - -/** -* @} -*/ - - -/** @defgroup USB_DCD_Exported_Types -* @{ -*/ -/******************************************************************************** -Data structure type -********************************************************************************/ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; - uint8_t bmAttributes; - uint16_t wMaxPacketSize; - uint8_t bInterval; -} -EP_DESCRIPTOR , *PEP_DESCRIPTOR; - -/** -* @} -*/ - - -/** @defgroup USB_DCD_Exported_Macros -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USB_DCD_Exported_Variables -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USB_DCD_Exported_FunctionsPrototype -* @{ -*/ -/******************************************************************************** -EXPORTED FUNCTION FROM THE USB-OTG LAYER -********************************************************************************/ -void DCD_Init(USB_OTG_CORE_HANDLE *pdev , - USB_OTG_CORE_ID_TypeDef coreID); - -void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev); -void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev); -void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, - uint8_t address); -uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , - uint8_t ep_addr, - uint16_t ep_mps, - uint8_t ep_type); - -uint32_t DCD_EP_Close (USB_OTG_CORE_HANDLE *pdev, - uint8_t ep_addr); - - -uint32_t DCD_EP_PrepareRx ( USB_OTG_CORE_HANDLE *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t buf_len); - -uint32_t DCD_EP_Tx (USB_OTG_CORE_HANDLE *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint32_t buf_len); -uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, - uint8_t epnum); -uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, - uint8_t epnum); -uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev, - uint8_t epnum); -uint32_t DCD_Handle_ISR(USB_OTG_CORE_HANDLE *pdev); - -uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev , - uint8_t epnum); - -void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , - uint8_t epnum , - uint32_t Status); - -/** -* @} -*/ - - -#endif //__DCD_H__ - - -/** -* @} -*/ - -/** -* @} -*/ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_otg/inc/usb_dcd_int.h b/car_hw/src/lib/usb_otg/inc/usb_dcd_int.h deleted file mode 100644 index cb4498281a0..00000000000 --- a/car_hw/src/lib/usb_otg/inc/usb_dcd_int.h +++ /dev/null @@ -1,121 +0,0 @@ -/** - ****************************************************************************** - * @file usb_dcd_int.h - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief Peripheral Device Interface Layer - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef USB_DCD_INT_H__ -#define USB_DCD_INT_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_dcd.h" - - - -/** @addtogroup USB_OTG_DRIVER - * @{ - */ - -/** @defgroup USB_DCD_INT - * @brief This file is the - * @{ - */ - - -/** @defgroup USB_DCD_INT_Exported_Defines - * @{ - */ - -typedef struct _USBD_DCD_INT -{ - uint8_t (* DataOutStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); - uint8_t (* DataInStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); - uint8_t (* SetupStage) (USB_OTG_CORE_HANDLE *pdev); - uint8_t (* SOF) (USB_OTG_CORE_HANDLE *pdev); - uint8_t (* Reset) (USB_OTG_CORE_HANDLE *pdev); - uint8_t (* Suspend) (USB_OTG_CORE_HANDLE *pdev); - uint8_t (* Resume) (USB_OTG_CORE_HANDLE *pdev); - uint8_t (* IsoINIncomplete) (USB_OTG_CORE_HANDLE *pdev); - uint8_t (* IsoOUTIncomplete) (USB_OTG_CORE_HANDLE *pdev); - - uint8_t (* DevConnected) (USB_OTG_CORE_HANDLE *pdev); - uint8_t (* DevDisconnected) (USB_OTG_CORE_HANDLE *pdev); - -}USBD_DCD_INT_cb_TypeDef; - -extern USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops; -/** - * @} - */ - - -/** @defgroup USB_DCD_INT_Exported_Types - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_DCD_INT_Exported_Macros - * @{ - */ - -#define CLEAR_IN_EP_INTR(epnum,intr) \ - diepint.d32=0; \ - diepint.b.intr = 1; \ - USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT,diepint.d32); - -#define CLEAR_OUT_EP_INTR(epnum,intr) \ - doepint.d32=0; \ - doepint.b.intr = 1; \ - USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT,doepint.d32); - -/** - * @} - */ - -/** @defgroup USB_DCD_INT_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_DCD_INT_Exported_FunctionsPrototype - * @{ - */ - -uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev); - -/** - * @} - */ - - -#endif // USB_DCD_INT_H__ - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_otg/inc/usb_defines.h b/car_hw/src/lib/usb_otg/inc/usb_defines.h deleted file mode 100644 index 2ec3427fd1c..00000000000 --- a/car_hw/src/lib/usb_otg/inc/usb_defines.h +++ /dev/null @@ -1,244 +0,0 @@ -/** - ****************************************************************************** - * @file usb_defines.h - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief Header of the Core Layer - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_DEF_H__ -#define __USB_DEF_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" - -/** @addtogroup USB_OTG_DRIVER - * @{ - */ - -/** @defgroup USB_DEFINES - * @brief This file is the - * @{ - */ - - -/** @defgroup USB_DEFINES_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup _CORE_DEFINES_ - * @{ - */ - -#define USB_OTG_SPEED_PARAM_HIGH 0 -#define USB_OTG_SPEED_PARAM_HIGH_IN_FULL 1 -#define USB_OTG_SPEED_PARAM_FULL 3 - -#define USB_OTG_SPEED_HIGH 0 -#define USB_OTG_SPEED_FULL 1 - -#define USB_OTG_ULPI_PHY 1 -#define USB_OTG_EMBEDDED_PHY 2 -#define USB_OTG_I2C_PHY 3 - -/** - * @} - */ - - -/** @defgroup _GLOBAL_DEFINES_ - * @{ - */ -#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 -#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 -#define GAHBCFG_GLBINT_ENABLE 1 -#define GAHBCFG_INT_DMA_BURST_SINGLE 0 -#define GAHBCFG_INT_DMA_BURST_INCR 1 -#define GAHBCFG_INT_DMA_BURST_INCR4 3 -#define GAHBCFG_INT_DMA_BURST_INCR8 5 -#define GAHBCFG_INT_DMA_BURST_INCR16 7 -#define GAHBCFG_DMAENABLE 1 -#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 -#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 -#define GRXSTS_PKTSTS_IN 2 -#define GRXSTS_PKTSTS_IN_XFER_COMP 3 -#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5 -#define GRXSTS_PKTSTS_CH_HALTED 7 -/** - * @} - */ - - -/** @defgroup _OnTheGo_DEFINES_ - * @{ - */ -#define MODE_HNP_SRP_CAPABLE 0 -#define MODE_SRP_ONLY_CAPABLE 1 -#define MODE_NO_HNP_SRP_CAPABLE 2 -#define MODE_SRP_CAPABLE_DEVICE 3 -#define MODE_NO_SRP_CAPABLE_DEVICE 4 -#define MODE_SRP_CAPABLE_HOST 5 -#define MODE_NO_SRP_CAPABLE_HOST 6 -#define A_HOST 1 -#define A_SUSPEND 2 -#define A_PERIPHERAL 3 -#define B_PERIPHERAL 4 -#define B_HOST 5 -#define DEVICE_MODE 0 -#define HOST_MODE 1 -#define OTG_MODE 2 -/** - * @} - */ - - -/** @defgroup __DEVICE_DEFINES_ - * @{ - */ -#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ 0 -#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ 1 -#define DSTS_ENUMSPD_LS_PHY_6MHZ 2 -#define DSTS_ENUMSPD_FS_PHY_48MHZ 3 - -#define DCFG_FRAME_INTERVAL_80 0 -#define DCFG_FRAME_INTERVAL_85 1 -#define DCFG_FRAME_INTERVAL_90 2 -#define DCFG_FRAME_INTERVAL_95 3 - -#define DEP0CTL_MPS_64 0 -#define DEP0CTL_MPS_32 1 -#define DEP0CTL_MPS_16 2 -#define DEP0CTL_MPS_8 3 - -#define EP_SPEED_LOW 0 -#define EP_SPEED_FULL 1 -#define EP_SPEED_HIGH 2 - -#define EP_TYPE_CTRL 0 -#define EP_TYPE_ISOC 1 -#define EP_TYPE_BULK 2 -#define EP_TYPE_INTR 3 -#define EP_TYPE_MSK 3 - -#define STS_GOUT_NAK 1 -#define STS_DATA_UPDT 2 -#define STS_XFER_COMP 3 -#define STS_SETUP_COMP 4 -#define STS_SETUP_UPDT 6 -/** - * @} - */ - - -/** @defgroup __HOST_DEFINES_ - * @{ - */ -#define HC_PID_DATA0 0 -#define HC_PID_DATA2 1 -#define HC_PID_DATA1 2 -#define HC_PID_SETUP 3 - -#define HPRT0_PRTSPD_HIGH_SPEED 0 -#define HPRT0_PRTSPD_FULL_SPEED 1 -#define HPRT0_PRTSPD_LOW_SPEED 2 - -#define HCFG_30_60_MHZ 0 -#define HCFG_48_MHZ 1 -#define HCFG_6_MHZ 2 - -#define HCCHAR_CTRL 0 -#define HCCHAR_ISOC 1 -#define HCCHAR_BULK 2 -#define HCCHAR_INTR 3 - -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) - -/** - * @} - */ - - -/** @defgroup USB_DEFINES_Exported_Types - * @{ - */ - -typedef enum -{ - USB_OTG_HS_CORE_ID = 0, - USB_OTG_FS_CORE_ID = 1 -}USB_OTG_CORE_ID_TypeDef; -/** - * @} - */ - - -/** @defgroup USB_DEFINES_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_DEFINES_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_DEFINES_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ - - -/** @defgroup Internal_Macro's - * @{ - */ -#define USB_OTG_READ_REG32(reg) (*(__IO uint32_t *)reg) -#define USB_OTG_WRITE_REG32(reg,value) (*(__IO uint32_t *)reg = value) -#define USB_OTG_MODIFY_REG32(reg,clear_mask,set_mask) \ - USB_OTG_WRITE_REG32(reg, (((USB_OTG_READ_REG32(reg)) & ~clear_mask) | set_mask ) ) - -/******************************************************************************** - ENUMERATION TYPE -********************************************************************************/ -enum USB_OTG_SPEED { - USB_SPEED_UNKNOWN = 0, - USB_SPEED_LOW, - USB_SPEED_FULL, - USB_SPEED_HIGH -}; - -#endif //__USB_DEFINES__H__ - - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_otg/inc/usb_hcd.h b/car_hw/src/lib/usb_otg/inc/usb_hcd.h deleted file mode 100644 index db976779789..00000000000 --- a/car_hw/src/lib/usb_otg/inc/usb_hcd.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - ****************************************************************************** - * @file usb_hcd.h - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief Host layer Header file - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_HCD_H__ -#define __USB_HCD_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_regs.h" -#include "usb_core.h" - - -/** @addtogroup USB_OTG_DRIVER - * @{ - */ - -/** @defgroup USB_HCD - * @brief This file is the - * @{ - */ - - -/** @defgroup USB_HCD_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_HCD_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_HCD_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_HCD_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_HCD_Exported_FunctionsPrototype - * @{ - */ -uint32_t HCD_Init (USB_OTG_CORE_HANDLE *pdev , - USB_OTG_CORE_ID_TypeDef coreID); -uint32_t HCD_HC_Init (USB_OTG_CORE_HANDLE *pdev , - uint8_t hc_num); -uint32_t HCD_SubmitRequest (USB_OTG_CORE_HANDLE *pdev , - uint8_t hc_num) ; -uint32_t HCD_GetCurrentSpeed (USB_OTG_CORE_HANDLE *pdev); -uint32_t HCD_ResetPort (USB_OTG_CORE_HANDLE *pdev); -uint32_t HCD_IsDeviceConnected (USB_OTG_CORE_HANDLE *pdev); -uint32_t HCD_GetCurrentFrame (USB_OTG_CORE_HANDLE *pdev) ; -URB_STATE HCD_GetURB_State (USB_OTG_CORE_HANDLE *pdev, uint8_t ch_num); -uint32_t HCD_GetXferCnt (USB_OTG_CORE_HANDLE *pdev, uint8_t ch_num); -HC_STATUS HCD_GetHCState (USB_OTG_CORE_HANDLE *pdev, uint8_t ch_num) ; -/** - * @} - */ - -#endif //__USB_HCD_H__ - - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_otg/inc/usb_hcd_int.h b/car_hw/src/lib/usb_otg/inc/usb_hcd_int.h deleted file mode 100644 index a405e366694..00000000000 --- a/car_hw/src/lib/usb_otg/inc/usb_hcd_int.h +++ /dev/null @@ -1,126 +0,0 @@ -/** - ****************************************************************************** - * @file usb_hcd_int.h - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief Peripheral Device Interface Layer - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __HCD_INT_H__ -#define __HCD_INT_H__ - - -/* Includes ------------------------------------------------------------------*/ -#include "usb_hcd.h" - - -/** @addtogroup USB_OTG_DRIVER - * @{ - */ - -/** @defgroup USB_HCD_INT - * @brief This file is the - * @{ - */ - - -/** @defgroup USB_HCD_INT_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_HCD_INT_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_HCD_INT_Exported_Macros - * @{ - */ - -#define CLEAR_HC_INT(HC_REGS, intr) \ - {\ - USB_OTG_HCINTn_TypeDef hcint_clear; \ - hcint_clear.d32 = 0; \ - hcint_clear.b.intr = 1; \ - USB_OTG_WRITE_REG32(&((HC_REGS)->HCINT), hcint_clear.d32);\ - }\ - -#define MASK_HOST_INT_CHH(hc_num) { USB_OTG_HCGINTMSK_TypeDef GINTMSK; \ - GINTMSK.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK); \ - GINTMSK.b.chhltd = 0; \ - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, GINTMSK.d32);} - -#define UNMASK_HOST_INT_CHH(hc_num) { USB_OTG_HCGINTMSK_TypeDef GINTMSK; \ - GINTMSK.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK); \ - GINTMSK.b.chhltd = 1; \ - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, GINTMSK.d32);} - -#define MASK_HOST_INT_ACK(hc_num) { USB_OTG_HCGINTMSK_TypeDef GINTMSK; \ - GINTMSK.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK); \ - GINTMSK.b.ack = 0; \ - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, GINTMSK.d32);} - -#define UNMASK_HOST_INT_ACK(hc_num) { USB_OTG_HCGINTMSK_TypeDef GINTMSK; \ - GINTMSK.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK); \ - GINTMSK.b.ack = 1; \ - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, GINTMSK.d32);} - -/** - * @} - */ - -/** @defgroup USB_HCD_INT_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_HCD_INT_Exported_FunctionsPrototype - * @{ - */ -/* Callbacks handler */ -void ConnectCallback_Handler(USB_OTG_CORE_HANDLE *pdev); -void Disconnect_Callback_Handler(USB_OTG_CORE_HANDLE *pdev); -void Overcurrent_Callback_Handler(USB_OTG_CORE_HANDLE *pdev); -uint32_t USBH_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev); - -/** - * @} - */ - - - -#endif //__HCD_INT_H__ - - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_otg/inc/usb_otg.h b/car_hw/src/lib/usb_otg/inc/usb_otg.h deleted file mode 100644 index ffbd34ef89f..00000000000 --- a/car_hw/src/lib/usb_otg/inc/usb_otg.h +++ /dev/null @@ -1,94 +0,0 @@ -/** - ****************************************************************************** - * @file usb_otg.h - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief OTG Core Header - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_OTG__ -#define __USB_OTG__ - - -/** @addtogroup USB_OTG_DRIVER - * @{ - */ - -/** @defgroup USB_OTG - * @brief This file is the - * @{ - */ - - -/** @defgroup USB_OTG_Exported_Defines - * @{ - */ - - -void USB_OTG_InitiateSRP(void); -void USB_OTG_InitiateHNP(uint8_t state , uint8_t mode); -void USB_OTG_Switchback (USB_OTG_CORE_HANDLE *pdev); -uint32_t USB_OTG_GetCurrentState (USB_OTG_CORE_HANDLE *pdev); - -uint32_t STM32_USBO_OTG_ISR_Handler(USB_OTG_CORE_HANDLE *pdev); -/** - * @} - */ - - -/** @defgroup USB_OTG_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_OTG_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_OTG_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_OTG_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ - - -#endif //__USB_OTG__ - - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_otg/inc/usb_regs.h b/car_hw/src/lib/usb_otg/inc/usb_regs.h deleted file mode 100644 index d12e05d74bd..00000000000 --- a/car_hw/src/lib/usb_otg/inc/usb_regs.h +++ /dev/null @@ -1,1206 +0,0 @@ -/** - ****************************************************************************** - * @file usb_regs.h - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief hardware registers - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_OTG_REGS_H__ -#define __USB_OTG_REGS_H__ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_conf.h" - - -/** @addtogroup USB_OTG_DRIVER - * @{ - */ - -/** @defgroup USB_REGS - * @brief This file is the - * @{ - */ - - -/** @defgroup USB_REGS_Exported_Defines - * @{ - */ - -#define USB_OTG_HS_BASE_ADDR 0x40040000 -#define USB_OTG_FS_BASE_ADDR 0x50000000 - -#define USB_OTG_CORE_GLOBAL_REGS_OFFSET 0x000 -#define USB_OTG_DEV_GLOBAL_REG_OFFSET 0x800 -#define USB_OTG_DEV_IN_EP_REG_OFFSET 0x900 -#define USB_OTG_EP_REG_OFFSET 0x20 -#define USB_OTG_DEV_OUT_EP_REG_OFFSET 0xB00 -#define USB_OTG_HOST_GLOBAL_REG_OFFSET 0x400 -#define USB_OTG_HOST_PORT_REGS_OFFSET 0x440 -#define USB_OTG_HOST_CHAN_REGS_OFFSET 0x500 -#define USB_OTG_CHAN_REGS_OFFSET 0x20 -#define USB_OTG_PCGCCTL_OFFSET 0xE00 -#define USB_OTG_DATA_FIFO_OFFSET 0x1000 -#define USB_OTG_DATA_FIFO_SIZE 0x1000 - - -#define USB_OTG_MAX_TX_FIFOS 15 - -#define USB_OTG_HS_MAX_PACKET_SIZE 512 -#define USB_OTG_FS_MAX_PACKET_SIZE 64 -#define USB_OTG_MAX_EP0_SIZE 64 -/** - * @} - */ - -/** @defgroup USB_REGS_Exported_Types - * @{ - */ - -/** @defgroup __USB_OTG_Core_register - * @{ - */ -typedef struct _USB_OTG_GREGS //000h -{ - __IO uint32_t GOTGCTL; /* USB_OTG Control and Status Register 000h*/ - __IO uint32_t GOTGINT; /* USB_OTG Interrupt Register 004h*/ - __IO uint32_t GAHBCFG; /* Core AHB Configuration Register 008h*/ - __IO uint32_t GUSBCFG; /* Core USB Configuration Register 00Ch*/ - __IO uint32_t GRSTCTL; /* Core Reset Register 010h*/ - __IO uint32_t GINTSTS; /* Core Interrupt Register 014h*/ - __IO uint32_t GINTMSK; /* Core Interrupt Mask Register 018h*/ - __IO uint32_t GRXSTSR; /* Receive Sts Q Read Register 01Ch*/ - __IO uint32_t GRXSTSP; /* Receive Sts Q Read & POP Register 020h*/ - __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/ - __IO uint32_t DIEPTXF0_HNPTXFSIZ; /* EP0 / Non Periodic Tx FIFO Size Register 028h*/ - __IO uint32_t HNPTXSTS; /* Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ - __IO uint32_t GI2CCTL; /* I2C Access Register 030h*/ - uint32_t Reserved34; /* PHY Vendor Control Register 034h*/ - __IO uint32_t GCCFG; /* General Purpose IO Register 038h*/ - __IO uint32_t CID; /* User ID Register 03Ch*/ - uint32_t Reserved40[48]; /* Reserved 040h-0FFh*/ - __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/ - __IO uint32_t DIEPTXF[USB_OTG_MAX_TX_FIFOS];/* dev Periodic Transmit FIFO */ -} -USB_OTG_GREGS; -/** - * @} - */ - - -/** @defgroup __device_Registers - * @{ - */ -typedef struct _USB_OTG_DREGS // 800h -{ - __IO uint32_t DCFG; /* dev Configuration Register 800h*/ - __IO uint32_t DCTL; /* dev Control Register 804h*/ - __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/ - uint32_t Reserved0C; /* Reserved 80Ch*/ - __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/ - __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/ - __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/ - __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/ - uint32_t Reserved20; /* Reserved 820h*/ - uint32_t Reserved9; /* Reserved 824h*/ - __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/ - __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/ - __IO uint32_t DTHRCTL; /* dev thr 830h*/ - __IO uint32_t DIEPEMPMSK; /* dev empty msk 834h*/ - __IO uint32_t DEACHINT; /* dedicated EP interrupt 838h*/ - __IO uint32_t DEACHMSK; /* dedicated EP msk 83Ch*/ - uint32_t Reserved40; /* dedicated EP mask 840h*/ - __IO uint32_t DINEP1MSK; /* dedicated EP mask 844h*/ - uint32_t Reserved44[15]; /* Reserved 844-87Ch*/ - __IO uint32_t DOUTEP1MSK; /* dedicated EP msk 884h*/ -} -USB_OTG_DREGS; -/** - * @} - */ - - -/** @defgroup __IN_Endpoint-Specific_Register - * @{ - */ -typedef struct _USB_OTG_INEPREGS -{ - __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/ - uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ - __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/ - uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ - __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/ - __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h*/ - __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/ - uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/ -} -USB_OTG_INEPREGS; -/** - * @} - */ - - -/** @defgroup __OUT_Endpoint-Specific_Registers - * @{ - */ -typedef struct _USB_OTG_OUTEPREGS -{ - __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ - __IO uint32_t DOUTEPFRM; /* dev OUT Endpoint Frame number B00h + (ep_num * 20h) + 04h*/ - __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ - uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ - __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ - __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ - uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ -} -USB_OTG_OUTEPREGS; -/** - * @} - */ - - -/** @defgroup __Host_Mode_Register_Structures - * @{ - */ -typedef struct _USB_OTG_HREGS -{ - __IO uint32_t HCFG; /* Host Configuration Register 400h*/ - __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ - __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ - uint32_t Reserved40C; /* Reserved 40Ch*/ - __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ - __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ - __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ -} -USB_OTG_HREGS; -/** - * @} - */ - - -/** @defgroup __Host_Channel_Specific_Registers - * @{ - */ -typedef struct _USB_OTG_HC_REGS -{ - __IO uint32_t HCCHAR; - __IO uint32_t HCSPLT; - __IO uint32_t HCINT; - __IO uint32_t HCGINTMSK; - __IO uint32_t HCTSIZ; - __IO uint32_t HCDMA; - uint32_t Reserved[2]; -} -USB_OTG_HC_REGS; -/** - * @} - */ - - -/** @defgroup __otg_Core_registers - * @{ - */ -typedef struct USB_OTG_core_regs //000h -{ - USB_OTG_GREGS *GREGS; - USB_OTG_DREGS *DREGS; - USB_OTG_HREGS *HREGS; - USB_OTG_INEPREGS *INEP_REGS[USB_OTG_MAX_TX_FIFOS]; - USB_OTG_OUTEPREGS *OUTEP_REGS[USB_OTG_MAX_TX_FIFOS]; - USB_OTG_HC_REGS *HC_REGS[USB_OTG_MAX_TX_FIFOS]; - __IO uint32_t *HPRT0; - __IO uint32_t *DFIFO[USB_OTG_MAX_TX_FIFOS]; - __IO uint32_t *PCGCCTL; -} -USB_OTG_CORE_REGS , *PUSB_OTG_CORE_REGS; -typedef union _USB_OTG_OTGCTL_TypeDef -{ - uint32_t d32; - struct - { -uint32_t sesreqscs : - 1; -uint32_t sesreq : - 1; -uint32_t Reserved2_7 : - 6; -uint32_t hstnegscs : - 1; -uint32_t hnpreq : - 1; -uint32_t hstsethnpen : - 1; -uint32_t devhnpen : - 1; -uint32_t Reserved12_15 : - 4; -uint32_t conidsts : - 1; -uint32_t Reserved17 : - 1; -uint32_t asesvld : - 1; -uint32_t bsesvld : - 1; -uint32_t currmod : - 1; -uint32_t Reserved21_31 : - 11; - } - b; -} USB_OTG_OTGCTL_TypeDef ; -typedef union _USB_OTG_GOTGINT_TypeDef -{ - uint32_t d32; - struct - { -uint32_t Reserved0_1 : - 2; -uint32_t sesenddet : - 1; -uint32_t Reserved3_7 : - 5; -uint32_t sesreqsucstschng : - 1; -uint32_t hstnegsucstschng : - 1; -uint32_t reserver10_16 : - 7; -uint32_t hstnegdet : - 1; -uint32_t adevtoutchng : - 1; -uint32_t debdone : - 1; -uint32_t Reserved31_20 : - 12; - } - b; -} USB_OTG_GOTGINT_TypeDef ; -typedef union _USB_OTG_GAHBCFG_TypeDef -{ - uint32_t d32; - struct - { -uint32_t glblintrmsk : - 1; -uint32_t hburstlen : - 4; -uint32_t dmaenable : - 1; -uint32_t Reserved : - 1; -uint32_t nptxfemplvl_txfemplvl : - 1; -uint32_t ptxfemplvl : - 1; -uint32_t Reserved9_31 : - 23; - } - b; -} USB_OTG_GAHBCFG_TypeDef ; -typedef union _USB_OTG_GUSBCFG_TypeDef -{ - uint32_t d32; - struct - { -uint32_t toutcal : - 3; -uint32_t phyif : - 1; -uint32_t ulpi_utmi_sel : - 1; -uint32_t fsintf : - 1; -uint32_t physel : - 1; -uint32_t ddrsel : - 1; -uint32_t srpcap : - 1; -uint32_t hnpcap : - 1; -uint32_t usbtrdtim : - 4; -uint32_t nptxfrwnden : - 1; -uint32_t phylpwrclksel : - 1; -uint32_t otgutmifssel : - 1; -uint32_t ulpi_fsls : - 1; -uint32_t ulpi_auto_res : - 1; -uint32_t ulpi_clk_sus_m : - 1; -uint32_t ulpi_ext_vbus_drv : - 1; -uint32_t ulpi_int_vbus_indicator : - 1; -uint32_t term_sel_dl_pulse : - 1; -uint32_t Reserved : - 6; -uint32_t force_host : - 1; -uint32_t force_dev : - 1; -uint32_t corrupt_tx : - 1; - } - b; -} USB_OTG_GUSBCFG_TypeDef ; -typedef union _USB_OTG_GRSTCTL_TypeDef -{ - uint32_t d32; - struct - { -uint32_t csftrst : - 1; -uint32_t hsftrst : - 1; -uint32_t hstfrm : - 1; -uint32_t intknqflsh : - 1; -uint32_t rxfflsh : - 1; -uint32_t txfflsh : - 1; -uint32_t txfnum : - 5; -uint32_t Reserved11_29 : - 19; -uint32_t dmareq : - 1; -uint32_t ahbidle : - 1; - } - b; -} USB_OTG_GRSTCTL_TypeDef ; -typedef union _USB_OTG_GINTMSK_TypeDef -{ - uint32_t d32; - struct - { -uint32_t Reserved0 : - 1; -uint32_t modemismatch : - 1; -uint32_t otgintr : - 1; -uint32_t sofintr : - 1; -uint32_t rxstsqlvl : - 1; -uint32_t nptxfempty : - 1; -uint32_t ginnakeff : - 1; -uint32_t goutnakeff : - 1; -uint32_t Reserved8 : - 1; -uint32_t i2cintr : - 1; -uint32_t erlysuspend : - 1; -uint32_t usbsuspend : - 1; -uint32_t usbreset : - 1; -uint32_t enumdone : - 1; -uint32_t isooutdrop : - 1; -uint32_t eopframe : - 1; -uint32_t Reserved16 : - 1; -uint32_t epmismatch : - 1; -uint32_t inepintr : - 1; -uint32_t outepintr : - 1; -uint32_t incomplisoin : - 1; -uint32_t incomplisoout : - 1; -uint32_t Reserved22_23 : - 2; -uint32_t portintr : - 1; -uint32_t hcintr : - 1; -uint32_t ptxfempty : - 1; -uint32_t Reserved27 : - 1; -uint32_t conidstschng : - 1; -uint32_t disconnect : - 1; -uint32_t sessreqintr : - 1; -uint32_t wkupintr : - 1; - } - b; -} USB_OTG_GINTMSK_TypeDef ; -typedef union _USB_OTG_GINTSTS_TypeDef -{ - uint32_t d32; - struct - { -uint32_t curmode : - 1; -uint32_t modemismatch : - 1; -uint32_t otgintr : - 1; -uint32_t sofintr : - 1; -uint32_t rxstsqlvl : - 1; -uint32_t nptxfempty : - 1; -uint32_t ginnakeff : - 1; -uint32_t goutnakeff : - 1; -uint32_t Reserved8 : - 1; -uint32_t i2cintr : - 1; -uint32_t erlysuspend : - 1; -uint32_t usbsuspend : - 1; -uint32_t usbreset : - 1; -uint32_t enumdone : - 1; -uint32_t isooutdrop : - 1; -uint32_t eopframe : - 1; -uint32_t intimerrx : - 1; -uint32_t epmismatch : - 1; -uint32_t inepint: - 1; -uint32_t outepintr : - 1; -uint32_t incomplisoin : - 1; -uint32_t incomplisoout : - 1; -uint32_t Reserved22_23 : - 2; -uint32_t portintr : - 1; -uint32_t hcintr : - 1; -uint32_t ptxfempty : - 1; -uint32_t Reserved27 : - 1; -uint32_t conidstschng : - 1; -uint32_t disconnect : - 1; -uint32_t sessreqintr : - 1; -uint32_t wkupintr : - 1; - } - b; -} USB_OTG_GINTSTS_TypeDef ; -typedef union _USB_OTG_DRXSTS_TypeDef -{ - uint32_t d32; - struct - { -uint32_t epnum : - 4; -uint32_t bcnt : - 11; -uint32_t dpid : - 2; -uint32_t pktsts : - 4; -uint32_t fn : - 4; -uint32_t Reserved : - 7; - } - b; -} USB_OTG_DRXSTS_TypeDef ; -typedef union _USB_OTG_GRXSTS_TypeDef -{ - uint32_t d32; - struct - { -uint32_t chnum : - 4; -uint32_t bcnt : - 11; -uint32_t dpid : - 2; -uint32_t pktsts : - 4; -uint32_t Reserved : - 11; - } - b; -} USB_OTG_GRXFSTS_TypeDef ; -typedef union _USB_OTG_FSIZ_TypeDef -{ - uint32_t d32; - struct - { -uint32_t startaddr : - 16; -uint32_t depth : - 16; - } - b; -} USB_OTG_FSIZ_TypeDef ; -typedef union _USB_OTG_HNPTXSTS_TypeDef -{ - uint32_t d32; - struct - { -uint32_t nptxfspcavail : - 16; -uint32_t nptxqspcavail : - 8; -uint32_t nptxqtop_terminate : - 1; -uint32_t nptxqtop_timer : - 2; -uint32_t nptxqtop : - 2; -uint32_t chnum : - 2; -uint32_t Reserved : - 1; - } - b; -} USB_OTG_HNPTXSTS_TypeDef ; -typedef union _USB_OTG_DTXFSTSn_TypeDef -{ - uint32_t d32; - struct - { -uint32_t txfspcavail : - 16; -uint32_t Reserved : - 16; - } - b; -} USB_OTG_DTXFSTSn_TypeDef ; -typedef union _USB_OTG_GI2CCTL_TypeDef -{ - uint32_t d32; - struct - { -uint32_t rwdata : - 8; -uint32_t regaddr : - 8; -uint32_t addr : - 7; -uint32_t i2cen : - 1; -uint32_t ack : - 1; -uint32_t i2csuspctl : - 1; -uint32_t i2cdevaddr : - 2; -uint32_t dat_se0: - 1; -uint32_t Reserved : - 1; -uint32_t rw : - 1; -uint32_t bsydne : - 1; - } - b; -} USB_OTG_GI2CCTL_TypeDef ; -typedef union _USB_OTG_GCCFG_TypeDef -{ - uint32_t d32; - struct - { -uint32_t Reserved_in : - 16; -uint32_t pwdn : - 1; -uint32_t i2cifen : - 1; -uint32_t vbussensingA : - 1; -uint32_t vbussensingB : - 1; -uint32_t sofouten : - 1; -uint32_t disablevbussensing : - 1; -uint32_t Reserved_out : - 10; - } - b; -} USB_OTG_GCCFG_TypeDef ; - -typedef union _USB_OTG_DCFG_TypeDef -{ - uint32_t d32; - struct - { -uint32_t devspd : - 2; -uint32_t nzstsouthshk : - 1; -uint32_t Reserved3 : - 1; -uint32_t devaddr : - 7; -uint32_t perfrint : - 2; -uint32_t Reserved13_17 : - 5; -uint32_t epmscnt : - 4; - } - b; -} USB_OTG_DCFG_TypeDef ; -typedef union _USB_OTG_DCTL_TypeDef -{ - uint32_t d32; - struct - { -uint32_t rmtwkupsig : - 1; -uint32_t sftdiscon : - 1; -uint32_t gnpinnaksts : - 1; -uint32_t goutnaksts : - 1; -uint32_t tstctl : - 3; -uint32_t sgnpinnak : - 1; -uint32_t cgnpinnak : - 1; -uint32_t sgoutnak : - 1; -uint32_t cgoutnak : - 1; -uint32_t Reserved : - 21; - } - b; -} USB_OTG_DCTL_TypeDef ; -typedef union _USB_OTG_DSTS_TypeDef -{ - uint32_t d32; - struct - { -uint32_t suspsts : - 1; -uint32_t enumspd : - 2; -uint32_t errticerr : - 1; -uint32_t Reserved4_7: - 4; -uint32_t soffn : - 14; -uint32_t Reserved22_31 : - 10; - } - b; -} USB_OTG_DSTS_TypeDef ; -typedef union _USB_OTG_DIEPINTn_TypeDef -{ - uint32_t d32; - struct - { -uint32_t xfercompl : - 1; -uint32_t epdisabled : - 1; -uint32_t ahberr : - 1; -uint32_t timeout : - 1; -uint32_t intktxfemp : - 1; -uint32_t intknepmis : - 1; -uint32_t inepnakeff : - 1; -uint32_t emptyintr : - 1; -uint32_t txfifoundrn : - 1; -uint32_t Reserved08_31 : - 23; - } - b; -} USB_OTG_DIEPINTn_TypeDef ; -typedef union _USB_OTG_DIEPINTn_TypeDef USB_OTG_DIEPMSK_TypeDef ; -typedef union _USB_OTG_DOEPINTn_TypeDef -{ - uint32_t d32; - struct - { -uint32_t xfercompl : - 1; -uint32_t epdisabled : - 1; -uint32_t ahberr : - 1; -uint32_t setup : - 1; -uint32_t Reserved04_31 : - 28; - } - b; -} USB_OTG_DOEPINTn_TypeDef ; -typedef union _USB_OTG_DOEPINTn_TypeDef USB_OTG_DOEPMSK_TypeDef ; - -typedef union _USB_OTG_DAINT_TypeDef -{ - uint32_t d32; - struct - { -uint32_t in : - 16; -uint32_t out : - 16; - } - ep; -} USB_OTG_DAINT_TypeDef ; - -typedef union _USB_OTG_DTHRCTL_TypeDef -{ - uint32_t d32; - struct - { -uint32_t non_iso_thr_en : - 1; -uint32_t iso_thr_en : - 1; -uint32_t tx_thr_len : - 9; -uint32_t Reserved11_15 : - 5; -uint32_t rx_thr_en : - 1; -uint32_t rx_thr_len : - 9; -uint32_t Reserved26_31 : - 6; - } - b; -} USB_OTG_DTHRCTL_TypeDef ; -typedef union _USB_OTG_DEPCTL_TypeDef -{ - uint32_t d32; - struct - { -uint32_t mps : - 11; -uint32_t reserved : - 4; -uint32_t usbactep : - 1; -uint32_t dpid : - 1; -uint32_t naksts : - 1; -uint32_t eptype : - 2; -uint32_t snp : - 1; -uint32_t stall : - 1; -uint32_t txfnum : - 4; -uint32_t cnak : - 1; -uint32_t snak : - 1; -uint32_t setd0pid : - 1; -uint32_t setd1pid : - 1; -uint32_t epdis : - 1; -uint32_t epena : - 1; - } - b; -} USB_OTG_DEPCTL_TypeDef ; -typedef union _USB_OTG_DEPXFRSIZ_TypeDef -{ - uint32_t d32; - struct - { -uint32_t xfersize : - 19; -uint32_t pktcnt : - 10; -uint32_t mc : - 2; -uint32_t Reserved : - 1; - } - b; -} USB_OTG_DEPXFRSIZ_TypeDef ; -typedef union _USB_OTG_DEP0XFRSIZ_TypeDef -{ - uint32_t d32; - struct - { -uint32_t xfersize : - 7; -uint32_t Reserved7_18 : - 12; -uint32_t pktcnt : - 2; -uint32_t Reserved20_28 : - 9; -uint32_t supcnt : - 2; - uint32_t Reserved31; - } - b; -} USB_OTG_DEP0XFRSIZ_TypeDef ; -typedef union _USB_OTG_HCFG_TypeDef -{ - uint32_t d32; - struct - { -uint32_t fslspclksel : - 2; -uint32_t fslssupp : - 1; - } - b; -} USB_OTG_HCFG_TypeDef ; -typedef union _USB_OTG_HFRMINTRVL_TypeDef -{ - uint32_t d32; - struct - { -uint32_t frint : - 16; -uint32_t Reserved : - 16; - } - b; -} USB_OTG_HFRMINTRVL_TypeDef ; - -typedef union _USB_OTG_HFNUM_TypeDef -{ - uint32_t d32; - struct - { -uint32_t frnum : - 16; -uint32_t frrem : - 16; - } - b; -} USB_OTG_HFNUM_TypeDef ; -typedef union _USB_OTG_HPTXSTS_TypeDef -{ - uint32_t d32; - struct - { -uint32_t ptxfspcavail : - 16; -uint32_t ptxqspcavail : - 8; -uint32_t ptxqtop_terminate : - 1; -uint32_t ptxqtop_timer : - 2; -uint32_t ptxqtop : - 2; -uint32_t chnum : - 2; -uint32_t ptxqtop_odd : - 1; - } - b; -} USB_OTG_HPTXSTS_TypeDef ; -typedef union _USB_OTG_HPRT0_TypeDef -{ - uint32_t d32; - struct - { -uint32_t prtconnsts : - 1; -uint32_t prtconndet : - 1; -uint32_t prtena : - 1; -uint32_t prtenchng : - 1; -uint32_t prtovrcurract : - 1; -uint32_t prtovrcurrchng : - 1; -uint32_t prtres : - 1; -uint32_t prtsusp : - 1; -uint32_t prtrst : - 1; -uint32_t Reserved9 : - 1; -uint32_t prtlnsts : - 2; -uint32_t prtpwr : - 1; -uint32_t prttstctl : - 4; -uint32_t prtspd : - 2; -uint32_t Reserved19_31 : - 13; - } - b; -} USB_OTG_HPRT0_TypeDef ; -typedef union _USB_OTG_HAINT_TypeDef -{ - uint32_t d32; - struct - { -uint32_t chint : - 16; -uint32_t Reserved : - 16; - } - b; -} USB_OTG_HAINT_TypeDef ; -typedef union _USB_OTG_HAINTMSK_TypeDef -{ - uint32_t d32; - struct - { -uint32_t chint : - 16; -uint32_t Reserved : - 16; - } - b; -} USB_OTG_HAINTMSK_TypeDef ; -typedef union _USB_OTG_HCCHAR_TypeDef -{ - uint32_t d32; - struct - { -uint32_t mps : - 11; -uint32_t epnum : - 4; -uint32_t epdir : - 1; -uint32_t Reserved : - 1; -uint32_t lspddev : - 1; -uint32_t eptype : - 2; -uint32_t multicnt : - 2; -uint32_t devaddr : - 7; -uint32_t oddfrm : - 1; -uint32_t chdis : - 1; -uint32_t chen : - 1; - } - b; -} USB_OTG_HCCHAR_TypeDef ; -typedef union _USB_OTG_HCSPLT_TypeDef -{ - uint32_t d32; - struct - { -uint32_t prtaddr : - 7; -uint32_t hubaddr : - 7; -uint32_t xactpos : - 2; -uint32_t compsplt : - 1; -uint32_t Reserved : - 14; -uint32_t spltena : - 1; - } - b; -} USB_OTG_HCSPLT_TypeDef ; -typedef union _USB_OTG_HCINTn_TypeDef -{ - uint32_t d32; - struct - { -uint32_t xfercompl : - 1; -uint32_t chhltd : - 1; -uint32_t ahberr : - 1; -uint32_t stall : - 1; -uint32_t nak : - 1; -uint32_t ack : - 1; -uint32_t nyet : - 1; -uint32_t xacterr : - 1; -uint32_t bblerr : - 1; -uint32_t frmovrun : - 1; -uint32_t datatglerr : - 1; -uint32_t Reserved : - 21; - } - b; -} USB_OTG_HCINTn_TypeDef ; -typedef union _USB_OTG_HCTSIZn_TypeDef -{ - uint32_t d32; - struct - { -uint32_t xfersize : - 19; -uint32_t pktcnt : - 10; -uint32_t pid : - 2; -uint32_t dopng : - 1; - } - b; -} USB_OTG_HCTSIZn_TypeDef ; -typedef union _USB_OTG_HCGINTMSK_TypeDef -{ - uint32_t d32; - struct - { -uint32_t xfercompl : - 1; -uint32_t chhltd : - 1; -uint32_t ahberr : - 1; -uint32_t stall : - 1; -uint32_t nak : - 1; -uint32_t ack : - 1; -uint32_t nyet : - 1; -uint32_t xacterr : - 1; -uint32_t bblerr : - 1; -uint32_t frmovrun : - 1; -uint32_t datatglerr : - 1; -uint32_t Reserved : - 21; - } - b; -} USB_OTG_HCGINTMSK_TypeDef ; -typedef union _USB_OTG_PCGCCTL_TypeDef -{ - uint32_t d32; - struct - { -uint32_t stoppclk : - 1; -uint32_t gatehclk : - 1; -uint32_t Reserved : - 30; - } - b; -} USB_OTG_PCGCCTL_TypeDef ; - -/** - * @} - */ - - -/** @defgroup USB_REGS_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_REGS_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USB_REGS_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ - - -#endif //__USB_OTG_REGS_H__ - - -/** - * @} - */ - -/** - * @} - */ -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_otg/src/usb_core.c b/car_hw/src/lib/usb_otg/src/usb_core.c deleted file mode 100644 index 5d2924561b8..00000000000 --- a/car_hw/src/lib/usb_otg/src/usb_core.c +++ /dev/null @@ -1,2187 +0,0 @@ -/** - ****************************************************************************** - * @file usb_core.c - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief USB-OTG Core Layer - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_core.h" -#include "usb_bsp.h" - - -/** @addtogroup USB_OTG_DRIVER -* @{ -*/ - -/** @defgroup USB_CORE -* @brief This file includes the USB-OTG Core Layer -* @{ -*/ - - -/** @defgroup USB_CORE_Private_Defines -* @{ -*/ - -/** -* @} -*/ - - -/** @defgroup USB_CORE_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - - - -/** @defgroup USB_CORE_Private_Macros -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USB_CORE_Private_Variables -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USB_CORE_Private_FunctionPrototypes -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USB_CORE_Private_Functions -* @{ -*/ - -/** -* @brief USB_OTG_EnableCommonInt -* Initializes the commmon interrupts, used in both device and modes -* @param pdev : Selected device -* @retval None -*/ -static void USB_OTG_EnableCommonInt(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTMSK_TypeDef int_mask; - - int_mask.d32 = 0; - /* Clear any pending USB_OTG Interrupts */ -#ifndef USE_OTG_MODE - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GOTGINT, 0xFFFFFFFF); -#endif - /* Clear any pending interrupts */ - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF); - /* Enable the interrupts in the INTMSK */ - int_mask.b.wkupintr = 1; - int_mask.b.usbsuspend = 1; - -#ifdef USE_OTG_MODE - int_mask.b.otgintr = 1; - int_mask.b.sessreqintr = 1; - int_mask.b.conidstschng = 1; -#endif - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32); -} - -/** -* @brief USB_OTG_CoreReset : Soft reset of the core -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -static USB_OTG_STS USB_OTG_CoreReset(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_STS status = USB_OTG_OK; - __IO USB_OTG_GRSTCTL_TypeDef greset; - uint32_t count = 0; - - greset.d32 = 0; - /* Wait for AHB master IDLE state. */ - do - { - USB_OTG_BSP_uDelay(3); - greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL); - if (++count > 200000) - { - return USB_OTG_OK; - } - } - while (greset.b.ahbidle == 0); - /* Core Soft Reset */ - count = 0; - greset.b.csftrst = 1; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRSTCTL, greset.d32 ); - do - { - greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL); - if (++count > 200000) - { - break; - } - } - while (greset.b.csftrst == 1); - /* Wait for 3 PHY Clocks*/ - USB_OTG_BSP_uDelay(3); - return status; -} - -/** -* @brief USB_OTG_WritePacket : Writes a packet into the Tx FIFO associated -* with the EP -* @param pdev : Selected device -* @param src : source pointer -* @param ch_ep_num : end point number -* @param bytes : No. of bytes -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_WritePacket(USB_OTG_CORE_HANDLE *pdev, - uint8_t *src, - uint8_t ch_ep_num, - uint16_t len) -{ - USB_OTG_STS status = USB_OTG_OK; - if (pdev->cfg.dma_enable == 0) - { - uint32_t count32b= 0 , i= 0; - __IO uint32_t *fifo; - - count32b = (len + 3) / 4; - fifo = pdev->regs.DFIFO[ch_ep_num]; - for (i = 0; i < count32b; i++, src+=4) - { - USB_OTG_WRITE_REG32( fifo, *((__packed uint32_t *)src) ); - } - } - return status; -} - - -/** -* @brief USB_OTG_ReadPacket : Reads a packet from the Rx FIFO -* @param pdev : Selected device -* @param dest : Destination Pointer -* @param bytes : No. of bytes -* @retval None -*/ -void *USB_OTG_ReadPacket(USB_OTG_CORE_HANDLE *pdev, - uint8_t *dest, - uint16_t len) -{ - uint32_t i=0; - uint32_t count32b = (len + 3) / 4; - - __IO uint32_t *fifo = pdev->regs.DFIFO[0]; - - for ( i = 0; i < count32b; i++, dest += 4 ) - { - *(__packed uint32_t *)dest = USB_OTG_READ_REG32(fifo); - - } - return ((void *)dest); -} - -/** -* @brief USB_OTG_SelectCore -* Initialize core registers address. -* @param pdev : Selected device -* @param coreID : USB OTG Core ID -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_SelectCore(USB_OTG_CORE_HANDLE *pdev, - USB_OTG_CORE_ID_TypeDef coreID) -{ - uint32_t i , baseAddress = 0; - USB_OTG_STS status = USB_OTG_OK; - - pdev->cfg.dma_enable = 0; - - /* at startup the core is in FS mode */ - pdev->cfg.speed = USB_OTG_SPEED_FULL; - pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ; - - /* initialize device cfg following its address */ - if (coreID == USB_OTG_FS_CORE_ID) - { - baseAddress = USB_OTG_FS_BASE_ADDR; - pdev->cfg.coreID = USB_OTG_FS_CORE_ID; - pdev->cfg.host_channels = 8 ; - pdev->cfg.dev_endpoints = 4 ; - pdev->cfg.TotalFifoSize = 320; /* in 32-bits */ - pdev->cfg.phy_itface = USB_OTG_EMBEDDED_PHY; - -#ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED - pdev->cfg.Sof_output = 1; -#endif - -#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT - pdev->cfg.low_power = 1; -#endif - } - else if (coreID == USB_OTG_HS_CORE_ID) - { - baseAddress = USB_OTG_HS_BASE_ADDR; - pdev->cfg.coreID = USB_OTG_HS_CORE_ID; - pdev->cfg.host_channels = 12 ; - pdev->cfg.dev_endpoints = 6 ; - pdev->cfg.TotalFifoSize = 1280;/* in 32-bits */ - -#ifdef USB_OTG_ULPI_PHY_ENABLED - pdev->cfg.phy_itface = USB_OTG_ULPI_PHY; -#else - #ifdef USB_OTG_EMBEDDED_PHY_ENABLED - pdev->cfg.phy_itface = USB_OTG_EMBEDDED_PHY; - #else - #ifdef USB_OTG_I2C_PHY_ENABLED - pdev->cfg.phy_itface = USB_OTG_I2C_PHY; - #endif - #endif -#endif - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - pdev->cfg.dma_enable = 1; -#endif - -#ifdef USB_OTG_HS_SOF_OUTPUT_ENABLED - pdev->cfg.Sof_output = 1; -#endif - -#ifdef USB_OTG_HS_LOW_PWR_MGMT_SUPPORT - pdev->cfg.low_power = 1; -#endif - - } - - pdev->regs.GREGS = (USB_OTG_GREGS *)(baseAddress + \ - USB_OTG_CORE_GLOBAL_REGS_OFFSET); - pdev->regs.DREGS = (USB_OTG_DREGS *) (baseAddress + \ - USB_OTG_DEV_GLOBAL_REG_OFFSET); - - for (i = 0; i < pdev->cfg.dev_endpoints; i++) - { - pdev->regs.INEP_REGS[i] = (USB_OTG_INEPREGS *) \ - (baseAddress + USB_OTG_DEV_IN_EP_REG_OFFSET + \ - (i * USB_OTG_EP_REG_OFFSET)); - pdev->regs.OUTEP_REGS[i] = (USB_OTG_OUTEPREGS *) \ - (baseAddress + USB_OTG_DEV_OUT_EP_REG_OFFSET + \ - (i * USB_OTG_EP_REG_OFFSET)); - } - pdev->regs.HREGS = (USB_OTG_HREGS *)(baseAddress + \ - USB_OTG_HOST_GLOBAL_REG_OFFSET); - pdev->regs.HPRT0 = (uint32_t *)(baseAddress + USB_OTG_HOST_PORT_REGS_OFFSET); - - for (i = 0; i < pdev->cfg.host_channels; i++) - { - pdev->regs.HC_REGS[i] = (USB_OTG_HC_REGS *)(baseAddress + \ - USB_OTG_HOST_CHAN_REGS_OFFSET + \ - (i * USB_OTG_CHAN_REGS_OFFSET)); - } - for (i = 0; i < pdev->cfg.host_channels; i++) - { - pdev->regs.DFIFO[i] = (uint32_t *)(baseAddress + USB_OTG_DATA_FIFO_OFFSET +\ - (i * USB_OTG_DATA_FIFO_SIZE)); - } - pdev->regs.PCGCCTL = (uint32_t *)(baseAddress + USB_OTG_PCGCCTL_OFFSET); - - return status; -} - - -/** -* @brief USB_OTG_CoreInit -* Initializes the USB_OTG controller registers and prepares the core -* device mode or host mode operation. -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_CoreInit(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_GUSBCFG_TypeDef usbcfg; - USB_OTG_GCCFG_TypeDef gccfg; - USB_OTG_GI2CCTL_TypeDef i2cctl; - USB_OTG_GAHBCFG_TypeDef ahbcfg; - - usbcfg.d32 = 0; - gccfg.d32 = 0; - ahbcfg.d32 = 0; - - - - if (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) - { - gccfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GCCFG); - gccfg.b.pwdn = 0; - - if (pdev->cfg.Sof_output) - { - gccfg.b.sofouten = 1; - } - USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32); - - /* Init The ULPI Interface */ - usbcfg.d32 = 0; - usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); - - usbcfg.b.physel = 0; /* HS Interface */ -#ifdef USB_OTG_INTERNAL_VBUS_ENABLED - usbcfg.b.ulpi_ext_vbus_drv = 0; /* Use internal VBUS */ -#else - #ifdef USB_OTG_EXTERNAL_VBUS_ENABLED - usbcfg.b.ulpi_ext_vbus_drv = 1; /* Use external VBUS */ - #endif -#endif - usbcfg.b.term_sel_dl_pulse = 0; /* Data line pulsing using utmi_txvalid */ - usbcfg.b.ulpi_utmi_sel = 1; /* ULPI seleInterfacect */ - - usbcfg.b.phyif = 0; /* 8 bits */ - usbcfg.b.ddrsel = 0; /* single data rate */ - - usbcfg.b.ulpi_fsls = 0; - usbcfg.b.ulpi_clk_sus_m = 0; - USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); - - /* Reset after a PHY select */ - USB_OTG_CoreReset(pdev); - - if(pdev->cfg.dma_enable == 1) - { - - ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/ - ahbcfg.b.dmaenable = 1; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32); - - } - } - else /* FS interface (embedded Phy or I2C Phy) */ - { - - usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);; - usbcfg.b.physel = 1; /* FS Interface */ - USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); - /* Reset after a PHY select and set Host mode */ - USB_OTG_CoreReset(pdev); - /* Enable the I2C interface and deactivate the power down*/ - gccfg.d32 = 0; - gccfg.b.pwdn = 1; - - if(pdev->cfg.phy_itface == USB_OTG_I2C_PHY) - { - gccfg.b.i2cifen = 1; - } - gccfg.b.vbussensingA = 1 ; - gccfg.b.vbussensingB = 1 ; -#ifndef VBUS_SENSING_ENABLED - gccfg.b.disablevbussensing = 1; -#endif - - if(pdev->cfg.Sof_output) - { - gccfg.b.sofouten = 1; - } - - USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32); - USB_OTG_BSP_mDelay(20); - /* Program GUSBCFG.OtgUtmifsSel to I2C*/ - usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); - - if(pdev->cfg.phy_itface == USB_OTG_I2C_PHY) - { - usbcfg.b.otgutmifssel = 1; - } - - USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); - - if(pdev->cfg.phy_itface == USB_OTG_I2C_PHY) - { - /*Program GI2CCTL.I2CEn*/ - i2cctl.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GI2CCTL); - i2cctl.b.i2cdevaddr = 1; - i2cctl.b.i2cen = 0; - i2cctl.b.dat_se0 = 1; - i2cctl.b.addr = 0x2D; - USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GI2CCTL, i2cctl.d32); - - USB_OTG_BSP_mDelay(200); - - i2cctl.b.i2cen = 1; - USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GI2CCTL, i2cctl.d32); - USB_OTG_BSP_mDelay(200); - } - } - /* case the HS core is working in FS mode */ - if(pdev->cfg.dma_enable == 1) - { - - ahbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GAHBCFG); - ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/ - ahbcfg.b.dmaenable = 1; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32); - - } - /* initialize OTG features */ -#ifdef USE_OTG_MODE - usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); - usbcfg.b.hnpcap = 1; - usbcfg.b.srpcap = 1; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); - USB_OTG_EnableCommonInt(pdev); -#endif - return status; -} -/** -* @brief USB_OTG_EnableGlobalInt -* Enables the controller's Global Int in the AHB Config reg -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_EnableGlobalInt(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_GAHBCFG_TypeDef ahbcfg; - - ahbcfg.d32 = 0; - ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ - USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, 0, ahbcfg.d32); - return status; -} - - -/** -* @brief USB_OTG_DisableGlobalInt -* Enables the controller's Global Int in the AHB Config reg -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_GAHBCFG_TypeDef ahbcfg; - ahbcfg.d32 = 0; - ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ - USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32, 0); - return status; -} - - -/** -* @brief USB_OTG_FlushTxFifo : Flush a Tx FIFO -* @param pdev : Selected device -* @param num : FO num -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num ) -{ - USB_OTG_STS status = USB_OTG_OK; - __IO USB_OTG_GRSTCTL_TypeDef greset; - - uint32_t count = 0; - greset.d32 = 0; - greset.b.txfflsh = 1; - greset.b.txfnum = num; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 ); - do - { - greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL); - if (++count > 200000) - { - break; - } - } - while (greset.b.txfflsh == 1); - /* Wait for 3 PHY Clocks*/ - USB_OTG_BSP_uDelay(3); - return status; -} - - -/** -* @brief USB_OTG_FlushRxFifo : Flush a Rx FIFO -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_FlushRxFifo( USB_OTG_CORE_HANDLE *pdev ) -{ - USB_OTG_STS status = USB_OTG_OK; - __IO USB_OTG_GRSTCTL_TypeDef greset; - uint32_t count = 0; - - greset.d32 = 0; - greset.b.rxfflsh = 1; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 ); - do - { - greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL); - if (++count > 200000) - { - break; - } - } - while (greset.b.rxfflsh == 1); - /* Wait for 3 PHY Clocks*/ - USB_OTG_BSP_uDelay(3); - return status; -} - - -/** -* @brief USB_OTG_SetCurrentMode : Set ID line -* @param pdev : Selected device -* @param mode : (Host/device) -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_SetCurrentMode(USB_OTG_CORE_HANDLE *pdev , uint8_t mode) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_GUSBCFG_TypeDef usbcfg; - - usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); - - usbcfg.b.force_host = 0; - usbcfg.b.force_dev = 0; - - if ( mode == HOST_MODE) - { - usbcfg.b.force_host = 1; - } - else if ( mode == DEVICE_MODE) - { - usbcfg.b.force_dev = 1; - } - - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); - USB_OTG_BSP_mDelay(50); - return status; -} - - -/** -* @brief USB_OTG_GetMode : Get current mode -* @param pdev : Selected device -* @retval current mode -*/ -uint32_t USB_OTG_GetMode(USB_OTG_CORE_HANDLE *pdev) -{ - return (USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS ) & 0x1); -} - - -/** -* @brief USB_OTG_IsDeviceMode : Check if it is device mode -* @param pdev : Selected device -* @retval num_in_ep -*/ -uint8_t USB_OTG_IsDeviceMode(USB_OTG_CORE_HANDLE *pdev) -{ - return (USB_OTG_GetMode(pdev) != HOST_MODE); -} - - -/** -* @brief USB_OTG_IsHostMode : Check if it is host mode -* @param pdev : Selected device -* @retval num_in_ep -*/ -uint8_t USB_OTG_IsHostMode(USB_OTG_CORE_HANDLE *pdev) -{ - return (USB_OTG_GetMode(pdev) == HOST_MODE); -} - - -/** -* @brief USB_OTG_ReadCoreItr : returns the Core Interrupt register -* @param pdev : Selected device -* @retval Status -*/ -uint32_t USB_OTG_ReadCoreItr(USB_OTG_CORE_HANDLE *pdev) -{ - uint32_t v = 0; - v = USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS); - v &= USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTMSK); - return v; -} - - -/** -* @brief USB_OTG_ReadOtgItr : returns the USB_OTG Interrupt register -* @param pdev : Selected device -* @retval Status -*/ -uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev) -{ - return (USB_OTG_READ_REG32 (&pdev->regs.GREGS->GOTGINT)); -} - -#ifdef USE_HOST_MODE -/** -* @brief USB_OTG_CoreInitHost : Initializes USB_OTG controller for host mode -* @param pdev : Selected device -* @retval status -*/ -USB_OTG_STS USB_OTG_CoreInitHost(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_FSIZ_TypeDef nptxfifosize; - USB_OTG_FSIZ_TypeDef ptxfifosize; - USB_OTG_HCFG_TypeDef hcfg; - -#ifdef USE_OTG_MODE - USB_OTG_OTGCTL_TypeDef gotgctl; -#endif - - uint32_t i = 0; - - nptxfifosize.d32 = 0; - ptxfifosize.d32 = 0; -#ifdef USE_OTG_MODE - gotgctl.d32 = 0; -#endif - hcfg.d32 = 0; - - - /* configure charge pump IO */ - USB_OTG_BSP_ConfigVBUS(pdev); - - /* Restart the Phy Clock */ - USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0); - - /* Initialize Host Configuration Register */ - USB_OTG_InitFSLSPClkSel(pdev , HCFG_48_MHZ); /* in init phase */ - - hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); - hcfg.b.fslssupp = 0; - USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32); - - /* Configure data FIFO sizes */ - /* Rx FIFO */ -#ifdef USB_OTG_FS_CORE - if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID) - { - /* set Rx FIFO size */ - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_FS_SIZE); - nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE; - nptxfifosize.b.depth = TXH_NP_FS_FIFOSIZ; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32); - - ptxfifosize.b.startaddr = RX_FIFO_FS_SIZE + TXH_NP_FS_FIFOSIZ; - ptxfifosize.b.depth = TXH_P_FS_FIFOSIZ; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32); - } -#endif -#ifdef USB_OTG_HS_CORE - if (pdev->cfg.coreID == USB_OTG_HS_CORE_ID) - { - /* set Rx FIFO size */ - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE); - nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE; - nptxfifosize.b.depth = TXH_NP_HS_FIFOSIZ; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32); - - ptxfifosize.b.startaddr = RX_FIFO_HS_SIZE + TXH_NP_HS_FIFOSIZ; - ptxfifosize.b.depth = TXH_P_HS_FIFOSIZ; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32); - } -#endif - -#ifdef USE_OTG_MODE - /* Clear Host Set HNP Enable in the USB_OTG Control Register */ - gotgctl.b.hstsethnpen = 1; - USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GOTGCTL, gotgctl.d32, 0); -#endif - - /* Make sure the FIFOs are flushed. */ - USB_OTG_FlushTxFifo(pdev, 0x10 ); /* all Tx FIFOs */ - USB_OTG_FlushRxFifo(pdev); - - - /* Clear all pending HC Interrupts */ - for (i = 0; i < pdev->cfg.host_channels; i++) - { - USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCINT, 0xFFFFFFFF ); - USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCGINTMSK, 0 ); - } -#ifndef USE_OTG_MODE - USB_OTG_DriveVbus(pdev, 1); -#endif - - USB_OTG_EnableHostInt(pdev); - return status; -} - -/** -* @brief USB_OTG_IsEvenFrame -* This function returns the frame number for sof packet -* @param pdev : Selected device -* @retval Frame number -*/ -uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) -{ - return !(USB_OTG_READ_REG32(&pdev->regs.HREGS->HFNUM) & 0x1); -} - -/** -* @brief USB_OTG_DriveVbus : set/reset vbus -* @param pdev : Selected device -* @param state : VBUS state -* @retval None -*/ -void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state) -{ - USB_OTG_HPRT0_TypeDef hprt0; - - hprt0.d32 = 0; - - /* enable disable the external charge pump */ - USB_OTG_BSP_DriveVBUS(pdev, state); - - /* Turn on the Host port power. */ - hprt0.d32 = USB_OTG_ReadHPRT0(pdev); - if ((hprt0.b.prtpwr == 0 ) && (state == 1 )) - { - hprt0.b.prtpwr = 1; - USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); - } - if ((hprt0.b.prtpwr == 1 ) && (state == 0 )) - { - hprt0.b.prtpwr = 0; - USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); - } - - USB_OTG_BSP_mDelay(200); -} -/** -* @brief USB_OTG_EnableHostInt: Enables the Host mode interrupts -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_EnableHostInt(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_GINTMSK_TypeDef intmsk; - intmsk.d32 = 0; - /* Disable all interrupts. */ - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTMSK, 0); - - /* Clear any pending interrupts. */ - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF); - - /* Enable the common interrupts */ - USB_OTG_EnableCommonInt(pdev); - - if (pdev->cfg.dma_enable == 0) - { - intmsk.b.rxstsqlvl = 1; - } - intmsk.b.portintr = 1; - intmsk.b.hcintr = 1; - intmsk.b.disconnect = 1; - intmsk.b.sofintr = 1; - intmsk.b.incomplisoout = 1; - USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32); - return status; -} - -/** -* @brief USB_OTG_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the -* HCFG register on the PHY type -* @param pdev : Selected device -* @param freq : clock frequency -* @retval None -*/ -void USB_OTG_InitFSLSPClkSel(USB_OTG_CORE_HANDLE *pdev , uint8_t freq) -{ - USB_OTG_HCFG_TypeDef hcfg; - - hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); - hcfg.b.fslspclksel = freq; - USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32); -} - - -/** -* @brief USB_OTG_ReadHPRT0 : Reads HPRT0 to modify later -* @param pdev : Selected device -* @retval HPRT0 value -*/ -uint32_t USB_OTG_ReadHPRT0(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_HPRT0_TypeDef hprt0; - - hprt0.d32 = USB_OTG_READ_REG32(pdev->regs.HPRT0); - hprt0.b.prtena = 0; - hprt0.b.prtconndet = 0; - hprt0.b.prtenchng = 0; - hprt0.b.prtovrcurrchng = 0; - return hprt0.d32; -} - - -/** -* @brief USB_OTG_ReadHostAllChannels_intr : Register PCD Callbacks -* @param pdev : Selected device -* @retval Status -*/ -uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev) -{ - return (USB_OTG_READ_REG32 (&pdev->regs.HREGS->HAINT)); -} - - -/** -* @brief USB_OTG_ResetPort : Reset Host Port -* @param pdev : Selected device -* @retval status -* @note : (1)The application must wait at least 10 ms (+ 10 ms security) -* before clearing the reset bit. -*/ -uint32_t USB_OTG_ResetPort(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_HPRT0_TypeDef hprt0; - - hprt0.d32 = USB_OTG_ReadHPRT0(pdev); - hprt0.b.prtrst = 1; - USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); - USB_OTG_BSP_mDelay (10); /* See Note #1 */ - hprt0.b.prtrst = 0; - USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); - USB_OTG_BSP_mDelay (20); - return 1; -} - - -/** -* @brief USB_OTG_HC_Init : Prepares a host channel for transferring packets -* @param pdev : Selected device -* @param hc_num : channel number -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_HC_Init(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) -{ - USB_OTG_STS status = USB_OTG_OK; - uint32_t intr_enable = 0; - USB_OTG_HCGINTMSK_TypeDef hcintmsk; - USB_OTG_GINTMSK_TypeDef gintmsk; - USB_OTG_HCCHAR_TypeDef hcchar; - USB_OTG_HCINTn_TypeDef hcint; - - - gintmsk.d32 = 0; - hcintmsk.d32 = 0; - hcchar.d32 = 0; - - /* Clear old interrupt conditions for this host channel. */ - hcint.d32 = 0xFFFFFFFF; - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCINT, hcint.d32); - - /* Enable channel interrupts required for this transfer. */ - hcintmsk.d32 = 0; - - if (pdev->cfg.dma_enable == 1) - { - hcintmsk.b.ahberr = 1; - } - - switch (pdev->host.hc[hc_num].ep_type) - { - case EP_TYPE_CTRL: - case EP_TYPE_BULK: - hcintmsk.b.xfercompl = 1; - hcintmsk.b.stall = 1; - hcintmsk.b.xacterr = 1; - hcintmsk.b.datatglerr = 1; - hcintmsk.b.nak = 1; - if (pdev->host.hc[hc_num].ep_is_in) - { - hcintmsk.b.bblerr = 1; - } - else - { - hcintmsk.b.nyet = 1; - if (pdev->host.hc[hc_num].do_ping) - { - hcintmsk.b.ack = 1; - } - } - break; - case EP_TYPE_INTR: - hcintmsk.b.xfercompl = 1; - hcintmsk.b.nak = 1; - hcintmsk.b.stall = 1; - hcintmsk.b.xacterr = 1; - hcintmsk.b.datatglerr = 1; - hcintmsk.b.frmovrun = 1; - - if (pdev->host.hc[hc_num].ep_is_in) - { - hcintmsk.b.bblerr = 1; - } - - break; - case EP_TYPE_ISOC: - hcintmsk.b.xfercompl = 1; - hcintmsk.b.frmovrun = 1; - hcintmsk.b.ack = 1; - - if (pdev->host.hc[hc_num].ep_is_in) - { - hcintmsk.b.xacterr = 1; - hcintmsk.b.bblerr = 1; - } - break; - } - - - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCGINTMSK, hcintmsk.d32); - - - /* Enable the top level host channel interrupt. */ - intr_enable = (1 << hc_num); - USB_OTG_MODIFY_REG32(&pdev->regs.HREGS->HAINTMSK, 0, intr_enable); - - /* Make sure host channel interrupts are enabled. */ - gintmsk.b.hcintr = 1; - USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, 0, gintmsk.d32); - - /* Program the HCCHAR register */ - hcchar.d32 = 0; - hcchar.b.devaddr = pdev->host.hc[hc_num].dev_addr; - hcchar.b.epnum = pdev->host.hc[hc_num].ep_num; - hcchar.b.epdir = pdev->host.hc[hc_num].ep_is_in; - hcchar.b.lspddev = (pdev->host.hc[hc_num].speed == HPRT0_PRTSPD_LOW_SPEED); - hcchar.b.eptype = pdev->host.hc[hc_num].ep_type; - hcchar.b.mps = pdev->host.hc[hc_num].max_packet; - if (pdev->host.hc[hc_num].ep_type == HCCHAR_INTR) - { - hcchar.b.oddfrm = 1; - } - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); - return status; -} - - -/** -* @brief USB_OTG_HC_StartXfer : Start transfer -* @param pdev : Selected device -* @param hc_num : channel number -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_HC_StartXfer(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_HCCHAR_TypeDef hcchar; - USB_OTG_HCTSIZn_TypeDef hctsiz; - USB_OTG_HNPTXSTS_TypeDef hnptxsts; - USB_OTG_HPTXSTS_TypeDef hptxsts; - USB_OTG_GINTMSK_TypeDef intmsk; - uint16_t len_words = 0; - - uint16_t num_packets; - uint16_t max_hc_pkt_count; - - max_hc_pkt_count = 256; - hctsiz.d32 = 0; - hcchar.d32 = 0; - intmsk.d32 = 0; - - /* Compute the expected number of packets associated to the transfer */ - if (pdev->host.hc[hc_num].xfer_len > 0) - { - num_packets = (pdev->host.hc[hc_num].xfer_len + \ - pdev->host.hc[hc_num].max_packet - 1) / pdev->host.hc[hc_num].max_packet; - - if (num_packets > max_hc_pkt_count) - { - num_packets = max_hc_pkt_count; - pdev->host.hc[hc_num].xfer_len = num_packets * \ - pdev->host.hc[hc_num].max_packet; - } - } - else - { - num_packets = 1; - } - if (pdev->host.hc[hc_num].ep_is_in) - { - pdev->host.hc[hc_num].xfer_len = num_packets * \ - pdev->host.hc[hc_num].max_packet; - } - /* Initialize the HCTSIZn register */ - hctsiz.b.xfersize = pdev->host.hc[hc_num].xfer_len; - hctsiz.b.pktcnt = num_packets; - hctsiz.b.pid = pdev->host.hc[hc_num].data_pid; - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32); - - if (pdev->cfg.dma_enable == 1) - { - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCDMA, (unsigned int)pdev->host.hc[hc_num].xfer_buff); - } - - - hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); - hcchar.b.oddfrm = USB_OTG_IsEvenFrame(pdev); - - /* Set host channel enable */ - hcchar.b.chen = 1; - hcchar.b.chdis = 0; - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); - - if (pdev->cfg.dma_enable == 0) /* Slave mode */ - { - if((pdev->host.hc[hc_num].ep_is_in == 0) && - (pdev->host.hc[hc_num].xfer_len > 0)) - { - switch(pdev->host.hc[hc_num].ep_type) - { - /* Non periodic transfer */ - case EP_TYPE_CTRL: - case EP_TYPE_BULK: - - hnptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); - len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4; - - /* check if there is enough space in FIFO space */ - if(len_words > hnptxsts.b.nptxfspcavail) - { - /* need to process data in nptxfempty interrupt */ - intmsk.b.nptxfempty = 1; - USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); - } - - break; - /* Periodic transfer */ - case EP_TYPE_INTR: - case EP_TYPE_ISOC: - hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); - len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4; - /* check if there is enough space in FIFO space */ - if(len_words > hptxsts.b.ptxfspcavail) /* split the transfer */ - { - /* need to process data in ptxfempty interrupt */ - intmsk.b.ptxfempty = 1; - USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); - } - break; - - default: - break; - } - - /* Write packet into the Tx FIFO. */ - USB_OTG_WritePacket(pdev, - pdev->host.hc[hc_num].xfer_buff , - hc_num, pdev->host.hc[hc_num].xfer_len); - } - } - return status; -} - - -/** -* @brief USB_OTG_HC_Halt : Halt channel -* @param pdev : Selected device -* @param hc_num : channel number -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_HC_Halt(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_HNPTXSTS_TypeDef nptxsts; - USB_OTG_HPTXSTS_TypeDef hptxsts; - USB_OTG_HCCHAR_TypeDef hcchar; - - nptxsts.d32 = 0; - hptxsts.d32 = 0; - hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); - hcchar.b.chen = 1; - hcchar.b.chdis = 1; - - /* Check for space in the request queue to issue the halt. */ - if (hcchar.b.eptype == HCCHAR_CTRL || hcchar.b.eptype == HCCHAR_BULK) - { - nptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); - if (nptxsts.b.nptxqspcavail == 0) - { - hcchar.b.chen = 0; - } - } - else - { - hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); - if (hptxsts.b.ptxqspcavail == 0) - { - hcchar.b.chen = 0; - } - } - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); - return status; -} - -/** -* @brief Issue a ping token -* @param None -* @retval : None -*/ -USB_OTG_STS USB_OTG_HC_DoPing(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_HCCHAR_TypeDef hcchar; - USB_OTG_HCTSIZn_TypeDef hctsiz; - - hctsiz.d32 = 0; - hctsiz.b.dopng = 1; - hctsiz.b.pktcnt = 1; - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32); - - hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); - hcchar.b.chen = 1; - hcchar.b.chdis = 0; - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); - return status; -} - -/** -* @brief Stop the device and clean up fifo's -* @param None -* @retval : None -*/ -void USB_OTG_StopHost(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_HCCHAR_TypeDef hcchar; - uint32_t i; - - USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINTMSK , 0); - USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINT, 0xFFFFFFFF); - /* Flush out any leftover queued requests. */ - - for (i = 0; i < pdev->cfg.host_channels; i++) - { - hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[i]->HCCHAR); - hcchar.b.chen = 0; - hcchar.b.chdis = 1; - hcchar.b.epdir = 0; - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[i]->HCCHAR, hcchar.d32); - } - - /* Flush the FIFO */ - USB_OTG_FlushRxFifo(pdev); - USB_OTG_FlushTxFifo(pdev , 0x10 ); -} -#endif -#ifdef USE_DEVICE_MODE -/* PCD Core Layer */ - -/** -* @brief USB_OTG_InitDevSpeed :Initializes the DevSpd field of DCFG register -* depending the PHY type and the enumeration speed of the device. -* @param pdev : Selected device -* @retval : None -*/ -void USB_OTG_InitDevSpeed(USB_OTG_CORE_HANDLE *pdev , uint8_t speed) -{ - USB_OTG_DCFG_TypeDef dcfg; - - dcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCFG); - dcfg.b.devspd = speed; - USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCFG, dcfg.d32); -} - - -/** -* @brief USB_OTG_CoreInitDev : Initializes the USB_OTG controller registers -* for device mode -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_DEPCTL_TypeDef depctl; - uint32_t i; - USB_OTG_DCFG_TypeDef dcfg; - USB_OTG_FSIZ_TypeDef nptxfifosize; - USB_OTG_FSIZ_TypeDef txfifosize; - USB_OTG_DIEPMSK_TypeDef msk; - USB_OTG_DTHRCTL_TypeDef dthrctl; - - depctl.d32 = 0; - dcfg.d32 = 0; - nptxfifosize.d32 = 0; - txfifosize.d32 = 0; - msk.d32 = 0; - - /* Restart the Phy Clock */ - USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0); - /* Device configuration register */ - dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); - dcfg.b.perfrint = DCFG_FRAME_INTERVAL_80; - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32 ); - -#ifdef USB_OTG_FS_CORE - if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID ) - { - - /* Set Full speed phy */ - USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_FULL); - - /* set Rx FIFO size */ - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_FS_SIZE); - - /* EP0 TX*/ - nptxfifosize.b.depth = TX0_FIFO_FS_SIZE; - nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 ); - - - /* EP1 TX*/ - txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; - txfifosize.b.depth = TX1_FIFO_FS_SIZE; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 ); - - - /* EP2 TX*/ - txfifosize.b.startaddr += txfifosize.b.depth; - txfifosize.b.depth = TX2_FIFO_FS_SIZE; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 ); - - - /* EP3 TX*/ - txfifosize.b.startaddr += txfifosize.b.depth; - txfifosize.b.depth = TX3_FIFO_FS_SIZE; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 ); - } -#endif -#ifdef USB_OTG_HS_CORE - if(pdev->cfg.coreID == USB_OTG_HS_CORE_ID ) - { - - /* Set High speed phy */ - - if(pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) - { - USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_HIGH); - } - else /* set High speed phy in Full speed mode */ - { - USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_HIGH_IN_FULL); - } - - /* set Rx FIFO size */ - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE); - - /* EP0 TX*/ - nptxfifosize.b.depth = TX0_FIFO_HS_SIZE; - nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 ); - - - /* EP1 TX*/ - txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; - txfifosize.b.depth = TX1_FIFO_HS_SIZE; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 ); - - - /* EP2 TX*/ - txfifosize.b.startaddr += txfifosize.b.depth; - txfifosize.b.depth = TX2_FIFO_HS_SIZE; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 ); - - - /* EP3 TX*/ - txfifosize.b.startaddr += txfifosize.b.depth; - txfifosize.b.depth = TX3_FIFO_HS_SIZE; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 ); - - /* EP4 TX*/ - txfifosize.b.startaddr += txfifosize.b.depth; - txfifosize.b.depth = TX4_FIFO_HS_SIZE; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[3], txfifosize.d32 ); - - - /* EP5 TX*/ - txfifosize.b.startaddr += txfifosize.b.depth; - txfifosize.b.depth = TX5_FIFO_HS_SIZE; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[4], txfifosize.d32 ); - } -#endif - /* Flush the FIFOs */ - USB_OTG_FlushTxFifo(pdev , 0x10); /* all Tx FIFOs */ - USB_OTG_FlushRxFifo(pdev); - /* Clear all pending Device Interrupts */ - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 ); - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 ); - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 ); - - for (i = 0; i < pdev->cfg.dev_endpoints; i++) - { - depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[i]->DIEPCTL); - if (depctl.b.epena) - { - depctl.d32 = 0; - depctl.b.epdis = 1; - depctl.b.snak = 1; - } - else - { - depctl.d32 = 0; - } - USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPCTL, depctl.d32); - USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPTSIZ, 0); - USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); - } - for (i = 0; i < pdev->cfg.dev_endpoints; i++) - { - USB_OTG_DEPCTL_TypeDef depctl; - depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[i]->DOEPCTL); - if (depctl.b.epena) - { - depctl.d32 = 0; - depctl.b.epdis = 1; - depctl.b.snak = 1; - } - else - { - depctl.d32 = 0; - } - USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPCTL, depctl.d32); - USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPTSIZ, 0); - USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); - } - msk.d32 = 0; - msk.b.txfifoundrn = 1; - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPMSK, msk.d32, msk.d32); - - if (pdev->cfg.dma_enable == 1) - { - dthrctl.d32 = 0; - dthrctl.b.non_iso_thr_en = 1; - dthrctl.b.iso_thr_en = 1; - dthrctl.b.tx_thr_len = 64; - dthrctl.b.rx_thr_en = 1; - dthrctl.b.rx_thr_len = 64; - USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DTHRCTL, dthrctl.d32); - } - USB_OTG_EnableDevInt(pdev); - return status; -} - - -/** -* @brief USB_OTG_EnableDevInt : Enables the Device mode interrupts -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_EnableDevInt(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_GINTMSK_TypeDef intmsk; - - intmsk.d32 = 0; - - /* Disable all interrupts. */ - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, 0); - /* Clear any pending interrupts */ - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF); - /* Enable the common interrupts */ - USB_OTG_EnableCommonInt(pdev); - - if (pdev->cfg.dma_enable == 0) - { - intmsk.b.rxstsqlvl = 1; - } - - /* Enable interrupts matching to the Device mode ONLY */ - intmsk.b.usbsuspend = 1; - intmsk.b.usbreset = 1; - intmsk.b.enumdone = 1; - intmsk.b.inepintr = 1; - intmsk.b.outepintr = 1; - intmsk.b.sofintr = 1; - - intmsk.b.incomplisoin = 1; - intmsk.b.incomplisoout = 1; -#ifdef VBUS_SENSING_ENABLED - intmsk.b.sessreqintr = 1; - intmsk.b.otgintr = 1; -#endif - USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32); - return status; -} - - -/** -* @brief USB_OTG_GetDeviceSpeed -* Get the device speed from the device status register -* @param None -* @retval status -*/ -enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_DSTS_TypeDef dsts; - enum USB_OTG_SPEED speed = USB_SPEED_UNKNOWN; - - - dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); - - switch (dsts.b.enumspd) - { - case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: - speed = USB_SPEED_HIGH; - break; - case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: - case DSTS_ENUMSPD_FS_PHY_48MHZ: - speed = USB_SPEED_FULL; - break; - - case DSTS_ENUMSPD_LS_PHY_6MHZ: - speed = USB_SPEED_LOW; - break; - } - - return speed; -} -/** -* @brief enables EP0 OUT to receive SETUP packets and configures EP0 -* for transmitting packets -* @param None -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_EP0Activate(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_DSTS_TypeDef dsts; - USB_OTG_DEPCTL_TypeDef diepctl; - USB_OTG_DCTL_TypeDef dctl; - - dctl.d32 = 0; - /* Read the Device Status and Endpoint 0 Control registers */ - dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); - diepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL); - /* Set the MPS of the IN EP based on the enumeration speed */ - switch (dsts.b.enumspd) - { - case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: - case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: - case DSTS_ENUMSPD_FS_PHY_48MHZ: - diepctl.b.mps = DEP0CTL_MPS_64; - break; - case DSTS_ENUMSPD_LS_PHY_6MHZ: - diepctl.b.mps = DEP0CTL_MPS_8; - break; - } - USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL, diepctl.d32); - dctl.b.cgnpinnak = 1; - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, dctl.d32); - return status; -} - - -/** -* @brief USB_OTG_EPActivate : Activates an EP -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_EPActivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_DEPCTL_TypeDef depctl; - USB_OTG_DAINT_TypeDef daintmsk; - __IO uint32_t *addr; - - - depctl.d32 = 0; - daintmsk.d32 = 0; - /* Read DEPCTLn register */ - if (ep->is_in == 1) - { - addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL; - daintmsk.ep.in = 1 << ep->num; - } - else - { - addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL; - daintmsk.ep.out = 1 << ep->num; - } - /* If the EP is already active don't change the EP Control - * register. */ - depctl.d32 = USB_OTG_READ_REG32(addr); - if (!depctl.b.usbactep) - { - depctl.b.mps = ep->maxpacket; - depctl.b.eptype = ep->type; - depctl.b.txfnum = ep->tx_fifo_num; - depctl.b.setd0pid = 1; - depctl.b.usbactep = 1; - USB_OTG_WRITE_REG32(addr, depctl.d32); - } - /* Enable the Interrupt for this EP */ -#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED - if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID)) - { - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, 0, daintmsk.d32); - } - else -#endif - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, 0, daintmsk.d32); - return status; -} - - -/** -* @brief USB_OTG_EPDeactivate : Deactivates an EP -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_DEPCTL_TypeDef depctl; - USB_OTG_DAINT_TypeDef daintmsk; - __IO uint32_t *addr; - - depctl.d32 = 0; - daintmsk.d32 = 0; - /* Read DEPCTLn register */ - if (ep->is_in == 1) - { - addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL; - daintmsk.ep.in = 1 << ep->num; - } - else - { - addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL; - daintmsk.ep.out = 1 << ep->num; - } - depctl.b.usbactep = 0; - USB_OTG_WRITE_REG32(addr, depctl.d32); - /* Disable the Interrupt for this EP */ - -#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED - if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID)) - { - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, daintmsk.d32, 0); - } - else -#endif - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, daintmsk.d32, 0); - return status; -} - - -/** -* @brief USB_OTG_EPStartXfer : Handle the setup for data xfer for an EP and -* starts the xfer -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_EPStartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_DEPCTL_TypeDef depctl; - USB_OTG_DEPXFRSIZ_TypeDef deptsiz; - USB_OTG_DSTS_TypeDef dsts; - uint32_t fifoemptymsk = 0; - - depctl.d32 = 0; - deptsiz.d32 = 0; - /* IN endpoint */ - if (ep->is_in == 1) - { - depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPCTL)); - deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ)); - /* Zero Length Packet? */ - if (ep->xfer_len == 0) - { - deptsiz.b.xfersize = 0; - deptsiz.b.pktcnt = 1; - } - else - { - /* Program the transfer size and packet count - * as follows: xfersize = N * maxpacket + - * short_packet pktcnt = N + (short_packet - * exist ? 1 : 0) - */ - deptsiz.b.xfersize = ep->xfer_len; - deptsiz.b.pktcnt = (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket; - - if (ep->type == EP_TYPE_ISOC) - { - deptsiz.b.mc = 1; - } - } - USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ, deptsiz.d32); - - if (pdev->cfg.dma_enable == 1) - { - USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr); - } - else - { - if (ep->type != EP_TYPE_ISOC) - { - /* Enable the Tx FIFO Empty Interrupt for this EP */ - if (ep->xfer_len > 0) - { - fifoemptymsk = 1 << ep->num; - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk); - } - } - } - - - if (ep->type == EP_TYPE_ISOC) - { - dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); - - if (((dsts.b.soffn)&0x1) == 0) - { - depctl.b.setd1pid = 1; - } - else - { - depctl.b.setd0pid = 1; - } - } - - /* EP enable, IN data in FIFO */ - depctl.b.cnak = 1; - depctl.b.epena = 1; - USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPCTL, depctl.d32); - - if (ep->type == EP_TYPE_ISOC) - { - USB_OTG_WritePacket(pdev, ep->xfer_buff, ep->num, ep->xfer_len); - } - } - else - { - /* OUT endpoint */ - depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL)); - deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ)); - /* Program the transfer size and packet count as follows: - * pktcnt = N - * xfersize = N * maxpacket - */ - if (ep->xfer_len == 0) - { - deptsiz.b.xfersize = ep->maxpacket; - deptsiz.b.pktcnt = 1; - } - else - { - deptsiz.b.pktcnt = (ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket; - deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; - } - USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32); - - if (pdev->cfg.dma_enable == 1) - { - USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPDMA, ep->dma_addr); - } - - if (ep->type == EP_TYPE_ISOC) - { - if (ep->even_odd_frame) - { - depctl.b.setd1pid = 1; - } - else - { - depctl.b.setd0pid = 1; - } - } - /* EP enable */ - depctl.b.cnak = 1; - depctl.b.epena = 1; - USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL, depctl.d32); - } - return status; -} - - -/** -* @brief USB_OTG_EP0StartXfer : Handle the setup for a data xfer for EP0 and -* starts the xfer -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_DEPCTL_TypeDef depctl; - USB_OTG_DEP0XFRSIZ_TypeDef deptsiz; - USB_OTG_INEPREGS *in_regs; - uint32_t fifoemptymsk = 0; - - depctl.d32 = 0; - deptsiz.d32 = 0; - /* IN endpoint */ - if (ep->is_in == 1) - { - in_regs = pdev->regs.INEP_REGS[0]; - depctl.d32 = USB_OTG_READ_REG32(&in_regs->DIEPCTL); - deptsiz.d32 = USB_OTG_READ_REG32(&in_regs->DIEPTSIZ); - /* Zero Length Packet? */ - if (ep->xfer_len == 0) - { - deptsiz.b.xfersize = 0; - deptsiz.b.pktcnt = 1; - - } - else - { - if (ep->xfer_len > ep->maxpacket) - { - ep->xfer_len = ep->maxpacket; - deptsiz.b.xfersize = ep->maxpacket; - } - else - { - deptsiz.b.xfersize = ep->xfer_len; - } - deptsiz.b.pktcnt = 1; - } - USB_OTG_WRITE_REG32(&in_regs->DIEPTSIZ, deptsiz.d32); - - if (pdev->cfg.dma_enable == 1) - { - USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr); - } - - /* EP enable, IN data in FIFO */ - depctl.b.cnak = 1; - depctl.b.epena = 1; - USB_OTG_WRITE_REG32(&in_regs->DIEPCTL, depctl.d32); - - - - if (pdev->cfg.dma_enable == 0) - { - /* Enable the Tx FIFO Empty Interrupt for this EP */ - if (ep->xfer_len > 0) - { - { - fifoemptymsk |= 1 << ep->num; - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk); - } - } - } - } - else - { - /* OUT endpoint */ - depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); - deptsiz.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ); - /* Program the transfer size and packet count as follows: - * xfersize = N * (maxpacket + 4 - (maxpacket % 4)) - * pktcnt = N */ - if (ep->xfer_len == 0) - { - deptsiz.b.xfersize = ep->maxpacket; - deptsiz.b.pktcnt = 1; - } - else - { - ep->xfer_len = ep->maxpacket; - deptsiz.b.xfersize = ep->maxpacket; - deptsiz.b.pktcnt = 1; - } - USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32); - if (pdev->cfg.dma_enable == 1) - { - USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPDMA, ep->dma_addr); - } - /* EP enable */ - depctl.b.cnak = 1; - depctl.b.epena = 1; - USB_OTG_WRITE_REG32 (&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL), depctl.d32); - - } - return status; -} - - -/** -* @brief USB_OTG_EPSetStall : Set the EP STALL -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_EPSetStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_DEPCTL_TypeDef depctl; - __IO uint32_t *depctl_addr; - - depctl.d32 = 0; - if (ep->is_in == 1) - { - depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); - depctl.d32 = USB_OTG_READ_REG32(depctl_addr); - /* set the disable and stall bits */ - if (depctl.b.epena) - { - depctl.b.epdis = 1; - } - depctl.b.stall = 1; - USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); - } - else - { - depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); - depctl.d32 = USB_OTG_READ_REG32(depctl_addr); - /* set the stall bit */ - depctl.b.stall = 1; - USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); - } - return status; -} - - -/** -* @brief Clear the EP STALL -* @param pdev : Selected device -* @retval USB_OTG_STS : status -*/ -USB_OTG_STS USB_OTG_EPClearStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) -{ - USB_OTG_STS status = USB_OTG_OK; - USB_OTG_DEPCTL_TypeDef depctl; - __IO uint32_t *depctl_addr; - - depctl.d32 = 0; - - if (ep->is_in == 1) - { - depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); - } - else - { - depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); - } - depctl.d32 = USB_OTG_READ_REG32(depctl_addr); - /* clear the stall bits */ - depctl.b.stall = 0; - if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK) - { - depctl.b.setd0pid = 1; /* DATA0 */ - } - USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); - return status; -} - - -/** -* @brief USB_OTG_ReadDevAllOutEp_itr : returns OUT endpoint interrupt bits -* @param pdev : Selected device -* @retval OUT endpoint interrupt bits -*/ -uint32_t USB_OTG_ReadDevAllOutEp_itr(USB_OTG_CORE_HANDLE *pdev) -{ - uint32_t v; - v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT); - v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK); - return ((v & 0xffff0000) >> 16); -} - - -/** -* @brief USB_OTG_ReadDevOutEP_itr : returns Device OUT EP Interrupt register -* @param pdev : Selected device -* @param ep : end point number -* @retval Device OUT EP Interrupt register -*/ -uint32_t USB_OTG_ReadDevOutEP_itr(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) -{ - uint32_t v; - v = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT); - v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOEPMSK); - return v; -} - - -/** -* @brief USB_OTG_ReadDevAllInEPItr : Get int status register -* @param pdev : Selected device -* @retval int status register -*/ -uint32_t USB_OTG_ReadDevAllInEPItr(USB_OTG_CORE_HANDLE *pdev) -{ - uint32_t v; - v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT); - v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK); - return (v & 0xffff); -} - -/** -* @brief configures EPO to receive SETUP packets -* @param None -* @retval : None -*/ -void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_DEP0XFRSIZ_TypeDef doeptsize0; - doeptsize0.d32 = 0; - doeptsize0.b.supcnt = 3; - doeptsize0.b.pktcnt = 1; - doeptsize0.b.xfersize = 8 * 3; - USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPTSIZ, doeptsize0.d32 ); - - if (pdev->cfg.dma_enable == 1) - { - USB_OTG_DEPCTL_TypeDef doepctl; - doepctl.d32 = 0; - USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPDMA, - (uint32_t)&pdev->dev.setup_packet); - - /* EP enable */ - doepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[0]->DOEPCTL); - doepctl.b.epena = 1; - doepctl.d32 = 0x80008000; - USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPCTL, doepctl.d32); - } -} - -/** -* @brief USB_OTG_RemoteWakeup : active remote wakeup signalling -* @param None -* @retval : None -*/ -void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev) -{ - - USB_OTG_DCTL_TypeDef dctl; - USB_OTG_DSTS_TypeDef dsts; - USB_OTG_PCGCCTL_TypeDef power; - - if (pdev->dev.DevRemoteWakeup) - { - dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); - if(dsts.b.suspsts == 1) - { - if(pdev->cfg.low_power) - { - /* un-gate USB Core clock */ - power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); - power.b.gatehclk = 0; - power.b.stoppclk = 0; - USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); - } - /* active Remote wakeup signaling */ - dctl.d32 = 0; - dctl.b.rmtwkupsig = 1; - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, 0, dctl.d32); - USB_OTG_BSP_mDelay(5); - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 ); - } - } -} - - -/** -* @brief USB_OTG_UngateClock : active USB Core clock -* @param None -* @retval : None -*/ -void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev) -{ - if(pdev->cfg.low_power) - { - - USB_OTG_DSTS_TypeDef dsts; - USB_OTG_PCGCCTL_TypeDef power; - - dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); - - if(dsts.b.suspsts == 1) - { - /* un-gate USB Core clock */ - power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); - power.b.gatehclk = 0; - power.b.stoppclk = 0; - USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); - - } - } -} - -/** -* @brief Stop the device and clean up fifo's -* @param None -* @retval : None -*/ -void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev) -{ - uint32_t i; - - pdev->dev.device_status = 1; - - for (i = 0; i < pdev->cfg.dev_endpoints ; i++) - { - USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); - USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); - } - - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 ); - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 ); - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 ); - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); - - /* Flush the FIFO */ - USB_OTG_FlushRxFifo(pdev); - USB_OTG_FlushTxFifo(pdev , 0x10 ); -} - -/** -* @brief returns the EP Status -* @param pdev : Selected device -* ep : endpoint structure -* @retval : EP status -*/ - -uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep) -{ - USB_OTG_DEPCTL_TypeDef depctl; - __IO uint32_t *depctl_addr; - uint32_t Status = 0; - - depctl.d32 = 0; - if (ep->is_in == 1) - { - depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); - depctl.d32 = USB_OTG_READ_REG32(depctl_addr); - - if (depctl.b.stall == 1) - Status = USB_OTG_EP_TX_STALL; - else if (depctl.b.naksts == 1) - Status = USB_OTG_EP_TX_NAK; - else - Status = USB_OTG_EP_TX_VALID; - - } - else - { - depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); - depctl.d32 = USB_OTG_READ_REG32(depctl_addr); - if (depctl.b.stall == 1) - Status = USB_OTG_EP_RX_STALL; - else if (depctl.b.naksts == 1) - Status = USB_OTG_EP_RX_NAK; - else - Status = USB_OTG_EP_RX_VALID; - } - - /* Return the current status */ - return Status; -} - -/** -* @brief Set the EP Status -* @param pdev : Selected device -* Status : new Status -* ep : EP structure -* @retval : None -*/ -void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status) -{ - USB_OTG_DEPCTL_TypeDef depctl; - __IO uint32_t *depctl_addr; - - depctl.d32 = 0; - - /* Process for IN endpoint */ - if (ep->is_in == 1) - { - depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); - depctl.d32 = USB_OTG_READ_REG32(depctl_addr); - - if (Status == USB_OTG_EP_TX_STALL) - { - USB_OTG_EPSetStall(pdev, ep); return; - } - else if (Status == USB_OTG_EP_TX_NAK) - depctl.b.snak = 1; - else if (Status == USB_OTG_EP_TX_VALID) - { - if (depctl.b.stall == 1) - { - ep->even_odd_frame = 0; - USB_OTG_EPClearStall(pdev, ep); - return; - } - depctl.b.cnak = 1; - depctl.b.usbactep = 1; - depctl.b.epena = 1; - } - else if (Status == USB_OTG_EP_TX_DIS) - depctl.b.usbactep = 0; - } - else /* Process for OUT endpoint */ - { - depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); - depctl.d32 = USB_OTG_READ_REG32(depctl_addr); - - if (Status == USB_OTG_EP_RX_STALL) { - depctl.b.stall = 1; - } - else if (Status == USB_OTG_EP_RX_NAK) - depctl.b.snak = 1; - else if (Status == USB_OTG_EP_RX_VALID) - { - if (depctl.b.stall == 1) - { - ep->even_odd_frame = 0; - USB_OTG_EPClearStall(pdev, ep); - return; - } - depctl.b.cnak = 1; - depctl.b.usbactep = 1; - depctl.b.epena = 1; - } - else if (Status == USB_OTG_EP_RX_DIS) - { - depctl.b.usbactep = 0; - } - } - - USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); -} - -#endif -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_otg/src/usb_dcd.c b/car_hw/src/lib/usb_otg/src/usb_dcd.c deleted file mode 100644 index 0c5fef71ba3..00000000000 --- a/car_hw/src/lib/usb_otg/src/usb_dcd.c +++ /dev/null @@ -1,475 +0,0 @@ -/** - ****************************************************************************** - * @file usb_dcd.c - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief Peripheral Device Interface Layer - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -#include "usb_conf.h" -#ifdef USE_DEVICE_MODE -/* Includes ------------------------------------------------------------------*/ -#include "usb_dcd.h" -#include "usb_bsp.h" - - -/** @addtogroup USB_OTG_DRIVER -* @{ -*/ - -/** @defgroup USB_DCD -* @brief This file is the interface between EFSL ans Host mass-storage class -* @{ -*/ - - -/** @defgroup USB_DCD_Private_Defines -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USB_DCD_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - - - -/** @defgroup USB_DCD_Private_Macros -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USB_DCD_Private_Variables -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USB_DCD_Private_FunctionPrototypes -* @{ -*/ - -/** -* @} -*/ - - -/** @defgroup USB_DCD_Private_Functions -* @{ -*/ - - - -void DCD_Init(USB_OTG_CORE_HANDLE *pdev , - USB_OTG_CORE_ID_TypeDef coreID) -{ - uint32_t i; - USB_OTG_EP *ep; - - USB_OTG_SelectCore (pdev , coreID); - - pdev->dev.device_status = USB_OTG_DEFAULT; - pdev->dev.device_address = 0; - - /* Init ep structure */ - for (i = 0; i < pdev->cfg.dev_endpoints ; i++) - { - ep = &pdev->dev.in_ep[i]; - /* Init ep structure */ - ep->is_in = 1; - ep->num = i; - ep->tx_fifo_num = i; - /* Control until ep is actvated */ - ep->type = EP_TYPE_CTRL; - ep->maxpacket = USB_OTG_MAX_EP0_SIZE; - ep->xfer_buff = 0; - ep->xfer_len = 0; - } - - for (i = 0; i < pdev->cfg.dev_endpoints; i++) - { - ep = &pdev->dev.out_ep[i]; - /* Init ep structure */ - ep->is_in = 0; - ep->num = i; - ep->tx_fifo_num = i; - /* Control until ep is activated */ - ep->type = EP_TYPE_CTRL; - ep->maxpacket = USB_OTG_MAX_EP0_SIZE; - ep->xfer_buff = 0; - ep->xfer_len = 0; - } - - USB_OTG_DisableGlobalInt(pdev); - - /*Init the Core (common init.) */ - USB_OTG_CoreInit(pdev); - - - /* Force Device Mode*/ - USB_OTG_SetCurrentMode(pdev, DEVICE_MODE); - - /* Init Device */ - USB_OTG_CoreInitDev(pdev); - - - /* Enable USB Global interrupt */ - USB_OTG_EnableGlobalInt(pdev); -} - - -/** -* @brief Configure an EP -* @param pdev : Device instance -* @param epdesc : Endpoint Descriptor -* @retval : status -*/ -uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , - uint8_t ep_addr, - uint16_t ep_mps, - uint8_t ep_type) -{ - USB_OTG_EP *ep; - - if ((ep_addr & 0x80) == 0x80) - { - ep = &pdev->dev.in_ep[ep_addr & 0x7F]; - } - else - { - ep = &pdev->dev.out_ep[ep_addr & 0x7F]; - } - ep->num = ep_addr & 0x7F; - - ep->is_in = (0x80 & ep_addr) != 0; - ep->maxpacket = ep_mps; - ep->type = ep_type; - if (ep->is_in) - { - /* Assign a Tx FIFO */ - ep->tx_fifo_num = ep->num; - } - /* Set initial data PID. */ - if (ep_type == USB_OTG_EP_BULK ) - { - ep->data_pid_start = 0; - } - USB_OTG_EPActivate(pdev , ep ); - return 0; -} -/** -* @brief called when an EP is disabled -* @param pdev: device instance -* @param ep_addr: endpoint address -* @retval : status -*/ -uint32_t DCD_EP_Close(USB_OTG_CORE_HANDLE *pdev , uint8_t ep_addr) -{ - USB_OTG_EP *ep; - - if ((ep_addr&0x80) == 0x80) - { - ep = &pdev->dev.in_ep[ep_addr & 0x7F]; - } - else - { - ep = &pdev->dev.out_ep[ep_addr & 0x7F]; - } - ep->num = ep_addr & 0x7F; - ep->is_in = (0x80 & ep_addr) != 0; - USB_OTG_EPDeactivate(pdev , ep ); - return 0; -} - - -/** -* @brief DCD_EP_PrepareRx -* @param pdev: device instance -* @param ep_addr: endpoint address -* @param pbuf: pointer to Rx buffer -* @param buf_len: data length -* @retval : status -*/ -uint32_t DCD_EP_PrepareRx( USB_OTG_CORE_HANDLE *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t buf_len) -{ - USB_OTG_EP *ep; - - ep = &pdev->dev.out_ep[ep_addr & 0x7F]; - - /*setup and start the Xfer */ - ep->xfer_buff = pbuf; - ep->xfer_len = buf_len; - ep->xfer_count = 0; - ep->is_in = 0; - ep->num = ep_addr & 0x7F; - - if (pdev->cfg.dma_enable == 1) - { - ep->dma_addr = (uint32_t)pbuf; - } - - if ( ep->num == 0 ) - { - USB_OTG_EP0StartXfer(pdev , ep); - } - else - { - USB_OTG_EPStartXfer(pdev, ep ); - } - return 0; -} - -/** -* @brief Transmit data over USB -* @param pdev: device instance -* @param ep_addr: endpoint address -* @param pbuf: pointer to Tx buffer -* @param buf_len: data length -* @retval : status -*/ -uint32_t DCD_EP_Tx ( USB_OTG_CORE_HANDLE *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint32_t buf_len) -{ - USB_OTG_EP *ep; - - ep = &pdev->dev.in_ep[ep_addr & 0x7F]; - - /* Setup and start the Transfer */ - ep->is_in = 1; - ep->num = ep_addr & 0x7F; - ep->xfer_buff = pbuf; - ep->dma_addr = (uint32_t)pbuf; - ep->xfer_count = 0; - ep->xfer_len = buf_len; - - if ( ep->num == 0 ) - { - USB_OTG_EP0StartXfer(pdev , ep); - } - else - { - USB_OTG_EPStartXfer(pdev, ep ); - } - return 0; -} - - -/** -* @brief Stall an endpoint. -* @param pdev: device instance -* @param epnum: endpoint address -* @retval : status -*/ -uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) -{ - USB_OTG_EP *ep; - if ((0x80 & epnum) == 0x80) - { - ep = &pdev->dev.in_ep[epnum & 0x7F]; - } - else - { - ep = &pdev->dev.out_ep[epnum]; - } - - ep->is_stall = 1; - ep->num = epnum & 0x7F; - ep->is_in = ((epnum & 0x80) == 0x80); - - USB_OTG_EPSetStall(pdev , ep); - return (0); -} - - -/** -* @brief Clear stall condition on endpoints. -* @param pdev: device instance -* @param epnum: endpoint address -* @retval : status -*/ -uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) -{ - USB_OTG_EP *ep; - if ((0x80 & epnum) == 0x80) - { - ep = &pdev->dev.in_ep[epnum & 0x7F]; - } - else - { - ep = &pdev->dev.out_ep[epnum]; - } - - ep->is_stall = 0; - ep->num = epnum & 0x7F; - ep->is_in = ((epnum & 0x80) == 0x80); - - USB_OTG_EPClearStall(pdev , ep); - return (0); -} - - -/** -* @brief This Function flushes the FIFOs. -* @param pdev: device instance -* @param epnum: endpoint address -* @retval : status -*/ -uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) -{ - - if ((epnum & 0x80) == 0x80) - { - USB_OTG_FlushTxFifo(pdev, epnum & 0x7F); - } - else - { - USB_OTG_FlushRxFifo(pdev); - } - - return (0); -} - - -/** -* @brief This Function set USB device address -* @param pdev: device instance -* @param address: new device address -* @retval : status -*/ -void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, uint8_t address) -{ - USB_OTG_DCFG_TypeDef dcfg; - dcfg.d32 = 0; - dcfg.b.devaddr = address; - USB_OTG_MODIFY_REG32( &pdev->regs.DREGS->DCFG, 0, dcfg.d32); -} - -/** -* @brief Connect device (enable internal pull-up) -* @param pdev: device instance -* @retval : None -*/ -void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev) -{ -#ifndef USE_OTG_MODE - USB_OTG_DCTL_TypeDef dctl; - dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); - /* Connect device */ - dctl.b.sftdiscon = 0; - USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); - USB_OTG_BSP_mDelay(3); -#endif -} - - -/** -* @brief Disconnect device (disable internal pull-up) -* @param pdev: device instance -* @retval : None -*/ -void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev) -{ -#ifndef USE_OTG_MODE - USB_OTG_DCTL_TypeDef dctl; - dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); - /* Disconnect device for 3ms */ - dctl.b.sftdiscon = 1; - USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); - USB_OTG_BSP_mDelay(3); -#endif -} - - -/** -* @brief returns the EP Status -* @param pdev : Selected device -* epnum : endpoint address -* @retval : EP status -*/ - -uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,uint8_t epnum) -{ - USB_OTG_EP *ep; - uint32_t Status = 0; - - if ((0x80 & epnum) == 0x80) - { - ep = &pdev->dev.in_ep[epnum & 0x7F]; - } - else - { - ep = &pdev->dev.out_ep[epnum]; - } - - Status = USB_OTG_GetEPStatus(pdev ,ep); - - /* Return the current status */ - return Status; -} - -/** -* @brief Set the EP Status -* @param pdev : Selected device -* Status : new Status -* epnum : EP address -* @retval : None -*/ -void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum , uint32_t Status) -{ - USB_OTG_EP *ep; - - if ((0x80 & epnum) == 0x80) - { - ep = &pdev->dev.in_ep[epnum & 0x7F]; - } - else - { - ep = &pdev->dev.out_ep[epnum]; - } - - USB_OTG_SetEPStatus(pdev ,ep , Status); -} - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ -#endif - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_otg/src/usb_dcd_int.c b/car_hw/src/lib/usb_otg/src/usb_dcd_int.c deleted file mode 100644 index 565c00a1bd1..00000000000 --- a/car_hw/src/lib/usb_otg/src/usb_dcd_int.c +++ /dev/null @@ -1,889 +0,0 @@ -/** - ****************************************************************************** - * @file usb_dcd_int.c - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief Peripheral Device interrupt subroutines - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -#include "usb_conf.h" -#ifdef USE_DEVICE_MODE -/* Includes ------------------------------------------------------------------*/ -#include "usb_dcd_int.h" -/** @addtogroup USB_OTG_DRIVER -* @{ -*/ - -/** @defgroup USB_DCD_INT -* @brief This file contains the interrupt subroutines for the Device mode. -* @{ -*/ - - -/** @defgroup USB_DCD_INT_Private_Defines -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USB_DCD_INT_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - - - -/** @defgroup USB_DCD_INT_Private_Macros -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USB_DCD_INT_Private_Variables -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USB_DCD_INT_Private_FunctionPrototypes -* @{ -*/ -/* static functions */ -static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum); - -/* Interrupt Handlers */ -static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev); -static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev); -static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev); - -static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev); -static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev , uint32_t epnum); - -static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev); -static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev); -static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev); -static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev); - -static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev); -static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev); -#ifdef VBUS_SENSING_ENABLED -static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev); -static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev); -#endif - -/** -* @} -*/ - - -/** @defgroup USB_DCD_INT_Private_Functions -* @{ -*/ - - -#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED -/** -* @brief USBD_OTG_EP1OUT_ISR_Handler -* handles all USB Interrupts -* @param pdev: device instance -* @retval status -*/ -uint32_t USBD_OTG_EP1OUT_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) -{ - - USB_OTG_DOEPINTn_TypeDef doepint; - USB_OTG_DEPXFRSIZ_TypeDef deptsiz; - - doepint.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[1]->DOEPINT); - doepint.d32&= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOUTEP1MSK); - - /* Transfer complete */ - if ( doepint.b.xfercompl ) - { - /* Clear the bit in DOEPINTn for this interrupt */ - CLEAR_OUT_EP_INTR(1, xfercompl); - if (pdev->cfg.dma_enable == 1) - { - deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[1]->DOEPTSIZ)); - /*ToDo : handle more than one single MPS size packet */ - pdev->dev.out_ep[1].xfer_count = pdev->dev.out_ep[1].maxpacket - \ - deptsiz.b.xfersize; - } - /* Inform upper layer: data ready */ - /* RX COMPLETE */ - USBD_DCD_INT_fops->DataOutStage(pdev , 1); - - } - - /* Endpoint disable */ - if ( doepint.b.epdisabled ) - { - /* Clear the bit in DOEPINTn for this interrupt */ - CLEAR_OUT_EP_INTR(1, epdisabled); - } - /* AHB Error */ - if ( doepint.b.ahberr ) - { - CLEAR_OUT_EP_INTR(1, ahberr); - } - return 1; -} - -/** -* @brief USBD_OTG_EP1IN_ISR_Handler -* handles all USB Interrupts -* @param pdev: device instance -* @retval status -*/ -uint32_t USBD_OTG_EP1IN_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) -{ - - USB_OTG_DIEPINTn_TypeDef diepint; - uint32_t fifoemptymsk, msk, emp; - - msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DINEP1MSK); - emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); - msk |= ((emp >> 1 ) & 0x1) << 7; - diepint.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[1]->DIEPINT) & msk; - - if ( diepint.b.xfercompl ) - { - fifoemptymsk = 0x1 << 1; - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); - CLEAR_IN_EP_INTR(1, xfercompl); - /* TX COMPLETE */ - USBD_DCD_INT_fops->DataInStage(pdev , 1); - } - if ( diepint.b.ahberr ) - { - CLEAR_IN_EP_INTR(1, ahberr); - } - if ( diepint.b.epdisabled ) - { - CLEAR_IN_EP_INTR(1, epdisabled); - } - if ( diepint.b.timeout ) - { - CLEAR_IN_EP_INTR(1, timeout); - } - if (diepint.b.intktxfemp) - { - CLEAR_IN_EP_INTR(1, intktxfemp); - } - if (diepint.b.intknepmis) - { - CLEAR_IN_EP_INTR(1, intknepmis); - } - if (diepint.b.inepnakeff) - { - CLEAR_IN_EP_INTR(1, inepnakeff); - } - if (diepint.b.emptyintr) - { - DCD_WriteEmptyTxFifo(pdev , 1); - CLEAR_IN_EP_INTR(1, emptyintr); - } - return 1; -} -#endif - -/** -* @brief STM32_USBF_OTG_ISR_Handler -* handles all USB Interrupts -* @param pdev: device instance -* @retval status -*/ -uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTSTS_TypeDef gintr_status; - uint32_t retval = 0; - - if (USB_OTG_IsDeviceMode(pdev)) /* ensure that we are in device mode */ - { - gintr_status.d32 = USB_OTG_ReadCoreItr(pdev); - if (!gintr_status.d32) /* avoid spurious interrupt */ - { - return 0; - } - - if (gintr_status.b.outepintr) - { - retval |= DCD_HandleOutEP_ISR(pdev); - } - - if (gintr_status.b.inepint) - { - retval |= DCD_HandleInEP_ISR(pdev); - } - - if (gintr_status.b.modemismatch) - { - USB_OTG_GINTSTS_TypeDef gintsts; - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.modemismatch = 1; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); - } - - if (gintr_status.b.wkupintr) - { - retval |= DCD_HandleResume_ISR(pdev); - } - - if (gintr_status.b.usbsuspend) - { - retval |= DCD_HandleUSBSuspend_ISR(pdev); - } - if (gintr_status.b.sofintr) - { - retval |= DCD_HandleSof_ISR(pdev); - - } - - if (gintr_status.b.rxstsqlvl) - { - retval |= DCD_HandleRxStatusQueueLevel_ISR(pdev); - - } - - if (gintr_status.b.usbreset) - { - retval |= DCD_HandleUsbReset_ISR(pdev); - - } - if (gintr_status.b.enumdone) - { - retval |= DCD_HandleEnumDone_ISR(pdev); - } - - if (gintr_status.b.incomplisoin) - { - retval |= DCD_IsoINIncomplete_ISR(pdev); - } - - if (gintr_status.b.incomplisoout) - { - retval |= DCD_IsoOUTIncomplete_ISR(pdev); - } -#ifdef VBUS_SENSING_ENABLED - if (gintr_status.b.sessreqintr) - { - retval |= DCD_SessionRequest_ISR(pdev); - } - - if (gintr_status.b.otgintr) - { - retval |= DCD_OTG_ISR(pdev); - } -#endif - } - return retval; -} - -#ifdef VBUS_SENSING_ENABLED -/** -* @brief DCD_SessionRequest_ISR -* Indicates that the USB_OTG controller has detected a connection -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTSTS_TypeDef gintsts; - USBD_DCD_INT_fops->DevConnected (pdev); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.sessreqintr = 1; - USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); - return 1; -} - -/** -* @brief DCD_OTG_ISR -* Indicates that the USB_OTG controller has detected an OTG event: -* used to detect the end of session i.e. disconnection -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev) -{ - - USB_OTG_GOTGINT_TypeDef gotgint; - - gotgint.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GOTGINT); - - if (gotgint.b.sesenddet) - { - USBD_DCD_INT_fops->DevDisconnected (pdev); - } - /* Clear OTG interrupt */ - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GOTGINT, gotgint.d32); - return 1; -} -#endif -/** -* @brief DCD_HandleResume_ISR -* Indicates that the USB_OTG controller has detected a resume or -* remote Wake-up sequence -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTSTS_TypeDef gintsts; - USB_OTG_DCTL_TypeDef devctl; - USB_OTG_PCGCCTL_TypeDef power; - - if(pdev->cfg.low_power) - { - /* un-gate USB Core clock */ - power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); - power.b.gatehclk = 0; - power.b.stoppclk = 0; - USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); - } - - /* Clear the Remote Wake-up Signaling */ - devctl.d32 = 0; - devctl.b.rmtwkupsig = 1; - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, devctl.d32, 0); - - /* Inform upper layer by the Resume Event */ - USBD_DCD_INT_fops->Resume (pdev); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.wkupintr = 1; - USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); - return 1; -} - -/** -* @brief USB_OTG_HandleUSBSuspend_ISR -* Indicates that SUSPEND state has been detected on the USB -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTSTS_TypeDef gintsts; - USB_OTG_PCGCCTL_TypeDef power; - USB_OTG_DSTS_TypeDef dsts; - - USBD_DCD_INT_fops->Suspend (pdev); - - dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.usbsuspend = 1; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); - - if((pdev->cfg.low_power) && (dsts.b.suspsts == 1)) - { - /* switch-off the clocks */ - power.d32 = 0; - power.b.stoppclk = 1; - USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32); - - power.b.gatehclk = 1; - USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32); - - /* Request to enter Sleep mode after exit from current ISR */ - SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk); - } - return 1; -} - -/** -* @brief DCD_HandleInEP_ISR -* Indicates that an IN EP has a pending Interrupt -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_DIEPINTn_TypeDef diepint; - - uint32_t ep_intr; - uint32_t epnum = 0; - uint32_t fifoemptymsk; - diepint.d32 = 0; - ep_intr = USB_OTG_ReadDevAllInEPItr(pdev); - - while ( ep_intr ) - { - if (ep_intr&0x1) /* In ITR */ - { - diepint.d32 = DCD_ReadDevInEP(pdev , epnum); /* Get In ITR status */ - if ( diepint.b.xfercompl ) - { - fifoemptymsk = 0x1 << epnum; - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); - CLEAR_IN_EP_INTR(epnum, xfercompl); - /* TX COMPLETE */ - USBD_DCD_INT_fops->DataInStage(pdev , epnum); - - if (pdev->cfg.dma_enable == 1) - { - if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_IN)) - { - /* prepare to rx more setup packets */ - USB_OTG_EP0_OutStart(pdev); - } - } - } - if ( diepint.b.ahberr ) - { - CLEAR_IN_EP_INTR(epnum, ahberr); - } - if ( diepint.b.timeout ) - { - CLEAR_IN_EP_INTR(epnum, timeout); - } - if (diepint.b.intktxfemp) - { - CLEAR_IN_EP_INTR(epnum, intktxfemp); - } - if (diepint.b.intknepmis) - { - CLEAR_IN_EP_INTR(epnum, intknepmis); - } - if (diepint.b.inepnakeff) - { - CLEAR_IN_EP_INTR(epnum, inepnakeff); - } - if ( diepint.b.epdisabled ) - { - CLEAR_IN_EP_INTR(epnum, epdisabled); - } - if (diepint.b.emptyintr) - { - - DCD_WriteEmptyTxFifo(pdev , epnum); - - CLEAR_IN_EP_INTR(epnum, emptyintr); - } - } - epnum++; - ep_intr >>= 1; - } - - return 1; -} - -/** -* @brief DCD_HandleOutEP_ISR -* Indicates that an OUT EP has a pending Interrupt -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev) -{ - uint32_t ep_intr; - USB_OTG_DOEPINTn_TypeDef doepint; - USB_OTG_DEPXFRSIZ_TypeDef deptsiz; - uint32_t epnum = 0; - - doepint.d32 = 0; - - /* Read in the device interrupt bits */ - ep_intr = USB_OTG_ReadDevAllOutEp_itr(pdev); - - while ( ep_intr ) - { - if (ep_intr&0x1) - { - - doepint.d32 = USB_OTG_ReadDevOutEP_itr(pdev, epnum); - - /* Transfer complete */ - if ( doepint.b.xfercompl ) - { - /* Clear the bit in DOEPINTn for this interrupt */ - CLEAR_OUT_EP_INTR(epnum, xfercompl); - if (pdev->cfg.dma_enable == 1) - { - deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[epnum]->DOEPTSIZ)); - /*ToDo : handle more than one single MPS size packet */ - pdev->dev.out_ep[epnum].xfer_count = pdev->dev.out_ep[epnum].maxpacket - \ - deptsiz.b.xfersize; - } - /* Inform upper layer: data ready */ - /* RX COMPLETE */ - USBD_DCD_INT_fops->DataOutStage(pdev , epnum); - - if (pdev->cfg.dma_enable == 1) - { - if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_OUT)) - { - /* prepare to rx more setup packets */ - USB_OTG_EP0_OutStart(pdev); - } - } - } - /* Endpoint disable */ - if ( doepint.b.epdisabled ) - { - /* Clear the bit in DOEPINTn for this interrupt */ - CLEAR_OUT_EP_INTR(epnum, epdisabled); - } - /* AHB Error */ - if ( doepint.b.ahberr ) - { - CLEAR_OUT_EP_INTR(epnum, ahberr); - } - /* Setup Phase Done (control EPs) */ - if ( doepint.b.setup ) - { - - /* inform the upper layer that a setup packet is available */ - /* SETUP COMPLETE */ - USBD_DCD_INT_fops->SetupStage(pdev); - CLEAR_OUT_EP_INTR(epnum, setup); - } - } - epnum++; - ep_intr >>= 1; - } - return 1; -} - -/** -* @brief DCD_HandleSof_ISR -* Handles the SOF Interrupts -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTSTS_TypeDef GINTSTS; - - - USBD_DCD_INT_fops->SOF(pdev); - - /* Clear interrupt */ - GINTSTS.d32 = 0; - GINTSTS.b.sofintr = 1; - USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, GINTSTS.d32); - - return 1; -} - -/** -* @brief DCD_HandleRxStatusQueueLevel_ISR -* Handles the Rx Status Queue Level Interrupt -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTMSK_TypeDef int_mask; - USB_OTG_DRXSTS_TypeDef status; - USB_OTG_EP *ep; - - /* Disable the Rx Status Queue Level interrupt */ - int_mask.d32 = 0; - int_mask.b.rxstsqlvl = 1; - USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32, 0); - - /* Get the Status from the top of the FIFO */ - status.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRXSTSP ); - - ep = &pdev->dev.out_ep[status.b.epnum]; - - switch (status.b.pktsts) - { - case STS_GOUT_NAK: - break; - case STS_DATA_UPDT: - if (status.b.bcnt) - { - USB_OTG_ReadPacket(pdev,ep->xfer_buff, status.b.bcnt); - ep->xfer_buff += status.b.bcnt; - ep->xfer_count += status.b.bcnt; - } - break; - case STS_XFER_COMP: - break; - case STS_SETUP_COMP: - break; - case STS_SETUP_UPDT: - /* Copy the setup packet received in FIFO into the setup buffer in RAM */ - USB_OTG_ReadPacket(pdev , pdev->dev.setup_packet, 8); - ep->xfer_count += status.b.bcnt; - break; - default: - break; - } - - /* Enable the Rx Status Queue Level interrupt */ - USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, int_mask.d32); - - return 1; -} - -/** -* @brief DCD_WriteEmptyTxFifo -* check FIFO for the next packet to be loaded -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t epnum) -{ - USB_OTG_DTXFSTSn_TypeDef txstatus; - USB_OTG_EP *ep; - uint32_t len = 0; - uint32_t len32b; - txstatus.d32 = 0; - - ep = &pdev->dev.in_ep[epnum]; - - len = ep->xfer_len - ep->xfer_count; - - if (len > ep->maxpacket) - { - len = ep->maxpacket; - } - - len32b = (len + 3) / 4; - txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[epnum]->DTXFSTS); - - - - while (txstatus.b.txfspcavail > len32b && - ep->xfer_count < ep->xfer_len && - ep->xfer_len != 0) - { - /* Write the FIFO */ - len = ep->xfer_len - ep->xfer_count; - - if (len > ep->maxpacket) - { - len = ep->maxpacket; - } - len32b = (len + 3) / 4; - - USB_OTG_WritePacket (pdev , ep->xfer_buff, epnum, len); - - ep->xfer_buff += len; - ep->xfer_count += len; - - txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS); - } - - return 1; -} - -/** -* @brief DCD_HandleUsbReset_ISR -* This interrupt occurs when a USB Reset is detected -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_DAINT_TypeDef daintmsk; - USB_OTG_DOEPMSK_TypeDef doepmsk; - USB_OTG_DIEPMSK_TypeDef diepmsk; - USB_OTG_DCFG_TypeDef dcfg; - USB_OTG_DCTL_TypeDef dctl; - USB_OTG_GINTSTS_TypeDef gintsts; - uint32_t i; - - dctl.d32 = 0; - daintmsk.d32 = 0; - doepmsk.d32 = 0; - diepmsk.d32 = 0; - dcfg.d32 = 0; - gintsts.d32 = 0; - - /* Clear the Remote Wake-up Signaling */ - dctl.b.rmtwkupsig = 1; - USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 ); - - /* Flush the Tx FIFO */ - USB_OTG_FlushTxFifo(pdev , 0 ); - - for (i = 0; i < pdev->cfg.dev_endpoints ; i++) - { - USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); - USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); - } - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); - - daintmsk.ep.in = 1; - daintmsk.ep.out = 1; - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, daintmsk.d32 ); - - doepmsk.b.setup = 1; - doepmsk.b.xfercompl = 1; - doepmsk.b.ahberr = 1; - doepmsk.b.epdisabled = 1; - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, doepmsk.d32 ); -#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOUTEP1MSK, doepmsk.d32 ); -#endif - diepmsk.b.xfercompl = 1; - diepmsk.b.timeout = 1; - diepmsk.b.epdisabled = 1; - diepmsk.b.ahberr = 1; - diepmsk.b.intknepmis = 1; - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, diepmsk.d32 ); -#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DINEP1MSK, diepmsk.d32 ); -#endif - /* Reset Device Address */ - dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); - dcfg.b.devaddr = 0; - USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32); - - - /* setup EP0 to receive SETUP packets */ - USB_OTG_EP0_OutStart(pdev); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.usbreset = 1; - USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); - - /*Reset internal state machine */ - USBD_DCD_INT_fops->Reset(pdev); - return 1; -} - -/** -* @brief DCD_HandleEnumDone_ISR -* Read the device status register and set the device speed -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTSTS_TypeDef gintsts; - USB_OTG_GUSBCFG_TypeDef gusbcfg; - - USB_OTG_EP0Activate(pdev); - - /* Set USB turn-around time based on device speed and PHY interface. */ - gusbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); - - /* Full or High speed */ - if ( USB_OTG_GetDeviceSpeed(pdev) == USB_SPEED_HIGH) - { - pdev->cfg.speed = USB_OTG_SPEED_HIGH; - pdev->cfg.mps = USB_OTG_HS_MAX_PACKET_SIZE ; - gusbcfg.b.usbtrdtim = 9; - } - else - { - pdev->cfg.speed = USB_OTG_SPEED_FULL; - pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ; - gusbcfg.b.usbtrdtim = 5; - } - - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, gusbcfg.d32); - - /* Clear interrupt */ - gintsts.d32 = 0; - gintsts.b.enumdone = 1; - USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, gintsts.d32 ); - return 1; -} - - -/** -* @brief DCD_IsoINIncomplete_ISR -* handle the ISO IN incomplete interrupt -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTSTS_TypeDef gintsts; - - gintsts.d32 = 0; - - USBD_DCD_INT_fops->IsoINIncomplete (pdev); - - /* Clear interrupt */ - gintsts.b.incomplisoin = 1; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); - - return 1; -} - -/** -* @brief DCD_IsoOUTIncomplete_ISR -* handle the ISO OUT incomplete interrupt -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTSTS_TypeDef gintsts; - - gintsts.d32 = 0; - - USBD_DCD_INT_fops->IsoOUTIncomplete (pdev); - - /* Clear interrupt */ - gintsts.b.incomplisoout = 1; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); - return 1; -} -/** -* @brief DCD_ReadDevInEP -* Reads ep flags -* @param pdev: device instance -* @retval status -*/ -static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) -{ - uint32_t v, msk, emp; - msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPMSK); - emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); - msk |= ((emp >> epnum) & 0x1) << 7; - v = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT) & msk; - return v; -} - - - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ -#endif - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_otg/src/usb_hcd.c b/car_hw/src/lib/usb_otg/src/usb_hcd.c deleted file mode 100644 index a3cf29db512..00000000000 --- a/car_hw/src/lib/usb_otg/src/usb_hcd.c +++ /dev/null @@ -1,259 +0,0 @@ -/** - ****************************************************************************** - * @file usb_hcd.c - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief Host Interface Layer - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -#include "usb_conf.h" -#ifdef USE_HOST_MODE -/* Includes ------------------------------------------------------------------*/ -#include "usb_core.h" -#include "usb_hcd.h" -#include "usb_conf.h" -#include "usb_bsp.h" - - -/** @addtogroup USB_OTG_DRIVER - * @{ - */ - -/** @defgroup USB_HCD - * @brief This file is the interface between EFSL ans Host mass-storage class - * @{ - */ - - -/** @defgroup USB_HCD_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_HCD_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - - -/** @defgroup USB_HCD_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_HCD_Private_Variables - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_HCD_Private_FunctionPrototypes - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_HCD_Private_Functions - * @{ - */ - -/** - * @brief HCD_Init - * Initialize the HOST portion of the driver. - * @param pdev: Selected device - * @param base_address: OTG base address - * @retval Status - */ -uint32_t HCD_Init(USB_OTG_CORE_HANDLE *pdev , - USB_OTG_CORE_ID_TypeDef coreID) -{ - uint8_t i = 0; - pdev->host.ConnSts = 0; - - for (i= 0; i< USB_OTG_MAX_TX_FIFOS; i++) - { - pdev->host.ErrCnt[i] = 0; - pdev->host.XferCnt[i] = 0; - pdev->host.HC_Status[i] = HC_IDLE; - } - pdev->host.hc[0].max_packet = 8; - - USB_OTG_SelectCore(pdev, coreID); -#ifndef DUAL_ROLE_MODE_ENABLED - USB_OTG_DisableGlobalInt(pdev); - USB_OTG_CoreInit(pdev); - - /* Force Host Mode*/ - USB_OTG_SetCurrentMode(pdev , HOST_MODE); - USB_OTG_CoreInitHost(pdev); - USB_OTG_EnableGlobalInt(pdev); -#endif - - return 0; -} - - -/** - * @brief HCD_GetCurrentSpeed - * Get Current device Speed. - * @param pdev : Selected device - * @retval Status - */ - -uint32_t HCD_GetCurrentSpeed (USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_HPRT0_TypeDef HPRT0; - HPRT0.d32 = USB_OTG_READ_REG32(pdev->regs.HPRT0); - - return HPRT0.b.prtspd; -} - -/** - * @brief HCD_ResetPort - * Issues the reset command to device - * @param pdev : Selected device - * @retval Status - */ -uint32_t HCD_ResetPort(USB_OTG_CORE_HANDLE *pdev) -{ - /* - Before starting to drive a USB reset, the application waits for the OTG - interrupt triggered by the debounce done bit (DBCDNE bit in OTG_FS_GOTGINT), - which indicates that the bus is stable again after the electrical debounce - caused by the attachment of a pull-up resistor on DP (FS) or DM (LS). - */ - - USB_OTG_ResetPort(pdev); - return 0; -} - -/** - * @brief HCD_IsDeviceConnected - * Check if the device is connected. - * @param pdev : Selected device - * @retval Device connection status. 1 -> connected and 0 -> disconnected - * - */ -uint32_t HCD_IsDeviceConnected(USB_OTG_CORE_HANDLE *pdev) -{ - return (pdev->host.ConnSts); -} - -/** - * @brief HCD_GetCurrentFrame - * This function returns the frame number for sof packet - * @param pdev : Selected device - * @retval Frame number - * - */ -uint32_t HCD_GetCurrentFrame (USB_OTG_CORE_HANDLE *pdev) -{ - return (USB_OTG_READ_REG32(&pdev->regs.HREGS->HFNUM) & 0xFFFF) ; -} - -/** - * @brief HCD_GetURB_State - * This function returns the last URBstate - * @param pdev: Selected device - * @retval URB_STATE - * - */ -URB_STATE HCD_GetURB_State (USB_OTG_CORE_HANDLE *pdev , uint8_t ch_num) -{ - return pdev->host.URB_State[ch_num] ; -} - -/** - * @brief HCD_GetXferCnt - * This function returns the last URBstate - * @param pdev: Selected device - * @retval No. of data bytes transferred - * - */ -uint32_t HCD_GetXferCnt (USB_OTG_CORE_HANDLE *pdev, uint8_t ch_num) -{ - return pdev->host.XferCnt[ch_num] ; -} - - - -/** - * @brief HCD_GetHCState - * This function returns the HC Status - * @param pdev: Selected device - * @retval HC_STATUS - * - */ -HC_STATUS HCD_GetHCState (USB_OTG_CORE_HANDLE *pdev , uint8_t ch_num) -{ - return pdev->host.HC_Status[ch_num] ; -} - -/** - * @brief HCD_HC_Init - * This function prepare a HC and start a transfer - * @param pdev: Selected device - * @param hc_num: Channel number - * @retval status - */ -uint32_t HCD_HC_Init (USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) -{ - return USB_OTG_HC_Init(pdev, hc_num); -} - -/** - * @brief HCD_SubmitRequest - * This function prepare a HC and start a transfer - * @param pdev: Selected device - * @param hc_num: Channel number - * @retval status - */ -uint32_t HCD_SubmitRequest (USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) -{ - - pdev->host.URB_State[hc_num] = URB_IDLE; - pdev->host.hc[hc_num].xfer_count = 0 ; - return USB_OTG_HC_StartXfer(pdev, hc_num); -} - - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ -#endif - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_otg/src/usb_hcd_int.c b/car_hw/src/lib/usb_otg/src/usb_hcd_int.c deleted file mode 100644 index aed8bc6e7b7..00000000000 --- a/car_hw/src/lib/usb_otg/src/usb_hcd_int.c +++ /dev/null @@ -1,835 +0,0 @@ -/** - ****************************************************************************** - * @file usb_hcd_int.c - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief Host driver interrupt subroutines - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -#include "usb_conf.h" -#ifdef USE_HOST_MODE -/* Includes ------------------------------------------------------------------*/ -#include "usb_core.h" -#include "usb_defines.h" -#include "usb_hcd_int.h" - -#if defined (__CC_ARM) /*!< ARM Compiler */ - #pragma O0 -#elif defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma O0 -#elif defined (__GNUC__) /*!< GNU Compiler */ - #pragma GCC optimize ("O0") -#elif defined (__TASKING__) /*!< TASKING Compiler */ - #pragma optimize=0 - -#endif /* __CC_ARM */ - -/** @addtogroup USB_OTG_DRIVER - * @{ - */ - -/** @defgroup USB_HCD_INT - * @brief This file contains the interrupt subroutines for the Host mode. - * @{ - */ - - -/** @defgroup USB_HCD_INT_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_HCD_INT_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - - -/** @defgroup USB_HCD_INT_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_HCD_INT_Private_Variables - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_HCD_INT_Private_FunctionPrototypes - * @{ - */ - -static uint32_t USB_OTG_USBH_handle_sof_ISR(USB_OTG_CORE_HANDLE *pdev); -static uint32_t USB_OTG_USBH_handle_port_ISR(USB_OTG_CORE_HANDLE *pdev); -static uint32_t USB_OTG_USBH_handle_hc_ISR (USB_OTG_CORE_HANDLE *pdev); -static uint32_t USB_OTG_USBH_handle_hc_n_In_ISR (USB_OTG_CORE_HANDLE *pdev , - uint32_t num); -static uint32_t USB_OTG_USBH_handle_hc_n_Out_ISR (USB_OTG_CORE_HANDLE *pdev , - uint32_t num); -static uint32_t USB_OTG_USBH_handle_rx_qlvl_ISR (USB_OTG_CORE_HANDLE *pdev); -static uint32_t USB_OTG_USBH_handle_nptxfempty_ISR (USB_OTG_CORE_HANDLE *pdev); -static uint32_t USB_OTG_USBH_handle_ptxfempty_ISR (USB_OTG_CORE_HANDLE *pdev); -static uint32_t USB_OTG_USBH_handle_Disconnect_ISR (USB_OTG_CORE_HANDLE *pdev); -static uint32_t USB_OTG_USBH_handle_IncompletePeriodicXfer_ISR (USB_OTG_CORE_HANDLE *pdev); - -/** - * @} - */ - - -/** @defgroup USB_HCD_INT_Private_Functions - * @{ - */ - -/** - * @brief HOST_Handle_ISR - * This function handles all USB Host Interrupts - * @param pdev: Selected device - * @retval status - */ - -uint32_t USBH_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTSTS_TypeDef gintsts; - uint32_t retval = 0; - - gintsts.d32 = 0; - - /* Check if HOST Mode */ - if (USB_OTG_IsHostMode(pdev)) - { - gintsts.d32 = USB_OTG_ReadCoreItr(pdev); - if (!gintsts.d32) - { - return 0; - } - - if (gintsts.b.sofintr) - { - retval |= USB_OTG_USBH_handle_sof_ISR (pdev); - } - - if (gintsts.b.rxstsqlvl) - { - retval |= USB_OTG_USBH_handle_rx_qlvl_ISR (pdev); - } - - if (gintsts.b.nptxfempty) - { - retval |= USB_OTG_USBH_handle_nptxfempty_ISR (pdev); - } - - if (gintsts.b.ptxfempty) - { - retval |= USB_OTG_USBH_handle_ptxfempty_ISR (pdev); - } - - if (gintsts.b.hcintr) - { - retval |= USB_OTG_USBH_handle_hc_ISR (pdev); - } - - if (gintsts.b.portintr) - { - retval |= USB_OTG_USBH_handle_port_ISR (pdev); - } - - if (gintsts.b.disconnect) - { - retval |= USB_OTG_USBH_handle_Disconnect_ISR (pdev); - - } - - if (gintsts.b.incomplisoout) - { - retval |= USB_OTG_USBH_handle_IncompletePeriodicXfer_ISR (pdev); - } - - - } - return retval; -} - -/** - * @brief USB_OTG_USBH_handle_hc_ISR - * This function indicates that one or more host channels has a pending - * @param pdev: Selected device - * @retval status - */ -static uint32_t USB_OTG_USBH_handle_hc_ISR (USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_HAINT_TypeDef haint; - USB_OTG_HCCHAR_TypeDef hcchar; - uint32_t i = 0; - uint32_t retval = 0; - - /* Clear appropriate bits in HCINTn to clear the interrupt bit in - * GINTSTS */ - - haint.d32 = USB_OTG_ReadHostAllChannels_intr(pdev); - - for (i = 0; i < pdev->cfg.host_channels ; i++) - { - if (haint.b.chint & (1 << i)) - { - hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[i]->HCCHAR); - - if (hcchar.b.epdir) - { - retval |= USB_OTG_USBH_handle_hc_n_In_ISR (pdev, i); - } - else - { - retval |= USB_OTG_USBH_handle_hc_n_Out_ISR (pdev, i); - } - } - } - - return retval; -} - -/** - * @brief USB_OTG_otg_hcd_handle_sof_intr - * Handles the start-of-frame interrupt in host mode. - * @param pdev: Selected device - * @retval status - */ -static uint32_t USB_OTG_USBH_handle_sof_ISR (USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTSTS_TypeDef gintsts; - - - gintsts.d32 = 0; - /* Clear interrupt */ - gintsts.b.sofintr = 1; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); - - return 1; -} - -/** - * @brief USB_OTG_USBH_handle_Disconnect_ISR - * Handles disconnect event. - * @param pdev: Selected device - * @retval status - */ -static uint32_t USB_OTG_USBH_handle_Disconnect_ISR (USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTSTS_TypeDef gintsts; - - pdev->host.ConnSts = 0; - gintsts.d32 = 0; - - pdev->host.port_cb->Disconnect(pdev); - - /* Clear interrupt */ - gintsts.b.disconnect = 1; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); - - return 1; -} - -/** - * @brief USB_OTG_USBH_handle_nptxfempty_ISR - * Handles non periodic tx fifo empty. - * @param pdev: Selected device - * @retval status - */ -static uint32_t USB_OTG_USBH_handle_nptxfempty_ISR (USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTMSK_TypeDef intmsk; - USB_OTG_HNPTXSTS_TypeDef hnptxsts; - uint16_t len_words , len; - - hnptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); - - len_words = (pdev->host.hc[hnptxsts.b.chnum].xfer_len + 3) / 4; - - while ((hnptxsts.b.nptxfspcavail > len_words)&& - (pdev->host.hc[hnptxsts.b.chnum].xfer_len != 0)) - { - - len = hnptxsts.b.nptxfspcavail * 4; - - if (len > pdev->host.hc[hnptxsts.b.chnum].xfer_len) - { - /* Last packet */ - len = pdev->host.hc[hnptxsts.b.chnum].xfer_len; - - intmsk.d32 = 0; - intmsk.b.nptxfempty = 1; - USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, intmsk.d32, 0); - } - - len_words = (pdev->host.hc[hnptxsts.b.chnum].xfer_len + 3) / 4; - - USB_OTG_WritePacket (pdev , pdev->host.hc[hnptxsts.b.chnum].xfer_buff, hnptxsts.b.chnum, len); - - pdev->host.hc[hnptxsts.b.chnum].xfer_buff += len; - pdev->host.hc[hnptxsts.b.chnum].xfer_len -= len; - pdev->host.hc[hnptxsts.b.chnum].xfer_count += len; - - hnptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); - } - - return 1; -} - -/** - * @brief USB_OTG_USBH_handle_ptxfempty_ISR - * Handles periodic tx fifo empty - * @param pdev: Selected device - * @retval status - */ -static uint32_t USB_OTG_USBH_handle_ptxfempty_ISR (USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTMSK_TypeDef intmsk; - USB_OTG_HPTXSTS_TypeDef hptxsts; - uint16_t len_words , len; - - hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); - - len_words = (pdev->host.hc[hptxsts.b.chnum].xfer_len + 3) / 4; - - while ((hptxsts.b.ptxfspcavail > len_words)&& - (pdev->host.hc[hptxsts.b.chnum].xfer_len != 0)) - { - - len = hptxsts.b.ptxfspcavail * 4; - - if (len > pdev->host.hc[hptxsts.b.chnum].xfer_len) - { - len = pdev->host.hc[hptxsts.b.chnum].xfer_len; - /* Last packet */ - intmsk.d32 = 0; - intmsk.b.ptxfempty = 1; - USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, intmsk.d32, 0); - } - - len_words = (pdev->host.hc[hptxsts.b.chnum].xfer_len + 3) / 4; - - USB_OTG_WritePacket (pdev , pdev->host.hc[hptxsts.b.chnum].xfer_buff, hptxsts.b.chnum, len); - - pdev->host.hc[hptxsts.b.chnum].xfer_buff += len; - pdev->host.hc[hptxsts.b.chnum].xfer_len -= len; - pdev->host.hc[hptxsts.b.chnum].xfer_count += len; - - hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); - } - - return 1; -} - -/** - * @brief USB_OTG_USBH_handle_port_ISR - * This function determines which interrupt conditions have occurred - * @param pdev: Selected device - * @retval status - */ -static uint32_t USB_OTG_USBH_handle_port_ISR (USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_HPRT0_TypeDef hprt0; - USB_OTG_HPRT0_TypeDef hprt0_dup; - USB_OTG_HCFG_TypeDef hcfg; - uint32_t do_reset = 0; - uint32_t retval = 0; - - hcfg.d32 = 0; - hprt0.d32 = 0; - hprt0_dup.d32 = 0; - - hprt0.d32 = USB_OTG_READ_REG32(pdev->regs.HPRT0); - hprt0_dup.d32 = USB_OTG_READ_REG32(pdev->regs.HPRT0); - - /* Clear the interrupt bits in GINTSTS */ - - hprt0_dup.b.prtena = 0; - hprt0_dup.b.prtconndet = 0; - hprt0_dup.b.prtenchng = 0; - hprt0_dup.b.prtovrcurrchng = 0; - - /* Port Connect Detected */ - if (hprt0.b.prtconndet) - { - pdev->host.port_cb->Connect(pdev); - hprt0_dup.b.prtconndet = 1; - do_reset = 1; - retval |= 1; - } - - /* Port Enable Changed */ - if (hprt0.b.prtenchng) - { - hprt0_dup.b.prtenchng = 1; - if (hprt0.b.prtena == 1) - { - pdev->host.ConnSts = 1; - - if ((hprt0.b.prtspd == HPRT0_PRTSPD_LOW_SPEED) || - (hprt0.b.prtspd == HPRT0_PRTSPD_FULL_SPEED)) - { - - hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); - - if (hprt0.b.prtspd == HPRT0_PRTSPD_LOW_SPEED) - { - USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HFIR, 6000 ); - if (hcfg.b.fslspclksel != HCFG_6_MHZ) - { - if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID) - { - USB_OTG_InitFSLSPClkSel(pdev ,HCFG_6_MHZ ); - } - do_reset = 1; - } - } - else - { - - USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HFIR, 48000 ); - if (hcfg.b.fslspclksel != HCFG_48_MHZ) - { - USB_OTG_InitFSLSPClkSel(pdev ,HCFG_48_MHZ ); - do_reset = 1; - } - } - } - else - { - do_reset = 1; - } - } - } - /* Overcurrent Change Interrupt */ - if (hprt0.b.prtovrcurrchng) - { - hprt0_dup.b.prtovrcurrchng = 1; - retval |= 1; - } - if (do_reset) - { - USB_OTG_ResetPort(pdev); - - } - /* Clear Port Interrupts */ - USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0_dup.d32); - - return retval; -} - -/** - * @brief USB_OTG_USBH_handle_hc_n_Out_ISR - * Handles interrupt for a specific Host Channel - * @param pdev: Selected device - * @param hc_num: Channel number - * @retval status - */ -uint32_t USB_OTG_USBH_handle_hc_n_Out_ISR (USB_OTG_CORE_HANDLE *pdev , uint32_t num) -{ - - USB_OTG_HCINTn_TypeDef hcint; - USB_OTG_HCGINTMSK_TypeDef hcintmsk; - USB_OTG_HC_REGS *hcreg; - USB_OTG_HCCHAR_TypeDef hcchar; - - hcreg = pdev->regs.HC_REGS[num]; - hcint.d32 = USB_OTG_READ_REG32(&hcreg->HCINT); - hcintmsk.d32 = USB_OTG_READ_REG32(&hcreg->HCGINTMSK); - hcint.d32 = hcint.d32 & hcintmsk.d32; - - hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[num]->HCCHAR); - - if (hcint.b.ahberr) - { - CLEAR_HC_INT(hcreg ,ahberr); - UNMASK_HOST_INT_CHH (num); - } - else if (hcint.b.ack) - { - CLEAR_HC_INT(hcreg , ack); - } - - else if (hcint.b.xfercompl) - { - pdev->host.ErrCnt[num] = 0; - UNMASK_HOST_INT_CHH (num); - USB_OTG_HC_Halt(pdev, num); - CLEAR_HC_INT(hcreg , xfercompl); - pdev->host.HC_Status[num] = HC_XFRC; - } - - else if (hcint.b.stall) - { - CLEAR_HC_INT(hcreg , stall); - UNMASK_HOST_INT_CHH (num); - USB_OTG_HC_Halt(pdev, num); - pdev->host.HC_Status[num] = HC_STALL; - } - - else if (hcint.b.nak) - { - pdev->host.ErrCnt[num] = 0; - UNMASK_HOST_INT_CHH (num); - USB_OTG_HC_Halt(pdev, num); - CLEAR_HC_INT(hcreg , nak); - pdev->host.HC_Status[num] = HC_NAK; - } - - else if (hcint.b.xacterr) - { - UNMASK_HOST_INT_CHH (num); - USB_OTG_HC_Halt(pdev, num); - pdev->host.ErrCnt[num] ++; - pdev->host.HC_Status[num] = HC_XACTERR; - CLEAR_HC_INT(hcreg , xacterr); - } - else if (hcint.b.nyet) - { - pdev->host.ErrCnt[num] = 0; - UNMASK_HOST_INT_CHH (num); - USB_OTG_HC_Halt(pdev, num); - CLEAR_HC_INT(hcreg , nyet); - pdev->host.HC_Status[num] = HC_NYET; - } - else if (hcint.b.datatglerr) - { - - UNMASK_HOST_INT_CHH (num); - USB_OTG_HC_Halt(pdev, num); - CLEAR_HC_INT(hcreg , nak); - pdev->host.HC_Status[num] = HC_DATATGLERR; - - CLEAR_HC_INT(hcreg , datatglerr); - } - else if (hcint.b.chhltd) - { - MASK_HOST_INT_CHH (num); - - if(pdev->host.HC_Status[num] == HC_XFRC) - { - pdev->host.URB_State[num] = URB_DONE; - - if (hcchar.b.eptype == EP_TYPE_BULK) - { - pdev->host.hc[num].toggle_out ^= 1; - } - } - else if(pdev->host.HC_Status[num] == HC_NAK) - { - pdev->host.URB_State[num] = URB_NOTREADY; - } - else if(pdev->host.HC_Status[num] == HC_NYET) - { - if(pdev->host.hc[num].do_ping == 1) - { - USB_OTG_HC_DoPing(pdev, num); - } - pdev->host.URB_State[num] = URB_NOTREADY; - } - else if(pdev->host.HC_Status[num] == HC_STALL) - { - pdev->host.URB_State[num] = URB_STALL; - } - else if(pdev->host.HC_Status[num] == HC_XACTERR) - { - if (pdev->host.ErrCnt[num] == 3) - { - pdev->host.URB_State[num] = URB_ERROR; - pdev->host.ErrCnt[num] = 0; - } - } - CLEAR_HC_INT(hcreg , chhltd); - } - - - return 1; -} - -/** - * @brief USB_OTG_USBH_handle_hc_n_In_ISR - * Handles interrupt for a specific Host Channel - * @param pdev: Selected device - * @param hc_num: Channel number - * @retval status - */ -uint32_t USB_OTG_USBH_handle_hc_n_In_ISR (USB_OTG_CORE_HANDLE *pdev , uint32_t num) -{ - USB_OTG_HCINTn_TypeDef hcint; - USB_OTG_HCGINTMSK_TypeDef hcintmsk; - USB_OTG_HCCHAR_TypeDef hcchar; - USB_OTG_HCTSIZn_TypeDef hctsiz; - USB_OTG_HC_REGS *hcreg; - - - hcreg = pdev->regs.HC_REGS[num]; - hcint.d32 = USB_OTG_READ_REG32(&hcreg->HCINT); - hcintmsk.d32 = USB_OTG_READ_REG32(&hcreg->HCGINTMSK); - hcint.d32 = hcint.d32 & hcintmsk.d32; - hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[num]->HCCHAR); - hcintmsk.d32 = 0; - - - if (hcint.b.ahberr) - { - CLEAR_HC_INT(hcreg ,ahberr); - UNMASK_HOST_INT_CHH (num); - } - else if (hcint.b.ack) - { - CLEAR_HC_INT(hcreg ,ack); - } - - else if (hcint.b.stall) - { - UNMASK_HOST_INT_CHH (num); - pdev->host.HC_Status[num] = HC_STALL; - CLEAR_HC_INT(hcreg , nak); /* Clear the NAK Condition */ - CLEAR_HC_INT(hcreg , stall); /* Clear the STALL Condition */ - hcint.b.nak = 0; /* NOTE: When there is a 'stall', reset also nak, - else, the pdev->host.HC_Status = HC_STALL - will be overwritten by 'nak' in code below */ - USB_OTG_HC_Halt(pdev, num); - } - else if (hcint.b.datatglerr) - { - - UNMASK_HOST_INT_CHH (num); - USB_OTG_HC_Halt(pdev, num); - CLEAR_HC_INT(hcreg , nak); - pdev->host.HC_Status[num] = HC_DATATGLERR; - CLEAR_HC_INT(hcreg , datatglerr); - } - - if (hcint.b.frmovrun) - { - UNMASK_HOST_INT_CHH (num); - USB_OTG_HC_Halt(pdev, num); - CLEAR_HC_INT(hcreg ,frmovrun); - } - - else if (hcint.b.xfercompl) - { - - if (pdev->cfg.dma_enable == 1) - { - hctsiz.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[num]->HCTSIZ); - pdev->host.XferCnt[num] = pdev->host.hc[num].xfer_len - hctsiz.b.xfersize; - } - - pdev->host.HC_Status[num] = HC_XFRC; - pdev->host.ErrCnt [num]= 0; - CLEAR_HC_INT(hcreg , xfercompl); - - if ((hcchar.b.eptype == EP_TYPE_CTRL)|| - (hcchar.b.eptype == EP_TYPE_BULK)) - { - UNMASK_HOST_INT_CHH (num); - USB_OTG_HC_Halt(pdev, num); - CLEAR_HC_INT(hcreg , nak); - pdev->host.hc[num].toggle_in ^= 1; - - } - else if(hcchar.b.eptype == EP_TYPE_INTR) - { - hcchar.b.oddfrm = 1; - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[num]->HCCHAR, hcchar.d32); - pdev->host.URB_State[num] = URB_DONE; - } - - } - else if (hcint.b.chhltd) - { - MASK_HOST_INT_CHH (num); - - if(pdev->host.HC_Status[num] == HC_XFRC) - { - pdev->host.URB_State[num] = URB_DONE; - } - - else if (pdev->host.HC_Status[num] == HC_STALL) - { - pdev->host.URB_State[num] = URB_STALL; - } - - else if((pdev->host.HC_Status[num] == HC_XACTERR) || - (pdev->host.HC_Status[num] == HC_DATATGLERR)) - { - pdev->host.ErrCnt[num] = 0; - pdev->host.URB_State[num] = URB_ERROR; - - } - else if(hcchar.b.eptype == EP_TYPE_INTR) - { - pdev->host.hc[num].toggle_in ^= 1; - } - - CLEAR_HC_INT(hcreg , chhltd); - - } - else if (hcint.b.xacterr) - { - UNMASK_HOST_INT_CHH (num); - pdev->host.ErrCnt[num] ++; - pdev->host.HC_Status[num] = HC_XACTERR; - USB_OTG_HC_Halt(pdev, num); - CLEAR_HC_INT(hcreg , xacterr); - - } - else if (hcint.b.nak) - { - if(hcchar.b.eptype == EP_TYPE_INTR) - { - UNMASK_HOST_INT_CHH (num); - USB_OTG_HC_Halt(pdev, num); - CLEAR_HC_INT(hcreg , nak); - } - else if ((hcchar.b.eptype == EP_TYPE_CTRL)|| - (hcchar.b.eptype == EP_TYPE_BULK)) - { - /* re-activate the channel */ - hcchar.b.chen = 1; - hcchar.b.chdis = 0; - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[num]->HCCHAR, hcchar.d32); - } - pdev->host.HC_Status[num] = HC_NAK; - } - - - return 1; - -} - -/** - * @brief USB_OTG_USBH_handle_rx_qlvl_ISR - * Handles the Rx Status Queue Level Interrupt - * @param pdev: Selected device - * @retval status - */ - -static uint32_t USB_OTG_USBH_handle_rx_qlvl_ISR (USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GRXFSTS_TypeDef grxsts; - USB_OTG_GINTMSK_TypeDef intmsk; - USB_OTG_HCTSIZn_TypeDef hctsiz; - USB_OTG_HCCHAR_TypeDef hcchar; - __IO uint8_t channelnum =0; - uint32_t count; - - /* Disable the Rx Status Queue Level interrupt */ - intmsk.d32 = 0; - intmsk.b.rxstsqlvl = 1; - USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, intmsk.d32, 0); - - grxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRXSTSP); - channelnum = grxsts.b.chnum; - hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[channelnum]->HCCHAR); - - switch (grxsts.b.pktsts) - { - case GRXSTS_PKTSTS_IN: - /* Read the data into the host buffer. */ - if ((grxsts.b.bcnt > 0) && (pdev->host.hc[channelnum].xfer_buff != (void *)0)) - { - - USB_OTG_ReadPacket(pdev, pdev->host.hc[channelnum].xfer_buff, grxsts.b.bcnt); - /*manage multiple Xfer */ - pdev->host.hc[grxsts.b.chnum].xfer_buff += grxsts.b.bcnt; - pdev->host.hc[grxsts.b.chnum].xfer_count += grxsts.b.bcnt; - - - count = pdev->host.hc[channelnum].xfer_count; - pdev->host.XferCnt[channelnum] = count; - - hctsiz.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[channelnum]->HCTSIZ); - if(hctsiz.b.pktcnt > 0) - { - /* re-activate the channel when more packets are expected */ - hcchar.b.chen = 1; - hcchar.b.chdis = 0; - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[channelnum]->HCCHAR, hcchar.d32); - } - } - break; - - case GRXSTS_PKTSTS_IN_XFER_COMP: - - case GRXSTS_PKTSTS_DATA_TOGGLE_ERR: - case GRXSTS_PKTSTS_CH_HALTED: - default: - break; - } - - /* Enable the Rx Status Queue Level interrupt */ - intmsk.b.rxstsqlvl = 1; - USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); - return 1; -} - -/** - * @brief USB_OTG_USBH_handle_IncompletePeriodicXfer_ISR - * Handles the incomplete Periodic transfer Interrupt - * @param pdev: Selected device - * @retval status - */ -static uint32_t USB_OTG_USBH_handle_IncompletePeriodicXfer_ISR (USB_OTG_CORE_HANDLE *pdev) -{ - - USB_OTG_GINTSTS_TypeDef gintsts; - USB_OTG_HCCHAR_TypeDef hcchar; - - - - - hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[0]->HCCHAR); - hcchar.b.chen = 1; - hcchar.b.chdis = 1; - USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[0]->HCCHAR, hcchar.d32); - - gintsts.d32 = 0; - /* Clear interrupt */ - gintsts.b.incomplisoout = 1; - USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); - - return 1; -} - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ -#endif - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_otg/src/usb_otg.c b/car_hw/src/lib/usb_otg/src/usb_otg.c deleted file mode 100644 index 4dc30a10b45..00000000000 --- a/car_hw/src/lib/usb_otg/src/usb_otg.c +++ /dev/null @@ -1,178 +0,0 @@ -/** - ****************************************************************************** - * @file usb_otg.c - * @author MCD Application Team - * @version V2.0.0 - * @date 22-July-2011 - * @brief OTG Core Layer - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -#include "usb_conf.h" -#ifdef USE_OTG_MODE -/* Includes ------------------------------------------------------------------*/ -#include "usb_defines.h" -#include "usb_regs.h" -#include "usb_core.h" -#include "usb_otg.h" - -/** @addtogroup USB_OTG_DRIVER - * @{ - */ - -/** @defgroup USB_OTG - * @brief This file is the interface between EFSL ans Host mass-storage class - * @{ - */ - - -/** @defgroup USB_OTG_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_OTG_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - - -/** @defgroup USB_OTG_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_OTG_Private_Variables - * @{ - */ -/** - * @} - */ - - -/** @defgroup USB_OTG_Private_FunctionPrototypes - * @{ - */ - -static uint32_t USB_OTG_Read_itr(USB_OTG_CORE_HANDLE *pdev); - -/** - * @} - */ - - -/** @defgroup USB_OTG_Private_Functions - * @{ - */ - - -/* OTG Interrupt Handler */ - - -/** - * @brief STM32_USBO_OTG_ISR_Handler - * - * @param None - * @retval : None - */ -uint32_t STM32_USBO_OTG_ISR_Handler(USB_OTG_CORE_HANDLE *pdev) -{ - uint32_t retval = 0; - USB_OTG_GINTSTS_TypeDef gintsts ; - gintsts.d32 = 0; - - gintsts.d32 = USB_OTG_Read_itr(pdev); - if (gintsts.d32 == 0) - { - return 0; - } - if (gintsts.b.otgintr) - { - retval |= 1;//USB_OTG_HandleOTG_ISR(pdev); - } - if (gintsts.b.conidstschng) - { - retval |= 2;//USB_OTG_HandleConnectorIDStatusChange_ISR(pdev); - } - if (gintsts.b.sessreqintr) - { - retval |= 3;//USB_OTG_HandleSessionRequest_ISR(pdev); - } - return retval; -} - - -/** - * @brief USB_OTG_Read_itr - * returns the Core Interrupt register - * @param None - * @retval : status - */ -static uint32_t USB_OTG_Read_itr(USB_OTG_CORE_HANDLE *pdev) -{ - USB_OTG_GINTSTS_TypeDef gintsts; - USB_OTG_GINTMSK_TypeDef gintmsk; - USB_OTG_GINTMSK_TypeDef gintmsk_common; - - - gintsts.d32 = 0; - gintmsk.d32 = 0; - gintmsk_common.d32 = 0; - - /* OTG interrupts */ - gintmsk_common.b.sessreqintr = 1; - gintmsk_common.b.conidstschng = 1; - gintmsk_common.b.otgintr = 1; - - gintsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS); - gintmsk.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTMSK); - return ((gintsts.d32 & gintmsk.d32 ) & gintmsk_common.d32); -} - - -/** - * @brief USB_OTG_GetCurrentState - * Return current OTG State - * @param None - * @retval : None - */ -uint32_t USB_OTG_GetCurrentState (USB_OTG_CORE_HANDLE *pdev) -{ - return pdev->otg.OTG_State; -} - - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ -#endif - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_vcp/Makefile b/car_hw/src/lib/usb_vcp/Makefile deleted file mode 100644 index acd43c0b1c9..00000000000 --- a/car_hw/src/lib/usb_vcp/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -LIB_USB_VCP_OBJ_PREFIX=libusbvcp_ - -$(LIB_USB_VCP_OBJ): \ - $(call dircs_to_prefxd_objs,$(LIB_USB_VCP_DIR),$(LIB_USB_VCP_OBJ_PREFIX)) - $(LD_ALL_DEPS) - -$(BIN_DIR)/$(LIB_USB_VCP_OBJ_PREFIX)%.o: $(LIB_USB_VCP_DIR)/%.c \ - $(call dirhs,$(LIB_USB_VCP_DIR)) - $(CC_ALL_DEPS) diff --git a/car_hw/src/lib/usb_vcp/README.txt b/car_hw/src/lib/usb_vcp/README.txt deleted file mode 100644 index 5d7fe0dbd2e..00000000000 --- a/car_hw/src/lib/usb_vcp/README.txt +++ /dev/null @@ -1,24 +0,0 @@ -This library is cleaned up and minfied version -of code represented at -http://vedder.se/2012/07/usb-serial-on-stm32f4/ - -== IMPORTANT == -When you plug your STM32 MCU into Linux based computer -you'll find new serial port device such as -/dev/ttyACMx or /dev/ttyACCx. -If you open such a file and write to it in a usual way -you'll send data to the MCU. If you read from it you'll -recieve data from the MCU. -But this device is not a simple serial 2-directional pipe. -Linux wraps this serial into a thing called console or tty. -ttys are usually used for running of the shell on them. -To disable all the shellish tty additions to serial behavior you -need to run: -stty -F /dev/ttyACMx raw -echo -echoe -echok -After this you'll get raw serial port on this device node. - -Useful resources: -http://www.armadeus.org/wiki/index.php?title=Serial_ports_usage_on_Linux -http://www.beyondlogic.org/usbnutshell/usb1.shtml -http://www.usbmadesimple.co.uk/index.html -http://www.linusakesson.net/programming/tty/ diff --git a/car_hw/src/lib/usb_vcp/init.c b/car_hw/src/lib/usb_vcp/init.c deleted file mode 100644 index 106510f8b9f..00000000000 --- a/car_hw/src/lib/usb_vcp/init.c +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include -#include -#include -#include - -__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END; - -void VCP_init(void) -{ - USBD_Init(&USB_OTG_dev, - USB_OTG_FS_CORE_ID, - &USR_desc, - &USBD_CDC_cb, - &USR_cb); -} diff --git a/car_hw/src/lib/usb_vcp/usb_bsp.c b/car_hw/src/lib/usb_vcp/usb_bsp.c deleted file mode 100644 index 16275cdfb17..00000000000 --- a/car_hw/src/lib/usb_vcp/usb_bsp.c +++ /dev/null @@ -1,333 +0,0 @@ -/** - ****************************************************************************** - * @file usb_bsp.c - * @author MCD Application Team - * @version V1.0.0 - * @date 19-September-2011 - * @brief This file is responsible to offer board support package and is - * configurable by user. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_bsp.h" -#include "usbd_conf.h" -#include "stm32f4xx_conf.h" - - -void USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE *pdev) { - -} - -void USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE *pdev,uint8_t state) { - -} - - -/** -* @brief USB_OTG_BSP_Init -* Initilizes BSP configurations -* @param None -* @retval None -*/ - -void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) -{ - GPIO_InitTypeDef GPIO_InitStructure; - -#ifndef USE_ULPI_PHY -#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT - EXTI_InitTypeDef EXTI_InitStructure; - NVIC_InitTypeDef NVIC_InitStructure; -#endif -#endif - - - #ifdef USE_USB_OTG_FS - - RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE); - - /* Configure SOF VBUS ID DM DP Pins */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | - GPIO_Pin_9 | - GPIO_Pin_11 | - GPIO_Pin_12; - - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; - GPIO_Init(GPIOA, &GPIO_InitStructure); - - GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_OTG1_FS) ; - GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_OTG1_FS) ; - GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG1_FS) ; - GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG1_FS) ; - - /* this for ID line debug */ - - - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_Init(GPIOA, &GPIO_InitStructure); - GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_OTG1_FS) ; - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); - RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE) ; - #else // USE_USB_OTG_HS - - #ifdef USE_ULPI_PHY // ULPI - RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | - RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOH | - RCC_AHB1Periph_GPIOI, ENABLE); - - - GPIO_PinAFConfig(GPIOA,GPIO_PinSource3, GPIO_AF_OTG2_HS) ; // D0 - GPIO_PinAFConfig(GPIOA,GPIO_PinSource5, GPIO_AF_OTG2_HS) ; // CLK - GPIO_PinAFConfig(GPIOB,GPIO_PinSource0, GPIO_AF_OTG2_HS) ; // D1 - GPIO_PinAFConfig(GPIOB,GPIO_PinSource1, GPIO_AF_OTG2_HS) ; // D2 - GPIO_PinAFConfig(GPIOB,GPIO_PinSource5, GPIO_AF_OTG2_HS) ; // D7 - GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_OTG2_HS) ; // D3 - GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_OTG2_HS) ; // D4 - GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_OTG2_HS) ; // D5 - GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_HS) ; // D6 - GPIO_PinAFConfig(GPIOH,GPIO_PinSource4, GPIO_AF_OTG2_HS) ; // NXT - GPIO_PinAFConfig(GPIOI,GPIO_PinSource11,GPIO_AF_OTG2_HS) ; // DIR - GPIO_PinAFConfig(GPIOC,GPIO_PinSource0, GPIO_AF_OTG2_HS) ; // STP - - // CLK - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_Init(GPIOA, &GPIO_InitStructure); - - // D0 - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; - GPIO_Init(GPIOA, &GPIO_InitStructure); - - - - // D1 D2 D3 D4 D5 D6 D7 - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | - GPIO_Pin_5 | GPIO_Pin_10 | - GPIO_Pin_11| GPIO_Pin_12 | - GPIO_Pin_13 ; - - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; - GPIO_Init(GPIOB, &GPIO_InitStructure); - - - // STP - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_Init(GPIOC, &GPIO_InitStructure); - - //NXT - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_Init(GPIOH, &GPIO_InitStructure); - - - //DIR - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_Init(GPIOI, &GPIO_InitStructure); - - - RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS | - RCC_AHB1Periph_OTG_HS_ULPI, ENABLE) ; - - #else - #ifdef USE_I2C_PHY - RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB , ENABLE); - /* Configure RESET INTN SCL SDA (Phy/I2C) Pins */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | - GPIO_Pin_1 | - GPIO_Pin_10 | - GPIO_Pin_11; - - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_Init(GPIOB, &GPIO_InitStructure); - - GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_OTG2_FS) ; - GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_OTG2_FS) ; - GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_OTG2_FS) ; - GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_OTG2_FS); - RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ; - - #else - - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE); - - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | - GPIO_Pin_13 | - GPIO_Pin_14 | - GPIO_Pin_15; - - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_Init(GPIOB, &GPIO_InitStructure); - - GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_OTG2_FS) ; - GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_OTG2_FS) ; - GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_OTG2_FS) ; - GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_OTG2_FS) ; - RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_OTG_HS, ENABLE) ; - #endif - #endif // USE_ULPI_PHY - - #endif //USB_OTG_HS - - - /* enable the PWR clock */ - RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE); - - /* Configure the Key button in EXTI mode */ - //STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); - -#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT - EXTI_ClearITPendingBit(EXTI_Line18); - - EXTI_InitStructure.EXTI_Line = EXTI_Line18; - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; - EXTI_InitStructure.EXTI_LineCmd = ENABLE; - EXTI_Init(&EXTI_InitStructure); - - EXTI_ClearITPendingBit(EXTI_Line18); - - NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_WKUP_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - EXTI_ClearITPendingBit(EXTI_Line18); -#endif - -#ifdef USB_OTG_HS_LOW_PWR_MGMT_SUPPORT - EXTI_ClearITPendingBit(EXTI_Line20); - - EXTI_InitStructure.EXTI_Line = EXTI_Line20; - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; - EXTI_InitStructure.EXTI_LineCmd = ENABLE; - EXTI_Init(&EXTI_InitStructure); - - EXTI_ClearITPendingBit(EXTI_Line20); - - NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_WKUP_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - EXTI_ClearITPendingBit(EXTI_Line20); -#endif - - EXTI_ClearITPendingBit(EXTI_Line0); -} -/** -* @brief USB_OTG_BSP_EnableInterrupt -* Enabele USB Global interrupt -* @param None -* @retval None -*/ -void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev) -{ - NVIC_InitTypeDef NVIC_InitStructure; - - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); -#ifdef USE_USB_OTG_HS - NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_IRQn; -#else - NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn; -#endif - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); - NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_EP1_OUT_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); - NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_EP1_IN_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -#endif -} -/** -* @brief USB_OTG_BSP_uDelay -* This function provides delay time in micro sec -* @param usec : Value of delay required in micro sec -* @retval None -*/ -void USB_OTG_BSP_uDelay (const uint32_t usec) -{ - uint32_t count = 0; - const uint32_t utime = (120 * usec / 7); - do - { - if ( ++count > utime ) - { - return ; - } - } - while (1); -} - - -/** -* @brief USB_OTG_BSP_mDelay -* This function provides delay time in milli sec -* @param msec : Value of delay required in milli sec -* @retval None -*/ -void USB_OTG_BSP_mDelay (const uint32_t msec) -{ - USB_OTG_BSP_uDelay(msec * 1000); -} -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_vcp/usbd_cdc_vcp.c b/car_hw/src/lib/usb_vcp/usbd_cdc_vcp.c deleted file mode 100644 index 17a5a070d6f..00000000000 --- a/car_hw/src/lib/usb_vcp/usbd_cdc_vcp.c +++ /dev/null @@ -1,279 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_vcp.c - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief Generic media access Layer. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED -#pragma data_alignment = 4 -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_vcp.h" -#include "stm32f4xx_conf.h" - -/* Private variables ---------------------------------------------------------*/ -LINE_CODING linecoding = { - 115200, /* baud rate*/ - 0x00, /* stop bits-1*/ - 0x00, /* parity - none*/ - 0x08 /* nb. of bits 8*/ -}; - -USART_InitTypeDef USART_InitStructure; - -/* These are external variables imported from CDC core to be used for IN - transfer management. */ -extern uint8_t APP_Rx_Buffer[]; /* Write CDC received data in this buffer. - These data will be sent over USB IN endpoint - in the CDC core functions. */ -extern uint32_t APP_Rx_ptr_in; /* Increment this pointer or roll it back to - start address when writing received data - in the buffer APP_Rx_Buffer. */ - -/* Private function prototypes -----------------------------------------------*/ -static uint16_t VCP_Init(void); -static uint16_t VCP_DeInit(void); -static uint16_t VCP_Ctrl(uint32_t Cmd, uint8_t* Buf, uint32_t Len); -static uint16_t VCP_DataTx(uint8_t* Buf, uint32_t Len); -static uint16_t VCP_DataRx(uint8_t* Buf, uint32_t Len); - -CDC_IF_Prop_TypeDef VCP_fops = { VCP_Init, VCP_DeInit, VCP_Ctrl, VCP_DataTx, - VCP_DataRx }; - -/* Private functions ---------------------------------------------------------*/ -/** - * @brief VCP_Init - * Initializes the Media on the STM32 - * @param None - * @retval Result of the opeartion (USBD_OK in all cases) - */ -static uint16_t VCP_Init(void) { - return USBD_OK; -} - -/** - * @brief VCP_DeInit - * DeInitializes the Media on the STM32 - * @param None - * @retval Result of the opeartion (USBD_OK in all cases) - */ -static uint16_t VCP_DeInit(void) { - return USBD_OK; -} - -/** - * @brief VCP_Ctrl - * Manage the CDC class requests - * @param Cmd: Command code - * @param Buf: Buffer containing command data (request parameters) - * @param Len: Number of data to be sent (in bytes) - * @retval Result of the opeartion (USBD_OK in all cases) - */ -static uint16_t VCP_Ctrl(uint32_t Cmd, uint8_t* Buf, uint32_t Len) { - switch (Cmd) { - case SEND_ENCAPSULATED_COMMAND: - /* Not needed for this driver */ - break; - - case GET_ENCAPSULATED_RESPONSE: - /* Not needed for this driver */ - break; - - case SET_COMM_FEATURE: - /* Not needed for this driver */ - break; - - case GET_COMM_FEATURE: - /* Not needed for this driver */ - break; - - case CLEAR_COMM_FEATURE: - /* Not needed for this driver */ - break; - - case SET_LINE_CODING: - /* Not needed for this driver */ - break; - - case GET_LINE_CODING: - Buf[0] = (uint8_t) (linecoding.bitrate); - Buf[1] = (uint8_t) (linecoding.bitrate >> 8); - Buf[2] = (uint8_t) (linecoding.bitrate >> 16); - Buf[3] = (uint8_t) (linecoding.bitrate >> 24); - Buf[4] = linecoding.format; - Buf[5] = linecoding.paritytype; - Buf[6] = linecoding.datatype; - break; - - case SET_CONTROL_LINE_STATE: - /* Not needed for this driver */ - break; - - case SEND_BREAK: - /* Not needed for this driver */ - break; - - default: - break; - } - - return USBD_OK; -} - -/** - * @brief putchar - * Sends one char over the USB serial link. - * @param buf: char to be sent - * @retval none - */ - -void VCP_put_char(uint8_t buf) { - VCP_DataTx(&buf, 1); -} - -void VCP_send_str(uint8_t* buf) { - uint32_t i = 0; - while (*(buf + i)) { - i++; - } - VCP_DataTx(buf, i); -} - -void VCP_send_buffer(uint8_t* buf, int len) { - VCP_DataTx(buf, len); -} - -/** - * @brief VCP_DataTx - * CDC received data to be send over USB IN endpoint are managed in - * this function. - * @param Buf: Buffer of data to be sent - * @param Len: Number of data to be sent (in bytes) - * @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL - */ -static uint16_t VCP_DataTx(uint8_t* Buf, uint32_t Len) { - uint32_t i = 0; - while (i < Len) { - APP_Rx_Buffer[APP_Rx_ptr_in] = *(Buf + i); - APP_Rx_ptr_in++; - i++; - /* To avoid buffer overflow */ - if (APP_Rx_ptr_in == APP_RX_DATA_SIZE) { - APP_Rx_ptr_in = 0; - } - } - - return USBD_OK; -} - -/** - * @brief VCP_DataRx - * Data received over USB OUT endpoint are sent over CDC interface - * through this function. - * - * @note - * This function will block any OUT packet reception on USB endpoint - * until exiting this function. If you exit this function before transfer - * is complete on CDC interface (ie. using DMA controller) it will result - * in receiving more data while previous ones are still not sent. - * - * @param Buf: Buffer of data to be received - * @param Len: Number of data received (in bytes) - * @retval Result of the opeartion: USBD_OK if all operations are OK else VCP_FAIL - */ - -#define APP_TX_BUF_SIZE 128 -uint8_t APP_Tx_Buffer[APP_TX_BUF_SIZE]; -uint32_t APP_tx_ptr_head; -uint32_t APP_tx_ptr_tail; - -static uint16_t VCP_DataRx(uint8_t* Buf, uint32_t Len) { - uint32_t i; - - for (i = 0; i < Len; i++) { - APP_Tx_Buffer[APP_tx_ptr_head] = *(Buf + i); - APP_tx_ptr_head++; - if (APP_tx_ptr_head == APP_TX_BUF_SIZE) - APP_tx_ptr_head = 0; - - if (APP_tx_ptr_head == APP_tx_ptr_tail) - return USBD_FAIL; - } - - return USBD_OK; -} - -int VCP_get_char(uint8_t *buf) { - if (APP_tx_ptr_head == APP_tx_ptr_tail) - return 0; - - *buf = APP_Tx_Buffer[APP_tx_ptr_tail]; - APP_tx_ptr_tail++; - if (APP_tx_ptr_tail == APP_TX_BUF_SIZE) - APP_tx_ptr_tail = 0; - - return 1; -} - -int VCP_get_string(uint8_t *buf) { - if (APP_tx_ptr_head == APP_tx_ptr_tail) - return 0; - - while (!APP_Tx_Buffer[APP_tx_ptr_tail] - || APP_Tx_Buffer[APP_tx_ptr_tail] == '\n' - || APP_Tx_Buffer[APP_tx_ptr_tail] == '\r') { - APP_tx_ptr_tail++; - if (APP_tx_ptr_tail == APP_TX_BUF_SIZE) - APP_tx_ptr_tail = 0; - if (APP_tx_ptr_head == APP_tx_ptr_tail) - return 0; - } - - int i = 0; - do { - *(buf + i) = APP_Tx_Buffer[i + APP_tx_ptr_tail]; - i++; - - if ((APP_tx_ptr_tail + i) == APP_TX_BUF_SIZE) - i = -APP_tx_ptr_tail; - if (APP_tx_ptr_head == (APP_tx_ptr_tail + i)) - return 0; - - } while (APP_Tx_Buffer[APP_tx_ptr_tail + i] - && APP_Tx_Buffer[APP_tx_ptr_tail + i] != '\n' - && APP_Tx_Buffer[APP_tx_ptr_tail + i] != '\r'); - - *(buf + i) = 0; - APP_tx_ptr_tail += i; - if (APP_tx_ptr_tail >= APP_TX_BUF_SIZE) - APP_tx_ptr_tail -= APP_TX_BUF_SIZE; - return i; -} - -/** - * @brief EVAL_COM_IRQHandler - * - * @param None. - * @retval None. - */ -void EVAL_COM_IRQHandler(void) { - -} - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_vcp/usbd_cdc_vcp.h b/car_hw/src/lib/usb_vcp/usbd_cdc_vcp.h deleted file mode 100644 index 13e86cd3a05..00000000000 --- a/car_hw/src/lib/usb_vcp/usbd_cdc_vcp.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_vcp.h - * @author MCD Application Team - * @version V1.0.0 - * @date 22-July-2011 - * @brief Header for usbd_cdc_vcp.c file. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CDC_VCP_H -#define __USBD_CDC_VCP_H - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx_conf.h" - -#include "usbd_cdc_core.h" -#include "usbd_conf.h" -#include - -/* Exported typef ------------------------------------------------------------*/ -/* The following structures groups all needed parameters to be configured for the - ComPort. These parameters can modified on the fly by the host through CDC class - command class requests. */ -typedef struct -{ - uint32_t bitrate; - uint8_t format; - uint8_t paritytype; - uint8_t datatype; -}LINE_CODING; - -/* Exported constants --------------------------------------------------------*/ -/* The following define is used to route the USART IRQ handler to be used. - The IRQ handler function is implemented in the usbd_cdc_vcp.c file. */ -#ifdef USE_STM322xG_EVAL - #define EVAL_COM_IRQHandler USART3_IRQHandler -#elif defined(USE_STM3210C_EVAL) - #define EVAL_COM_IRQHandler USART2_IRQHandler -#endif /* USE_STM322xG_EVAL */ - -void VCP_init(void); -void VCP_put_char(uint8_t buf); -void VCP_send_str(uint8_t* buf); -int VCP_get_char(uint8_t *buf); -int VCP_get_string(uint8_t *buf); -void VCP_send_buffer(uint8_t* buf, int len); - -#define DEFAULT_CONFIG 0 -#define OTHER_CONFIG 1 - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#endif /* __USBD_CDC_VCP_H */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_hw/src/lib/usb_vcp/usbd_desc.c b/car_hw/src/lib/usb_vcp/usbd_desc.c deleted file mode 100644 index b4053d02b0a..00000000000 --- a/car_hw/src/lib/usb_vcp/usbd_desc.c +++ /dev/null @@ -1,317 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_desc.c - * @author MCD Application Team - * @version V1.0.0 - * @date 19-September-2011 - * @brief This file provides the USBD descriptors and string formating method. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" -#include "usbd_desc.h" -#include "usbd_req.h" -#include "usbd_conf.h" -#include "usb_regs.h" - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_DESC - * @brief USBD descriptors module - * @{ - */ - -/** @defgroup USBD_DESC_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_DESC_Private_Defines - * @{ - */ - -#define USBD_VID 0x0483 - -#define USBD_PID 0x5740 - -/** @defgroup USB_String_Descriptors - * @{ - */ -#define USBD_LANGID_STRING 0x409 -#define USBD_MANUFACTURER_STRING "STMicroelectronics" - -#define USBD_PRODUCT_HS_STRING "STM32 Virtual ComPort in HS mode" -#define USBD_SERIALNUMBER_HS_STRING "00000000050B" - -#define USBD_PRODUCT_FS_STRING "STM32 Virtual ComPort in FS Mode" -#define USBD_SERIALNUMBER_FS_STRING "00000000050C" - -#define USBD_CONFIGURATION_HS_STRING "VCP Config" -#define USBD_INTERFACE_HS_STRING "VCP Interface" - -#define USBD_CONFIGURATION_FS_STRING "VCP Config" -#define USBD_INTERFACE_FS_STRING "VCP Interface" -/** - * @} - */ - - -/** @defgroup USBD_DESC_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_DESC_Private_Variables - * @{ - */ - -USBD_DEVICE USR_desc = -{ - USBD_USR_DeviceDescriptor, - USBD_USR_LangIDStrDescriptor, - USBD_USR_ManufacturerStrDescriptor, - USBD_USR_ProductStrDescriptor, - USBD_USR_SerialStrDescriptor, - USBD_USR_ConfigStrDescriptor, - USBD_USR_InterfaceStrDescriptor, - -}; - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END = - { - 0x12, /*bLength */ - USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ - 0x00, /*bcdUSB */ - 0x02, - 0x00, /*bDeviceClass*/ - 0x00, /*bDeviceSubClass*/ - 0x00, /*bDeviceProtocol*/ - USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize*/ - LOBYTE(USBD_VID), /*idVendor*/ - HIBYTE(USBD_VID), /*idVendor*/ - LOBYTE(USBD_PID), /*idVendor*/ - HIBYTE(USBD_PID), /*idVendor*/ - 0x00, /*bcdDevice rel. 2.00*/ - 0x02, - USBD_IDX_MFC_STR, /*Index of manufacturer string*/ - USBD_IDX_PRODUCT_STR, /*Index of product string*/ - USBD_IDX_SERIAL_STR, /*Index of serial number string*/ - USBD_CFG_MAX_NUM /*bNumConfigurations*/ - } ; /* USB_DeviceDescriptor */ - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; - -#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED - #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 - #endif -#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID] __ALIGN_END = -{ - USB_SIZ_STRING_LANGID, - USB_DESC_TYPE_STRING, - LOBYTE(USBD_LANGID_STRING), - HIBYTE(USBD_LANGID_STRING), -}; -/** - * @} - */ - - -/** @defgroup USBD_DESC_Private_FunctionPrototypes - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_DESC_Private_Functions - * @{ - */ - -/** -* @brief USBD_USR_DeviceDescriptor -* return the device descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length) -{ - *length = sizeof(USBD_DeviceDesc); - return USBD_DeviceDesc; -} - -/** -* @brief USBD_USR_LangIDStrDescriptor -* return the LangID string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length) -{ - *length = sizeof(USBD_LangIDDesc); - return USBD_LangIDDesc; -} - - -/** -* @brief USBD_USR_ProductStrDescriptor -* return the product string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_USR_ProductStrDescriptor( uint8_t speed , uint16_t *length) -{ - - - if(speed == 0) - { - USBD_GetString ((uint8_t*)USBD_PRODUCT_HS_STRING, USBD_StrDesc, length); - } - else - { - USBD_GetString ((uint8_t*)USBD_PRODUCT_FS_STRING, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - -/** -* @brief USBD_USR_ManufacturerStrDescriptor -* return the manufacturer string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_USR_ManufacturerStrDescriptor( uint8_t speed , uint16_t *length) -{ - USBD_GetString ((uint8_t*)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); - return USBD_StrDesc; -} - -/** -* @brief USBD_USR_SerialStrDescriptor -* return the serial number string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length) -{ - if(speed == USB_OTG_SPEED_HIGH) - { - USBD_GetString ((uint8_t*)USBD_SERIALNUMBER_HS_STRING, USBD_StrDesc, length); - } - else - { - USBD_GetString ((uint8_t*)USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - -/** -* @brief USBD_USR_ConfigStrDescriptor -* return the configuration string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length) -{ - if(speed == USB_OTG_SPEED_HIGH) - { - USBD_GetString ((uint8_t*)USBD_CONFIGURATION_HS_STRING, USBD_StrDesc, length); - } - else - { - USBD_GetString ((uint8_t*)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - - -/** -* @brief USBD_USR_InterfaceStrDescriptor -* return the interface string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length) -{ - if(speed == 0) - { - USBD_GetString ((uint8_t*)USBD_INTERFACE_HS_STRING, USBD_StrDesc, length); - } - else - { - USBD_GetString ((uint8_t*)USBD_INTERFACE_FS_STRING, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ - diff --git a/car_hw/src/lib/usb_vcp/usbd_usr.c b/car_hw/src/lib/usb_vcp/usbd_usr.c deleted file mode 100644 index 395400d29fe..00000000000 --- a/car_hw/src/lib/usb_vcp/usbd_usr.c +++ /dev/null @@ -1,126 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_usr.c - * @author MCD Application Team - * @version V1.0.0 - * @date 19-September-2011 - * @brief This file includes the user application layer - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -#include "usbd_usr.h" -#include "usbd_ioreq.h" - -USBD_Usr_cb_TypeDef USR_cb = -{ - USBD_USR_Init, - USBD_USR_DeviceReset, - USBD_USR_DeviceConfigured, - USBD_USR_DeviceSuspended, - USBD_USR_DeviceResumed, - - USBD_USR_DeviceConnected, - USBD_USR_DeviceDisconnected, -}; - - -/** -* @brief USBD_USR_Init -* Displays the message on LCD for host lib initialization -* @param None -* @retval None -*/ -void USBD_USR_Init(void) -{ - -} - -/** -* @brief USBD_USR_DeviceReset -* Displays the message on LCD on device Reset Event -* @param speed : device speed -* @retval None -*/ -void USBD_USR_DeviceReset(uint8_t speed ) -{ - switch (speed) - { - case USB_OTG_SPEED_HIGH: - break; - - case USB_OTG_SPEED_FULL: - break; - default: - break; - - } -} - - -/** -* @brief USBD_USR_DeviceConfigured -* Displays the message on LCD on device configuration Event -* @param None -* @retval Staus -*/ -void USBD_USR_DeviceConfigured (void) -{ -} - - -/** -* @brief USBD_USR_DeviceConnected -* Displays the message on LCD on device connection Event -* @param None -* @retval Staus -*/ -void USBD_USR_DeviceConnected (void) -{ -} - - -/** -* @brief USBD_USR_DeviceDisonnected -* Displays the message on LCD on device disconnection Event -* @param None -* @retval Staus -*/ -void USBD_USR_DeviceDisconnected (void) -{ -} - -/** -* @brief USBD_USR_DeviceSuspended -* Displays the message on LCD on device suspend Event -* @param None -* @retval None -*/ -void USBD_USR_DeviceSuspended(void) -{ - /* Users can do their application actions here for the USB-Reset */ -} - - -/** -* @brief USBD_USR_DeviceResumed -* Displays the message on LCD on device resume Event -* @param None -* @retval None -*/ -void USBD_USR_DeviceResumed(void) -{ - /* Users can do their application actions here for the USB-Reset */ -} - - diff --git a/car_hw/src/stm32f4xx_it.c b/car_hw/src/stm32f4xx_it.c deleted file mode 100644 index 314958c8e7c..00000000000 --- a/car_hw/src/stm32f4xx_it.c +++ /dev/null @@ -1,188 +0,0 @@ -#include "stm32f4xx_it.h" -#include "stm32f4xx_conf.h" - -#include "usb_core.h" -#include "usbd_core.h" -#include "usbd_cdc_core.h" - -#include "car_time.h" - -extern uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev); -extern USB_OTG_CORE_HANDLE USB_OTG_dev; - -#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED -extern uint32_t USBD_OTG_EP1IN_ISR_Handler (USB_OTG_CORE_HANDLE *pdev); -extern uint32_t USBD_OTG_EP1OUT_ISR_Handler (USB_OTG_CORE_HANDLE *pdev); -#endif - -/** - * @brief This function handles NMI exception. - * @param None - * @retval None - */ -void NMI_Handler(void) -{ -} - -/** - * @brief This function handles Hard Fault exception. - * @param None - * @retval None - */ -void HardFault_Handler(void) -{ - /* Go to infinite loop when Hard Fault exception occurs */ - while (1) - { - } -} - -/** - * @brief This function handles Memory Manage exception. - * @param None - * @retval None - */ -void MemManage_Handler(void) -{ - /* Go to infinite loop when Memory Manage exception occurs */ - while (1) - { - } -} - -/** - * @brief This function handles Bus Fault exception. - * @param None - * @retval None - */ -void BusFault_Handler(void) -{ - /* Go to infinite loop when Bus Fault exception occurs */ - while (1) - { - } -} - -/** - * @brief This function handles Usage Fault exception. - * @param None - * @retval None - */ -void UsageFault_Handler(void) -{ - /* Go to infinite loop when Usage Fault exception occurs */ - while (1) - { - } -} - -/** - * @brief This function handles SVCall exception. - * @param None - * @retval None - */ -void SVC_Handler(void) -{ -} - -/** - * @brief This function handles Debug Monitor exception. - * @param None - * @retval None - */ -void DebugMon_Handler(void) -{ -} - -/** - * @brief This function handles PendSVC exception. - * @param None - * @retval None - */ -void PendSV_Handler(void) -{ -} - -/** - * @brief This function handles SysTick Handler. - * @param None - * @retval None - */ -void SysTick_Handler(void) -{ - car_time_irq_handler(); -} - -/******************************************************************************/ -/* STM32F4xx Peripherals Interrupt Handlers */ -/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ -/* available peripheral interrupt handler's name please refer to the startup */ -/* file (startup_stm32f4xx.s). */ -/******************************************************************************/ - -#ifdef USE_USB_OTG_FS -void OTG_FS_WKUP_IRQHandler(void) -{ - if(USB_OTG_dev.cfg.low_power) - { - *(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ; - SystemInit(); - USB_OTG_UngateClock(&USB_OTG_dev); - } - EXTI_ClearITPendingBit(EXTI_Line18); -} -#endif - -/** - * @brief This function handles EXTI15_10_IRQ Handler. - * @param None - * @retval None - */ -#ifdef USE_USB_OTG_HS -void OTG_HS_WKUP_IRQHandler(void) -{ - if(USB_OTG_dev.cfg.low_power) - { - *(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ; - SystemInit(); - USB_OTG_UngateClock(&USB_OTG_dev); - } - EXTI_ClearITPendingBit(EXTI_Line20); -} -#endif - -/** - * @brief This function handles OTG_HS Handler. - * @param None - * @retval None - */ -#ifdef USE_USB_OTG_HS -void OTG_HS_IRQHandler(void) -#else -void OTG_FS_IRQHandler(void) -#endif -{ - USBD_OTG_ISR_Handler (&USB_OTG_dev); -} - -#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED -/** - * @brief This function handles EP1_IN Handler. - * @param None - * @retval None - */ -void OTG_HS_EP1_IN_IRQHandler(void) -{ - USBD_OTG_EP1IN_ISR_Handler (&USB_OTG_dev); -} - -/** - * @brief This function handles EP1_OUT Handler. - * @param None - * @retval None - */ -void OTG_HS_EP1_OUT_IRQHandler(void) -{ - USBD_OTG_EP1OUT_ISR_Handler (&USB_OTG_dev); -} -#endif diff --git a/car_hw/src/stm32f4xx_it.h b/car_hw/src/stm32f4xx_it.h deleted file mode 100644 index 74f17c9cceb..00000000000 --- a/car_hw/src/stm32f4xx_it.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - ****************************************************************************** - * @file GPIO/IOToggle/stm32f4xx_it.h - * @author MCD Application Team - * @version V1.0.0 - * @date 19-September-2011 - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @attention - * - * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS - * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE - * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE - * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. - * - *

    © COPYRIGHT 2011 STMicroelectronics

    - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_IT_H -#define __STM32F4xx_IT_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -void NMI_Handler(void); -void HardFault_Handler(void); -void MemManage_Handler(void); -void BusFault_Handler(void); -void UsageFault_Handler(void); -void SVC_Handler(void); -void DebugMon_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_IT_H */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/car_srv/clients/flash/.gitignore b/car_srv/clients/flash/.gitignore deleted file mode 100644 index 3f874f512b6..00000000000 --- a/car_srv/clients/flash/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.idea -.gradle -build -out diff --git a/car_srv/clients/flash/.idea/compiler.xml b/car_srv/clients/flash/.idea/compiler.xml deleted file mode 100644 index 96cc43efa6a..00000000000 --- a/car_srv/clients/flash/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/car_srv/clients/flash/.idea/modules.xml b/car_srv/clients/flash/.idea/modules.xml deleted file mode 100644 index dc50270ff20..00000000000 --- a/car_srv/clients/flash/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/car_srv/clients/flash/README.md b/car_srv/clients/flash/README.md deleted file mode 100644 index 3183e5820aa..00000000000 --- a/car_srv/clients/flash/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Firmware client - -## Building - -move to this directory - - $ ./gradlew build - -This command build all project. Executable .jar file placed on ./build/libs - -## Run client - -for run client you can use script - - $ ./run.sh - -run script without params or with --help to see available options diff --git a/car_srv/clients/flash/build.gradle b/car_srv/clients/flash/build.gradle deleted file mode 100644 index 4c6209147ec..00000000000 --- a/car_srv/clients/flash/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -group 'stFlashClient' -version '1.0' - -buildscript { - ext.kotlin_version = '1.0.3' - - repositories { - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -apply plugin: 'java' -apply plugin: 'kotlin' - -sourceCompatibility = 1.5 - -repositories { - mavenCentral() -} - -task compileProto(type: Exec) { - executable "./compileProto.sh" -} -task buildProtoLib(type: Copy) { - //just copy lib src to project - def pathToProtoKotSrc = "../../../proto/compiler/src/" - from pathToProtoKotSrc + "CodedInputStream.kt", pathToProtoKotSrc + "CodedOutputStream.kt", - pathToProtoKotSrc + "WireFormat.kt", pathToProtoKotSrc + "WireType.kt", - pathToProtoKotSrc + "InvalidProtocolBufferException.kt" - into "src/main/java" -} - -task getDeps(type: Copy) { - from sourceSets.main.compileClasspath - into 'build/libs' -} - -build.dependsOn getDeps -compileKotlin.dependsOn compileProto -compileProto.dependsOn buildProtoLib - -jar { - manifest { - attributes("Implementation-Title": "Gradle", - "Implementation-Version": version, - "Class-Path": "jsap-2.1.jar kotlin-runtime-1.0.3.jar kotlin-stdlib-1.0.3.jar netty-all-4.1.2.Final.jar protobuf-java-3.0.0-beta-3.jar", - "Main-Class": "MainKt") - } - -} - -dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - compile group: "com.martiansoftware", name: "jsap", version: "2.1" - compile "com.google.protobuf:protobuf-java:3.0.0-beta-3" - compile "io.netty:netty-all:4.1.2.Final" - - testCompile group: 'junit', name: 'junit', version: '4.11' -} diff --git a/car_srv/clients/flash/compileProto.sh b/car_srv/clients/flash/compileProto.sh deleted file mode 100755 index d2810444d5a..00000000000 --- a/car_srv/clients/flash/compileProto.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -../../../proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc --kotlin_out="./src/main/java" --proto_path="../../../proto" ../../../proto/carkot.proto diff --git a/car_srv/clients/flash/gradle/wrapper/gradle-wrapper.properties b/car_srv/clients/flash/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index a3dceaa60da..00000000000 --- a/car_srv/clients/flash/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Thu Jul 14 11:12:56 MSK 2016 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-all.zip diff --git a/car_srv/clients/flash/gradlew b/car_srv/clients/flash/gradlew deleted file mode 100755 index 9d82f789151..00000000000 --- a/car_srv/clients/flash/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# 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 -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# 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 - -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" ] ; 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 - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/car_srv/clients/flash/run.sh b/car_srv/clients/flash/run.sh deleted file mode 100755 index 8dce5cf2442..00000000000 --- a/car_srv/clients/flash/run.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -java -jar ./build/libs/stFlashClient-1.0.jar $* diff --git a/car_srv/clients/flash/settings.gradle b/car_srv/clients/flash/settings.gradle deleted file mode 100644 index b6a2285d39f..00000000000 --- a/car_srv/clients/flash/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = 'stFlashClient' - diff --git a/car_srv/clients/flash/src/main/java/CodedInputStream.kt b/car_srv/clients/flash/src/main/java/CodedInputStream.kt deleted file mode 100644 index 382cdf620ce..00000000000 --- a/car_srv/clients/flash/src/main/java/CodedInputStream.kt +++ /dev/null @@ -1,305 +0,0 @@ -import java.nio.ByteBuffer -import java.nio.ByteOrder -import WireFormat.VARINT_INFO_BITS_COUNT -import WireFormat.VARINT_INFO_BITS_MASK -import WireFormat.VARINT_UTIL_BIT_MASK - -/** - * Created by Dmitry Savvinov on 7/6/16. - * - * Hides details of work with Protobuf encoding - * - * Note that CodedInputStream reads protobuf-defined types from stream (such as int32, sint32, etc), - * while CodedOutputStream has methods for writing Kotlin-types (such as Boolean, Int, Long, Short, etc) - * - */ - -// TODO: refactor correctness checks into readTag -class CodedInputStream(input: java.io.InputStream) { - val bufferedInput: java.io.BufferedInputStream - init { - bufferedInput = java.io.BufferedInputStream(input) // TODO: Java's realization uses hand-written buffers. Why? - } - - fun readInt32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.VARINT, actualWireType) - return readInt32NoTag() - } - - // Note that unsigned integer types are stored as their signed counterparts with top bit - // simply stored in the sign bit - similar to Java's protobuf implementation. Hence, all - // methods reading unsigned ints simply redirect call to corresponding signed-reading method - fun readUInt32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readUInt32NoTag() - } - - fun readUInt32NoTag(): Int { - return readInt32NoTag() - } - - fun readInt64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readInt64NoTag() - } - - // See note on unsigned integers implementations above - fun readUInt64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readUInt64NoTag() - } - - fun readUInt64NoTag(): Long { - return readInt64NoTag() - } - - fun readBool(expectedFieldNumber: Int): Boolean { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readBoolNoTag() - } - - fun readBoolNoTag(): Boolean { - val readValue = readInt32NoTag() - val boolValue = when (readValue) { - 0 -> false - 1 -> true - else -> throw InvalidProtocolBufferException("Expected boolean-encoding (1 or 0), got $readValue") - } - return boolValue - } - - // Reading enums is like reading one int32 number. Caller is responsible for converting this ordinal to enum-object - fun readEnum(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readEnumNoTag() - } - - fun readEnumNoTag(): Int { - return readUInt32NoTag() - } - - fun readSInt32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readSInt32NoTag() - } - - fun readSInt32NoTag(): Int { - return readZigZag32NoTag() - } - - fun readSInt64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readZigZag64NoTag() - } - - fun readFixed32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.FIX_32) - return readFixed32NoInt() - } - - fun readFixed32NoInt(): Int { - return readLittleEndianInt() - } - - fun readSFixed32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.FIX_32) - return readSFixed32NoTag() - } - - fun readSFixed32NoTag(): Int { - return readLittleEndianInt() - } - - fun readFixed64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.FIX_64) - return readFixed64NoTag() - } - - fun readFixed64NoTag(): Long { - return readLittleEndianLong() - } - - fun readSFixed64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.FIX_64) - return readSFixed64NoTag() - } - - fun readSFixed64NoTag(): Long { - return readLittleEndianLong() - } - - fun readDouble(expectedFieldNumber: Int): Double { - val tag = readTag(expectedFieldNumber, WireType.FIX_64) - return readDoubleNoTag() - } - - fun readDoubleNoTag(): Double { - return readLittleEndianDouble() - } - - fun readFloat(expectedFieldNumber: Int): Float { - val tag = readTag(expectedFieldNumber, WireType.FIX_32) - return readFloatNoTag() - } - - fun readFloatNoTag(): Float { - return readLittleEndianFloat() - } - - fun readString(expectedFieldNumber: Int): String { - val tag = readTag(expectedFieldNumber, WireType.LENGTH_DELIMITED) - return readStringNoTag() - } - - fun readStringNoTag(): String { - val length = readInt32NoTag() - val value = String(readRawBytes(length)) - return value - } - - fun readBytes(expectedFieldNumber: Int): ByteArray { - val tag = readTag(expectedFieldNumber, WireType.LENGTH_DELIMITED) - return readBytesNoTag() - } - - fun readBytesNoTag(): ByteArray { - val length = readInt32NoTag() - return readRawBytes(length) - } - - /** ============ Utility methods ================== - * They are left non-private for cases when one wants to implement her/his own protocol format. - * Then she/he can re-use low-level methods for operating with raw values, that are not annotated with Protobuf tags. - */ - - fun checkFieldCorrectness( - expectedFieldNumber: Int, - actualFieldNumber: Int, - expectedWireType: WireType, - actualWireType: WireType) { - if (expectedFieldNumber != actualFieldNumber) { - throw InvalidProtocolBufferException( - "Error in protocol format: \n " + - "Expected field number ${expectedFieldNumber}, got ${actualFieldNumber}") - } - - if (expectedWireType != actualWireType) { - throw InvalidProtocolBufferException("Error in protocol format: \n " + - "Expected ${expectedWireType.name} type, got ${actualWireType.name}") - } - } - - fun readLittleEndianDouble(): Double { - val byteBuffer = ByteBuffer.wrap(readRawBytes(8)) - byteBuffer.order(ByteOrder.LITTLE_ENDIAN) - return byteBuffer.getDouble(0) - } - - fun readLittleEndianFloat(): Float { - val byteBuffer = ByteBuffer.wrap(readRawBytes(4)) - byteBuffer.order(ByteOrder.LITTLE_ENDIAN) - return byteBuffer.getFloat(0) - } - - fun readLittleEndianInt(): Int { - val byteBuffer = ByteBuffer.wrap(readRawBytes(8)) - byteBuffer.order(ByteOrder.LITTLE_ENDIAN) - return byteBuffer.getInt(0) - } - - fun readLittleEndianLong(): Long { - val byteBuffer = ByteBuffer.wrap(readRawBytes(4)) - byteBuffer.order(ByteOrder.LITTLE_ENDIAN) - return byteBuffer.getLong(0) - } - - fun readRawBytes(count: Int): ByteArray { - val ba = ByteArray(count) - for (i in 0..(count - 1)) { - ba[i] = bufferedInput.read().toByte() - } - return ba - } - - // reads tag. Note that it returns 0 for the end of message! - fun readTag(expectedFieldNumber: Int, expectedWireType: WireType): Int { - if (isAtEnd()) { - return 0 // we can safely return 0 as sign of end of message, because 0-tags are illegal - } - val tag = readInt32NoTag() - if (tag == 0) { // if we somehow had read 0-tag, then message is corrupted - throw InvalidProtocolBufferException("Invalid tag 0") - } - - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, expectedWireType, actualWireType) - return tag - } - - // reads varint not larger than 32-bit integer according to protobuf varint-encoding - fun readInt32NoTag(): Int { - var done: Boolean = false - var result: Int = 0 - var step: Int = 0 - while (!done) { - val byte: Int = bufferedInput.read() - result = result or - ( - (byte and VARINT_INFO_BITS_MASK) - shl - (VARINT_INFO_BITS_COUNT * step) - ) - step++ - if ((byte and VARINT_UTIL_BIT_MASK) == 0) { - done = true - } - } - return result - } - - // reads varint not larger than 64-bit integer according to protobuf varint-encoding - fun readInt64NoTag(): Long { - var done: Boolean = false - var result: Long = 0 - var step: Int = 0 - while (!done) { - val byte: Int = bufferedInput.read() - result = result or - ( - (byte and VARINT_INFO_BITS_MASK).toLong() - shl - (VARINT_INFO_BITS_COUNT * step) - ) - step++ - if ((byte and VARINT_UTIL_BIT_MASK) == 0 || byte == -1) { - done = true - } - } - return result - } - - // reads zig-zag encoded integer not larger than 32-bit long - fun readZigZag32NoTag(): Int { - val value = readInt32NoTag() - return (value shr 1) xor (-(value and 1)) // bit magic for decoding zig-zag number - } - - // reads zig-zag encoded integer not larger than 64-bit long - fun readZigZag64NoTag(): Long { - val value = readInt64NoTag() - return (value shr 1) xor (-(value and 1L)) // bit magic for decoding zig-zag number - } - - // checks if at least one more byte can be read from underlying input stream - fun isAtEnd(): Boolean { - bufferedInput.mark(1) - val byte = bufferedInput.read() - bufferedInput.reset() - return byte == -1 - } -} - diff --git a/car_srv/clients/flash/src/main/java/CodedOutputStream.kt b/car_srv/clients/flash/src/main/java/CodedOutputStream.kt deleted file mode 100644 index 646189cfd8f..00000000000 --- a/car_srv/clients/flash/src/main/java/CodedOutputStream.kt +++ /dev/null @@ -1,258 +0,0 @@ -import java.nio.ByteBuffer -import java.nio.ByteOrder -import WireFormat.VARINT_INFO_BITS_COUNT -import WireFormat.VARINT_INFO_BITS_MASK -import WireFormat.VARINT_UTIL_BIT_MASK - -/** - * Created by user on 7/6/16. - */ - -class CodedOutputStream(val output: java.io.OutputStream) { - fun writeTag(fieldNumber: Int, type: WireType) { - val tag = (fieldNumber shl 3) or type.ordinal - writeInt32NoTag(tag) - } - - fun writeInt32(fieldNumber: Int, value: Int?) { - value ?: return - writeTag(fieldNumber, WireType.VARINT) - writeInt32NoTag(value) - } - - // Note that unsigned integer types are stored as their signed counterparts with top bit - // simply stored in the sign bit - similar to Java's protobuf implementation. Hence, all - // methods, writing unsigned ints simply redirect call to corresponding signed-writing method - fun writeUInt32(fieldNumber: Int, value: Int?) { - value ?: return - writeInt32(fieldNumber, value) - } - - fun writeInt64(fieldNumber: Int, value: Long?) { - value ?: return - writeTag(fieldNumber, WireType.VARINT) - writeInt64NoTag(value) - } - - // See notes on unsigned integers implementation above - fun writeUInt64(fieldNumber: Int, value: Long?) { - value ?: return - writeInt64(fieldNumber, value) - } - - fun writeBool(fieldNumber: Int, value: Boolean?) { - value ?: return - writeTag(fieldNumber, WireType.VARINT) - writeBoolNoTag(value) - } - - fun writeBoolNoTag(value: Boolean) { - writeInt32NoTag(if (value) 1 else 0) - } - - // Writing enums is like writing one int32 number. Caller is responsible for converting enum-object to ordinal - fun writeEnum(fieldNumber: Int, value: Int?) { - value ?: return - writeTag(fieldNumber, WireType.VARINT) - writeEnumNoTag(value) - } - - fun writeEnumNoTag(value: Int) { - writeInt32NoTag(value) - } - - fun writeSInt32(fieldNumber: Int, value: Int?) { - value ?: return - writeTag(fieldNumber, WireType.VARINT) - writeSInt32NoTag(value) - } - - fun writeSInt32NoTag(value: Int) { - writeInt32NoTag((value shl 1) xor (value shr 31)) - } - - fun writeSInt64(fieldNumber: Int, value: Long?) { - value ?: return - writeTag(fieldNumber, WireType.VARINT) - writeSInt64NoTag(value) - } - - fun writeSInt64NoTag(value: Long) { - writeInt64NoTag((value shl 1) xor (value shr 63)) - } - - fun writeFixed32(fieldNumber: Int, value: Int?) { - value ?: return - writeTag(fieldNumber, WireType.FIX_32) - writeFixed32NoTag(value) - } - - fun writeFixed32NoTag(value: Int) { - writeLittleEndian(value) - } - - // See notes on unsigned integers implementation above - fun writeSFixed32(fieldNumber: Int, value: Int?) { - value ?: return - writeTag(fieldNumber, WireType.FIX_32) - writeSFixed32NoTag(value) - } - - fun writeSFixed32NoTag(value: Int) { - writeLittleEndian(value) - } - - fun writeFixed64(fieldNumber: Int, value: Long?) { - value ?: return - writeTag(fieldNumber, WireType.FIX_64) - writeFixed64NoTag(value) - } - - fun writeFixed64NoTag(value: Long) { - writeLittleEndian(value) - } - - // See notes on unsigned integers implementation above - fun writeSFixed64(fieldNumber: Int, value: Long?) { - value ?: return - writeTag(fieldNumber, WireType.FIX_64) - writeSFixed64NoTag(value) - } - - fun writeSFixed64NoTag(value: Long) { - writeLittleEndian(value) - } - - fun writeDouble(fieldNumber: Int, value: Double?) { - value ?: return - writeTag(fieldNumber, WireType.FIX_64) - writeDoubleNoTag(value) - } - - fun writeDoubleNoTag(value: Double) { - writeLittleEndian(value) - } - - fun writeFloat(fieldNumber: Int, value: Float?) { - value ?: return - writeTag(fieldNumber, WireType.FIX_32) - writeFloatNoTag(value) - } - - fun writeFloatNoTag(value: Float) { - writeLittleEndian(value) - } - - fun writeString(fieldNumber: Int, value: String?) { - value ?: return - writeTag(fieldNumber, WireType.LENGTH_DELIMITED) - writeStringNoTag(value) - } - - fun writeStringNoTag(value: String) { - writeInt32NoTag(value.length) - output.write(value.toByteArray(Charsets.UTF_8)) - } - - fun writeBytes(fieldNumber: Int, value: ByteArray?) { - value ?: return - writeTag(fieldNumber, WireType.LENGTH_DELIMITED) - writeBytesNoTag(value) - } - - fun writeBytesNoTag(value: ByteArray) { - writeInt32NoTag(value.size) - output.write(value) - } - - /** ============ Utility methods ================== - * They are left non-private for cases when one wants to implement her/his own protocol format. - * Then she/he can re-use low-level methods for operating with raw values, that are not annotated with Protobuf tags. - */ - - fun writeLittleEndian(value: Int?) { - value ?: return - val bb = ByteBuffer.allocate(4) - bb.order(ByteOrder.LITTLE_ENDIAN) - bb.putInt(value) - output.write(bb.array()) - } - - fun writeLittleEndian(value: Long?) { - value ?: return - val bb = ByteBuffer.allocate(8) - bb.order(ByteOrder.LITTLE_ENDIAN) - bb.putLong(value) - output.write(bb.array()) - } - - fun writeLittleEndian(value: Double?) { - value ?: return - val bb = ByteBuffer.allocate(8) - bb.order(ByteOrder.LITTLE_ENDIAN) - bb.putDouble(value) - output.write(bb.array()) - } - - fun writeLittleEndian(value: Float?) { - value ?: return - val bb = ByteBuffer.allocate(4) - bb.order(ByteOrder.LITTLE_ENDIAN) - bb.putFloat(value) - output.write(bb.array()) - } - - fun writeInt32NoTag(value: Int?) { - value ?: return - var curValue: Int = value - - // we have at most 32 information bits. With overhead of 1 bit per 7 bits we need at most 5 bytes for encoding - val res = ByteArray(5) - - var resSize = 0 - do { - // encode current 7 bits - var curByte = (curValue and WireFormat.VARINT_INFO_BITS_MASK) - - // discard encoded bits. Note that unsigned shift is needed for cases with negative numbers - curValue = curValue ushr VARINT_INFO_BITS_COUNT - - // check if there will be next byte in encoding and set util bit if needed - if (curValue != 0) { - curByte = curByte or VARINT_UTIL_BIT_MASK - } - - res[resSize] = curByte.toByte() - resSize++ - } while(curValue != 0) - output.write(res, 0, resSize) - } - - fun writeInt64NoTag(value: Long?) { - value ?: return - var curValue: Long = value - - // we have at most 64 information bits. With overhead of 1 bit per 7 bits we need at most 10 bytes for encoding - val res = ByteArray(10) - - var resSize = 0 - while(curValue != 0L) { - // encode current 7 bits - var curByte = (curValue and VARINT_INFO_BITS_MASK.toLong()) - - // discard encoded bits. Note that unsigned shift is needed for cases with negative numbers - curValue = curValue ushr VARINT_INFO_BITS_COUNT - - // check if there will be next byte and set util bit if needed - if (curValue != 0L) { - curByte = curByte or VARINT_UTIL_BIT_MASK.toLong() - } - - res[resSize] = curByte.toByte() - resSize++ - } - output.write(res, 0, resSize) - } - - -} diff --git a/car_srv/clients/flash/src/main/java/InvalidProtocolBufferException.kt b/car_srv/clients/flash/src/main/java/InvalidProtocolBufferException.kt deleted file mode 100644 index 91f59d8a91e..00000000000 --- a/car_srv/clients/flash/src/main/java/InvalidProtocolBufferException.kt +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Created by user on 7/7/16. - */ - -class InvalidProtocolBufferException( - override val message: String? = null, - override val cause : Throwable? = null - ) : Throwable(message, cause) { - -} \ No newline at end of file diff --git a/car_srv/clients/flash/src/main/java/Main.kt b/car_srv/clients/flash/src/main/java/Main.kt deleted file mode 100644 index 4041d64dcaa..00000000000 --- a/car_srv/clients/flash/src/main/java/Main.kt +++ /dev/null @@ -1,154 +0,0 @@ -import client.Client -import com.martiansoftware.jsap.FlaggedOption -import com.martiansoftware.jsap.JSAP -import com.martiansoftware.jsap.JSAPResult -import io.netty.buffer.Unpooled -import io.netty.handler.codec.http.* -import java.io.* -import java.util.* - -/** - * Created by user on 7/11/16. - */ -val configFileName = "./config.cfg" - -fun main(args: Array) { - val jsap: JSAP = JSAP() - setOptions(jsap) - - val clArgsConfig = jsap.parse(args) - if (!clArgsConfig.success() || clArgsConfig.getBoolean("help")) { - println(jsap.getHelp()) - return - } - val fileConfig = readFileConfig() - - val host = getActualValue("host", clArgsConfig, fileConfig) - val port = getActualValue("port", clArgsConfig, fileConfig, "8888").toInt() - val mcuSystem = getActualValue("mcuSystem", clArgsConfig, fileConfig, "0x08000000") - val flashFilePath = getActualValue("flash", clArgsConfig, fileConfig) - - val actualValues = mapOf(Pair("host", host), Pair("port", port.toString()), Pair("mcuSystem", mcuSystem), Pair("flash", flashFilePath)) - - if (!isCorrectArguments(actualValues)) { - return - } - var fileBytes: ByteArray = ByteArray(0); - try { - FileInputStream(flashFilePath).use { fis -> - fileBytes = ByteArray(fis.available()) - fis.read(fileBytes) - } - } catch (e: IOException) { - e.printStackTrace() - println("error reading file $flashFilePath") - return; - } - - saveFileConfig(actualValues) - - val uploadObject = Upload.BuilderUpload().setData(fileBytes).setBase(mcuSystem).build() - val uploadBytesStream = ByteArrayOutputStream() - uploadObject.writeTo(CodedOutputStream(uploadBytesStream)) - val request = DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/loadBin", Unpooled.copiedBuffer(uploadBytesStream.toByteArray())); - request.headers().set(HttpHeaderNames.HOST, host) - request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE) - request.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, request.content().readableBytes()) - request.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8") - - val clientInstanse = Client(host, port) - clientInstanse.sendRequest(request) - val requestResult = client.ClientHandler.requestResult - var printString: String = "" - synchronized(requestResult, { - printString = "result code: ${requestResult.code}\n" + - "result error message: ${requestResult.stdErr}\n" + - "result out message: ${requestResult.stdOut}" - }) - println(printString) -} - -fun isCorrectArguments(actualValues: Map): Boolean { - //host and flash file its required. - val host = actualValues.getOrElse("host", { "" }) - val flashFilePath = actualValues.getOrElse("flash", { "" }) - - if (host.equals("") || flashFilePath.equals("")) { - println("incorrect args (host/flash file must be initialized)") - return false; - } - val file = File(flashFilePath) - if (!file.exists()) { - println("file ${file.absoluteFile} not exist") - return false - } - val ipRegex = Regex("^(?:[0-9]{1,3}.){3}[0-9]{1,3}$")//bad regex. skip ip with first zero (10.05.1.1) and with numbers more 255 (300.300.300.300). this ips is correct for this regex - if (!ipRegex.matches(host)) { - println("incorrect server address.") - return false - } - return true -} - -fun saveFileConfig(actualValues: Map) { - var dataToFile = "" - actualValues.forEach { e -> dataToFile += ("${e.key}:${e.value}\n") } - val file = File(configFileName) - if (!file.exists()) { - try { - file.createNewFile() - } catch (e: IOException) { - println("error creating config file. parameters don't saved") - e.printStackTrace() - return - } - } - PrintWriter(file).use { printWriter -> - printWriter.write(dataToFile) - printWriter.flush() - } -} - -fun getActualValue(argName: String, commandLineConfig: JSAPResult, fileConfig: Map, defaultValue: String = ""): String { - return if (commandLineConfig.getString(argName) != null) { - commandLineConfig.getString(argName) - } else { - fileConfig.getOrElse(argName, { - defaultValue - }) - } -} - -fun readFileConfig(): Map { - val result = mutableMapOf() - try { - Scanner(File(configFileName)).use { scanner -> - while (scanner.hasNext()) { - val currentString = scanner.nextLine() - val keyValuePair = currentString.split(":") - if (keyValuePair.size != 2) { - continue - } else { - result.put(keyValuePair[0], keyValuePair[1]) - } - } - } - } catch (e: IOException) { - - } - return result; -} - -fun setOptions(jsap: JSAP) { - val opthost = FlaggedOption("host").setStringParser(JSAP.STRING_PARSER).setRequired(false).setShortFlag('h').setLongFlag("host") - opthost.setHelp("write here only ip address. domain name (e.g. vk.com is incorrect)") - val optPort = FlaggedOption("port").setStringParser(JSAP.INTEGER_PARSER).setRequired(false).setShortFlag('p').setLongFlag("port") - val optBinPath = FlaggedOption("flash").setStringParser(JSAP.STRING_PARSER).setRequired(false).setShortFlag('f').setLongFlag("flash") - val optmcuSystem = FlaggedOption("mcuSystem").setStringParser(JSAP.STRING_PARSER).setRequired(false).setShortFlag('s') - val optHelp = FlaggedOption("help").setStringParser(JSAP.BOOLEAN_PARSER).setRequired(false).setDefault("false").setLongFlag("help") - jsap.registerParameter(opthost) - jsap.registerParameter(optPort) - jsap.registerParameter(optBinPath) - jsap.registerParameter(optmcuSystem) - jsap.registerParameter(optHelp) -} \ No newline at end of file diff --git a/car_srv/clients/flash/src/main/java/WireFormat.kt b/car_srv/clients/flash/src/main/java/WireFormat.kt deleted file mode 100644 index 1caabc33a9c..00000000000 --- a/car_srv/clients/flash/src/main/java/WireFormat.kt +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Created by user on 7/6/16. - */ - - -object WireFormat { - // couple of constants for magic numbers - val TAG_TYPE_BITS: Int = 3 - val TAG_TYPE_MASK: Int = (1 shl TAG_TYPE_BITS) - 1 - val VARINT_INFO_BITS_COUNT: Int = 7 - val VARINT_INFO_BITS_MASK: Int = 0b01111111 // mask for separating lowest 7 bits, where actual information stored - val VARINT_UTIL_BIT_MASK: Int = 0b10000000 // mask for separating highest bit, that indicates next byte presence - val FIXED_32_BYTE_SIZE: Int = 4 - val FIXED_64_BYTE_SIZE: Int = 8 - - fun getTagWireType(tag: Int): WireType { - return WireType from (tag and TAG_TYPE_MASK).toByte() - } - - fun getTagFieldNumber(tag: Int): Int { - return tag ushr TAG_TYPE_BITS - } - - // TODO: refactor casts into function overloading as soon as translator will support it - fun getTagSize(fieldNumber: Int, wireType: WireType): Int { - return getVarint32Size((fieldNumber shl 3) or wireType.ordinal) - } - - fun getVarint32Size(value: Int): Int { - var curValue = value - var size = 0 - while (curValue != 0) { - size += 1 - curValue = value ushr VARINT_INFO_BITS_COUNT - } - return size - } - - fun getVarint64Size(value: Long): Int { - var curValue = value - var size = 0 - while (curValue != 0L) { - size += 1 - curValue = value ushr VARINT_INFO_BITS_COUNT - } - return size - } - - fun getZigZag32Size(value: Int): Int { - return getVarint32Size((value shl 1) xor (value shr 31)) - } - - fun getZigZag64Size(value: Long): Int { - return getVarint64Size((value shl 1) xor (value shr 63)) - } - - fun getInt32Size(fieldNumber: Int, value: Int): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getVarint32Size(value) - } - - fun getUInt32Size(fieldNumber: Int, value: Int): Int { - return getInt32Size(fieldNumber, value) - } - - fun getInt64Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getVarint64Size(value) - } - - fun getUInt64Size(fieldNumber: Int, value: Long): Int { - return getInt64Size(fieldNumber, value) - } - - fun getBoolSize(fieldNumber: Int, value: Boolean): Int { - val intValue = if (value) 1 else 0 - return getInt32Size(fieldNumber, intValue) - } - - fun getEnumSize(fieldNumber: Int, value: Int): Int { - return getInt32Size(fieldNumber, value) - } - - fun getSInt32Size(fieldNumber: Int, value: Int): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getZigZag32Size(value) - } - - fun getSInt64Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getZigZag64Size(value) - } - - fun getFixed32Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.FIX_32) + FIXED_32_BYTE_SIZE - } - - fun getFixed64Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.FIX_64) + FIXED_64_BYTE_SIZE - } - - fun getDoubleSize(fieldNumber: Int, value: Double): Int { - return getTagSize(fieldNumber, WireType.FIX_32) + FIXED_32_BYTE_SIZE - } - - fun getFloatSize(fieldNumber: Int, value: Float): Int { - return getTagSize(fieldNumber, WireType.FIX_64) + FIXED_64_BYTE_SIZE - } - - fun getStringSize(fieldNumber: Int, value: String): Int { - val encodedStringSize = value.toByteArray(Charsets.UTF_8).size //TODO: not sure if it's the best way to do it - return encodedStringSize + getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) + getVarint32Size(encodedStringSize) - } - - fun getBytesSize(fieldNumber: Int, value: ByteArray): Int { - return value.size + getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) + getVarint32Size(value.size) - } -} \ No newline at end of file diff --git a/car_srv/clients/flash/src/main/java/WireType.kt b/car_srv/clients/flash/src/main/java/WireType.kt deleted file mode 100644 index 6cc55da3f42..00000000000 --- a/car_srv/clients/flash/src/main/java/WireType.kt +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Created by Dmitry Savvinov on 7/6/16. - * Enum for possible WireTypes. - * See details at [official Google reference]()https://developers.google.com/protocol-buffers/docs/encoding#structure) - */ - -enum class WireType(val id: Int) { - VARINT(0), // int32, int64, uint32, uint64, sint32, sint64, bool, enum - FIX_64(1), // fixed64, sfixed64, double - LENGTH_DELIMITED(2), // string, bytes, embedded messages, packed repeated fields - START_GROUP(3), // groups (deprecated) - END_GROUP(4), // groups (deprecated) - FIX_32(5); // fixed32, sfixed32, float - - companion object { - infix fun from (value: Byte): WireType { - return when (value) { - 0.toByte() -> VARINT - 1.toByte() -> FIX_64 - 2.toByte() -> LENGTH_DELIMITED - 3.toByte() -> START_GROUP - 4.toByte() -> END_GROUP - 5.toByte() -> FIX_32 - else -> throw IllegalArgumentException() - } - } - } -} \ No newline at end of file diff --git a/car_srv/clients/flash/src/main/java/carkot.kt b/car_srv/clients/flash/src/main/java/carkot.kt deleted file mode 100644 index ee26acafd05..00000000000 --- a/car_srv/clients/flash/src/main/java/carkot.kt +++ /dev/null @@ -1,512 +0,0 @@ -class Upload private constructor (data: ByteArray = ByteArray(0), base: String = "", method: Upload.Method = Upload.Method.BuilderMethod().build()) { - var data : ByteArray - private set - - var base : String - private set - - var method : Upload.Method - private set - - - init { - this.data = data - this.base = base - this.method = method - } - class Method private constructor (type: Upload.Method.TYPE = Upload.Method.TYPE.fromIntToTYPE(0), port: String = "", device: String = "", arguments: MutableList = mutableListOf()) { - var type : Upload.Method.TYPE - private set - - var port : String - private set - - var device : String - private set - - var arguments : MutableList - private set - - - init { - this.type = type - this.port = port - this.device = device - this.arguments = arguments - } - enum class TYPE(val ord: Int) { - DFU (0), - STLINK (1); - - companion object { - fun fromIntToTYPE (ord: Int): TYPE { - return when (ord) { - 0 -> TYPE.DFU - 1 -> TYPE.STLINK - else -> throw InvalidProtocolBufferException("Error: got unexpected int ${ord} while parsing TYPE "); - } - } - } - } - - fun writeTo (output: CodedOutputStream): Unit { - output.writeEnum (1, type.ord) - output.writeString (2, port) - output.writeString (3, device) - if (arguments.size > 0) { - output.writeTag(4, WireType.LENGTH_DELIMITED) - var arrayByteSize = 0 - run { - var arraySize = 0 - for (item in arguments) { - arraySize += WireFormat.getStringSize(4, item) - } - arrayByteSize += arraySize - } - output.writeInt32NoTag(arrayByteSize) - for (item in arguments) { - output.writeString (4, item) - } - } - } - - class BuilderMethod constructor (type: Upload.Method.TYPE = Upload.Method.TYPE.fromIntToTYPE(0), port: String = "", device: String = "", arguments: MutableList = mutableListOf()) { - var type : Upload.Method.TYPE - private set - fun setType(value: Upload.Method.TYPE): Upload.Method.BuilderMethod { - type = value - return this - } - - var port : String - private set - fun setPort(value: String): Upload.Method.BuilderMethod { - port = value - return this - } - - var device : String - private set - fun setDevice(value: String): Upload.Method.BuilderMethod { - device = value - return this - } - - var arguments : MutableList - private set - fun setArguments(value: MutableList ): Upload.Method.BuilderMethod { - arguments = value - return this - } - fun setString(index: Int, value: String): Upload.Method.BuilderMethod { - arguments[index] = value - return this - } - fun addString(value: String): Upload.Method.BuilderMethod { - arguments.add(value) - return this - } - fun addAllString(value: Iterable): Upload.Method.BuilderMethod { - for (item in value) { - arguments.add(item) - } - return this - } - - - init { - this.type = type - this.port = port - this.device = device - this.arguments = arguments - } - - fun readFrom (input: CodedInputStream): Upload.Method.BuilderMethod { - type = Upload.Method.TYPE.fromIntToTYPE(input.readEnum(1)) - port = input.readString(2) - device = input.readString(3) - val tag = input.readTag(4, WireType.LENGTH_DELIMITED) - val expectedSize = input.readInt32NoTag() - var readSize = 0 - while(readSize != expectedSize) { - var tmp: String = "" - tmp = input.readString(4) - readSize += WireFormat.getStringSize(4, tmp) - arguments.add(tmp) - } - return this -} - - fun build(): Upload.Method { - return Upload.Method(type, port, device, arguments) - } - - fun parseFieldFrom(input: CodedInputStream): Boolean { - if (input.isAtEnd()) { return false } - val tag = input.readInt32NoTag() - if (tag == 0) { return false } - val fieldNumber = WireFormat.getTagFieldNumber(tag) - val wireType = WireFormat.getTagWireType(tag) - when(fieldNumber) { - 1 -> type = Upload.Method.TYPE.fromIntToTYPE(input.readEnumNoTag()) - 2 -> port = input.readStringNoTag() - 3 -> device = input.readStringNoTag() - 4 -> { - val expectedSize = input.readInt32NoTag() - var readSize = 0 - while(readSize != expectedSize) { - var tmp: String = "" - tmp = input.readString(4) - readSize += WireFormat.getStringSize(4, tmp) - arguments.add(tmp) - } - } - } - return true} - fun parseFrom(input: CodedInputStream): Upload.Method.BuilderMethod { - while(parseFieldFrom(input)) {} - return this - } - fun getSize(): Int { - var size = 0 - size += WireFormat.getEnumSize(1, type.ord) - size += WireFormat.getStringSize(2, port) - size += WireFormat.getStringSize(3, device) - run { - var arraySize = 0 - for (item in arguments) { - arraySize += WireFormat.getStringSize(4, item) - } - size += arraySize + WireFormat.getTagSize(4, WireType.LENGTH_DELIMITED) + WireFormat.getVarint32Size(arraySize) - } - return size - } - } - - - fun mergeWith (other: Upload.Method) { - type = other.type - port = other.port - device = other.device - arguments.addAll(other.arguments) - } - - fun mergeFrom (input: CodedInputStream) { - val builder = Upload.Method.BuilderMethod() - mergeWith(builder.parseFrom(input).build())} - fun getSize(): Int { - var size = 0 - size += WireFormat.getEnumSize(1, type.ord) - size += WireFormat.getStringSize(2, port) - size += WireFormat.getStringSize(3, device) - run { - var arraySize = 0 - for (item in arguments) { - arraySize += WireFormat.getStringSize(4, item) - } - size += arraySize + WireFormat.getTagSize(4, WireType.LENGTH_DELIMITED) + WireFormat.getVarint32Size(arraySize) - } - return size - } - } - - - fun writeTo (output: CodedOutputStream): Unit { - output.writeBytes (1, data) - output.writeString (2, base) - output.writeTag(3, WireType.LENGTH_DELIMITED) - output.writeInt32NoTag(method.getSize()) - method.writeTo(output) - } - - class BuilderUpload constructor (data: ByteArray = ByteArray(0), base: String = "", method: Upload.Method = Upload.Method.BuilderMethod().build()) { - var data : ByteArray - private set - fun setData(value: ByteArray): Upload.BuilderUpload { - data = value - return this - } - - var base : String - private set - fun setBase(value: String): Upload.BuilderUpload { - base = value - return this - } - - var method : Upload.Method - private set - fun setMethod(value: Upload.Method): Upload.BuilderUpload { - method = value - return this - } - - - init { - this.data = data - this.base = base - this.method = method - } - - fun readFrom (input: CodedInputStream): Upload.BuilderUpload { - data = input.readBytes(1) - base = input.readString(2) - input.readTag(3, WireType.LENGTH_DELIMITED) - val expectedSize = input.readInt32NoTag() - method.mergeFrom(input) - if (expectedSize != method.getSize()) { throw InvalidProtocolBufferException ("Expected size ${expectedSize} got ${method.getSize()}") } - return this -} - - fun build(): Upload { - return Upload(data, base, method) - } - - fun parseFieldFrom(input: CodedInputStream): Boolean { - if (input.isAtEnd()) { return false } - val tag = input.readInt32NoTag() - if (tag == 0) { return false } - val fieldNumber = WireFormat.getTagFieldNumber(tag) - val wireType = WireFormat.getTagWireType(tag) - when(fieldNumber) { - 1 -> data = input.readBytesNoTag() - 2 -> base = input.readStringNoTag() - 3 -> { - input.readTag(3, WireType.LENGTH_DELIMITED) - val expectedSize = input.readInt32NoTag() - method.mergeFrom(input) - if (expectedSize != method.getSize()) { throw InvalidProtocolBufferException ("Expected size ${expectedSize} got ${method.getSize()}") } - } - } - return true} - fun parseFrom(input: CodedInputStream): Upload.BuilderUpload { - while(parseFieldFrom(input)) {} - return this - } - fun getSize(): Int { - var size = 0 - size += WireFormat.getBytesSize(1, data) - size += WireFormat.getStringSize(2, base) - size += method.getSize() + WireFormat.getTagSize(3, WireType.LENGTH_DELIMITED) + WireFormat.getVarint32Size(method.getSize()) - return size - } - } - - - fun mergeWith (other: Upload) { - data.plus(other.data) - base = other.base - method = other.method - } - - fun mergeFrom (input: CodedInputStream) { - val builder = Upload.BuilderUpload() - mergeWith(builder.parseFrom(input).build())} - fun getSize(): Int { - var size = 0 - size += WireFormat.getBytesSize(1, data) - size += WireFormat.getStringSize(2, base) - size += method.getSize() + WireFormat.getTagSize(3, WireType.LENGTH_DELIMITED) + WireFormat.getVarint32Size(method.getSize()) - return size - } -} - - -class UploadResult private constructor (stdOut: String = "", stdErr: String = "", resultCode: Int = 0) { - var stdOut : String - private set - - var stdErr : String - private set - - var resultCode : Int - private set - - - init { - this.stdOut = stdOut - this.stdErr = stdErr - this.resultCode = resultCode - } - - fun writeTo (output: CodedOutputStream): Unit { - output.writeString (1, stdOut) - output.writeString (2, stdErr) - output.writeInt32 (3, resultCode) - } - - class BuilderUploadResult constructor (stdOut: String = "", stdErr: String = "", resultCode: Int = 0) { - var stdOut : String - private set - fun setStdOut(value: String): UploadResult.BuilderUploadResult { - stdOut = value - return this - } - - var stdErr : String - private set - fun setStdErr(value: String): UploadResult.BuilderUploadResult { - stdErr = value - return this - } - - var resultCode : Int - private set - fun setResultCode(value: Int): UploadResult.BuilderUploadResult { - resultCode = value - return this - } - - - init { - this.stdOut = stdOut - this.stdErr = stdErr - this.resultCode = resultCode - } - - fun readFrom (input: CodedInputStream): UploadResult.BuilderUploadResult { - stdOut = input.readString(1) - stdErr = input.readString(2) - resultCode = input.readInt32(3) - return this -} - - fun build(): UploadResult { - return UploadResult(stdOut, stdErr, resultCode) - } - - fun parseFieldFrom(input: CodedInputStream): Boolean { - if (input.isAtEnd()) { return false } - val tag = input.readInt32NoTag() - if (tag == 0) { return false } - val fieldNumber = WireFormat.getTagFieldNumber(tag) - val wireType = WireFormat.getTagWireType(tag) - when(fieldNumber) { - 1 -> stdOut = input.readStringNoTag() - 2 -> stdErr = input.readStringNoTag() - 3 -> resultCode = input.readInt32NoTag() - } - return true} - fun parseFrom(input: CodedInputStream): UploadResult.BuilderUploadResult { - while(parseFieldFrom(input)) {} - return this - } - fun getSize(): Int { - var size = 0 - size += WireFormat.getStringSize(1, stdOut) - size += WireFormat.getStringSize(2, stdErr) - size += WireFormat.getInt32Size(3, resultCode) - return size - } - } - - - fun mergeWith (other: UploadResult) { - stdOut = other.stdOut - stdErr = other.stdErr - resultCode = other.resultCode - } - - fun mergeFrom (input: CodedInputStream) { - val builder = UploadResult.BuilderUploadResult() - mergeWith(builder.parseFrom(input).build())} - fun getSize(): Int { - var size = 0 - size += WireFormat.getStringSize(1, stdOut) - size += WireFormat.getStringSize(2, stdErr) - size += WireFormat.getInt32Size(3, resultCode) - return size - } -} - - -class LogMessage private constructor (source: String = "", message: ByteArray = ByteArray(0)) { - var source : String - private set - - var message : ByteArray - private set - - - init { - this.source = source - this.message = message - } - - fun writeTo (output: CodedOutputStream): Unit { - output.writeString (1, source) - output.writeBytes (2, message) - } - - class BuilderLogMessage constructor (source: String = "", message: ByteArray = ByteArray(0)) { - var source : String - private set - fun setSource(value: String): LogMessage.BuilderLogMessage { - source = value - return this - } - - var message : ByteArray - private set - fun setMessage(value: ByteArray): LogMessage.BuilderLogMessage { - message = value - return this - } - - - init { - this.source = source - this.message = message - } - - fun readFrom (input: CodedInputStream): LogMessage.BuilderLogMessage { - source = input.readString(1) - message = input.readBytes(2) - return this -} - - fun build(): LogMessage { - return LogMessage(source, message) - } - - fun parseFieldFrom(input: CodedInputStream): Boolean { - if (input.isAtEnd()) { return false } - val tag = input.readInt32NoTag() - if (tag == 0) { return false } - val fieldNumber = WireFormat.getTagFieldNumber(tag) - val wireType = WireFormat.getTagWireType(tag) - when(fieldNumber) { - 1 -> source = input.readStringNoTag() - 2 -> message = input.readBytesNoTag() - } - return true} - fun parseFrom(input: CodedInputStream): LogMessage.BuilderLogMessage { - while(parseFieldFrom(input)) {} - return this - } - fun getSize(): Int { - var size = 0 - size += WireFormat.getStringSize(1, source) - size += WireFormat.getBytesSize(2, message) - return size - } - } - - - fun mergeWith (other: LogMessage) { - source = other.source - message.plus(other.message) - } - - fun mergeFrom (input: CodedInputStream) { - val builder = LogMessage.BuilderLogMessage() - mergeWith(builder.parseFrom(input).build())} - fun getSize(): Int { - var size = 0 - size += WireFormat.getStringSize(1, source) - size += WireFormat.getBytesSize(2, message) - return size - } -} - - diff --git a/car_srv/clients/flash/src/main/java/client/Client.kt b/car_srv/clients/flash/src/main/java/client/Client.kt deleted file mode 100644 index 5360c3cb595..00000000000 --- a/car_srv/clients/flash/src/main/java/client/Client.kt +++ /dev/null @@ -1,42 +0,0 @@ -package client - -import io.netty.bootstrap.Bootstrap -import io.netty.channel.nio.NioEventLoopGroup -import io.netty.channel.socket.nio.NioSocketChannel -import io.netty.handler.codec.http.HttpRequest -import java.net.ConnectException - -/** - * Created by user on 7/8/16. - */ -class Client constructor(host: String, port: Int) { - - val host: String - val port: Int - - init { - this.host = host - this.port = port - } - - fun sendRequest(request: HttpRequest) { - val group = NioEventLoopGroup(1) - try { - val bootstrap = Bootstrap() - bootstrap.group(group).channel(NioSocketChannel().javaClass).handler(ClientInitializer()) - val channelFuture = bootstrap.connect(host, port).sync() - val channel = channelFuture.channel() - channel.writeAndFlush(request) - channel.closeFuture().sync() - } catch (e: InterruptedException) { - ClientHandler.requestResult.code = 2 - ClientHandler.requestResult.stdErr = "command execution interrupted" - } catch (e: ConnectException) { - ClientHandler.requestResult.code = 1 - ClientHandler.requestResult.stdErr = "don't can connect to server ($host:$port)" - } finally { - group.shutdownGracefully() - } - } - -} \ No newline at end of file diff --git a/car_srv/clients/flash/src/main/java/client/ClientHandler.kt b/car_srv/clients/flash/src/main/java/client/ClientHandler.kt deleted file mode 100644 index 4ecb15164a2..00000000000 --- a/car_srv/clients/flash/src/main/java/client/ClientHandler.kt +++ /dev/null @@ -1,69 +0,0 @@ -package client - -import CodedInputStream -import UploadResult -import com.google.protobuf.InvalidProtocolBufferException -import io.netty.channel.ChannelHandlerContext -import io.netty.channel.SimpleChannelInboundHandler -import io.netty.handler.codec.http.HttpContent -import java.io.ByteArrayInputStream - -/** - * Created by user on 7/8/16. - */ -class ClientHandler : SimpleChannelInboundHandler { - - object requestResult { - var code: Int = -1 - var stdOut: String = "" - var stdErr: String = "" - } - - constructor() - - var contentBytes: ByteArray = ByteArray(0); - - override fun channelReadComplete(ctx: ChannelHandlerContext) { - - if (contentBytes.size == 0) { - ctx.close() - return - } - - val resultCode: Int - val resultStdOut: String - val resultStdErr: String - try { - val uploadResult = UploadResult.BuilderUploadResult().build() - uploadResult.mergeFrom(CodedInputStream(ByteArrayInputStream(contentBytes))) - resultCode = uploadResult.resultCode - resultStdOut = uploadResult.stdOut - resultStdErr = uploadResult.stdErr - } catch (e: InvalidProtocolBufferException) { - resultStdErr = "protobuf parsing error. bytes from server is not message. stack trace:\n ${e.message}" - resultStdOut = "" - resultCode = 1 - } - synchronized(requestResult, { - requestResult.code = resultCode - requestResult.stdErr = resultStdErr - requestResult.stdOut = resultStdOut - }) - ctx.close() - } - - override fun channelRead0(ctx: ChannelHandlerContext?, msg: Any?) { - if (msg is HttpContent) { - val contentsBytes = msg.content(); - contentBytes = ByteArray(contentsBytes.capacity()) - contentsBytes.readBytes(contentBytes) - } - } - - override fun exceptionCaught(ctx: ChannelHandlerContext?, cause: Throwable) { - cause.printStackTrace() - if (ctx != null) { - ctx.close() - } - } -} \ No newline at end of file diff --git a/car_srv/clients/flash/src/main/java/client/ClientInitializer.kt b/car_srv/clients/flash/src/main/java/client/ClientInitializer.kt deleted file mode 100644 index 9110caba152..00000000000 --- a/car_srv/clients/flash/src/main/java/client/ClientInitializer.kt +++ /dev/null @@ -1,19 +0,0 @@ -package client - -import io.netty.channel.ChannelInitializer -import io.netty.channel.socket.SocketChannel -import io.netty.handler.codec.http.HttpClientCodec - -/** - * Created by user on 7/8/16. - */ -class ClientInitializer : ChannelInitializer { - - constructor() - - override fun initChannel(ch: SocketChannel) { - val p = ch.pipeline() - p.addLast(HttpClientCodec()) - p.addLast(ClientHandler()) - } -} \ No newline at end of file diff --git a/car_srv/clients/rc/.gitignore b/car_srv/clients/rc/.gitignore deleted file mode 100644 index 3f874f512b6..00000000000 --- a/car_srv/clients/rc/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.idea -.gradle -build -out diff --git a/car_srv/clients/rc/README.md b/car_srv/clients/rc/README.md deleted file mode 100644 index e286cbb89cf..00000000000 --- a/car_srv/clients/rc/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Remote control client - -## Building - -move to this directory - - $ ./gradlew build - -This command build all project. Executable .jar file placed on ./build/libs - -## Run client - -for run client you can use script - - $ ./run.sh - -run script without params or with --help to see available options diff --git a/car_srv/clients/rc/build.gradle b/car_srv/clients/rc/build.gradle deleted file mode 100644 index 14832d99142..00000000000 --- a/car_srv/clients/rc/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -group 'CarCtl' -version '1.0' - -buildscript { - ext.kotlin_version = '1.0.3' - - repositories { - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -apply plugin: 'java' -apply plugin: 'kotlin' - -sourceCompatibility = 1.5 - -task compileProto(type: Exec) { - executable "./compileProto.sh" -} -task buildProtoLib(type: Copy) { - //just copy lib src to project - def pathToProtoKotSrc = "../../../proto/compiler/src/" - from pathToProtoKotSrc + "CodedInputStream.kt", pathToProtoKotSrc + "CodedOutputStream.kt", - pathToProtoKotSrc + "WireFormat.kt", pathToProtoKotSrc + "WireType.kt", - pathToProtoKotSrc + "InvalidProtocolBufferException.kt" - into "src/main/java" -} - -task getDeps(type: Copy) { - from sourceSets.main.compileClasspath - into 'build/libs' -} - -build.dependsOn getDeps -compileKotlin.dependsOn compileProto -compileProto.dependsOn buildProtoLib -repositories { - mavenCentral() -} - -jar { - manifest { - attributes("Implementation-Title": "Gradle", - "Implementation-Version": version, - "Class-Path": "jsap-2.1.jar kotlin-runtime-1.0.3.jar kotlin-stdlib-1.0.3.jar netty-all-4.1.2.Final.jar protobuf-java-3.0.0-beta-3.jar", - "Main-Class": "MainKt") - } - -} - -dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - compile "io.netty:netty-all:4.1.2.Final" - compile "com.google.protobuf:protobuf-java:3.0.0-beta-3" - compile group: "com.martiansoftware", name: "jsap", version: "2.1" - - - testCompile group: 'junit', name: 'junit', version: '4.11' -} diff --git a/car_srv/clients/rc/compileProto.sh b/car_srv/clients/rc/compileProto.sh deleted file mode 100755 index cdbcce30ee3..00000000000 --- a/car_srv/clients/rc/compileProto.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -../../../proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc --kotlin_out="./src/main/java" --proto_path="../../../proto/server_car" ../../../proto/server_car/direction.proto ../../../proto/server_car/rc_session.proto diff --git a/car_srv/clients/rc/gradle/wrapper/gradle-wrapper.jar b/car_srv/clients/rc/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 941144813d241db74e1bf25b6804c679fbe7f0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53636 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 DXC5Z7 diff --git a/car_srv/clients/rc/gradle/wrapper/gradle-wrapper.properties b/car_srv/clients/rc/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index a3dceaa60da..00000000000 --- a/car_srv/clients/rc/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Thu Jul 14 11:12:56 MSK 2016 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-all.zip diff --git a/car_srv/clients/rc/gradlew b/car_srv/clients/rc/gradlew deleted file mode 100755 index 9d82f789151..00000000000 --- a/car_srv/clients/rc/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# 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 -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# 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 - -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" ] ; 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 - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/car_srv/clients/rc/gradlew.bat b/car_srv/clients/rc/gradlew.bat deleted file mode 100644 index aec99730b4e..00000000000 --- a/car_srv/clients/rc/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@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 - -@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= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@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 Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_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=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -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/car_srv/clients/rc/run.sh b/car_srv/clients/rc/run.sh deleted file mode 100755 index f6e70b893f6..00000000000 --- a/car_srv/clients/rc/run.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -java -jar ./build/libs/CarCtl-1.0.jar $* diff --git a/car_srv/clients/rc/settings.gradle b/car_srv/clients/rc/settings.gradle deleted file mode 100644 index 285dbcd8fb2..00000000000 --- a/car_srv/clients/rc/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = 'CarCtl' - diff --git a/car_srv/clients/rc/src/main/java/CarControl.kt b/car_srv/clients/rc/src/main/java/CarControl.kt deleted file mode 100644 index 519f0595ca8..00000000000 --- a/car_srv/clients/rc/src/main/java/CarControl.kt +++ /dev/null @@ -1,30 +0,0 @@ -import clientClasses.Client -import java.io.ByteArrayOutputStream - -/** - * Created by user on 7/14/16. - */ -class CarControl constructor(client: Client) { - - val client: Client - var sid: Int - - init { - this.client = client - this.sid = 0 - } - - fun executeCommand(command: DirectionRequest.Command) { - - val directionBuilder = DirectionRequest.BuilderDirectionRequest() - directionBuilder.setCommand(command).setSid(sid) - val byteArrayStream = ByteArrayOutputStream() - - directionBuilder.build().writeTo(CodedOutputStream(byteArrayStream)) - val request = getDefaultHttpRequest(client.host, controlUrl, byteArrayStream) - - client.sendRequest(request) - } -} - - diff --git a/car_srv/clients/rc/src/main/java/CodedInputStream.kt b/car_srv/clients/rc/src/main/java/CodedInputStream.kt deleted file mode 100644 index 382cdf620ce..00000000000 --- a/car_srv/clients/rc/src/main/java/CodedInputStream.kt +++ /dev/null @@ -1,305 +0,0 @@ -import java.nio.ByteBuffer -import java.nio.ByteOrder -import WireFormat.VARINT_INFO_BITS_COUNT -import WireFormat.VARINT_INFO_BITS_MASK -import WireFormat.VARINT_UTIL_BIT_MASK - -/** - * Created by Dmitry Savvinov on 7/6/16. - * - * Hides details of work with Protobuf encoding - * - * Note that CodedInputStream reads protobuf-defined types from stream (such as int32, sint32, etc), - * while CodedOutputStream has methods for writing Kotlin-types (such as Boolean, Int, Long, Short, etc) - * - */ - -// TODO: refactor correctness checks into readTag -class CodedInputStream(input: java.io.InputStream) { - val bufferedInput: java.io.BufferedInputStream - init { - bufferedInput = java.io.BufferedInputStream(input) // TODO: Java's realization uses hand-written buffers. Why? - } - - fun readInt32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.VARINT, actualWireType) - return readInt32NoTag() - } - - // Note that unsigned integer types are stored as their signed counterparts with top bit - // simply stored in the sign bit - similar to Java's protobuf implementation. Hence, all - // methods reading unsigned ints simply redirect call to corresponding signed-reading method - fun readUInt32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readUInt32NoTag() - } - - fun readUInt32NoTag(): Int { - return readInt32NoTag() - } - - fun readInt64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readInt64NoTag() - } - - // See note on unsigned integers implementations above - fun readUInt64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readUInt64NoTag() - } - - fun readUInt64NoTag(): Long { - return readInt64NoTag() - } - - fun readBool(expectedFieldNumber: Int): Boolean { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readBoolNoTag() - } - - fun readBoolNoTag(): Boolean { - val readValue = readInt32NoTag() - val boolValue = when (readValue) { - 0 -> false - 1 -> true - else -> throw InvalidProtocolBufferException("Expected boolean-encoding (1 or 0), got $readValue") - } - return boolValue - } - - // Reading enums is like reading one int32 number. Caller is responsible for converting this ordinal to enum-object - fun readEnum(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readEnumNoTag() - } - - fun readEnumNoTag(): Int { - return readUInt32NoTag() - } - - fun readSInt32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readSInt32NoTag() - } - - fun readSInt32NoTag(): Int { - return readZigZag32NoTag() - } - - fun readSInt64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readZigZag64NoTag() - } - - fun readFixed32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.FIX_32) - return readFixed32NoInt() - } - - fun readFixed32NoInt(): Int { - return readLittleEndianInt() - } - - fun readSFixed32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.FIX_32) - return readSFixed32NoTag() - } - - fun readSFixed32NoTag(): Int { - return readLittleEndianInt() - } - - fun readFixed64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.FIX_64) - return readFixed64NoTag() - } - - fun readFixed64NoTag(): Long { - return readLittleEndianLong() - } - - fun readSFixed64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.FIX_64) - return readSFixed64NoTag() - } - - fun readSFixed64NoTag(): Long { - return readLittleEndianLong() - } - - fun readDouble(expectedFieldNumber: Int): Double { - val tag = readTag(expectedFieldNumber, WireType.FIX_64) - return readDoubleNoTag() - } - - fun readDoubleNoTag(): Double { - return readLittleEndianDouble() - } - - fun readFloat(expectedFieldNumber: Int): Float { - val tag = readTag(expectedFieldNumber, WireType.FIX_32) - return readFloatNoTag() - } - - fun readFloatNoTag(): Float { - return readLittleEndianFloat() - } - - fun readString(expectedFieldNumber: Int): String { - val tag = readTag(expectedFieldNumber, WireType.LENGTH_DELIMITED) - return readStringNoTag() - } - - fun readStringNoTag(): String { - val length = readInt32NoTag() - val value = String(readRawBytes(length)) - return value - } - - fun readBytes(expectedFieldNumber: Int): ByteArray { - val tag = readTag(expectedFieldNumber, WireType.LENGTH_DELIMITED) - return readBytesNoTag() - } - - fun readBytesNoTag(): ByteArray { - val length = readInt32NoTag() - return readRawBytes(length) - } - - /** ============ Utility methods ================== - * They are left non-private for cases when one wants to implement her/his own protocol format. - * Then she/he can re-use low-level methods for operating with raw values, that are not annotated with Protobuf tags. - */ - - fun checkFieldCorrectness( - expectedFieldNumber: Int, - actualFieldNumber: Int, - expectedWireType: WireType, - actualWireType: WireType) { - if (expectedFieldNumber != actualFieldNumber) { - throw InvalidProtocolBufferException( - "Error in protocol format: \n " + - "Expected field number ${expectedFieldNumber}, got ${actualFieldNumber}") - } - - if (expectedWireType != actualWireType) { - throw InvalidProtocolBufferException("Error in protocol format: \n " + - "Expected ${expectedWireType.name} type, got ${actualWireType.name}") - } - } - - fun readLittleEndianDouble(): Double { - val byteBuffer = ByteBuffer.wrap(readRawBytes(8)) - byteBuffer.order(ByteOrder.LITTLE_ENDIAN) - return byteBuffer.getDouble(0) - } - - fun readLittleEndianFloat(): Float { - val byteBuffer = ByteBuffer.wrap(readRawBytes(4)) - byteBuffer.order(ByteOrder.LITTLE_ENDIAN) - return byteBuffer.getFloat(0) - } - - fun readLittleEndianInt(): Int { - val byteBuffer = ByteBuffer.wrap(readRawBytes(8)) - byteBuffer.order(ByteOrder.LITTLE_ENDIAN) - return byteBuffer.getInt(0) - } - - fun readLittleEndianLong(): Long { - val byteBuffer = ByteBuffer.wrap(readRawBytes(4)) - byteBuffer.order(ByteOrder.LITTLE_ENDIAN) - return byteBuffer.getLong(0) - } - - fun readRawBytes(count: Int): ByteArray { - val ba = ByteArray(count) - for (i in 0..(count - 1)) { - ba[i] = bufferedInput.read().toByte() - } - return ba - } - - // reads tag. Note that it returns 0 for the end of message! - fun readTag(expectedFieldNumber: Int, expectedWireType: WireType): Int { - if (isAtEnd()) { - return 0 // we can safely return 0 as sign of end of message, because 0-tags are illegal - } - val tag = readInt32NoTag() - if (tag == 0) { // if we somehow had read 0-tag, then message is corrupted - throw InvalidProtocolBufferException("Invalid tag 0") - } - - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, expectedWireType, actualWireType) - return tag - } - - // reads varint not larger than 32-bit integer according to protobuf varint-encoding - fun readInt32NoTag(): Int { - var done: Boolean = false - var result: Int = 0 - var step: Int = 0 - while (!done) { - val byte: Int = bufferedInput.read() - result = result or - ( - (byte and VARINT_INFO_BITS_MASK) - shl - (VARINT_INFO_BITS_COUNT * step) - ) - step++ - if ((byte and VARINT_UTIL_BIT_MASK) == 0) { - done = true - } - } - return result - } - - // reads varint not larger than 64-bit integer according to protobuf varint-encoding - fun readInt64NoTag(): Long { - var done: Boolean = false - var result: Long = 0 - var step: Int = 0 - while (!done) { - val byte: Int = bufferedInput.read() - result = result or - ( - (byte and VARINT_INFO_BITS_MASK).toLong() - shl - (VARINT_INFO_BITS_COUNT * step) - ) - step++ - if ((byte and VARINT_UTIL_BIT_MASK) == 0 || byte == -1) { - done = true - } - } - return result - } - - // reads zig-zag encoded integer not larger than 32-bit long - fun readZigZag32NoTag(): Int { - val value = readInt32NoTag() - return (value shr 1) xor (-(value and 1)) // bit magic for decoding zig-zag number - } - - // reads zig-zag encoded integer not larger than 64-bit long - fun readZigZag64NoTag(): Long { - val value = readInt64NoTag() - return (value shr 1) xor (-(value and 1L)) // bit magic for decoding zig-zag number - } - - // checks if at least one more byte can be read from underlying input stream - fun isAtEnd(): Boolean { - bufferedInput.mark(1) - val byte = bufferedInput.read() - bufferedInput.reset() - return byte == -1 - } -} - diff --git a/car_srv/clients/rc/src/main/java/CodedOutputStream.kt b/car_srv/clients/rc/src/main/java/CodedOutputStream.kt deleted file mode 100644 index 646189cfd8f..00000000000 --- a/car_srv/clients/rc/src/main/java/CodedOutputStream.kt +++ /dev/null @@ -1,258 +0,0 @@ -import java.nio.ByteBuffer -import java.nio.ByteOrder -import WireFormat.VARINT_INFO_BITS_COUNT -import WireFormat.VARINT_INFO_BITS_MASK -import WireFormat.VARINT_UTIL_BIT_MASK - -/** - * Created by user on 7/6/16. - */ - -class CodedOutputStream(val output: java.io.OutputStream) { - fun writeTag(fieldNumber: Int, type: WireType) { - val tag = (fieldNumber shl 3) or type.ordinal - writeInt32NoTag(tag) - } - - fun writeInt32(fieldNumber: Int, value: Int?) { - value ?: return - writeTag(fieldNumber, WireType.VARINT) - writeInt32NoTag(value) - } - - // Note that unsigned integer types are stored as their signed counterparts with top bit - // simply stored in the sign bit - similar to Java's protobuf implementation. Hence, all - // methods, writing unsigned ints simply redirect call to corresponding signed-writing method - fun writeUInt32(fieldNumber: Int, value: Int?) { - value ?: return - writeInt32(fieldNumber, value) - } - - fun writeInt64(fieldNumber: Int, value: Long?) { - value ?: return - writeTag(fieldNumber, WireType.VARINT) - writeInt64NoTag(value) - } - - // See notes on unsigned integers implementation above - fun writeUInt64(fieldNumber: Int, value: Long?) { - value ?: return - writeInt64(fieldNumber, value) - } - - fun writeBool(fieldNumber: Int, value: Boolean?) { - value ?: return - writeTag(fieldNumber, WireType.VARINT) - writeBoolNoTag(value) - } - - fun writeBoolNoTag(value: Boolean) { - writeInt32NoTag(if (value) 1 else 0) - } - - // Writing enums is like writing one int32 number. Caller is responsible for converting enum-object to ordinal - fun writeEnum(fieldNumber: Int, value: Int?) { - value ?: return - writeTag(fieldNumber, WireType.VARINT) - writeEnumNoTag(value) - } - - fun writeEnumNoTag(value: Int) { - writeInt32NoTag(value) - } - - fun writeSInt32(fieldNumber: Int, value: Int?) { - value ?: return - writeTag(fieldNumber, WireType.VARINT) - writeSInt32NoTag(value) - } - - fun writeSInt32NoTag(value: Int) { - writeInt32NoTag((value shl 1) xor (value shr 31)) - } - - fun writeSInt64(fieldNumber: Int, value: Long?) { - value ?: return - writeTag(fieldNumber, WireType.VARINT) - writeSInt64NoTag(value) - } - - fun writeSInt64NoTag(value: Long) { - writeInt64NoTag((value shl 1) xor (value shr 63)) - } - - fun writeFixed32(fieldNumber: Int, value: Int?) { - value ?: return - writeTag(fieldNumber, WireType.FIX_32) - writeFixed32NoTag(value) - } - - fun writeFixed32NoTag(value: Int) { - writeLittleEndian(value) - } - - // See notes on unsigned integers implementation above - fun writeSFixed32(fieldNumber: Int, value: Int?) { - value ?: return - writeTag(fieldNumber, WireType.FIX_32) - writeSFixed32NoTag(value) - } - - fun writeSFixed32NoTag(value: Int) { - writeLittleEndian(value) - } - - fun writeFixed64(fieldNumber: Int, value: Long?) { - value ?: return - writeTag(fieldNumber, WireType.FIX_64) - writeFixed64NoTag(value) - } - - fun writeFixed64NoTag(value: Long) { - writeLittleEndian(value) - } - - // See notes on unsigned integers implementation above - fun writeSFixed64(fieldNumber: Int, value: Long?) { - value ?: return - writeTag(fieldNumber, WireType.FIX_64) - writeSFixed64NoTag(value) - } - - fun writeSFixed64NoTag(value: Long) { - writeLittleEndian(value) - } - - fun writeDouble(fieldNumber: Int, value: Double?) { - value ?: return - writeTag(fieldNumber, WireType.FIX_64) - writeDoubleNoTag(value) - } - - fun writeDoubleNoTag(value: Double) { - writeLittleEndian(value) - } - - fun writeFloat(fieldNumber: Int, value: Float?) { - value ?: return - writeTag(fieldNumber, WireType.FIX_32) - writeFloatNoTag(value) - } - - fun writeFloatNoTag(value: Float) { - writeLittleEndian(value) - } - - fun writeString(fieldNumber: Int, value: String?) { - value ?: return - writeTag(fieldNumber, WireType.LENGTH_DELIMITED) - writeStringNoTag(value) - } - - fun writeStringNoTag(value: String) { - writeInt32NoTag(value.length) - output.write(value.toByteArray(Charsets.UTF_8)) - } - - fun writeBytes(fieldNumber: Int, value: ByteArray?) { - value ?: return - writeTag(fieldNumber, WireType.LENGTH_DELIMITED) - writeBytesNoTag(value) - } - - fun writeBytesNoTag(value: ByteArray) { - writeInt32NoTag(value.size) - output.write(value) - } - - /** ============ Utility methods ================== - * They are left non-private for cases when one wants to implement her/his own protocol format. - * Then she/he can re-use low-level methods for operating with raw values, that are not annotated with Protobuf tags. - */ - - fun writeLittleEndian(value: Int?) { - value ?: return - val bb = ByteBuffer.allocate(4) - bb.order(ByteOrder.LITTLE_ENDIAN) - bb.putInt(value) - output.write(bb.array()) - } - - fun writeLittleEndian(value: Long?) { - value ?: return - val bb = ByteBuffer.allocate(8) - bb.order(ByteOrder.LITTLE_ENDIAN) - bb.putLong(value) - output.write(bb.array()) - } - - fun writeLittleEndian(value: Double?) { - value ?: return - val bb = ByteBuffer.allocate(8) - bb.order(ByteOrder.LITTLE_ENDIAN) - bb.putDouble(value) - output.write(bb.array()) - } - - fun writeLittleEndian(value: Float?) { - value ?: return - val bb = ByteBuffer.allocate(4) - bb.order(ByteOrder.LITTLE_ENDIAN) - bb.putFloat(value) - output.write(bb.array()) - } - - fun writeInt32NoTag(value: Int?) { - value ?: return - var curValue: Int = value - - // we have at most 32 information bits. With overhead of 1 bit per 7 bits we need at most 5 bytes for encoding - val res = ByteArray(5) - - var resSize = 0 - do { - // encode current 7 bits - var curByte = (curValue and WireFormat.VARINT_INFO_BITS_MASK) - - // discard encoded bits. Note that unsigned shift is needed for cases with negative numbers - curValue = curValue ushr VARINT_INFO_BITS_COUNT - - // check if there will be next byte in encoding and set util bit if needed - if (curValue != 0) { - curByte = curByte or VARINT_UTIL_BIT_MASK - } - - res[resSize] = curByte.toByte() - resSize++ - } while(curValue != 0) - output.write(res, 0, resSize) - } - - fun writeInt64NoTag(value: Long?) { - value ?: return - var curValue: Long = value - - // we have at most 64 information bits. With overhead of 1 bit per 7 bits we need at most 10 bytes for encoding - val res = ByteArray(10) - - var resSize = 0 - while(curValue != 0L) { - // encode current 7 bits - var curByte = (curValue and VARINT_INFO_BITS_MASK.toLong()) - - // discard encoded bits. Note that unsigned shift is needed for cases with negative numbers - curValue = curValue ushr VARINT_INFO_BITS_COUNT - - // check if there will be next byte and set util bit if needed - if (curValue != 0L) { - curByte = curByte or VARINT_UTIL_BIT_MASK.toLong() - } - - res[resSize] = curByte.toByte() - resSize++ - } - output.write(res, 0, resSize) - } - - -} diff --git a/car_srv/clients/rc/src/main/java/InvalidProtocolBufferException.kt b/car_srv/clients/rc/src/main/java/InvalidProtocolBufferException.kt deleted file mode 100644 index 91f59d8a91e..00000000000 --- a/car_srv/clients/rc/src/main/java/InvalidProtocolBufferException.kt +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Created by user on 7/7/16. - */ - -class InvalidProtocolBufferException( - override val message: String? = null, - override val cause : Throwable? = null - ) : Throwable(message, cause) { - -} \ No newline at end of file diff --git a/car_srv/clients/rc/src/main/java/Main.kt b/car_srv/clients/rc/src/main/java/Main.kt deleted file mode 100644 index 4a698ca5792..00000000000 --- a/car_srv/clients/rc/src/main/java/Main.kt +++ /dev/null @@ -1,157 +0,0 @@ -import DirectionRequest.Command -import clientClasses.Client -import clientClasses.ClientHandler -import com.martiansoftware.jsap.FlaggedOption -import com.martiansoftware.jsap.JSAP -import io.netty.buffer.Unpooled -import io.netty.handler.codec.http.* -import java.io.ByteArrayOutputStream -import kotlin.concurrent.thread - -/** - * Created by user on 7/14/16. - */ - -//available direction symbols and command for symbol -val correctDirectionMap = mapOf( - Pair('w', Command.forward), - Pair('s', Command.backward), - Pair('a', Command.left), - Pair('d', Command.right), - Pair('h', Command.stop)) - -//urls -val heartbeatUrl = "/rc/heartbeat" -val connectUrl = "/rc/connect" -val disconnectUrl = "/rc/disconnect" -val controlUrl = "/rc/control" - - -fun main(args: Array) { - val jsap: JSAP = JSAP() - setOptions(jsap) - val config = jsap.parse(args) - if (!config.success() || config.getBoolean("help")) { - println(jsap.getHelp()) - return - } - val host = config.getString("host") - val port = config.getInt("port") - - val ipRegex = Regex("^(?:[0-9]{1,3}.){3}[0-9]{1,3}$") - if (!ipRegex.matches(host)) { - println("incorrect server address.") - return - } - - val client = Client(host, port) - val carControl = CarControl(client) - - //connect and get SID - var byteArrayStream = ByteArrayOutputStream() - byteArrayStream.use { - val rcSessionUpRequest = getDefaultHttpRequest(client.host, connectUrl, byteArrayStream) - client.sendRequest(rcSessionUpRequest) - } - val sid = synchronized(ClientHandler.requestResult, { - if (ClientHandler.requestResult.code != 0) { - println("connection refused") - printRequestResult() - 0 - } else { - ClientHandler.requestResult.sid - } - }) - if (sid == 0) { - client.close() - return - } - - //init heartbeat - val byteArrayOutputStream = ByteArrayOutputStream() - byteArrayOutputStream.use { - HeartBeatRequest.BuilderHeartBeatRequest().setSid(sid).build().writeTo(CodedOutputStream(byteArrayOutputStream)) - } - val heartbeatThread = thread { - while (true) { - val heartbeatRequest = getDefaultHttpRequest(client.host, heartbeatUrl, byteArrayOutputStream) - client.sendRequest(heartbeatRequest) - try { - Thread.sleep(400) - } catch (e: InterruptedException) { - break - } - printRequestResult() - } - } - - carControl.sid = sid - initTextInterface(carControl) - - //disconnect - byteArrayStream = ByteArrayOutputStream() - byteArrayStream.use { - SessionDownRequest.BuilderSessionDownRequest().setSid(sid).build().writeTo(CodedOutputStream(byteArrayStream)) - } - val rcSessionDownRequest = getDefaultHttpRequest(client.host, disconnectUrl, byteArrayStream) - client.sendRequest(rcSessionDownRequest) - heartbeatThread.interrupt() - client.close() - printRequestResult() -} - -fun getDefaultHttpRequest(host: String, url: String, byteArrayStream: ByteArrayOutputStream): DefaultFullHttpRequest { - val request = DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, url, Unpooled.copiedBuffer(byteArrayStream.toByteArray())); - request.headers().set(HttpHeaderNames.HOST, host) - request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE) - request.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, request.content().readableBytes()) - request.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8") - return request -} - -fun initTextInterface(carControl: CarControl) { - val helpMessage = "type w, s, a, d, h for command forward, backward, left, right, stop. to exit type q or quit "; - println(helpMessage) - - while (true) { - val nextLine = readLine() - if (nextLine == null) { - return - } - if (nextLine.equals("q", true) || nextLine.equals("quit", true)) { - return - } else if (nextLine.length != 1) { - println("incorrect argument \"$nextLine\"") - println(helpMessage) - } else { - val directionChar = nextLine.get(0) - if (!correctDirectionMap.containsKey(directionChar)) { - println("incorrect argument \"$nextLine\"") - println(helpMessage) - } else { - carControl.executeCommand(correctDirectionMap.get(directionChar)!!) - printRequestResult() - } - } - } -} - -fun printRequestResult() { - synchronized(ClientHandler.requestResult, { - if (ClientHandler.requestResult.code != 0) { - println("result code: ${ClientHandler.requestResult.code}\n" + - "error message: ${ClientHandler.requestResult.errorString}\n" + - "sid: ${ClientHandler.requestResult.sid}") - } - }) -} - -fun setOptions(jsap: JSAP) { - val opthost = FlaggedOption("host").setStringParser(JSAP.STRING_PARSER).setRequired(true).setShortFlag('h').setLongFlag("host") - opthost.setHelp("write here only ip address. domain name (e.g. vk.com is incorrect)") - val optPort = FlaggedOption("port").setStringParser(JSAP.INTEGER_PARSER).setDefault("8888").setRequired(false).setShortFlag('p').setLongFlag("port") - val optHelp = FlaggedOption("help").setStringParser(JSAP.BOOLEAN_PARSER).setRequired(false).setDefault("false").setLongFlag("help") - jsap.registerParameter(opthost) - jsap.registerParameter(optPort) - jsap.registerParameter(optHelp) -} diff --git a/car_srv/clients/rc/src/main/java/WireFormat.kt b/car_srv/clients/rc/src/main/java/WireFormat.kt deleted file mode 100644 index f81259f7496..00000000000 --- a/car_srv/clients/rc/src/main/java/WireFormat.kt +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Created by user on 7/6/16. - */ - - -object WireFormat { - // couple of constants for magic numbers - val TAG_TYPE_BITS: Int = 3 - val TAG_TYPE_MASK: Int = (1 shl TAG_TYPE_BITS) - 1 - val VARINT_INFO_BITS_COUNT: Int = 7 - val VARINT_INFO_BITS_MASK: Int = 0b01111111 // mask for separating lowest 7 bits, where actual information stored - val VARINT_UTIL_BIT_MASK: Int = 0b10000000 // mask for separating highest bit, that indicates next byte presence - val FIXED_32_BYTE_SIZE: Int = 4 - val FIXED_64_BYTE_SIZE: Int = 8 - - fun getTagWireType(tag: Int): WireType { - return WireType from (tag and TAG_TYPE_MASK).toByte() - } - - fun getTagFieldNumber(tag: Int): Int { - return tag ushr TAG_TYPE_BITS - } - - // TODO: refactor casts into function overloading as soon as translator will support it - fun getTagSize(fieldNumber: Int, wireType: WireType): Int { - return getVarint32Size((fieldNumber shl 3) or wireType.ordinal) - } - - fun getVarint32Size(value: Int): Int { - var curValue = value - var size = 0 - while (curValue != 0) { - size += 1 - curValue = value ushr VARINT_INFO_BITS_COUNT - } - return size - } - - fun getVarint64Size(value: Long): Int { - var curValue = value - var size = 0 - while (curValue != 0L) { - size += 1 - curValue = value ushr VARINT_INFO_BITS_COUNT - } - return size - } - - fun getZigZag32Size(value: Int): Int { - return getVarint32Size((value shl 1) xor (value shr 31)) - } - - fun getZigZag64Size(value: Long): Int { - return getVarint64Size((value shl 1) xor (value shr 63)) - } - - fun getInt32Size(fieldNumber: Int, value: Int): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getVarint32Size(value) - } - - fun getUInt32Size(fieldNumber: Int, value: Int): Int { - return getInt32Size(fieldNumber, value) - } - - fun getInt64Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getVarint64Size(value) - } - - fun getUInt64Size(fieldNumber: Int, value: Long): Int { - return getInt64Size(fieldNumber, value) - } - - fun getBoolSize(fieldNumber: Int, value: Boolean): Int { - val intValue = if (value) 1 else 0 - return getInt32Size(fieldNumber, intValue) - } - - fun getEnumSize(fieldNumber: Int, value: Int): Int { - return getInt32Size(fieldNumber, value) - } - - fun getSInt32Size(fieldNumber: Int, value: Int): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getZigZag32Size(value) - } - - fun getSInt64Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getZigZag64Size(value) - } - - fun getFixed32Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.FIX_32) + FIXED_32_BYTE_SIZE - } - - fun getFixed64Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.FIX_64) + FIXED_64_BYTE_SIZE - } - - fun getDoubleSize(fieldNumber: Int, value: Double): Int { - return getTagSize(fieldNumber, WireType.FIX_32) + FIXED_32_BYTE_SIZE - } - - fun getFloatSize(fieldNumber: Int, value: Float): Int { - return getTagSize(fieldNumber, WireType.FIX_64) + FIXED_64_BYTE_SIZE - } - - fun getStringSize(fieldNumber: Int, value: String): Int { - if (value.length == 0) - return 0 - val encodedStringSize = value.toByteArray(Charsets.UTF_8).size //TODO: not sure if it's the best way to do it - return encodedStringSize + getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) + getVarint32Size(encodedStringSize) - } - - fun getBytesSize(fieldNumber: Int, value: ByteArray): Int { - if (value.size == 0) - return 0 - return value.size + getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) + getVarint32Size(value.size) - } -} \ No newline at end of file diff --git a/car_srv/clients/rc/src/main/java/WireType.kt b/car_srv/clients/rc/src/main/java/WireType.kt deleted file mode 100644 index 6cc55da3f42..00000000000 --- a/car_srv/clients/rc/src/main/java/WireType.kt +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Created by Dmitry Savvinov on 7/6/16. - * Enum for possible WireTypes. - * See details at [official Google reference]()https://developers.google.com/protocol-buffers/docs/encoding#structure) - */ - -enum class WireType(val id: Int) { - VARINT(0), // int32, int64, uint32, uint64, sint32, sint64, bool, enum - FIX_64(1), // fixed64, sfixed64, double - LENGTH_DELIMITED(2), // string, bytes, embedded messages, packed repeated fields - START_GROUP(3), // groups (deprecated) - END_GROUP(4), // groups (deprecated) - FIX_32(5); // fixed32, sfixed32, float - - companion object { - infix fun from (value: Byte): WireType { - return when (value) { - 0.toByte() -> VARINT - 1.toByte() -> FIX_64 - 2.toByte() -> LENGTH_DELIMITED - 3.toByte() -> START_GROUP - 4.toByte() -> END_GROUP - 5.toByte() -> FIX_32 - else -> throw IllegalArgumentException() - } - } - } -} \ No newline at end of file diff --git a/car_srv/clients/rc/src/main/java/clientClasses/Client.kt b/car_srv/clients/rc/src/main/java/clientClasses/Client.kt deleted file mode 100644 index 9ae4ec81735..00000000000 --- a/car_srv/clients/rc/src/main/java/clientClasses/Client.kt +++ /dev/null @@ -1,56 +0,0 @@ -package clientClasses - -import io.netty.bootstrap.Bootstrap -import io.netty.channel.EventLoopGroup -import io.netty.channel.nio.NioEventLoopGroup -import io.netty.channel.socket.nio.NioSocketChannel -import io.netty.handler.codec.http.HttpRequest -import io.netty.util.AttributeKey -import java.net.ConnectException - -/** - * Created by user on 7/8/16. - */ -class Client constructor(host: String, port: Int) { - - val host: String - val port: Int - val group: EventLoopGroup - - - init { - this.host = host - this.port = port - group = NioEventLoopGroup(1) - } - - val bootstrap: Bootstrap = makeBootstrap() - - private fun makeBootstrap(): Bootstrap { - val b = Bootstrap() - b.group(group).channel(NioSocketChannel().javaClass).handler(ClientInitializer()) - .attr(AttributeKey.newInstance("url"), "") - return b - } - - fun sendRequest(request: HttpRequest) { - try { - bootstrap.attr(AttributeKey.valueOf("url"), request.uri()) - val channelFuture = bootstrap.connect(host, port).sync() - val channel = channelFuture.channel() - channel.writeAndFlush(request) - channel.closeFuture().sync() - } catch (e: InterruptedException) { - ClientHandler.requestResult.code = 11 - ClientHandler.requestResult.errorString = "command execution interrupted" - } catch (e: ConnectException) { - ClientHandler.requestResult.code = 10 - ClientHandler.requestResult.errorString = "don't can connect to server ($host:$port)" - } - } - - fun close() { - group.shutdownGracefully() - } - -} \ No newline at end of file diff --git a/car_srv/clients/rc/src/main/java/clientClasses/ClientHandler.kt b/car_srv/clients/rc/src/main/java/clientClasses/ClientHandler.kt deleted file mode 100644 index c455ed3ec37..00000000000 --- a/car_srv/clients/rc/src/main/java/clientClasses/ClientHandler.kt +++ /dev/null @@ -1,105 +0,0 @@ -package clientClasses - -import CodedInputStream -import DirectionResponse -import InvalidProtocolBufferException -import connectUrl -import controlUrl -import disconnectUrl -import heartbeatUrl -import io.netty.channel.ChannelHandlerContext -import io.netty.channel.SimpleChannelInboundHandler -import io.netty.handler.codec.http.DefaultHttpContent -import io.netty.util.AttributeKey -import java.io.ByteArrayInputStream - -/** - * Created by user on 7/8/16. - */ -class ClientHandler : SimpleChannelInboundHandler { - - object requestResult { - var code = -1 - var errorString = "" - var sid = 0 - } - - constructor() - - var contentBytes: ByteArray = ByteArray(0); - - override fun channelReadComplete(ctx: ChannelHandlerContext) { - - if (!ctx.channel().isOpen) { - ctx.close() - return - } - val url = ctx.channel().attr(AttributeKey.valueOf("url")).get() - val responseStream = CodedInputStream(ByteArrayInputStream(contentBytes)) - when (url) { - controlUrl -> { - val response = DirectionResponse.BuilderDirectionResponse().build() - try { - response.mergeFrom(responseStream) - setRequestResultValues(response.code, response.errorMsg) - } catch (e: InvalidProtocolBufferException) { - setRequestResultValues(1, "protobuf parsing error. bytes from server is not message. stack trace:\n ${e.message}") - } - } - connectUrl -> { - val response = SessionUpResponse.BuilderSessionUpResponse().build() - try { - response.mergeFrom(responseStream) - setRequestResultValues(response.code, response.errorMsg, response.sid) - } catch (e: InvalidProtocolBufferException) { - setRequestResultValues(1, "protobuf parsing error. bytes from server is not message. stack trace:\n ${e.message}", response.sid) - } - } - disconnectUrl -> { - val response = SessionDownResponse.BuilderSessionDownResponse().build() - try { - response.mergeFrom(responseStream) - setRequestResultValues(response.code, response.errorMsg) - } catch (e: InvalidProtocolBufferException) { - setRequestResultValues(1, "protobuf parsing error. bytes from server is not message. stack trace:\n ${e.message}") - } - } - heartbeatUrl -> { - val response = HeartBeatResponse.BuilderHeartBeatResponse().build() - try { - response.mergeFrom(responseStream) - setRequestResultValues(response.code, response.errorMsg) - } catch (e: InvalidProtocolBufferException) { - setRequestResultValues(1, "protobuf parsing error. bytes from server is not message. stack trace:\n ${e.message}") - } - } - } - ctx.close() - } - - fun setRequestResultValues(code: Int, error: String, sid: Int = -1) { - synchronized(requestResult, { - requestResult.code = code - requestResult.errorString = error - if (sid != -1) { - requestResult.sid = sid - } - }) - } - - override fun channelRead0(ctx: ChannelHandlerContext?, msg: Any?) { - if (msg is DefaultHttpContent) { - //read bytes from http body - val contentsBytes = msg.content(); - contentBytes = ByteArray(contentsBytes.capacity()) - contentsBytes.readBytes(contentBytes) - } - } - - override fun exceptionCaught(ctx: ChannelHandlerContext?, cause: Throwable) { - cause.printStackTrace() - if (ctx != null) { - ctx.close() - } - } -} \ No newline at end of file diff --git a/car_srv/clients/rc/src/main/java/clientClasses/ClientInitializer.kt b/car_srv/clients/rc/src/main/java/clientClasses/ClientInitializer.kt deleted file mode 100644 index b5b0d154afd..00000000000 --- a/car_srv/clients/rc/src/main/java/clientClasses/ClientInitializer.kt +++ /dev/null @@ -1,19 +0,0 @@ -package clientClasses - -import io.netty.channel.ChannelInitializer -import io.netty.channel.socket.SocketChannel -import io.netty.handler.codec.http.HttpClientCodec - -/** - * Created by user on 7/8/16. - */ -class ClientInitializer : ChannelInitializer { - - constructor() - - override fun initChannel(ch: SocketChannel) { - val p = ch.pipeline() - p.addLast(HttpClientCodec()) - p.addLast(ClientHandler()) - } -} \ No newline at end of file diff --git a/car_srv/clients/rc/src/main/java/direction.kt b/car_srv/clients/rc/src/main/java/direction.kt deleted file mode 100644 index 85e10feb96c..00000000000 --- a/car_srv/clients/rc/src/main/java/direction.kt +++ /dev/null @@ -1,312 +0,0 @@ -class DirectionRequest private constructor (command: DirectionRequest.Command = DirectionRequest.Command.fromIntToCommand(0), sid: Int = 0) { - var command : DirectionRequest.Command - private set - - var sid : Int - private set - - - init { - this.command = command - this.sid = sid - } - enum class Command(val ord: Int) { - stop (0), - forward (1), - backward (2), - left (3), - right (4); - - companion object { - fun fromIntToCommand (ord: Int): Command { - return when (ord) { - 0 -> Command.stop - 1 -> Command.forward - 2 -> Command.backward - 3 -> Command.left - 4 -> Command.right - else -> throw InvalidProtocolBufferException("Error: got unexpected int ${ord} while parsing Command "); - } - } - } - } - - fun writeTo (output: CodedOutputStream) { - if (command != DirectionRequest.Command.fromIntToCommand(0)) { - output.writeEnum (1, command.ord) - } - if (sid != 0) { - output.writeInt32 (2, sid) - } - } - - class BuilderDirectionRequest constructor (command: DirectionRequest.Command = DirectionRequest.Command.fromIntToCommand(0), sid: Int = 0) { - var command : DirectionRequest.Command - private set - fun setCommand(value: DirectionRequest.Command): DirectionRequest.BuilderDirectionRequest { - command = value - return this - } - - var sid : Int - private set - fun setSid(value: Int): DirectionRequest.BuilderDirectionRequest { - sid = value - return this - } - - - init { - this.command = command - this.sid = sid - } - - fun writeTo (output: CodedOutputStream) { - if (command != DirectionRequest.Command.fromIntToCommand(0)) { - output.writeEnum (1, command.ord) - } - if (sid != 0) { - output.writeInt32 (2, sid) - } - } - - fun build(): DirectionRequest { - return DirectionRequest(command, sid) - } - - fun parseFieldFrom(input: CodedInputStream): Boolean { - if (input.isAtEnd()) { return false } - val tag = input.readInt32NoTag() - if (tag == 0) { return false } - val fieldNumber = WireFormat.getTagFieldNumber(tag) - val wireType = WireFormat.getTagWireType(tag) - when(fieldNumber) { - 1 -> { - if (wireType != WireType.VARINT) { - throw InvalidProtocolBufferException("Error: Field number 1 has wire type WireType.VARINT but read ${wireType.toString()}")} - command = DirectionRequest.Command.fromIntToCommand(input.readEnumNoTag()) - } - 2 -> { - if (wireType != WireType.VARINT) { - throw InvalidProtocolBufferException("Error: Field number 2 has wire type WireType.VARINT but read ${wireType.toString()}")} - sid = input.readInt32NoTag() - } - } - return true} - fun parseFromWithSize(input: CodedInputStream, expectedSize: Int): DirectionRequest.BuilderDirectionRequest { - while(getSizeNoTag() < expectedSize) { - parseFieldFrom(input) - } - if (getSizeNoTag() > expectedSize) { throw InvalidProtocolBufferException("Error: expected size of message $expectedSize, but have read at least ${getSizeNoTag()}") } - return this - } - fun parseFrom(input: CodedInputStream): DirectionRequest.BuilderDirectionRequest { - while(parseFieldFrom(input)) {} - return this - } - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (command != DirectionRequest.Command.fromIntToCommand(0)) { - size += WireFormat.getEnumSize(1, command.ord) - } - if (sid != 0) { - size += WireFormat.getInt32Size(2, sid) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (command != DirectionRequest.Command.fromIntToCommand(0)) { - size += WireFormat.getEnumSize(1, command.ord) - } - if (sid != 0) { - size += WireFormat.getInt32Size(2, sid) - } - return size - } - } - - - fun mergeWith (other: DirectionRequest) { - command = other.command - sid = other.sid - } - - fun mergeFromWithSize (input: CodedInputStream, expectedSize: Int) { - val builder = DirectionRequest.BuilderDirectionRequest() - mergeWith(builder.parseFromWithSize(input, expectedSize).build())} - - fun mergeFrom (input: CodedInputStream) { - val builder = DirectionRequest.BuilderDirectionRequest() - mergeWith(builder.parseFrom(input).build())} - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (command != DirectionRequest.Command.fromIntToCommand(0)) { - size += WireFormat.getEnumSize(1, command.ord) - } - if (sid != 0) { - size += WireFormat.getInt32Size(2, sid) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (command != DirectionRequest.Command.fromIntToCommand(0)) { - size += WireFormat.getEnumSize(1, command.ord) - } - if (sid != 0) { - size += WireFormat.getInt32Size(2, sid) - } - return size - } -} - - -class DirectionResponse private constructor (code: Int = 0, errorMsg: String = "") { - var code : Int - private set - - var errorMsg : String - private set - - - init { - this.code = code - this.errorMsg = errorMsg - } - - fun writeTo (output: CodedOutputStream) { - if (code != 0) { - output.writeInt32 (1, code) - } - if (errorMsg != "") { - output.writeString (2, errorMsg) - } - } - - class BuilderDirectionResponse constructor (code: Int = 0, errorMsg: String = "") { - var code : Int - private set - fun setCode(value: Int): DirectionResponse.BuilderDirectionResponse { - code = value - return this - } - - var errorMsg : String - private set - fun setErrorMsg(value: String): DirectionResponse.BuilderDirectionResponse { - errorMsg = value - return this - } - - - init { - this.code = code - this.errorMsg = errorMsg - } - - fun writeTo (output: CodedOutputStream) { - if (code != 0) { - output.writeInt32 (1, code) - } - if (errorMsg != "") { - output.writeString (2, errorMsg) - } - } - - fun build(): DirectionResponse { - return DirectionResponse(code, errorMsg) - } - - fun parseFieldFrom(input: CodedInputStream): Boolean { - if (input.isAtEnd()) { return false } - val tag = input.readInt32NoTag() - if (tag == 0) { return false } - val fieldNumber = WireFormat.getTagFieldNumber(tag) - val wireType = WireFormat.getTagWireType(tag) - when(fieldNumber) { - 1 -> { - if (wireType != WireType.VARINT) { - throw InvalidProtocolBufferException("Error: Field number 1 has wire type WireType.VARINT but read ${wireType.toString()}")} - code = input.readInt32NoTag() - } - 2 -> { - if (wireType != WireType.LENGTH_DELIMITED) { - throw InvalidProtocolBufferException("Error: Field number 2 has wire type WireType.LENGTH_DELIMITED but read ${wireType.toString()}")} - errorMsg = input.readStringNoTag() - } - } - return true} - fun parseFromWithSize(input: CodedInputStream, expectedSize: Int): DirectionResponse.BuilderDirectionResponse { - while(getSizeNoTag() < expectedSize) { - parseFieldFrom(input) - } - if (getSizeNoTag() > expectedSize) { throw InvalidProtocolBufferException("Error: expected size of message $expectedSize, but have read at least ${getSizeNoTag()}") } - return this - } - fun parseFrom(input: CodedInputStream): DirectionResponse.BuilderDirectionResponse { - while(parseFieldFrom(input)) {} - return this - } - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - return size - } - } - - - fun mergeWith (other: DirectionResponse) { - code = other.code - errorMsg = other.errorMsg - } - - fun mergeFromWithSize (input: CodedInputStream, expectedSize: Int) { - val builder = DirectionResponse.BuilderDirectionResponse() - mergeWith(builder.parseFromWithSize(input, expectedSize).build())} - - fun mergeFrom (input: CodedInputStream) { - val builder = DirectionResponse.BuilderDirectionResponse() - mergeWith(builder.parseFrom(input).build())} - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - return size - } -} - - diff --git a/car_srv/clients/rc/src/main/java/rc_session.kt b/car_srv/clients/rc/src/main/java/rc_session.kt deleted file mode 100644 index 5c71f110486..00000000000 --- a/car_srv/clients/rc/src/main/java/rc_session.kt +++ /dev/null @@ -1,694 +0,0 @@ -class SessionUpResponse private constructor (code: Int = 0, errorMsg: String = "", sid: Int = 0) { - var code : Int - private set - - var errorMsg : String - private set - - var sid : Int - private set - - - init { - this.code = code - this.errorMsg = errorMsg - this.sid = sid - } - - fun writeTo (output: CodedOutputStream) { - if (code != 0) { - output.writeInt32 (1, code) - } - if (errorMsg != "") { - output.writeString (2, errorMsg) - } - if (sid != 0) { - output.writeInt32 (3, sid) - } - } - - class BuilderSessionUpResponse constructor (code: Int = 0, errorMsg: String = "", sid: Int = 0) { - var code : Int - private set - fun setCode(value: Int): SessionUpResponse.BuilderSessionUpResponse { - code = value - return this - } - - var errorMsg : String - private set - fun setErrorMsg(value: String): SessionUpResponse.BuilderSessionUpResponse { - errorMsg = value - return this - } - - var sid : Int - private set - fun setSid(value: Int): SessionUpResponse.BuilderSessionUpResponse { - sid = value - return this - } - - - init { - this.code = code - this.errorMsg = errorMsg - this.sid = sid - } - - fun writeTo (output: CodedOutputStream) { - if (code != 0) { - output.writeInt32 (1, code) - } - if (errorMsg != "") { - output.writeString (2, errorMsg) - } - if (sid != 0) { - output.writeInt32 (3, sid) - } - } - - fun build(): SessionUpResponse { - return SessionUpResponse(code, errorMsg, sid) - } - - fun parseFieldFrom(input: CodedInputStream): Boolean { - if (input.isAtEnd()) { return false } - val tag = input.readInt32NoTag() - if (tag == 0) { return false } - val fieldNumber = WireFormat.getTagFieldNumber(tag) - val wireType = WireFormat.getTagWireType(tag) - when(fieldNumber) { - 1 -> { - if (wireType != WireType.VARINT) { - throw InvalidProtocolBufferException("Error: Field number 1 has wire type WireType.VARINT but read ${wireType.toString()}")} - code = input.readInt32NoTag() - } - 2 -> { - if (wireType != WireType.LENGTH_DELIMITED) { - throw InvalidProtocolBufferException("Error: Field number 2 has wire type WireType.LENGTH_DELIMITED but read ${wireType.toString()}")} - errorMsg = input.readStringNoTag() - } - 3 -> { - if (wireType != WireType.VARINT) { - throw InvalidProtocolBufferException("Error: Field number 3 has wire type WireType.VARINT but read ${wireType.toString()}")} - sid = input.readInt32NoTag() - } - } - return true} - fun parseFromWithSize(input: CodedInputStream, expectedSize: Int): SessionUpResponse.BuilderSessionUpResponse { - while(getSizeNoTag() < expectedSize) { - parseFieldFrom(input) - } - if (getSizeNoTag() > expectedSize) { throw InvalidProtocolBufferException("Error: expected size of message $expectedSize, but have read at least ${getSizeNoTag()}") } - return this - } - fun parseFrom(input: CodedInputStream): SessionUpResponse.BuilderSessionUpResponse { - while(parseFieldFrom(input)) {} - return this - } - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - if (sid != 0) { - size += WireFormat.getInt32Size(3, sid) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - if (sid != 0) { - size += WireFormat.getInt32Size(3, sid) - } - return size - } - } - - - fun mergeWith (other: SessionUpResponse) { - code = other.code - errorMsg = other.errorMsg - sid = other.sid - } - - fun mergeFromWithSize (input: CodedInputStream, expectedSize: Int) { - val builder = SessionUpResponse.BuilderSessionUpResponse() - mergeWith(builder.parseFromWithSize(input, expectedSize).build())} - - fun mergeFrom (input: CodedInputStream) { - val builder = SessionUpResponse.BuilderSessionUpResponse() - mergeWith(builder.parseFrom(input).build())} - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - if (sid != 0) { - size += WireFormat.getInt32Size(3, sid) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - if (sid != 0) { - size += WireFormat.getInt32Size(3, sid) - } - return size - } -} - - -class SessionDownResponse private constructor (code: Int = 0, errorMsg: String = "") { - var code : Int - private set - - var errorMsg : String - private set - - - init { - this.code = code - this.errorMsg = errorMsg - } - - fun writeTo (output: CodedOutputStream) { - if (code != 0) { - output.writeInt32 (1, code) - } - if (errorMsg != "") { - output.writeString (2, errorMsg) - } - } - - class BuilderSessionDownResponse constructor (code: Int = 0, errorMsg: String = "") { - var code : Int - private set - fun setCode(value: Int): SessionDownResponse.BuilderSessionDownResponse { - code = value - return this - } - - var errorMsg : String - private set - fun setErrorMsg(value: String): SessionDownResponse.BuilderSessionDownResponse { - errorMsg = value - return this - } - - - init { - this.code = code - this.errorMsg = errorMsg - } - - fun writeTo (output: CodedOutputStream) { - if (code != 0) { - output.writeInt32 (1, code) - } - if (errorMsg != "") { - output.writeString (2, errorMsg) - } - } - - fun build(): SessionDownResponse { - return SessionDownResponse(code, errorMsg) - } - - fun parseFieldFrom(input: CodedInputStream): Boolean { - if (input.isAtEnd()) { return false } - val tag = input.readInt32NoTag() - if (tag == 0) { return false } - val fieldNumber = WireFormat.getTagFieldNumber(tag) - val wireType = WireFormat.getTagWireType(tag) - when(fieldNumber) { - 1 -> { - if (wireType != WireType.VARINT) { - throw InvalidProtocolBufferException("Error: Field number 1 has wire type WireType.VARINT but read ${wireType.toString()}")} - code = input.readInt32NoTag() - } - 2 -> { - if (wireType != WireType.LENGTH_DELIMITED) { - throw InvalidProtocolBufferException("Error: Field number 2 has wire type WireType.LENGTH_DELIMITED but read ${wireType.toString()}")} - errorMsg = input.readStringNoTag() - } - } - return true} - fun parseFromWithSize(input: CodedInputStream, expectedSize: Int): SessionDownResponse.BuilderSessionDownResponse { - while(getSizeNoTag() < expectedSize) { - parseFieldFrom(input) - } - if (getSizeNoTag() > expectedSize) { throw InvalidProtocolBufferException("Error: expected size of message $expectedSize, but have read at least ${getSizeNoTag()}") } - return this - } - fun parseFrom(input: CodedInputStream): SessionDownResponse.BuilderSessionDownResponse { - while(parseFieldFrom(input)) {} - return this - } - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - return size - } - } - - - fun mergeWith (other: SessionDownResponse) { - code = other.code - errorMsg = other.errorMsg - } - - fun mergeFromWithSize (input: CodedInputStream, expectedSize: Int) { - val builder = SessionDownResponse.BuilderSessionDownResponse() - mergeWith(builder.parseFromWithSize(input, expectedSize).build())} - - fun mergeFrom (input: CodedInputStream) { - val builder = SessionDownResponse.BuilderSessionDownResponse() - mergeWith(builder.parseFrom(input).build())} - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - return size - } -} - - -class SessionDownRequest private constructor (sid: Int = 0) { - var sid : Int - private set - - - init { - this.sid = sid - } - - fun writeTo (output: CodedOutputStream) { - if (sid != 0) { - output.writeInt32 (1, sid) - } - } - - class BuilderSessionDownRequest constructor (sid: Int = 0) { - var sid : Int - private set - fun setSid(value: Int): SessionDownRequest.BuilderSessionDownRequest { - sid = value - return this - } - - - init { - this.sid = sid - } - - fun writeTo (output: CodedOutputStream) { - if (sid != 0) { - output.writeInt32 (1, sid) - } - } - - fun build(): SessionDownRequest { - return SessionDownRequest(sid) - } - - fun parseFieldFrom(input: CodedInputStream): Boolean { - if (input.isAtEnd()) { return false } - val tag = input.readInt32NoTag() - if (tag == 0) { return false } - val fieldNumber = WireFormat.getTagFieldNumber(tag) - val wireType = WireFormat.getTagWireType(tag) - when(fieldNumber) { - 1 -> { - if (wireType != WireType.VARINT) { - throw InvalidProtocolBufferException("Error: Field number 1 has wire type WireType.VARINT but read ${wireType.toString()}")} - sid = input.readInt32NoTag() - } - } - return true} - fun parseFromWithSize(input: CodedInputStream, expectedSize: Int): SessionDownRequest.BuilderSessionDownRequest { - while(getSizeNoTag() < expectedSize) { - parseFieldFrom(input) - } - if (getSizeNoTag() > expectedSize) { throw InvalidProtocolBufferException("Error: expected size of message $expectedSize, but have read at least ${getSizeNoTag()}") } - return this - } - fun parseFrom(input: CodedInputStream): SessionDownRequest.BuilderSessionDownRequest { - while(parseFieldFrom(input)) {} - return this - } - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (sid != 0) { - size += WireFormat.getInt32Size(1, sid) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (sid != 0) { - size += WireFormat.getInt32Size(1, sid) - } - return size - } - } - - - fun mergeWith (other: SessionDownRequest) { - sid = other.sid - } - - fun mergeFromWithSize (input: CodedInputStream, expectedSize: Int) { - val builder = SessionDownRequest.BuilderSessionDownRequest() - mergeWith(builder.parseFromWithSize(input, expectedSize).build())} - - fun mergeFrom (input: CodedInputStream) { - val builder = SessionDownRequest.BuilderSessionDownRequest() - mergeWith(builder.parseFrom(input).build())} - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (sid != 0) { - size += WireFormat.getInt32Size(1, sid) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (sid != 0) { - size += WireFormat.getInt32Size(1, sid) - } - return size - } -} - - -class HeartBeatRequest private constructor (sid: Int = 0) { - var sid : Int - private set - - - init { - this.sid = sid - } - - fun writeTo (output: CodedOutputStream) { - if (sid != 0) { - output.writeInt32 (1, sid) - } - } - - class BuilderHeartBeatRequest constructor (sid: Int = 0) { - var sid : Int - private set - fun setSid(value: Int): HeartBeatRequest.BuilderHeartBeatRequest { - sid = value - return this - } - - - init { - this.sid = sid - } - - fun writeTo (output: CodedOutputStream) { - if (sid != 0) { - output.writeInt32 (1, sid) - } - } - - fun build(): HeartBeatRequest { - return HeartBeatRequest(sid) - } - - fun parseFieldFrom(input: CodedInputStream): Boolean { - if (input.isAtEnd()) { return false } - val tag = input.readInt32NoTag() - if (tag == 0) { return false } - val fieldNumber = WireFormat.getTagFieldNumber(tag) - val wireType = WireFormat.getTagWireType(tag) - when(fieldNumber) { - 1 -> { - if (wireType != WireType.VARINT) { - throw InvalidProtocolBufferException("Error: Field number 1 has wire type WireType.VARINT but read ${wireType.toString()}")} - sid = input.readInt32NoTag() - } - } - return true} - fun parseFromWithSize(input: CodedInputStream, expectedSize: Int): HeartBeatRequest.BuilderHeartBeatRequest { - while(getSizeNoTag() < expectedSize) { - parseFieldFrom(input) - } - if (getSizeNoTag() > expectedSize) { throw InvalidProtocolBufferException("Error: expected size of message $expectedSize, but have read at least ${getSizeNoTag()}") } - return this - } - fun parseFrom(input: CodedInputStream): HeartBeatRequest.BuilderHeartBeatRequest { - while(parseFieldFrom(input)) {} - return this - } - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (sid != 0) { - size += WireFormat.getInt32Size(1, sid) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (sid != 0) { - size += WireFormat.getInt32Size(1, sid) - } - return size - } - } - - - fun mergeWith (other: HeartBeatRequest) { - sid = other.sid - } - - fun mergeFromWithSize (input: CodedInputStream, expectedSize: Int) { - val builder = HeartBeatRequest.BuilderHeartBeatRequest() - mergeWith(builder.parseFromWithSize(input, expectedSize).build())} - - fun mergeFrom (input: CodedInputStream) { - val builder = HeartBeatRequest.BuilderHeartBeatRequest() - mergeWith(builder.parseFrom(input).build())} - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (sid != 0) { - size += WireFormat.getInt32Size(1, sid) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (sid != 0) { - size += WireFormat.getInt32Size(1, sid) - } - return size - } -} - - -class HeartBeatResponse private constructor (code: Int = 0, errorMsg: String = "") { - var code : Int - private set - - var errorMsg : String - private set - - - init { - this.code = code - this.errorMsg = errorMsg - } - - fun writeTo (output: CodedOutputStream) { - if (code != 0) { - output.writeInt32 (1, code) - } - if (errorMsg != "") { - output.writeString (2, errorMsg) - } - } - - class BuilderHeartBeatResponse constructor (code: Int = 0, errorMsg: String = "") { - var code : Int - private set - fun setCode(value: Int): HeartBeatResponse.BuilderHeartBeatResponse { - code = value - return this - } - - var errorMsg : String - private set - fun setErrorMsg(value: String): HeartBeatResponse.BuilderHeartBeatResponse { - errorMsg = value - return this - } - - - init { - this.code = code - this.errorMsg = errorMsg - } - - fun writeTo (output: CodedOutputStream) { - if (code != 0) { - output.writeInt32 (1, code) - } - if (errorMsg != "") { - output.writeString (2, errorMsg) - } - } - - fun build(): HeartBeatResponse { - return HeartBeatResponse(code, errorMsg) - } - - fun parseFieldFrom(input: CodedInputStream): Boolean { - if (input.isAtEnd()) { return false } - val tag = input.readInt32NoTag() - if (tag == 0) { return false } - val fieldNumber = WireFormat.getTagFieldNumber(tag) - val wireType = WireFormat.getTagWireType(tag) - when(fieldNumber) { - 1 -> { - if (wireType != WireType.VARINT) { - throw InvalidProtocolBufferException("Error: Field number 1 has wire type WireType.VARINT but read ${wireType.toString()}")} - code = input.readInt32NoTag() - } - 2 -> { - if (wireType != WireType.LENGTH_DELIMITED) { - throw InvalidProtocolBufferException("Error: Field number 2 has wire type WireType.LENGTH_DELIMITED but read ${wireType.toString()}")} - errorMsg = input.readStringNoTag() - } - } - return true} - fun parseFromWithSize(input: CodedInputStream, expectedSize: Int): HeartBeatResponse.BuilderHeartBeatResponse { - while(getSizeNoTag() < expectedSize) { - parseFieldFrom(input) - } - if (getSizeNoTag() > expectedSize) { throw InvalidProtocolBufferException("Error: expected size of message $expectedSize, but have read at least ${getSizeNoTag()}") } - return this - } - fun parseFrom(input: CodedInputStream): HeartBeatResponse.BuilderHeartBeatResponse { - while(parseFieldFrom(input)) {} - return this - } - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - return size - } - } - - - fun mergeWith (other: HeartBeatResponse) { - code = other.code - errorMsg = other.errorMsg - } - - fun mergeFromWithSize (input: CodedInputStream, expectedSize: Int) { - val builder = HeartBeatResponse.BuilderHeartBeatResponse() - mergeWith(builder.parseFromWithSize(input, expectedSize).build())} - - fun mergeFrom (input: CodedInputStream) { - val builder = HeartBeatResponse.BuilderHeartBeatResponse() - mergeWith(builder.parseFrom(input).build())} - fun getSize(fieldNumber: Int): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) - return size - } - fun getSizeNoTag(): Int { - var size = 0 - if (code != 0) { - size += WireFormat.getInt32Size(1, code) - } - if (errorMsg != "") { - size += WireFormat.getStringSize(2, errorMsg) - } - return size - } -} - - diff --git a/car_srv/kotlinSrv/.gitignore b/car_srv/kotlinSrv/.gitignore deleted file mode 100644 index 3ff91b1dba1..00000000000 --- a/car_srv/kotlinSrv/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.idea/workspace.xml -.idea/uiDesigner.xml -.gradle/ -build/ -out/ -node_modules diff --git a/car_srv/kotlinSrv/.idea/.name b/car_srv/kotlinSrv/.idea/.name deleted file mode 100644 index ecf0af37049..00000000000 --- a/car_srv/kotlinSrv/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -CarServer \ No newline at end of file diff --git a/car_srv/kotlinSrv/.idea/compiler.xml b/car_srv/kotlinSrv/.idea/compiler.xml deleted file mode 100644 index 96cc43efa6a..00000000000 --- a/car_srv/kotlinSrv/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/car_srv/kotlinSrv/.idea/copyright/profiles_settings.xml b/car_srv/kotlinSrv/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3377d..00000000000 --- a/car_srv/kotlinSrv/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/car_srv/kotlinSrv/.idea/gradle.xml b/car_srv/kotlinSrv/.idea/gradle.xml deleted file mode 100644 index 2d5721d43e3..00000000000 --- a/car_srv/kotlinSrv/.idea/gradle.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/car_srv/kotlinSrv/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_js_library_1_0_3.xml b/car_srv/kotlinSrv/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_js_library_1_0_3.xml deleted file mode 100644 index 5ab55b986ef..00000000000 --- a/car_srv/kotlinSrv/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_js_library_1_0_3.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/car_srv/kotlinSrv/.idea/misc.xml b/car_srv/kotlinSrv/.idea/misc.xml deleted file mode 100644 index 97932299edb..00000000000 --- a/car_srv/kotlinSrv/.idea/misc.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/car_srv/kotlinSrv/.idea/modules.xml b/car_srv/kotlinSrv/.idea/modules.xml deleted file mode 100644 index 3e1c22a9202..00000000000 --- a/car_srv/kotlinSrv/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/car_srv/kotlinSrv/.idea/modules/CarServer.iml b/car_srv/kotlinSrv/.idea/modules/CarServer.iml deleted file mode 100644 index 0f7c5fccf95..00000000000 --- a/car_srv/kotlinSrv/.idea/modules/CarServer.iml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/car_srv/kotlinSrv/README.md b/car_srv/kotlinSrv/README.md deleted file mode 100644 index d7954f447a0..00000000000 --- a/car_srv/kotlinSrv/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Car server - -## Deploying car server - -*note:* this script use expect script language. You have to install it - -for install expect on ubuntu - - $ sudo apt-get install expect - -for deploy server on car use - - $ ./deploy.sh -h {ip_addr} -u {user_name} -p {password} - -where: -{ip_addr} - ip address of raspberry. -{user_name} and {password} - user name and password for login on raspberry - - -## Config file - -on root of compile files (~/server/ after deploy or ./build/js/) you can create -config file config.cfg. options write as key:value. -all available options. here value - its default value -mainServerIp:127.0.0.1 -thisServerIp:127.0.0.1 - - -## Building and run (for start on local computer) - -move to this directory - - $ ./build.sh - -This command run gradle build and execute *npm install* for downloading used js modules. - -for run server you can use script - - $ ./run.sh - - diff --git a/car_srv/kotlinSrv/build.gradle b/car_srv/kotlinSrv/build.gradle deleted file mode 100644 index e106539166e..00000000000 --- a/car_srv/kotlinSrv/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -group 'CarServer' -version '1.0' - -buildscript { - ext.kotlin_version = '1.0.3' - - repositories { - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -repositories { - mavenCentral() -} - -apply plugin: "kotlin2js" -apply plugin: 'kotlin' - -sourceSets { - main.kotlin.srcDirs += 'src' - main.kotlin.srcDirs += '../../proto/compiler/build/sources' - main.kotlin.srcDirs += '../../proto/protofiles_sources/out' - main.java.srcDirs += 'src/main/kotlin' -} - -task copyKotlinLib(type: Copy) { - from "${projectDir}/kotlinJsRequiredFiles/kotlin.js" - from "${projectDir}/package.json" - - into "${projectDir}/build/js" -} - -build.dependsOn copyKotlinLib - -compileKotlin2Js.kotlinOptions.outputFile = "${projectDir}/build/js/main.js" -compileKotlin2Js.kotlinOptions.outputPrefix = "${projectDir}/kotlinJsRequiredFiles/connectKotlinLib.js" - -dependencies { - compile "org.jetbrains.kotlin:kotlin-js-library:$kotlin_version" - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" -} diff --git a/car_srv/kotlinSrv/build.sh b/car_srv/kotlinSrv/build.sh deleted file mode 100755 index 401f9d733c4..00000000000 --- a/car_srv/kotlinSrv/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -./gradlew build -cd build/js -npm install - diff --git a/car_srv/kotlinSrv/deploy.sh b/car_srv/kotlinSrv/deploy.sh deleted file mode 100755 index ff5d3e619a7..00000000000 --- a/car_srv/kotlinSrv/deploy.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/expect - -set host "" -set userName "pi" -set password "111" - -set helpMessage "Options:\n --h (host) - set ip address of car computer\n --u (user name) - set user for login on car computer. default 'pi'\n --p (password) - set password for user. default '111'\n - -e.g. ./deploy.sh -h 192.168.1.117 -u testuser -p 123456789\n\n" - -set paramName "" - -foreach arg $argv { - switch -- $arg { - "--help" { - send "$helpMessage" - exit 1 - } - "-h" { - set paramName "host" - } - "-p" { - set paramName "password" - } - "-u" { - set paramName "userName" - } - default { - if {$paramName==""} { - send "Error. Incorrect option $arg\n" - send "$helpMessage" - exit 1 - } - set $paramName $arg - set paramName "" - } - } -} -if {$host==""} { - send "Error. Host param required\n" - send "$helpMessage" - exit 1 -} - -spawn ./gradlew build -expect " $" - -spawn scp -r ./build/js/main.js ./build/js/kotlin.js ./build/js/package.json ./build/js/proto/ $userName@$host:./server/ - -expect "password:" -send "$password\r" -expect eof - -spawn ssh $userName@$host -expect "password:" -send "$password\r" - -set timeout 3 - -expect "%" -send "killall -9 node \r" -expect " $" -send "cd server \r" -expect " $" -set timeout 120 -send "npm install \r" -expect " $" -#send "node main.js &\r" -#expect " $" - -send "exit\r" -expect eof diff --git a/car_srv/kotlinSrv/gradle/wrapper/gradle-wrapper.jar b/car_srv/kotlinSrv/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index ca78035ef0501d802d4fc55381ef2d5c3ce0ec6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53556 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
    V|?GlEBEAx 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�H$uJM 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 \(.*\)$'` - 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 - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/car_srv/kotlinSrv/gradlew.bat b/car_srv/kotlinSrv/gradlew.bat deleted file mode 100644 index f6d5974e72f..00000000000 --- a/car_srv/kotlinSrv/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@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 -if "%@eval[2+2]" == "4" goto 4NT_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=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -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/car_srv/kotlinSrv/kotlinJsRequiredFiles/connectKotlinLib.js b/car_srv/kotlinSrv/kotlinJsRequiredFiles/connectKotlinLib.js deleted file mode 100644 index 9dbae55426b..00000000000 --- a/car_srv/kotlinSrv/kotlinJsRequiredFiles/connectKotlinLib.js +++ /dev/null @@ -1,3 +0,0 @@ -var PATH_TO_KOTLIN_JS_DIR = "./"; - -var Kotlin = require(PATH_TO_KOTLIN_JS_DIR + "kotlin"); diff --git a/car_srv/kotlinSrv/kotlinJsRequiredFiles/kotlin.js b/car_srv/kotlinSrv/kotlinJsRequiredFiles/kotlin.js deleted file mode 100644 index 1169c1d7241..00000000000 --- a/car_srv/kotlinSrv/kotlinJsRequiredFiles/kotlin.js +++ /dev/null @@ -1,23868 +0,0 @@ -'use strict';var Kotlin = {}; -(function(Kotlin) { - function toArray(obj) { - var array; - if (obj == null) { - array = []; - } else { - if (!Array.isArray(obj)) { - array = [obj]; - } else { - array = obj; - } - } - return array; - } - function copyProperties(to, from) { - if (to == null || from == null) { - return; - } - for (var p in from) { - if (from.hasOwnProperty(p)) { - to[p] = from[p]; - } - } - } - function getClass(basesArray) { - for (var i = 0;i < basesArray.length;i++) { - if (isNativeClass(basesArray[i]) || basesArray[i].$metadata$.type === Kotlin.TYPE.CLASS) { - return basesArray[i]; - } - } - return null; - } - var emptyFunction = function() { - return function() { - }; - }; - Kotlin.TYPE = {CLASS:"class", TRAIT:"trait", OBJECT:"object", INIT_FUN:"init fun"}; - Kotlin.classCount = 0; - Kotlin.newClassIndex = function() { - var tmp = Kotlin.classCount; - Kotlin.classCount++; - return tmp; - }; - function isNativeClass(obj) { - return!(obj == null) && obj.$metadata$ == null; - } - function applyExtension(current, bases, baseGetter) { - for (var i = 0;i < bases.length;i++) { - if (isNativeClass(bases[i])) { - continue; - } - var base = baseGetter(bases[i]); - for (var p in base) { - if (base.hasOwnProperty(p)) { - if (!current.hasOwnProperty(p) || current[p].$classIndex$ < base[p].$classIndex$) { - current[p] = base[p]; - } - } - } - } - } - function computeMetadata(bases, properties, staticProperties) { - var metadata = {}; - var p, property; - metadata.baseClasses = toArray(bases); - metadata.baseClass = getClass(metadata.baseClasses); - metadata.classIndex = Kotlin.newClassIndex(); - metadata.functions = {}; - metadata.properties = {}; - metadata.types = {}; - metadata.staticMembers = {}; - if (!(properties == null)) { - for (p in properties) { - if (properties.hasOwnProperty(p)) { - property = properties[p]; - property.$classIndex$ = metadata.classIndex; - if (typeof property === "function") { - metadata.functions[p] = property; - } else { - metadata.properties[p] = property; - } - } - } - } - if (typeof staticProperties !== "undefined") { - for (p in staticProperties) { - property = staticProperties[p]; - if (typeof property === "function" && property.type === Kotlin.TYPE.INIT_FUN) { - metadata.types[p] = property; - } else { - metadata.staticMembers[p] = property; - } - } - } - applyExtension(metadata.functions, metadata.baseClasses, function(it) { - return it.$metadata$.functions; - }); - applyExtension(metadata.properties, metadata.baseClasses, function(it) { - return it.$metadata$.properties; - }); - return metadata; - } - Kotlin.createClassNow = function(bases, constructor, properties, staticProperties) { - if (constructor == null) { - constructor = emptyFunction(); - } - var metadata = computeMetadata(bases, properties, staticProperties); - metadata.type = Kotlin.TYPE.CLASS; - copyProperties(constructor, metadata.staticMembers); - var prototypeObj; - if (metadata.baseClass !== null) { - prototypeObj = Object.create(metadata.baseClass.prototype); - } else { - prototypeObj = {}; - } - Object.defineProperties(prototypeObj, metadata.properties); - copyProperties(prototypeObj, metadata.functions); - prototypeObj.constructor = constructor; - defineNestedTypes(constructor, metadata.types); - if (metadata.baseClass != null) { - constructor.baseInitializer = metadata.baseClass; - } - constructor.$metadata$ = metadata; - constructor.prototype = prototypeObj; - return constructor; - }; - function defineNestedTypes(constructor, types) { - for (var innerTypeName in types) { - var innerType = types[innerTypeName]; - innerType.className = innerTypeName; - Object.defineProperty(constructor, innerTypeName, {get:innerType, configurable:true}); - } - } - Kotlin.createTraitNow = function(bases, properties, staticProperties) { - var obj = function() { - }; - obj.$metadata$ = computeMetadata(bases, properties, staticProperties); - obj.$metadata$.type = Kotlin.TYPE.TRAIT; - copyProperties(obj, obj.$metadata$.staticMembers); - obj.prototype = {}; - Object.defineProperties(obj.prototype, obj.$metadata$.properties); - copyProperties(obj.prototype, obj.$metadata$.functions); - defineNestedTypes(obj, obj.$metadata$.types); - return obj; - }; - function getBases(basesFun) { - if (typeof basesFun === "function") { - return basesFun(); - } else { - return basesFun; - } - } - Kotlin.createClass = function(basesFun, constructor, properties, staticProperties) { - function $o() { - var klass = Kotlin.createClassNow(getBases(basesFun), constructor, properties, staticProperties); - Object.defineProperty(this, $o.className, {value:klass}); - if (staticProperties && staticProperties.object_initializer$) { - staticProperties.object_initializer$(klass); - } - return klass; - } - $o.type = Kotlin.TYPE.INIT_FUN; - return $o; - }; - Kotlin.createEnumClass = function(basesFun, constructor, enumEntries, properties, staticProperties) { - staticProperties = staticProperties || {}; - staticProperties.object_initializer$ = function(cls) { - var enumEntryList = enumEntries(); - var i = 0; - var values = []; - for (var entryName in enumEntryList) { - if (enumEntryList.hasOwnProperty(entryName)) { - var entryFactory = enumEntryList[entryName]; - values.push(entryName); - var entryObject; - if (typeof entryFactory === "function" && entryFactory.type === Kotlin.TYPE.INIT_FUN) { - entryFactory.className = entryName; - entryObject = entryFactory.apply(cls); - } else { - entryObject = entryFactory(); - } - entryObject.ordinal$ = i++; - entryObject.name$ = entryName; - cls[entryName] = entryObject; - } - } - cls.valuesNames$ = values; - cls.values$ = null; - }; - staticProperties.values = function() { - if (this.values$ == null) { - this.values$ = []; - for (var i = 0;i < this.valuesNames$.length;++i) { - this.values$.push(this[this.valuesNames$[i]]); - } - } - return this.values$; - }; - staticProperties.valueOf_61zpoe$ = function(name) { - return this[name]; - }; - return Kotlin.createClass(basesFun, constructor, properties, staticProperties); - }; - Kotlin.createTrait = function(basesFun, properties, staticProperties) { - function $o() { - var klass = Kotlin.createTraitNow(getBases(basesFun), properties, staticProperties); - Object.defineProperty(this, $o.className, {value:klass}); - return klass; - } - $o.type = Kotlin.TYPE.INIT_FUN; - return $o; - }; - Kotlin.createObject = function(basesFun, constructor, functions, staticProperties) { - constructor = constructor || function() { - }; - function $o() { - var klass = Kotlin.createClassNow(getBases(basesFun), null, functions, staticProperties); - var obj = new klass; - var metadata = klass.$metadata$; - metadata.type = Kotlin.TYPE.OBJECT; - Object.defineProperty(this, $o.className, {value:obj}); - defineNestedTypes(obj, klass.$metadata$.types); - copyProperties(obj, metadata.staticMembers); - if (metadata.baseClass != null) { - constructor.baseInitializer = metadata.baseClass; - } - constructor.apply(obj); - return obj; - } - $o.type = Kotlin.TYPE.INIT_FUN; - return $o; - }; - Kotlin.callGetter = function(thisObject, klass, propertyName) { - return klass.$metadata$.properties[propertyName].get.call(thisObject); - }; - Kotlin.callSetter = function(thisObject, klass, propertyName, value) { - klass.$metadata$.properties[propertyName].set.call(thisObject, value); - }; - function isInheritanceFromTrait(metadata, trait) { - if (metadata == null || metadata.classIndex < trait.$metadata$.classIndex) { - return false; - } - var baseClasses = metadata.baseClasses; - var i; - for (i = 0;i < baseClasses.length;i++) { - if (baseClasses[i] === trait) { - return true; - } - } - for (i = 0;i < baseClasses.length;i++) { - if (isInheritanceFromTrait(baseClasses[i].$metadata$, trait)) { - return true; - } - } - return false; - } - Kotlin.isType = function(object, klass) { - if (object == null || (klass == null || typeof object !== "object" && typeof object !== "function")) { - return false; - } else { - if (object instanceof klass) { - return true; - } else { - if (isNativeClass(klass) || klass.$metadata$.type == Kotlin.TYPE.CLASS) { - return false; - } else { - var metadata = "$metadata$" in object ? object.$metadata$ : object.constructor.$metadata$; - return isInheritanceFromTrait(metadata, klass); - } - } - } - }; - Kotlin.getCallableRefForMemberFunction = function(klass, memberName) { - return function() { - var args = [].slice.call(arguments); - var instance = args.shift(); - return instance[memberName].apply(instance, args); - }; - }; - Kotlin.getCallableRefForExtensionFunction = function(extFun) { - return function() { - return extFun.apply(null, arguments); - }; - }; - Kotlin.getCallableRefForLocalExtensionFunction = function(extFun) { - return function() { - var args = [].slice.call(arguments); - var instance = args.shift(); - return extFun.apply(instance, args); - }; - }; - Kotlin.getCallableRefForConstructor = function(klass) { - return function() { - var obj = Object.create(klass.prototype); - klass.apply(obj, arguments); - return obj; - }; - }; - Kotlin.getCallableRefForTopLevelProperty = function(packageName, name, isVar) { - var getFun = function() { - return packageName[name]; - }; - var setFun = isVar ? function(value) { - packageName[name] = value; - } : null; - return getPropertyRefClass(name, getFun, "get", setFun, "set_za3rmp$", propertyRefClassMetadataCache.zeroArg); - }; - Kotlin.getCallableRefForMemberProperty = function(name, isVar) { - var getFun = function(receiver) { - return receiver[name]; - }; - var setFun = isVar ? function(receiver, value) { - receiver[name] = value; - } : null; - return getPropertyRefClass(name, getFun, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg); - }; - Kotlin.getCallableRefForExtensionProperty = function(name, getFun, setFun) { - var getFunWrapper = function(receiver, extensionReceiver) { - return getFun(receiver, extensionReceiver); - }; - return getPropertyRefClass(name, getFunWrapper, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg); - }; - function getPropertyRefClass(name, getFun, getName, setFun, setName, cache) { - var obj = getFun; - var isMutable = typeof setFun === "function"; - obj.$metadata$ = getPropertyRefMetadata(isMutable ? cache.mutable : cache.immutable); - obj[getName] = getFun; - if (isMutable) { - obj[setName] = setFun; - } - obj.constructor = obj; - Object.defineProperty(obj, "name", {get:function() { - return name; - }}); - return obj; - } - var propertyRefClassMetadataCache = {zeroArg:{mutable:{value:null, implementedInterface:function() { - return Kotlin.modules["stdlib"].kotlin.reflect.KMutableProperty0; - }}, immutable:{value:null, implementedInterface:function() { - return Kotlin.modules["stdlib"].kotlin.reflect.KProperty0; - }}}, oneArg:{mutable:{value:null, implementedInterface:function() { - return Kotlin.modules["stdlib"].kotlin.reflect.KMutableProperty1; - }}, immutable:{value:null, implementedInterface:function() { - return Kotlin.modules["stdlib"].kotlin.reflect.KProperty1; - }}}}; - function getPropertyRefMetadata(cache) { - if (cache.value === null) { - cache.value = {baseClasses:[cache.implementedInterface()], baseClass:null, classIndex:Kotlin.newClassIndex(), functions:{}, properties:{}, types:{}, staticMembers:{}}; - } - return cache.value; - } - Kotlin.modules = {}; - function createPackageGetter(instance, initializer) { - return function() { - if (initializer !== null) { - var tmp = initializer; - initializer = null; - tmp.call(instance); - } - return instance; - }; - } - function createDefinition(members, definition) { - if (typeof definition === "undefined") { - definition = {}; - } - if (members == null) { - return definition; - } - for (var p in members) { - if (members.hasOwnProperty(p)) { - if (typeof members[p] === "function") { - if (members[p].type === Kotlin.TYPE.INIT_FUN) { - members[p].className = p; - Object.defineProperty(definition, p, {get:members[p], configurable:true}); - } else { - definition[p] = members[p]; - } - } else { - Object.defineProperty(definition, p, members[p]); - } - } - } - return definition; - } - Kotlin.createDefinition = createDefinition; - Kotlin.definePackage = function(initializer, members) { - var definition = createDefinition(members); - if (initializer === null) { - return{value:definition}; - } else { - var getter = createPackageGetter(definition, initializer); - return{get:getter}; - } - }; - Kotlin.defineRootPackage = function(initializer, members) { - var definition = createDefinition(members); - if (initializer === null) { - definition.$initializer$ = emptyFunction(); - } else { - definition.$initializer$ = initializer; - } - return definition; - }; - Kotlin.defineModule = function(id, declaration) { - if (id in Kotlin.modules) { - throw new Error("Module " + id + " is already defined"); - } - declaration.$initializer$.call(declaration); - Object.defineProperty(Kotlin.modules, id, {value:declaration}); - }; - Kotlin.defineInlineFunction = function(tag, fun) { - return fun; - }; - Kotlin.isTypeOf = function(type) { - return function(object) { - return typeof object === type; - }; - }; - Kotlin.isInstanceOf = function(klass) { - return function(object) { - return Kotlin.isType(object, klass); - }; - }; - Kotlin.orNull = function(fn) { - return function(object) { - return object == null || fn(object); - }; - }; - Kotlin.isAny = function() { - return function(object) { - return object != null; - }; - }; - Kotlin.andPredicate = function(a, b) { - return function(object) { - return a(object) && b(object); - }; - }; - Kotlin.kotlinModuleMetadata = function(abiVersion, moduleName, data) { - }; -})(Kotlin); -(function(Kotlin) { - var CharSequence = Kotlin.createTraitNow(null); - if (typeof String.prototype.startsWith === "undefined") { - String.prototype.startsWith = function(searchString, position) { - position = position || 0; - return this.lastIndexOf(searchString, position) === position; - }; - } - if (typeof String.prototype.endsWith === "undefined") { - String.prototype.endsWith = function(searchString, position) { - var subjectString = this.toString(); - if (position === undefined || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - var lastIndex = subjectString.indexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; - }; - } - String.prototype.contains = function(s) { - return this.indexOf(s) !== -1; - }; - Kotlin.equals = function(obj1, obj2) { - if (obj1 == null) { - return obj2 == null; - } - if (obj2 == null) { - return false; - } - if (Array.isArray(obj1)) { - return Kotlin.arrayEquals(obj1, obj2); - } - if (typeof obj1 == "object" && typeof obj1.equals_za3rmp$ === "function") { - return obj1.equals_za3rmp$(obj2); - } - return obj1 === obj2; - }; - Kotlin.hashCode = function(obj) { - if (obj == null) { - return 0; - } - if ("function" == typeof obj.hashCode) { - return obj.hashCode(); - } - var objType = typeof obj; - if ("object" == objType || "function" == objType) { - return getObjectHashCode(obj); - } else { - if ("number" == objType) { - return obj | 0; - } - } - if ("boolean" == objType) { - return Number(obj); - } - var str = String(obj); - return getStringHashCode(str); - }; - Kotlin.toString = function(o) { - if (o == null) { - return "null"; - } else { - if (Array.isArray(o)) { - return Kotlin.arrayToString(o); - } else { - return o.toString(); - } - } - }; - Kotlin.arrayToString = function(a) { - return "[" + a.map(Kotlin.toString).join(", ") + "]"; - }; - Kotlin.compareTo = function(a, b) { - var typeA = typeof a; - var typeB = typeof a; - if (Kotlin.isChar(a) && typeB == "number") { - return Kotlin.primitiveCompareTo(a.charCodeAt(0), b); - } - if (typeA == "number" && Kotlin.isChar(b)) { - return Kotlin.primitiveCompareTo(a, b.charCodeAt(0)); - } - if (typeA == "number" || typeA == "string") { - return a < b ? -1 : a > b ? 1 : 0; - } - return a.compareTo_za3rmp$(b); - }; - Kotlin.primitiveCompareTo = function(a, b) { - return a < b ? -1 : a > b ? 1 : 0; - }; - Kotlin.isNumber = function(a) { - return typeof a == "number" || a instanceof Kotlin.Long; - }; - Kotlin.isChar = function(value) { - return typeof value == "string" && value.length == 1; - }; - Kotlin.isComparable = function(value) { - var type = typeof value; - return type === "string" || (type === "boolean" || (Kotlin.isNumber(value) || Kotlin.isType(value, Kotlin.Comparable))); - }; - Kotlin.isCharSequence = function(value) { - return typeof value === "string" || Kotlin.isType(value, CharSequence); - }; - Kotlin.charInc = function(value) { - return String.fromCharCode(value.charCodeAt(0) + 1); - }; - Kotlin.charDec = function(value) { - return String.fromCharCode(value.charCodeAt(0) - 1); - }; - Kotlin.toShort = function(a) { - return(a & 65535) << 16 >> 16; - }; - Kotlin.toByte = function(a) { - return(a & 255) << 24 >> 24; - }; - Kotlin.toChar = function(a) { - return String.fromCharCode(((a | 0) % 65536 & 65535) << 16 >>> 16); - }; - Kotlin.numberToLong = function(a) { - return a instanceof Kotlin.Long ? a : Kotlin.Long.fromNumber(a); - }; - Kotlin.numberToInt = function(a) { - return a instanceof Kotlin.Long ? a.toInt() : a | 0; - }; - Kotlin.numberToShort = function(a) { - return Kotlin.toShort(Kotlin.numberToInt(a)); - }; - Kotlin.numberToByte = function(a) { - return Kotlin.toByte(Kotlin.numberToInt(a)); - }; - Kotlin.numberToDouble = function(a) { - return+a; - }; - Kotlin.numberToChar = function(a) { - return Kotlin.toChar(Kotlin.numberToInt(a)); - }; - Kotlin.intUpto = function(from, to) { - return new Kotlin.NumberRange(from, to); - }; - Kotlin.intDownto = function(from, to) { - return new Kotlin.Progression(from, to, -1); - }; - Kotlin.Throwable = Error; - function createClassNowWithMessage(base) { - return Kotlin.createClassNow(base, function(message) { - this.message = message !== void 0 ? message : null; - }); - } - Kotlin.Error = createClassNowWithMessage(Kotlin.Throwable); - Kotlin.Exception = createClassNowWithMessage(Kotlin.Throwable); - Kotlin.RuntimeException = createClassNowWithMessage(Kotlin.Exception); - Kotlin.NullPointerException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.NoSuchElementException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.IllegalArgumentException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.IllegalStateException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.UnsupportedOperationException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.IndexOutOfBoundsException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.ClassCastException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.IOException = createClassNowWithMessage(Kotlin.Exception); - Kotlin.AssertionError = createClassNowWithMessage(Kotlin.Error); - Kotlin.throwNPE = function(message) { - throw new Kotlin.NullPointerException(message); - }; - Kotlin.throwCCE = function() { - throw new Kotlin.ClassCastException("Illegal cast"); - }; - function throwAbstractFunctionInvocationError(funName) { - return function() { - var message; - if (funName !== void 0) { - message = "Function " + funName + " is abstract"; - } else { - message = "Function is abstract"; - } - throw new TypeError(message); - }; - } - var POW_2_32 = 4294967296; - var OBJECT_HASH_CODE_PROPERTY_NAME = "kotlinHashCodeValue$"; - function getObjectHashCode(obj) { - if (!(OBJECT_HASH_CODE_PROPERTY_NAME in obj)) { - var hash = Math.random() * POW_2_32 | 0; - Object.defineProperty(obj, OBJECT_HASH_CODE_PROPERTY_NAME, {value:hash, enumerable:false}); - } - return obj[OBJECT_HASH_CODE_PROPERTY_NAME]; - } - function getStringHashCode(str) { - var hash = 0; - for (var i = 0;i < str.length;i++) { - var code = str.charCodeAt(i); - hash = hash * 31 + code | 0; - } - return hash; - } - var lazyInitClasses = {}; - lazyInitClasses.ArrayIterator = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.MutableIterator]; - }, function(array) { - this.array = array; - this.index = 0; - }, {next:function() { - return this.array[this.index++]; - }, hasNext:function() { - return this.index < this.array.length; - }, remove:function() { - if (this.index < 0 || this.index > this.array.length) { - throw new RangeError; - } - this.index--; - this.array.splice(this.index, 1); - }}); - lazyInitClasses.ListIterator = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.ListIterator]; - }, function(list, index) { - this.list = list; - this.size = list.size; - this.index = index === undefined ? 0 : index; - }, {hasNext:function() { - return this.index < this.size; - }, nextIndex:function() { - return this.index; - }, next:function() { - var index = this.index; - var result = this.list.get_za3lpa$(index); - this.index = index + 1; - return result; - }, hasPrevious:function() { - return this.index > 0; - }, previousIndex:function() { - return this.index - 1; - }, previous:function() { - var index = this.index - 1; - var result = this.list.get_za3lpa$(index); - this.index = index; - return result; - }}); - Kotlin.Enum = Kotlin.createClassNow(null, function() { - this.name$ = void 0; - this.ordinal$ = void 0; - }, {name:{get:function() { - return this.name$; - }}, ordinal:{get:function() { - return this.ordinal$; - }}, equals_za3rmp$:function(o) { - return this === o; - }, hashCode:function() { - return getObjectHashCode(this); - }, compareTo_za3rmp$:function(o) { - return this.ordinal$ < o.ordinal$ ? -1 : this.ordinal$ > o.ordinal$ ? 1 : 0; - }, toString:function() { - return this.name; - }}); - Kotlin.RandomAccess = Kotlin.createTraitNow(null); - Kotlin.PropertyMetadata = Kotlin.createClassNow(null, function(name) { - this.name = name; - }); - lazyInitClasses.AbstractCollection = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.MutableCollection]; - }, null, {addAll_wtfk93$:function(collection) { - var modified = false; - var it = collection.iterator(); - while (it.hasNext()) { - if (this.add_za3rmp$(it.next())) { - modified = true; - } - } - return modified; - }, removeAll_wtfk93$:function(c) { - var modified = false; - var it = this.iterator(); - while (it.hasNext()) { - if (c.contains_za3rmp$(it.next())) { - it.remove(); - modified = true; - } - } - return modified; - }, retainAll_wtfk93$:function(c) { - var modified = false; - var it = this.iterator(); - while (it.hasNext()) { - if (!c.contains_za3rmp$(it.next())) { - it.remove(); - modified = true; - } - } - return modified; - }, clear:function() { - throw new Kotlin.NotImplementedError("Not implemented yet, see KT-7809"); - }, containsAll_wtfk93$:function(c) { - var it = c.iterator(); - while (it.hasNext()) { - if (!this.contains_za3rmp$(it.next())) { - return false; - } - } - return true; - }, isEmpty:function() { - return this.size === 0; - }, iterator:function() { - return new Kotlin.ArrayIterator(this.toArray()); - }, equals_za3rmp$:function(o) { - if (this.size !== o.size) { - return false; - } - var iterator1 = this.iterator(); - var iterator2 = o.iterator(); - var i = this.size; - while (i-- > 0) { - if (!Kotlin.equals(iterator1.next(), iterator2.next())) { - return false; - } - } - return true; - }, toString:function() { - var builder = "["; - var iterator = this.iterator(); - var first = true; - var i = this.size; - while (i-- > 0) { - if (first) { - first = false; - } else { - builder += ", "; - } - builder += Kotlin.toString(iterator.next()); - } - builder += "]"; - return builder; - }, toJSON:function() { - return this.toArray(); - }}); - lazyInitClasses.AbstractList = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.MutableList, Kotlin.AbstractCollection]; - }, null, {iterator:function() { - return new Kotlin.ListIterator(this); - }, listIterator:function() { - return new Kotlin.ListIterator(this); - }, listIterator_za3lpa$:function(index) { - if (index < 0 || index > this.size) { - throw new Kotlin.IndexOutOfBoundsException("Index: " + index + ", size: " + this.size); - } - return new Kotlin.ListIterator(this, index); - }, add_za3rmp$:function(element) { - this.add_vux3hl$(this.size, element); - return true; - }, addAll_j97iir$:function(index, collection) { - throw new Kotlin.NotImplementedError("Not implemented yet, see KT-7809"); - }, remove_za3rmp$:function(o) { - var index = this.indexOf_za3rmp$(o); - if (index !== -1) { - this.removeAt_za3lpa$(index); - return true; - } - return false; - }, clear:function() { - throw new Kotlin.NotImplementedError("Not implemented yet, see KT-7809"); - }, contains_za3rmp$:function(o) { - return this.indexOf_za3rmp$(o) !== -1; - }, indexOf_za3rmp$:function(o) { - var i = this.listIterator(); - while (i.hasNext()) { - if (Kotlin.equals(i.next(), o)) { - return i.previousIndex(); - } - } - return-1; - }, lastIndexOf_za3rmp$:function(o) { - var i = this.listIterator_za3lpa$(this.size); - while (i.hasPrevious()) { - if (Kotlin.equals(i.previous(), o)) { - return i.nextIndex(); - } - } - return-1; - }, subList_vux9f0$:function(fromIndex, toIndex) { - if (fromIndex < 0 || toIndex > this.size) { - throw new Kotlin.IndexOutOfBoundsException; - } - if (fromIndex > toIndex) { - throw new Kotlin.IllegalArgumentException; - } - return new Kotlin.SubList(this, fromIndex, toIndex); - }, hashCode:function() { - var result = 1; - var i = this.iterator(); - while (i.hasNext()) { - var obj = i.next(); - result = 31 * result + Kotlin.hashCode(obj) | 0; - } - return result; - }}); - lazyInitClasses.SubList = Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function(list, fromIndex, toIndex) { - this.list = list; - this.offset = fromIndex; - this._size = toIndex - fromIndex; - }, {get_za3lpa$:function(index) { - this.checkRange(index); - return this.list.get_za3lpa$(index + this.offset); - }, set_vux3hl$:function(index, value) { - this.checkRange(index); - this.list.set_vux3hl$(index + this.offset, value); - }, size:{get:function() { - return this._size; - }}, add_vux3hl$:function(index, element) { - if (index < 0 || index > this.size) { - throw new Kotlin.IndexOutOfBoundsException; - } - this.list.add_vux3hl$(index + this.offset, element); - }, removeAt_za3lpa$:function(index) { - this.checkRange(index); - var result = this.list.removeAt_za3lpa$(index + this.offset); - this._size--; - return result; - }, checkRange:function(index) { - if (index < 0 || index >= this._size) { - throw new Kotlin.IndexOutOfBoundsException; - } - }}); - lazyInitClasses.ArrayList = Kotlin.createClass(function() { - return[Kotlin.AbstractList, Kotlin.RandomAccess]; - }, function() { - this.array = []; - }, {get_za3lpa$:function(index) { - this.checkRange(index); - return this.array[index]; - }, set_vux3hl$:function(index, value) { - this.checkRange(index); - this.array[index] = value; - }, size:{get:function() { - return this.array.length; - }}, iterator:function() { - return Kotlin.arrayIterator(this.array); - }, add_za3rmp$:function(element) { - this.array.push(element); - return true; - }, add_vux3hl$:function(index, element) { - this.array.splice(index, 0, element); - }, addAll_wtfk93$:function(collection) { - if (collection.size == 0) { - return false; - } - var it = collection.iterator(); - for (var i = this.array.length, n = collection.size;n-- > 0;) { - this.array[i++] = it.next(); - } - return true; - }, removeAt_za3lpa$:function(index) { - this.checkRange(index); - return this.array.splice(index, 1)[0]; - }, clear:function() { - this.array.length = 0; - }, indexOf_za3rmp$:function(o) { - for (var i = 0;i < this.array.length;i++) { - if (Kotlin.equals(this.array[i], o)) { - return i; - } - } - return-1; - }, lastIndexOf_za3rmp$:function(o) { - for (var i = this.array.length - 1;i >= 0;i--) { - if (Kotlin.equals(this.array[i], o)) { - return i; - } - } - return-1; - }, toArray:function() { - return this.array.slice(0); - }, toString:function() { - return Kotlin.arrayToString(this.array); - }, toJSON:function() { - return this.array; - }, checkRange:function(index) { - if (index < 0 || index >= this.array.length) { - throw new Kotlin.IndexOutOfBoundsException; - } - }}); - Kotlin.Runnable = Kotlin.createClassNow(null, null, {run:throwAbstractFunctionInvocationError("Runnable#run")}); - Kotlin.Comparable = Kotlin.createClassNow(null, null, {compareTo:throwAbstractFunctionInvocationError("Comparable#compareTo")}); - Kotlin.Appendable = Kotlin.createClassNow(null, null, {append:throwAbstractFunctionInvocationError("Appendable#append")}); - Kotlin.Closeable = Kotlin.createClassNow(null, null, {close:throwAbstractFunctionInvocationError("Closeable#close")}); - Kotlin.safeParseInt = function(str) { - var r = parseInt(str, 10); - return isNaN(r) ? null : r; - }; - Kotlin.safeParseDouble = function(str) { - var r = parseFloat(str); - return isNaN(r) ? null : r; - }; - Kotlin.arrayEquals = function(a, b) { - if (a === b) { - return true; - } - if (!Array.isArray(b) || a.length !== b.length) { - return false; - } - for (var i = 0, n = a.length;i < n;i++) { - if (!Kotlin.equals(a[i], b[i])) { - return false; - } - } - return true; - }; - var BaseOutput = Kotlin.createClassNow(null, null, {println:function(a) { - if (typeof a !== "undefined") { - this.print(a); - } - this.print("\n"); - }, flush:function() { - }}); - Kotlin.NodeJsOutput = Kotlin.createClassNow(BaseOutput, function(outputStream) { - this.outputStream = outputStream; - }, {print:function(a) { - this.outputStream.write(a); - }}); - Kotlin.OutputToConsoleLog = Kotlin.createClassNow(BaseOutput, null, {print:function(a) { - console.log(a); - }, println:function(a) { - this.print(typeof a !== "undefined" ? a : ""); - }}); - Kotlin.BufferedOutput = Kotlin.createClassNow(BaseOutput, function() { - this.buffer = ""; - }, {print:function(a) { - this.buffer += String(a); - }, flush:function() { - this.buffer = ""; - }}); - Kotlin.BufferedOutputToConsoleLog = Kotlin.createClassNow(Kotlin.BufferedOutput, function() { - Kotlin.BufferedOutput.call(this); - }, {print:function(a) { - var s = String(a); - var i = s.lastIndexOf("\n"); - if (i != -1) { - this.buffer += s.substr(0, i); - this.flush(); - s = s.substr(i + 1); - } - this.buffer += s; - }, flush:function() { - console.log(this.buffer); - this.buffer = ""; - }}); - Kotlin.out = function() { - var isNode = typeof process !== "undefined" && (process.versions && !!process.versions.node); - if (isNode) { - return new Kotlin.NodeJsOutput(process.stdout); - } - return new Kotlin.BufferedOutputToConsoleLog; - }(); - Kotlin.println = function(s) { - Kotlin.out.println(s); - }; - Kotlin.print = function(s) { - Kotlin.out.print(s); - }; - lazyInitClasses.RangeIterator = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(start, end, step) { - this.start = start; - this.end = end; - this.step = step; - this.i = start; - }, {next:function() { - var value = this.i; - this.i = this.i + this.step; - return value; - }, hasNext:function() { - if (this.step > 0) { - return this.i <= this.end; - } else { - return this.i >= this.end; - } - }}); - function isSameNotNullRanges(other) { - var classObject = this.constructor; - if (this instanceof classObject && other instanceof classObject) { - return this.isEmpty() && other.isEmpty() || this.first === other.first && (this.last === other.last && this.step === other.step); - } - return false; - } - function isSameLongRanges(other) { - var classObject = this.constructor; - if (this instanceof classObject && other instanceof classObject) { - return this.isEmpty() && other.isEmpty() || this.first.equals_za3rmp$(other.first) && (this.last.equals_za3rmp$(other.last) && this.step.equals_za3rmp$(other.step)); - } - return false; - } - function getProgressionFinalElement(start, end, step) { - function mod(a, b) { - var mod = a % b; - return mod >= 0 ? mod : mod + b; - } - function differenceModulo(a, b, c) { - return mod(mod(a, c) - mod(b, c), c); - } - if (step > 0) { - return end - differenceModulo(end, start, step); - } else { - if (step < 0) { - return end + differenceModulo(start, end, -step); - } else { - throw new Kotlin.IllegalArgumentException("Step is zero."); - } - } - } - function getProgressionFinalElementLong(start, end, step) { - function mod(a, b) { - var mod = a.modulo(b); - return!mod.isNegative() ? mod : mod.add(b); - } - function differenceModulo(a, b, c) { - return mod(mod(a, c).subtract(mod(b, c)), c); - } - var diff; - if (step.compareTo_za3rmp$(Kotlin.Long.ZERO) > 0) { - diff = differenceModulo(end, start, step); - return diff.isZero() ? end : end.subtract(diff); - } else { - if (step.compareTo_za3rmp$(Kotlin.Long.ZERO) < 0) { - diff = differenceModulo(start, end, step.unaryMinus()); - return diff.isZero() ? end : end.add(diff); - } else { - throw new Kotlin.IllegalArgumentException("Step is zero."); - } - } - } - lazyInitClasses.NumberProgression = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(start, end, step) { - this.first = start; - this.last = getProgressionFinalElement(start, end, step); - this.step = step; - if (this.step === 0) { - throw new Kotlin.IllegalArgumentException("Step must be non-zero"); - } - }, {iterator:function() { - return new Kotlin.RangeIterator(this.first, this.last, this.step); - }, isEmpty:function() { - return this.step > 0 ? this.first > this.last : this.first < this.last; - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * (31 * this.first + this.last) + this.step; - }, equals_za3rmp$:isSameNotNullRanges, toString:function() { - return this.step > 0 ? this.first.toString() + ".." + this.last + " step " + this.step : this.first.toString() + " downTo " + this.last + " step " + -this.step; - }}); - lazyInitClasses.NumberRange = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.ranges.ClosedRange, Kotlin.NumberProgression]; - }, function $fun(start, endInclusive) { - $fun.baseInitializer.call(this, start, endInclusive, 1); - this.start = start; - this.endInclusive = endInclusive; - }, {contains_htax2k$:function(item) { - return this.start <= item && item <= this.endInclusive; - }, isEmpty:function() { - return this.start > this.endInclusive; - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * this.start + this.endInclusive; - }, equals_za3rmp$:isSameNotNullRanges, toString:function() { - return this.start.toString() + ".." + this.endInclusive; - }}, {Companion:Kotlin.createObject(null, function() { - this.EMPTY = new Kotlin.NumberRange(1, 0); - })}); - lazyInitClasses.LongRangeIterator = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(start, end, step) { - this.start = start; - this.end = end; - this.step = step; - this.i = start; - }, {next:function() { - var value = this.i; - this.i = this.i.add(this.step); - return value; - }, hasNext:function() { - if (this.step.isNegative()) { - return this.i.compare(this.end) >= 0; - } else { - return this.i.compare(this.end) <= 0; - } - }}); - lazyInitClasses.LongProgression = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(start, end, step) { - this.first = start; - this.last = getProgressionFinalElementLong(start, end, step); - this.step = step; - if (this.step.isZero()) { - throw new Kotlin.IllegalArgumentException("Step must be non-zero"); - } - }, {iterator:function() { - return new Kotlin.LongRangeIterator(this.first, this.last, this.step); - }, isEmpty:function() { - return this.step.isNegative() ? this.first.compare(this.last) < 0 : this.first.compare(this.last) > 0; - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * (31 * this.first.toInt() + this.last.toInt()) + this.step.toInt(); - }, equals_za3rmp$:isSameLongRanges, toString:function() { - return!this.step.isNegative() ? this.first.toString() + ".." + this.last + " step " + this.step : this.first.toString() + " downTo " + this.last + " step " + this.step.unaryMinus(); - }}); - lazyInitClasses.LongRange = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.ranges.ClosedRange, Kotlin.LongProgression]; - }, function $fun(start, endInclusive) { - $fun.baseInitializer.call(this, start, endInclusive, Kotlin.Long.ONE); - this.start = start; - this.endInclusive = endInclusive; - }, {contains_htax2k$:function(item) { - return this.start.compareTo_za3rmp$(item) <= 0 && item.compareTo_za3rmp$(this.endInclusive) <= 0; - }, isEmpty:function() { - return this.start.compare(this.endInclusive) > 0; - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * this.start.toInt() + this.endInclusive.toInt(); - }, equals_za3rmp$:isSameLongRanges, toString:function() { - return this.start.toString() + ".." + this.endInclusive; - }}, {Companion:Kotlin.createObject(null, function() { - this.EMPTY = new Kotlin.LongRange(Kotlin.Long.ONE, Kotlin.Long.ZERO); - })}); - lazyInitClasses.CharRangeIterator = Kotlin.createClass(function() { - return[Kotlin.RangeIterator]; - }, function(start, end, step) { - Kotlin.RangeIterator.call(this, start, end, step); - }, {next:function() { - var value = this.i; - this.i = this.i + this.step; - return String.fromCharCode(value); - }}); - lazyInitClasses.CharProgression = Kotlin.createClassNow(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(start, end, step) { - this.first = start; - this.startCode = start.charCodeAt(0); - this.endCode = getProgressionFinalElement(this.startCode, end.charCodeAt(0), step); - this.last = String.fromCharCode(this.endCode); - this.step = step; - if (this.step === 0) { - throw new Kotlin.IllegalArgumentException("Increment must be non-zero"); - } - }, {iterator:function() { - return new Kotlin.CharRangeIterator(this.startCode, this.endCode, this.step); - }, isEmpty:function() { - return this.step > 0 ? this.startCode > this.endCode : this.startCode < this.endCode; - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * (31 * this.startCode | 0 + this.endCode | 0) + this.step | 0; - }, equals_za3rmp$:isSameNotNullRanges, toString:function() { - return this.step > 0 ? this.first.toString() + ".." + this.last + " step " + this.step : this.first.toString() + " downTo " + this.last + " step " + -this.step; - }}); - lazyInitClasses.CharRange = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.ranges.ClosedRange, Kotlin.CharProgression]; - }, function $fun(start, endInclusive) { - $fun.baseInitializer.call(this, start, endInclusive, 1); - this.start = start; - this.endInclusive = endInclusive; - }, {contains_htax2k$:function(item) { - return this.start <= item && item <= this.endInclusive; - }, isEmpty:function() { - return this.start > this.endInclusive; - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * this.startCode | 0 + this.endCode | 0; - }, equals_za3rmp$:isSameNotNullRanges, toString:function() { - return this.start.toString() + ".." + this.endInclusive; - }}, {Companion:Kotlin.createObject(null, function() { - this.EMPTY = new Kotlin.CharRange(Kotlin.toChar(1), Kotlin.toChar(0)); - })}); - Kotlin.Comparator = Kotlin.createClassNow(null, null, {compare:throwAbstractFunctionInvocationError("Comparator#compare")}); - Kotlin.collectionsMax = function(c, comp) { - if (c.isEmpty()) { - throw new Error; - } - var it = c.iterator(); - var max = it.next(); - while (it.hasNext()) { - var el = it.next(); - if (comp.compare(max, el) < 0) { - max = el; - } - } - return max; - }; - Kotlin.collectionsSort = function(mutableList, comparator) { - var boundComparator = void 0; - if (comparator !== void 0) { - boundComparator = comparator.compare.bind(comparator); - } - if (mutableList instanceof Array) { - mutableList.sort(boundComparator); - } - if (mutableList.size > 1) { - var array = Kotlin.copyToArray(mutableList); - array.sort(boundComparator); - for (var i = 0, n = array.length;i < n;i++) { - mutableList.set_vux3hl$(i, array[i]); - } - } - }; - Kotlin.primitiveArraySort = function(array) { - array.sort(Kotlin.primitiveCompareTo); - }; - Kotlin.copyToArray = function(collection) { - if (typeof collection.toArray !== "undefined") { - return collection.toArray(); - } - var array = []; - var it = collection.iterator(); - while (it.hasNext()) { - array.push(it.next()); - } - return array; - }; - Kotlin.StringBuilder = Kotlin.createClassNow([CharSequence], function(content) { - this.string = typeof content == "string" ? content : ""; - }, {length:{get:function() { - return this.string.length; - }}, substring:function(start, end) { - return this.string.substring(start, end); - }, charAt:function(index) { - return this.string.charAt(index); - }, append:function(obj, from, to) { - if (from == void 0 && to == void 0) { - this.string = this.string + obj.toString(); - } else { - if (to == void 0) { - this.string = this.string + obj.toString().substring(from); - } else { - this.string = this.string + obj.toString().substring(from, to); - } - } - return this; - }, reverse:function() { - this.string = this.string.split("").reverse().join(""); - return this; - }, toString:function() { - return this.string; - }}); - Kotlin.splitString = function(str, regex, limit) { - return str.split(new RegExp(regex), limit); - }; - Kotlin.nullArray = function(size) { - var res = []; - var i = size; - while (i > 0) { - res[--i] = null; - } - return res; - }; - Kotlin.numberArrayOfSize = function(size) { - return Kotlin.arrayFromFun(size, function() { - return 0; - }); - }; - Kotlin.charArrayOfSize = function(size) { - return Kotlin.arrayFromFun(size, function() { - return "\x00"; - }); - }; - Kotlin.booleanArrayOfSize = function(size) { - return Kotlin.arrayFromFun(size, function() { - return false; - }); - }; - Kotlin.longArrayOfSize = function(size) { - return Kotlin.arrayFromFun(size, function() { - return Kotlin.Long.ZERO; - }); - }; - Kotlin.arrayFromFun = function(size, initFun) { - var result = new Array(size); - for (var i = 0;i < size;i++) { - result[i] = initFun(i); - } - return result; - }; - Kotlin.arrayIterator = function(array) { - return new Kotlin.ArrayIterator(array); - }; - Kotlin.jsonAddProperties = function(obj1, obj2) { - for (var p in obj2) { - if (obj2.hasOwnProperty(p)) { - obj1[p] = obj2[p]; - } - } - return obj1; - }; - Kotlin.createDefinition(lazyInitClasses, Kotlin); -})(Kotlin); -(function(Kotlin) { - function Entry(key, value) { - this.key = key; - this.value = value; - } - Entry.prototype.getKey = function() { - return this.key; - }; - Entry.prototype.getValue = function() { - return this.value; - }; - Entry.prototype.hashCode = function() { - return mapEntryHashCode(this.key, this.value); - }; - Entry.prototype.equals_za3rmp$ = function(o) { - return o instanceof Entry && (Kotlin.equals(this.key, o.getKey()) && Kotlin.equals(this.value, o.getValue())); - }; - Entry.prototype.toString = function() { - return Kotlin.toString(this.key) + "\x3d" + Kotlin.toString(this.value); - }; - function hashMapPutAll(fromMap) { - var entries = fromMap.entries; - var it = entries.iterator(); - while (it.hasNext()) { - var e = it.next(); - this.put_wn2jw4$(e.getKey(), e.getValue()); - } - } - function hashSetEquals(o) { - if (o == null || this.size !== o.size) { - return false; - } - return this.containsAll_wtfk93$(o); - } - function hashSetHashCode() { - var h = 0; - var i = this.iterator(); - while (i.hasNext()) { - var obj = i.next(); - h += Kotlin.hashCode(obj); - } - return h; - } - function convertKeyToString(key) { - return key; - } - function convertKeyToNumber(key) { - return+key; - } - function convertKeyToBoolean(key) { - return key == "true"; - } - var FUNCTION = "function"; - var arrayRemoveAt = typeof Array.prototype.splice == FUNCTION ? function(arr, idx) { - arr.splice(idx, 1); - } : function(arr, idx) { - var itemsAfterDeleted, i, len; - if (idx === arr.length - 1) { - arr.length = idx; - } else { - itemsAfterDeleted = arr.slice(idx + 1); - arr.length = idx; - for (i = 0, len = itemsAfterDeleted.length;i < len;++i) { - arr[idx + i] = itemsAfterDeleted[i]; - } - } - }; - function hashObject(obj) { - if (obj == null) { - return ""; - } - var hashCode; - if (typeof obj == "string") { - return obj; - } else { - if (typeof obj.hashCode == FUNCTION) { - hashCode = obj.hashCode(); - return typeof hashCode == "string" ? hashCode : hashObject(hashCode); - } else { - if (typeof obj.toString == FUNCTION) { - return obj.toString(); - } else { - try { - return String(obj); - } catch (ex) { - return Object.prototype.toString.call(obj); - } - } - } - } - } - function mapEntryHashCode(key, value) { - return Kotlin.hashCode(key) ^ Kotlin.hashCode(value); - } - function equals_fixedValueHasEquals(fixedValue, variableValue) { - return fixedValue.equals_za3rmp$(variableValue); - } - function equals_fixedValueNoEquals(fixedValue, variableValue) { - return variableValue != null && typeof variableValue.equals_za3rmp$ == FUNCTION ? variableValue.equals_za3rmp$(fixedValue) : fixedValue === variableValue; - } - function Bucket(hash, firstKey, firstValue, equalityFunction) { - this[0] = hash; - this.entries = []; - this.addEntry(firstKey, firstValue); - if (equalityFunction !== null) { - this.getEqualityFunction = function() { - return equalityFunction; - }; - } - } - var EXISTENCE = 0, ENTRY = 1, ENTRY_INDEX_AND_VALUE = 2; - function createBucketSearcher(mode) { - return function(key) { - var i = this.entries.length, entry, equals = this.getEqualityFunction(key); - while (i--) { - entry = this.entries[i]; - if (equals(key, entry[0])) { - switch(mode) { - case EXISTENCE: - return true; - case ENTRY: - return entry; - case ENTRY_INDEX_AND_VALUE: - return[i, entry[1]]; - } - } - } - return false; - }; - } - function createBucketLister(entryProperty) { - return function(aggregatedArr) { - var startIndex = aggregatedArr.length; - for (var i = 0, len = this.entries.length;i < len;++i) { - aggregatedArr[startIndex + i] = this.entries[i][entryProperty]; - } - }; - } - Bucket.prototype = {getEqualityFunction:function(searchValue) { - return searchValue != null && typeof searchValue.equals_za3rmp$ == FUNCTION ? equals_fixedValueHasEquals : equals_fixedValueNoEquals; - }, getEntryForKey:createBucketSearcher(ENTRY), getEntryAndIndexForKey:createBucketSearcher(ENTRY_INDEX_AND_VALUE), removeEntryForKey:function(key) { - var result = this.getEntryAndIndexForKey(key); - if (result) { - arrayRemoveAt(this.entries, result[0]); - return result; - } - return null; - }, addEntry:function(key, value) { - this.entries[this.entries.length] = [key, value]; - }, keys:createBucketLister(0), values:createBucketLister(1), getEntries:function(entries) { - var startIndex = entries.length; - for (var i = 0, len = this.entries.length;i < len;++i) { - entries[startIndex + i] = this.entries[i].slice(0); - } - }, containsKey_za3rmp$:createBucketSearcher(EXISTENCE), containsValue_za3rmp$:function(value) { - var i = this.entries.length; - while (i--) { - if (value === this.entries[i][1]) { - return true; - } - } - return false; - }}; - function searchBuckets(buckets, hash) { - var i = buckets.length, bucket; - while (i--) { - bucket = buckets[i]; - if (hash === bucket[0]) { - return i; - } - } - return null; - } - function getBucketForHash(bucketsByHash, hash) { - var bucket = bucketsByHash[hash]; - return bucket && bucket instanceof Bucket ? bucket : null; - } - function Hashtable(hashingFunctionParam, equalityFunctionParam) { - this.buckets = []; - this.bucketsByHash = {}; - this.hashingFunction = typeof hashingFunctionParam == FUNCTION ? hashingFunctionParam : hashObject; - this.equalityFunction = typeof equalityFunctionParam == FUNCTION ? equalityFunctionParam : null; - this._size = 0; - } - Hashtable.prototype.put_wn2jw4$ = function(key, value) { - var hash = this.hashingFunction(key), bucket, bucketEntry, oldValue = null; - bucket = getBucketForHash(this.bucketsByHash, hash); - if (bucket) { - bucketEntry = bucket.getEntryForKey(key); - if (bucketEntry) { - oldValue = bucketEntry[1]; - bucketEntry[1] = value; - } else { - bucket.addEntry(key, value); - this._size++; - } - } else { - bucket = new Bucket(hash, key, value, this.equalityFunction); - this.buckets[this.buckets.length] = bucket; - this.bucketsByHash[hash] = bucket; - this._size++; - } - return oldValue; - }; - Hashtable.prototype.get_za3rmp$ = function(key) { - var hash = this.hashingFunction(key); - var bucket = getBucketForHash(this.bucketsByHash, hash); - if (bucket) { - var bucketEntry = bucket.getEntryForKey(key); - if (bucketEntry) { - return bucketEntry[1]; - } - } - return null; - }; - Hashtable.prototype.containsKey_za3rmp$ = function(key) { - var bucketKey = this.hashingFunction(key); - var bucket = getBucketForHash(this.bucketsByHash, bucketKey); - return bucket ? bucket.containsKey_za3rmp$(key) : false; - }; - Hashtable.prototype.containsValue_za3rmp$ = function(value) { - var i = this.buckets.length; - while (i--) { - if (this.buckets[i].containsValue_za3rmp$(value)) { - return true; - } - } - return false; - }; - Hashtable.prototype.clear = function() { - this.buckets.length = 0; - this.bucketsByHash = {}; - this._size = 0; - }; - Hashtable.prototype.isEmpty = function() { - return!this.buckets.length; - }; - Hashtable.prototype._keys = function() { - var aggregated = [], i = this.buckets.length; - while (i--) { - this.buckets[i].keys(aggregated); - } - return aggregated; - }; - Hashtable.prototype._values = function() { - var aggregated = [], i = this.buckets.length; - while (i--) { - this.buckets[i].values(aggregated); - } - return aggregated; - }; - Hashtable.prototype._entries = function() { - var aggregated = [], i = this.buckets.length; - while (i--) { - this.buckets[i].getEntries(aggregated); - } - return aggregated; - }; - Object.defineProperty(Hashtable.prototype, "values", {get:function() { - var values = this._values(); - var i = values.length; - var result = new Kotlin.ArrayList; - while (i--) { - result.add_za3rmp$(values[i]); - } - return result; - }, configurable:true}); - Hashtable.prototype.remove_za3rmp$ = function(key) { - var hash = this.hashingFunction(key), bucketIndex, oldValue = null, result = null; - var bucket = getBucketForHash(this.bucketsByHash, hash); - if (bucket) { - result = bucket.removeEntryForKey(key); - if (result !== null) { - this._size--; - oldValue = result[1]; - if (!bucket.entries.length) { - bucketIndex = searchBuckets(this.buckets, hash); - arrayRemoveAt(this.buckets, bucketIndex); - delete this.bucketsByHash[hash]; - } - } - } - return oldValue; - }; - Object.defineProperty(Hashtable.prototype, "size", {get:function() { - return this._size; - }}); - Hashtable.prototype.each = function(callback) { - var entries = this._entries(), i = entries.length, entry; - while (i--) { - entry = entries[i]; - callback(entry[0], entry[1]); - } - }; - Hashtable.prototype.putAll_r12sna$ = hashMapPutAll; - Hashtable.prototype.clone = function() { - var clone = new Hashtable(this.hashingFunction, this.equalityFunction); - clone.putAll_r12sna$(this); - return clone; - }; - Object.defineProperty(Hashtable.prototype, "keys", {get:function() { - var res = new Kotlin.ComplexHashSet; - var keys = this._keys(); - var i = keys.length; - while (i--) { - res.add_za3rmp$(keys[i]); - } - return res; - }, configurable:true}); - Object.defineProperty(Hashtable.prototype, "entries", {get:function() { - var result = new Kotlin.ComplexHashSet; - var entries = this._entries(); - var i = entries.length; - while (i--) { - var entry = entries[i]; - result.add_za3rmp$(new Entry(entry[0], entry[1])); - } - return result; - }, configurable:true}); - Hashtable.prototype.hashCode = function() { - var h = 0; - var entries = this._entries(); - var i = entries.length; - while (i--) { - var entry = entries[i]; - h += mapEntryHashCode(entry[0], entry[1]); - } - return h; - }; - Hashtable.prototype.equals_za3rmp$ = function(o) { - if (o == null || this.size !== o.size) { - return false; - } - var entries = this._entries(); - var i = entries.length; - while (i--) { - var entry = entries[i]; - var key = entry[0]; - var value = entry[1]; - if (value == null) { - if (!(o.get_za3rmp$(key) == null && o.contains_za3rmp$(key))) { - return false; - } - } else { - if (!Kotlin.equals(value, o.get_za3rmp$(key))) { - return false; - } - } - } - return true; - }; - Hashtable.prototype.toString = function() { - var entries = this._entries(); - var length = entries.length; - if (length === 0) { - return "{}"; - } - var builder = "{"; - for (var i = 0;;) { - var entry = entries[i]; - var key = entry[0]; - var value = entry[1]; - builder += (key === this ? "(this Map)" : Kotlin.toString(key)) + "\x3d" + (value === this ? "(this Map)" : Kotlin.toString(value)); - if (++i >= length) { - return builder + "}"; - } - builder += ", "; - } - }; - Kotlin.HashTable = Hashtable; - var lazyInitClasses = {}; - lazyInitClasses.HashMap = Kotlin.createClass(function() { - return[Kotlin.HashTable, Kotlin.modules["builtins"].kotlin.collections.MutableMap]; - }, function() { - Kotlin.HashTable.call(this); - }); - Object.defineProperty(Kotlin, "ComplexHashMap", {get:function() { - return Kotlin.HashMap; - }}); - lazyInitClasses.PrimitiveHashMapValuesIterator = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(map, keys) { - this.map = map; - this.keys = keys; - this.size = keys.length; - this.index = 0; - }, {next:function() { - if (!this.hasNext()) { - throw new Kotlin.NoSuchElementException; - } - return this.map[this.keys[this.index++]]; - }, hasNext:function() { - return this.index < this.size; - }}); - lazyInitClasses.PrimitiveHashMapValues = Kotlin.createClass(function() { - return[Kotlin.AbstractCollection]; - }, function(map) { - this.map = map; - }, {iterator:function() { - return new Kotlin.PrimitiveHashMapValuesIterator(this.map.map, Object.keys(this.map.map)); - }, isEmpty:function() { - return this.map.isEmpty(); - }, size:{get:function() { - return this.map.size; - }}, contains_za3rmp$:function(o) { - return this.map.containsValue_za3rmp$(o); - }}); - lazyInitClasses.AbstractPrimitiveHashMap = Kotlin.createClass(function() { - return[Kotlin.HashMap]; - }, function() { - this.$size = 0; - this.map = Object.create(null); - }, {size:{get:function() { - return this.$size; - }}, isEmpty:function() { - return this.$size === 0; - }, containsKey_za3rmp$:function(key) { - return this.map[key] !== void 0; - }, containsValue_za3rmp$:function(value) { - var map = this.map; - for (var key in map) { - if (map[key] === value) { - return true; - } - } - return false; - }, get_za3rmp$:function(key) { - return this.map[key]; - }, put_wn2jw4$:function(key, value) { - var prevValue = this.map[key]; - this.map[key] = value === void 0 ? null : value; - if (prevValue === void 0) { - this.$size++; - } - return prevValue; - }, remove_za3rmp$:function(key) { - var prevValue = this.map[key]; - if (prevValue !== void 0) { - delete this.map[key]; - this.$size--; - } - return prevValue; - }, clear:function() { - this.$size = 0; - this.map = {}; - }, putAll_r12sna$:hashMapPutAll, entries:{get:function() { - var result = new Kotlin.ComplexHashSet; - var map = this.map; - for (var key in map) { - result.add_za3rmp$(new Entry(this.convertKeyToKeyType(key), map[key])); - } - return result; - }}, getKeySetClass:function() { - throw new Error("Kotlin.AbstractPrimitiveHashMap.getKetSetClass is abstract"); - }, convertKeyToKeyType:function(key) { - throw new Error("Kotlin.AbstractPrimitiveHashMap.convertKeyToKeyType is abstract"); - }, keys:{get:function() { - var result = new (this.getKeySetClass()); - var map = this.map; - for (var key in map) { - result.add_za3rmp$(key); - } - return result; - }}, values:{get:function() { - return new Kotlin.PrimitiveHashMapValues(this); - }}, toJSON:function() { - return this.map; - }, toString:function() { - if (this.isEmpty()) { - return "{}"; - } - var map = this.map; - var isFirst = true; - var builder = "{"; - for (var key in map) { - var value = map[key]; - builder += (isFirst ? "" : ", ") + Kotlin.toString(key) + "\x3d" + (value === this ? "(this Map)" : Kotlin.toString(value)); - isFirst = false; - } - return builder + "}"; - }, equals_za3rmp$:function(o) { - if (o == null || this.size !== o.size) { - return false; - } - var map = this.map; - for (var key in map) { - var key_ = this.convertKeyToKeyType(key); - var value = map[key]; - if (value == null) { - if (!(o.get_za3rmp$(key_) == null && o.contains_za3rmp$(key_))) { - return false; - } - } else { - if (!Kotlin.equals(value, o.get_za3rmp$(key_))) { - return false; - } - } - } - return true; - }, hashCode:function() { - var h = 0; - var map = this.map; - for (var key in map) { - h += mapEntryHashCode(this.convertKeyToKeyType(key), map[key]); - } - return h; - }}); - lazyInitClasses.DefaultPrimitiveHashMap = Kotlin.createClass(function() { - return[Kotlin.AbstractPrimitiveHashMap]; - }, function() { - Kotlin.AbstractPrimitiveHashMap.call(this); - }, {getKeySetClass:function() { - return Kotlin.DefaultPrimitiveHashSet; - }, convertKeyToKeyType:convertKeyToString}); - lazyInitClasses.PrimitiveNumberHashMap = Kotlin.createClass(function() { - return[Kotlin.AbstractPrimitiveHashMap]; - }, function() { - Kotlin.AbstractPrimitiveHashMap.call(this); - this.$keySetClass$ = Kotlin.PrimitiveNumberHashSet; - }, {getKeySetClass:function() { - return Kotlin.PrimitiveNumberHashSet; - }, convertKeyToKeyType:convertKeyToNumber}); - lazyInitClasses.PrimitiveBooleanHashMap = Kotlin.createClass(function() { - return[Kotlin.AbstractPrimitiveHashMap]; - }, function() { - Kotlin.AbstractPrimitiveHashMap.call(this); - }, {getKeySetClass:function() { - return Kotlin.PrimitiveBooleanHashSet; - }, convertKeyToKeyType:convertKeyToBoolean}); - lazyInitClasses.LinkedHashMap = Kotlin.createClass(function() { - return[Kotlin.ComplexHashMap]; - }, function() { - Kotlin.ComplexHashMap.call(this); - this.orderedKeys = []; - }, {put_wn2jw4$:function(key, value) { - if (!this.containsKey_za3rmp$(key)) { - this.orderedKeys.push(key); - } - return Kotlin.ComplexHashMap.prototype.put_wn2jw4$.call(this, key, value); - }, remove_za3rmp$:function(key) { - var i = this.orderedKeys.indexOf(key); - if (i != -1) { - this.orderedKeys.splice(i, 1); - } - return Kotlin.ComplexHashMap.prototype.remove_za3rmp$.call(this, key); - }, clear:function() { - Kotlin.ComplexHashMap.prototype.clear.call(this); - this.orderedKeys = []; - }, keys:{get:function() { - var set = new Kotlin.LinkedHashSet; - set.map = this; - return set; - }}, entries:{get:function() { - var set = new Kotlin.LinkedHashSet; - for (var i = 0, c = this.orderedKeys, l = c.length;i < l;i++) { - set.add_za3rmp$(new Entry(c[i], this.get_za3rmp$(c[i]))); - } - return set; - }}}); - lazyInitClasses.LinkedHashSet = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.MutableSet, Kotlin.HashSet]; - }, function() { - this.map = new Kotlin.LinkedHashMap; - }, {equals_za3rmp$:hashSetEquals, hashCode:hashSetHashCode, size:{get:function() { - return this.map.size; - }}, contains_za3rmp$:function(element) { - return this.map.containsKey_za3rmp$(element); - }, iterator:function() { - return new Kotlin.SetIterator(this); - }, add_za3rmp$:function(element) { - return this.map.put_wn2jw4$(element, true) == null; - }, remove_za3rmp$:function(element) { - return this.map.remove_za3rmp$(element) != null; - }, clear:function() { - this.map.clear(); - }, toArray:function() { - return this.map.orderedKeys.slice(); - }}); - lazyInitClasses.SetIterator = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.MutableIterator]; - }, function(set) { - this.set = set; - this.keys = set.toArray(); - this.index = 0; - }, {next:function() { - if (!this.hasNext()) { - throw new Kotlin.NoSuchElementException; - } - return this.keys[this.index++]; - }, hasNext:function() { - return this.index < this.keys.length; - }, remove:function() { - if (this.index === 0) { - throw Kotlin.IllegalStateException(); - } - this.set.remove_za3rmp$(this.keys[this.index - 1]); - }}); - lazyInitClasses.AbstractPrimitiveHashSet = Kotlin.createClass(function() { - return[Kotlin.HashSet]; - }, function() { - this.$size = 0; - this.map = Object.create(null); - }, {equals_za3rmp$:hashSetEquals, hashCode:hashSetHashCode, size:{get:function() { - return this.$size; - }}, contains_za3rmp$:function(key) { - return this.map[key] === true; - }, iterator:function() { - return new Kotlin.SetIterator(this); - }, add_za3rmp$:function(element) { - var prevElement = this.map[element]; - this.map[element] = true; - if (prevElement === true) { - return false; - } else { - this.$size++; - return true; - } - }, remove_za3rmp$:function(element) { - if (this.map[element] === true) { - delete this.map[element]; - this.$size--; - return true; - } else { - return false; - } - }, clear:function() { - this.$size = 0; - this.map = {}; - }, convertKeyToKeyType:function(key) { - throw new Error("Kotlin.AbstractPrimitiveHashSet.convertKeyToKeyType is abstract"); - }, toArray:function() { - var result = Object.keys(this.map); - for (var i = 0;i < result.length;i++) { - result[i] = this.convertKeyToKeyType(result[i]); - } - return result; - }}); - lazyInitClasses.DefaultPrimitiveHashSet = Kotlin.createClass(function() { - return[Kotlin.AbstractPrimitiveHashSet]; - }, function() { - Kotlin.AbstractPrimitiveHashSet.call(this); - }, {toArray:function() { - return Object.keys(this.map); - }, convertKeyToKeyType:convertKeyToString}); - lazyInitClasses.PrimitiveNumberHashSet = Kotlin.createClass(function() { - return[Kotlin.AbstractPrimitiveHashSet]; - }, function() { - Kotlin.AbstractPrimitiveHashSet.call(this); - }, {convertKeyToKeyType:convertKeyToNumber}); - lazyInitClasses.PrimitiveBooleanHashSet = Kotlin.createClass(function() { - return[Kotlin.AbstractPrimitiveHashSet]; - }, function() { - Kotlin.AbstractPrimitiveHashSet.call(this); - }, {convertKeyToKeyType:convertKeyToBoolean}); - function HashSet(hashingFunction, equalityFunction) { - var hashTable = new Kotlin.HashTable(hashingFunction, equalityFunction); - this.addAll_wtfk93$ = Kotlin.AbstractCollection.prototype.addAll_wtfk93$; - this.removeAll_wtfk93$ = Kotlin.AbstractCollection.prototype.removeAll_wtfk93$; - this.retainAll_wtfk93$ = Kotlin.AbstractCollection.prototype.retainAll_wtfk93$; - this.containsAll_wtfk93$ = Kotlin.AbstractCollection.prototype.containsAll_wtfk93$; - this.add_za3rmp$ = function(o) { - return!hashTable.put_wn2jw4$(o, true); - }; - this.toArray = function() { - return hashTable._keys(); - }; - this.iterator = function() { - return new Kotlin.SetIterator(this); - }; - this.remove_za3rmp$ = function(o) { - return hashTable.remove_za3rmp$(o) != null; - }; - this.contains_za3rmp$ = function(o) { - return hashTable.containsKey_za3rmp$(o); - }; - this.clear = function() { - hashTable.clear(); - }; - Object.defineProperty(this, "size", {get:function() { - return hashTable.size; - }}); - this.isEmpty = function() { - return hashTable.isEmpty(); - }; - this.clone = function() { - var h = new HashSet(hashingFunction, equalityFunction); - h.addAll_wtfk93$(hashTable.keys()); - return h; - }; - this.equals_za3rmp$ = hashSetEquals; - this.toString = function() { - var builder = "["; - var iter = this.iterator(); - var first = true; - while (iter.hasNext()) { - if (first) { - first = false; - } else { - builder += ", "; - } - builder += iter.next(); - } - builder += "]"; - return builder; - }; - this.intersection = function(hashSet) { - var intersection = new HashSet(hashingFunction, equalityFunction); - var values = hashSet.values, i = values.length, val; - while (i--) { - val = values[i]; - if (hashTable.containsKey_za3rmp$(val)) { - intersection.add_za3rmp$(val); - } - } - return intersection; - }; - this.union = function(hashSet) { - var union = this.clone(); - var values = hashSet.values, i = values.length, val; - while (i--) { - val = values[i]; - if (!hashTable.containsKey_za3rmp$(val)) { - union.add_za3rmp$(val); - } - } - return union; - }; - this.isSubsetOf = function(hashSet) { - var values = hashTable.keys(), i = values.length; - while (i--) { - if (!hashSet.contains_za3rmp$(values[i])) { - return false; - } - } - return true; - }; - this.hashCode = hashSetHashCode; - } - lazyInitClasses.HashSet = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.MutableSet, Kotlin.AbstractCollection]; - }, function() { - HashSet.call(this); - }); - Object.defineProperty(Kotlin, "ComplexHashSet", {get:function() { - return Kotlin.HashSet; - }}); - Kotlin.createDefinition(lazyInitClasses, Kotlin); -})(Kotlin); -(function(Kotlin) { - Kotlin.Long = function(low, high) { - this.low_ = low | 0; - this.high_ = high | 0; - }; - Kotlin.Long.IntCache_ = {}; - Kotlin.Long.fromInt = function(value) { - if (-128 <= value && value < 128) { - var cachedObj = Kotlin.Long.IntCache_[value]; - if (cachedObj) { - return cachedObj; - } - } - var obj = new Kotlin.Long(value | 0, value < 0 ? -1 : 0); - if (-128 <= value && value < 128) { - Kotlin.Long.IntCache_[value] = obj; - } - return obj; - }; - Kotlin.Long.fromNumber = function(value) { - if (isNaN(value) || !isFinite(value)) { - return Kotlin.Long.ZERO; - } else { - if (value <= -Kotlin.Long.TWO_PWR_63_DBL_) { - return Kotlin.Long.MIN_VALUE; - } else { - if (value + 1 >= Kotlin.Long.TWO_PWR_63_DBL_) { - return Kotlin.Long.MAX_VALUE; - } else { - if (value < 0) { - return Kotlin.Long.fromNumber(-value).negate(); - } else { - return new Kotlin.Long(value % Kotlin.Long.TWO_PWR_32_DBL_ | 0, value / Kotlin.Long.TWO_PWR_32_DBL_ | 0); - } - } - } - } - }; - Kotlin.Long.fromBits = function(lowBits, highBits) { - return new Kotlin.Long(lowBits, highBits); - }; - Kotlin.Long.fromString = function(str, opt_radix) { - if (str.length == 0) { - throw Error("number format error: empty string"); - } - var radix = opt_radix || 10; - if (radix < 2 || 36 < radix) { - throw Error("radix out of range: " + radix); - } - if (str.charAt(0) == "-") { - return Kotlin.Long.fromString(str.substring(1), radix).negate(); - } else { - if (str.indexOf("-") >= 0) { - throw Error('number format error: interior "-" character: ' + str); - } - } - var radixToPower = Kotlin.Long.fromNumber(Math.pow(radix, 8)); - var result = Kotlin.Long.ZERO; - for (var i = 0;i < str.length;i += 8) { - var size = Math.min(8, str.length - i); - var value = parseInt(str.substring(i, i + size), radix); - if (size < 8) { - var power = Kotlin.Long.fromNumber(Math.pow(radix, size)); - result = result.multiply(power).add(Kotlin.Long.fromNumber(value)); - } else { - result = result.multiply(radixToPower); - result = result.add(Kotlin.Long.fromNumber(value)); - } - } - return result; - }; - Kotlin.Long.TWO_PWR_16_DBL_ = 1 << 16; - Kotlin.Long.TWO_PWR_24_DBL_ = 1 << 24; - Kotlin.Long.TWO_PWR_32_DBL_ = Kotlin.Long.TWO_PWR_16_DBL_ * Kotlin.Long.TWO_PWR_16_DBL_; - Kotlin.Long.TWO_PWR_31_DBL_ = Kotlin.Long.TWO_PWR_32_DBL_ / 2; - Kotlin.Long.TWO_PWR_48_DBL_ = Kotlin.Long.TWO_PWR_32_DBL_ * Kotlin.Long.TWO_PWR_16_DBL_; - Kotlin.Long.TWO_PWR_64_DBL_ = Kotlin.Long.TWO_PWR_32_DBL_ * Kotlin.Long.TWO_PWR_32_DBL_; - Kotlin.Long.TWO_PWR_63_DBL_ = Kotlin.Long.TWO_PWR_64_DBL_ / 2; - Kotlin.Long.ZERO = Kotlin.Long.fromInt(0); - Kotlin.Long.ONE = Kotlin.Long.fromInt(1); - Kotlin.Long.NEG_ONE = Kotlin.Long.fromInt(-1); - Kotlin.Long.MAX_VALUE = Kotlin.Long.fromBits(4294967295 | 0, 2147483647 | 0); - Kotlin.Long.MIN_VALUE = Kotlin.Long.fromBits(0, 2147483648 | 0); - Kotlin.Long.TWO_PWR_24_ = Kotlin.Long.fromInt(1 << 24); - Kotlin.Long.prototype.toInt = function() { - return this.low_; - }; - Kotlin.Long.prototype.toNumber = function() { - return this.high_ * Kotlin.Long.TWO_PWR_32_DBL_ + this.getLowBitsUnsigned(); - }; - Kotlin.Long.prototype.toString = function(opt_radix) { - var radix = opt_radix || 10; - if (radix < 2 || 36 < radix) { - throw Error("radix out of range: " + radix); - } - if (this.isZero()) { - return "0"; - } - if (this.isNegative()) { - if (this.equals(Kotlin.Long.MIN_VALUE)) { - var radixLong = Kotlin.Long.fromNumber(radix); - var div = this.div(radixLong); - var rem = div.multiply(radixLong).subtract(this); - return div.toString(radix) + rem.toInt().toString(radix); - } else { - return "-" + this.negate().toString(radix); - } - } - var radixToPower = Kotlin.Long.fromNumber(Math.pow(radix, 6)); - var rem = this; - var result = ""; - while (true) { - var remDiv = rem.div(radixToPower); - var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt(); - var digits = intval.toString(radix); - rem = remDiv; - if (rem.isZero()) { - return digits + result; - } else { - while (digits.length < 6) { - digits = "0" + digits; - } - result = "" + digits + result; - } - } - }; - Kotlin.Long.prototype.getHighBits = function() { - return this.high_; - }; - Kotlin.Long.prototype.getLowBits = function() { - return this.low_; - }; - Kotlin.Long.prototype.getLowBitsUnsigned = function() { - return this.low_ >= 0 ? this.low_ : Kotlin.Long.TWO_PWR_32_DBL_ + this.low_; - }; - Kotlin.Long.prototype.getNumBitsAbs = function() { - if (this.isNegative()) { - if (this.equals(Kotlin.Long.MIN_VALUE)) { - return 64; - } else { - return this.negate().getNumBitsAbs(); - } - } else { - var val = this.high_ != 0 ? this.high_ : this.low_; - for (var bit = 31;bit > 0;bit--) { - if ((val & 1 << bit) != 0) { - break; - } - } - return this.high_ != 0 ? bit + 33 : bit + 1; - } - }; - Kotlin.Long.prototype.isZero = function() { - return this.high_ == 0 && this.low_ == 0; - }; - Kotlin.Long.prototype.isNegative = function() { - return this.high_ < 0; - }; - Kotlin.Long.prototype.isOdd = function() { - return(this.low_ & 1) == 1; - }; - Kotlin.Long.prototype.equals = function(other) { - return this.high_ == other.high_ && this.low_ == other.low_; - }; - Kotlin.Long.prototype.notEquals = function(other) { - return this.high_ != other.high_ || this.low_ != other.low_; - }; - Kotlin.Long.prototype.lessThan = function(other) { - return this.compare(other) < 0; - }; - Kotlin.Long.prototype.lessThanOrEqual = function(other) { - return this.compare(other) <= 0; - }; - Kotlin.Long.prototype.greaterThan = function(other) { - return this.compare(other) > 0; - }; - Kotlin.Long.prototype.greaterThanOrEqual = function(other) { - return this.compare(other) >= 0; - }; - Kotlin.Long.prototype.compare = function(other) { - if (this.equals(other)) { - return 0; - } - var thisNeg = this.isNegative(); - var otherNeg = other.isNegative(); - if (thisNeg && !otherNeg) { - return-1; - } - if (!thisNeg && otherNeg) { - return 1; - } - if (this.subtract(other).isNegative()) { - return-1; - } else { - return 1; - } - }; - Kotlin.Long.prototype.negate = function() { - if (this.equals(Kotlin.Long.MIN_VALUE)) { - return Kotlin.Long.MIN_VALUE; - } else { - return this.not().add(Kotlin.Long.ONE); - } - }; - Kotlin.Long.prototype.add = function(other) { - var a48 = this.high_ >>> 16; - var a32 = this.high_ & 65535; - var a16 = this.low_ >>> 16; - var a00 = this.low_ & 65535; - var b48 = other.high_ >>> 16; - var b32 = other.high_ & 65535; - var b16 = other.low_ >>> 16; - var b00 = other.low_ & 65535; - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 + b00; - c16 += c00 >>> 16; - c00 &= 65535; - c16 += a16 + b16; - c32 += c16 >>> 16; - c16 &= 65535; - c32 += a32 + b32; - c48 += c32 >>> 16; - c32 &= 65535; - c48 += a48 + b48; - c48 &= 65535; - return Kotlin.Long.fromBits(c16 << 16 | c00, c48 << 16 | c32); - }; - Kotlin.Long.prototype.subtract = function(other) { - return this.add(other.negate()); - }; - Kotlin.Long.prototype.multiply = function(other) { - if (this.isZero()) { - return Kotlin.Long.ZERO; - } else { - if (other.isZero()) { - return Kotlin.Long.ZERO; - } - } - if (this.equals(Kotlin.Long.MIN_VALUE)) { - return other.isOdd() ? Kotlin.Long.MIN_VALUE : Kotlin.Long.ZERO; - } else { - if (other.equals(Kotlin.Long.MIN_VALUE)) { - return this.isOdd() ? Kotlin.Long.MIN_VALUE : Kotlin.Long.ZERO; - } - } - if (this.isNegative()) { - if (other.isNegative()) { - return this.negate().multiply(other.negate()); - } else { - return this.negate().multiply(other).negate(); - } - } else { - if (other.isNegative()) { - return this.multiply(other.negate()).negate(); - } - } - if (this.lessThan(Kotlin.Long.TWO_PWR_24_) && other.lessThan(Kotlin.Long.TWO_PWR_24_)) { - return Kotlin.Long.fromNumber(this.toNumber() * other.toNumber()); - } - var a48 = this.high_ >>> 16; - var a32 = this.high_ & 65535; - var a16 = this.low_ >>> 16; - var a00 = this.low_ & 65535; - var b48 = other.high_ >>> 16; - var b32 = other.high_ & 65535; - var b16 = other.low_ >>> 16; - var b00 = other.low_ & 65535; - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 * b00; - c16 += c00 >>> 16; - c00 &= 65535; - c16 += a16 * b00; - c32 += c16 >>> 16; - c16 &= 65535; - c16 += a00 * b16; - c32 += c16 >>> 16; - c16 &= 65535; - c32 += a32 * b00; - c48 += c32 >>> 16; - c32 &= 65535; - c32 += a16 * b16; - c48 += c32 >>> 16; - c32 &= 65535; - c32 += a00 * b32; - c48 += c32 >>> 16; - c32 &= 65535; - c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; - c48 &= 65535; - return Kotlin.Long.fromBits(c16 << 16 | c00, c48 << 16 | c32); - }; - Kotlin.Long.prototype.div = function(other) { - if (other.isZero()) { - throw Error("division by zero"); - } else { - if (this.isZero()) { - return Kotlin.Long.ZERO; - } - } - if (this.equals(Kotlin.Long.MIN_VALUE)) { - if (other.equals(Kotlin.Long.ONE) || other.equals(Kotlin.Long.NEG_ONE)) { - return Kotlin.Long.MIN_VALUE; - } else { - if (other.equals(Kotlin.Long.MIN_VALUE)) { - return Kotlin.Long.ONE; - } else { - var halfThis = this.shiftRight(1); - var approx = halfThis.div(other).shiftLeft(1); - if (approx.equals(Kotlin.Long.ZERO)) { - return other.isNegative() ? Kotlin.Long.ONE : Kotlin.Long.NEG_ONE; - } else { - var rem = this.subtract(other.multiply(approx)); - var result = approx.add(rem.div(other)); - return result; - } - } - } - } else { - if (other.equals(Kotlin.Long.MIN_VALUE)) { - return Kotlin.Long.ZERO; - } - } - if (this.isNegative()) { - if (other.isNegative()) { - return this.negate().div(other.negate()); - } else { - return this.negate().div(other).negate(); - } - } else { - if (other.isNegative()) { - return this.div(other.negate()).negate(); - } - } - var res = Kotlin.Long.ZERO; - var rem = this; - while (rem.greaterThanOrEqual(other)) { - var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber())); - var log2 = Math.ceil(Math.log(approx) / Math.LN2); - var delta = log2 <= 48 ? 1 : Math.pow(2, log2 - 48); - var approxRes = Kotlin.Long.fromNumber(approx); - var approxRem = approxRes.multiply(other); - while (approxRem.isNegative() || approxRem.greaterThan(rem)) { - approx -= delta; - approxRes = Kotlin.Long.fromNumber(approx); - approxRem = approxRes.multiply(other); - } - if (approxRes.isZero()) { - approxRes = Kotlin.Long.ONE; - } - res = res.add(approxRes); - rem = rem.subtract(approxRem); - } - return res; - }; - Kotlin.Long.prototype.modulo = function(other) { - return this.subtract(this.div(other).multiply(other)); - }; - Kotlin.Long.prototype.not = function() { - return Kotlin.Long.fromBits(~this.low_, ~this.high_); - }; - Kotlin.Long.prototype.and = function(other) { - return Kotlin.Long.fromBits(this.low_ & other.low_, this.high_ & other.high_); - }; - Kotlin.Long.prototype.or = function(other) { - return Kotlin.Long.fromBits(this.low_ | other.low_, this.high_ | other.high_); - }; - Kotlin.Long.prototype.xor = function(other) { - return Kotlin.Long.fromBits(this.low_ ^ other.low_, this.high_ ^ other.high_); - }; - Kotlin.Long.prototype.shiftLeft = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var low = this.low_; - if (numBits < 32) { - var high = this.high_; - return Kotlin.Long.fromBits(low << numBits, high << numBits | low >>> 32 - numBits); - } else { - return Kotlin.Long.fromBits(0, low << numBits - 32); - } - } - }; - Kotlin.Long.prototype.shiftRight = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var high = this.high_; - if (numBits < 32) { - var low = this.low_; - return Kotlin.Long.fromBits(low >>> numBits | high << 32 - numBits, high >> numBits); - } else { - return Kotlin.Long.fromBits(high >> numBits - 32, high >= 0 ? 0 : -1); - } - } - }; - Kotlin.Long.prototype.shiftRightUnsigned = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var high = this.high_; - if (numBits < 32) { - var low = this.low_; - return Kotlin.Long.fromBits(low >>> numBits | high << 32 - numBits, high >>> numBits); - } else { - if (numBits == 32) { - return Kotlin.Long.fromBits(high, 0); - } else { - return Kotlin.Long.fromBits(high >>> numBits - 32, 0); - } - } - } - }; - Kotlin.Long.prototype.equals_za3rmp$ = function(other) { - return other instanceof Kotlin.Long && this.equals(other); - }; - Kotlin.Long.prototype.compareTo_za3rmp$ = Kotlin.Long.prototype.compare; - Kotlin.Long.prototype.inc = function() { - return this.add(Kotlin.Long.ONE); - }; - Kotlin.Long.prototype.dec = function() { - return this.add(Kotlin.Long.NEG_ONE); - }; - Kotlin.Long.prototype.valueOf = function() { - return this.toNumber(); - }; - Kotlin.Long.prototype.unaryPlus = function() { - return this; - }; - Kotlin.Long.prototype.unaryMinus = Kotlin.Long.prototype.negate; - Kotlin.Long.prototype.inv = Kotlin.Long.prototype.not; - Kotlin.Long.prototype.rangeTo = function(other) { - return new Kotlin.LongRange(this, other); - }; -})(Kotlin); -(function(Kotlin) { - var _ = Kotlin.defineRootPackage(null, {kotlin:Kotlin.definePackage(null, {collections:Kotlin.definePackage(null, {Iterable:Kotlin.createTrait(null), MutableIterable:Kotlin.createTrait(function() { - return[_.kotlin.collections.Iterable]; - }), Collection:Kotlin.createTrait(function() { - return[_.kotlin.collections.Iterable]; - }), MutableCollection:Kotlin.createTrait(function() { - return[_.kotlin.collections.MutableIterable, _.kotlin.collections.Collection]; - }), List:Kotlin.createTrait(function() { - return[_.kotlin.collections.Collection]; - }), MutableList:Kotlin.createTrait(function() { - return[_.kotlin.collections.MutableCollection, _.kotlin.collections.List]; - }), Set:Kotlin.createTrait(function() { - return[_.kotlin.collections.Collection]; - }), MutableSet:Kotlin.createTrait(function() { - return[_.kotlin.collections.MutableCollection, _.kotlin.collections.Set]; - }), Map:Kotlin.createTrait(null, null, {Entry:Kotlin.createTrait(null)}), MutableMap:Kotlin.createTrait(function() { - return[_.kotlin.collections.Map]; - }, null, {MutableEntry:Kotlin.createTrait(function() { - return[_.kotlin.collections.Map.Entry]; - })}), Iterator:Kotlin.createTrait(null), MutableIterator:Kotlin.createTrait(function() { - return[_.kotlin.collections.Iterator]; - }), ListIterator:Kotlin.createTrait(function() { - return[_.kotlin.collections.Iterator]; - }), MutableListIterator:Kotlin.createTrait(function() { - return[_.kotlin.collections.MutableIterator, _.kotlin.collections.ListIterator]; - }), ByteIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextByte(); - }}), CharIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextChar(); - }}), ShortIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextShort(); - }}), IntIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextInt(); - }}), LongIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextLong(); - }}), FloatIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextFloat(); - }}), DoubleIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextDouble(); - }}), BooleanIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextBoolean(); - }})}), Function:Kotlin.createTrait(null), ranges:Kotlin.definePackage(null, {ClosedRange:Kotlin.createTrait(null, {contains_htax2k$:function(value) { - return Kotlin.compareTo(value, this.start) >= 0 && Kotlin.compareTo(value, this.endInclusive) <= 0; - }, isEmpty:function() { - return Kotlin.compareTo(this.start, this.endInclusive) > 0; - }})}), annotation:Kotlin.definePackage(null, {AnnotationTarget:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{CLASS:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, ANNOTATION_CLASS:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, TYPE_PARAMETER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, PROPERTY:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, FIELD:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, LOCAL_VARIABLE:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, VALUE_PARAMETER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, CONSTRUCTOR:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, FUNCTION:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, PROPERTY_GETTER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, PROPERTY_SETTER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, TYPE:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, EXPRESSION:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, FILE:function() { - return new _.kotlin.annotation.AnnotationTarget; - }}; - }), AnnotationRetention:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{SOURCE:function() { - return new _.kotlin.annotation.AnnotationRetention; - }, BINARY:function() { - return new _.kotlin.annotation.AnnotationRetention; - }, RUNTIME:function() { - return new _.kotlin.annotation.AnnotationRetention; - }}; - }), Target:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, function(allowedTargets) { - this.allowedTargets = allowedTargets; - }), Retention:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, function(value) { - if (value === void 0) { - value = _.kotlin.annotation.AnnotationRetention.RUNTIME; - } - this.value = value; - }), Repeatable:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), MustBeDocumented:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null)})})}); - Kotlin.defineModule("builtins", _); -})(Kotlin); -(function(Kotlin) { - var _ = Kotlin.defineRootPackage(null, {kotlin:Kotlin.definePackage(null, {js:Kotlin.definePackage(null, {jsTypeOf_za3rmp$:Kotlin.defineInlineFunction("stdlib.kotlin.js.jsTypeOf_za3rmp$", function(a) { - return typeof a; - }), asDynamic_s8jyvl$:Kotlin.defineInlineFunction("stdlib.kotlin.js.asDynamic_s8jyvl$", function($receiver) { - return $receiver; - }), iterator_s8jyvl$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var r = $receiver; - if ($receiver["iterator"] != null) { - tmp$2 = $receiver["iterator"](); - } else { - if (Array.isArray(r)) { - tmp$2 = Kotlin.arrayIterator(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - } else { - tmp$2 = (Kotlin.isType(tmp$1 = r, Kotlin.modules["builtins"].kotlin.collections.Iterable) ? tmp$1 : Kotlin.throwCCE()).iterator(); - } - } - return tmp$2; - }, json_eoa9s7$:function(pairs) { - var tmp$1, tmp$2, tmp$3; - var res = {}; - tmp$1 = pairs, tmp$2 = tmp$1.length; - for (var tmp$3 = 0;tmp$3 !== tmp$2;++tmp$3) { - var tmp$0 = tmp$1[tmp$3], name = tmp$0.component1(), value = tmp$0.component2(); - res[name] = value; - } - return res; - }, internal:Kotlin.definePackage(null, {DoubleCompanionObject:Kotlin.createObject(null, function() { - this.MIN_VALUE = Number.MIN_VALUE; - this.MAX_VALUE = Number.MAX_VALUE; - this.POSITIVE_INFINITY = Number.POSITIVE_INFINITY; - this.NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY; - this.NaN = Number.NaN; - }), FloatCompanionObject:Kotlin.createObject(null, function() { - this.MIN_VALUE = Number.MIN_VALUE; - this.MAX_VALUE = Number.MAX_VALUE; - this.POSITIVE_INFINITY = Number.POSITIVE_INFINITY; - this.NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY; - this.NaN = Number.NaN; - }), IntCompanionObject:Kotlin.createObject(null, function() { - this.MIN_VALUE = -2147483647 - 1; - this.MAX_VALUE = 2147483647; - }), LongCompanionObject:Kotlin.createObject(null, function() { - this.MIN_VALUE = Kotlin.Long.MIN_VALUE; - this.MAX_VALUE = Kotlin.Long.MAX_VALUE; - }), ShortCompanionObject:Kotlin.createObject(null, function() { - this.MIN_VALUE = -32768; - this.MAX_VALUE = 32767; - }), ByteCompanionObject:Kotlin.createObject(null, function() { - this.MIN_VALUE = -128; - this.MAX_VALUE = 127; - }), CharCompanionObject:Kotlin.createObject(null, function() { - this.MIN_HIGH_SURROGATE = "\ud800"; - this.MAX_HIGH_SURROGATE = "\udbff"; - this.MIN_LOW_SURROGATE = "\udc00"; - this.MAX_LOW_SURROGATE = "\udfff"; - this.MIN_SURROGATE = this.MIN_HIGH_SURROGATE; - this.MAX_SURROGATE = this.MAX_LOW_SURROGATE; - }), StringCompanionObject:Kotlin.createObject(null, null), EnumCompanionObject:Kotlin.createObject(null, null)})}), jvm:Kotlin.definePackage(null, {JvmOverloads:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), JvmName:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, function(name) { - this.name = name; - }), JvmMultifileClass:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null)}), text:Kotlin.definePackage(null, {isWhitespace_myv2d1$:function($receiver) { - var $receiver_0 = $receiver.toString(); - var regex = "[\\s\\xA0]"; - var result = $receiver_0.match(regex); - return result != null && result.length > 0; - }, isHighSurrogate_myv2d1$:function($receiver) { - return(new Kotlin.CharRange(Kotlin.modules["stdlib"].kotlin.js.internal.CharCompanionObject.MIN_HIGH_SURROGATE, Kotlin.modules["stdlib"].kotlin.js.internal.CharCompanionObject.MAX_HIGH_SURROGATE)).contains_htax2k$($receiver); - }, isLowSurrogate_myv2d1$:function($receiver) { - return(new Kotlin.CharRange(Kotlin.modules["stdlib"].kotlin.js.internal.CharCompanionObject.MIN_LOW_SURROGATE, Kotlin.modules["stdlib"].kotlin.js.internal.CharCompanionObject.MAX_LOW_SURROGATE)).contains_htax2k$($receiver); - }, RegexOption:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun(value) { - $fun.baseInitializer.call(this); - this.value = value; - }, function() { - return{IGNORE_CASE:function() { - return new _.kotlin.text.RegexOption("i"); - }, MULTILINE:function() { - return new _.kotlin.text.RegexOption("m"); - }}; - }), MatchGroup:Kotlin.createClass(null, function(value) { - this.value = value; - }, {component1:function() { - return this.value; - }, copy_61zpoe$:function(value) { - return new _.kotlin.text.MatchGroup(value === void 0 ? this.value : value); - }, toString:function() { - return "MatchGroup(value\x3d" + Kotlin.toString(this.value) + ")"; - }, hashCode:function() { - var result = 0; - result = result * 31 + Kotlin.hashCode(this.value) | 0; - return result; - }, equals_za3rmp$:function(other) { - return this === other || other !== null && (typeof other === "object" && (Object.getPrototypeOf(this) === Object.getPrototypeOf(other) && Kotlin.equals(this.value, other.value))); - }}), Regex:Kotlin.createClass(null, function(pattern, options) { - this.pattern = pattern; - this.options = _.kotlin.collections.toSet_q5oq31$(options); - var destination = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault(options, 10)); - var tmp$4; - tmp$4 = options.iterator(); - while (tmp$4.hasNext()) { - var item = tmp$4.next(); - destination.add_za3rmp$(item.value); - } - this.nativePattern_ug9tz2$ = new RegExp(pattern, _.kotlin.collections.joinToString_ld60a2$(destination, "") + "g"); - }, {matches_6bul2c$:function(input) { - _.kotlin.text.js.reset_bckwes$(this.nativePattern_ug9tz2$); - var match = this.nativePattern_ug9tz2$.exec(input.toString()); - return match != null && (match.index === 0 && this.nativePattern_ug9tz2$.lastIndex === input.length); - }, containsMatchIn_6bul2c$:function(input) { - _.kotlin.text.js.reset_bckwes$(this.nativePattern_ug9tz2$); - return this.nativePattern_ug9tz2$.test(input.toString()); - }, hasMatch_6bul2c$:function(input) { - return this.containsMatchIn_6bul2c$(input); - }, find_905azu$:function(input, startIndex) { - if (startIndex === void 0) { - startIndex = 0; - } - return _.kotlin.text.findNext(this.nativePattern_ug9tz2$, input.toString(), startIndex); - }, match_905azu$:function(input, startIndex) { - if (startIndex === void 0) { - startIndex = 0; - } - return this.find_905azu$(input, startIndex); - }, findAll_905azu$:function(input, startIndex) { - if (startIndex === void 0) { - startIndex = 0; - } - return _.kotlin.sequences.generateSequence_x7nywq$(_.kotlin.text.Regex.findAll_905azu$f(input, startIndex, this), _.kotlin.text.Regex.findAll_905azu$f_0); - }, matchAll_905azu$:function(input, startIndex) { - if (startIndex === void 0) { - startIndex = 0; - } - return this.findAll_905azu$(input, startIndex); - }, matchEntire_6bul2c$:function(input) { - if (_.kotlin.text.startsWith_cjsvxq$(this.pattern, "^") && _.kotlin.text.endsWith_cjsvxq$(this.pattern, "$")) { - return this.find_905azu$(input); - } else { - return(new _.kotlin.text.Regex("^" + _.kotlin.text.trimEnd_1hgcu2$(_.kotlin.text.trimStart_1hgcu2$(this.pattern, ["^"]), ["$"]) + "$", this.options)).find_905azu$(input); - } - }, replace_x2uqeu$:function(input, replacement) { - return input.toString().replace(this.nativePattern_ug9tz2$, replacement); - }, replace_ftxfdg$:Kotlin.defineInlineFunction("stdlib.kotlin.text.Regex.replace_ftxfdg$", function(input, transform) { - var match = this.find_905azu$(input); - if (match == null) { - return input.toString(); - } - var lastStart = 0; - var length = input.length; - var sb = new Kotlin.StringBuilder; - do { - var foundMatch = match != null ? match : Kotlin.throwNPE(); - sb.append(input, lastStart, foundMatch.range.start); - sb.append(transform(foundMatch)); - lastStart = foundMatch.range.endInclusive + 1; - match = foundMatch.next(); - } while (lastStart < length && match != null); - if (lastStart < length) { - sb.append(input, lastStart, length); - } - return sb.toString(); - }), replaceFirst_x2uqeu$:function(input, replacement) { - var $receiver = this.options; - var destination = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)); - var tmp$1; - tmp$1 = $receiver.iterator(); - while (tmp$1.hasNext()) { - var item = tmp$1.next(); - destination.add_za3rmp$(item.value); - } - var nonGlobalOptions = _.kotlin.collections.joinToString_ld60a2$(destination, ""); - return input.toString().replace(new RegExp(this.pattern, nonGlobalOptions), replacement); - }, split_905azu$:function(input, limit) { - var matches; - var tmp$0; - if (limit === void 0) { - limit = 0; - } - if (!(limit >= 0)) { - var message = "Limit must be non-negative, but was " + limit; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - var it = this.findAll_905azu$(input); - matches = limit === 0 ? it : _.kotlin.sequences.take_8xunab$(it, limit - 1); - var result = new Kotlin.ArrayList; - var lastStart = 0; - tmp$0 = matches.iterator(); - while (tmp$0.hasNext()) { - var match = tmp$0.next(); - result.add_za3rmp$(input.substring(lastStart, match.range.start).toString()); - lastStart = match.range.endInclusive + 1; - } - result.add_za3rmp$(input.substring(lastStart, input.length).toString()); - return result; - }, toString:function() { - return this.nativePattern_ug9tz2$.toString(); - }}, {findAll_905azu$f:function(closure$input, closure$startIndex, this$Regex) { - return function() { - return this$Regex.find_905azu$(closure$input, closure$startIndex); - }; - }, findAll_905azu$f_0:function(match) { - return match.next(); - }, Companion:Kotlin.createObject(null, function() { - _.kotlin.text.Regex.Companion.patternEscape_v9iwb0$ = new RegExp("[-\\\\^$*+?.()|[\\]{}]", "g"); - _.kotlin.text.Regex.Companion.replacementEscape_tq1d2u$ = new RegExp("\\$", "g"); - }, {fromLiteral_61zpoe$:function(literal) { - return _.kotlin.text.Regex_61zpoe$(_.kotlin.text.Regex.Companion.escape_61zpoe$(literal)); - }, escape_61zpoe$:function(literal) { - return literal.replace(_.kotlin.text.Regex.Companion.patternEscape_v9iwb0$, "\\$\x26"); - }, escapeReplacement_61zpoe$:function(literal) { - return literal.replace(_.kotlin.text.Regex.Companion.replacementEscape_tq1d2u$, "$$$$"); - }}), object_initializer$:function() { - _.kotlin.text.Regex.Companion; - }}), Regex_sb3q2$:function(pattern, option) { - return new _.kotlin.text.Regex(pattern, _.kotlin.collections.setOf_za3rmp$(option)); - }, Regex_61zpoe$:function(pattern) { - return new _.kotlin.text.Regex(pattern, _.kotlin.collections.emptySet()); - }, findNext$f:Kotlin.createClass(function() { - return[_.kotlin.text.MatchResult]; - }, function(closure$match, this$findNext_0, closure$input_0, closure$range) { - this.closure$match_0 = closure$match; - this.this$findNext_0 = this$findNext_0; - this.closure$input_0 = closure$input_0; - this.closure$range_0 = closure$range; - this.$range_e5n1wm$ = closure$range; - this.$groups_7q1wp7$ = new _.kotlin.text.findNext$f.groups$f(closure$match); - this.groupValues__5s7w6t$ = null; - }, {range:{get:function() { - return this.$range_e5n1wm$; - }}, value:{get:function() { - var tmp$0; - return(tmp$0 = this.closure$match_0[0]) != null ? tmp$0 : Kotlin.throwNPE(); - }}, groups:{get:function() { - return this.$groups_7q1wp7$; - }}, groupValues:{get:function() { - var tmp$0; - if (this.groupValues__5s7w6t$ == null) { - this.groupValues__5s7w6t$ = new _.kotlin.text.findNext$f.f$f(this.closure$match_0); - } - return(tmp$0 = this.groupValues__5s7w6t$) != null ? tmp$0 : Kotlin.throwNPE(); - }}, next:function() { - return _.kotlin.text.findNext(this.this$findNext_0, this.closure$input_0, this.closure$range_0.isEmpty() ? this.closure$range_0.start + 1 : this.closure$range_0.endInclusive + 1); - }}, {f$f:Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function $fun(closure$match_0) { - this.closure$match_0 = closure$match_0; - $fun.baseInitializer.call(this); - }, {size:{get:function() { - return this.closure$match_0.length; - }}, get_za3lpa$:function(index) { - var tmp$0; - return(tmp$0 = this.closure$match_0[index]) != null ? tmp$0 : ""; - }}, {}), groups$f:Kotlin.createClass(function() { - return[_.kotlin.text.MatchGroupCollection]; - }, function(closure$match_0) { - this.closure$match_0 = closure$match_0; - }, {size:{get:function() { - return this.closure$match_0.length; - }}, isEmpty:function() { - return this.size === 0; - }, contains_za3rmp$:function(element) { - var tmp$0; - tmp$0 = this.iterator(); - while (tmp$0.hasNext()) { - var element_0 = tmp$0.next(); - if (Kotlin.equals(element_0, element)) { - return true; - } - } - return false; - }, containsAll_wtfk93$:function(elements) { - var tmp$0; - tmp$0 = elements.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!this.contains_za3rmp$(element)) { - return false; - } - } - return true; - }, iterator:function() { - return _.kotlin.sequences.map_mzhnvn$(_.kotlin.collections.asSequence_q5oq31$(_.kotlin.collections.get_indices_mwto7b$(this)), _.kotlin.text.findNext$f.groups$f.iterator$f(this)).iterator(); - }, get_za3lpa$:function(index) { - var tmp$0; - return(tmp$0 = this.closure$match_0[index]) != null ? new _.kotlin.text.MatchGroup(tmp$0) : null; - }}, {iterator$f:function(this$) { - return function(it) { - return this$.get_za3lpa$(it); - }; - }})}), findNext:function($receiver, input, from) { - $receiver.lastIndex = from; - var match = $receiver.exec(input); - if (match == null) { - return null; - } - var range = new Kotlin.NumberRange(match.index, $receiver.lastIndex - 1); - return new _.kotlin.text.findNext$f(match, $receiver, input, range); - }, nativeIndexOf:function($receiver, ch, fromIndex) { - return $receiver.indexOf(ch.toString(), fromIndex); - }, nativeLastIndexOf:function($receiver, ch, fromIndex) { - return $receiver.lastIndexOf(ch.toString(), fromIndex); - }, startsWith_41xvrb$:function($receiver, prefix, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (!ignoreCase) { - return $receiver.startsWith(prefix, 0); - } else { - return _.kotlin.text.regionMatches_qb0ndp$($receiver, 0, prefix, 0, prefix.length, ignoreCase); - } - }, startsWith_rh6gah$:function($receiver, prefix, startIndex, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (!ignoreCase) { - return $receiver.startsWith(prefix, startIndex); - } else { - return _.kotlin.text.regionMatches_qb0ndp$($receiver, startIndex, prefix, 0, prefix.length, ignoreCase); - } - }, endsWith_41xvrb$:function($receiver, suffix, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (!ignoreCase) { - return $receiver.endsWith(suffix); - } else { - return _.kotlin.text.regionMatches_qb0ndp$($receiver, $receiver.length - suffix.length, suffix, 0, suffix.length, ignoreCase); - } - }, matches_94jgcu$:Kotlin.defineInlineFunction("stdlib.kotlin.text.matches_94jgcu$", function($receiver, regex) { - var result = $receiver.match(regex); - return result != null && result.length > 0; - }), isBlank_gw00vq$:function($receiver) { - var tmp$0 = $receiver.length === 0; - if (!tmp$0) { - var $receiver_0 = typeof $receiver === "string" ? $receiver : $receiver.toString(); - var regex = "^[\\s\\xA0]+$"; - var result = $receiver_0.match(regex); - tmp$0 = result != null && result.length > 0; - } - return tmp$0; - }, equals_41xvrb$:function($receiver, other, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver == null ? other == null : !ignoreCase ? Kotlin.equals($receiver, other) : other != null && Kotlin.equals($receiver.toLowerCase(), other.toLowerCase()); - }, regionMatches_qb0ndp$:function($receiver, thisOffset, other, otherOffset, length, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return _.kotlin.text.regionMatchesImpl($receiver, thisOffset, other, otherOffset, length, ignoreCase); - }, capitalize_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.capitalize_pdl1w0$", function($receiver) { - return $receiver.length > 0 ? $receiver.substring(0, 1).toUpperCase() + $receiver.substring(1) : $receiver; - }), decapitalize_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.decapitalize_pdl1w0$", function($receiver) { - return $receiver.length > 0 ? $receiver.substring(0, 1).toLowerCase() + $receiver.substring(1) : $receiver; - }), repeat_kljjvw$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Count 'n' must be non-negative, but was " + n + "."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - tmp$0 = ""; - } else { - if (n === 1) { - tmp$0 = $receiver.toString(); - } else { - var result = ""; - if (!($receiver.length === 0)) { - var s = $receiver.toString(); - var count = n; - while (true) { - if ((count & 1) === 1) { - result += s; - } - count = count >>> 1; - if (count === 0) { - break; - } - s += s; - } - } - return result; - } - } - return tmp$0; - }, replace_dn5w6f$:function($receiver, oldValue, newValue, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.replace(new RegExp(_.kotlin.text.Regex.Companion.escape_61zpoe$(oldValue), ignoreCase ? "gi" : "g"), _.kotlin.text.Regex.Companion.escapeReplacement_61zpoe$(newValue)); - }, replace_bt3k83$:function($receiver, oldChar, newChar, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.replace(new RegExp(_.kotlin.text.Regex.Companion.escape_61zpoe$(oldChar.toString()), ignoreCase ? "gi" : "g"), newChar.toString()); - }, replaceFirstLiteral_dn5w6f$:function($receiver, oldValue, newValue, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.replace(new RegExp(_.kotlin.text.Regex.Companion.escape_61zpoe$(oldValue), ignoreCase ? "i" : ""), _.kotlin.text.Regex.Companion.escapeReplacement_61zpoe$(newValue)); - }, replaceFirst_dn5w6f$:function($receiver, oldValue, newValue, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.replace(new RegExp(_.kotlin.text.Regex.Companion.escape_61zpoe$(oldValue), ignoreCase ? "i" : ""), _.kotlin.text.Regex.Companion.escapeReplacement_61zpoe$(newValue)); - }, replaceFirst_bt3k83$:function($receiver, oldChar, newChar, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.replace(new RegExp(_.kotlin.text.Regex.Companion.escape_61zpoe$(oldChar.toString()), ignoreCase ? "i" : ""), newChar.toString()); - }, elementAt_kljjvw$:Kotlin.defineInlineFunction("stdlib.kotlin.text.elementAt_kljjvw$", function($receiver, index) { - return $receiver.charAt(index); - }), elementAtOrElse_a9lqqp$:Kotlin.defineInlineFunction("stdlib.kotlin.text.elementAtOrElse_a9lqqp$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.text.get_lastIndex_gw00vq$($receiver) ? $receiver.charAt(index) : defaultValue(index); - }), elementAtOrNull_kljjvw$:Kotlin.defineInlineFunction("stdlib.kotlin.text.elementAtOrNull_kljjvw$", function($receiver, index) { - return _.kotlin.text.getOrNull_kljjvw$($receiver, index); - }), find_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.find_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.findLast_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver.charAt(index); - if (predicate(element)) { - return element; - } - } - return null; - }), first_gw00vq$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Char sequence is empty."); - } - return $receiver.charAt(0); - }, first_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.first_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Char sequence contains no character matching the predicate."); - }), firstOrNull_gw00vq$:function($receiver) { - return $receiver.length === 0 ? null : $receiver.charAt(0); - }, firstOrNull_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.firstOrNull_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), getOrElse_a9lqqp$:Kotlin.defineInlineFunction("stdlib.kotlin.text.getOrElse_a9lqqp$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.text.get_lastIndex_gw00vq$($receiver) ? $receiver.charAt(index) : defaultValue(index); - }), getOrNull_kljjvw$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.text.get_lastIndex_gw00vq$($receiver) ? $receiver.charAt(index) : null; - }, indexOfFirst_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.indexOfFirst_gwcya$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver.charAt(index))) { - return index; - } - } - return-1; - }), indexOfLast_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.indexOfLast_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver.charAt(index))) { - return index; - } - } - return-1; - }), last_gw00vq$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Char sequence is empty."); - } - return $receiver.charAt(_.kotlin.text.get_lastIndex_gw00vq$($receiver)); - }, last_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.last_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver.charAt(index); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Char sequence contains no character matching the predicate."); - }), lastOrNull_gw00vq$:function($receiver) { - return $receiver.length === 0 ? null : $receiver.charAt($receiver.length - 1); - }, lastOrNull_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.lastOrNull_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver.charAt(index); - if (predicate(element)) { - return element; - } - } - return null; - }), single_gw00vq$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Char sequence is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver.charAt(0); - } else { - throw new Kotlin.IllegalArgumentException("Char sequence has more than one element."); - } - } - return tmp$1; - }, single_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.single_gwcya$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Char sequence contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Char sequence contains no character matching the predicate."); - } - return Kotlin.isChar(tmp$1 = single) ? tmp$1 : Kotlin.throwCCE(); - }), singleOrNull_gw00vq$:function($receiver) { - return $receiver.length === 1 ? $receiver.charAt(0) : null; - }, singleOrNull_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.singleOrNull_gwcya$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), drop_kljjvw$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return $receiver.substring(_.kotlin.ranges.coerceAtMost_rksjo2$(n, $receiver.length), $receiver.length); - }, drop_n7iutu$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return $receiver.substring(_.kotlin.ranges.coerceAtMost_rksjo2$(n, $receiver.length)); - }, dropLast_kljjvw$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.text.take_kljjvw$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_n7iutu$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.text.take_n7iutu$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLastWhile_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.dropLastWhile_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(0, index + 1); - } - } - return ""; - }), dropLastWhile_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.dropLastWhile_ggikb8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(0, index + 1); - } - } - return ""; - }), dropWhile_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.dropWhile_gwcya$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(index, $receiver.length); - } - } - return ""; - }), dropWhile_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.dropWhile_ggikb8$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(index); - } - } - return ""; - }), filter_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filter_gwcya$", function($receiver, predicate) { - var destination = new Kotlin.StringBuilder; - var tmp$0; - tmp$0 = $receiver.length - 1; - for (var index = 0;index <= tmp$0;index++) { - var element = $receiver.charAt(index); - if (predicate(element)) { - destination.append(element); - } - } - return destination; - }), filter_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filter_ggikb8$", function($receiver, predicate) { - var destination = new Kotlin.StringBuilder; - var tmp$0; - tmp$0 = $receiver.length - 1; - for (var index = 0;index <= tmp$0;index++) { - var element = $receiver.charAt(index); - if (predicate(element)) { - destination.append(element); - } - } - return destination.toString(); - }), filterIndexed_ig59fr$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterIndexed_ig59fr$", function($receiver, predicate) { - var destination = new Kotlin.StringBuilder; - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.append(item); - } - } - return destination; - }), filterIndexed_kq57hd$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterIndexed_kq57hd$", function($receiver, predicate) { - var destination = new Kotlin.StringBuilder; - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.append(item); - } - } - return destination.toString(); - }), filterIndexedTo_ulxqbb$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterIndexedTo_ulxqbb$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.append(item); - } - } - return destination; - }), filterNot_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterNot_gwcya$", function($receiver, predicate) { - var destination = new Kotlin.StringBuilder; - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.append(element); - } - } - return destination; - }), filterNot_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterNot_ggikb8$", function($receiver, predicate) { - var destination = new Kotlin.StringBuilder; - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.append(element); - } - } - return destination.toString(); - }), filterNotTo_ppzoqm$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterNotTo_ppzoqm$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.append(element); - } - } - return destination; - }), filterTo_ppzoqm$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterTo_ppzoqm$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = $receiver.length - 1; - for (var index = 0;index <= tmp$0;index++) { - var element = $receiver.charAt(index); - if (predicate(element)) { - destination.append(element); - } - } - return destination; - }), slice_2g2kgt$:function($receiver, indices) { - if (indices.isEmpty()) { - return ""; - } - return _.kotlin.text.subSequence_2g2kgt$($receiver, indices); - }, slice_590b93$:function($receiver, indices) { - if (indices.isEmpty()) { - return ""; - } - return _.kotlin.text.substring_590b93$($receiver, indices); - }, slice_8iyt66$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return ""; - } - var result = new Kotlin.StringBuilder; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var i = tmp$0.next(); - result.append($receiver.charAt(i)); - } - return result; - }, slice_fxv5mg$:Kotlin.defineInlineFunction("stdlib.kotlin.text.slice_fxv5mg$", function($receiver, indices) { - var tmp$0; - return _.kotlin.text.slice_8iyt66$($receiver, indices).toString(); - }), take_kljjvw$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return $receiver.substring(0, _.kotlin.ranges.coerceAtMost_rksjo2$(n, $receiver.length)); - }, take_n7iutu$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return $receiver.substring(0, _.kotlin.ranges.coerceAtMost_rksjo2$(n, $receiver.length)); - }, takeLast_kljjvw$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - var length = $receiver.length; - return $receiver.substring(length - _.kotlin.ranges.coerceAtMost_rksjo2$(n, length), length); - }, takeLast_n7iutu$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - var length = $receiver.length; - return $receiver.substring(length - _.kotlin.ranges.coerceAtMost_rksjo2$(n, length)); - }, takeLastWhile_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.takeLastWhile_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.text.get_lastIndex_gw00vq$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(index + 1, $receiver.length); - } - } - return $receiver.substring(0, $receiver.length); - }), takeLastWhile_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.takeLastWhile_ggikb8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.text.get_lastIndex_gw00vq$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(index + 1); - } - } - return $receiver; - }), takeWhile_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.takeWhile_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.length - 1; - for (var index = 0;index <= tmp$0;index++) { - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(0, index); - } - } - return $receiver.substring(0, $receiver.length); - }), takeWhile_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.takeWhile_ggikb8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.length - 1; - for (var index = 0;index <= tmp$0;index++) { - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(0, index); - } - } - return $receiver; - }), reversed_gw00vq$:function($receiver) { - return(new Kotlin.StringBuilder($receiver.toString())).reverse(); - }, reversed_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.reversed_pdl1w0$", function($receiver) { - var tmp$0; - return _.kotlin.text.reversed_gw00vq$($receiver).toString(); - }), associate_1p4vo8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.associate_1p4vo8$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateBy_g3n5bm$:Kotlin.defineInlineFunction("stdlib.kotlin.text.associateBy_g3n5bm$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_27fiyi$:Kotlin.defineInlineFunction("stdlib.kotlin.text.associateBy_27fiyi$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_cggu5g$:Kotlin.defineInlineFunction("stdlib.kotlin.text.associateByTo_cggu5g$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_bo8xay$:Kotlin.defineInlineFunction("stdlib.kotlin.text.associateByTo_bo8xay$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateTo_vkk1fc$:Kotlin.defineInlineFunction("stdlib.kotlin.text.associateTo_vkk1fc$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), toCollection_7095o1$:function($receiver, destination) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toHashSet_gw00vq$:function($receiver) { - return _.kotlin.text.toCollection_7095o1$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toList_gw00vq$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver.charAt(0)); - } else { - tmp$1 = _.kotlin.text.toMutableList_gw00vq$($receiver); - } - } - return tmp$1; - }, toMutableList_gw00vq$:function($receiver) { - return _.kotlin.text.toCollection_7095o1$($receiver, new Kotlin.ArrayList($receiver.length)); - }, toSet_gw00vq$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver.charAt(0)); - } else { - tmp$1 = _.kotlin.text.toCollection_7095o1$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, flatMap_1mpcl3$:Kotlin.defineInlineFunction("stdlib.kotlin.text.flatMap_1mpcl3$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_qq0qxe$:Kotlin.defineInlineFunction("stdlib.kotlin.text.flatMapTo_qq0qxe$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), groupBy_g3n5bm$:Kotlin.defineInlineFunction("stdlib.kotlin.text.groupBy_g3n5bm$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_27fiyi$:Kotlin.defineInlineFunction("stdlib.kotlin.text.groupBy_27fiyi$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_j5rwb5$:Kotlin.defineInlineFunction("stdlib.kotlin.text.groupByTo_j5rwb5$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_eemzmj$:Kotlin.defineInlineFunction("stdlib.kotlin.text.groupByTo_eemzmj$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), map_g3n5bm$:Kotlin.defineInlineFunction("stdlib.kotlin.text.map_g3n5bm$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapIndexed_psxq2r$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapIndexed_psxq2r$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedNotNull_psxq2r$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapIndexedNotNull_psxq2r$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapIndexedNotNullTo_rct1as$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapIndexedNotNullTo_rct1as$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapIndexedTo_rct1as$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapIndexedTo_rct1as$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapNotNull_g3n5bm$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapNotNull_g3n5bm$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapNotNullTo_4sukax$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapNotNullTo_4sukax$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapTo_4sukax$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapTo_4sukax$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), withIndex_gw00vq$f:function(this$withIndex) { - return function() { - return _.kotlin.text.iterator_gw00vq$(this$withIndex); - }; - }, withIndex_gw00vq$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.text.withIndex_gw00vq$f($receiver)); - }, all_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.all_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), any_gw00vq$:function($receiver) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.any_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), count_gw00vq$:Kotlin.defineInlineFunction("stdlib.kotlin.text.count_gw00vq$", function($receiver) { - return $receiver.length; - }), count_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.count_gwcya$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), fold_u4nbyf$:Kotlin.defineInlineFunction("stdlib.kotlin.text.fold_u4nbyf$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), foldIndexed_hj7gsc$:Kotlin.defineInlineFunction("stdlib.kotlin.text.foldIndexed_hj7gsc$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldRight_dr5uf3$:Kotlin.defineInlineFunction("stdlib.kotlin.text.foldRight_dr5uf3$", function($receiver, initial, operation) { - var index = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver.charAt(index--), accumulator); - } - return accumulator; - }), foldRightIndexed_qclpl6$:Kotlin.defineInlineFunction("stdlib.kotlin.text.foldRightIndexed_qclpl6$", function($receiver, initial, operation) { - var index = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver.charAt(index), accumulator); - --index; - } - return accumulator; - }), forEach_1m5ltu$:Kotlin.defineInlineFunction("stdlib.kotlin.text.forEach_1m5ltu$", function($receiver, action) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEachIndexed_ivsfzd$:Kotlin.defineInlineFunction("stdlib.kotlin.text.forEachIndexed_ivsfzd$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), max_gw00vq$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver.charAt(0); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver.charAt(i); - if (max < e) { - max = e; - } - } - return max; - }, maxBy_eowu5k$:Kotlin.defineInlineFunction("stdlib.kotlin.text.maxBy_eowu5k$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver.charAt(0); - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver.charAt(i); - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxWith_ho1wg9$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver.charAt(0); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver.charAt(i); - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, min_gw00vq$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver.charAt(0); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver.charAt(i); - if (min > e) { - min = e; - } - } - return min; - }, minBy_eowu5k$:Kotlin.defineInlineFunction("stdlib.kotlin.text.minBy_eowu5k$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver.charAt(0); - var minValue = selector(minElem); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver.charAt(i); - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minWith_ho1wg9$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver.charAt(0); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver.charAt(i); - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, none_gw00vq$:function($receiver) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.none_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), reduce_jbdc00$:Kotlin.defineInlineFunction("stdlib.kotlin.text.reduce_jbdc00$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty char sequence can't be reduced."); - } - var accumulator = $receiver.charAt(0); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver.charAt(index)); - } - return accumulator; - }), reduceIndexed_dv672j$:Kotlin.defineInlineFunction("stdlib.kotlin.text.reduceIndexed_dv672j$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty char sequence can't be reduced."); - } - var accumulator = $receiver.charAt(0); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver.charAt(index)); - } - return accumulator; - }), reduceRight_jbdc00$:Kotlin.defineInlineFunction("stdlib.kotlin.text.reduceRight_jbdc00$", function($receiver, operation) { - var index = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty char sequence can't be reduced."); - } - var accumulator = $receiver.charAt(index--); - while (index >= 0) { - accumulator = operation($receiver.charAt(index--), accumulator); - } - return accumulator; - }), reduceRightIndexed_dv672j$:Kotlin.defineInlineFunction("stdlib.kotlin.text.reduceRightIndexed_dv672j$", function($receiver, operation) { - var index = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty char sequence can't be reduced."); - } - var accumulator = $receiver.charAt(index--); - while (index >= 0) { - accumulator = operation(index, $receiver.charAt(index), accumulator); - --index; - } - return accumulator; - }), sumBy_g3i1jp$:Kotlin.defineInlineFunction("stdlib.kotlin.text.sumBy_g3i1jp$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_pj8hgv$:Kotlin.defineInlineFunction("stdlib.kotlin.text.sumByDouble_pj8hgv$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), partition_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.partition_gwcya$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.StringBuilder; - var second = new Kotlin.StringBuilder; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.append(element); - } else { - second.append(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.partition_ggikb8$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.StringBuilder; - var second = new Kotlin.StringBuilder; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.append(element); - } else { - second.append(element); - } - } - return new _.kotlin.Pair(first.toString(), second.toString()); - }), zip_4ewbza$:function($receiver, other) { - var tmp$0; - var length = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(length); - tmp$0 = length - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver.charAt(i), other.charAt(i))); - } - return list; - }, zip_3n5ypu$:Kotlin.defineInlineFunction("stdlib.kotlin.text.zip_3n5ypu$", function($receiver, other, transform) { - var tmp$0; - var length = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(length); - tmp$0 = length - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver.charAt(i), other.charAt(i))); - } - return list; - }), asIterable_gw00vq$f:function(this$asIterable) { - return function() { - return _.kotlin.text.iterator_gw00vq$(this$asIterable); - }; - }, asIterable_gw00vq$:function($receiver) { - var tmp$0 = typeof $receiver === "string"; - if (tmp$0) { - tmp$0 = $receiver.length === 0; - } - if (tmp$0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.text.asIterable_gw00vq$f($receiver)); - }, asSequence_gw00vq$f:function(this$asSequence) { - return function() { - return _.kotlin.text.iterator_gw00vq$(this$asSequence); - }; - }, asSequence_gw00vq$:function($receiver) { - var tmp$0 = typeof $receiver === "string"; - if (tmp$0) { - tmp$0 = $receiver.length === 0; - } - if (tmp$0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.text.asSequence_gw00vq$f($receiver)); - }, plus_68uai5$:Kotlin.defineInlineFunction("stdlib.kotlin.text.plus_68uai5$", function($receiver, other) { - return $receiver.toString() + other; - }), equals_bapbyp$:function($receiver, other, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if ($receiver === other) { - return true; - } - if (!ignoreCase) { - return false; - } - if ($receiver.toUpperCase() === other.toUpperCase()) { - return true; - } - if ($receiver.toLowerCase() === other.toLowerCase()) { - return true; - } - return false; - }, isSurrogate_myv2d1$:function($receiver) { - return(new Kotlin.CharRange(Kotlin.modules["stdlib"].kotlin.js.internal.CharCompanionObject.MIN_SURROGATE, Kotlin.modules["stdlib"].kotlin.js.internal.CharCompanionObject.MAX_SURROGATE)).contains_htax2k$($receiver); - }, trimMargin_94jgcu$:function($receiver, marginPrefix) { - if (marginPrefix === void 0) { - marginPrefix = "|"; - } - return _.kotlin.text.replaceIndentByMargin_ex0kps$($receiver, "", marginPrefix); - }, replaceIndentByMargin_ex0kps$:function($receiver, newIndent, marginPrefix) { - if (newIndent === void 0) { - newIndent = ""; - } - if (marginPrefix === void 0) { - marginPrefix = "|"; - } - if (!!_.kotlin.text.isBlank_gw00vq$(marginPrefix)) { - var message = "marginPrefix must be non-blank string."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - var lines = _.kotlin.text.lines_gw00vq$($receiver); - lines.size; - var indentAddFunction = _.kotlin.text.getIndentFunction(newIndent); - var lastIndex = _.kotlin.collections.get_lastIndex_a7ptmv$(lines); - var destination = new Kotlin.ArrayList; - var tmp$3; - var index = 0; - tmp$3 = lines.iterator(); - while (tmp$3.hasNext()) { - var item = tmp$3.next(); - var tmp$2; - var index_0 = index++; - var tmp$5, tmp$4; - var tmp$1; - if ((index_0 === 0 || index_0 === lastIndex) && _.kotlin.text.isBlank_gw00vq$(item)) { - tmp$1 = null; - } else { - var indentCutFunction$result; - var firstNonWhitespaceIndex; - indexOfFirst_gwcya$break: { - var tmp$9, tmp$6, tmp$7, tmp$8; - tmp$9 = _.kotlin.text.get_indices_gw00vq$(item), tmp$6 = tmp$9.first, tmp$7 = tmp$9.last, tmp$8 = tmp$9.step; - for (var index_1 = tmp$6;index_1 <= tmp$7;index_1 += tmp$8) { - if (!_.kotlin.text.isWhitespace_myv2d1$(item.charAt(index_1))) { - firstNonWhitespaceIndex = index_1; - break indexOfFirst_gwcya$break; - } - } - firstNonWhitespaceIndex = -1; - } - if (firstNonWhitespaceIndex === -1) { - indentCutFunction$result = null; - } else { - if (_.kotlin.text.startsWith_rh6gah$(item, marginPrefix, firstNonWhitespaceIndex)) { - indentCutFunction$result = item.substring(firstNonWhitespaceIndex + marginPrefix.length); - } else { - indentCutFunction$result = null; - } - } - tmp$1 = (tmp$4 = (tmp$5 = indentCutFunction$result) != null ? indentAddFunction(tmp$5) : null) != null ? tmp$4 : item; - } - (tmp$2 = tmp$1) != null ? destination.add_za3rmp$(tmp$2) : null; - } - return _.kotlin.collections.joinTo_euycuk$(destination, new Kotlin.StringBuilder, "\n").toString(); - }, trimIndent_pdl1w0$:function($receiver) { - return _.kotlin.text.replaceIndent_94jgcu$($receiver, ""); - }, replaceIndent_94jgcu$:function($receiver, newIndent) { - var tmp$0; - if (newIndent === void 0) { - newIndent = ""; - } - var lines = _.kotlin.text.lines_gw00vq$($receiver); - var destination = new Kotlin.ArrayList; - var tmp$3; - tmp$3 = lines.iterator(); - while (tmp$3.hasNext()) { - var element = tmp$3.next(); - if (!_.kotlin.text.isBlank_gw00vq$(element)) { - destination.add_za3rmp$(element); - } - } - var destination_0 = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault(destination, 10)); - var tmp$4; - tmp$4 = destination.iterator(); - while (tmp$4.hasNext()) { - var item = tmp$4.next(); - destination_0.add_za3rmp$(_.kotlin.text.indentWidth(item)); - } - var minCommonIndent = (tmp$0 = _.kotlin.collections.min_349qs3$(destination_0)) != null ? tmp$0 : 0; - lines.size; - var indentAddFunction = _.kotlin.text.getIndentFunction(newIndent); - var lastIndex = _.kotlin.collections.get_lastIndex_a7ptmv$(lines); - var destination_1 = new Kotlin.ArrayList; - var tmp$8; - var index = 0; - tmp$8 = lines.iterator(); - while (tmp$8.hasNext()) { - var item_0 = tmp$8.next(); - var tmp$7; - var index_0 = index++; - var tmp$6, tmp$9; - (tmp$7 = (index_0 === 0 || index_0 === lastIndex) && _.kotlin.text.isBlank_gw00vq$(item_0) ? null : (tmp$9 = (tmp$6 = _.kotlin.text.drop_n7iutu$(item_0, minCommonIndent)) != null ? indentAddFunction(tmp$6) : null) != null ? tmp$9 : item_0) != null ? destination_1.add_za3rmp$(tmp$7) : null; - } - return _.kotlin.collections.joinTo_euycuk$(destination_1, new Kotlin.StringBuilder, "\n").toString(); - }, prependIndent_94jgcu$f:function(closure$indent) { - return function(it) { - if (_.kotlin.text.isBlank_gw00vq$(it)) { - if (it.length < closure$indent.length) { - return closure$indent; - } else { - return it; - } - } else { - return closure$indent + it; - } - }; - }, prependIndent_94jgcu$:function($receiver, indent) { - if (indent === void 0) { - indent = " "; - } - return _.kotlin.sequences.joinToString_mbzd5w$(_.kotlin.sequences.map_mzhnvn$(_.kotlin.text.lineSequence_gw00vq$($receiver), _.kotlin.text.prependIndent_94jgcu$f(indent)), "\n"); - }, indentWidth:function($receiver) { - var it_0; - indexOfFirst_gwcya$break: { - var tmp$4, tmp$1, tmp$2, tmp$3; - tmp$4 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$4.first, tmp$2 = tmp$4.last, tmp$3 = tmp$4.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!_.kotlin.text.isWhitespace_myv2d1$($receiver.charAt(index))) { - it_0 = index; - break indexOfFirst_gwcya$break; - } - } - it_0 = -1; - } - return it_0 === -1 ? $receiver.length : it_0; - }, getIndentFunction$f:function(line) { - return line; - }, getIndentFunction$f_0:function(closure$indent) { - return function(line) { - return closure$indent + line; - }; - }, getIndentFunction:function(indent) { - if (indent.length === 0) { - return _.kotlin.text.getIndentFunction$f; - } else { - return _.kotlin.text.getIndentFunction$f_0(indent); - } - }, reindent:function($receiver, resultSizeEstimate, indentAddFunction, indentCutFunction) { - var lastIndex = _.kotlin.collections.get_lastIndex_a7ptmv$($receiver); - var destination = new Kotlin.ArrayList; - var tmp$3; - var index = 0; - tmp$3 = $receiver.iterator(); - while (tmp$3.hasNext()) { - var item = tmp$3.next(); - var tmp$2; - var index_0 = index++; - var tmp$5, tmp$4; - (tmp$2 = (index_0 === 0 || index_0 === lastIndex) && _.kotlin.text.isBlank_gw00vq$(item) ? null : (tmp$4 = (tmp$5 = indentCutFunction(item)) != null ? indentAddFunction(tmp$5) : null) != null ? tmp$4 : item) != null ? destination.add_za3rmp$(tmp$2) : null; - } - return _.kotlin.collections.joinTo_euycuk$(destination, new Kotlin.StringBuilder, "\n").toString(); - }, buildString_bb10bd$:Kotlin.defineInlineFunction("stdlib.kotlin.text.buildString_bb10bd$", function(builderAction) { - var $receiver = new Kotlin.StringBuilder; - builderAction.call($receiver); - return $receiver.toString(); - }), append_rjuq1o$:function($receiver, value) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = value, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - $receiver.append(item); - } - return $receiver; - }, append_7lvk3c$:function($receiver, value) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = value, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - $receiver.append(item); - } - return $receiver; - }, append_j3ibnd$:function($receiver, value) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = value, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - $receiver.append(item); - } - return $receiver; - }, trim_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trim_gwcya$", function($receiver, predicate) { - var startIndex = 0; - var endIndex = $receiver.length - 1; - var startFound = false; - while (startIndex <= endIndex) { - var index = !startFound ? startIndex : endIndex; - var match = predicate($receiver.charAt(index)); - if (!startFound) { - if (!match) { - startFound = true; - } else { - startIndex += 1; - } - } else { - if (!match) { - break; - } else { - endIndex -= 1; - } - } - } - return $receiver.substring(startIndex, endIndex + 1); - }), trim_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trim_ggikb8$", function($receiver, predicate) { - var tmp$0; - var startIndex = 0; - var endIndex = $receiver.length - 1; - var startFound = false; - while (startIndex <= endIndex) { - var index = !startFound ? startIndex : endIndex; - var match = predicate($receiver.charAt(index)); - if (!startFound) { - if (!match) { - startFound = true; - } else { - startIndex += 1; - } - } else { - if (!match) { - break; - } else { - endIndex -= 1; - } - } - } - return $receiver.substring(startIndex, endIndex + 1).toString(); - }), trimStart_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trimStart_gwcya$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(index, $receiver.length); - } - } - return ""; - }), trimStart_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trimStart_ggikb8$", function($receiver, predicate) { - var tmp$0; - var trimStart_gwcya$result; - trimStart_gwcya$break: { - var tmp$4, tmp$1, tmp$2, tmp$3; - tmp$4 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$4.first, tmp$2 = tmp$4.last, tmp$3 = tmp$4.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!predicate($receiver.charAt(index))) { - trimStart_gwcya$result = $receiver.substring(index, $receiver.length); - break trimStart_gwcya$break; - } - } - trimStart_gwcya$result = ""; - } - return trimStart_gwcya$result.toString(); - }), trimEnd_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trimEnd_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(0, index + 1).toString(); - } - } - return ""; - }), trimEnd_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trimEnd_ggikb8$", function($receiver, predicate) { - var tmp$0; - var trimEnd_gwcya$result; - trimEnd_gwcya$break: { - var tmp$1; - tmp$1 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$1.hasNext()) { - var index = tmp$1.next(); - if (!predicate($receiver.charAt(index))) { - trimEnd_gwcya$result = $receiver.substring(0, index + 1).toString(); - break trimEnd_gwcya$break; - } - } - trimEnd_gwcya$result = ""; - } - return trimEnd_gwcya$result.toString(); - }), trim_g0p4tc$:function($receiver, chars) { - var startIndex = 0; - var endIndex = $receiver.length - 1; - var startFound = false; - while (startIndex <= endIndex) { - var index = !startFound ? startIndex : endIndex; - var match = _.kotlin.collections.contains_q79yhh$(chars, $receiver.charAt(index)); - if (!startFound) { - if (!match) { - startFound = true; - } else { - startIndex += 1; - } - } else { - if (!match) { - break; - } else { - endIndex -= 1; - } - } - } - return $receiver.substring(startIndex, endIndex + 1); - }, trim_1hgcu2$:function($receiver, chars) { - var tmp$0; - var startIndex = 0; - var endIndex = $receiver.length - 1; - var startFound = false; - while (startIndex <= endIndex) { - var index = !startFound ? startIndex : endIndex; - var match = _.kotlin.collections.contains_q79yhh$(chars, $receiver.charAt(index)); - if (!startFound) { - if (!match) { - startFound = true; - } else { - startIndex += 1; - } - } else { - if (!match) { - break; - } else { - endIndex -= 1; - } - } - } - return $receiver.substring(startIndex, endIndex + 1).toString(); - }, trimStart_g0p4tc$:function($receiver, chars) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!_.kotlin.collections.contains_q79yhh$(chars, $receiver.charAt(index))) { - return $receiver.substring(index, $receiver.length); - } - } - return ""; - }, trimStart_1hgcu2$:function($receiver, chars) { - var tmp$0; - var trimStart_gwcya$result; - trimStart_gwcya$break: { - var tmp$4, tmp$1, tmp$2, tmp$3; - tmp$4 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$4.first, tmp$2 = tmp$4.last, tmp$3 = tmp$4.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!_.kotlin.collections.contains_q79yhh$(chars, $receiver.charAt(index))) { - trimStart_gwcya$result = $receiver.substring(index, $receiver.length); - break trimStart_gwcya$break; - } - } - trimStart_gwcya$result = ""; - } - return trimStart_gwcya$result.toString(); - }, trimEnd_g0p4tc$:function($receiver, chars) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!_.kotlin.collections.contains_q79yhh$(chars, $receiver.charAt(index))) { - return $receiver.substring(0, index + 1).toString(); - } - } - return ""; - }, trimEnd_1hgcu2$:function($receiver, chars) { - var tmp$0; - var trimEnd_gwcya$result; - trimEnd_gwcya$break: { - var tmp$1; - tmp$1 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$1.hasNext()) { - var index = tmp$1.next(); - if (!_.kotlin.collections.contains_q79yhh$(chars, $receiver.charAt(index))) { - trimEnd_gwcya$result = $receiver.substring(0, index + 1).toString(); - break trimEnd_gwcya$break; - } - } - trimEnd_gwcya$result = ""; - } - return trimEnd_gwcya$result.toString(); - }, trim_gw00vq$:function($receiver) { - var startIndex = 0; - var endIndex = $receiver.length - 1; - var startFound = false; - while (startIndex <= endIndex) { - var index = !startFound ? startIndex : endIndex; - var match = _.kotlin.text.isWhitespace_myv2d1$($receiver.charAt(index)); - if (!startFound) { - if (!match) { - startFound = true; - } else { - startIndex += 1; - } - } else { - if (!match) { - break; - } else { - endIndex -= 1; - } - } - } - return $receiver.substring(startIndex, endIndex + 1); - }, trim_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trim_pdl1w0$", function($receiver) { - var tmp$0; - return _.kotlin.text.trim_gw00vq$($receiver).toString(); - }), trimStart_gw00vq$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!_.kotlin.text.isWhitespace_myv2d1$($receiver.charAt(index))) { - return $receiver.substring(index, $receiver.length); - } - } - return ""; - }, trimStart_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trimStart_pdl1w0$", function($receiver) { - var tmp$0; - return _.kotlin.text.trimStart_gw00vq$($receiver).toString(); - }), trimEnd_gw00vq$:function($receiver) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!_.kotlin.text.isWhitespace_myv2d1$($receiver.charAt(index))) { - return $receiver.substring(0, index + 1).toString(); - } - } - return ""; - }, trimEnd_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trimEnd_pdl1w0$", function($receiver) { - var tmp$0; - return _.kotlin.text.trimEnd_gw00vq$($receiver).toString(); - }), padStart_dz660z$:function($receiver, length, padChar) { - var tmp$0; - if (padChar === void 0) { - padChar = " "; - } - if (length < 0) { - throw new Kotlin.IllegalArgumentException("Desired length " + length + " is less than zero."); - } - if (length <= $receiver.length) { - return $receiver.substring(0, $receiver.length); - } - var sb = new Kotlin.StringBuilder; - tmp$0 = length - $receiver.length; - for (var i = 1;i <= tmp$0;i++) { - sb.append(padChar); - } - sb.append($receiver); - return sb; - }, padStart_b68f8p$:function($receiver, length, padChar) { - var tmp$0; - if (padChar === void 0) { - padChar = " "; - } - return _.kotlin.text.padStart_dz660z$($receiver, length, padChar).toString(); - }, padEnd_dz660z$:function($receiver, length, padChar) { - var tmp$0; - if (padChar === void 0) { - padChar = " "; - } - if (length < 0) { - throw new Kotlin.IllegalArgumentException("Desired length " + length + " is less than zero."); - } - if (length <= $receiver.length) { - return $receiver.substring(0, $receiver.length); - } - var sb = new Kotlin.StringBuilder; - sb.append($receiver); - tmp$0 = length - $receiver.length; - for (var i = 1;i <= tmp$0;i++) { - sb.append(padChar); - } - return sb; - }, padEnd_b68f8p$:function($receiver, length, padChar) { - var tmp$0; - if (padChar === void 0) { - padChar = " "; - } - return _.kotlin.text.padEnd_dz660z$($receiver, length, padChar).toString(); - }, isNullOrEmpty_gw00vq$:Kotlin.defineInlineFunction("stdlib.kotlin.text.isNullOrEmpty_gw00vq$", function($receiver) { - return $receiver == null || $receiver.length === 0; - }), isEmpty_gw00vq$:Kotlin.defineInlineFunction("stdlib.kotlin.text.isEmpty_gw00vq$", function($receiver) { - return $receiver.length === 0; - }), isNotEmpty_gw00vq$:Kotlin.defineInlineFunction("stdlib.kotlin.text.isNotEmpty_gw00vq$", function($receiver) { - return $receiver.length > 0; - }), isNotBlank_gw00vq$:Kotlin.defineInlineFunction("stdlib.kotlin.text.isNotBlank_gw00vq$", function($receiver) { - return!_.kotlin.text.isBlank_gw00vq$($receiver); - }), isNullOrBlank_gw00vq$:Kotlin.defineInlineFunction("stdlib.kotlin.text.isNullOrBlank_gw00vq$", function($receiver) { - return $receiver == null || _.kotlin.text.isBlank_gw00vq$($receiver); - }), iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.CharIterator]; - }, function $fun(this$iterator_0) { - this.this$iterator_0 = this$iterator_0; - $fun.baseInitializer.call(this); - this.index_1xj8pz$ = 0; - }, {nextChar:function() { - return this.this$iterator_0.charAt(this.index_1xj8pz$++); - }, hasNext:function() { - return this.index_1xj8pz$ < this.this$iterator_0.length; - }}, {}), iterator_gw00vq$:function($receiver) { - return new _.kotlin.text.iterator$f($receiver); - }, orEmpty_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.orEmpty_pdl1w0$", function($receiver) { - return $receiver != null ? $receiver : ""; - }), get_indices_gw00vq$:{value:function($receiver) { - return new Kotlin.NumberRange(0, $receiver.length - 1); - }}, get_lastIndex_gw00vq$:{value:function($receiver) { - return $receiver.length - 1; - }}, hasSurrogatePairAt_kljjvw$:function($receiver, index) { - return(new Kotlin.NumberRange(0, $receiver.length - 2)).contains_htax2k$(index) && (_.kotlin.text.isHighSurrogate_myv2d1$($receiver.charAt(index)) && _.kotlin.text.isLowSurrogate_myv2d1$($receiver.charAt(index + 1))); - }, substring_590b93$:function($receiver, range) { - return $receiver.substring(range.start, range.endInclusive + 1); - }, subSequence_2g2kgt$:function($receiver, range) { - return $receiver.substring(range.start, range.endInclusive + 1); - }, subSequence_78fvzw$:Kotlin.defineInlineFunction("stdlib.kotlin.text.subSequence_78fvzw$", function($receiver, start, end) { - return $receiver.substring(start, end); - }), substring_7bp3tu$:Kotlin.defineInlineFunction("stdlib.kotlin.text.substring_7bp3tu$", function($receiver, startIndex, endIndex) { - if (endIndex === void 0) { - endIndex = $receiver.length; - } - return $receiver.substring(startIndex, endIndex).toString(); - }), substring_2g2kgt$:function($receiver, range) { - return $receiver.substring(range.start, range.endInclusive + 1).toString(); - }, substringBefore_7uhrl1$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_ilfvta$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(0, index); - }, substringBefore_ex0kps$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_30chhv$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(0, index); - }, substringAfter_7uhrl1$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_ilfvta$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(index + 1, $receiver.length); - }, substringAfter_ex0kps$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_30chhv$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(index + delimiter.length, $receiver.length); - }, substringBeforeLast_7uhrl1$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_ilfvta$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(0, index); - }, substringBeforeLast_ex0kps$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_30chhv$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(0, index); - }, substringAfterLast_7uhrl1$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_ilfvta$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(index + 1, $receiver.length); - }, substringAfterLast_ex0kps$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_30chhv$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(index + delimiter.length, $receiver.length); - }, replaceRange_r7eg9y$:function($receiver, startIndex, endIndex, replacement) { - if (endIndex < startIndex) { - throw new Kotlin.IndexOutOfBoundsException("End index (" + endIndex + ") is less than start index (" + startIndex + ")."); - } - var sb = new Kotlin.StringBuilder; - sb.append($receiver, 0, startIndex); - sb.append(replacement); - sb.append($receiver, endIndex, $receiver.length); - return sb; - }, replaceRange_tb247g$:Kotlin.defineInlineFunction("stdlib.kotlin.text.replaceRange_tb247g$", function($receiver, startIndex, endIndex, replacement) { - var tmp$0; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, startIndex, endIndex, replacement).toString(); - }), replaceRange_jrbvad$:function($receiver, range, replacement) { - return _.kotlin.text.replaceRange_r7eg9y$($receiver, range.start, range.endInclusive + 1, replacement); - }, replaceRange_dvlf5r$:Kotlin.defineInlineFunction("stdlib.kotlin.text.replaceRange_dvlf5r$", function($receiver, range, replacement) { - var tmp$0; - return _.kotlin.text.replaceRange_jrbvad$($receiver, range, replacement).toString(); - }), removeRange_7bp3tu$:function($receiver, startIndex, endIndex) { - if (endIndex < startIndex) { - throw new Kotlin.IndexOutOfBoundsException("End index (" + endIndex + ") is less than start index (" + startIndex + ")."); - } - if (endIndex === startIndex) { - return $receiver.substring(0, $receiver.length); - } - var sb = new Kotlin.StringBuilder; - sb.append($receiver, 0, startIndex); - sb.append($receiver, endIndex, $receiver.length); - return sb; - }, removeRange_78fvzw$:Kotlin.defineInlineFunction("stdlib.kotlin.text.removeRange_78fvzw$", function($receiver, startIndex, endIndex) { - var tmp$0; - return _.kotlin.text.removeRange_7bp3tu$($receiver, startIndex, endIndex).toString(); - }), removeRange_2g2kgt$:function($receiver, range) { - return _.kotlin.text.removeRange_7bp3tu$($receiver, range.start, range.endInclusive + 1); - }, removeRange_590b93$:Kotlin.defineInlineFunction("stdlib.kotlin.text.removeRange_590b93$", function($receiver, range) { - var tmp$0; - return _.kotlin.text.removeRange_2g2kgt$($receiver, range).toString(); - }), removePrefix_4ewbza$:function($receiver, prefix) { - if (_.kotlin.text.startsWith_kzp0od$($receiver, prefix)) { - return $receiver.substring(prefix.length, $receiver.length); - } - return $receiver.substring(0, $receiver.length); - }, removePrefix_a14n4c$:function($receiver, prefix) { - if (_.kotlin.text.startsWith_kzp0od$($receiver, prefix)) { - return $receiver.substring(prefix.length); - } - return $receiver; - }, removeSuffix_4ewbza$:function($receiver, suffix) { - if (_.kotlin.text.endsWith_kzp0od$($receiver, suffix)) { - return $receiver.substring(0, $receiver.length - suffix.length); - } - return $receiver.substring(0, $receiver.length); - }, removeSuffix_a14n4c$:function($receiver, suffix) { - if (_.kotlin.text.endsWith_kzp0od$($receiver, suffix)) { - return $receiver.substring(0, $receiver.length - suffix.length); - } - return $receiver; - }, removeSurrounding_9b5scy$:function($receiver, prefix, suffix) { - if ($receiver.length >= prefix.length + suffix.length && (_.kotlin.text.startsWith_kzp0od$($receiver, prefix) && _.kotlin.text.endsWith_kzp0od$($receiver, suffix))) { - return $receiver.substring(prefix.length, $receiver.length - suffix.length); - } - return $receiver.substring(0, $receiver.length); - }, removeSurrounding_f5o6fo$:function($receiver, prefix, suffix) { - if ($receiver.length >= prefix.length + suffix.length && (_.kotlin.text.startsWith_kzp0od$($receiver, prefix) && _.kotlin.text.endsWith_kzp0od$($receiver, suffix))) { - return $receiver.substring(prefix.length, $receiver.length - suffix.length); - } - return $receiver; - }, removeSurrounding_4ewbza$:function($receiver, delimiter) { - return _.kotlin.text.removeSurrounding_9b5scy$($receiver, delimiter, delimiter); - }, removeSurrounding_a14n4c$:function($receiver, delimiter) { - return _.kotlin.text.removeSurrounding_f5o6fo$($receiver, delimiter, delimiter); - }, replaceBefore_tzm4on$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_ilfvta$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, 0, index, replacement).toString(); - } - }, replaceBefore_s3e0ge$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_30chhv$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, 0, index, replacement).toString(); - } - }, replaceAfter_tzm4on$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_ilfvta$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, index + 1, $receiver.length, replacement).toString(); - } - }, replaceAfter_s3e0ge$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_30chhv$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, index + delimiter.length, $receiver.length, replacement).toString(); - } - }, replaceAfterLast_s3e0ge$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_30chhv$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, index + delimiter.length, $receiver.length, replacement).toString(); - } - }, replaceAfterLast_tzm4on$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_ilfvta$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, index + 1, $receiver.length, replacement).toString(); - } - }, replaceBeforeLast_tzm4on$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_ilfvta$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, 0, index, replacement).toString(); - } - }, replaceBeforeLast_s3e0ge$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_30chhv$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, 0, index, replacement).toString(); - } - }, replace_8h3bgl$:Kotlin.defineInlineFunction("stdlib.kotlin.text.replace_8h3bgl$", function($receiver, regex, replacement) { - return regex.replace_x2uqeu$($receiver, replacement); - }), replace_c95is1$:Kotlin.defineInlineFunction("stdlib.kotlin.text.replace_c95is1$", function($receiver, regex, transform) { - var match = regex.find_905azu$($receiver); - if (match == null) { - return $receiver.toString(); - } - var lastStart = 0; - var length = $receiver.length; - var sb = new Kotlin.StringBuilder; - do { - var foundMatch = match != null ? match : Kotlin.throwNPE(); - sb.append($receiver, lastStart, foundMatch.range.start); - sb.append(transform(foundMatch)); - lastStart = foundMatch.range.endInclusive + 1; - match = foundMatch.next(); - } while (lastStart < length && match != null); - if (lastStart < length) { - sb.append($receiver, lastStart, length); - } - return sb.toString(); - }), replaceFirst_8h3bgl$:Kotlin.defineInlineFunction("stdlib.kotlin.text.replaceFirst_8h3bgl$", function($receiver, regex, replacement) { - return regex.replaceFirst_x2uqeu$($receiver, replacement); - }), matches_pg0hzr$:Kotlin.defineInlineFunction("stdlib.kotlin.text.matches_pg0hzr$", function($receiver, regex) { - return regex.matches_6bul2c$($receiver); - }), regionMatchesImpl:function($receiver, thisOffset, other, otherOffset, length, ignoreCase) { - var tmp$0; - if (otherOffset < 0 || (thisOffset < 0 || (thisOffset > $receiver.length - length || otherOffset > other.length - length))) { - return false; - } - tmp$0 = length - 1; - for (var index = 0;index <= tmp$0;index++) { - if (!_.kotlin.text.equals_bapbyp$($receiver.charAt(thisOffset + index), other.charAt(otherOffset + index), ignoreCase)) { - return false; - } - } - return true; - }, startsWith_cjsvxq$:function($receiver, char, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.length > 0 && _.kotlin.text.equals_bapbyp$($receiver.charAt(0), char, ignoreCase); - }, endsWith_cjsvxq$:function($receiver, char, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.length > 0 && _.kotlin.text.equals_bapbyp$($receiver.charAt(_.kotlin.text.get_lastIndex_gw00vq$($receiver)), char, ignoreCase); - }, startsWith_kzp0od$:function($receiver, prefix, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (!ignoreCase && (typeof $receiver === "string" && typeof prefix === "string")) { - return _.kotlin.text.startsWith_41xvrb$($receiver, prefix); - } else { - return _.kotlin.text.regionMatchesImpl($receiver, 0, prefix, 0, prefix.length, ignoreCase); - } - }, startsWith_q2992l$:function($receiver, prefix, startIndex, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (!ignoreCase && (typeof $receiver === "string" && typeof prefix === "string")) { - return _.kotlin.text.startsWith_rh6gah$($receiver, prefix, startIndex); - } else { - return _.kotlin.text.regionMatchesImpl($receiver, startIndex, prefix, 0, prefix.length, ignoreCase); - } - }, endsWith_kzp0od$:function($receiver, suffix, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (!ignoreCase && (typeof $receiver === "string" && typeof suffix === "string")) { - return _.kotlin.text.endsWith_41xvrb$($receiver, suffix); - } else { - return _.kotlin.text.regionMatchesImpl($receiver, $receiver.length - suffix.length, suffix, 0, suffix.length, ignoreCase); - } - }, commonPrefixWith_kzp0od$:function($receiver, other, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - var shortestLength = Math.min($receiver.length, other.length); - var i = 0; - while (i < shortestLength && _.kotlin.text.equals_bapbyp$($receiver.charAt(i), other.charAt(i), ignoreCase)) { - i++; - } - if (_.kotlin.text.hasSurrogatePairAt_kljjvw$($receiver, i - 1) || _.kotlin.text.hasSurrogatePairAt_kljjvw$(other, i - 1)) { - i--; - } - return $receiver.substring(0, i).toString(); - }, commonSuffixWith_kzp0od$:function($receiver, other, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - var thisLength = $receiver.length; - var otherLength = other.length; - var shortestLength = Math.min(thisLength, otherLength); - var i = 0; - while (i < shortestLength && _.kotlin.text.equals_bapbyp$($receiver.charAt(thisLength - i - 1), other.charAt(otherLength - i - 1), ignoreCase)) { - i++; - } - if (_.kotlin.text.hasSurrogatePairAt_kljjvw$($receiver, thisLength - i - 1) || _.kotlin.text.hasSurrogatePairAt_kljjvw$(other, otherLength - i - 1)) { - i--; - } - return $receiver.substring(thisLength - i, thisLength).toString(); - }, findAnyOf:function($receiver, chars, startIndex, ignoreCase, last) { - var index; - var matchingCharIndex; - var tmp$0; - if (!ignoreCase && (chars.length === 1 && typeof $receiver === "string")) { - var char = _.kotlin.collections.single_355nu0$(chars); - index = !last ? $receiver.indexOf(char.toString(), startIndex) : $receiver.lastIndexOf(char.toString(), startIndex); - return index < 0 ? null : _.kotlin.to_l1ob02$(index, char); - } - var indices = !last ? new Kotlin.NumberRange(Math.max(startIndex, 0), _.kotlin.text.get_lastIndex_gw00vq$($receiver)) : _.kotlin.ranges.downTo_rksjo2$(Math.min(startIndex, _.kotlin.text.get_lastIndex_gw00vq$($receiver)), 0); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index_0 = tmp$0.next(); - var charAtIndex = $receiver.charAt(index_0); - indexOfFirst_mf0bwc$break: { - var tmp$5, tmp$2, tmp$3, tmp$4; - tmp$5 = _.kotlin.collections.get_indices_355nu0$(chars), tmp$2 = tmp$5.first, tmp$3 = tmp$5.last, tmp$4 = tmp$5.step; - for (var index_1 = tmp$2;index_1 <= tmp$3;index_1 += tmp$4) { - if (_.kotlin.text.equals_bapbyp$(chars[index_1], charAtIndex, ignoreCase)) { - matchingCharIndex = index_1; - break indexOfFirst_mf0bwc$break; - } - } - matchingCharIndex = -1; - } - if (matchingCharIndex >= 0) { - return _.kotlin.to_l1ob02$(index_0, chars[matchingCharIndex]); - } - } - return null; - }, indexOfAny_cfilrb$:function($receiver, chars, startIndex, ignoreCase) { - var tmp$0, tmp$1; - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return(tmp$1 = (tmp$0 = _.kotlin.text.findAnyOf($receiver, chars, startIndex, ignoreCase, false)) != null ? tmp$0.first : null) != null ? tmp$1 : -1; - }, lastIndexOfAny_cfilrb$:function($receiver, chars, startIndex, ignoreCase) { - var tmp$0, tmp$1; - if (startIndex === void 0) { - startIndex = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return(tmp$1 = (tmp$0 = _.kotlin.text.findAnyOf($receiver, chars, startIndex, ignoreCase, true)) != null ? tmp$0.first : null) != null ? tmp$1 : -1; - }, indexOf_1:function($receiver, other, startIndex, endIndex, ignoreCase, last) { - var tmp$0, tmp$1; - if (last === void 0) { - last = false; - } - var indices = !last ? new Kotlin.NumberRange(_.kotlin.ranges.coerceAtLeast_rksjo2$(startIndex, 0), _.kotlin.ranges.coerceAtMost_rksjo2$(endIndex, $receiver.length)) : _.kotlin.ranges.downTo_rksjo2$(_.kotlin.ranges.coerceAtMost_rksjo2$(startIndex, _.kotlin.text.get_lastIndex_gw00vq$($receiver)), _.kotlin.ranges.coerceAtLeast_rksjo2$(endIndex, 0)); - if (typeof $receiver === "string" && typeof other === "string") { - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (_.kotlin.text.regionMatches_qb0ndp$(other, 0, $receiver, index, other.length, ignoreCase)) { - return index; - } - } - } else { - tmp$1 = indices.iterator(); - while (tmp$1.hasNext()) { - var index_0 = tmp$1.next(); - if (_.kotlin.text.regionMatchesImpl(other, 0, $receiver, index_0, other.length, ignoreCase)) { - return index_0; - } - } - } - return-1; - }, findAnyOf_1:function($receiver, strings, startIndex, ignoreCase, last) { - var matchingString; - var matchingString_0; - var tmp$0, tmp$1; - if (!ignoreCase && strings.size === 1) { - var string = _.kotlin.collections.single_q5oq31$(strings); - var index = !last ? _.kotlin.text.indexOf_30chhv$($receiver, string, startIndex) : _.kotlin.text.lastIndexOf_30chhv$($receiver, string, startIndex); - return index < 0 ? null : _.kotlin.to_l1ob02$(index, string); - } - var indices = !last ? new Kotlin.NumberRange(_.kotlin.ranges.coerceAtLeast_rksjo2$(startIndex, 0), $receiver.length) : _.kotlin.ranges.downTo_rksjo2$(_.kotlin.ranges.coerceAtMost_rksjo2$(startIndex, _.kotlin.text.get_lastIndex_gw00vq$($receiver)), 0); - if (typeof $receiver === "string") { - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index_0 = tmp$0.next(); - firstOrNull_udlcbx$break: { - var tmp$2; - tmp$2 = strings.iterator(); - while (tmp$2.hasNext()) { - var element = tmp$2.next(); - if (_.kotlin.text.regionMatches_qb0ndp$(element, 0, $receiver, index_0, element.length, ignoreCase)) { - matchingString = element; - break firstOrNull_udlcbx$break; - } - } - matchingString = null; - } - if (matchingString != null) { - return _.kotlin.to_l1ob02$(index_0, matchingString); - } - } - } else { - tmp$1 = indices.iterator(); - while (tmp$1.hasNext()) { - var index_1 = tmp$1.next(); - firstOrNull_udlcbx$break_0: { - var tmp$3; - tmp$3 = strings.iterator(); - while (tmp$3.hasNext()) { - var element_0 = tmp$3.next(); - if (_.kotlin.text.regionMatchesImpl(element_0, 0, $receiver, index_1, element_0.length, ignoreCase)) { - matchingString_0 = element_0; - break firstOrNull_udlcbx$break_0; - } - } - matchingString_0 = null; - } - if (matchingString_0 != null) { - return _.kotlin.to_l1ob02$(index_1, matchingString_0); - } - } - } - return null; - }, findAnyOf_o41fp7$:function($receiver, strings, startIndex, ignoreCase) { - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return _.kotlin.text.findAnyOf_1($receiver, strings, startIndex, ignoreCase, false); - }, findLastAnyOf_o41fp7$:function($receiver, strings, startIndex, ignoreCase) { - if (startIndex === void 0) { - startIndex = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return _.kotlin.text.findAnyOf_1($receiver, strings, startIndex, ignoreCase, true); - }, indexOfAny_o41fp7$:function($receiver, strings, startIndex, ignoreCase) { - var tmp$0, tmp$1; - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return(tmp$1 = (tmp$0 = _.kotlin.text.findAnyOf_1($receiver, strings, startIndex, ignoreCase, false)) != null ? tmp$0.first : null) != null ? tmp$1 : -1; - }, lastIndexOfAny_o41fp7$:function($receiver, strings, startIndex, ignoreCase) { - var tmp$0, tmp$1; - if (startIndex === void 0) { - startIndex = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return(tmp$1 = (tmp$0 = _.kotlin.text.findAnyOf_1($receiver, strings, startIndex, ignoreCase, true)) != null ? tmp$0.first : null) != null ? tmp$1 : -1; - }, indexOf_ilfvta$:function($receiver, char, startIndex, ignoreCase) { - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return ignoreCase || !(typeof $receiver === "string") ? _.kotlin.text.indexOfAny_cfilrb$($receiver, [char], startIndex, ignoreCase) : $receiver.indexOf(char.toString(), startIndex); - }, indexOf_30chhv$:function($receiver, string, startIndex, ignoreCase) { - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return ignoreCase || !(typeof $receiver === "string") ? _.kotlin.text.indexOf_1($receiver, string, startIndex, $receiver.length, ignoreCase) : $receiver.indexOf(string, startIndex); - }, lastIndexOf_ilfvta$:function($receiver, char, startIndex, ignoreCase) { - if (startIndex === void 0) { - startIndex = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return ignoreCase || !(typeof $receiver === "string") ? _.kotlin.text.lastIndexOfAny_cfilrb$($receiver, [char], startIndex, ignoreCase) : $receiver.lastIndexOf(char.toString(), startIndex); - }, lastIndexOf_30chhv$:function($receiver, string, startIndex, ignoreCase) { - if (startIndex === void 0) { - startIndex = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return ignoreCase || !(typeof $receiver === "string") ? _.kotlin.text.indexOf_1($receiver, string, startIndex, 0, ignoreCase, true) : $receiver.lastIndexOf(string, startIndex); - }, contains_kzp0od$:function($receiver, other, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return typeof other === "string" ? _.kotlin.text.indexOf_30chhv$($receiver, other, void 0, ignoreCase) >= 0 : _.kotlin.text.indexOf_1($receiver, other, 0, $receiver.length, ignoreCase) >= 0; - }, contains_cjsvxq$:function($receiver, char, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return _.kotlin.text.indexOf_ilfvta$($receiver, char, void 0, ignoreCase) >= 0; - }, contains_pg0hzr$:Kotlin.defineInlineFunction("stdlib.kotlin.text.contains_pg0hzr$", function($receiver, regex) { - return regex.containsMatchIn_6bul2c$($receiver); - }), DelimitedRangesSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(input, startIndex, limit, getNextMatch) { - this.input_furd7s$ = input; - this.startIndex_82cxqa$ = startIndex; - this.limit_ft78vr$ = limit; - this.getNextMatch_1m429e$ = getNextMatch; - }, {iterator:function() { - return new _.kotlin.text.DelimitedRangesSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$DelimitedRangesSequence) { - this.this$DelimitedRangesSequence_0 = this$DelimitedRangesSequence; - this.nextState = -1; - this.currentStartIndex = Math.min(Math.max(this$DelimitedRangesSequence.startIndex_82cxqa$, 0), this$DelimitedRangesSequence.input_furd7s$.length); - this.nextSearchIndex = this.currentStartIndex; - this.nextItem = null; - this.counter = 0; - }, {calcNext:function() { - if (this.nextSearchIndex < 0) { - this.nextState = 0; - this.nextItem = null; - } else { - if (this.this$DelimitedRangesSequence_0.limit_ft78vr$ > 0 && ++this.counter >= this.this$DelimitedRangesSequence_0.limit_ft78vr$ || this.nextSearchIndex > this.this$DelimitedRangesSequence_0.input_furd7s$.length) { - this.nextItem = new Kotlin.NumberRange(this.currentStartIndex, _.kotlin.text.get_lastIndex_gw00vq$(this.this$DelimitedRangesSequence_0.input_furd7s$)); - this.nextSearchIndex = -1; - } else { - var match = this.this$DelimitedRangesSequence_0.getNextMatch_1m429e$.call(this.this$DelimitedRangesSequence_0.input_furd7s$, this.nextSearchIndex); - if (match == null) { - this.nextItem = new Kotlin.NumberRange(this.currentStartIndex, _.kotlin.text.get_lastIndex_gw00vq$(this.this$DelimitedRangesSequence_0.input_furd7s$)); - this.nextSearchIndex = -1; - } else { - var tmp$0 = match, index = tmp$0.component1(), length = tmp$0.component2(); - this.nextItem = new Kotlin.NumberRange(this.currentStartIndex, index - 1); - this.currentStartIndex = index + length; - this.nextSearchIndex = this.currentStartIndex + (length === 0 ? 1 : 0); - } - } - this.nextState = 1; - } - }, next:function() { - var tmp$0; - if (this.nextState === -1) { - this.calcNext(); - } - if (this.nextState === 0) { - throw new Kotlin.NoSuchElementException; - } - var result = Kotlin.isType(tmp$0 = this.nextItem, Kotlin.NumberRange) ? tmp$0 : Kotlin.throwCCE(); - this.nextItem = null; - this.nextState = -1; - return result; - }, hasNext:function() { - if (this.nextState === -1) { - this.calcNext(); - } - return this.nextState === 1; - }}, {})}), rangesDelimitedBy_1$f_0:function(closure$delimiters, closure$ignoreCase) { - return function(startIndex) { - var tmp$0; - return(tmp$0 = _.kotlin.text.findAnyOf(this, closure$delimiters, startIndex, closure$ignoreCase, false)) != null ? _.kotlin.to_l1ob02$(tmp$0.first, 1) : null; - }; - }, rangesDelimitedBy_1:function($receiver, delimiters, startIndex, ignoreCase, limit) { - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (limit === void 0) { - limit = 0; - } - if (!(limit >= 0)) { - var message = "Limit must be non-negative, but was " + limit + "."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return new _.kotlin.text.DelimitedRangesSequence($receiver, startIndex, limit, _.kotlin.text.rangesDelimitedBy_1$f_0(delimiters, ignoreCase)); - }, rangesDelimitedBy$f_0:function(closure$delimitersList, closure$ignoreCase) { - return function(startIndex) { - var tmp$0; - return(tmp$0 = _.kotlin.text.findAnyOf_1(this, closure$delimitersList, startIndex, closure$ignoreCase, false)) != null ? _.kotlin.to_l1ob02$(tmp$0.first, tmp$0.second.length) : null; - }; - }, rangesDelimitedBy:function($receiver, delimiters, startIndex, ignoreCase, limit) { - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (limit === void 0) { - limit = 0; - } - if (!(limit >= 0)) { - var message = "Limit must be non-negative, but was " + limit + "."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - var delimitersList = _.kotlin.collections.asList_eg9ybj$(delimiters); - return new _.kotlin.text.DelimitedRangesSequence($receiver, startIndex, limit, _.kotlin.text.rangesDelimitedBy$f_0(delimitersList, ignoreCase)); - }, splitToSequence_l2gz7$f:function(this$splitToSequence) { - return function(it) { - return _.kotlin.text.substring_2g2kgt$(this$splitToSequence, it); - }; - }, splitToSequence_l2gz7$:function($receiver, delimiters, ignoreCase, limit) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (limit === void 0) { - limit = 0; - } - return _.kotlin.sequences.map_mzhnvn$(_.kotlin.text.rangesDelimitedBy($receiver, delimiters, void 0, ignoreCase, limit), _.kotlin.text.splitToSequence_l2gz7$f($receiver)); - }, split_l2gz7$:function($receiver, delimiters, ignoreCase, limit) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (limit === void 0) { - limit = 0; - } - var $receiver_0 = _.kotlin.sequences.asIterable_uya9q7$(_.kotlin.text.rangesDelimitedBy($receiver, delimiters, void 0, ignoreCase, limit)); - var destination = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault($receiver_0, 10)); - var tmp$0; - tmp$0 = $receiver_0.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(_.kotlin.text.substring_2g2kgt$($receiver, item)); - } - return destination; - }, splitToSequence_rhc0qh$f:function(this$splitToSequence) { - return function(it) { - return _.kotlin.text.substring_2g2kgt$(this$splitToSequence, it); - }; - }, splitToSequence_rhc0qh$:function($receiver, delimiters, ignoreCase, limit) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (limit === void 0) { - limit = 0; - } - return _.kotlin.sequences.map_mzhnvn$(_.kotlin.text.rangesDelimitedBy_1($receiver, delimiters, void 0, ignoreCase, limit), _.kotlin.text.splitToSequence_rhc0qh$f($receiver)); - }, split_rhc0qh$:function($receiver, delimiters, ignoreCase, limit) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (limit === void 0) { - limit = 0; - } - var $receiver_0 = _.kotlin.sequences.asIterable_uya9q7$(_.kotlin.text.rangesDelimitedBy_1($receiver, delimiters, void 0, ignoreCase, limit)); - var destination = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault($receiver_0, 10)); - var tmp$0; - tmp$0 = $receiver_0.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(_.kotlin.text.substring_2g2kgt$($receiver, item)); - } - return destination; - }, split_nhz2th$:Kotlin.defineInlineFunction("stdlib.kotlin.text.split_nhz2th$", function($receiver, regex, limit) { - if (limit === void 0) { - limit = 0; - } - return regex.split_905azu$($receiver, limit); - }), lineSequence_gw00vq$:function($receiver) { - return _.kotlin.text.splitToSequence_l2gz7$($receiver, ["\r\n", "\n", "\r"]); - }, lines_gw00vq$:function($receiver) { - return _.kotlin.sequences.toList_uya9q7$(_.kotlin.text.lineSequence_gw00vq$($receiver)); - }, Typography:Kotlin.createObject(null, function() { - this.quote = '"'; - this.dollar = "$"; - this.amp = "\x26"; - this.less = "\x3c"; - this.greater = "\x3e"; - this.nbsp = "\u00a0"; - this.times = "\u00d7"; - this.cent = "\u00a2"; - this.pound = "\u00a3"; - this.section = "\u00a7"; - this.copyright = "\u00a9"; - this.leftGuillemete = "\u00ab"; - this.rightGuillemete = "\u00bb"; - this.registered = "\u00ae"; - this.degree = "\u00b0"; - this.plusMinus = "\u00b1"; - this.paragraph = "\u00b6"; - this.middleDot = "\u00b7"; - this.half = "\u00bd"; - this.ndash = "\u2013"; - this.mdash = "\u2014"; - this.leftSingleQuote = "\u2018"; - this.rightSingleQuote = "\u2019"; - this.lowSingleQuote = "\u201a"; - this.leftDoubleQuote = "\u201c"; - this.rightDoubleQuote = "\u201d"; - this.lowDoubleQuote = "\u201e"; - this.dagger = "\u2020"; - this.doubleDagger = "\u2021"; - this.bullet = "\u2022"; - this.ellipsis = "\u2026"; - this.prime = "\u2032"; - this.doublePrime = "\u2033"; - this.euro = "\u20ac"; - this.tm = "\u2122"; - this.almostEqual = "\u2248"; - this.notEqual = "\u2260"; - this.lessOrEqual = "\u2264"; - this.greaterOrEqual = "\u2265"; - }), MatchGroupCollection:Kotlin.createTrait(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Collection]; - }), MatchResult:Kotlin.createTrait(null, {destructured:{get:function() { - return new _.kotlin.text.MatchResult.Destructured(this); - }}}, {Destructured:Kotlin.createClass(null, function(match) { - this.match = match; - }, {component1:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component1", function() { - return this.match.groupValues.get_za3lpa$(1); - }), component2:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component2", function() { - return this.match.groupValues.get_za3lpa$(2); - }), component3:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component3", function() { - return this.match.groupValues.get_za3lpa$(3); - }), component4:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component4", function() { - return this.match.groupValues.get_za3lpa$(4); - }), component5:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component5", function() { - return this.match.groupValues.get_za3lpa$(5); - }), component6:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component6", function() { - return this.match.groupValues.get_za3lpa$(6); - }), component7:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component7", function() { - return this.match.groupValues.get_za3lpa$(7); - }), component8:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component8", function() { - return this.match.groupValues.get_za3lpa$(8); - }), component9:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component9", function() { - return this.match.groupValues.get_za3lpa$(9); - }), component10:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component10", function() { - return this.match.groupValues.get_za3lpa$(10); - }), toList:function() { - return this.match.groupValues.subList_vux9f0$(1, this.match.groupValues.size); - }})}), toRegex_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.toRegex_pdl1w0$", function($receiver) { - return _.kotlin.text.Regex_61zpoe$($receiver); - }), toRegex_1fh9rc$:Kotlin.defineInlineFunction("stdlib.kotlin.text.toRegex_1fh9rc$", function($receiver, option) { - return _.kotlin.text.Regex_sb3q2$($receiver, option); - }), toRegex_qbq406$:Kotlin.defineInlineFunction("stdlib.kotlin.text.toRegex_qbq406$", function($receiver, options) { - return new _.kotlin.text.Regex($receiver, options); - }), js:Kotlin.definePackage(null, {reset_bckwes$:function($receiver) { - $receiver.lastIndex = 0; - }})}), collections:Kotlin.definePackage(function() { - this.INT_MAX_POWER_OF_TWO_y8578v$ = (Kotlin.modules["stdlib"].kotlin.js.internal.IntCompanionObject.MAX_VALUE / 2 | 0) + 1; - }, {listOf_za3rmp$:function(element) { - return _.kotlin.collections.arrayListOf_9mqe4v$([element]); - }, setOf_za3rmp$:function(element) { - return _.kotlin.collections.hashSetOf_9mqe4v$([element]); - }, mapOf_dvvt93$:function(pair) { - return _.kotlin.collections.hashMapOf_eoa9s7$([pair]); - }, asList_eg9ybj$:function($receiver) { - var al = new Kotlin.ArrayList; - al.array = $receiver; - return al; - }, asList_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_l1lu5s$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_964n92$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_355nu0$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_bvy38t$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_rjqrz0$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_tmsbgp$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_se6h4y$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_i2lc78$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), copyOf_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_eg9ybj$", function($receiver) { - return $receiver.slice(); - }), copyOf_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_l1lu5s$", function($receiver) { - return $receiver.slice(); - }), copyOf_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_964n92$", function($receiver) { - return $receiver.slice(); - }), copyOf_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_355nu0$", function($receiver) { - return $receiver.slice(); - }), copyOf_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_bvy38t$", function($receiver) { - return $receiver.slice(); - }), copyOf_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_rjqrz0$", function($receiver) { - return $receiver.slice(); - }), copyOf_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_tmsbgp$", function($receiver) { - return $receiver.slice(); - }), copyOf_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_se6h4y$", function($receiver) { - return $receiver.slice(); - }), copyOf_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_i2lc78$", function($receiver) { - return $receiver.slice(); - }), copyOf_ucmip8$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, 0); - }, copyOf_7naycm$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, 0); - }, copyOf_tb5gmf$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, 0); - }, copyOf_x09c4g$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, Kotlin.Long.ZERO); - }, copyOf_2e964m$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, 0); - }, copyOf_3qx2rv$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, 0); - }, copyOf_rz0vgy$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, false); - }, copyOf_cwi0e2$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, "\x00"); - }, copyOf_ke1fvl$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, null); - }, copyOfRange_51gnn7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_51gnn7$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_dbbxfg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_dbbxfg$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_iwvzfi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_iwvzfi$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_4q6m98$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_4q6m98$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_2w253b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_2w253b$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_guntdk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_guntdk$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_qzgok5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_qzgok5$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_v260a6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_v260a6$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_6rk7s8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_6rk7s8$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), plus_ke19y6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_ke19y6$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_bsmqrv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_bsmqrv$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_hgt5d7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_hgt5d7$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_q79yhh$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_q79yhh$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_96a6a3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_96a6a3$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_thi4tv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_thi4tv$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_tb5gmf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_tb5gmf$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_ssilt7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_ssilt7$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_x27eb7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_x27eb7$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_b1982w$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_pxf0th$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_426zor$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_esr9qt$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_3mnc6t$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_202n65$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_5oi5bn$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_wdqs0l$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_o0d0y5$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_741p1q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_741p1q$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_xju7f2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_xju7f2$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_1033ji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_1033ji$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_ak8uzy$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_ak8uzy$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_bo3qya$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_bo3qya$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_p55a6y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_p55a6y$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_e0lu4g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_e0lu4g$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_7caxwu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_7caxwu$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_phu9d2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_phu9d2$", function($receiver, elements) { - return $receiver.concat(elements); - }), plusElement_ke19y6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusElement_ke19y6$", function($receiver, element) { - return $receiver.concat([element]); - }), sort_ehvuiv$f:function(a, b) { - return Kotlin.compareTo(a, b); - }, sort_ehvuiv$:function($receiver) { - if ($receiver.length > 1) { - $receiver.sort(_.kotlin.collections.sort_ehvuiv$f); - } - }, sort_se6h4y$f:function(a, b) { - return a.compareTo_za3rmp$(b); - }, sort_se6h4y$:function($receiver) { - if ($receiver.length > 1) { - $receiver.sort(_.kotlin.collections.sort_se6h4y$f); - } - }, sortWith_pf0rc$f:function(closure$comparator) { - return function(a, b) { - return closure$comparator.compare(a, b); - }; - }, sortWith_pf0rc$:function($receiver, comparator) { - if ($receiver.length > 1) { - $receiver.sort(_.kotlin.collections.sortWith_pf0rc$f(comparator)); - } - }, toTypedArray_l1lu5s$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_964n92$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_355nu0$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_bvy38t$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_rjqrz0$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_tmsbgp$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_se6h4y$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_i2lc78$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, component1_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_eg9ybj$", function($receiver) { - return $receiver[0]; - }), component1_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_964n92$", function($receiver) { - return $receiver[0]; - }), component1_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_i2lc78$", function($receiver) { - return $receiver[0]; - }), component1_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_tmsbgp$", function($receiver) { - return $receiver[0]; - }), component1_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_se6h4y$", function($receiver) { - return $receiver[0]; - }), component1_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_rjqrz0$", function($receiver) { - return $receiver[0]; - }), component1_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_bvy38t$", function($receiver) { - return $receiver[0]; - }), component1_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_l1lu5s$", function($receiver) { - return $receiver[0]; - }), component1_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_355nu0$", function($receiver) { - return $receiver[0]; - }), component2_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_eg9ybj$", function($receiver) { - return $receiver[1]; - }), component2_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_964n92$", function($receiver) { - return $receiver[1]; - }), component2_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_i2lc78$", function($receiver) { - return $receiver[1]; - }), component2_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_tmsbgp$", function($receiver) { - return $receiver[1]; - }), component2_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_se6h4y$", function($receiver) { - return $receiver[1]; - }), component2_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_rjqrz0$", function($receiver) { - return $receiver[1]; - }), component2_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_bvy38t$", function($receiver) { - return $receiver[1]; - }), component2_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_l1lu5s$", function($receiver) { - return $receiver[1]; - }), component2_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_355nu0$", function($receiver) { - return $receiver[1]; - }), component3_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_eg9ybj$", function($receiver) { - return $receiver[2]; - }), component3_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_964n92$", function($receiver) { - return $receiver[2]; - }), component3_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_i2lc78$", function($receiver) { - return $receiver[2]; - }), component3_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_tmsbgp$", function($receiver) { - return $receiver[2]; - }), component3_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_se6h4y$", function($receiver) { - return $receiver[2]; - }), component3_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_rjqrz0$", function($receiver) { - return $receiver[2]; - }), component3_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_bvy38t$", function($receiver) { - return $receiver[2]; - }), component3_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_l1lu5s$", function($receiver) { - return $receiver[2]; - }), component3_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_355nu0$", function($receiver) { - return $receiver[2]; - }), component4_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_eg9ybj$", function($receiver) { - return $receiver[3]; - }), component4_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_964n92$", function($receiver) { - return $receiver[3]; - }), component4_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_i2lc78$", function($receiver) { - return $receiver[3]; - }), component4_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_tmsbgp$", function($receiver) { - return $receiver[3]; - }), component4_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_se6h4y$", function($receiver) { - return $receiver[3]; - }), component4_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_rjqrz0$", function($receiver) { - return $receiver[3]; - }), component4_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_bvy38t$", function($receiver) { - return $receiver[3]; - }), component4_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_l1lu5s$", function($receiver) { - return $receiver[3]; - }), component4_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_355nu0$", function($receiver) { - return $receiver[3]; - }), component5_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_eg9ybj$", function($receiver) { - return $receiver[4]; - }), component5_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_964n92$", function($receiver) { - return $receiver[4]; - }), component5_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_i2lc78$", function($receiver) { - return $receiver[4]; - }), component5_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_tmsbgp$", function($receiver) { - return $receiver[4]; - }), component5_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_se6h4y$", function($receiver) { - return $receiver[4]; - }), component5_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_rjqrz0$", function($receiver) { - return $receiver[4]; - }), component5_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_bvy38t$", function($receiver) { - return $receiver[4]; - }), component5_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_l1lu5s$", function($receiver) { - return $receiver[4]; - }), component5_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_355nu0$", function($receiver) { - return $receiver[4]; - }), contains_ke19y6$:function($receiver, element) { - return _.kotlin.collections.indexOf_ke19y6$($receiver, element) >= 0; - }, contains_hgt5d7$:function($receiver, element) { - return _.kotlin.collections.indexOf_hgt5d7$($receiver, element) >= 0; - }, contains_x27eb7$:function($receiver, element) { - return _.kotlin.collections.indexOf_x27eb7$($receiver, element) >= 0; - }, contains_tb5gmf$:function($receiver, element) { - return _.kotlin.collections.indexOf_tb5gmf$($receiver, element) >= 0; - }, contains_ssilt7$:function($receiver, element) { - return _.kotlin.collections.indexOf_ssilt7$($receiver, element) >= 0; - }, contains_thi4tv$:function($receiver, element) { - return _.kotlin.collections.indexOf_thi4tv$($receiver, element) >= 0; - }, contains_96a6a3$:function($receiver, element) { - return _.kotlin.collections.indexOf_96a6a3$($receiver, element) >= 0; - }, contains_bsmqrv$:function($receiver, element) { - return _.kotlin.collections.indexOf_bsmqrv$($receiver, element) >= 0; - }, contains_q79yhh$:function($receiver, element) { - return _.kotlin.collections.indexOf_q79yhh$($receiver, element) >= 0; - }, elementAt_ke1fvl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_ke1fvl$", function($receiver, index) { - return $receiver[index]; - }), elementAt_ucmip8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_ucmip8$", function($receiver, index) { - return $receiver[index]; - }), elementAt_7naycm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_7naycm$", function($receiver, index) { - return $receiver[index]; - }), elementAt_tb5gmf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_tb5gmf$", function($receiver, index) { - return $receiver[index]; - }), elementAt_x09c4g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_x09c4g$", function($receiver, index) { - return $receiver[index]; - }), elementAt_2e964m$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_2e964m$", function($receiver, index) { - return $receiver[index]; - }), elementAt_3qx2rv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_3qx2rv$", function($receiver, index) { - return $receiver[index]; - }), elementAt_rz0vgy$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_rz0vgy$", function($receiver, index) { - return $receiver[index]; - }), elementAt_cwi0e2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_cwi0e2$", function($receiver, index) { - return $receiver[index]; - }), elementAtOrElse_pgyyp0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_pgyyp0$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_eg9ybj$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_wdmei7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_wdmei7$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_964n92$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_ytfokv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_ytfokv$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_i2lc78$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_hvqa2x$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_hvqa2x$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_tmsbgp$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_37uoi9$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_37uoi9$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_se6h4y$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_t52ijz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_t52ijz$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_rjqrz0$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_sbr6cx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_sbr6cx$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_bvy38t$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_puwlef$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_puwlef$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_l1lu5s$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_3wujvz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_3wujvz$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_355nu0$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrNull_ke1fvl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_ke1fvl$", function($receiver, index) { - return _.kotlin.collections.getOrNull_ke1fvl$($receiver, index); - }), elementAtOrNull_ucmip8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_ucmip8$", function($receiver, index) { - return _.kotlin.collections.getOrNull_ucmip8$($receiver, index); - }), elementAtOrNull_7naycm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_7naycm$", function($receiver, index) { - return _.kotlin.collections.getOrNull_7naycm$($receiver, index); - }), elementAtOrNull_tb5gmf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_tb5gmf$", function($receiver, index) { - return _.kotlin.collections.getOrNull_tb5gmf$($receiver, index); - }), elementAtOrNull_x09c4g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_x09c4g$", function($receiver, index) { - return _.kotlin.collections.getOrNull_x09c4g$($receiver, index); - }), elementAtOrNull_2e964m$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_2e964m$", function($receiver, index) { - return _.kotlin.collections.getOrNull_2e964m$($receiver, index); - }), elementAtOrNull_3qx2rv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_3qx2rv$", function($receiver, index) { - return _.kotlin.collections.getOrNull_3qx2rv$($receiver, index); - }), elementAtOrNull_rz0vgy$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_rz0vgy$", function($receiver, index) { - return _.kotlin.collections.getOrNull_rz0vgy$($receiver, index); - }), elementAtOrNull_cwi0e2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_cwi0e2$", function($receiver, index) { - return _.kotlin.collections.getOrNull_cwi0e2$($receiver, index); - }), find_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return element; - } - } - return null; - }), find_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), find_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), find_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return element; - } - } - return null; - }), find_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), find_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), find_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), find_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), find_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_dgtl0h$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_eg9ybj$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_964n92$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_i2lc78$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_74vioc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_tmsbgp$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_se6h4y$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_rjqrz0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_bvy38t$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_l1lu5s$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_355nu0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), first_eg9ybj$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_964n92$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_l1lu5s$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_355nu0$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), firstOrNull_eg9ybj$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_964n92$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_i2lc78$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_tmsbgp$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_se6h4y$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_rjqrz0$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_bvy38t$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_l1lu5s$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_355nu0$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), getOrElse_pgyyp0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_pgyyp0$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_eg9ybj$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_wdmei7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_wdmei7$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_964n92$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_ytfokv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_ytfokv$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_i2lc78$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_hvqa2x$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_hvqa2x$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_tmsbgp$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_37uoi9$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_37uoi9$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_se6h4y$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_t52ijz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_t52ijz$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_rjqrz0$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_sbr6cx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_sbr6cx$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_bvy38t$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_puwlef$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_puwlef$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_l1lu5s$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_3wujvz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_3wujvz$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_355nu0$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrNull_ke1fvl$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_eg9ybj$($receiver) ? $receiver[index] : null; - }, getOrNull_ucmip8$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_964n92$($receiver) ? $receiver[index] : null; - }, getOrNull_7naycm$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_i2lc78$($receiver) ? $receiver[index] : null; - }, getOrNull_tb5gmf$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_tmsbgp$($receiver) ? $receiver[index] : null; - }, getOrNull_x09c4g$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_se6h4y$($receiver) ? $receiver[index] : null; - }, getOrNull_2e964m$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_rjqrz0$($receiver) ? $receiver[index] : null; - }, getOrNull_3qx2rv$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_bvy38t$($receiver) ? $receiver[index] : null; - }, getOrNull_rz0vgy$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_l1lu5s$($receiver) ? $receiver[index] : null; - }, getOrNull_cwi0e2$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_355nu0$($receiver) ? $receiver[index] : null; - }, indexOf_ke19y6$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3, tmp$4, tmp$5, tmp$6, tmp$7; - if (element == null) { - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if ($receiver[index] == null) { - return index; - } - } - } else { - tmp$4 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$5 = tmp$4.first, tmp$6 = tmp$4.last, tmp$7 = tmp$4.step; - for (var index_0 = tmp$5;index_0 <= tmp$6;index_0 += tmp$7) { - if (Kotlin.equals(element, $receiver[index_0])) { - return index_0; - } - } - } - return-1; - }, indexOf_hgt5d7$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_964n92$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, indexOf_x27eb7$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_i2lc78$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, indexOf_tb5gmf$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_tmsbgp$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, indexOf_ssilt7$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_se6h4y$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element.equals_za3rmp$($receiver[index])) { - return index; - } - } - return-1; - }, indexOf_thi4tv$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_rjqrz0$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, indexOf_96a6a3$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_bvy38t$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, indexOf_bsmqrv$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_l1lu5s$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (Kotlin.equals(element, $receiver[index])) { - return index; - } - } - return-1; - }, indexOf_q79yhh$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_355nu0$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, indexOfFirst_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_1seo9s$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_964n92$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_pqtrl8$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_i2lc78$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_tmsbgp$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_c9nn9k$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_se6h4y$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_jp64to$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_rjqrz0$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_56tpji$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_bvy38t$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_n9o8rw$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_l1lu5s$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_mf0bwc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_355nu0$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_dgtl0h$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_eg9ybj$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_964n92$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_i2lc78$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_74vioc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_tmsbgp$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_se6h4y$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_rjqrz0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_bvy38t$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_l1lu5s$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_355nu0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), last_eg9ybj$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_eg9ybj$($receiver)]; - }, last_964n92$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_964n92$($receiver)]; - }, last_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_i2lc78$($receiver)]; - }, last_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_tmsbgp$($receiver)]; - }, last_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_se6h4y$($receiver)]; - }, last_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_rjqrz0$($receiver)]; - }, last_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_bvy38t$($receiver)]; - }, last_l1lu5s$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_l1lu5s$($receiver)]; - }, last_355nu0$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_355nu0$($receiver)]; - }, last_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_dgtl0h$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_eg9ybj$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_964n92$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_i2lc78$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_74vioc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_tmsbgp$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_se6h4y$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_rjqrz0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_bvy38t$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_l1lu5s$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_355nu0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), lastIndexOf_ke19y6$:function($receiver, element) { - var tmp$0, tmp$1; - if (element == null) { - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_eg9ybj$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if ($receiver[index] == null) { - return index; - } - } - } else { - tmp$1 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_eg9ybj$($receiver)).iterator(); - while (tmp$1.hasNext()) { - var index_0 = tmp$1.next(); - if (Kotlin.equals(element, $receiver[index_0])) { - return index_0; - } - } - } - return-1; - }, lastIndexOf_hgt5d7$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_964n92$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, lastIndexOf_x27eb7$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_i2lc78$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, lastIndexOf_tb5gmf$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_tmsbgp$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, lastIndexOf_ssilt7$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_se6h4y$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element.equals_za3rmp$($receiver[index])) { - return index; - } - } - return-1; - }, lastIndexOf_thi4tv$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_rjqrz0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, lastIndexOf_96a6a3$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_bvy38t$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, lastIndexOf_bsmqrv$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_l1lu5s$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (Kotlin.equals(element, $receiver[index])) { - return index; - } - } - return-1; - }, lastIndexOf_q79yhh$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_355nu0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, lastOrNull_eg9ybj$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_964n92$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_i2lc78$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_tmsbgp$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_se6h4y$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_rjqrz0$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_bvy38t$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_l1lu5s$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_355nu0$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_dgtl0h$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_eg9ybj$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_964n92$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_i2lc78$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_74vioc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_tmsbgp$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_se6h4y$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_rjqrz0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_bvy38t$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_l1lu5s$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_355nu0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), single_eg9ybj$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_964n92$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_i2lc78$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_tmsbgp$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_se6h4y$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_rjqrz0$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_bvy38t$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_l1lu5s$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_355nu0$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var single = null; - var found = false; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return(tmp$3 = single) == null || tmp$3 != null ? tmp$3 : Kotlin.throwCCE(); - }), single_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_1seo9s$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return typeof(tmp$1 = single) === "number" ? tmp$1 : Kotlin.throwCCE(); - }), single_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_pqtrl8$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return typeof(tmp$1 = single) === "number" ? tmp$1 : Kotlin.throwCCE(); - }), single_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var single = null; - var found = false; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return typeof(tmp$3 = single) === "number" ? tmp$3 : Kotlin.throwCCE(); - }), single_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_c9nn9k$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return Kotlin.isType(tmp$1 = single, Kotlin.Long) ? tmp$1 : Kotlin.throwCCE(); - }), single_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_jp64to$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return typeof(tmp$1 = single) === "number" ? tmp$1 : Kotlin.throwCCE(); - }), single_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_56tpji$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return typeof(tmp$1 = single) === "number" ? tmp$1 : Kotlin.throwCCE(); - }), single_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_n9o8rw$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return typeof(tmp$1 = single) === "boolean" ? tmp$1 : Kotlin.throwCCE(); - }), single_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_mf0bwc$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return Kotlin.isChar(tmp$1 = single) ? tmp$1 : Kotlin.throwCCE(); - }), singleOrNull_eg9ybj$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_964n92$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_i2lc78$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_tmsbgp$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_se6h4y$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_rjqrz0$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_bvy38t$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_l1lu5s$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_355nu0$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var single = null; - var found = false; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_1seo9s$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_pqtrl8$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var single = null; - var found = false; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_c9nn9k$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_jp64to$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_56tpji$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_n9o8rw$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_mf0bwc$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), drop_ke1fvl$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_ke1fvl$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_ucmip8$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_ucmip8$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_7naycm$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_7naycm$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_tb5gmf$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_tb5gmf$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_x09c4g$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_x09c4g$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_2e964m$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_2e964m$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_3qx2rv$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_3qx2rv$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_rz0vgy$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_rz0vgy$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_cwi0e2$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_cwi0e2$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_ke1fvl$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_ke1fvl$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_ucmip8$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_ucmip8$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_7naycm$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_7naycm$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_tb5gmf$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_tb5gmf$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_x09c4g$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_x09c4g$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_2e964m$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_2e964m$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_3qx2rv$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_3qx2rv$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_rz0vgy$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_rz0vgy$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_cwi0e2$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_cwi0e2$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLastWhile_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_dgtl0h$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_eg9ybj$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_ke1fvl$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_964n92$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_ucmip8$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_i2lc78$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_7naycm$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_74vioc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_tmsbgp$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_tb5gmf$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_se6h4y$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_x09c4g$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_rjqrz0$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_2e964m$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_bvy38t$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_3qx2rv$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_l1lu5s$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_rz0vgy$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_355nu0$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_cwi0e2$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropWhile_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_1seo9s$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_pqtrl8$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_c9nn9k$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_jp64to$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_56tpji$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_n9o8rw$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_mf0bwc$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), filter_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_dgtl0h$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_1seo9s$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_pqtrl8$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_74vioc$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_c9nn9k$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_jp64to$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_56tpji$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_n9o8rw$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_mf0bwc$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterIndexed_qy3he2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_qy3he2$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_vs9yol$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_vs9yol$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_sj8ypt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_sj8ypt$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_mb5uch$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_mb5uch$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_esogdp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_esogdp$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_vlcunz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_vlcunz$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_qd2zlp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_qd2zlp$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_5j3lt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_5j3lt$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_ke0vuh$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_ke0vuh$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_xjbu2f$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_xjbu2f$", function($receiver, destination, predicate) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_4r47cg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_4r47cg$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_lttaj6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_lttaj6$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_muamox$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_muamox$", function($receiver, destination, predicate) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_fhrm4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_fhrm4$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_nzxn4e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_nzxn4e$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_1tmjh1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_1tmjh1$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_t5hn6u$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_t5hn6u$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_80tdpi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_80tdpi$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIsInstance_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIsInstance_eg9ybj$", function(isR, $receiver) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (element == null || isR(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterIsInstanceTo_ajv5ds$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIsInstanceTo_ajv5ds$", function(isR, $receiver, destination) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (isR(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_dgtl0h$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_1seo9s$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_pqtrl8$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_74vioc$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_c9nn9k$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_jp64to$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_56tpji$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_n9o8rw$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_mf0bwc$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotNull_eg9ybj$:function($receiver) { - return _.kotlin.collections.filterNotNullTo_ajv5ds$($receiver, new Kotlin.ArrayList); - }, filterNotNullTo_ajv5ds$:function($receiver, destination) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (element != null) { - destination.add_za3rmp$(element); - } - } - return destination; - }, filterNotTo_hjvcb0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_hjvcb0$", function($receiver, destination, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_xaona3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_xaona3$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_czbilj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_czbilj$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_hufq5w$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_hufq5w$", function($receiver, destination, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_ejt5vl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_ejt5vl$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_a2xp8n$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_a2xp8n$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_py67j4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_py67j4$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_wtv3qz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_wtv3qz$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_xspnld$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_xspnld$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_hjvcb0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_hjvcb0$", function($receiver, destination, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_xaona3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_xaona3$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_czbilj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_czbilj$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_hufq5w$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_hufq5w$", function($receiver, destination, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_ejt5vl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_ejt5vl$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_a2xp8n$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_a2xp8n$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_py67j4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_py67j4$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_wtv3qz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_wtv3qz$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_xspnld$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_xspnld$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), slice_umgy94$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - return _.kotlin.collections.asList_eg9ybj$($receiver.slice(indices.start, indices.endInclusive + 1)); - }, slice_yhzrrx$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_jsa5ur$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_w9c7lc$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_n1ctuf$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_tf1fwd$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_z0313o$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_tur8s7$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_kwtr7z$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_k1z9y1$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_8bcmtu$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_z4poy4$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_tpf8wv$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_liqtfe$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_u6v72s$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_qp9dhh$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_4xk008$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_ia2tr4$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, sliceArray_b1ebut$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.nullArray($receiver, indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_n1pimy$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.numberArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_xl46hs$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.numberArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_5oi5bn$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.numberArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_11np7e$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.longArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_k9291c$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.numberArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_5ptw4x$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.numberArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_vreslo$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.booleanArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_yudz04$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.charArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_umgy94$:function($receiver, indices) { - if (indices.isEmpty()) { - return $receiver.slice(0, 0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_yhzrrx$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.numberArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_jsa5ur$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.numberArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_w9c7lc$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.numberArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_n1ctuf$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.longArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_tf1fwd$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.numberArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_z0313o$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.numberArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_tur8s7$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.booleanArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_kwtr7z$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.charArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, take_ke1fvl$:function($receiver, n) { - var tmp$0, tmp$1, tmp$2; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_eg9ybj$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_ucmip8$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_964n92$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_7naycm$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_i2lc78$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_tb5gmf$:function($receiver, n) { - var tmp$0, tmp$1, tmp$2; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_tmsbgp$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_x09c4g$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_se6h4y$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_2e964m$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_rjqrz0$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_3qx2rv$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_bvy38t$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_rz0vgy$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_l1lu5s$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_cwi0e2$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_355nu0$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, takeLast_ke1fvl$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_eg9ybj$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_ucmip8$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_964n92$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_7naycm$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_i2lc78$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_tb5gmf$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_tmsbgp$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_x09c4g$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_se6h4y$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_2e964m$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_rjqrz0$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_3qx2rv$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_bvy38t$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_rz0vgy$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_l1lu5s$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_cwi0e2$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_355nu0$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLastWhile_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_dgtl0h$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_eg9ybj$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_ke1fvl$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_eg9ybj$($receiver); - }), takeLastWhile_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_964n92$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_ucmip8$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_964n92$($receiver); - }), takeLastWhile_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_i2lc78$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_7naycm$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_i2lc78$($receiver); - }), takeLastWhile_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_74vioc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_tmsbgp$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_tb5gmf$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_tmsbgp$($receiver); - }), takeLastWhile_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_se6h4y$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_x09c4g$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_se6h4y$($receiver); - }), takeLastWhile_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_rjqrz0$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_2e964m$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_rjqrz0$($receiver); - }), takeLastWhile_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_bvy38t$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_3qx2rv$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_bvy38t$($receiver); - }), takeLastWhile_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_l1lu5s$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_rz0vgy$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_l1lu5s$($receiver); - }), takeLastWhile_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_355nu0$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_cwi0e2$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_355nu0$($receiver); - }), takeWhile_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_1seo9s$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_pqtrl8$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_c9nn9k$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_jp64to$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_56tpji$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_n9o8rw$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_mf0bwc$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), reverse_eg9ybj$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_964n92$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_964n92$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_i2lc78$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_tmsbgp$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_se6h4y$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_rjqrz0$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_bvy38t$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_l1lu5s$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_355nu0$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reversed_eg9ybj$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_eg9ybj$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_964n92$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_964n92$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_i2lc78$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_tmsbgp$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_se6h4y$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_rjqrz0$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_bvy38t$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_l1lu5s$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_l1lu5s$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_355nu0$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_355nu0$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversedArray_eg9ybj$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.nullArray($receiver, $receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_964n92$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.numberArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_964n92$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_i2lc78$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.numberArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_tmsbgp$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.numberArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_se6h4y$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.longArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_rjqrz0$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.numberArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_bvy38t$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.numberArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_l1lu5s$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.booleanArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_355nu0$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.charArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, sortBy_2kbc8r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortBy_2kbc8r$", function($receiver, selector) { - if ($receiver.length > 1) { - _.kotlin.collections.sortWith_pf0rc$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - } - }), sortByDescending_2kbc8r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortByDescending_2kbc8r$", function($receiver, selector) { - if ($receiver.length > 1) { - _.kotlin.collections.sortWith_pf0rc$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - } - }), sortDescending_ehvuiv$:function($receiver) { - _.kotlin.collections.sortWith_pf0rc$($receiver, _.kotlin.comparisons.reverseOrder()); - }, sortDescending_964n92$:function($receiver) { - if ($receiver.length > 1) { - Kotlin.primitiveArraySort($receiver); - _.kotlin.collections.reverse_964n92$($receiver); - } - }, sortDescending_i2lc78$:function($receiver) { - if ($receiver.length > 1) { - Kotlin.primitiveArraySort($receiver); - _.kotlin.collections.reverse_i2lc78$($receiver); - } - }, sortDescending_tmsbgp$:function($receiver) { - if ($receiver.length > 1) { - Kotlin.primitiveArraySort($receiver); - _.kotlin.collections.reverse_tmsbgp$($receiver); - } - }, sortDescending_se6h4y$:function($receiver) { - if ($receiver.length > 1) { - _.kotlin.collections.sort_se6h4y$($receiver); - _.kotlin.collections.reverse_se6h4y$($receiver); - } - }, sortDescending_rjqrz0$:function($receiver) { - if ($receiver.length > 1) { - Kotlin.primitiveArraySort($receiver); - _.kotlin.collections.reverse_rjqrz0$($receiver); - } - }, sortDescending_bvy38t$:function($receiver) { - if ($receiver.length > 1) { - Kotlin.primitiveArraySort($receiver); - _.kotlin.collections.reverse_bvy38t$($receiver); - } - }, sortDescending_355nu0$:function($receiver) { - if ($receiver.length > 1) { - Kotlin.primitiveArraySort($receiver); - _.kotlin.collections.reverse_355nu0$($receiver); - } - }, sorted_ehvuiv$:function($receiver) { - return _.kotlin.collections.asList_eg9ybj$(_.kotlin.collections.sortedArray_ehvuiv$($receiver)); - }, sorted_964n92$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_964n92$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sorted_i2lc78$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_i2lc78$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sorted_tmsbgp$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_tmsbgp$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sorted_se6h4y$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_se6h4y$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sorted_rjqrz0$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_rjqrz0$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sorted_bvy38t$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_bvy38t$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sorted_355nu0$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_355nu0$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedArray_ehvuiv$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sort_ehvuiv$($receiver_2); - return $receiver_2; - }, sortedArray_964n92$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_2); - return $receiver_2; - }, sortedArray_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_2); - return $receiver_2; - }, sortedArray_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_2); - return $receiver_2; - }, sortedArray_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sort_se6h4y$($receiver_2); - return $receiver_2; - }, sortedArray_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_2); - return $receiver_2; - }, sortedArray_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_2); - return $receiver_2; - }, sortedArray_355nu0$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_2); - return $receiver_2; - }, sortedArrayDescending_ehvuiv$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortWith_pf0rc$($receiver_2, _.kotlin.comparisons.reverseOrder()); - return $receiver_2; - }, sortedArrayDescending_964n92$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_964n92$($receiver_2); - return $receiver_2; - }, sortedArrayDescending_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_i2lc78$($receiver_2); - return $receiver_2; - }, sortedArrayDescending_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_tmsbgp$($receiver_2); - return $receiver_2; - }, sortedArrayDescending_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_se6h4y$($receiver_2); - return $receiver_2; - }, sortedArrayDescending_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_rjqrz0$($receiver_2); - return $receiver_2; - }, sortedArrayDescending_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_bvy38t$($receiver_2); - return $receiver_2; - }, sortedArrayDescending_355nu0$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_355nu0$($receiver_2); - return $receiver_2; - }, sortedArrayWith_pf0rc$:function($receiver, comparator) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortWith_pf0rc$($receiver_2, comparator); - return $receiver_2; - }, sortedBy_2kbc8r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_2kbc8r$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_pf0rc$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_lmseli$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_lmseli$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_g2jn7p$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_urwa3e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_urwa3e$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_bpm5rn$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_no6awq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_no6awq$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_naiwod$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_5sy41q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_5sy41q$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_jujh3x$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_mn0nhi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_mn0nhi$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_w3205p$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_7pamz8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_7pamz8$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_1f7czx$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_g2bjom$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_g2bjom$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_es41ir$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_xjz7li$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_xjz7li$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_r5s4t3$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedByDescending_2kbc8r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_2kbc8r$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_pf0rc$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_lmseli$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_lmseli$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_g2jn7p$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_urwa3e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_urwa3e$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_bpm5rn$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_no6awq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_no6awq$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_naiwod$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_5sy41q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_5sy41q$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_jujh3x$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_mn0nhi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_mn0nhi$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_w3205p$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_7pamz8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_7pamz8$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_1f7czx$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_g2bjom$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_g2bjom$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_es41ir$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_xjz7li$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_xjz7li$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_r5s4t3$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedDescending_ehvuiv$:function($receiver) { - return _.kotlin.collections.sortedWith_pf0rc$($receiver, _.kotlin.comparisons.reverseOrder()); - }, sortedDescending_964n92$:function($receiver) { - var $receiver_1 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_1); - return _.kotlin.collections.reversed_964n92$($receiver_1); - }, sortedDescending_i2lc78$:function($receiver) { - var $receiver_1 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_1); - return _.kotlin.collections.reversed_i2lc78$($receiver_1); - }, sortedDescending_tmsbgp$:function($receiver) { - var $receiver_1 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_1); - return _.kotlin.collections.reversed_tmsbgp$($receiver_1); - }, sortedDescending_se6h4y$:function($receiver) { - var $receiver_1 = $receiver.slice(); - _.kotlin.collections.sort_se6h4y$($receiver_1); - return _.kotlin.collections.reversed_se6h4y$($receiver_1); - }, sortedDescending_rjqrz0$:function($receiver) { - var $receiver_1 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_1); - return _.kotlin.collections.reversed_rjqrz0$($receiver_1); - }, sortedDescending_bvy38t$:function($receiver) { - var $receiver_1 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_1); - return _.kotlin.collections.reversed_bvy38t$($receiver_1); - }, sortedDescending_355nu0$:function($receiver) { - var $receiver_1 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_1); - return _.kotlin.collections.reversed_355nu0$($receiver_1); - }, sortedWith_pf0rc$:function($receiver, comparator) { - return _.kotlin.collections.asList_eg9ybj$(_.kotlin.collections.sortedArrayWith_pf0rc$($receiver, comparator)); - }, sortedWith_g2jn7p$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_964n92$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_bpm5rn$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_i2lc78$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_naiwod$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_tmsbgp$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_jujh3x$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_se6h4y$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_w3205p$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_rjqrz0$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_1f7czx$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_bvy38t$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_es41ir$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_l1lu5s$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_r5s4t3$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_355nu0$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, get_indices_eg9ybj$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_eg9ybj$($receiver)); - }}, get_indices_964n92$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_964n92$($receiver)); - }}, get_indices_i2lc78$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_i2lc78$($receiver)); - }}, get_indices_tmsbgp$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_tmsbgp$($receiver)); - }}, get_indices_se6h4y$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_se6h4y$($receiver)); - }}, get_indices_rjqrz0$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_rjqrz0$($receiver)); - }}, get_indices_bvy38t$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_bvy38t$($receiver)); - }}, get_indices_l1lu5s$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_l1lu5s$($receiver)); - }}, get_indices_355nu0$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_355nu0$($receiver)); - }}, isEmpty_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_eg9ybj$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_964n92$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_i2lc78$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_tmsbgp$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_se6h4y$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_rjqrz0$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_bvy38t$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_l1lu5s$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_355nu0$", function($receiver) { - return $receiver.length === 0; - }), isNotEmpty_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_eg9ybj$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_964n92$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_i2lc78$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_tmsbgp$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_se6h4y$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_rjqrz0$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_bvy38t$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_l1lu5s$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_355nu0$", function($receiver) { - return!($receiver.length === 0); - }), get_lastIndex_eg9ybj$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_964n92$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_i2lc78$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_tmsbgp$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_se6h4y$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_rjqrz0$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_bvy38t$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_l1lu5s$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_355nu0$:{value:function($receiver) { - return $receiver.length - 1; - }}, toBooleanArray_7y31dn$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.booleanArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toByteArray_mgx7ed$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.numberArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toCharArray_moaglf$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.charArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toDoubleArray_hb77ya$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.numberArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toFloatArray_wafl1t$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.numberArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toIntArray_eko7cy$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.numberArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toLongArray_r1royx$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.longArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toShortArray_ekmd3j$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.numberArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, associate_8vmyt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_8vmyt$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_tgl7q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_tgl7q$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_e2sx9i$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_e2sx9i$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_xlvinu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_xlvinu$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_tk5abm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_tk5abm$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_h6wt46$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_h6wt46$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_fifeb0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_fifeb0$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_3tjkyu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_3tjkyu$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_359jka$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_359jka$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateBy_rie7ol$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_rie7ol$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_g2md44$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_g2md44$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_k6apf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_k6apf4$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_x640pc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_x640pc$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_uqemus$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_uqemus$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_xtltf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_xtltf4$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_r03ely$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_r03ely$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_msp2nk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_msp2nk$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_6rjtds$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_6rjtds$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_w3c4fn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_w3c4fn$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_px3eju$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_px3eju$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_1kbpp4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_1kbpp4$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_roawnf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_roawnf$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_ktcn5y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_ktcn5y$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_x5l9ko$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_x5l9ko$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_5h63vp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_5h63vp$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_3yyqis$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_3yyqis$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_bixbbo$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_bixbbo$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_xn9vqz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_xn9vqz$", function($receiver, destination, keySelector) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_l102rk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_l102rk$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_75gvpc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_75gvpc$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_en2rcd$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_en2rcd$", function($receiver, destination, keySelector) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_gbiqoc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_gbiqoc$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_t143fk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_t143fk$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_fbozex$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_fbozex$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_83ixn8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_83ixn8$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_wnqwum$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_wnqwum$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_6dagur$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_6dagur$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_3dm5x2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_3dm5x2$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_7cumig$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_7cumig$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_f2qsrv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_f2qsrv$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_9mh1ly$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_9mh1ly$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_j7feqg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_j7feqg$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_uv5qij$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_uv5qij$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_fdk0po$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_fdk0po$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_my3tn0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_my3tn0$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateTo_m765wl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_m765wl$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_aa8jay$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_aa8jay$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_ympge2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_ympge2$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_qnwrru$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_qnwrru$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_flvp0e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_flvp0e$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_616w56$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_616w56$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_jxocj8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_jxocj8$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_wfiona$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_wfiona$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_5nnqga$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_5nnqga$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), toCollection_ajv5ds$:function($receiver, destination) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_ay7s2l$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_abmk3v$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_aws6s5$:function($receiver, destination) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_uqoool$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_2jmgtx$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_yloohh$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_a59y9h$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_9hvz9d$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toHashSet_eg9ybj$:function($receiver) { - return _.kotlin.collections.toCollection_ajv5ds$($receiver, new Kotlin.ComplexHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_964n92$:function($receiver) { - return _.kotlin.collections.toCollection_ay7s2l$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_i2lc78$:function($receiver) { - return _.kotlin.collections.toCollection_abmk3v$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_tmsbgp$:function($receiver) { - return _.kotlin.collections.toCollection_aws6s5$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_se6h4y$:function($receiver) { - return _.kotlin.collections.toCollection_uqoool$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_rjqrz0$:function($receiver) { - return _.kotlin.collections.toCollection_2jmgtx$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_bvy38t$:function($receiver) { - return _.kotlin.collections.toCollection_yloohh$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_l1lu5s$:function($receiver) { - return _.kotlin.collections.toCollection_a59y9h$($receiver, new Kotlin.PrimitiveBooleanHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_355nu0$:function($receiver) { - return _.kotlin.collections.toCollection_9hvz9d$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toList_eg9ybj$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_eg9ybj$($receiver); - } - } - return tmp$1; - }, toList_964n92$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_964n92$($receiver); - } - } - return tmp$1; - }, toList_i2lc78$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_i2lc78$($receiver); - } - } - return tmp$1; - }, toList_tmsbgp$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_tmsbgp$($receiver); - } - } - return tmp$1; - }, toList_se6h4y$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_se6h4y$($receiver); - } - } - return tmp$1; - }, toList_rjqrz0$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_rjqrz0$($receiver); - } - } - return tmp$1; - }, toList_bvy38t$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_bvy38t$($receiver); - } - } - return tmp$1; - }, toList_l1lu5s$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_l1lu5s$($receiver); - } - } - return tmp$1; - }, toList_355nu0$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_355nu0$($receiver); - } - } - return tmp$1; - }, toMutableList_eg9ybj$:function($receiver) { - return _.java.util.ArrayList_wtfk93$(_.kotlin.collections.asCollection($receiver)); - }, toMutableList_964n92$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toMutableList_i2lc78$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toMutableList_tmsbgp$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - list.add_za3rmp$(item); - } - return list; - }, toMutableList_se6h4y$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toMutableList_rjqrz0$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toMutableList_bvy38t$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toMutableList_l1lu5s$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toMutableList_355nu0$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toSet_eg9ybj$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_ajv5ds$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_964n92$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_ay7s2l$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_i2lc78$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_abmk3v$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_tmsbgp$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_aws6s5$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_se6h4y$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_uqoool$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_rjqrz0$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_2jmgtx$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_bvy38t$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_yloohh$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_l1lu5s$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_a59y9h$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_355nu0$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_9hvz9d$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, flatMap_9lt8ay$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_9lt8ay$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_3mjriv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_3mjriv$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_bh8vgr$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_bh8vgr$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_f8uktn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_f8uktn$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_2nev2p$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_2nev2p$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_d20dhn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_d20dhn$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_y2hta3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_y2hta3$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_ikx8ln$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_ikx8ln$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_986epn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_986epn$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_snzct$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_snzct$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_8oemzk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_8oemzk$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_kihasu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_kihasu$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_2puvzs$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_2puvzs$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_clttnk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_clttnk$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_pj001a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_pj001a$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_rtxif4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_rtxif4$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_812y0a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_812y0a$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_4mn2jk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_4mn2jk$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), groupBy_rie7ol$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_rie7ol$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_g2md44$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_g2md44$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_k6apf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_k6apf4$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_x640pc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_x640pc$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_uqemus$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_uqemus$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_xtltf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_xtltf4$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_r03ely$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_r03ely$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_msp2nk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_msp2nk$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_6rjtds$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_6rjtds$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_w3c4fn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_w3c4fn$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_px3eju$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_px3eju$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_1kbpp4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_1kbpp4$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_roawnf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_roawnf$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_ktcn5y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_ktcn5y$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_x5l9ko$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_x5l9ko$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_5h63vp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_5h63vp$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_3yyqis$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_3yyqis$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_bixbbo$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_bixbbo$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_uwewbq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_uwewbq$", function($receiver, destination, keySelector) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_i9dcot$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_i9dcot$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_y8hm29$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_y8hm29$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_3veyxd$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_3veyxd$", function($receiver, destination, keySelector) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_ht8exh$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_ht8exh$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_67q775$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_67q775$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_agwn6d$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_agwn6d$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_iwlqrz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_iwlqrz$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_udsjtt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_udsjtt$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_h5lvbm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_h5lvbm$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_col8dz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_col8dz$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_152lxl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_152lxl$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_2mlql2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_2mlql2$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_bnbmqj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_bnbmqj$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_lix5qv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_lix5qv$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_6o498c$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_6o498c$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_p4mhb1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_p4mhb1$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_ghv9wz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_ghv9wz$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), map_rie7ol$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_rie7ol$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_g2md44$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_g2md44$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_k6apf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_k6apf4$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_x640pc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_x640pc$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_uqemus$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_uqemus$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_xtltf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_xtltf4$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_r03ely$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_r03ely$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_msp2nk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_msp2nk$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_6rjtds$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_6rjtds$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapIndexed_d6xsp2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_d6xsp2$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_8jepyn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_8jepyn$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_wnrzaz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_wnrzaz$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_yva9b9$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_yva9b9$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_jr48ix$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_jr48ix$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_3bjddx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_3bjddx$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_7c4mm7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_7c4mm7$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_y1gkw5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_y1gkw5$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_t492ff$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_t492ff$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedNotNull_d6xsp2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedNotNull_d6xsp2$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - var tmp$3; - (tmp$3 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$3) : null; - } - return destination; - }), mapIndexedNotNullTo_dlwz7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedNotNullTo_dlwz7$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - var tmp$3; - (tmp$3 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$3) : null; - } - return destination; - }), mapIndexedTo_dlwz7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_dlwz7$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_nikm7u$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_nikm7u$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_bkzh1a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_bkzh1a$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_c7wlwo$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_c7wlwo$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_312cqi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_312cqi$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_ndq9q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_ndq9q$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_t1nf4q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_t1nf4q$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_yhbe06$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_yhbe06$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_u7did6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_u7did6$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapNotNull_rie7ol$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapNotNull_rie7ol$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var tmp$3; - (tmp$3 = transform(element)) != null ? destination.add_za3rmp$(tmp$3) : null; - } - return destination; - }), mapNotNullTo_b5g94o$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapNotNullTo_b5g94o$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var tmp$3; - (tmp$3 = transform(element)) != null ? destination.add_za3rmp$(tmp$3) : null; - } - return destination; - }), mapTo_b5g94o$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_b5g94o$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_y9zzej$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_y9zzej$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_finokt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_finokt$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_qgiq1f$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_qgiq1f$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_g8ovid$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_g8ovid$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_j2zksz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_j2zksz$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_u6234r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_u6234r$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_yuho05$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_yuho05$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_1u018b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_1u018b$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), withIndex_eg9ybj$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_eg9ybj$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_eg9ybj$f($receiver)); - }, withIndex_964n92$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_964n92$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_964n92$f($receiver)); - }, withIndex_i2lc78$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_i2lc78$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_i2lc78$f($receiver)); - }, withIndex_tmsbgp$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_tmsbgp$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_tmsbgp$f($receiver)); - }, withIndex_se6h4y$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_se6h4y$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_se6h4y$f($receiver)); - }, withIndex_rjqrz0$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_rjqrz0$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_rjqrz0$f($receiver)); - }, withIndex_bvy38t$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_bvy38t$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_bvy38t$f($receiver)); - }, withIndex_l1lu5s$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_l1lu5s$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_l1lu5s$f($receiver)); - }, withIndex_355nu0$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_355nu0$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_355nu0$f($receiver)); - }, distinct_eg9ybj$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_eg9ybj$($receiver)); - }, distinct_964n92$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_964n92$($receiver)); - }, distinct_i2lc78$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_i2lc78$($receiver)); - }, distinct_tmsbgp$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_tmsbgp$($receiver)); - }, distinct_se6h4y$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_se6h4y$($receiver)); - }, distinct_rjqrz0$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_rjqrz0$($receiver)); - }, distinct_bvy38t$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_bvy38t$($receiver)); - }, distinct_l1lu5s$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_l1lu5s$($receiver)); - }, distinct_355nu0$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_355nu0$($receiver)); - }, distinctBy_rie7ol$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_rie7ol$", function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var e = tmp$0[tmp$2]; - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_g2md44$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_g2md44$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_k6apf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_k6apf4$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_x640pc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_x640pc$", function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var e = tmp$0[tmp$2]; - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_uqemus$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_uqemus$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_xtltf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_xtltf4$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_r03ely$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_r03ely$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_msp2nk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_msp2nk$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_6rjtds$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_6rjtds$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), intersect_k1u664$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_eg9ybj$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_q8x1w7$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_964n92$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_gi9hh5$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_i2lc78$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_tpf8wv$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_tmsbgp$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_rwqrtj$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_se6h4y$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_v8iop3$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_rjqrz0$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_7a8nt5$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_bvy38t$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_6ly3kh$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_l1lu5s$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_1h1v6f$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_355nu0$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, subtract_k1u664$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_eg9ybj$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_q8x1w7$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_964n92$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_gi9hh5$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_i2lc78$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_tpf8wv$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_tmsbgp$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_rwqrtj$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_se6h4y$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_v8iop3$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_rjqrz0$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_7a8nt5$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_bvy38t$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_6ly3kh$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_l1lu5s$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_1h1v6f$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_355nu0$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, toMutableSet_eg9ybj$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_964n92$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_i2lc78$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_tmsbgp$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_se6h4y$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_rjqrz0$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_bvy38t$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_l1lu5s$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_355nu0$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, union_k1u664$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_eg9ybj$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_q8x1w7$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_964n92$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_gi9hh5$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_i2lc78$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_tpf8wv$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_tmsbgp$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_rwqrtj$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_se6h4y$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_v8iop3$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_rjqrz0$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_7a8nt5$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_bvy38t$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_6ly3kh$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_l1lu5s$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_1h1v6f$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_355nu0$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, all_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!predicate(element)) { - return false; - } - } - return true; - }), all_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), all_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), all_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!predicate(element)) { - return false; - } - } - return true; - }), all_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), all_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), all_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), all_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), all_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), any_eg9ybj$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - return true; - } - return false; - }, any_964n92$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_i2lc78$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_tmsbgp$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - return true; - } - return false; - }, any_se6h4y$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_rjqrz0$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_bvy38t$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_l1lu5s$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_355nu0$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return true; - } - } - return false; - }), any_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), any_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), any_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return true; - } - } - return false; - }), any_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), any_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), any_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), any_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), any_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), count_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_eg9ybj$", function($receiver) { - return $receiver.length; - }), count_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_964n92$", function($receiver) { - return $receiver.length; - }), count_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_i2lc78$", function($receiver) { - return $receiver.length; - }), count_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_tmsbgp$", function($receiver) { - return $receiver.length; - }), count_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_se6h4y$", function($receiver) { - return $receiver.length; - }), count_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_rjqrz0$", function($receiver) { - return $receiver.length; - }), count_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_bvy38t$", function($receiver) { - return $receiver.length; - }), count_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_l1lu5s$", function($receiver) { - return $receiver.length; - }), count_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_355nu0$", function($receiver) { - return $receiver.length; - }), count_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - count++; - } - } - return count; - }), count_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_1seo9s$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), count_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_pqtrl8$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), count_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - count++; - } - } - return count; - }), count_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_c9nn9k$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), count_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_jp64to$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), count_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_56tpji$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), count_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_n9o8rw$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), count_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_mf0bwc$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), fold_pshek8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_pshek8$", function($receiver, initial, operation) { - var tmp$0, tmp$1, tmp$2; - var accumulator = initial; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_pqv817$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_pqv817$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_9mm9fh$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_9mm9fh$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_5dqkgz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_5dqkgz$", function($receiver, initial, operation) { - var tmp$0, tmp$1, tmp$2; - var accumulator = initial; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_re4yqz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_re4yqz$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_t23qwz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_t23qwz$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_8pmi6j$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_8pmi6j$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_86qr6z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_86qr6z$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_xpqlgr$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_xpqlgr$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), foldIndexed_gmwb6l$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_gmwb6l$", function($receiver, initial, operation) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - var accumulator = initial; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_jy2lti$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_jy2lti$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_xco1ea$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_xco1ea$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_qjubp4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_qjubp4$", function($receiver, initial, operation) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - var accumulator = initial; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_8ys392$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_8ys392$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_pljay6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_pljay6$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_8s951y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_8s951y$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_w9wt4a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_w9wt4a$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_5d3uiy$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_5d3uiy$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldRight_pshek8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_pshek8$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_af40en$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_af40en$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_964n92$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_w1nri5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_w1nri5$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_fwp7kz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_fwp7kz$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_8g1vz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_8g1vz$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_tb9j25$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_tb9j25$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_5fhoof$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_5fhoof$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_n2j045$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_n2j045$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_6kfpv5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_6kfpv5$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRightIndexed_gmwb6l$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_gmwb6l$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_g7wmmc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_g7wmmc$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_964n92$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_f9eii6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_f9eii6$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_xyb360$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_xyb360$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_insxdw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_insxdw$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_wrtz0y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_wrtz0y$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_5cv1t0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_5cv1t0$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_7hxhjq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_7hxhjq$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_wieq4k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_wieq4k$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), forEach_5wd4f$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_5wd4f$", function($receiver, action) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - action(element); - } - }), forEach_qhbdc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_qhbdc$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEach_e5s73w$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_e5s73w$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEach_xiw8tg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_xiw8tg$", function($receiver, action) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - action(element); - } - }), forEach_tn4k60$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_tn4k60$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEach_h9w2yk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_h9w2yk$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEach_fleo5e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_fleo5e$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEach_3wiut8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_3wiut8$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEach_32a9pw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_32a9pw$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEachIndexed_gwl0xm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_gwl0xm$", function($receiver, action) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - action(index++, item); - } - }), forEachIndexed_jprgez$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_jprgez$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), forEachIndexed_ici84x$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_ici84x$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), forEachIndexed_f65lpr$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_f65lpr$", function($receiver, action) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - action(index++, item); - } - }), forEachIndexed_qmdk59$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_qmdk59$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), forEachIndexed_vlkvnz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_vlkvnz$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), forEachIndexed_enmwj1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_enmwj1$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), forEachIndexed_aiefap$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_aiefap$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), forEachIndexed_l1n7qv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_l1n7qv$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), max_ehvuiv$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (Kotlin.compareTo(max, e) < 0) { - max = e; - } - } - return max; - }, max_964n92$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max < e) { - max = e; - } - } - return max; - }, max_i2lc78$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max < e) { - max = e; - } - } - return max; - }, max_tmsbgp$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max < e) { - max = e; - } - } - return max; - }, max_se6h4y$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max.compareTo_za3rmp$(e) < 0) { - max = e; - } - } - return max; - }, max_rjqrz0$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max < e) { - max = e; - } - } - return max; - }, max_bvy38t$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max < e) { - max = e; - } - } - return max; - }, max_355nu0$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max < e) { - max = e; - } - } - return max; - }, maxBy_2kbc8r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_2kbc8r$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_lmseli$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_lmseli$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_urwa3e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_urwa3e$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_no6awq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_no6awq$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_5sy41q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_5sy41q$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_mn0nhi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_mn0nhi$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_7pamz8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_7pamz8$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_g2bjom$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_g2bjom$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_xjz7li$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_xjz7li$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxWith_pf0rc$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_g2jn7p$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_bpm5rn$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_naiwod$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_jujh3x$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_w3205p$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_1f7czx$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_es41ir$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_r5s4t3$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, min_ehvuiv$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (Kotlin.compareTo(min, e) > 0) { - min = e; - } - } - return min; - }, min_964n92$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min > e) { - min = e; - } - } - return min; - }, min_i2lc78$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min > e) { - min = e; - } - } - return min; - }, min_tmsbgp$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min > e) { - min = e; - } - } - return min; - }, min_se6h4y$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min.compareTo_za3rmp$(e) > 0) { - min = e; - } - } - return min; - }, min_rjqrz0$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min > e) { - min = e; - } - } - return min; - }, min_bvy38t$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min > e) { - min = e; - } - } - return min; - }, min_355nu0$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min > e) { - min = e; - } - } - return min; - }, minBy_2kbc8r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_2kbc8r$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_lmseli$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_lmseli$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_urwa3e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_urwa3e$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_no6awq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_no6awq$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_5sy41q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_5sy41q$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_mn0nhi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_mn0nhi$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_7pamz8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_7pamz8$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_g2bjom$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_g2bjom$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_xjz7li$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_xjz7li$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minWith_pf0rc$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_g2jn7p$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_bpm5rn$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_naiwod$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_jujh3x$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_w3205p$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_1f7czx$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_es41ir$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_r5s4t3$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, none_eg9ybj$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - return false; - } - return true; - }, none_964n92$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_i2lc78$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_tmsbgp$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - return false; - } - return true; - }, none_se6h4y$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_rjqrz0$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_bvy38t$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_l1lu5s$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_355nu0$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return false; - } - } - return true; - }), none_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), none_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), none_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return false; - } - } - return true; - }), none_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), none_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), none_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), none_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), none_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), reduce_lkiuaf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_lkiuaf$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_8rebxu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_8rebxu$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_pwt076$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_pwt076$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_yv55jc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_yv55jc$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_5c5tpi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_5c5tpi$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_i6ldku$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_i6ldku$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_cutd5o$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_cutd5o$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_w96cka$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_w96cka$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_nazham$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_nazham$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_9qa3fw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_9qa3fw$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_xe3tfn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_xe3tfn$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_vhxmnd$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_vhxmnd$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_r0o6e5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_r0o6e5$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_uzo0it$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_uzo0it$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_nqrynd$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_nqrynd$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_gqpg33$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_gqpg33$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_v2dtf3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_v2dtf3$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_1pqzxj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_1pqzxj$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceRight_lkiuaf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_lkiuaf$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_8rebxu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_8rebxu$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_964n92$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_pwt076$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_pwt076$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_yv55jc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_yv55jc$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_5c5tpi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_5c5tpi$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_i6ldku$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_i6ldku$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_cutd5o$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_cutd5o$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_w96cka$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_w96cka$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_nazham$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_nazham$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRightIndexed_9qa3fw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_9qa3fw$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_xe3tfn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_xe3tfn$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_964n92$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_vhxmnd$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_vhxmnd$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_r0o6e5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_r0o6e5$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_uzo0it$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_uzo0it$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_nqrynd$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_nqrynd$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_gqpg33$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_gqpg33$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_v2dtf3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_v2dtf3$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_1pqzxj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_1pqzxj$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), sumBy_ri93wo$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_ri93wo$", function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += selector(element); - } - return sum; - }), sumBy_g2h9c7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_g2h9c7$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumBy_k65ln7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_k65ln7$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumBy_x5ywxf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_x5ywxf$", function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += selector(element); - } - return sum; - }), sumBy_uqjqmp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_uqjqmp$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumBy_xtgpn7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_xtgpn7$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumBy_qzyau1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_qzyau1$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumBy_msjyvn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_msjyvn$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumBy_6rox5p$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_6rox5p$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_jubvhg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_jubvhg$", function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += selector(element); - } - return sum; - }), sumByDouble_wd5ypp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_wd5ypp$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_5p59zj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_5p59zj$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_55ogr5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_55ogr5$", function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += selector(element); - } - return sum; - }), sumByDouble_wthnh1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_wthnh1$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_f248nj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_f248nj$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_y6x5hx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_y6x5hx$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_ltfntb$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_ltfntb$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_3iivbz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_3iivbz$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), requireNoNulls_eg9ybj$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (element == null) { - throw new Kotlin.IllegalArgumentException("null element found in " + $receiver + "."); - } - } - return Array.isArray(tmp$3 = $receiver) ? tmp$3 : Kotlin.throwCCE(); - }, partition_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_1seo9s$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_pqtrl8$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_c9nn9k$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_jp64to$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_56tpji$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_n9o8rw$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_mf0bwc$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), zip_741p1q$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_nrhj8n$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_ika9yl$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_1nxere$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_7q8x59$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_uckx6b$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_9gp42m$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_yey03l$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_zemuah$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_2rmu0o$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_2rmu0o$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_4t7xkx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_4t7xkx$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_em1vhp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_em1vhp$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_uo1iqb$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_uo1iqb$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_9x7n3z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_9x7n3z$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_49cwib$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_49cwib$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_9xp40v$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_9xp40v$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_pnti4b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_pnti4b$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_b8vhfj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_b8vhfj$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_k1u664$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_8bhqlr$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_z4usq1$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_tpkcos$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_lilpnh$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_u6q3av$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_qp49pk$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_4xew8b$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_ia7xj1$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_wdyzkq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_wdyzkq$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_1w04c7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_1w04c7$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_gpk9wx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_gpk9wx$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_i6q5r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_i6q5r$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_4n0ikv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_4n0ikv$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_j1q8tt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_j1q8tt$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_wmo9n$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_wmo9n$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_rz83z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_rz83z$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_ha4syt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_ha4syt$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_1033ji$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_phu9d2$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_e0lu4g$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_7caxwu$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_p55a6y$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_bo3qya$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_xju7f2$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_ak8uzy$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_9zfo4u$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_9zfo4u$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_xs8ib4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_xs8ib4$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_mp4cls$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_mp4cls$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_83qj9u$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_83qj9u$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_kxvwwg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_kxvwwg$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_g1c01a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_g1c01a$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_ujqlps$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_ujqlps$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_grqpda$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_grqpda$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), joinTo_7uchso$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0, tmp$1, tmp$2; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element == null ? "null" : element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_barwct$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_2qnkcz$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_w9i6k3$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0, tmp$1, tmp$2; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_ac0spn$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_a0zr9v$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_5dssjp$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_q1okz1$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_at1d3j$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinToString_qtax42$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_7uchso$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_k0u3cz$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_barwct$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_av5xiv$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_2qnkcz$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_gctiqr$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_w9i6k3$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_kp0x6r$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_ac0spn$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_92s1ft$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_a0zr9v$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_47ib1f$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_5dssjp$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_tyzo35$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_q1okz1$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_d1dl19$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_at1d3j$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, asIterable_eg9ybj$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_eg9ybj$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_eg9ybj$f($receiver)); - }, asIterable_964n92$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_964n92$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_964n92$f($receiver)); - }, asIterable_i2lc78$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_i2lc78$f($receiver)); - }, asIterable_tmsbgp$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_tmsbgp$f($receiver)); - }, asIterable_se6h4y$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_se6h4y$f($receiver)); - }, asIterable_rjqrz0$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_rjqrz0$f($receiver)); - }, asIterable_bvy38t$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_bvy38t$f($receiver)); - }, asIterable_l1lu5s$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_l1lu5s$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_l1lu5s$f($receiver)); - }, asIterable_355nu0$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_355nu0$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_355nu0$f($receiver)); - }, asSequence_eg9ybj$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_eg9ybj$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_eg9ybj$f($receiver)); - }, asSequence_964n92$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_964n92$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_964n92$f($receiver)); - }, asSequence_i2lc78$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_i2lc78$f($receiver)); - }, asSequence_tmsbgp$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_tmsbgp$f($receiver)); - }, asSequence_se6h4y$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_se6h4y$f($receiver)); - }, asSequence_rjqrz0$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_rjqrz0$f($receiver)); - }, asSequence_bvy38t$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_bvy38t$f($receiver)); - }, asSequence_l1lu5s$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_l1lu5s$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_l1lu5s$f($receiver)); - }, asSequence_355nu0$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_355nu0$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_355nu0$f($receiver)); - }, average_mgx7ed$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_ekmd3j$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_eko7cy$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_r1royx$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_wafl1t$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_hb77ya$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_964n92$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_i2lc78$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_tmsbgp$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_se6h4y$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_rjqrz0$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_bvy38t$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, sum_mgx7ed$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - } - return sum; - }, sum_ekmd3j$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - } - return sum; - }, sum_eko7cy$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - } - return sum; - }, sum_r1royx$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = Kotlin.Long.ZERO; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum = sum.add(element); - } - return sum; - }, sum_wafl1t$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - } - return sum; - }, sum_hb77ya$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - } - return sum; - }, sum_964n92$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_i2lc78$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_tmsbgp$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - } - return sum; - }, sum_se6h4y$:function($receiver) { - var tmp$0; - var sum = Kotlin.Long.ZERO; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum = sum.add(element); - } - return sum; - }, sum_rjqrz0$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_bvy38t$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, component1_a7ptmv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_a7ptmv$", function($receiver) { - return $receiver.get_za3lpa$(0); - }), component2_a7ptmv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_a7ptmv$", function($receiver) { - return $receiver.get_za3lpa$(1); - }), component3_a7ptmv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_a7ptmv$", function($receiver) { - return $receiver.get_za3lpa$(2); - }), component4_a7ptmv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_a7ptmv$", function($receiver) { - return $receiver.get_za3lpa$(3); - }), component5_a7ptmv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_a7ptmv$", function($receiver) { - return $receiver.get_za3lpa$(4); - }), contains_cwuzrm$:function($receiver, element) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return $receiver.contains_za3rmp$(element); - } - return _.kotlin.collections.indexOf_cwuzrm$($receiver, element) >= 0; - }, elementAt_cwv5p1$f:function(closure$index) { - return function(it) { - throw new Kotlin.IndexOutOfBoundsException("Collection doesn't contain element at index " + closure$index + "."); - }; - }, elementAt_cwv5p1$:function($receiver, index) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return $receiver.get_za3lpa$(index); - } - return _.kotlin.collections.elementAtOrElse_1h02b4$($receiver, index, _.kotlin.collections.elementAt_cwv5p1$f(index)); - }, elementAt_3iu80n$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_3iu80n$", function($receiver, index) { - return $receiver.get_za3lpa$(index); - }), elementAtOrElse_1h02b4$:function($receiver, index, defaultValue) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_a7ptmv$($receiver) ? $receiver.get_za3lpa$(index) : defaultValue(index); - } - if (index < 0) { - return defaultValue(index); - } - var iterator = $receiver.iterator(); - var count = 0; - while (iterator.hasNext()) { - var element = iterator.next(); - if (index === count++) { - return element; - } - } - return defaultValue(index); - }, elementAtOrElse_vup1yc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_vup1yc$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_a7ptmv$($receiver) ? $receiver.get_za3lpa$(index) : defaultValue(index); - }), elementAtOrNull_cwv5p1$:function($receiver, index) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return _.kotlin.collections.getOrNull_3iu80n$($receiver, index); - } - if (index < 0) { - return null; - } - var iterator = $receiver.iterator(); - var count = 0; - while (iterator.hasNext()) { - var element = iterator.next(); - if (index === count++) { - return element; - } - } - return null; - }, elementAtOrNull_3iu80n$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_3iu80n$", function($receiver, index) { - return _.kotlin.collections.getOrNull_3iu80n$($receiver, index); - }), find_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_udlcbx$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_udlcbx$", function($receiver, predicate) { - var tmp$0; - var last = null; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - last = element; - } - } - return last; - }), findLast_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_ymzesn$", function($receiver, predicate) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - var element = iterator.previous(); - if (predicate(element)) { - return element; - } - } - return null; - }), first_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return _.kotlin.collections.first_a7ptmv$($receiver); - } else { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.NoSuchElementException("Collection is empty."); - } - return iterator.next(); - } - }, first_a7ptmv$:function($receiver) { - if ($receiver.isEmpty()) { - throw new Kotlin.NoSuchElementException("List is empty."); - } - return $receiver.get_za3lpa$(0); - }, first_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_udlcbx$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Collection contains no element matching the predicate."); - }), firstOrNull_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - if ($receiver.isEmpty()) { - return null; - } else { - return $receiver.get_za3lpa$(0); - } - } else { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - return iterator.next(); - } - }, firstOrNull_a7ptmv$:function($receiver) { - return $receiver.isEmpty() ? null : $receiver.get_za3lpa$(0); - }, firstOrNull_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_udlcbx$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), getOrElse_vup1yc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_vup1yc$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_a7ptmv$($receiver) ? $receiver.get_za3lpa$(index) : defaultValue(index); - }), getOrNull_3iu80n$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_a7ptmv$($receiver) ? $receiver.get_za3lpa$(index) : null; - }, indexOf_cwuzrm$:function($receiver, element) { - var tmp$0; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return $receiver.indexOf_za3rmp$(element); - } - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (Kotlin.equals(element, item)) { - return index; - } - index++; - } - return-1; - }, indexOf_3iudy2$:function($receiver, element) { - return $receiver.indexOf_za3rmp$(element); - }, indexOfFirst_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_udlcbx$", function($receiver, predicate) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(item)) { - return index; - } - index++; - } - return-1; - }), indexOfFirst_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_ymzesn$", function($receiver, predicate) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(item)) { - return index; - } - index++; - } - return-1; - }), indexOfLast_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_udlcbx$", function($receiver, predicate) { - var tmp$0; - var lastIndex = -1; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(item)) { - lastIndex = index; - } - index++; - } - return lastIndex; - }), indexOfLast_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_ymzesn$", function($receiver, predicate) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - if (predicate(iterator.previous())) { - return iterator.nextIndex(); - } - } - return-1; - }), last_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return _.kotlin.collections.last_a7ptmv$($receiver); - } else { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.NoSuchElementException("Collection is empty."); - } - var last = iterator.next(); - while (iterator.hasNext()) { - last = iterator.next(); - } - return last; - } - }, last_a7ptmv$:function($receiver) { - if ($receiver.isEmpty()) { - throw new Kotlin.NoSuchElementException("List is empty."); - } - return $receiver.get_za3lpa$(_.kotlin.collections.get_lastIndex_a7ptmv$($receiver)); - }, last_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_udlcbx$", function($receiver, predicate) { - var tmp$0, tmp$1; - var last = null; - var found = false; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - last = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Collection contains no element matching the predicate."); - } - return(tmp$1 = last) == null || tmp$1 != null ? tmp$1 : Kotlin.throwCCE(); - }), last_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_ymzesn$", function($receiver, predicate) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - var element = iterator.previous(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("List contains no element matching the predicate."); - }), lastIndexOf_cwuzrm$:function($receiver, element) { - var tmp$0; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return $receiver.lastIndexOf_za3rmp$(element); - } - var lastIndex = -1; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (Kotlin.equals(element, item)) { - lastIndex = index; - } - index++; - } - return lastIndex; - }, lastIndexOf_3iudy2$:function($receiver, element) { - return $receiver.lastIndexOf_za3rmp$(element); - }, lastOrNull_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return $receiver.isEmpty() ? null : $receiver.get_za3lpa$($receiver.size - 1); - } else { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var last = iterator.next(); - while (iterator.hasNext()) { - last = iterator.next(); - } - return last; - } - }, lastOrNull_a7ptmv$:function($receiver) { - return $receiver.isEmpty() ? null : $receiver.get_za3lpa$($receiver.size - 1); - }, lastOrNull_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_udlcbx$", function($receiver, predicate) { - var tmp$0; - var last = null; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - last = element; - } - } - return last; - }), lastOrNull_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_ymzesn$", function($receiver, predicate) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - var element = iterator.previous(); - if (predicate(element)) { - return element; - } - } - return null; - }), single_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return _.kotlin.collections.single_a7ptmv$($receiver); - } else { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.NoSuchElementException("Collection is empty."); - } - var single = iterator.next(); - if (iterator.hasNext()) { - throw new Kotlin.IllegalArgumentException("Collection has more than one element."); - } - return single; - } - }, single_a7ptmv$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("List is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver.get_za3lpa$(0); - } else { - throw new Kotlin.IllegalArgumentException("List has more than one element."); - } - } - return tmp$1; - }, single_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_udlcbx$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Collection contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Collection contains no element matching the predicate."); - } - return(tmp$1 = single) == null || tmp$1 != null ? tmp$1 : Kotlin.throwCCE(); - }), singleOrNull_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return $receiver.size === 1 ? $receiver.get_za3lpa$(0) : null; - } else { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var single = iterator.next(); - if (iterator.hasNext()) { - return null; - } - return single; - } - }, singleOrNull_a7ptmv$:function($receiver) { - return $receiver.size === 1 ? $receiver.get_za3lpa$(0) : null; - }, singleOrNull_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_udlcbx$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), drop_cwv5p1$:function($receiver, n) { - var tmp$0, tmp$1, tmp$2; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var list; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - var resultSize = $receiver.size - n; - if (resultSize <= 0) { - return _.kotlin.collections.emptyList(); - } - if (resultSize === 1) { - return _.kotlin.collections.listOf_za3rmp$(_.kotlin.collections.last_q5oq31$($receiver)); - } - list = new Kotlin.ArrayList(resultSize); - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - if (Kotlin.isType($receiver, Kotlin.RandomAccess)) { - tmp$0 = $receiver.size - 1; - for (var index = n;index <= tmp$0;index++) { - list.add_za3rmp$($receiver.get_za3lpa$(index)); - } - } else { - tmp$1 = _.kotlin.collections.iterator_123wqf$($receiver.listIterator_za3lpa$(n)); - while (tmp$1.hasNext()) { - var item = tmp$1.next(); - list.add_za3rmp$(item); - } - } - return list; - } - } else { - list = new Kotlin.ArrayList; - } - var count = 0; - tmp$2 = $receiver.iterator(); - while (tmp$2.hasNext()) { - var item_0 = tmp$2.next(); - if (count++ >= n) { - list.add_za3rmp$(item_0); - } - } - return _.kotlin.collections.optimizeReadOnlyList(list); - }, dropLast_3iu80n$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_cwv5p1$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.size - n, 0)); - }, dropLastWhile_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_ymzesn$", function($receiver, predicate) { - if (!$receiver.isEmpty()) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - if (!predicate(iterator.previous())) { - return _.kotlin.collections.take_cwv5p1$($receiver, iterator.nextIndex() + 1); - } - } - } - return _.kotlin.collections.emptyList(); - }), dropWhile_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_udlcbx$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), filter_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_udlcbx$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterIndexed_6wagxu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_6wagxu$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_ej6hz7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_ej6hz7$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIsInstance_q5oq31$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIsInstance_q5oq31$", function(isR, $receiver) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (element == null || isR(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterIsInstanceTo_xc5ofo$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIsInstanceTo_xc5ofo$", function(isR, $receiver, destination) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (isR(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_udlcbx$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotNull_q5oq31$:function($receiver) { - return _.kotlin.collections.filterNotNullTo_xc5ofo$($receiver, new Kotlin.ArrayList); - }, filterNotNullTo_xc5ofo$:function($receiver, destination) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (element != null) { - destination.add_za3rmp$(element); - } - } - return destination; - }, filterNotTo_u1o9so$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_u1o9so$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_u1o9so$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_u1o9so$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), slice_smmin4$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - return _.kotlin.collections.toList_q5oq31$($receiver.subList_vux9f0$(indices.start, indices.endInclusive + 1)); - }, slice_5fse6p$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver.get_za3lpa$(index)); - } - return list; - }, take_cwv5p1$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - if (n >= $receiver.size) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$(_.kotlin.collections.first_q5oq31$($receiver)); - } - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return _.kotlin.collections.optimizeReadOnlyList(list); - }, takeLast_3iu80n$:function($receiver, n) { - var tmp$0, tmp$1, tmp$2; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.size; - if (n >= size) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$(_.kotlin.collections.last_a7ptmv$($receiver)); - } - var list = new Kotlin.ArrayList(n); - if (Kotlin.isType($receiver, Kotlin.RandomAccess)) { - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver.get_za3lpa$(index)); - } - } else { - tmp$2 = _.kotlin.collections.iterator_123wqf$($receiver.listIterator_za3lpa$(n)); - while (tmp$2.hasNext()) { - var item = tmp$2.next(); - list.add_za3rmp$(item); - } - } - return list; - }, takeLastWhile_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_ymzesn$", function($receiver, predicate) { - if ($receiver.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - if (!predicate(iterator.previous())) { - iterator.next(); - var expectedSize = $receiver.size - iterator.nextIndex(); - if (expectedSize === 0) { - return _.kotlin.collections.emptyList(); - } - var $receiver_0 = new Kotlin.ArrayList(expectedSize); - while (iterator.hasNext()) { - $receiver_0.add_za3rmp$(iterator.next()); - } - return $receiver_0; - } - } - return _.kotlin.collections.toList_q5oq31$($receiver); - }), takeWhile_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_udlcbx$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), reverse_sqtfhv$:function($receiver) { - _.java.util.Collections.reverse_heioe9$($receiver); - }, reversed_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection) && $receiver.size <= 1) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var list = _.kotlin.collections.toMutableList_q5oq31$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, sortBy_an8rl9$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortBy_an8rl9$", function($receiver, selector) { - if ($receiver.size > 1) { - _.kotlin.collections.sortWith_lcufbu$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - } - }), sortByDescending_an8rl9$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortByDescending_an8rl9$", function($receiver, selector) { - if ($receiver.size > 1) { - _.kotlin.collections.sortWith_lcufbu$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - } - }), sortDescending_h06zi1$:function($receiver) { - _.kotlin.collections.sortWith_lcufbu$($receiver, _.kotlin.comparisons.reverseOrder()); - }, sorted_349qs3$:function($receiver) { - var tmp$0; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - if ($receiver.size <= 1) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var $receiver_0 = Array.isArray(tmp$0 = Kotlin.copyToArray($receiver)) ? tmp$0 : Kotlin.throwCCE(); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - } - var $receiver_1 = _.kotlin.collections.toMutableList_q5oq31$($receiver); - _.kotlin.collections.sort_h06zi1$($receiver_1); - return $receiver_1; - }, sortedBy_l82ugp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_l82ugp$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_7dpn5g$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedByDescending_l82ugp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_l82ugp$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_7dpn5g$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedDescending_349qs3$:function($receiver) { - return _.kotlin.collections.sortedWith_7dpn5g$($receiver, _.kotlin.comparisons.reverseOrder()); - }, sortedWith_7dpn5g$:function($receiver, comparator) { - var tmp$0; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - if ($receiver.size <= 1) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var $receiver_0 = Array.isArray(tmp$0 = Kotlin.copyToArray($receiver)) ? tmp$0 : Kotlin.throwCCE(); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - } - var $receiver_1 = _.kotlin.collections.toMutableList_q5oq31$($receiver); - _.kotlin.collections.sortWith_lcufbu$($receiver_1, comparator); - return $receiver_1; - }, toBooleanArray_82yf0d$:function($receiver) { - var tmp$0; - var result = Kotlin.booleanArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toByteArray_lg9v1$:function($receiver) { - var tmp$0; - var result = Kotlin.numberArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toCharArray_stj23$:function($receiver) { - var tmp$0; - var result = Kotlin.charArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toDoubleArray_d8u8cq$:function($receiver) { - var tmp$0; - var result = Kotlin.numberArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toFloatArray_2vwy1$:function($receiver) { - var tmp$0; - var result = Kotlin.numberArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toIntArray_n17x8q$:function($receiver) { - var tmp$0; - var result = Kotlin.numberArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toLongArray_56arfl$:function($receiver) { - var tmp$0; - var result = Kotlin.longArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toShortArray_o8y0rt$:function($receiver) { - var tmp$0; - var result = Kotlin.numberArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, associate_l9f2x3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_l9f2x3$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateBy_fcza0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_fcza0h$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_qadzix$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_qadzix$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_57hlw1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_57hlw1$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_8dch1j$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_8dch1j$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateTo_j5xf4p$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_j5xf4p$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), toCollection_xc5ofo$:function($receiver, destination) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toHashSet_q5oq31$:function($receiver) { - return _.kotlin.collections.toCollection_xc5ofo$($receiver, new Kotlin.ComplexHashSet(_.kotlin.collections.mapCapacity(_.kotlin.collections.collectionSizeOrDefault($receiver, 12)))); - }, toList_q5oq31$:function($receiver) { - var tmp$0, tmp$1; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$(Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List) ? $receiver.get_za3lpa$(0) : $receiver.iterator().next()); - } else { - tmp$1 = _.kotlin.collections.toMutableList_mwto7b$($receiver); - } - } - return tmp$1; - } - return _.kotlin.collections.optimizeReadOnlyList(_.kotlin.collections.toMutableList_q5oq31$($receiver)); - }, toMutableList_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return _.kotlin.collections.toMutableList_mwto7b$($receiver); - } - return _.kotlin.collections.toCollection_xc5ofo$($receiver, new Kotlin.ArrayList); - }, toMutableList_mwto7b$:function($receiver) { - return _.java.util.ArrayList_wtfk93$($receiver); - }, toSet_q5oq31$:function($receiver) { - var tmp$0, tmp$1; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$(Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List) ? $receiver.get_za3lpa$(0) : $receiver.iterator().next()); - } else { - tmp$1 = _.kotlin.collections.toCollection_xc5ofo$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.size))); - } - } - return tmp$1; - } - return _.kotlin.collections.optimizeReadOnlySet(_.kotlin.collections.toCollection_xc5ofo$($receiver, new Kotlin.LinkedHashSet)); - }, flatMap_pwhhp2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_pwhhp2$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_k30zm7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_k30zm7$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), groupBy_fcza0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_fcza0h$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_qadzix$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_qadzix$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_i7ktse$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_i7ktse$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_t445s6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_t445s6$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), map_fcza0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_fcza0h$", function($receiver, transform) { - var destination = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)); - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapIndexed_kgzjie$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_kgzjie$", function($receiver, transform) { - var destination = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)); - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedNotNull_kgzjie$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedNotNull_kgzjie$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapIndexedNotNullTo_9rrt4x$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedNotNullTo_9rrt4x$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapIndexedTo_9rrt4x$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_9rrt4x$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapNotNull_fcza0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapNotNull_fcza0h$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapNotNullTo_nzn0z0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapNotNullTo_nzn0z0$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapTo_nzn0z0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_nzn0z0$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), withIndex_q5oq31$f:function(this$withIndex) { - return function() { - return this$withIndex.iterator(); - }; - }, withIndex_q5oq31$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_q5oq31$f($receiver)); - }, distinct_q5oq31$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_q5oq31$($receiver)); - }, distinctBy_fcza0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_fcza0h$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), intersect_71wgqg$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_q5oq31$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, subtract_71wgqg$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_q5oq31$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, toMutableSet_q5oq31$:function($receiver) { - var tmp$0; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - tmp$0 = _.java.util.LinkedHashSet_wtfk93$($receiver); - } else { - tmp$0 = _.kotlin.collections.toCollection_xc5ofo$($receiver, new Kotlin.LinkedHashSet); - } - return tmp$0; - }, union_71wgqg$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_q5oq31$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, all_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_udlcbx$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), any_q5oq31$:function($receiver) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_udlcbx$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), count_q5oq31$:function($receiver) { - var tmp$0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - count++; - } - return count; - }, count_mwto7b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_mwto7b$", function($receiver) { - return $receiver.size; - }), count_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_udlcbx$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), fold_x36ydg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_x36ydg$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), foldIndexed_a212pb$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_a212pb$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldRight_18gea8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_18gea8$", function($receiver, initial, operation) { - var accumulator = initial; - if (!$receiver.isEmpty()) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - accumulator = operation(iterator.previous(), accumulator); - } - } - return accumulator; - }), foldRightIndexed_77874r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_77874r$", function($receiver, initial, operation) { - var accumulator = initial; - if (!$receiver.isEmpty()) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - var index = iterator.previousIndex(); - accumulator = operation(index, iterator.previous(), accumulator); - } - } - return accumulator; - }), forEach_lcecrh$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_lcecrh$", function($receiver, action) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEachIndexed_4yeaaa$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_4yeaaa$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), max_349qs3$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var max = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (Kotlin.compareTo(max, e) < 0) { - max = e; - } - } - return max; - }, maxBy_l82ugp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_l82ugp$", function($receiver, selector) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var maxElem = iterator.next(); - var maxValue = selector(maxElem); - while (iterator.hasNext()) { - var e = iterator.next(); - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxWith_7dpn5g$:function($receiver, comparator) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var max = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, min_349qs3$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var min = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (Kotlin.compareTo(min, e) > 0) { - min = e; - } - } - return min; - }, minBy_l82ugp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_l82ugp$", function($receiver, selector) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var minElem = iterator.next(); - var minValue = selector(minElem); - while (iterator.hasNext()) { - var e = iterator.next(); - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minWith_7dpn5g$:function($receiver, comparator) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var min = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, none_q5oq31$:function($receiver) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_udlcbx$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), reduce_fsnvh9$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_fsnvh9$", function($receiver, operation) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.UnsupportedOperationException("Empty collection can't be reduced."); - } - var accumulator = iterator.next(); - while (iterator.hasNext()) { - accumulator = operation(accumulator, iterator.next()); - } - return accumulator; - }), reduceIndexed_3edsso$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_3edsso$", function($receiver, operation) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.UnsupportedOperationException("Empty collection can't be reduced."); - } - var index = 1; - var accumulator = iterator.next(); - while (iterator.hasNext()) { - accumulator = operation(index++, accumulator, iterator.next()); - } - return accumulator; - }), reduceRight_mue0zz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_mue0zz$", function($receiver, operation) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - if (!iterator.hasPrevious()) { - throw new Kotlin.UnsupportedOperationException("Empty list can't be reduced."); - } - var accumulator = iterator.previous(); - while (iterator.hasPrevious()) { - accumulator = operation(iterator.previous(), accumulator); - } - return accumulator; - }), reduceRightIndexed_4tyq1o$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_4tyq1o$", function($receiver, operation) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - if (!iterator.hasPrevious()) { - throw new Kotlin.UnsupportedOperationException("Empty list can't be reduced."); - } - var accumulator = iterator.previous(); - while (iterator.hasPrevious()) { - var index = iterator.previousIndex(); - accumulator = operation(index, iterator.previous(), accumulator); - } - return accumulator; - }), sumBy_fcu68k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_fcu68k$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_jaowxc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_jaowxc$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), requireNoNulls_q5oq31$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (element == null) { - throw new Kotlin.IllegalArgumentException("null element found in " + $receiver + "."); - } - } - return Kotlin.isType(tmp$1 = $receiver, Kotlin.modules["builtins"].kotlin.collections.Iterable) ? tmp$1 : Kotlin.throwCCE(); - }, requireNoNulls_a7ptmv$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (element == null) { - throw new Kotlin.IllegalArgumentException("null element found in " + $receiver + "."); - } - } - return Kotlin.isType(tmp$1 = $receiver, Kotlin.modules["builtins"].kotlin.collections.List) ? tmp$1 : Kotlin.throwCCE(); - }, minus_cwuzrm$:function($receiver, element) { - var result = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)); - var removed = {v:false}; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element_0 = tmp$0.next(); - var predicate$result; - if (!removed.v && Kotlin.equals(element_0, element)) { - removed.v = true; - predicate$result = false; - } else { - predicate$result = true; - } - if (predicate$result) { - result.add_za3rmp$(element_0); - } - } - return result; - }, minus_uspeym$:function($receiver, elements) { - if (elements.length === 0) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var other = _.kotlin.collections.toHashSet_eg9ybj$(elements); - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!other.contains_za3rmp$(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }, minus_71wgqg$:function($receiver, elements) { - var other = _.kotlin.collections.convertToSetForSetOperationWith(elements, $receiver); - if (other.isEmpty()) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!other.contains_za3rmp$(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }, minus_81az5y$:function($receiver, elements) { - var other = _.kotlin.sequences.toHashSet_uya9q7$(elements); - if (other.isEmpty()) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!other.contains_za3rmp$(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }, minusElement_cwuzrm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minusElement_cwuzrm$", function($receiver, element) { - return _.kotlin.collections.minus_cwuzrm$($receiver, element); - }), partition_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_udlcbx$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), plus_cwuzrm$:function($receiver, element) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return _.kotlin.collections.plus_ukps2u$($receiver, element); - } - var result = new Kotlin.ArrayList; - _.kotlin.collections.addAll_fwwv5a$(result, $receiver); - result.add_za3rmp$(element); - return result; - }, plus_ukps2u$:function($receiver, element) { - var result = new Kotlin.ArrayList($receiver.size + 1); - result.addAll_wtfk93$($receiver); - result.add_za3rmp$(element); - return result; - }, plus_uspeym$:function($receiver, elements) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return _.kotlin.collections.plus_b3ixii$($receiver, elements); - } - var result = new Kotlin.ArrayList; - _.kotlin.collections.addAll_fwwv5a$(result, $receiver); - _.kotlin.collections.addAll_jzhv38$(result, elements); - return result; - }, plus_b3ixii$:function($receiver, elements) { - var result = new Kotlin.ArrayList($receiver.size + elements.length); - result.addAll_wtfk93$($receiver); - _.kotlin.collections.addAll_jzhv38$(result, elements); - return result; - }, plus_71wgqg$:function($receiver, elements) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return _.kotlin.collections.plus_hfjk0c$($receiver, elements); - } - var result = new Kotlin.ArrayList; - _.kotlin.collections.addAll_fwwv5a$(result, $receiver); - _.kotlin.collections.addAll_fwwv5a$(result, elements); - return result; - }, plus_hfjk0c$:function($receiver, elements) { - if (Kotlin.isType(elements, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - var result = new Kotlin.ArrayList($receiver.size + elements.size); - result.addAll_wtfk93$($receiver); - result.addAll_wtfk93$(elements); - return result; - } else { - var result_0 = _.java.util.ArrayList_wtfk93$($receiver); - _.kotlin.collections.addAll_fwwv5a$(result_0, elements); - return result_0; - } - }, plus_81az5y$:function($receiver, elements) { - var result = new Kotlin.ArrayList; - _.kotlin.collections.addAll_fwwv5a$(result, $receiver); - _.kotlin.collections.addAll_h3qeu8$(result, elements); - return result; - }, plus_9axfq2$:function($receiver, elements) { - var result = new Kotlin.ArrayList($receiver.size + 10); - result.addAll_wtfk93$($receiver); - _.kotlin.collections.addAll_h3qeu8$(result, elements); - return result; - }, plusElement_cwuzrm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusElement_cwuzrm$", function($receiver, element) { - return _.kotlin.collections.plus_cwuzrm$($receiver, element); - }), plusElement_ukps2u$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusElement_ukps2u$", function($receiver, element) { - return _.kotlin.collections.plus_ukps2u$($receiver, element); - }), zip_uspeym$:function($receiver, other) { - var tmp$0; - var arraySize = other.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault($receiver, 10), arraySize)); - var i = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$(element, other[i++])); - } - return list; - }, zip_6hx15g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_6hx15g$", function($receiver, other, transform) { - var tmp$0; - var arraySize = other.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault($receiver, 10), arraySize)); - var i = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform(element, other[i++])); - } - return list; - }), zip_71wgqg$:function($receiver, other) { - var first = $receiver.iterator(); - var second = other.iterator(); - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault($receiver, 10), _.kotlin.collections.collectionSizeOrDefault(other, 10))); - while (first.hasNext() && second.hasNext()) { - list.add_za3rmp$(_.kotlin.to_l1ob02$(first.next(), second.next())); - } - return list; - }, zip_aqs41e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_aqs41e$", function($receiver, other, transform) { - var first = $receiver.iterator(); - var second = other.iterator(); - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault($receiver, 10), _.kotlin.collections.collectionSizeOrDefault(other, 10))); - while (first.hasNext() && second.hasNext()) { - list.add_za3rmp$(transform(first.next(), second.next())); - } - return list; - }), joinTo_euycuk$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element == null ? "null" : element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinToString_ld60a2$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_euycuk$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, asIterable_q5oq31$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asIterable_q5oq31$", function($receiver) { - return $receiver; - }), asSequence_q5oq31$f:function(this$asSequence) { - return function() { - return this$asSequence.iterator(); - }; - }, asSequence_q5oq31$:function($receiver) { - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_q5oq31$f($receiver)); - }, average_sx0vjz$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_fr8z0d$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_q1ah1m$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_oc6dzf$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_8et4tf$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_y4pxme$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, sum_sx0vjz$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_fr8z0d$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_q1ah1m$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_oc6dzf$:function($receiver) { - var tmp$0; - var sum = Kotlin.Long.ZERO; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum = sum.add(element); - } - return sum; - }, sum_8et4tf$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_y4pxme$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, toList_efxzmg$:function($receiver) { - if ($receiver.size === 0) { - return _.kotlin.collections.emptyList(); - } - var iterator = $receiver.entries.iterator(); - if (!iterator.hasNext()) { - return _.kotlin.collections.emptyList(); - } - var first = iterator.next(); - if (!iterator.hasNext()) { - return _.kotlin.collections.listOf_za3rmp$(new _.kotlin.Pair(first.key, first.value)); - } - var result = new Kotlin.ArrayList($receiver.size); - result.add_za3rmp$(new _.kotlin.Pair(first.key, first.value)); - do { - var $receiver_2 = iterator.next(); - result.add_za3rmp$(new _.kotlin.Pair($receiver_2.key, $receiver_2.value)); - } while (iterator.hasNext()); - return result; - }, flatMap_yh70lg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_yh70lg$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_5n3275$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_5n3275$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), map_e1k39z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_e1k39z$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.size); - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapNotNull_e1k39z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapNotNull_e1k39z$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapNotNullTo_v1ibx8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapNotNullTo_v1ibx8$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapTo_v1ibx8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_v1ibx8$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), all_oixulp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_oixulp$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), any_efxzmg$:function($receiver) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_oixulp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_oixulp$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), count_efxzmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_efxzmg$", function($receiver) { - return $receiver.size; - }), count_oixulp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_oixulp$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), forEach_8umwe5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_8umwe5$", function($receiver, action) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), maxBy_dubjrn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_dubjrn$", function($receiver, selector) { - var iterator = $receiver.entries.iterator(); - if (!iterator.hasNext()) { - return null; - } - var maxElem = iterator.next(); - var maxValue = selector(maxElem); - while (iterator.hasNext()) { - var e = iterator.next(); - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxWith_9gigyu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxWith_9gigyu$", function($receiver, comparator) { - return _.kotlin.collections.maxWith_7dpn5g$($receiver.entries, comparator); - }), minBy_dubjrn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_dubjrn$", function($receiver, selector) { - var iterator = $receiver.entries.iterator(); - if (!iterator.hasNext()) { - return null; - } - var minElem = iterator.next(); - var minValue = selector(minElem); - while (iterator.hasNext()) { - var e = iterator.next(); - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minWith_9gigyu$:function($receiver, comparator) { - return _.kotlin.collections.minWith_7dpn5g$($receiver.entries, comparator); - }, none_efxzmg$:function($receiver) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_oixulp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_oixulp$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), asIterable_efxzmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asIterable_efxzmg$", function($receiver) { - return $receiver.entries; - }), asSequence_efxzmg$f:function(this$asSequence) { - return function() { - return this$asSequence.entries.iterator(); - }; - }, asSequence_efxzmg$:function($receiver) { - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_efxzmg$f($receiver)); - }, minus_bfnyky$:function($receiver, element) { - var result = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.size)); - var removed = {v:false}; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element_0 = tmp$0.next(); - var predicate$result; - if (!removed.v && Kotlin.equals(element_0, element)) { - removed.v = true; - predicate$result = false; - } else { - predicate$result = true; - } - if (predicate$result) { - result.add_za3rmp$(element_0); - } - } - return result; - }, minus_bs0yn6$:function($receiver, elements) { - var result = _.java.util.LinkedHashSet_wtfk93$($receiver); - _.kotlin.collections.removeAll_jzhv38$(result, elements); - return result; - }, minus_rp2n1o$:function($receiver, elements) { - var other = _.kotlin.collections.convertToSetForSetOperationWith(elements, $receiver); - if (other.isEmpty()) { - return _.kotlin.collections.toSet_q5oq31$($receiver); - } - if (Kotlin.isType(other, Kotlin.modules["builtins"].kotlin.collections.Set)) { - var destination = new Kotlin.LinkedHashSet; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!other.contains_za3rmp$(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - } - var result = _.java.util.LinkedHashSet_wtfk93$($receiver); - result.removeAll_wtfk93$(other); - return result; - }, minus_w7ip9a$:function($receiver, elements) { - var result = _.java.util.LinkedHashSet_wtfk93$($receiver); - _.kotlin.collections.removeAll_h3qeu8$(result, elements); - return result; - }, minusElement_bfnyky$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minusElement_bfnyky$", function($receiver, element) { - return _.kotlin.collections.minus_bfnyky$($receiver, element); - }), plus_bfnyky$:function($receiver, element) { - var result = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.size + 1)); - result.addAll_wtfk93$($receiver); - result.add_za3rmp$(element); - return result; - }, plus_bs0yn6$:function($receiver, elements) { - var result = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.size + elements.length)); - result.addAll_wtfk93$($receiver); - _.kotlin.collections.addAll_jzhv38$(result, elements); - return result; - }, plus_rp2n1o$:function($receiver, elements) { - var tmp$0, tmp$1; - var result = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity((tmp$1 = (tmp$0 = _.kotlin.collections.collectionSizeOrNull(elements)) != null ? $receiver.size + tmp$0 : null) != null ? tmp$1 : $receiver.size * 2)); - result.addAll_wtfk93$($receiver); - _.kotlin.collections.addAll_fwwv5a$(result, elements); - return result; - }, plus_w7ip9a$:function($receiver, elements) { - var result = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.size * 2)); - result.addAll_wtfk93$($receiver); - _.kotlin.collections.addAll_h3qeu8$(result, elements); - return result; - }, plusElement_bfnyky$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusElement_bfnyky$", function($receiver, element) { - return _.kotlin.collections.plus_bfnyky$($receiver, element); - }), State:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{Ready:function() { - return new _.kotlin.collections.State; - }, NotReady:function() { - return new _.kotlin.collections.State; - }, Done:function() { - return new _.kotlin.collections.State; - }, Failed:function() { - return new _.kotlin.collections.State; - }}; - }), AbstractIterator:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function() { - this.state_v5kh2x$ = _.kotlin.collections.State.NotReady; - this.nextValue_tlc62$ = null; - }, {hasNext:function() { - var tmp$0, tmp$1; - if (!(this.state_v5kh2x$ !== _.kotlin.collections.State.Failed)) { - var message = "Failed requirement."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - tmp$0 = this.state_v5kh2x$; - if (Kotlin.equals(tmp$0, _.kotlin.collections.State.Done)) { - tmp$1 = false; - } else { - if (Kotlin.equals(tmp$0, _.kotlin.collections.State.Ready)) { - tmp$1 = true; - } else { - tmp$1 = this.tryToComputeNext(); - } - } - return tmp$1; - }, next:function() { - var tmp$0; - if (!this.hasNext()) { - throw new Kotlin.NoSuchElementException; - } - this.state_v5kh2x$ = _.kotlin.collections.State.NotReady; - return(tmp$0 = this.nextValue_tlc62$) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - }, tryToComputeNext:function() { - this.state_v5kh2x$ = _.kotlin.collections.State.Failed; - this.computeNext(); - return this.state_v5kh2x$ === _.kotlin.collections.State.Ready; - }, setNext_za3rmp$:function(value) { - this.nextValue_tlc62$ = value; - this.state_v5kh2x$ = _.kotlin.collections.State.Ready; - }, done:function() { - this.state_v5kh2x$ = _.kotlin.collections.State.Done; - }}), orEmpty_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.orEmpty_eg9ybj$", function(isT, $receiver) { - return $receiver != null ? $receiver : []; - }), flatten_vrdqc4$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var tmp$6, tmp$4, tmp$5; - var sum = 0; - tmp$6 = $receiver, tmp$4 = tmp$6.length; - for (var tmp$5 = 0;tmp$5 !== tmp$4;++tmp$5) { - var element_0 = tmp$6[tmp$5]; - sum += element_0.length; - } - var result = new Kotlin.ArrayList(sum); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - _.kotlin.collections.addAll_jzhv38$(result, element); - } - return result; - }, unzip_sq63gn$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var listT = new Kotlin.ArrayList($receiver.length); - var listR = new Kotlin.ArrayList($receiver.length); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var pair = tmp$0[tmp$2]; - listT.add_za3rmp$(pair.first); - listR.add_za3rmp$(pair.second); - } - return _.kotlin.to_l1ob02$(listT, listR); - }, EmptyIterator:Kotlin.createObject(function() { - return[Kotlin.modules["builtins"].kotlin.collections.ListIterator]; - }, null, {hasNext:function() { - return false; - }, hasPrevious:function() { - return false; - }, nextIndex:function() { - return 0; - }, previousIndex:function() { - return-1; - }, next:function() { - throw new Kotlin.NoSuchElementException; - }, previous:function() { - throw new Kotlin.NoSuchElementException; - }}), EmptyList:Kotlin.createObject(function() { - return[Kotlin.RandomAccess, _.java.io.Serializable, Kotlin.modules["builtins"].kotlin.collections.List]; - }, function() { - this.serialVersionUID_jwftuz$ = new Kotlin.Long(-1478467534, -1720727600); - }, {equals_za3rmp$:function(other) { - return Kotlin.isType(other, Kotlin.modules["builtins"].kotlin.collections.List) && other.isEmpty(); - }, hashCode:function() { - return 1; - }, toString:function() { - return "[]"; - }, size:{get:function() { - return 0; - }}, isEmpty:function() { - return true; - }, contains_za3rmp$:function(element) { - return false; - }, containsAll_wtfk93$:function(elements) { - return elements.isEmpty(); - }, get_za3lpa$:function(index) { - throw new Kotlin.IndexOutOfBoundsException("Empty list doesn't contain element at index " + index + "."); - }, indexOf_za3rmp$:function(element) { - return-1; - }, lastIndexOf_za3rmp$:function(element) { - return-1; - }, iterator:function() { - return _.kotlin.collections.EmptyIterator; - }, listIterator:function() { - return _.kotlin.collections.EmptyIterator; - }, listIterator_za3lpa$:function(index) { - if (index !== 0) { - throw new Kotlin.IndexOutOfBoundsException("Index: " + index); - } - return _.kotlin.collections.EmptyIterator; - }, subList_vux9f0$:function(fromIndex, toIndex) { - if (fromIndex === 0 && toIndex === 0) { - return this; - } - throw new Kotlin.IndexOutOfBoundsException("fromIndex: " + fromIndex + ", toIndex: " + toIndex); - }, readResolve:function() { - return _.kotlin.collections.EmptyList; - }}), asCollection:function($receiver) { - return new _.kotlin.collections.ArrayAsCollection($receiver, false); - }, ArrayAsCollection:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Collection]; - }, function(values, isVarargs) { - this.values = values; - this.isVarargs = isVarargs; - }, {size:{get:function() { - return this.values.length; - }}, isEmpty:function() { - return this.values.length === 0; - }, contains_za3rmp$:function(element) { - return _.kotlin.collections.contains_ke19y6$(this.values, element); - }, containsAll_wtfk93$:function(elements) { - var tmp$0; - tmp$0 = elements.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!this.contains_za3rmp$(element)) { - return false; - } - } - return true; - }, iterator:function() { - return Kotlin.arrayIterator(this.values); - }, toArray:function() { - var $receiver = this.values; - return this.isVarargs ? $receiver : $receiver.slice(); - }}, {}), emptyList:function() { - return _.kotlin.collections.EmptyList; - }, listOf_9mqe4v$:function(elements) { - return elements.length > 0 ? _.kotlin.collections.asList_eg9ybj$(elements) : _.kotlin.collections.emptyList(); - }, listOf:Kotlin.defineInlineFunction("stdlib.kotlin.collections.listOf", function() { - return _.kotlin.collections.emptyList(); - }), mutableListOf_9mqe4v$:function(elements) { - return elements.length === 0 ? new Kotlin.ArrayList : _.java.util.ArrayList_wtfk93$(new _.kotlin.collections.ArrayAsCollection(elements, true)); - }, arrayListOf_9mqe4v$:function(elements) { - return elements.length === 0 ? new Kotlin.ArrayList : _.java.util.ArrayList_wtfk93$(new _.kotlin.collections.ArrayAsCollection(elements, true)); - }, listOfNotNull_za3rmp$:function(element) { - return element != null ? _.kotlin.collections.listOf_za3rmp$(element) : _.kotlin.collections.emptyList(); - }, listOfNotNull_9mqe4v$:function(elements) { - return _.kotlin.collections.filterNotNull_eg9ybj$(elements); - }, get_indices_mwto7b$:{value:function($receiver) { - return new Kotlin.NumberRange(0, $receiver.size - 1); - }}, get_lastIndex_a7ptmv$:{value:function($receiver) { - return $receiver.size - 1; - }}, isNotEmpty_mwto7b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_mwto7b$", function($receiver) { - return!$receiver.isEmpty(); - }), orEmpty_mwto7b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.orEmpty_mwto7b$", function($receiver) { - return $receiver != null ? $receiver : _.kotlin.collections.emptyList(); - }), orEmpty_a7ptmv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.orEmpty_a7ptmv$", function($receiver) { - return $receiver != null ? $receiver : _.kotlin.collections.emptyList(); - }), containsAll_2px7j4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.containsAll_2px7j4$", function($receiver, elements) { - return $receiver.containsAll_wtfk93$(elements); - }), optimizeReadOnlyList:function($receiver) { - var tmp$0; - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - return _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver.get_za3lpa$(0)); - } else { - return $receiver; - } - } - }, binarySearch_i1wy23$:function($receiver, element, fromIndex, toIndex) { - if (fromIndex === void 0) { - fromIndex = 0; - } - if (toIndex === void 0) { - toIndex = $receiver.size; - } - _.kotlin.collections.rangeCheck($receiver.size, fromIndex, toIndex); - var low = fromIndex; - var high = toIndex - 1; - while (low <= high) { - var mid = low + high >>> 1; - var midVal = $receiver.get_za3lpa$(mid); - var cmp = _.kotlin.comparisons.compareValues_cj5vqg$(midVal, element); - if (cmp < 0) { - low = mid + 1; - } else { - if (cmp > 0) { - high = mid - 1; - } else { - return mid; - } - } - } - return-(low + 1); - }, binarySearch_1open$:function($receiver, element, comparator, fromIndex, toIndex) { - if (fromIndex === void 0) { - fromIndex = 0; - } - if (toIndex === void 0) { - toIndex = $receiver.size; - } - _.kotlin.collections.rangeCheck($receiver.size, fromIndex, toIndex); - var low = fromIndex; - var high = toIndex - 1; - while (low <= high) { - var mid = low + high >>> 1; - var midVal = $receiver.get_za3lpa$(mid); - var cmp = comparator.compare(midVal, element); - if (cmp < 0) { - low = mid + 1; - } else { - if (cmp > 0) { - high = mid - 1; - } else { - return mid; - } - } - } - return-(low + 1); - }, binarySearchBy_uuu8x$f:function(closure$selector, closure$key) { - return function(it) { - return _.kotlin.comparisons.compareValues_cj5vqg$(closure$selector(it), closure$key); - }; - }, binarySearchBy_uuu8x$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.binarySearchBy_uuu8x$", function($receiver, key, fromIndex, toIndex, selector) { - if (fromIndex === void 0) { - fromIndex = 0; - } - if (toIndex === void 0) { - toIndex = $receiver.size; - } - return _.kotlin.collections.binarySearch_e4ogxs$($receiver, fromIndex, toIndex, _.kotlin.collections.binarySearchBy_uuu8x$f(selector, key)); - }), binarySearch_e4ogxs$:function($receiver, fromIndex, toIndex, comparison) { - if (fromIndex === void 0) { - fromIndex = 0; - } - if (toIndex === void 0) { - toIndex = $receiver.size; - } - _.kotlin.collections.rangeCheck($receiver.size, fromIndex, toIndex); - var low = fromIndex; - var high = toIndex - 1; - while (low <= high) { - var mid = low + high >>> 1; - var midVal = $receiver.get_za3lpa$(mid); - var cmp = comparison(midVal); - if (cmp < 0) { - low = mid + 1; - } else { - if (cmp > 0) { - high = mid - 1; - } else { - return mid; - } - } - } - return-(low + 1); - }, rangeCheck:function(size, fromIndex, toIndex) { - if (fromIndex > toIndex) { - throw new Kotlin.IllegalArgumentException("fromIndex (" + fromIndex + ") is greater than toIndex (" + toIndex + ")."); - } else { - if (fromIndex < 0) { - throw new Kotlin.IndexOutOfBoundsException("fromIndex (" + fromIndex + ") is less than zero."); - } else { - if (toIndex > size) { - throw new Kotlin.IndexOutOfBoundsException("toIndex (" + toIndex + ") is greater than size (" + size + ")."); - } - } - } - }, IndexedValue:Kotlin.createClass(null, function(index, value) { - this.index = index; - this.value = value; - }, {component1:function() { - return this.index; - }, component2:function() { - return this.value; - }, copy_vux3hl$:function(index, value) { - return new _.kotlin.collections.IndexedValue(index === void 0 ? this.index : index, value === void 0 ? this.value : value); - }, toString:function() { - return "IndexedValue(index\x3d" + Kotlin.toString(this.index) + (", value\x3d" + Kotlin.toString(this.value)) + ")"; - }, hashCode:function() { - var result = 0; - result = result * 31 + Kotlin.hashCode(this.index) | 0; - result = result * 31 + Kotlin.hashCode(this.value) | 0; - return result; - }, equals_za3rmp$:function(other) { - return this === other || other !== null && (typeof other === "object" && (Object.getPrototypeOf(this) === Object.getPrototypeOf(other) && (Kotlin.equals(this.index, other.index) && Kotlin.equals(this.value, other.value)))); - }}), Iterable$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(closure$iterator_0) { - this.closure$iterator_0 = closure$iterator_0; - }, {iterator:function() { - return this.closure$iterator_0(); - }}, {}), Iterable_kxhynv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.Iterable_kxhynv$", function(iterator) { - return new _.kotlin.collections.Iterable$f(iterator); - }), IndexingIterable:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(iteratorFactory) { - this.iteratorFactory_fvkcba$ = iteratorFactory; - }, {iterator:function() { - return new _.kotlin.collections.IndexingIterator(this.iteratorFactory_fvkcba$()); - }}), collectionSizeOrNull:function($receiver) { - return Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection) ? $receiver.size : null; - }, collectionSizeOrDefault:function($receiver, default_0) { - return Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection) ? $receiver.size : default_0; - }, safeToConvertToSet:function($receiver) { - return $receiver.size > 2 && Kotlin.isType($receiver, Kotlin.ArrayList); - }, convertToSetForSetOperationWith:function($receiver, source) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Set)) { - return $receiver; - } else { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - if (Kotlin.isType(source, Kotlin.modules["builtins"].kotlin.collections.Collection) && source.size < 2) { - return $receiver; - } else { - return _.kotlin.collections.safeToConvertToSet($receiver) ? _.kotlin.collections.toHashSet_q5oq31$($receiver) : $receiver; - } - } else { - return _.kotlin.collections.toHashSet_q5oq31$($receiver); - } - } - }, convertToSetForSetOperation:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Set)) { - return $receiver; - } else { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return _.kotlin.collections.safeToConvertToSet($receiver) ? _.kotlin.collections.toHashSet_q5oq31$($receiver) : $receiver; - } else { - return _.kotlin.collections.toHashSet_q5oq31$($receiver); - } - } - }, flatten_ryy49w$:function($receiver) { - var tmp$0; - var result = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.addAll_fwwv5a$(result, element); - } - return result; - }, unzip_mnrzhp$:function($receiver) { - var tmp$0; - var expectedSize = _.kotlin.collections.collectionSizeOrDefault($receiver, 10); - var listT = new Kotlin.ArrayList(expectedSize); - var listR = new Kotlin.ArrayList(expectedSize); - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var pair = tmp$0.next(); - listT.add_za3rmp$(pair.first); - listR.add_za3rmp$(pair.second); - } - return _.kotlin.to_l1ob02$(listT, listR); - }, iterator_123wqf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.iterator_123wqf$", function($receiver) { - return $receiver; - }), withIndex_123wqf$:function($receiver) { - return new _.kotlin.collections.IndexingIterator($receiver); - }, forEach_3ydtzt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_3ydtzt$", function($receiver, operation) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_123wqf$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - operation(element); - } - }), IndexingIterator:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(iterator) { - this.iterator_qhnuqw$ = iterator; - this.index_9l0vtk$ = 0; - }, {hasNext:function() { - return this.iterator_qhnuqw$.hasNext(); - }, next:function() { - return new _.kotlin.collections.IndexedValue(this.index_9l0vtk$++, this.iterator_qhnuqw$.next()); - }}), getValue_lromyx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getValue_lromyx$", function($receiver, thisRef, property) { - var tmp$0; - return(tmp$0 = _.kotlin.collections.getOrImplicitDefault($receiver, property.name)) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - }), getValue_pmw3g1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getValue_pmw3g1$", function($receiver, thisRef, property) { - var tmp$0; - return(tmp$0 = _.kotlin.collections.getOrImplicitDefault($receiver, property.name)) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - }), setValue_vfsqka$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.setValue_vfsqka$", function($receiver, thisRef, property, value) { - $receiver.put_wn2jw4$(property.name, value); - }), getOrImplicitDefault:function($receiver, key) { - if (Kotlin.isType($receiver, _.kotlin.collections.MapWithDefault)) { - return $receiver.getOrImplicitDefault_za3rmp$(key); - } - var tmp$0; - var value = $receiver.get_za3rmp$(key); - if (value == null && !$receiver.containsKey_za3rmp$(key)) { - throw new Kotlin.NoSuchElementException("Key " + key + " is missing in the map."); - } else { - return(tmp$0 = value) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - } - }, withDefault_86p62k$:function($receiver, defaultValue) { - if (Kotlin.isType($receiver, _.kotlin.collections.MapWithDefault)) { - return _.kotlin.collections.withDefault_86p62k$($receiver.map, defaultValue); - } else { - return new _.kotlin.collections.MapWithDefaultImpl($receiver, defaultValue); - } - }, withDefault_g6ll1e$:function($receiver, defaultValue) { - if (Kotlin.isType($receiver, _.kotlin.collections.MutableMapWithDefault)) { - return _.kotlin.collections.withDefault_g6ll1e$($receiver.map, defaultValue); - } else { - return new _.kotlin.collections.MutableMapWithDefaultImpl($receiver, defaultValue); - } - }, MapWithDefault:Kotlin.createTrait(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Map]; - }), MutableMapWithDefault:Kotlin.createTrait(function() { - return[_.kotlin.collections.MapWithDefault, Kotlin.modules["builtins"].kotlin.collections.MutableMap]; - }), MapWithDefaultImpl:Kotlin.createClass(function() { - return[_.kotlin.collections.MapWithDefault]; - }, function(map, default_0) { - this.$map_5wo5ir$ = map; - this.default_61dz8o$ = default_0; - }, {map:{get:function() { - return this.$map_5wo5ir$; - }}, equals_za3rmp$:function(other) { - return Kotlin.equals(this.map, other); - }, hashCode:function() { - return Kotlin.hashCode(this.map); - }, toString:function() { - return this.map.toString(); - }, size:{get:function() { - return this.map.size; - }}, isEmpty:function() { - return this.map.isEmpty(); - }, containsKey_za3rmp$:function(key) { - return this.map.containsKey_za3rmp$(key); - }, containsValue_za3rmp$:function(value) { - return this.map.containsValue_za3rmp$(value); - }, get_za3rmp$:function(key) { - return this.map.get_za3rmp$(key); - }, keys:{get:function() { - return this.map.keys; - }}, values:{get:function() { - return this.map.values; - }}, entries:{get:function() { - return this.map.entries; - }}, getOrImplicitDefault_za3rmp$:function(key) { - var $receiver = this.map; - var tmp$0; - var value = $receiver.get_za3rmp$(key); - if (value == null && !$receiver.containsKey_za3rmp$(key)) { - return this.default_61dz8o$(key); - } else { - return(tmp$0 = value) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - } - }}, {}), MutableMapWithDefaultImpl:Kotlin.createClass(function() { - return[_.kotlin.collections.MutableMapWithDefault]; - }, function(map, default_0) { - this.$map_6ju9n7$ = map; - this.default_vonn6a$ = default_0; - }, {map:{get:function() { - return this.$map_6ju9n7$; - }}, equals_za3rmp$:function(other) { - return Kotlin.equals(this.map, other); - }, hashCode:function() { - return Kotlin.hashCode(this.map); - }, toString:function() { - return this.map.toString(); - }, size:{get:function() { - return this.map.size; - }}, isEmpty:function() { - return this.map.isEmpty(); - }, containsKey_za3rmp$:function(key) { - return this.map.containsKey_za3rmp$(key); - }, containsValue_za3rmp$:function(value) { - return this.map.containsValue_za3rmp$(value); - }, get_za3rmp$:function(key) { - return this.map.get_za3rmp$(key); - }, keys:{get:function() { - return this.map.keys; - }}, values:{get:function() { - return this.map.values; - }}, entries:{get:function() { - return this.map.entries; - }}, put_wn2jw4$:function(key, value) { - return this.map.put_wn2jw4$(key, value); - }, remove_za3rmp$:function(key) { - return this.map.remove_za3rmp$(key); - }, putAll_r12sna$:function(from) { - this.map.putAll_r12sna$(from); - }, clear:function() { - this.map.clear(); - }, getOrImplicitDefault_za3rmp$:function(key) { - var $receiver = this.map; - var tmp$0; - var value = $receiver.get_za3rmp$(key); - if (value == null && !$receiver.containsKey_za3rmp$(key)) { - return this.default_vonn6a$(key); - } else { - return(tmp$0 = value) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - } - }}, {}), EmptyMap:Kotlin.createObject(function() { - return[_.java.io.Serializable, Kotlin.modules["builtins"].kotlin.collections.Map]; - }, null, {equals_za3rmp$:function(other) { - return Kotlin.isType(other, Kotlin.modules["builtins"].kotlin.collections.Map) && other.isEmpty(); - }, hashCode:function() { - return 0; - }, toString:function() { - return "{}"; - }, size:{get:function() { - return 0; - }}, isEmpty:function() { - return true; - }, containsKey_za3rmp$:function(key) { - return false; - }, containsValue_za3rmp$:function(value) { - return false; - }, get_za3rmp$:function(key) { - return null; - }, entries:{get:function() { - return _.kotlin.collections.EmptySet; - }}, keys:{get:function() { - return _.kotlin.collections.EmptySet; - }}, values:{get:function() { - return _.kotlin.collections.EmptyList; - }}, readResolve:function() { - return _.kotlin.collections.EmptyMap; - }}), emptyMap:function() { - var tmp$0; - return Kotlin.isType(tmp$0 = _.kotlin.collections.EmptyMap, Kotlin.modules["builtins"].kotlin.collections.Map) ? tmp$0 : Kotlin.throwCCE(); - }, mapOf_eoa9s7$:function(pairs) { - return pairs.length > 0 ? _.kotlin.collections.linkedMapOf_eoa9s7$(pairs.slice()) : _.kotlin.collections.emptyMap(); - }, mapOf:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapOf", function() { - return _.kotlin.collections.emptyMap(); - }), mutableMapOf_eoa9s7$:function(pairs) { - var $receiver = new Kotlin.LinkedHashMap(_.kotlin.collections.mapCapacity(pairs.length)); - _.kotlin.collections.putAll_76v9np$($receiver, pairs); - return $receiver; - }, hashMapOf_eoa9s7$:function(pairs) { - var $receiver = new Kotlin.ComplexHashMap(_.kotlin.collections.mapCapacity(pairs.length)); - _.kotlin.collections.putAll_76v9np$($receiver, pairs); - return $receiver; - }, linkedMapOf_eoa9s7$:function(pairs) { - var $receiver = new Kotlin.LinkedHashMap(_.kotlin.collections.mapCapacity(pairs.length)); - _.kotlin.collections.putAll_76v9np$($receiver, pairs); - return $receiver; - }, mapCapacity:function(expectedSize) { - if (expectedSize < 3) { - return expectedSize + 1; - } - if (expectedSize < _.kotlin.collections.INT_MAX_POWER_OF_TWO_y8578v$) { - return expectedSize + (expectedSize / 3 | 0); - } - return Kotlin.modules["stdlib"].kotlin.js.internal.IntCompanionObject.MAX_VALUE; - }, isNotEmpty_efxzmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_efxzmg$", function($receiver) { - return!$receiver.isEmpty(); - }), orEmpty_efxzmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.orEmpty_efxzmg$", function($receiver) { - return $receiver != null ? $receiver : _.kotlin.collections.emptyMap(); - }), contains_9ju2mf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.contains_9ju2mf$", function($receiver, key) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.Map) ? tmp$0 : Kotlin.throwCCE()).containsKey_za3rmp$(key); - }), get_9ju2mf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.get_9ju2mf$", function($receiver, key) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.Map) ? tmp$0 : Kotlin.throwCCE()).get_za3rmp$(key); - }), containsKey_9ju2mf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.containsKey_9ju2mf$", function($receiver, key) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.Map) ? tmp$0 : Kotlin.throwCCE()).containsKey_za3rmp$(key); - }), containsValue_9ju2mf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.containsValue_9ju2mf$", function($receiver, value) { - return $receiver.containsValue_za3rmp$(value); - }), remove_dr77nj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.remove_dr77nj$", function($receiver, key) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.MutableMap) ? tmp$0 : Kotlin.throwCCE()).remove_za3rmp$(key); - }), component1_95c3g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_95c3g$", function($receiver) { - return $receiver.key; - }), component2_95c3g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_95c3g$", function($receiver) { - return $receiver.value; - }), toPair_95c3g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.toPair_95c3g$", function($receiver) { - return new _.kotlin.Pair($receiver.key, $receiver.value); - }), getOrElse_yh3n4j$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_yh3n4j$", function($receiver, key, defaultValue) { - var tmp$0; - return(tmp$0 = $receiver.get_za3rmp$(key)) != null ? tmp$0 : defaultValue(); - }), getOrElseNullable:function($receiver, key, defaultValue) { - var tmp$0; - var value = $receiver.get_za3rmp$(key); - if (value == null && !$receiver.containsKey_za3rmp$(key)) { - return defaultValue(); - } else { - return(tmp$0 = value) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - } - }, getOrPut_5hy1z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrPut_5hy1z$", function($receiver, key, defaultValue) { - var tmp$0; - var value = $receiver.get_za3rmp$(key); - if (value == null) { - var answer = defaultValue(); - $receiver.put_wn2jw4$(key, answer); - tmp$0 = answer; - } else { - tmp$0 = value; - } - return tmp$0; - }), iterator_efxzmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.iterator_efxzmg$", function($receiver) { - return $receiver.entries.iterator(); - }), mapValuesTo_6rxb0p$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapValuesTo_6rxb0p$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.entries.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(element.key, transform(element)); - } - return destination; - }), mapKeysTo_6rxb0p$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapKeysTo_6rxb0p$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.entries.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(transform(element), element.value); - } - return destination; - }), putAll_76v9np$:function($receiver, pairs) { - var tmp$1, tmp$2, tmp$3; - tmp$1 = pairs, tmp$2 = tmp$1.length; - for (var tmp$3 = 0;tmp$3 !== tmp$2;++tmp$3) { - var tmp$0 = tmp$1[tmp$3], key = tmp$0.component1(), value = tmp$0.component2(); - $receiver.put_wn2jw4$(key, value); - } - }, putAll_6588df$:function($receiver, pairs) { - var tmp$1; - tmp$1 = pairs.iterator(); - while (tmp$1.hasNext()) { - var tmp$0 = tmp$1.next(), key = tmp$0.component1(), value = tmp$0.component2(); - $receiver.put_wn2jw4$(key, value); - } - }, putAll_6ze1sl$:function($receiver, pairs) { - var tmp$1; - tmp$1 = pairs.iterator(); - while (tmp$1.hasNext()) { - var tmp$0 = tmp$1.next(), key = tmp$0.component1(), value = tmp$0.component2(); - $receiver.put_wn2jw4$(key, value); - } - }, mapValues_e1k39z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapValues_e1k39z$", function($receiver, transform) { - var destination = new Kotlin.LinkedHashMap(_.kotlin.collections.mapCapacity($receiver.size)); - var tmp$0; - tmp$0 = $receiver.entries.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(element.key, transform(element)); - } - return destination; - }), mapKeys_e1k39z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapKeys_e1k39z$", function($receiver, transform) { - var destination = new Kotlin.LinkedHashMap(_.kotlin.collections.mapCapacity($receiver.size)); - var tmp$0; - tmp$0 = $receiver.entries.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(transform(element), element.value); - } - return destination; - }), filterKeys_m7gpmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterKeys_m7gpmg$", function($receiver, predicate) { - var tmp$0; - var result = new Kotlin.LinkedHashMap; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var entry = tmp$0.next(); - if (predicate(entry.key)) { - result.put_wn2jw4$(entry.key, entry.value); - } - } - return result; - }), filterValues_m7gpmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterValues_m7gpmg$", function($receiver, predicate) { - var tmp$0; - var result = new Kotlin.LinkedHashMap; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var entry = tmp$0.next(); - if (predicate(entry.value)) { - result.put_wn2jw4$(entry.key, entry.value); - } - } - return result; - }), filterTo_186nyl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_186nyl$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.put_wn2jw4$(element.key, element.value); - } - } - return destination; - }), filter_oixulp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_oixulp$", function($receiver, predicate) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.put_wn2jw4$(element.key, element.value); - } - } - return destination; - }), filterNotTo_186nyl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_186nyl$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.put_wn2jw4$(element.key, element.value); - } - } - return destination; - }), filterNot_oixulp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_oixulp$", function($receiver, predicate) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.put_wn2jw4$(element.key, element.value); - } - } - return destination; - }), toMap_mnrzhp$:function($receiver) { - var tmp$0, tmp$1; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyMap(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.mapOf_dvvt93$(Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List) ? $receiver.get_za3lpa$(0) : $receiver.iterator().next()); - } else { - tmp$1 = _.kotlin.collections.toMap_q9c1bb$($receiver, new Kotlin.LinkedHashMap(_.kotlin.collections.mapCapacity($receiver.size))); - } - } - return tmp$1; - } - return _.kotlin.collections.optimizeReadOnlyMap(_.kotlin.collections.toMap_q9c1bb$($receiver, new Kotlin.LinkedHashMap)); - }, toMap_q9c1bb$:function($receiver, destination) { - _.kotlin.collections.putAll_6588df$(destination, $receiver); - return destination; - }, toMap_sq63gn$:function($receiver) { - var tmp$0; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - return _.kotlin.collections.emptyMap(); - } else { - if (tmp$0 === 1) { - return _.kotlin.collections.mapOf_dvvt93$($receiver[0]); - } else { - return _.kotlin.collections.toMap_6ddun9$($receiver, new Kotlin.LinkedHashMap(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - }, toMap_6ddun9$:function($receiver, destination) { - _.kotlin.collections.putAll_76v9np$(destination, $receiver); - return destination; - }, toMap_t83shn$:function($receiver) { - return _.kotlin.collections.optimizeReadOnlyMap(_.kotlin.collections.toMap_7lph5z$($receiver, new Kotlin.LinkedHashMap)); - }, toMap_7lph5z$:function($receiver, destination) { - _.kotlin.collections.putAll_6ze1sl$(destination, $receiver); - return destination; - }, plus_gd9jsf$:function($receiver, pair) { - if ($receiver.isEmpty()) { - return _.kotlin.collections.mapOf_dvvt93$(pair); - } else { - var $receiver_0 = _.java.util.LinkedHashMap_r12sna$($receiver); - $receiver_0.put_wn2jw4$(pair.first, pair.second); - return $receiver_0; - } - }, plus_1uo6lf$:function($receiver, pairs) { - if ($receiver.isEmpty()) { - return _.kotlin.collections.toMap_mnrzhp$(pairs); - } else { - var $receiver_0 = _.java.util.LinkedHashMap_r12sna$($receiver); - _.kotlin.collections.putAll_6588df$($receiver_0, pairs); - return $receiver_0; - } - }, plus_kx5j6p$:function($receiver, pairs) { - if ($receiver.isEmpty()) { - return _.kotlin.collections.toMap_sq63gn$(pairs); - } else { - var $receiver_0 = _.java.util.LinkedHashMap_r12sna$($receiver); - _.kotlin.collections.putAll_76v9np$($receiver_0, pairs); - return $receiver_0; - } - }, plus_85nxov$:function($receiver, pairs) { - var $receiver_0 = _.java.util.LinkedHashMap_r12sna$($receiver); - _.kotlin.collections.putAll_6ze1sl$($receiver_0, pairs); - return _.kotlin.collections.optimizeReadOnlyMap($receiver_0); - }, plus_y1w8a6$:function($receiver, map) { - var $receiver_0 = _.java.util.LinkedHashMap_r12sna$($receiver); - $receiver_0.putAll_r12sna$(map); - return $receiver_0; - }, plusAssign_fda80b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_fda80b$", function($receiver, pair) { - $receiver.put_wn2jw4$(pair.first, pair.second); - }), plusAssign_6588df$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_6588df$", function($receiver, pairs) { - _.kotlin.collections.putAll_6588df$($receiver, pairs); - }), plusAssign_76v9np$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_76v9np$", function($receiver, pairs) { - _.kotlin.collections.putAll_76v9np$($receiver, pairs); - }), plusAssign_6ze1sl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_6ze1sl$", function($receiver, pairs) { - _.kotlin.collections.putAll_6ze1sl$($receiver, pairs); - }), plusAssign_wb8lso$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_wb8lso$", function($receiver, map) { - $receiver.putAll_r12sna$(map); - }), optimizeReadOnlyMap:function($receiver) { - var tmp$0; - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - return _.kotlin.collections.emptyMap(); - } else { - if (tmp$0 === 1) { - return $receiver; - } else { - return $receiver; - } - } - }, remove_4kvzvw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.remove_4kvzvw$", function($receiver, element) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.MutableCollection) ? tmp$0 : Kotlin.throwCCE()).remove_za3rmp$(element); - }), removeAll_dah1ga$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.removeAll_dah1ga$", function($receiver, elements) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.MutableCollection) ? tmp$0 : Kotlin.throwCCE()).removeAll_wtfk93$(elements); - }), retainAll_dah1ga$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.retainAll_dah1ga$", function($receiver, elements) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.MutableCollection) ? tmp$0 : Kotlin.throwCCE()).retainAll_wtfk93$(elements); - }), remove_ter78v$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.remove_ter78v$", function($receiver, index) { - return $receiver.removeAt_za3lpa$(index); - }), plusAssign_4kvzvw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_4kvzvw$", function($receiver, element) { - $receiver.add_za3rmp$(element); - }), plusAssign_fwwv5a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_fwwv5a$", function($receiver, elements) { - _.kotlin.collections.addAll_fwwv5a$($receiver, elements); - }), plusAssign_jzhv38$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_jzhv38$", function($receiver, elements) { - _.kotlin.collections.addAll_jzhv38$($receiver, elements); - }), plusAssign_h3qeu8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_h3qeu8$", function($receiver, elements) { - _.kotlin.collections.addAll_h3qeu8$($receiver, elements); - }), minusAssign_4kvzvw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minusAssign_4kvzvw$", function($receiver, element) { - $receiver.remove_za3rmp$(element); - }), minusAssign_fwwv5a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minusAssign_fwwv5a$", function($receiver, elements) { - _.kotlin.collections.removeAll_fwwv5a$($receiver, elements); - }), minusAssign_jzhv38$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minusAssign_jzhv38$", function($receiver, elements) { - _.kotlin.collections.removeAll_jzhv38$($receiver, elements); - }), minusAssign_h3qeu8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minusAssign_h3qeu8$", function($receiver, elements) { - _.kotlin.collections.removeAll_h3qeu8$($receiver, elements); - }), addAll_fwwv5a$:function($receiver, elements) { - var tmp$0; - if (Kotlin.isType(elements, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return $receiver.addAll_wtfk93$(elements); - } else { - var result = false; - tmp$0 = elements.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if ($receiver.add_za3rmp$(item)) { - result = true; - } - } - return result; - } - }, addAll_h3qeu8$:function($receiver, elements) { - var tmp$0; - var result = false; - tmp$0 = elements.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if ($receiver.add_za3rmp$(item)) { - result = true; - } - } - return result; - }, addAll_jzhv38$:function($receiver, elements) { - return $receiver.addAll_wtfk93$(_.kotlin.collections.asList_eg9ybj$(elements)); - }, removeAll_d717bt$:function($receiver, predicate) { - return _.kotlin.collections.filterInPlace($receiver, predicate, true); - }, retainAll_d717bt$:function($receiver, predicate) { - return _.kotlin.collections.filterInPlace($receiver, predicate, false); - }, filterInPlace:function($receiver, predicate, predicateResultToRemove) { - var result = {v:false}; - var $this = $receiver.iterator(); - while ($this.hasNext()) { - if (Kotlin.equals(predicate($this.next()), predicateResultToRemove)) { - $this.remove(); - result.v = true; - } - } - return result.v; - }, removeAll_5xdc4t$:function($receiver, predicate) { - return _.kotlin.collections.filterInPlace_1($receiver, predicate, true); - }, retainAll_5xdc4t$:function($receiver, predicate) { - return _.kotlin.collections.filterInPlace_1($receiver, predicate, false); - }, filterInPlace_1:function($receiver, predicate, predicateResultToRemove) { - var tmp$0, tmp$1, tmp$2; - if (!Kotlin.isType($receiver, Kotlin.RandomAccess)) { - return _.kotlin.collections.filterInPlace($receiver, predicate, predicateResultToRemove); - } - var writeIndex = 0; - tmp$1 = _.kotlin.collections.get_lastIndex_a7ptmv$($receiver); - for (var readIndex = 0;readIndex <= tmp$1;readIndex++) { - var element = $receiver.get_za3lpa$(readIndex); - if (Kotlin.equals(predicate(element), predicateResultToRemove)) { - continue; - } - if (writeIndex !== readIndex) { - $receiver.set_vux3hl$(writeIndex, element); - } - writeIndex++; - } - if (writeIndex < $receiver.size) { - tmp$2 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_a7ptmv$($receiver), writeIndex).iterator(); - while (tmp$2.hasNext()) { - var removeIndex = tmp$2.next(); - $receiver.removeAt_za3lpa$(removeIndex); - } - return true; - } else { - return false; - } - }, removeAll_fwwv5a$:function($receiver, elements) { - var elements_0 = _.kotlin.collections.convertToSetForSetOperationWith(elements, $receiver); - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.MutableCollection) ? tmp$0 : Kotlin.throwCCE()).removeAll_wtfk93$(elements_0); - }, removeAll_h3qeu8$:function($receiver, elements) { - var set = _.kotlin.sequences.toHashSet_uya9q7$(elements); - return!set.isEmpty() && $receiver.removeAll_wtfk93$(set); - }, removeAll_jzhv38$:function($receiver, elements) { - return!(elements.length === 0) && $receiver.removeAll_wtfk93$(_.kotlin.collections.toHashSet_eg9ybj$(elements)); - }, retainAll_fwwv5a$:function($receiver, elements) { - var elements_0 = _.kotlin.collections.convertToSetForSetOperationWith(elements, $receiver); - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.MutableCollection) ? tmp$0 : Kotlin.throwCCE()).retainAll_wtfk93$(elements_0); - }, retainAll_jzhv38$:function($receiver, elements) { - if (!(elements.length === 0)) { - return $receiver.retainAll_wtfk93$(_.kotlin.collections.toHashSet_eg9ybj$(elements)); - } else { - return _.kotlin.collections.retainNothing($receiver); - } - }, retainAll_h3qeu8$:function($receiver, elements) { - var set = _.kotlin.sequences.toHashSet_uya9q7$(elements); - if (!set.isEmpty()) { - return $receiver.retainAll_wtfk93$(set); - } else { - return _.kotlin.collections.retainNothing($receiver); - } - }, retainNothing:function($receiver) { - var result = !$receiver.isEmpty(); - $receiver.clear(); - return result; - }, sort_h06zi1$:function($receiver) { - if ($receiver.size > 1) { - _.java.util.Collections.sort_pr3zit$($receiver); - } - }, sortWith_lcufbu$:function($receiver, comparator) { - if ($receiver.size > 1) { - _.java.util.Collections.sort_k5qxi4$($receiver, comparator); - } - }, ReversedListReadOnly:Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function $fun(delegate) { - $fun.baseInitializer.call(this); - this.$delegate_h46x6d$ = delegate; - }, {delegate:{get:function() { - return this.$delegate_h46x6d$; - }}, size:{get:function() { - return this.delegate.size; - }}, get_za3lpa$:function(index) { - return this.delegate.get_za3lpa$(this.flipIndex_s8ev3o$(index)); - }, flipIndex_s8ev3o$:function($receiver) { - if ((new Kotlin.NumberRange(0, this.size - 1)).contains_htax2k$($receiver)) { - return this.size - $receiver - 1; - } else { - throw new Kotlin.IndexOutOfBoundsException("index " + $receiver + " should be in range [" + new Kotlin.NumberRange(0, this.size - 1) + "]."); - } - }, flipIndexForward_s8ev3o$:function($receiver) { - if ((new Kotlin.NumberRange(0, this.size)).contains_htax2k$($receiver)) { - return this.size - $receiver; - } else { - throw new Kotlin.IndexOutOfBoundsException("index " + $receiver + " should be in range [" + new Kotlin.NumberRange(0, this.size) + "]."); - } - }}), ReversedList:Kotlin.createClass(function() { - return[_.kotlin.collections.ReversedListReadOnly]; - }, function $fun(delegate) { - $fun.baseInitializer.call(this, delegate); - this.$delegate_20w7qr$ = delegate; - }, {delegate:{get:function() { - return this.$delegate_20w7qr$; - }}, clear:function() { - this.delegate.clear(); - }, removeAt_za3lpa$:function(index) { - return this.delegate.removeAt_za3lpa$(this.flipIndex_s8ev3o$(index)); - }, set_vux3hl$:function(index, element) { - return this.delegate.set_vux3hl$(this.flipIndex_s8ev3o$(index), element); - }, add_vux3hl$:function(index, element) { - this.delegate.add_vux3hl$(this.flipIndexForward_s8ev3o$(index), element); - }}), asReversed_a7ptmv$:function($receiver) { - return new _.kotlin.collections.ReversedListReadOnly($receiver); - }, asReversed_sqtfhv$:function($receiver) { - return new _.kotlin.collections.ReversedList($receiver); - }, EmptySet:Kotlin.createObject(function() { - return[_.java.io.Serializable, Kotlin.modules["builtins"].kotlin.collections.Set]; - }, null, {equals_za3rmp$:function(other) { - return Kotlin.isType(other, Kotlin.modules["builtins"].kotlin.collections.Set) && other.isEmpty(); - }, hashCode:function() { - return 0; - }, toString:function() { - return "[]"; - }, size:{get:function() { - return 0; - }}, isEmpty:function() { - return true; - }, contains_za3rmp$:function(element) { - return false; - }, containsAll_wtfk93$:function(elements) { - return elements.isEmpty(); - }, iterator:function() { - return _.kotlin.collections.EmptyIterator; - }, readResolve:function() { - return _.kotlin.collections.EmptySet; - }}), emptySet:function() { - return _.kotlin.collections.EmptySet; - }, setOf_9mqe4v$:function(elements) { - return elements.length > 0 ? _.kotlin.collections.toSet_eg9ybj$(elements) : _.kotlin.collections.emptySet(); - }, setOf:Kotlin.defineInlineFunction("stdlib.kotlin.collections.setOf", function() { - return _.kotlin.collections.emptySet(); - }), mutableSetOf_9mqe4v$:function(elements) { - return _.kotlin.collections.toCollection_ajv5ds$(elements, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity(elements.length))); - }, hashSetOf_9mqe4v$:function(elements) { - return _.kotlin.collections.toCollection_ajv5ds$(elements, new Kotlin.ComplexHashSet(_.kotlin.collections.mapCapacity(elements.length))); - }, linkedSetOf_9mqe4v$:function(elements) { - return _.kotlin.collections.toCollection_ajv5ds$(elements, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity(elements.length))); - }, orEmpty_9io49b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.orEmpty_9io49b$", function($receiver) { - return $receiver != null ? $receiver : _.kotlin.collections.emptySet(); - }), optimizeReadOnlySet:function($receiver) { - var tmp$0; - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - return _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - return _.kotlin.collections.setOf_za3rmp$($receiver.iterator().next()); - } else { - return $receiver; - } - } - }}), synchronized_pzucw5$:Kotlin.defineInlineFunction("stdlib.kotlin.synchronized_pzucw5$", function(lock, block) { - return block(); - }), emptyArray:Kotlin.defineInlineFunction("stdlib.kotlin.emptyArray", function(isT) { - var tmp$0; - return Array.isArray(tmp$0 = Kotlin.nullArray(0)) ? tmp$0 : Kotlin.throwCCE(); - }), lazy_un3fny$:function(initializer) { - return new _.kotlin.UnsafeLazyImpl(initializer); - }, lazy_b4usna$:function(mode, initializer) { - return new _.kotlin.UnsafeLazyImpl(initializer); - }, lazy_pzucw5$:function(lock, initializer) { - return new _.kotlin.UnsafeLazyImpl(initializer); - }, arrayOfNulls:function(reference, size) { - var tmp$0; - return Array.isArray(tmp$0 = Kotlin.nullArray(size)) ? tmp$0 : Kotlin.throwCCE(); - }, arrayCopyResize:function(source, newSize, defaultValue) { - var result = source.slice(0, newSize); - var index = source.length; - if (newSize > index) { - result.length = newSize; - while (index < newSize) { - result[index++] = defaultValue; - } - } - return result; - }, arrayPlusCollection:function(array, collection) { - var tmp$0; - var result = array.slice(); - result.length += collection.size; - var index = array.length; - tmp$0 = collection.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toSingletonMap:function($receiver) { - return $receiver; - }, copyToArrayOfAny:function($receiver, isVarargs) { - return isVarargs ? $receiver : $receiver.slice(); - }, isNaN_yrwdxs$:function($receiver) { - return $receiver !== $receiver; - }, isNaN_81szl$:function($receiver) { - return $receiver !== $receiver; - }, isInfinite_yrwdxs$:function($receiver) { - return $receiver === Kotlin.modules["stdlib"].kotlin.js.internal.DoubleCompanionObject.POSITIVE_INFINITY || $receiver === Kotlin.modules["stdlib"].kotlin.js.internal.DoubleCompanionObject.NEGATIVE_INFINITY; - }, isInfinite_81szl$:function($receiver) { - return $receiver === Kotlin.modules["stdlib"].kotlin.js.internal.FloatCompanionObject.POSITIVE_INFINITY || $receiver === Kotlin.modules["stdlib"].kotlin.js.internal.FloatCompanionObject.NEGATIVE_INFINITY; - }, isFinite_yrwdxs$:function($receiver) { - return!_.kotlin.isInfinite_yrwdxs$($receiver) && !_.kotlin.isNaN_yrwdxs$($receiver); - }, isFinite_81szl$:function($receiver) { - return!_.kotlin.isInfinite_81szl$($receiver) && !_.kotlin.isNaN_81szl$($receiver); - }, Unit:Kotlin.createObject(null, null, {toString:function() { - return "kotlin.Unit"; - }}), Lazy:Kotlin.createTrait(null), lazyOf_za3rmp$:function(value) { - return new _.kotlin.InitializedLazyImpl(value); - }, getValue_em0fd4$:Kotlin.defineInlineFunction("stdlib.kotlin.getValue_em0fd4$", function($receiver, thisRef, property) { - return $receiver.value; - }), LazyThreadSafetyMode:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{SYNCHRONIZED:function() { - return new _.kotlin.LazyThreadSafetyMode; - }, PUBLICATION:function() { - return new _.kotlin.LazyThreadSafetyMode; - }, NONE:function() { - return new _.kotlin.LazyThreadSafetyMode; - }}; - }), UNINITIALIZED_VALUE:Kotlin.createObject(null, null), SynchronizedLazyImpl:Kotlin.createClass(function() { - return[_.java.io.Serializable, _.kotlin.Lazy]; - }, function(initializer, lock) { - if (lock === void 0) { - lock = null; - } - this.initializer_r73809$ = initializer; - this._value_vvwq51$ = _.kotlin.UNINITIALIZED_VALUE; - this.lock_1qw5us$ = lock != null ? lock : this; - }, {value:{get:function() { - var tmp$0; - var _v1 = this._value_vvwq51$; - if (_v1 !== _.kotlin.UNINITIALIZED_VALUE) { - return(tmp$0 = _v1) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - } - var tmp$2, tmp$1; - var _v2 = this._value_vvwq51$; - if (_v2 !== _.kotlin.UNINITIALIZED_VALUE) { - return(tmp$2 = _v2) == null || tmp$2 != null ? tmp$2 : Kotlin.throwCCE(); - } else { - var typedValue = ((tmp$1 = this.initializer_r73809$) != null ? tmp$1 : Kotlin.throwNPE())(); - this._value_vvwq51$ = typedValue; - this.initializer_r73809$ = null; - return typedValue; - } - }}, isInitialized:function() { - return this._value_vvwq51$ !== _.kotlin.UNINITIALIZED_VALUE; - }, toString:function() { - return this.isInitialized() ? Kotlin.toString(this.value) : "Lazy value not initialized yet."; - }, writeReplace:function() { - return new _.kotlin.InitializedLazyImpl(this.value); - }}, {}), UnsafeLazyImpl:Kotlin.createClass(function() { - return[_.java.io.Serializable, _.kotlin.Lazy]; - }, function(initializer) { - this.initializer_r8paat$ = initializer; - this._value_94f8d5$ = _.kotlin.UNINITIALIZED_VALUE; - }, {value:{get:function() { - var tmp$0, tmp$1; - if (this._value_94f8d5$ === _.kotlin.UNINITIALIZED_VALUE) { - this._value_94f8d5$ = ((tmp$0 = this.initializer_r8paat$) != null ? tmp$0 : Kotlin.throwNPE())(); - this.initializer_r8paat$ = null; - } - return(tmp$1 = this._value_94f8d5$) == null || tmp$1 != null ? tmp$1 : Kotlin.throwCCE(); - }}, isInitialized:function() { - return this._value_94f8d5$ !== _.kotlin.UNINITIALIZED_VALUE; - }, toString:function() { - return this.isInitialized() ? Kotlin.toString(this.value) : "Lazy value not initialized yet."; - }, writeReplace:function() { - return new _.kotlin.InitializedLazyImpl(this.value); - }}), InitializedLazyImpl:Kotlin.createClass(function() { - return[_.java.io.Serializable, _.kotlin.Lazy]; - }, function(value) { - this.$value_2jk7vi$ = value; - }, {value:{get:function() { - return this.$value_2jk7vi$; - }}, isInitialized:function() { - return true; - }, toString:function() { - return Kotlin.toString(this.value); - }}), require_6taknv$:Kotlin.defineInlineFunction("stdlib.kotlin.require_6taknv$", function(value) { - if (!value) { - var message = "Failed requirement."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - }), require_588y69$:Kotlin.defineInlineFunction("stdlib.kotlin.require_588y69$", function(value, lazyMessage) { - if (!value) { - var message = lazyMessage(); - throw new Kotlin.IllegalArgumentException(message.toString()); - } - }), requireNotNull_za3rmp$:Kotlin.defineInlineFunction("stdlib.kotlin.requireNotNull_za3rmp$", function(value) { - if (value == null) { - var message = "Required value was null."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } else { - return value; - } - }), requireNotNull_pzucw5$:Kotlin.defineInlineFunction("stdlib.kotlin.requireNotNull_pzucw5$", function(value, lazyMessage) { - if (value == null) { - var message = lazyMessage(); - throw new Kotlin.IllegalArgumentException(message.toString()); - } else { - return value; - } - }), check_6taknv$:Kotlin.defineInlineFunction("stdlib.kotlin.check_6taknv$", function(value) { - if (!value) { - var message = "Check failed."; - throw new Kotlin.IllegalStateException(message.toString()); - } - }), check_588y69$:Kotlin.defineInlineFunction("stdlib.kotlin.check_588y69$", function(value, lazyMessage) { - if (!value) { - var message = lazyMessage(); - throw new Kotlin.IllegalStateException(message.toString()); - } - }), checkNotNull_za3rmp$:Kotlin.defineInlineFunction("stdlib.kotlin.checkNotNull_za3rmp$", function(value) { - if (value == null) { - var message = "Required value was null."; - throw new Kotlin.IllegalStateException(message.toString()); - } else { - return value; - } - }), checkNotNull_pzucw5$:Kotlin.defineInlineFunction("stdlib.kotlin.checkNotNull_pzucw5$", function(value, lazyMessage) { - if (value == null) { - var message = lazyMessage(); - throw new Kotlin.IllegalStateException(message.toString()); - } else { - return value; - } - }), error_za3rmp$:Kotlin.defineInlineFunction("stdlib.kotlin.error_za3rmp$", function(message) { - throw new Kotlin.IllegalStateException(message.toString()); - }), NotImplementedError:Kotlin.createClass(function() { - return[Kotlin.Error]; - }, function $fun(message) { - if (message === void 0) { - message = "An operation is not implemented."; - } - $fun.baseInitializer.call(this, message); - }), TODO:Kotlin.defineInlineFunction("stdlib.kotlin.TODO", function() { - throw new _.kotlin.NotImplementedError; - }), TODO_61zpoe$:Kotlin.defineInlineFunction("stdlib.kotlin.TODO_61zpoe$", function(reason) { - throw new _.kotlin.NotImplementedError("An operation is not implemented: " + reason); - }), run_un3fny$:Kotlin.defineInlineFunction("stdlib.kotlin.run_un3fny$", function(block) { - return block(); - }), run_7hr6ff$:Kotlin.defineInlineFunction("stdlib.kotlin.run_7hr6ff$", function($receiver, block) { - return block.call($receiver); - }), with_hiyix$:Kotlin.defineInlineFunction("stdlib.kotlin.with_hiyix$", function(receiver, block) { - return block.call(receiver); - }), apply_ji1yox$:Kotlin.defineInlineFunction("stdlib.kotlin.apply_ji1yox$", function($receiver, block) { - block.call($receiver); - return $receiver; - }), let_7hr6ff$:Kotlin.defineInlineFunction("stdlib.kotlin.let_7hr6ff$", function($receiver, block) { - return block($receiver); - }), repeat_nxnjqh$:Kotlin.defineInlineFunction("stdlib.kotlin.repeat_nxnjqh$", function(times, action) { - var tmp$0; - tmp$0 = times - 1; - for (var index = 0;index <= tmp$0;index++) { - action(index); - } - }), Pair:Kotlin.createClass(function() { - return[_.java.io.Serializable]; - }, function(first, second) { - this.first = first; - this.second = second; - }, {toString:function() { - return "(" + this.first + ", " + this.second + ")"; - }, component1:function() { - return this.first; - }, component2:function() { - return this.second; - }, copy_wn2jw4$:function(first, second) { - return new _.kotlin.Pair(first === void 0 ? this.first : first, second === void 0 ? this.second : second); - }, hashCode:function() { - var result = 0; - result = result * 31 + Kotlin.hashCode(this.first) | 0; - result = result * 31 + Kotlin.hashCode(this.second) | 0; - return result; - }, equals_za3rmp$:function(other) { - return this === other || other !== null && (typeof other === "object" && (Object.getPrototypeOf(this) === Object.getPrototypeOf(other) && (Kotlin.equals(this.first, other.first) && Kotlin.equals(this.second, other.second)))); - }}), to_l1ob02$:function($receiver, that) { - return new _.kotlin.Pair($receiver, that); - }, toList_49pv07$:function($receiver) { - return _.kotlin.collections.listOf_9mqe4v$([$receiver.first, $receiver.second]); - }, Triple:Kotlin.createClass(function() { - return[_.java.io.Serializable]; - }, function(first, second, third) { - this.first = first; - this.second = second; - this.third = third; - }, {toString:function() { - return "(" + this.first + ", " + this.second + ", " + this.third + ")"; - }, component1:function() { - return this.first; - }, component2:function() { - return this.second; - }, component3:function() { - return this.third; - }, copy_2br51b$:function(first, second, third) { - return new _.kotlin.Triple(first === void 0 ? this.first : first, second === void 0 ? this.second : second, third === void 0 ? this.third : third); - }, hashCode:function() { - var result = 0; - result = result * 31 + Kotlin.hashCode(this.first) | 0; - result = result * 31 + Kotlin.hashCode(this.second) | 0; - result = result * 31 + Kotlin.hashCode(this.third) | 0; - return result; - }, equals_za3rmp$:function(other) { - return this === other || other !== null && (typeof other === "object" && (Object.getPrototypeOf(this) === Object.getPrototypeOf(other) && (Kotlin.equals(this.first, other.first) && (Kotlin.equals(this.second, other.second) && Kotlin.equals(this.third, other.third))))); - }}), toList_lyhsl6$:function($receiver) { - return _.kotlin.collections.listOf_9mqe4v$([$receiver.first, $receiver.second, $receiver.third]); - }, sequences:Kotlin.definePackage(null, {ConstrainedOnceSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence) { - this.sequenceRef_sxf5v1$ = sequence; - }, {iterator:function() { - var tmp$0; - tmp$0 = this.sequenceRef_sxf5v1$; - if (tmp$0 == null) { - throw new Kotlin.IllegalStateException("This sequence can be consumed only once."); - } - var sequence = tmp$0; - this.sequenceRef_sxf5v1$ = null; - return sequence.iterator(); - }}), contains_8xuhcw$:function($receiver, element) { - return _.kotlin.sequences.indexOf_8xuhcw$($receiver, element) >= 0; - }, elementAt_8xunab$f:function(closure$index) { - return function(it) { - throw new Kotlin.IndexOutOfBoundsException("Sequence doesn't contain element at index " + closure$index + "."); - }; - }, elementAt_8xunab$:function($receiver, index) { - return _.kotlin.sequences.elementAtOrElse_1xituq$($receiver, index, _.kotlin.sequences.elementAt_8xunab$f(index)); - }, elementAtOrElse_1xituq$:function($receiver, index, defaultValue) { - if (index < 0) { - return defaultValue(index); - } - var iterator = $receiver.iterator(); - var count = 0; - while (iterator.hasNext()) { - var element = iterator.next(); - if (index === count++) { - return element; - } - } - return defaultValue(index); - }, elementAtOrNull_8xunab$:function($receiver, index) { - if (index < 0) { - return null; - } - var iterator = $receiver.iterator(); - var count = 0; - while (iterator.hasNext()) { - var element = iterator.next(); - if (index === count++) { - return element; - } - } - return null; - }, find_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.find_6bub1b$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.findLast_6bub1b$", function($receiver, predicate) { - var tmp$0; - var last = null; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - last = element; - } - } - return last; - }), first_uya9q7$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.NoSuchElementException("Sequence is empty."); - } - return iterator.next(); - }, first_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.first_6bub1b$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Sequence contains no element matching the predicate."); - }), firstOrNull_uya9q7$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - return iterator.next(); - }, firstOrNull_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.firstOrNull_6bub1b$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), indexOf_8xuhcw$:function($receiver, element) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (Kotlin.equals(element, item)) { - return index; - } - index++; - } - return-1; - }, indexOfFirst_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.indexOfFirst_6bub1b$", function($receiver, predicate) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(item)) { - return index; - } - index++; - } - return-1; - }), indexOfLast_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.indexOfLast_6bub1b$", function($receiver, predicate) { - var tmp$0; - var lastIndex = -1; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(item)) { - lastIndex = index; - } - index++; - } - return lastIndex; - }), last_uya9q7$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.NoSuchElementException("Sequence is empty."); - } - var last = iterator.next(); - while (iterator.hasNext()) { - last = iterator.next(); - } - return last; - }, last_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.last_6bub1b$", function($receiver, predicate) { - var tmp$0, tmp$1; - var last = null; - var found = false; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - last = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Sequence contains no element matching the predicate."); - } - return(tmp$1 = last) == null || tmp$1 != null ? tmp$1 : Kotlin.throwCCE(); - }), lastIndexOf_8xuhcw$:function($receiver, element) { - var tmp$0; - var lastIndex = -1; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (Kotlin.equals(element, item)) { - lastIndex = index; - } - index++; - } - return lastIndex; - }, lastOrNull_uya9q7$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var last = iterator.next(); - while (iterator.hasNext()) { - last = iterator.next(); - } - return last; - }, lastOrNull_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.lastOrNull_6bub1b$", function($receiver, predicate) { - var tmp$0; - var last = null; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - last = element; - } - } - return last; - }), single_uya9q7$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.NoSuchElementException("Sequence is empty."); - } - var single = iterator.next(); - if (iterator.hasNext()) { - throw new Kotlin.IllegalArgumentException("Sequence has more than one element."); - } - return single; - }, single_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.single_6bub1b$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Sequence contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Sequence contains no element matching the predicate."); - } - return(tmp$1 = single) == null || tmp$1 != null ? tmp$1 : Kotlin.throwCCE(); - }), singleOrNull_uya9q7$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var single = iterator.next(); - if (iterator.hasNext()) { - return null; - } - return single; - }, singleOrNull_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.singleOrNull_6bub1b$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), drop_8xunab$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - tmp$0 = $receiver; - } else { - if (Kotlin.isType($receiver, _.kotlin.sequences.DropTakeSequence)) { - tmp$0 = $receiver.drop_za3lpa$(n); - } else { - tmp$0 = new _.kotlin.sequences.DropSequence($receiver, n); - } - } - return tmp$0; - }, dropWhile_6bub1b$:function($receiver, predicate) { - return new _.kotlin.sequences.DropWhileSequence($receiver, predicate); - }, filter_6bub1b$:function($receiver, predicate) { - return new _.kotlin.sequences.FilteringSequence($receiver, true, predicate); - }, filterIndexed_2lipl8$f:function(closure$predicate) { - return function(it) { - return closure$predicate(it.index, it.value); - }; - }, filterIndexed_2lipl8$f_0:function(it) { - return it.value; - }, filterIndexed_2lipl8$:function($receiver, predicate) { - return new _.kotlin.sequences.TransformingSequence(new _.kotlin.sequences.FilteringSequence(new _.kotlin.sequences.IndexingSequence($receiver), true, _.kotlin.sequences.filterIndexed_2lipl8$f(predicate)), _.kotlin.sequences.filterIndexed_2lipl8$f_0); - }, filterIndexedTo_rs7kz9$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.filterIndexedTo_rs7kz9$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIsInstance_uya9q7$f:function(isR) { - return function(it) { - return isR(it); - }; - }, filterIsInstance_uya9q7$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.filterIsInstance_uya9q7$", function(isR, $receiver) { - var tmp$0; - return Kotlin.isType(tmp$0 = _.kotlin.sequences.filter_6bub1b$($receiver, _.kotlin.sequences.filterIsInstance_uya9q7$f(isR)), _.kotlin.sequences.Sequence) ? tmp$0 : Kotlin.throwCCE(); - }), filterIsInstanceTo_9pj6f6$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.filterIsInstanceTo_9pj6f6$", function(isR, $receiver, destination) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (isR(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_6bub1b$:function($receiver, predicate) { - return new _.kotlin.sequences.FilteringSequence($receiver, false, predicate); - }, filterNotNull_uya9q7$f:function(it) { - return it == null; - }, filterNotNull_uya9q7$:function($receiver) { - var tmp$0; - return Kotlin.isType(tmp$0 = _.kotlin.sequences.filterNot_6bub1b$($receiver, _.kotlin.sequences.filterNotNull_uya9q7$f), _.kotlin.sequences.Sequence) ? tmp$0 : Kotlin.throwCCE(); - }, filterNotNullTo_9pj6f6$:function($receiver, destination) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (element != null) { - destination.add_za3rmp$(element); - } - } - return destination; - }, filterNotTo_z1ybyi$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.filterNotTo_z1ybyi$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_z1ybyi$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.filterTo_z1ybyi$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), take_8xunab$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - tmp$0 = _.kotlin.sequences.emptySequence(); - } else { - if (Kotlin.isType($receiver, _.kotlin.sequences.DropTakeSequence)) { - tmp$0 = $receiver.take_za3lpa$(n); - } else { - tmp$0 = new _.kotlin.sequences.TakeSequence($receiver, n); - } - } - return tmp$0; - }, takeWhile_6bub1b$:function($receiver, predicate) { - return new _.kotlin.sequences.TakeWhileSequence($receiver, predicate); - }, sorted$f:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(this$sorted_0) { - this.this$sorted_0 = this$sorted_0; - }, {iterator:function() { - var sortedList = _.kotlin.sequences.toMutableList_uya9q7$(this.this$sorted_0); - _.kotlin.collections.sort_h06zi1$(sortedList); - return sortedList.iterator(); - }}, {}), sorted_f9rmbp$:function($receiver) { - return new _.kotlin.sequences.sorted$f($receiver); - }, sortedBy_5y3tfr$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.sortedBy_5y3tfr$", function($receiver, selector) { - return _.kotlin.sequences.sortedWith_pwgv1i$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedByDescending_5y3tfr$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.sortedByDescending_5y3tfr$", function($receiver, selector) { - return _.kotlin.sequences.sortedWith_pwgv1i$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedDescending_f9rmbp$:function($receiver) { - return _.kotlin.sequences.sortedWith_pwgv1i$($receiver, _.kotlin.comparisons.reverseOrder()); - }, sortedWith$f:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(this$sortedWith_0, closure$comparator_0) { - this.this$sortedWith_0 = this$sortedWith_0; - this.closure$comparator_0 = closure$comparator_0; - }, {iterator:function() { - var sortedList = _.kotlin.sequences.toMutableList_uya9q7$(this.this$sortedWith_0); - _.kotlin.collections.sortWith_lcufbu$(sortedList, this.closure$comparator_0); - return sortedList.iterator(); - }}, {}), sortedWith_pwgv1i$:function($receiver, comparator) { - return new _.kotlin.sequences.sortedWith$f($receiver, comparator); - }, associate_212ozr$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.associate_212ozr$", function($receiver, transform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateBy_mzhnvn$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.associateBy_mzhnvn$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_mq2phn$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.associateBy_mq2phn$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_7yy56l$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.associateByTo_7yy56l$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_z626hh$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.associateByTo_z626hh$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateTo_y82m8p$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.associateTo_y82m8p$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), toCollection_9pj6f6$:function($receiver, destination) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toHashSet_uya9q7$:function($receiver) { - return _.kotlin.sequences.toCollection_9pj6f6$($receiver, new Kotlin.ComplexHashSet); - }, toList_uya9q7$:function($receiver) { - return _.kotlin.collections.optimizeReadOnlyList(_.kotlin.sequences.toMutableList_uya9q7$($receiver)); - }, toMutableList_uya9q7$:function($receiver) { - return _.kotlin.sequences.toCollection_9pj6f6$($receiver, new Kotlin.ArrayList); - }, toSet_uya9q7$:function($receiver) { - return _.kotlin.collections.optimizeReadOnlySet(_.kotlin.sequences.toCollection_9pj6f6$($receiver, new Kotlin.LinkedHashSet)); - }, flatMap_f7251y$f:function(it) { - return it.iterator(); - }, flatMap_f7251y$:function($receiver, transform) { - return new _.kotlin.sequences.FlatteningSequence($receiver, transform, _.kotlin.sequences.flatMap_f7251y$f); - }, flatMapTo_mxza43$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.flatMapTo_mxza43$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_h3qeu8$(destination, list); - } - return destination; - }), groupBy_mzhnvn$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.groupBy_mzhnvn$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_mq2phn$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.groupBy_mq2phn$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_ngq3c4$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.groupByTo_ngq3c4$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_315m50$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.groupByTo_315m50$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), map_mzhnvn$:function($receiver, transform) { - return new _.kotlin.sequences.TransformingSequence($receiver, transform); - }, mapIndexed_68ttmg$:function($receiver, transform) { - return new _.kotlin.sequences.TransformingIndexedSequence($receiver, transform); - }, mapIndexedNotNull_68ttmg$:function($receiver, transform) { - return _.kotlin.sequences.filterNotNull_uya9q7$(new _.kotlin.sequences.TransformingIndexedSequence($receiver, transform)); - }, mapIndexedNotNullTo_1k8h0x$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.mapIndexedNotNullTo_1k8h0x$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapIndexedTo_1k8h0x$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.mapIndexedTo_1k8h0x$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapNotNull_mzhnvn$:function($receiver, transform) { - return _.kotlin.sequences.filterNotNull_uya9q7$(new _.kotlin.sequences.TransformingSequence($receiver, transform)); - }, mapNotNullTo_qkxpve$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.mapNotNullTo_qkxpve$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapTo_qkxpve$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.mapTo_qkxpve$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), withIndex_uya9q7$:function($receiver) { - return new _.kotlin.sequences.IndexingSequence($receiver); - }, distinct_uya9q7$f:function(it) { - return it; - }, distinct_uya9q7$:function($receiver) { - return _.kotlin.sequences.distinctBy_mzhnvn$($receiver, _.kotlin.sequences.distinct_uya9q7$f); - }, distinctBy_mzhnvn$:function($receiver, selector) { - return new _.kotlin.sequences.DistinctSequence($receiver, selector); - }, toMutableSet_uya9q7$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, all_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.all_6bub1b$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), any_uya9q7$:function($receiver) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.any_6bub1b$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), count_uya9q7$:function($receiver) { - var tmp$0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - count++; - } - return count; - }, count_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.count_6bub1b$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), fold_vmk5me$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.fold_vmk5me$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), foldIndexed_xn82zj$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.foldIndexed_xn82zj$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), forEach_1y3f5d$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.forEach_1y3f5d$", function($receiver, action) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEachIndexed_jsn8xw$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.forEachIndexed_jsn8xw$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), max_f9rmbp$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var max = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (Kotlin.compareTo(max, e) < 0) { - max = e; - } - } - return max; - }, maxBy_5y3tfr$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.maxBy_5y3tfr$", function($receiver, selector) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var maxElem = iterator.next(); - var maxValue = selector(maxElem); - while (iterator.hasNext()) { - var e = iterator.next(); - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxWith_pwgv1i$:function($receiver, comparator) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var max = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, min_f9rmbp$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var min = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (Kotlin.compareTo(min, e) > 0) { - min = e; - } - } - return min; - }, minBy_5y3tfr$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.minBy_5y3tfr$", function($receiver, selector) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var minElem = iterator.next(); - var minValue = selector(minElem); - while (iterator.hasNext()) { - var e = iterator.next(); - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minWith_pwgv1i$:function($receiver, comparator) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var min = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, none_uya9q7$:function($receiver) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.none_6bub1b$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), reduce_u0tld7$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.reduce_u0tld7$", function($receiver, operation) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.UnsupportedOperationException("Empty sequence can't be reduced."); - } - var accumulator = iterator.next(); - while (iterator.hasNext()) { - accumulator = operation(accumulator, iterator.next()); - } - return accumulator; - }), reduceIndexed_t3v3h2$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.reduceIndexed_t3v3h2$", function($receiver, operation) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.UnsupportedOperationException("Empty sequence can't be reduced."); - } - var index = 1; - var accumulator = iterator.next(); - while (iterator.hasNext()) { - accumulator = operation(index++, accumulator, iterator.next()); - } - return accumulator; - }), sumBy_mzck3q$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.sumBy_mzck3q$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_awo3oi$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.sumByDouble_awo3oi$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), requireNoNulls_uya9q7$f:function(this$requireNoNulls) { - return function(it) { - if (it == null) { - throw new Kotlin.IllegalArgumentException("null element found in " + this$requireNoNulls + "."); - } - return it; - }; - }, requireNoNulls_uya9q7$:function($receiver) { - return _.kotlin.sequences.map_mzhnvn$($receiver, _.kotlin.sequences.requireNoNulls_uya9q7$f($receiver)); - }, minus$f:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(this$minus_0, closure$element_0) { - this.this$minus_0 = this$minus_0; - this.closure$element_0 = closure$element_0; - }, {iterator:function() { - var removed = {v:false}; - return _.kotlin.sequences.filter_6bub1b$(this.this$minus_0, _.kotlin.sequences.minus$f.iterator$f(removed, this.closure$element_0)).iterator(); - }}, {iterator$f:function(closure$removed, closure$element) { - return function(it) { - if (!closure$removed.v && Kotlin.equals(it, closure$element)) { - closure$removed.v = true; - return false; - } else { - return true; - } - }; - }}), minus_8xuhcw$:function($receiver, element) { - return new _.kotlin.sequences.minus$f($receiver, element); - }, minus$f_0:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(closure$elements_0, this$minus_0) { - this.closure$elements_0 = closure$elements_0; - this.this$minus_0 = this$minus_0; - }, {iterator:function() { - var other = _.kotlin.collections.toHashSet_eg9ybj$(this.closure$elements_0); - return _.kotlin.sequences.filterNot_6bub1b$(this.this$minus_0, _.kotlin.sequences.minus$f_0.iterator$f(other)).iterator(); - }}, {iterator$f:function(closure$other) { - return function(it) { - return closure$other.contains_za3rmp$(it); - }; - }}), minus_l2r1yo$:function($receiver, elements) { - if (elements.length === 0) { - return $receiver; - } - return new _.kotlin.sequences.minus$f_0(elements, $receiver); - }, minus$f_1:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(closure$elements_0, this$minus_0) { - this.closure$elements_0 = closure$elements_0; - this.this$minus_0 = this$minus_0; - }, {iterator:function() { - var other = _.kotlin.collections.convertToSetForSetOperation(this.closure$elements_0); - if (other.isEmpty()) { - return this.this$minus_0.iterator(); - } else { - return _.kotlin.sequences.filterNot_6bub1b$(this.this$minus_0, _.kotlin.sequences.minus$f_1.iterator$f(other)).iterator(); - } - }}, {iterator$f:function(closure$other) { - return function(it) { - return closure$other.contains_za3rmp$(it); - }; - }}), minus_yslupy$:function($receiver, elements) { - return new _.kotlin.sequences.minus$f_1(elements, $receiver); - }, minus$f_2:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(closure$elements_0, this$minus_0) { - this.closure$elements_0 = closure$elements_0; - this.this$minus_0 = this$minus_0; - }, {iterator:function() { - var other = _.kotlin.sequences.toHashSet_uya9q7$(this.closure$elements_0); - if (other.isEmpty()) { - return this.this$minus_0.iterator(); - } else { - return _.kotlin.sequences.filterNot_6bub1b$(this.this$minus_0, _.kotlin.sequences.minus$f_2.iterator$f(other)).iterator(); - } - }}, {iterator$f:function(closure$other) { - return function(it) { - return closure$other.contains_za3rmp$(it); - }; - }}), minus_j4v1m4$:function($receiver, elements) { - return new _.kotlin.sequences.minus$f_2(elements, $receiver); - }, minusElement_8xuhcw$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.minusElement_8xuhcw$", function($receiver, element) { - return _.kotlin.sequences.minus_8xuhcw$($receiver, element); - }), partition_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.partition_6bub1b$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), plus_8xuhcw$:function($receiver, element) { - return _.kotlin.sequences.flatten_skdoy0$(_.kotlin.sequences.sequenceOf_9mqe4v$([$receiver, _.kotlin.sequences.sequenceOf_9mqe4v$([element])])); - }, plus_l2r1yo$:function($receiver, elements) { - return _.kotlin.sequences.plus_yslupy$($receiver, _.kotlin.collections.asList_eg9ybj$(elements)); - }, plus_yslupy$:function($receiver, elements) { - return _.kotlin.sequences.flatten_skdoy0$(_.kotlin.sequences.sequenceOf_9mqe4v$([$receiver, _.kotlin.collections.asSequence_q5oq31$(elements)])); - }, plus_j4v1m4$:function($receiver, elements) { - return _.kotlin.sequences.flatten_skdoy0$(_.kotlin.sequences.sequenceOf_9mqe4v$([$receiver, elements])); - }, plusElement_8xuhcw$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.plusElement_8xuhcw$", function($receiver, element) { - return _.kotlin.sequences.plus_8xuhcw$($receiver, element); - }), zip_j4v1m4$f:function(t1, t2) { - return _.kotlin.to_l1ob02$(t1, t2); - }, zip_j4v1m4$:function($receiver, other) { - return new _.kotlin.sequences.MergingSequence($receiver, other, _.kotlin.sequences.zip_j4v1m4$f); - }, zip_houmqe$:function($receiver, other, transform) { - return new _.kotlin.sequences.MergingSequence($receiver, other, transform); - }, joinTo_mrn40q$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element == null ? "null" : element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinToString_mbzd5w$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.sequences.joinTo_mrn40q$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, asIterable_uya9q7$f:function(this$asIterable) { - return function() { - return this$asIterable.iterator(); - }; - }, asIterable_uya9q7$:function($receiver) { - return new _.kotlin.collections.Iterable$f(_.kotlin.sequences.asIterable_uya9q7$f($receiver)); - }, asSequence_uya9q7$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.asSequence_uya9q7$", function($receiver) { - return $receiver; - }), average_zhcojx$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_662s1b$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_utw0os$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_uwi6zd$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_hzzbsh$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_l0u5c4$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, sum_zhcojx$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_662s1b$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_utw0os$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_uwi6zd$:function($receiver) { - var tmp$0; - var sum = Kotlin.Long.ZERO; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum = sum.add(element); - } - return sum; - }, sum_hzzbsh$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_l0u5c4$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, Sequence:Kotlin.createTrait(null), Sequence$f:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(closure$iterator_0) { - this.closure$iterator_0 = closure$iterator_0; - }, {iterator:function() { - return this.closure$iterator_0(); - }}, {}), Sequence_kxhynv$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.Sequence_kxhynv$", function(iterator) { - return new _.kotlin.sequences.Sequence$f(iterator); - }), asSequence_123wqf$f:function(this$asSequence) { - return function() { - return this$asSequence; - }; - }, asSequence_123wqf$:function($receiver) { - return _.kotlin.sequences.constrainOnce_uya9q7$(new _.kotlin.sequences.Sequence$f(_.kotlin.sequences.asSequence_123wqf$f($receiver))); - }, sequenceOf_9mqe4v$:function(elements) { - return elements.length === 0 ? _.kotlin.sequences.emptySequence() : _.kotlin.collections.asSequence_eg9ybj$(elements); - }, emptySequence:function() { - return _.kotlin.sequences.EmptySequence; - }, EmptySequence:Kotlin.createObject(function() { - return[_.kotlin.sequences.DropTakeSequence, _.kotlin.sequences.Sequence]; - }, null, {iterator:function() { - return _.kotlin.collections.EmptyIterator; - }, drop_za3lpa$:function(n) { - return _.kotlin.sequences.EmptySequence; - }, take_za3lpa$:function(n) { - return _.kotlin.sequences.EmptySequence; - }}), flatten_skdoy0$f:function(it) { - return it.iterator(); - }, flatten_skdoy0$:function($receiver) { - return _.kotlin.sequences.flatten_2($receiver, _.kotlin.sequences.flatten_skdoy0$f); - }, flatten_9q41nu$f:function(it) { - return it.iterator(); - }, flatten_9q41nu$:function($receiver) { - return _.kotlin.sequences.flatten_2($receiver, _.kotlin.sequences.flatten_9q41nu$f); - }, flatten_2$f:function(it) { - return it; - }, flatten_2:function($receiver, iterator) { - var tmp$0; - if (Kotlin.isType($receiver, _.kotlin.sequences.TransformingSequence)) { - return(Kotlin.isType(tmp$0 = $receiver, _.kotlin.sequences.TransformingSequence) ? tmp$0 : Kotlin.throwCCE()).flatten(iterator); - } - return new _.kotlin.sequences.FlatteningSequence($receiver, _.kotlin.sequences.flatten_2$f, iterator); - }, unzip_t83shn$:function($receiver) { - var tmp$0; - var listT = new Kotlin.ArrayList; - var listR = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var pair = tmp$0.next(); - listT.add_za3rmp$(pair.first); - listR.add_za3rmp$(pair.second); - } - return _.kotlin.to_l1ob02$(listT, listR); - }, FilteringSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence, sendWhen, predicate) { - if (sendWhen === void 0) { - sendWhen = true; - } - this.sequence_z4pg1f$ = sequence; - this.sendWhen_y7o6ge$ = sendWhen; - this.predicate_rgqu8l$ = predicate; - }, {iterator:function() { - return new _.kotlin.sequences.FilteringSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$FilteringSequence) { - this.this$FilteringSequence_0 = this$FilteringSequence; - this.iterator = this$FilteringSequence.sequence_z4pg1f$.iterator(); - this.nextState = -1; - this.nextItem = null; - }, {calcNext:function() { - while (this.iterator.hasNext()) { - var item = this.iterator.next(); - if (Kotlin.equals(this.this$FilteringSequence_0.predicate_rgqu8l$(item), this.this$FilteringSequence_0.sendWhen_y7o6ge$)) { - this.nextItem = item; - this.nextState = 1; - return; - } - } - this.nextState = 0; - }, next:function() { - var tmp$0; - if (this.nextState === -1) { - this.calcNext(); - } - if (this.nextState === 0) { - throw new Kotlin.NoSuchElementException; - } - var result = this.nextItem; - this.nextItem = null; - this.nextState = -1; - return(tmp$0 = result) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - }, hasNext:function() { - if (this.nextState === -1) { - this.calcNext(); - } - return this.nextState === 1; - }}, {})}), TransformingSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence, transformer) { - this.sequence_n6gmof$ = sequence; - this.transformer_t8sv9n$ = transformer; - }, {iterator:function() { - return new _.kotlin.sequences.TransformingSequence.iterator$f(this); - }, flatten:function(iterator) { - return new _.kotlin.sequences.FlatteningSequence(this.sequence_n6gmof$, this.transformer_t8sv9n$, iterator); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$TransformingSequence) { - this.this$TransformingSequence_0 = this$TransformingSequence; - this.iterator = this$TransformingSequence.sequence_n6gmof$.iterator(); - }, {next:function() { - return this.this$TransformingSequence_0.transformer_t8sv9n$(this.iterator.next()); - }, hasNext:function() { - return this.iterator.hasNext(); - }}, {})}), TransformingIndexedSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence, transformer) { - this.sequence_wt2qws$ = sequence; - this.transformer_vk8fya$ = transformer; - }, {iterator:function() { - return new _.kotlin.sequences.TransformingIndexedSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$TransformingIndexedSequence) { - this.this$TransformingIndexedSequence_0 = this$TransformingIndexedSequence; - this.iterator = this$TransformingIndexedSequence.sequence_wt2qws$.iterator(); - this.index = 0; - }, {next:function() { - return this.this$TransformingIndexedSequence_0.transformer_vk8fya$(this.index++, this.iterator.next()); - }, hasNext:function() { - return this.iterator.hasNext(); - }}, {})}), IndexingSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence) { - this.sequence_4mu851$ = sequence; - }, {iterator:function() { - return new _.kotlin.sequences.IndexingSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$IndexingSequence) { - this.iterator = this$IndexingSequence.sequence_4mu851$.iterator(); - this.index = 0; - }, {next:function() { - return new _.kotlin.collections.IndexedValue(this.index++, this.iterator.next()); - }, hasNext:function() { - return this.iterator.hasNext(); - }}, {})}), MergingSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence1, sequence2, transform) { - this.sequence1_gsgqfj$ = sequence1; - this.sequence2_gsgqfk$ = sequence2; - this.transform_ieuv6d$ = transform; - }, {iterator:function() { - return new _.kotlin.sequences.MergingSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$MergingSequence) { - this.this$MergingSequence_0 = this$MergingSequence; - this.iterator1 = this$MergingSequence.sequence1_gsgqfj$.iterator(); - this.iterator2 = this$MergingSequence.sequence2_gsgqfk$.iterator(); - }, {next:function() { - return this.this$MergingSequence_0.transform_ieuv6d$(this.iterator1.next(), this.iterator2.next()); - }, hasNext:function() { - return this.iterator1.hasNext() && this.iterator2.hasNext(); - }}, {})}), FlatteningSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence, transformer, iterator) { - this.sequence_cjvkmf$ = sequence; - this.transformer_eche5v$ = transformer; - this.iterator_9sfvmc$ = iterator; - }, {iterator:function() { - return new _.kotlin.sequences.FlatteningSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$FlatteningSequence) { - this.this$FlatteningSequence_0 = this$FlatteningSequence; - this.iterator = this$FlatteningSequence.sequence_cjvkmf$.iterator(); - this.itemIterator = null; - }, {next:function() { - var tmp$0; - if (!this.ensureItemIterator()) { - throw new Kotlin.NoSuchElementException; - } - return((tmp$0 = this.itemIterator) != null ? tmp$0 : Kotlin.throwNPE()).next(); - }, hasNext:function() { - return this.ensureItemIterator(); - }, ensureItemIterator:function() { - var tmp$0; - if (Kotlin.equals((tmp$0 = this.itemIterator) != null ? tmp$0.hasNext() : null, false)) { - this.itemIterator = null; - } - while (this.itemIterator == null) { - if (!this.iterator.hasNext()) { - return false; - } else { - var element = this.iterator.next(); - var nextItemIterator = this.this$FlatteningSequence_0.iterator_9sfvmc$(this.this$FlatteningSequence_0.transformer_eche5v$(element)); - if (nextItemIterator.hasNext()) { - this.itemIterator = nextItemIterator; - return true; - } - } - } - return true; - }}, {})}), DropTakeSequence:Kotlin.createTrait(function() { - return[_.kotlin.sequences.Sequence]; - }), SubSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.DropTakeSequence, _.kotlin.sequences.Sequence]; - }, function(sequence, startIndex, endIndex) { - this.sequence_oyhgp5$ = sequence; - this.startIndex_90rd2$ = startIndex; - this.endIndex_j2ttcj$ = endIndex; - if (!(this.startIndex_90rd2$ >= 0)) { - var message = "startIndex should be non-negative, but is " + this.startIndex_90rd2$; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (!(this.endIndex_j2ttcj$ >= 0)) { - var message_0 = "endIndex should be non-negative, but is " + this.endIndex_j2ttcj$; - throw new Kotlin.IllegalArgumentException(message_0.toString()); - } - if (!(this.endIndex_j2ttcj$ >= this.startIndex_90rd2$)) { - var message_1 = "endIndex should be not less than startIndex, but was " + this.endIndex_j2ttcj$ + " \x3c " + this.startIndex_90rd2$; - throw new Kotlin.IllegalArgumentException(message_1.toString()); - } - }, {count_9mr353$:{get:function() { - return this.endIndex_j2ttcj$ - this.startIndex_90rd2$; - }}, drop_za3lpa$:function(n) { - return n >= this.count_9mr353$ ? _.kotlin.sequences.emptySequence() : new _.kotlin.sequences.SubSequence(this.sequence_oyhgp5$, this.startIndex_90rd2$ + n, this.endIndex_j2ttcj$); - }, take_za3lpa$:function(n) { - return n >= this.count_9mr353$ ? this : new _.kotlin.sequences.SubSequence(this.sequence_oyhgp5$, this.startIndex_90rd2$, this.startIndex_90rd2$ + n); - }, iterator:function() { - return new _.kotlin.sequences.SubSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$SubSequence) { - this.this$SubSequence_0 = this$SubSequence; - this.iterator = this$SubSequence.sequence_oyhgp5$.iterator(); - this.position = 0; - }, {drop:function() { - while (this.position < this.this$SubSequence_0.startIndex_90rd2$ && this.iterator.hasNext()) { - this.iterator.next(); - this.position++; - } - }, hasNext:function() { - this.drop(); - return this.position < this.this$SubSequence_0.endIndex_j2ttcj$ && this.iterator.hasNext(); - }, next:function() { - this.drop(); - if (this.position >= this.this$SubSequence_0.endIndex_j2ttcj$) { - throw new Kotlin.NoSuchElementException; - } - this.position++; - return this.iterator.next(); - }}, {})}), TakeSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.DropTakeSequence, _.kotlin.sequences.Sequence]; - }, function(sequence, count) { - this.sequence_4b84m6$ = sequence; - this.count_rcgz8u$ = count; - if (!(this.count_rcgz8u$ >= 0)) { - var message = "count must be non-negative, but was " + this.count_rcgz8u$ + "."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - }, {drop_za3lpa$:function(n) { - return n >= this.count_rcgz8u$ ? _.kotlin.sequences.emptySequence() : new _.kotlin.sequences.SubSequence(this.sequence_4b84m6$, n, this.count_rcgz8u$); - }, take_za3lpa$:function(n) { - return n >= this.count_rcgz8u$ ? this : new _.kotlin.sequences.TakeSequence(this.sequence_4b84m6$, n); - }, iterator:function() { - return new _.kotlin.sequences.TakeSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$TakeSequence) { - this.left = this$TakeSequence.count_rcgz8u$; - this.iterator = this$TakeSequence.sequence_4b84m6$.iterator(); - }, {next:function() { - if (this.left === 0) { - throw new Kotlin.NoSuchElementException; - } - this.left--; - return this.iterator.next(); - }, hasNext:function() { - return this.left > 0 && this.iterator.hasNext(); - }}, {})}), TakeWhileSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence, predicate) { - this.sequence_augs99$ = sequence; - this.predicate_msmsk5$ = predicate; - }, {iterator:function() { - return new _.kotlin.sequences.TakeWhileSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$TakeWhileSequence) { - this.this$TakeWhileSequence_0 = this$TakeWhileSequence; - this.iterator = this$TakeWhileSequence.sequence_augs99$.iterator(); - this.nextState = -1; - this.nextItem = null; - }, {calcNext:function() { - if (this.iterator.hasNext()) { - var item = this.iterator.next(); - if (this.this$TakeWhileSequence_0.predicate_msmsk5$(item)) { - this.nextState = 1; - this.nextItem = item; - return; - } - } - this.nextState = 0; - }, next:function() { - var tmp$0; - if (this.nextState === -1) { - this.calcNext(); - } - if (this.nextState === 0) { - throw new Kotlin.NoSuchElementException; - } - var result = (tmp$0 = this.nextItem) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - this.nextItem = null; - this.nextState = -1; - return result; - }, hasNext:function() { - if (this.nextState === -1) { - this.calcNext(); - } - return this.nextState === 1; - }}, {})}), DropSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.DropTakeSequence, _.kotlin.sequences.Sequence]; - }, function(sequence, count) { - this.sequence_mdo2d2$ = sequence; - this.count_52wnp6$ = count; - if (!(this.count_52wnp6$ >= 0)) { - var message = "count must be non-negative, but was " + this.count_52wnp6$ + "."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - }, {drop_za3lpa$:function(n) { - return new _.kotlin.sequences.DropSequence(this.sequence_mdo2d2$, this.count_52wnp6$ + n); - }, take_za3lpa$:function(n) { - return new _.kotlin.sequences.SubSequence(this.sequence_mdo2d2$, this.count_52wnp6$, this.count_52wnp6$ + n); - }, iterator:function() { - return new _.kotlin.sequences.DropSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$DropSequence) { - this.iterator = this$DropSequence.sequence_mdo2d2$.iterator(); - this.left = this$DropSequence.count_52wnp6$; - }, {drop:function() { - while (this.left > 0 && this.iterator.hasNext()) { - this.iterator.next(); - this.left--; - } - }, next:function() { - this.drop(); - return this.iterator.next(); - }, hasNext:function() { - this.drop(); - return this.iterator.hasNext(); - }}, {})}), DropWhileSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence, predicate) { - this.sequence_474bkb$ = sequence; - this.predicate_81zatf$ = predicate; - }, {iterator:function() { - return new _.kotlin.sequences.DropWhileSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$DropWhileSequence) { - this.this$DropWhileSequence_0 = this$DropWhileSequence; - this.iterator = this$DropWhileSequence.sequence_474bkb$.iterator(); - this.dropState = -1; - this.nextItem = null; - }, {drop:function() { - while (this.iterator.hasNext()) { - var item = this.iterator.next(); - if (!this.this$DropWhileSequence_0.predicate_81zatf$(item)) { - this.nextItem = item; - this.dropState = 1; - return; - } - } - this.dropState = 0; - }, next:function() { - var tmp$0; - if (this.dropState === -1) { - this.drop(); - } - if (this.dropState === 1) { - var result = (tmp$0 = this.nextItem) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - this.nextItem = null; - this.dropState = 0; - return result; - } - return this.iterator.next(); - }, hasNext:function() { - if (this.dropState === -1) { - this.drop(); - } - return this.dropState === 1 || this.iterator.hasNext(); - }}, {})}), DistinctSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(source, keySelector) { - this.source_2sma8z$ = source; - this.keySelector_x7nm6u$ = keySelector; - }, {iterator:function() { - return new _.kotlin.sequences.DistinctIterator(this.source_2sma8z$.iterator(), this.keySelector_x7nm6u$); - }}), DistinctIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.AbstractIterator]; - }, function $fun(source, keySelector) { - $fun.baseInitializer.call(this); - this.source_8cb0nq$ = source; - this.keySelector_t0csl9$ = keySelector; - this.observed_x3rjst$ = new Kotlin.ComplexHashSet; - }, {computeNext:function() { - while (this.source_8cb0nq$.hasNext()) { - var next = this.source_8cb0nq$.next(); - var key = this.keySelector_t0csl9$(next); - if (this.observed_x3rjst$.add_za3rmp$(key)) { - this.setNext_za3rmp$(next); - return; - } - } - this.done(); - }}), GeneratorSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(getInitialValue, getNextValue) { - this.getInitialValue_of3t40$ = getInitialValue; - this.getNextValue_wqyet1$ = getNextValue; - }, {iterator:function() { - return new _.kotlin.sequences.GeneratorSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$GeneratorSequence_0) { - this.this$GeneratorSequence_0 = this$GeneratorSequence_0; - this.nextItem = null; - this.nextState = -2; - }, {calcNext:function() { - var tmp$0; - this.nextItem = this.nextState === -2 ? this.this$GeneratorSequence_0.getInitialValue_of3t40$() : this.this$GeneratorSequence_0.getNextValue_wqyet1$((tmp$0 = this.nextItem) != null ? tmp$0 : Kotlin.throwNPE()); - this.nextState = this.nextItem == null ? 0 : 1; - }, next:function() { - var tmp$0; - if (this.nextState < 0) { - this.calcNext(); - } - if (this.nextState === 0) { - throw new Kotlin.NoSuchElementException; - } - var result = (tmp$0 = this.nextItem) != null ? tmp$0 : Kotlin.throwCCE(); - this.nextState = -1; - return result; - }, hasNext:function() { - if (this.nextState < 0) { - this.calcNext(); - } - return this.nextState === 1; - }}, {})}), constrainOnce_uya9q7$:function($receiver) { - return Kotlin.isType($receiver, _.kotlin.sequences.ConstrainedOnceSequence) ? $receiver : new _.kotlin.sequences.ConstrainedOnceSequence($receiver); - }, generateSequence_un3fny$f:function(closure$nextFunction) { - return function(it) { - return closure$nextFunction(); - }; - }, generateSequence_un3fny$:function(nextFunction) { - return _.kotlin.sequences.constrainOnce_uya9q7$(new _.kotlin.sequences.GeneratorSequence(nextFunction, _.kotlin.sequences.generateSequence_un3fny$f(nextFunction))); - }, generateSequence_hiyix$f:function(closure$seed) { - return function() { - return closure$seed; - }; - }, generateSequence_hiyix$:function(seed, nextFunction) { - return seed == null ? _.kotlin.sequences.EmptySequence : new _.kotlin.sequences.GeneratorSequence(_.kotlin.sequences.generateSequence_hiyix$f(seed), nextFunction); - }, generateSequence_x7nywq$:function(seedFunction, nextFunction) { - return new _.kotlin.sequences.GeneratorSequence(seedFunction, nextFunction); - }}), dom:Kotlin.definePackage(null, {build:Kotlin.definePackage(null, {createElement_juqb3g$:function($receiver, name, init) { - var elem = $receiver.createElement(name); - init.call(elem); - return elem; - }, createElement_hart3b$:function($receiver, name, doc, init) { - if (doc === void 0) { - doc = null; - } - var elem = _.kotlin.dom.ownerDocument_pmnl5l$($receiver, doc).createElement(name); - init.call(elem); - return elem; - }, addElement_juqb3g$:function($receiver, name, init) { - var child = _.kotlin.dom.build.createElement_juqb3g$($receiver, name, init); - $receiver.appendChild(child); - return child; - }, addElement_hart3b$:function($receiver, name, doc, init) { - if (doc === void 0) { - doc = null; - } - var child = _.kotlin.dom.build.createElement_hart3b$($receiver, name, doc, init); - $receiver.appendChild(child); - return child; - }}), hasClass_cjmw3z$:function($receiver, cssClass) { - var tmp$1 = $receiver.className; - return _.kotlin.text.Regex_61zpoe$("(^|.*" + "\\" + "s+)" + cssClass + "(" + "$" + "|" + "\\" + "s+.*)").matches_6bul2c$(tmp$1); - }, addClass_fwdim7$:function($receiver, cssClasses) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = cssClasses, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!_.kotlin.dom.hasClass_cjmw3z$($receiver, element)) { - destination.add_za3rmp$(element); - } - } - var missingClasses = destination; - if (!missingClasses.isEmpty()) { - var tmp$4; - var presentClasses = _.kotlin.text.trim_gw00vq$($receiver.className).toString(); - var $receiver_3 = new Kotlin.StringBuilder; - $receiver_3.append(presentClasses); - if (!(presentClasses.length === 0)) { - $receiver_3.append(" "); - } - _.kotlin.collections.joinTo_euycuk$(missingClasses, $receiver_3, " "); - $receiver.className = $receiver_3.toString(); - return true; - } - return false; - }, removeClass_fwdim7$:function($receiver, cssClasses) { - var any_dgtl0h$result; - any_dgtl0h$break: { - var tmp$0, tmp$1, tmp$2; - tmp$0 = cssClasses, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (_.kotlin.dom.hasClass_cjmw3z$($receiver, element)) { - any_dgtl0h$result = true; - break any_dgtl0h$break; - } - } - any_dgtl0h$result = false; - } - if (any_dgtl0h$result) { - var toBeRemoved = _.kotlin.collections.toSet_eg9ybj$(cssClasses); - var tmp$8; - var $receiver_3 = _.kotlin.text.trim_gw00vq$($receiver.className).toString(); - var regex = _.kotlin.text.Regex_61zpoe$("\\s+"); - var limit; - limit = 0; - var $receiver_4 = regex.split_905azu$($receiver_3, limit); - var destination = new Kotlin.ArrayList; - var tmp$9; - tmp$9 = $receiver_4.iterator(); - while (tmp$9.hasNext()) { - var element_0 = tmp$9.next(); - if (!toBeRemoved.contains_za3rmp$(element_0)) { - destination.add_za3rmp$(element_0); - } - } - $receiver.className = _.kotlin.collections.joinToString_ld60a2$(destination, " "); - return true; - } - return false; - }, children_ejp6nl$:function($receiver) { - var tmp$0, tmp$1; - return(tmp$1 = (tmp$0 = $receiver != null ? $receiver.childNodes : null) != null ? _.kotlin.dom.asList_d3eamn$(tmp$0) : null) != null ? tmp$1 : _.kotlin.collections.emptyList(); - }, childElements_ejp6nl$:function($receiver) { - var tmp$0, tmp$1; - return(tmp$1 = (tmp$0 = $receiver != null ? $receiver.childNodes : null) != null ? _.kotlin.dom.filterElements_d3eamn$(tmp$0) : null) != null ? tmp$1 : _.kotlin.collections.emptyList(); - }, childElements_cjmw3z$:function($receiver, name) { - var tmp$0, tmp$1, tmp$2; - var tmp$3; - if ((tmp$1 = (tmp$0 = $receiver != null ? $receiver.childNodes : null) != null ? _.kotlin.dom.filterElements_d3eamn$(tmp$0) : null) != null) { - var destination = new Kotlin.ArrayList; - var tmp$4; - tmp$4 = tmp$1.iterator(); - while (tmp$4.hasNext()) { - var element = tmp$4.next(); - if (Kotlin.equals(element.nodeName, name)) { - destination.add_za3rmp$(element); - } - } - tmp$3 = destination; - } else { - tmp$3 = null; - } - return(tmp$2 = tmp$3) != null ? tmp$2 : _.kotlin.collections.emptyList(); - }, get_elements_4wc2mi$:{value:function($receiver) { - return _.kotlin.dom.elements_nnvvt4$($receiver); - }}, get_elements_ejp6nl$:{value:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.elements_cjmw3z$($receiver) : null) != null ? tmp$0 : _.kotlin.collections.emptyList(); - }}, elements_cjmw3z$_0:function($receiver, localName) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.elements_cjmw3z$($receiver, localName) : null) != null ? tmp$0 : _.kotlin.collections.emptyList(); - }, elements_cjmw3z$:function($receiver, localName) { - if (localName === void 0) { - localName = "*"; - } - return _.kotlin.dom.asElementList_1($receiver.getElementsByTagName(localName)); - }, elements_nnvvt4$:function($receiver, localName) { - var tmp$0, tmp$1; - if (localName === void 0) { - localName = "*"; - } - return(tmp$1 = (tmp$0 = $receiver != null ? $receiver.getElementsByTagName(localName) : null) != null ? _.kotlin.dom.asElementList_1(tmp$0) : null) != null ? tmp$1 : _.kotlin.collections.emptyList(); - }, elements_achogv$:function($receiver, namespaceUri, localName) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.elements_achogv$_0($receiver, namespaceUri, localName) : null) != null ? tmp$0 : _.kotlin.collections.emptyList(); - }, elements_achogv$_0:function($receiver, namespaceUri, localName) { - return _.kotlin.dom.asElementList_1($receiver.getElementsByTagNameNS(namespaceUri, localName)); - }, elements_awnjmu$:function($receiver, namespaceUri, localName) { - var tmp$0, tmp$1; - return(tmp$1 = (tmp$0 = $receiver != null ? $receiver.getElementsByTagNameNS(namespaceUri, localName) : null) != null ? _.kotlin.dom.asElementList_1(tmp$0) : null) != null ? tmp$1 : _.kotlin.collections.emptyList(); - }, asList_d3eamn$_0:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.asList_d3eamn$($receiver) : null) != null ? tmp$0 : _.kotlin.collections.emptyList(); - }, asList_d3eamn$:function($receiver) { - return new _.kotlin.dom.NodeListAsList($receiver); - }, toElementList_d3eamn$:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.asElementList_d3eamn$($receiver) : null) != null ? tmp$0 : _.kotlin.collections.emptyList(); - }, asElementList_d3eamn$:function($receiver) { - return $receiver.length === 0 ? _.kotlin.collections.emptyList() : new _.kotlin.dom.ElementListAsList($receiver); - }, filterElements_24irbb$:function($receiver) { - var tmp$0; - var tmp$1 = Kotlin.isInstanceOf(Kotlin.modules["builtins"].kotlin.collections.List); - var destination = new Kotlin.ArrayList; - var tmp$2; - tmp$2 = $receiver.iterator(); - while (tmp$2.hasNext()) { - var element = tmp$2.next(); - if (_.kotlin.dom.get_isElement_asww5t$(element)) { - destination.add_za3rmp$(element); - } - } - return tmp$1(tmp$0 = destination) ? tmp$0 : Kotlin.throwCCE(); - }, filterElements_d3eamn$:function($receiver) { - return _.kotlin.dom.filterElements_24irbb$(_.kotlin.dom.asList_d3eamn$($receiver)); - }, NodeListAsList:Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function $fun(delegate) { - $fun.baseInitializer.call(this); - this.delegate_jo5qae$ = delegate; - }, {size:{get:function() { - return this.delegate_jo5qae$.length; - }}, get_za3lpa$:function(index) { - var tmp$0; - if ((new Kotlin.NumberRange(0, this.size - 1)).contains_htax2k$(index)) { - return(tmp$0 = this.delegate_jo5qae$.item(index)) != null ? tmp$0 : Kotlin.throwNPE(); - } else { - throw new Kotlin.IndexOutOfBoundsException("index " + index + " is not in range [0 .. " + (this.size - 1) + ")"); - } - }}), ElementListAsList:Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function $fun(nodeList) { - $fun.baseInitializer.call(this); - this.nodeList_yjzc8t$ = nodeList; - }, {get_za3lpa$:function(index) { - var tmp$0; - var node = this.nodeList_yjzc8t$.item(index); - if (node == null) { - throw new Kotlin.IndexOutOfBoundsException("NodeList does not contain a node at index: " + index); - } else { - if (node.nodeType === Node.ELEMENT_NODE) { - return Kotlin.isType(tmp$0 = node, Element) ? tmp$0 : Kotlin.throwCCE(); - } else { - throw new Kotlin.IllegalArgumentException("Node is not an Element as expected but is " + Kotlin.toString(node)); - } - } - }, size:{get:function() { - return this.nodeList_yjzc8t$.length; - }}}), nextSiblings_asww5t$:function($receiver) { - return new _.kotlin.dom.NextSiblings($receiver); - }, NextSiblings:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(node) { - this.node_9zprnx$ = node; - }, {iterator:function() { - return new _.kotlin.dom.NextSiblings.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[_.kotlin.collections.AbstractIterator]; - }, function $fun(this$NextSiblings_0) { - this.this$NextSiblings_0 = this$NextSiblings_0; - $fun.baseInitializer.call(this); - }, {computeNext:function() { - var nextValue = this.this$NextSiblings_0.node_9zprnx$.nextSibling; - if (nextValue != null) { - this.setNext_za3rmp$(nextValue); - this.this$NextSiblings_0.node_9zprnx$ = nextValue; - } else { - this.done(); - } - }}, {})}), previousSiblings_asww5t$:function($receiver) { - return new _.kotlin.dom.PreviousSiblings($receiver); - }, PreviousSiblings:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(node) { - this.node_ugyp4f$ = node; - }, {iterator:function() { - return new _.kotlin.dom.PreviousSiblings.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[_.kotlin.collections.AbstractIterator]; - }, function $fun(this$PreviousSiblings_0) { - this.this$PreviousSiblings_0 = this$PreviousSiblings_0; - $fun.baseInitializer.call(this); - }, {computeNext:function() { - var nextValue = this.this$PreviousSiblings_0.node_ugyp4f$.previousSibling; - if (nextValue != null) { - this.setNext_za3rmp$(nextValue); - this.this$PreviousSiblings_0.node_ugyp4f$ = nextValue; - } else { - this.done(); - } - }}, {})}), get_isText_asww5t$:{value:function($receiver) { - return $receiver.nodeType === Node.TEXT_NODE || $receiver.nodeType === Node.CDATA_SECTION_NODE; - }}, get_isElement_asww5t$:{value:function($receiver) { - return $receiver.nodeType === Node.ELEMENT_NODE; - }}, attribute_cjmw3z$:function($receiver, name) { - var tmp$0; - return(tmp$0 = $receiver.getAttribute(name)) != null ? tmp$0 : ""; - }, get_head_d3eamn$:{value:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.asList_d3eamn$($receiver) : null) != null ? _.kotlin.collections.firstOrNull_a7ptmv$(tmp$0) : null; - }}, get_first_d3eamn$:{value:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.asList_d3eamn$($receiver) : null) != null ? _.kotlin.collections.firstOrNull_a7ptmv$(tmp$0) : null; - }}, get_last_d3eamn$:{value:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.asList_d3eamn$($receiver) : null) != null ? _.kotlin.collections.lastOrNull_a7ptmv$(tmp$0) : null; - }}, get_tail_d3eamn$:{value:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.asList_d3eamn$($receiver) : null) != null ? _.kotlin.collections.lastOrNull_a7ptmv$(tmp$0) : null; - }}, eventHandler_kcwmyb$:function(handler) { - return new _.kotlin.dom.EventListenerHandler(handler); - }, EventListenerHandler:Kotlin.createClass(null, function(handler) { - this.handler_nfhy41$ = handler; - }, {handleEvent:function(e) { - this.handler_nfhy41$(e); - }, toString:function() { - return "EventListenerHandler(" + this.handler_nfhy41$ + ")"; - }}), mouseEventHandler_3m19zy$f:function(closure$handler) { - return function(e) { - if (Kotlin.isType(e, MouseEvent)) { - closure$handler(e); - } - }; - }, mouseEventHandler_3m19zy$:function(handler) { - return _.kotlin.dom.eventHandler_kcwmyb$(_.kotlin.dom.mouseEventHandler_3m19zy$f(handler)); - }, on_9k7t35$:function($receiver, name, capture, handler) { - return _.kotlin.dom.on_edii0a$($receiver, name, capture, _.kotlin.dom.eventHandler_kcwmyb$(handler)); - }, on_edii0a$:function($receiver, name, capture, listener) { - var tmp$0; - if (Kotlin.isType($receiver, EventTarget)) { - $receiver.addEventListener(name, listener, capture); - tmp$0 = new _.kotlin.dom.CloseableEventListener($receiver, listener, name, capture); - } else { - tmp$0 = null; - } - return tmp$0; - }, CloseableEventListener:Kotlin.createClass(function() { - return[Kotlin.Closeable]; - }, function(target, listener, name, capture) { - this.target_isfv2i$ = target; - this.listener_q3o4k3$ = listener; - this.name_a3xzng$ = name; - this.capture_m7iaz7$ = capture; - }, {close:function() { - this.target_isfv2i$.removeEventListener(this.name_a3xzng$, this.listener_q3o4k3$, this.capture_m7iaz7$); - }, toString:function() { - return "CloseableEventListener(" + this.target_isfv2i$ + ", " + this.name_a3xzng$ + ")"; - }}), onClick_g2lu80$:function($receiver, capture, handler) { - if (capture === void 0) { - capture = false; - } - return _.kotlin.dom.on_edii0a$($receiver, "click", capture, _.kotlin.dom.mouseEventHandler_3m19zy$(handler)); - }, onDoubleClick_g2lu80$:function($receiver, capture, handler) { - if (capture === void 0) { - capture = false; - } - return _.kotlin.dom.on_edii0a$($receiver, "dblclick", capture, _.kotlin.dom.mouseEventHandler_3m19zy$(handler)); - }, get_nnvvt4$:function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - return(tmp$2 = (tmp$1 = (tmp$0 = $receiver != null ? $receiver.querySelectorAll(selector) : null) != null ? _.kotlin.dom.asList_d3eamn$(tmp$0) : null) != null ? _.kotlin.dom.filterElements_24irbb$(tmp$1) : null) != null ? tmp$2 : _.kotlin.collections.emptyList(); - }, get_cjmw3z$:function($receiver, selector) { - return _.kotlin.dom.filterElements_24irbb$(_.kotlin.dom.asList_d3eamn$($receiver.querySelectorAll(selector))); - }, HTMLCollectionListView:Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function $fun(collection) { - $fun.baseInitializer.call(this); - this.collection = collection; - }, {size:{get:function() { - return this.collection.length; - }}, get_za3lpa$:function(index) { - var tmp$0; - if ((new Kotlin.NumberRange(0, this.size - 1)).contains_htax2k$(index)) { - return Kotlin.isType(tmp$0 = this.collection.item(index), HTMLElement) ? tmp$0 : Kotlin.throwCCE(); - } else { - throw new Kotlin.IndexOutOfBoundsException("index " + index + " is not in range [0 .. " + (this.size - 1) + ")"); - } - }}), asList_sg7yuw$:function($receiver) { - return new _.kotlin.dom.HTMLCollectionListView($receiver); - }, DOMTokenListView:Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function $fun(delegate) { - $fun.baseInitializer.call(this); - this.delegate = delegate; - }, {size:{get:function() { - return this.delegate.length; - }}, get_za3lpa$:function(index) { - var tmp$0; - if ((new Kotlin.NumberRange(0, this.size - 1)).contains_htax2k$(index)) { - return(tmp$0 = this.delegate.item(index)) != null ? tmp$0 : Kotlin.throwNPE(); - } else { - throw new Kotlin.IndexOutOfBoundsException("index " + index + " is not in range [0 .. " + (this.size - 1) + ")"); - } - }}), asList_u75qis$:function($receiver) { - return new _.kotlin.dom.DOMTokenListView($receiver); - }, asElementList_1:function($receiver) { - return _.kotlin.dom.asList_sg7yuw$($receiver); - }, clear_asww5t$:function($receiver) { - var tmp$0; - while ($receiver.hasChildNodes()) { - $receiver.removeChild((tmp$0 = $receiver.firstChild) != null ? tmp$0 : Kotlin.throwNPE()); - } - }, removeFromParent_asww5t$:function($receiver) { - var tmp$0; - (tmp$0 = $receiver.parentNode) != null ? tmp$0.removeChild($receiver) : null; - }, plus_6xfunm$:function($receiver, child) { - $receiver.appendChild(child); - return $receiver; - }, plus_cjmw3z$:function($receiver, text) { - return _.kotlin.dom.appendText_esmrqt$($receiver, text); - }, plusAssign_cjmw3z$:function($receiver, text) { - _.kotlin.dom.appendText_esmrqt$($receiver, text); - }, ownerDocument_pmnl5l$:function($receiver, doc) { - var tmp$0, tmp$1; - if (doc === void 0) { - doc = null; - } - if ($receiver.nodeType === Node.DOCUMENT_NODE) { - return Kotlin.isType(tmp$0 = $receiver, Document) ? tmp$0 : Kotlin.throwCCE(); - } else { - tmp$1 = doc != null ? doc : $receiver.ownerDocument; - if (tmp$1 == null) { - throw new Kotlin.IllegalArgumentException("Neither node contains nor parameter doc provides an owner document for " + $receiver); - } - return tmp$1; - } - }, addText_esmrqt$:function($receiver, text, doc) { - if (doc === void 0) { - doc = null; - } - return _.kotlin.dom.appendText_esmrqt$($receiver, text, doc); - }, addText_cjmw3z$:function($receiver, text) { - return _.kotlin.dom.appendText_esmrqt$($receiver, text); - }, appendText_esmrqt$:function($receiver, text, doc) { - if (doc === void 0) { - doc = null; - } - $receiver.appendChild(_.kotlin.dom.ownerDocument_pmnl5l$($receiver, doc).createTextNode(text)); - return $receiver; - }, appendTo_5kzm9c$:function($receiver, parent) { - parent.appendChild($receiver); - }, createDocument:function() { - return new Document; - }, toXmlString_asww5t$:function($receiver) { - return $receiver.outerHTML; - }, toXmlString_rq0l4m$:function($receiver, xmlDeclaration) { - return $receiver.outerHTML; - }}), test:Kotlin.definePackage(function() { - this.asserter = new _.kotlin.test.QUnitAsserter; - }, {todo_un3fny$:function(block) { - Kotlin.println("TODO at " + block); - }, assertFailsWith_ayzjzk$:Kotlin.defineInlineFunction("stdlib.kotlin.test.assertFailsWith_ayzjzk$", function(isT, message, block) { - var tmp$0, tmp$1; - if (message === void 0) { - message = null; - } - var exception = _.kotlin.test.assertFails_qshda6$(block); - _.kotlin.test.assertTrue_8kj6y5$(isT(exception), ((tmp$0 = message != null ? message + ". " : null) != null ? tmp$0 : "") + ("An exception thrown is not of the expected type: " + exception)); - return isT(tmp$1 = exception) ? tmp$1 : Kotlin.throwCCE(); - }), QUnitAsserter:Kotlin.createClass(function() { - return[_.kotlin.test.Asserter]; - }, null, {assertTrue_tup0fe$:function(lazyMessage, actual) { - _.kotlin.test.assertTrue_8kj6y5$(actual, lazyMessage()); - }, assertTrue_ivxn3r$:function(message, actual) { - ok(actual, message); - if (!actual) { - this.failWithMessage(message); - } - }, fail_61zpoe$:function(message) { - ok(false, message); - this.failWithMessage(message); - }, failWithMessage:function(message) { - if (message == null) { - throw new Kotlin.AssertionError; - } else { - throw new Kotlin.AssertionError(message); - } - }}), assertTrue_c0mt8g$:function(message, block) { - if (message === void 0) { - message = null; - } - _.kotlin.test.assertTrue_8kj6y5$(block(), message); - }, assertTrue_8kj6y5$:function(actual, message) { - if (message === void 0) { - message = null; - } - return _.kotlin.test.asserter.assertTrue_ivxn3r$(message != null ? message : "Expected value to be true.", actual); - }, assertFalse_c0mt8g$:function(message, block) { - if (message === void 0) { - message = null; - } - _.kotlin.test.assertFalse_8kj6y5$(block(), message); - }, assertFalse_8kj6y5$:function(actual, message) { - if (message === void 0) { - message = null; - } - return _.kotlin.test.asserter.assertTrue_ivxn3r$(message != null ? message : "Expected value to be false.", !actual); - }, assertEquals_8vv676$:function(expected, actual, message) { - if (message === void 0) { - message = null; - } - _.kotlin.test.asserter.assertEquals_a59ba6$(message, expected, actual); - }, assertNotEquals_8vv676$:function(illegal, actual, message) { - if (message === void 0) { - message = null; - } - _.kotlin.test.asserter.assertNotEquals_a59ba6$(message, illegal, actual); - }, assertNotNull_hwpqgh$:function(actual, message) { - if (message === void 0) { - message = null; - } - _.kotlin.test.asserter.assertNotNull_bm4g0d$(message, actual); - return actual != null ? actual : Kotlin.throwNPE(); - }, assertNotNull_nbs6dl$:function(actual, message, block) { - if (message === void 0) { - message = null; - } - _.kotlin.test.asserter.assertNotNull_bm4g0d$(message, actual); - if (actual != null) { - block(actual); - } - }, assertNull_hwpqgh$:function(actual, message) { - if (message === void 0) { - message = null; - } - _.kotlin.test.asserter.assertNull_bm4g0d$(message, actual); - }, fail_61zpoe$:function(message) { - if (message === void 0) { - message = null; - } - _.kotlin.test.asserter.fail_61zpoe$(message); - }, expect_pzucw5$:function(expected, block) { - _.kotlin.test.assertEquals_8vv676$(expected, block()); - }, expect_s8u0d3$:function(expected, message, block) { - _.kotlin.test.assertEquals_8vv676$(expected, block(), message); - }, assertFails_qshda6$:function(block) { - try { - block(); - } catch (e) { - return e; - } - _.kotlin.test.asserter.fail_61zpoe$("Expected an exception to be thrown"); - }, Asserter:Kotlin.createTrait(null, {assertTrue_tup0fe$:function(lazyMessage, actual) { - if (!actual) { - this.fail_61zpoe$(lazyMessage()); - } - }, assertTrue_ivxn3r$:function(message, actual) { - this.assertTrue_tup0fe$(_.kotlin.test.Asserter.assertTrue_ivxn3r$f(message), actual); - }, assertEquals_a59ba6$:function(message, expected, actual) { - this.assertTrue_tup0fe$(_.kotlin.test.Asserter.assertEquals_a59ba6$f(message, expected, actual), Kotlin.equals(actual, expected)); - }, assertNotEquals_a59ba6$:function(message, illegal, actual) { - this.assertTrue_tup0fe$(_.kotlin.test.Asserter.assertNotEquals_a59ba6$f(message, actual), !Kotlin.equals(actual, illegal)); - }, assertNull_bm4g0d$:function(message, actual) { - this.assertTrue_tup0fe$(_.kotlin.test.Asserter.assertNull_bm4g0d$f(message, actual), actual == null); - }, assertNotNull_bm4g0d$:function(message, actual) { - this.assertTrue_tup0fe$(_.kotlin.test.Asserter.assertNotNull_bm4g0d$f(message), actual != null); - }}, {assertTrue_ivxn3r$f:function(closure$message) { - return function() { - return closure$message; - }; - }, assertEquals_a59ba6$f:function(closure$message, closure$expected, closure$actual) { - return function() { - var tmp$0; - return((tmp$0 = closure$message != null ? closure$message + ". " : null) != null ? tmp$0 : "") + ("Expected \x3c" + Kotlin.toString(closure$expected) + "\x3e, actual \x3c" + Kotlin.toString(closure$actual) + "\x3e."); - }; - }, assertNotEquals_a59ba6$f:function(closure$message, closure$actual) { - return function() { - var tmp$0; - return((tmp$0 = closure$message != null ? closure$message + ". " : null) != null ? tmp$0 : "") + ("Illegal value: \x3c" + Kotlin.toString(closure$actual) + "\x3e."); - }; - }, assertNull_bm4g0d$f:function(closure$message, closure$actual) { - return function() { - var tmp$0; - return((tmp$0 = closure$message != null ? closure$message + ". " : null) != null ? tmp$0 : "") + ("Expected value to be null, but was: \x3c" + Kotlin.toString(closure$actual) + "\x3e."); - }; - }, assertNotNull_bm4g0d$f:function(closure$message) { - return function() { - var tmp$0; - return((tmp$0 = closure$message != null ? closure$message + ". " : null) != null ? tmp$0 : "") + "Expected value to be not null."; - }; - }}), AsserterContributor:Kotlin.createTrait(null)}), annotation:Kotlin.definePackage(null, {AnnotationTarget:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{CLASS:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, ANNOTATION_CLASS:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, TYPE_PARAMETER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, PROPERTY:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, FIELD:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, LOCAL_VARIABLE:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, VALUE_PARAMETER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, CONSTRUCTOR:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, FUNCTION:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, PROPERTY_GETTER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, PROPERTY_SETTER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, TYPE:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, EXPRESSION:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, FILE:function() { - return new _.kotlin.annotation.AnnotationTarget; - }}; - }), AnnotationRetention:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{SOURCE:function() { - return new _.kotlin.annotation.AnnotationRetention; - }, BINARY:function() { - return new _.kotlin.annotation.AnnotationRetention; - }, RUNTIME:function() { - return new _.kotlin.annotation.AnnotationRetention; - }}; - }), Target:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, function(allowedTargets) { - this.allowedTargets = allowedTargets; - }), Retention:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, function(value) { - if (value === void 0) { - value = _.kotlin.annotation.AnnotationRetention.RUNTIME; - } - this.value = value; - }), Repeatable:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), MustBeDocumented:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null)}), reflect:Kotlin.definePackage(null, {KAnnotatedElement:Kotlin.createTrait(null), KCallable:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KAnnotatedElement]; - }), KClass:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KAnnotatedElement, _.kotlin.reflect.KDeclarationContainer]; - }), KDeclarationContainer:Kotlin.createTrait(null), KFunction:Kotlin.createTrait(function() { - return[Kotlin.modules["builtins"].kotlin.Function, _.kotlin.reflect.KCallable]; - }), KParameter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KAnnotatedElement]; - }, null, {Kind:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{INSTANCE:function() { - return new _.kotlin.reflect.KParameter.Kind; - }, EXTENSION_RECEIVER:function() { - return new _.kotlin.reflect.KParameter.Kind; - }, VALUE:function() { - return new _.kotlin.reflect.KParameter.Kind; - }}; - })}), KProperty:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KCallable]; - }, null, {Accessor:Kotlin.createTrait(null), Getter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KFunction, _.kotlin.reflect.KProperty.Accessor]; - })}), KMutableProperty:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty]; - }, null, {Setter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KFunction, _.kotlin.reflect.KProperty.Accessor]; - })}), KProperty0:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty]; - }, null, {Getter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty.Getter]; - })}), KMutableProperty0:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KMutableProperty, _.kotlin.reflect.KProperty0]; - }, null, {Setter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KMutableProperty.Setter]; - })}), KProperty1:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty]; - }, null, {Getter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty.Getter]; - })}), KMutableProperty1:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KMutableProperty, _.kotlin.reflect.KProperty1]; - }, null, {Setter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KMutableProperty.Setter]; - })}), KProperty2:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty]; - }, null, {Getter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty.Getter]; - })}), KMutableProperty2:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KMutableProperty, _.kotlin.reflect.KProperty2]; - }, null, {Setter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KMutableProperty.Setter]; - })}), KType:Kotlin.createTrait(null)}), ranges:Kotlin.definePackage(null, {contains_axyzkj$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_noyhde$:function($receiver, value) { - return $receiver.start.compareTo_za3rmp$(Kotlin.Long.fromInt(value)) <= 0 && Kotlin.Long.fromInt(value).compareTo_za3rmp$($receiver.endInclusive) <= 0; - }, contains_7vxq2o$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_qod4al$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_tzsk0w$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_3hpgcq$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_uw1xdx$:function($receiver, value) { - return $receiver.start.toNumber() <= value && value <= $receiver.endInclusive.toNumber(); - }, contains_o0k7u7$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_jz6vw7$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_d9tryv$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_fyef13$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_o8j6lu$:function($receiver, value) { - return $receiver.start.toNumber() <= value && value <= $receiver.endInclusive.toNumber(); - }, contains_sas5oe$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_vgo278$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_pc36rd$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_8efj5n$:function($receiver, value) { - return $receiver.start.compareTo_za3rmp$(Kotlin.Long.fromInt(value)) <= 0 && Kotlin.Long.fromInt(value).compareTo_za3rmp$($receiver.endInclusive) <= 0; - }, contains_ro5ap$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_8wsbwp$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_8aysva$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_ll81hz$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_axst9b$:function($receiver, value) { - return Kotlin.Long.fromInt($receiver.start).compareTo_za3rmp$(value) <= 0 && value.compareTo_za3rmp$(Kotlin.Long.fromInt($receiver.endInclusive)) <= 0; - }, contains_ntuhui$:function($receiver, value) { - return Kotlin.Long.fromInt($receiver.start).compareTo_za3rmp$(value) <= 0 && value.compareTo_za3rmp$(Kotlin.Long.fromInt($receiver.endInclusive)) <= 0; - }, contains_7w3wdw$:function($receiver, value) { - return Kotlin.Long.fromInt($receiver.start).compareTo_za3rmp$(value) <= 0 && value.compareTo_za3rmp$(Kotlin.Long.fromInt($receiver.endInclusive)) <= 0; - }, contains_qojalt$:function($receiver, value) { - return $receiver.start <= value.toNumber() && value.toNumber() <= $receiver.endInclusive; - }, contains_tzyqc4$:function($receiver, value) { - return $receiver.start <= value.toNumber() && value.toNumber() <= $receiver.endInclusive; - }, contains_g5h77b$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_oflys2$:function($receiver, value) { - return $receiver.start.compareTo_za3rmp$(Kotlin.Long.fromInt(value)) <= 0 && Kotlin.Long.fromInt(value).compareTo_za3rmp$($receiver.endInclusive) <= 0; - }, contains_shuxum$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_p50el5$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_6o6338$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, downTo_2jcion$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_jzdo0$:function($receiver, to) { - return new Kotlin.LongProgression($receiver, Kotlin.Long.fromInt(to), Kotlin.Long.NEG_ONE); - }, downTo_9q324c$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_9r634a$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_sd97h4$:function($receiver, to) { - return new Kotlin.CharProgression($receiver, to, -1); - }, downTo_rksjo2$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_mw85q1$:function($receiver, to) { - return new Kotlin.LongProgression($receiver, Kotlin.Long.fromInt(to), Kotlin.Long.NEG_ONE); - }, downTo_y20kcl$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_rt69vj$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_2j6cdf$:function($receiver, to) { - return new Kotlin.LongProgression(Kotlin.Long.fromInt($receiver), to, Kotlin.Long.NEG_ONE); - }, downTo_k5jz8$:function($receiver, to) { - return new Kotlin.LongProgression($receiver, to, Kotlin.Long.NEG_ONE); - }, downTo_9q98fk$:function($receiver, to) { - return new Kotlin.LongProgression(Kotlin.Long.fromInt($receiver), to, Kotlin.Long.NEG_ONE); - }, downTo_9qzwt2$:function($receiver, to) { - return new Kotlin.LongProgression(Kotlin.Long.fromInt($receiver), to, Kotlin.Long.NEG_ONE); - }, downTo_7dmh8l$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_hgibo4$:function($receiver, to) { - return new Kotlin.LongProgression($receiver, Kotlin.Long.fromInt(to), Kotlin.Long.NEG_ONE); - }, downTo_hl85u0$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_i0qws2$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, reversed_zf1xzd$:function($receiver) { - return new Kotlin.NumberProgression($receiver.last, $receiver.first, -$receiver.step); - }, reversed_3080ca$:function($receiver) { - return new Kotlin.LongProgression($receiver.last, $receiver.first, $receiver.step.unaryMinus()); - }, reversed_uthk7o$:function($receiver) { - return new Kotlin.CharProgression($receiver.last, $receiver.first, -$receiver.step); - }, step_7isp7r$:function($receiver, step) { - _.kotlin.ranges.checkStepIsPositive(step > 0, step); - return new Kotlin.NumberProgression($receiver.first, $receiver.last, $receiver.step > 0 ? step : -step); - }, step_bwrvkh$:function($receiver, step) { - _.kotlin.ranges.checkStepIsPositive(step.compareTo_za3rmp$(Kotlin.Long.fromInt(0)) > 0, step); - return new Kotlin.LongProgression($receiver.first, $receiver.last, $receiver.step.compareTo_za3rmp$(Kotlin.Long.fromInt(0)) > 0 ? step : step.unaryMinus()); - }, step_kw37re$:function($receiver, step) { - _.kotlin.ranges.checkStepIsPositive(step > 0, step); - return new Kotlin.CharProgression($receiver.first, $receiver.last, $receiver.step > 0 ? step : -step); - }, until_2jcion$:function($receiver, to) { - return new Kotlin.NumberRange($receiver, to - 1); - }, until_jzdo0$:function($receiver, to) { - return $receiver.rangeTo(Kotlin.Long.fromInt(to).subtract(Kotlin.Long.fromInt(1))); - }, until_9q324c$:function($receiver, to) { - return new Kotlin.NumberRange($receiver, to - 1); - }, until_9r634a$:function($receiver, to) { - return new Kotlin.NumberRange($receiver, to - 1); - }, until_sd97h4$:function($receiver, to) { - var to_ = Kotlin.toChar(to.charCodeAt(0) - 1); - if (to_ > to) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return new Kotlin.CharRange($receiver, to_); - }, until_rksjo2$:function($receiver, to) { - var to_ = Kotlin.Long.fromInt(to).subtract(Kotlin.Long.fromInt(1)).toInt(); - if (to_ > to) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return new Kotlin.NumberRange($receiver, to_); - }, until_mw85q1$:function($receiver, to) { - return $receiver.rangeTo(Kotlin.Long.fromInt(to).subtract(Kotlin.Long.fromInt(1))); - }, until_y20kcl$:function($receiver, to) { - var to_ = Kotlin.Long.fromInt(to).subtract(Kotlin.Long.fromInt(1)).toInt(); - if (to_ > to) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return new Kotlin.NumberRange($receiver, to_); - }, until_rt69vj$:function($receiver, to) { - var to_ = Kotlin.Long.fromInt(to).subtract(Kotlin.Long.fromInt(1)).toInt(); - if (to_ > to) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return new Kotlin.NumberRange($receiver, to_); - }, until_2j6cdf$:function($receiver, to) { - var to_ = to.subtract(Kotlin.Long.fromInt(1)); - if (to_.compareTo_za3rmp$(to) > 0) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return Kotlin.Long.fromInt($receiver).rangeTo(to_); - }, until_k5jz8$:function($receiver, to) { - var to_ = to.subtract(Kotlin.Long.fromInt(1)); - if (to_.compareTo_za3rmp$(to) > 0) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return $receiver.rangeTo(to_); - }, until_9q98fk$:function($receiver, to) { - var to_ = to.subtract(Kotlin.Long.fromInt(1)); - if (to_.compareTo_za3rmp$(to) > 0) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return Kotlin.Long.fromInt($receiver).rangeTo(to_); - }, until_9qzwt2$:function($receiver, to) { - var to_ = to.subtract(Kotlin.Long.fromInt(1)); - if (to_.compareTo_za3rmp$(to) > 0) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return Kotlin.Long.fromInt($receiver).rangeTo(to_); - }, until_7dmh8l$:function($receiver, to) { - return new Kotlin.NumberRange($receiver, to - 1); - }, until_hgibo4$:function($receiver, to) { - return $receiver.rangeTo(Kotlin.Long.fromInt(to).subtract(Kotlin.Long.fromInt(1))); - }, until_hl85u0$:function($receiver, to) { - return new Kotlin.NumberRange($receiver, to - 1); - }, until_i0qws2$:function($receiver, to) { - return new Kotlin.NumberRange($receiver, to - 1); - }, coerceAtLeast_n1zt5e$:function($receiver, minimumValue) { - return Kotlin.compareTo($receiver, minimumValue) < 0 ? minimumValue : $receiver; - }, coerceAtLeast_9q324c$:function($receiver, minimumValue) { - return $receiver < minimumValue ? minimumValue : $receiver; - }, coerceAtLeast_i0qws2$:function($receiver, minimumValue) { - return $receiver < minimumValue ? minimumValue : $receiver; - }, coerceAtLeast_rksjo2$:function($receiver, minimumValue) { - return $receiver < minimumValue ? minimumValue : $receiver; - }, coerceAtLeast_k5jz8$:function($receiver, minimumValue) { - return $receiver.compareTo_za3rmp$(minimumValue) < 0 ? minimumValue : $receiver; - }, coerceAtLeast_3w14zy$:function($receiver, minimumValue) { - return $receiver < minimumValue ? minimumValue : $receiver; - }, coerceAtLeast_541hxq$:function($receiver, minimumValue) { - return $receiver < minimumValue ? minimumValue : $receiver; - }, coerceAtMost_n1zt5e$:function($receiver, maximumValue) { - return Kotlin.compareTo($receiver, maximumValue) > 0 ? maximumValue : $receiver; - }, coerceAtMost_9q324c$:function($receiver, maximumValue) { - return $receiver > maximumValue ? maximumValue : $receiver; - }, coerceAtMost_i0qws2$:function($receiver, maximumValue) { - return $receiver > maximumValue ? maximumValue : $receiver; - }, coerceAtMost_rksjo2$:function($receiver, maximumValue) { - return $receiver > maximumValue ? maximumValue : $receiver; - }, coerceAtMost_k5jz8$:function($receiver, maximumValue) { - return $receiver.compareTo_za3rmp$(maximumValue) > 0 ? maximumValue : $receiver; - }, coerceAtMost_3w14zy$:function($receiver, maximumValue) { - return $receiver > maximumValue ? maximumValue : $receiver; - }, coerceAtMost_541hxq$:function($receiver, maximumValue) { - return $receiver > maximumValue ? maximumValue : $receiver; - }, coerceIn_bgp82y$:function($receiver, minimumValue, maximumValue) { - if (minimumValue !== null && maximumValue !== null) { - if (Kotlin.compareTo(minimumValue, maximumValue) > 0) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + Kotlin.toString(maximumValue) + " is less than minimum " + Kotlin.toString(minimumValue) + "."); - } - if (Kotlin.compareTo($receiver, minimumValue) < 0) { - return minimumValue; - } - if (Kotlin.compareTo($receiver, maximumValue) > 0) { - return maximumValue; - } - } else { - if (minimumValue !== null && Kotlin.compareTo($receiver, minimumValue) < 0) { - return minimumValue; - } - if (maximumValue !== null && Kotlin.compareTo($receiver, maximumValue) > 0) { - return maximumValue; - } - } - return $receiver; - }, coerceIn_fhjj23$:function($receiver, minimumValue, maximumValue) { - if (minimumValue > maximumValue) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + maximumValue + " is less than minimum " + minimumValue + "."); - } - if ($receiver < minimumValue) { - return minimumValue; - } - if ($receiver > maximumValue) { - return maximumValue; - } - return $receiver; - }, coerceIn_j4lnkd$:function($receiver, minimumValue, maximumValue) { - if (minimumValue > maximumValue) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + maximumValue + " is less than minimum " + minimumValue + "."); - } - if ($receiver < minimumValue) { - return minimumValue; - } - if ($receiver > maximumValue) { - return maximumValue; - } - return $receiver; - }, coerceIn_n6qkdc$:function($receiver, minimumValue, maximumValue) { - if (minimumValue > maximumValue) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + maximumValue + " is less than minimum " + minimumValue + "."); - } - if ($receiver < minimumValue) { - return minimumValue; - } - if ($receiver > maximumValue) { - return maximumValue; - } - return $receiver; - }, coerceIn_dh3qhr$:function($receiver, minimumValue, maximumValue) { - if (minimumValue.compareTo_za3rmp$(maximumValue) > 0) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + maximumValue + " is less than minimum " + minimumValue + "."); - } - if ($receiver.compareTo_za3rmp$(minimumValue) < 0) { - return minimumValue; - } - if ($receiver.compareTo_za3rmp$(maximumValue) > 0) { - return maximumValue; - } - return $receiver; - }, coerceIn_x1n98z$:function($receiver, minimumValue, maximumValue) { - if (minimumValue > maximumValue) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + maximumValue + " is less than minimum " + minimumValue + "."); - } - if ($receiver < minimumValue) { - return minimumValue; - } - if ($receiver > maximumValue) { - return maximumValue; - } - return $receiver; - }, coerceIn_rq40gw$:function($receiver, minimumValue, maximumValue) { - if (minimumValue > maximumValue) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + maximumValue + " is less than minimum " + minimumValue + "."); - } - if ($receiver < minimumValue) { - return minimumValue; - } - if ($receiver > maximumValue) { - return maximumValue; - } - return $receiver; - }, coerceIn_4yefu9$:function($receiver, range) { - if (range.isEmpty()) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: " + range + "."); - } - return Kotlin.compareTo($receiver, range.start) < 0 ? range.start : Kotlin.compareTo($receiver, range.endInclusive) > 0 ? range.endInclusive : $receiver; - }, coerceIn_3p661y$:function($receiver, range) { - if (range.isEmpty()) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: " + range + "."); - } - return $receiver < range.start ? range.start : $receiver > range.endInclusive ? range.endInclusive : $receiver; - }, coerceIn_zhas5s$:function($receiver, range) { - if (range.isEmpty()) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: " + range + "."); - } - return $receiver.compareTo_za3rmp$(range.start) < 0 ? range.start : $receiver.compareTo_za3rmp$(range.endInclusive) > 0 ? range.endInclusive : $receiver; - }, ComparableRange:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.ranges.ClosedRange]; - }, function(start, endInclusive) { - this.$start_v9qu5w$ = start; - this.$endInclusive_edlu3r$ = endInclusive; - }, {start:{get:function() { - return this.$start_v9qu5w$; - }}, endInclusive:{get:function() { - return this.$endInclusive_edlu3r$; - }}, equals_za3rmp$:function(other) { - return Kotlin.isType(other, _.kotlin.ranges.ComparableRange) && (this.isEmpty() && other.isEmpty() || Kotlin.equals(this.start, other.start) && Kotlin.equals(this.endInclusive, other.endInclusive)); - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * Kotlin.hashCode(this.start) + Kotlin.hashCode(this.endInclusive); - }, toString:function() { - return this.start + ".." + this.endInclusive; - }}), rangeTo_n1zt5e$:function($receiver, that) { - return new _.kotlin.ranges.ComparableRange($receiver, that); - }, checkStepIsPositive:function(isPositive, step) { - if (!isPositive) { - throw new Kotlin.IllegalArgumentException("Step must be positive, was: " + step + "."); - } - }}), comparisons:Kotlin.definePackage(null, {compareValuesBy_hhbmn6$:function(a, b, selectors) { - var tmp$0, tmp$1, tmp$2; - if (!(selectors.length > 0)) { - var message = "Failed requirement."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - tmp$0 = selectors, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var fn = tmp$0[tmp$2]; - var v1 = fn(a); - var v2 = fn(b); - var diff = _.kotlin.comparisons.compareValues_cj5vqg$(v1, v2); - if (diff !== 0) { - return diff; - } - } - return 0; - }, compareValuesBy_mpbrga$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.compareValuesBy_mpbrga$", function(a, b, selector) { - return _.kotlin.comparisons.compareValues_cj5vqg$(selector(a), selector(b)); - }), compareValuesBy_hfyz69$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.compareValuesBy_hfyz69$", function(a, b, comparator, selector) { - return comparator.compare(selector(a), selector(b)); - }), compareValues_cj5vqg$:function(a, b) { - var tmp$0; - if (a === b) { - return 0; - } - if (a == null) { - return-1; - } - if (b == null) { - return 1; - } - return Kotlin.compareTo(Kotlin.isComparable(tmp$0 = a) ? tmp$0 : Kotlin.throwCCE(), b); - }, compareBy$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$selectors_0) { - this.closure$selectors_0 = closure$selectors_0; - }, {compare:function(a, b) { - return _.kotlin.comparisons.compareValuesBy_hhbmn6$(a, b, this.closure$selectors_0); - }}, {}), compareBy_so0gvy$:function(selectors) { - return new _.kotlin.comparisons.compareBy$f(selectors); - }, compareBy$f_0:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$selector_0) { - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var selector = this.closure$selector_0; - return _.kotlin.comparisons.compareValues_cj5vqg$(selector(a), selector(b)); - }}, {}), compareBy_lw40be$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.compareBy_lw40be$", function(selector) { - return new _.kotlin.comparisons.compareBy$f_0(selector); - }), compareBy$f_1:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$comparator_0, closure$selector_0) { - this.closure$comparator_0 = closure$comparator_0; - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var comparator = this.closure$comparator_0; - var selector = this.closure$selector_0; - return comparator.compare(selector(a), selector(b)); - }}, {}), compareBy_ej7qdr$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.compareBy_ej7qdr$", function(comparator, selector) { - return new _.kotlin.comparisons.compareBy$f_1(comparator, selector); - }), compareByDescending$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$selector_0) { - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var selector = this.closure$selector_0; - return _.kotlin.comparisons.compareValues_cj5vqg$(selector(b), selector(a)); - }}, {}), compareByDescending_lw40be$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.compareByDescending_lw40be$", function(selector) { - return new _.kotlin.comparisons.compareByDescending$f(selector); - }), compareByDescending$f_0:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$comparator_0, closure$selector_0) { - this.closure$comparator_0 = closure$comparator_0; - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var comparator = this.closure$comparator_0; - var selector = this.closure$selector_0; - return comparator.compare(selector(b), selector(a)); - }}, {}), compareByDescending_ej7qdr$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.compareByDescending_ej7qdr$", function(comparator, selector) { - return new _.kotlin.comparisons.compareByDescending$f_0(comparator, selector); - }), thenBy$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$thenBy_0, closure$selector_0) { - this.this$thenBy_0 = this$thenBy_0; - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var previousCompare = this.this$thenBy_0.compare(a, b); - if (previousCompare !== 0) { - return previousCompare; - } else { - var selector = this.closure$selector_0; - return _.kotlin.comparisons.compareValues_cj5vqg$(selector(a), selector(b)); - } - }}, {}), thenBy_602gcl$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.thenBy_602gcl$", function($receiver, selector) { - return new _.kotlin.comparisons.thenBy$f($receiver, selector); - }), thenBy$f_0:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$thenBy_0, closure$comparator_0, closure$selector_0) { - this.this$thenBy_0 = this$thenBy_0; - this.closure$comparator_0 = closure$comparator_0; - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var previousCompare = this.this$thenBy_0.compare(a, b); - if (previousCompare !== 0) { - return previousCompare; - } else { - var comparator = this.closure$comparator_0; - var selector = this.closure$selector_0; - return comparator.compare(selector(a), selector(b)); - } - }}, {}), thenBy_njrgee$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.thenBy_njrgee$", function($receiver, comparator, selector) { - return new _.kotlin.comparisons.thenBy$f_0($receiver, comparator, selector); - }), thenByDescending$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$thenByDescending_0, closure$selector_0) { - this.this$thenByDescending_0 = this$thenByDescending_0; - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var previousCompare = this.this$thenByDescending_0.compare(a, b); - if (previousCompare !== 0) { - return previousCompare; - } else { - var selector = this.closure$selector_0; - return _.kotlin.comparisons.compareValues_cj5vqg$(selector(b), selector(a)); - } - }}, {}), thenByDescending_602gcl$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.thenByDescending_602gcl$", function($receiver, selector) { - return new _.kotlin.comparisons.thenByDescending$f($receiver, selector); - }), thenByDescending$f_0:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$thenByDescending_0, closure$comparator_0, closure$selector_0) { - this.this$thenByDescending_0 = this$thenByDescending_0; - this.closure$comparator_0 = closure$comparator_0; - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var previousCompare = this.this$thenByDescending_0.compare(a, b); - if (previousCompare !== 0) { - return previousCompare; - } else { - var comparator = this.closure$comparator_0; - var selector = this.closure$selector_0; - return comparator.compare(selector(b), selector(a)); - } - }}, {}), thenByDescending_njrgee$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.thenByDescending_njrgee$", function($receiver, comparator, selector) { - return new _.kotlin.comparisons.thenByDescending$f_0($receiver, comparator, selector); - }), thenComparator$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$thenComparator_0, closure$comparison_0) { - this.this$thenComparator_0 = this$thenComparator_0; - this.closure$comparison_0 = closure$comparison_0; - }, {compare:function(a, b) { - var previousCompare = this.this$thenComparator_0.compare(a, b); - return previousCompare !== 0 ? previousCompare : this.closure$comparison_0(a, b); - }}, {}), thenComparator_y0jjk4$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.thenComparator_y0jjk4$", function($receiver, comparison) { - return new _.kotlin.comparisons.thenComparator$f($receiver, comparison); - }), then$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$then_0, closure$comparator_0) { - this.this$then_0 = this$then_0; - this.closure$comparator_0 = closure$comparator_0; - }, {compare:function(a, b) { - var previousCompare = this.this$then_0.compare(a, b); - return previousCompare !== 0 ? previousCompare : this.closure$comparator_0.compare(a, b); - }}, {}), then_zdlmq6$:function($receiver, comparator) { - return new _.kotlin.comparisons.then$f($receiver, comparator); - }, thenDescending$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$thenDescending_0, closure$comparator_0) { - this.this$thenDescending_0 = this$thenDescending_0; - this.closure$comparator_0 = closure$comparator_0; - }, {compare:function(a, b) { - var previousCompare = this.this$thenDescending_0.compare(a, b); - return previousCompare !== 0 ? previousCompare : this.closure$comparator_0.compare(b, a); - }}, {}), thenDescending_zdlmq6$:function($receiver, comparator) { - return new _.kotlin.comparisons.thenDescending$f($receiver, comparator); - }, nullsFirst$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$comparator_0) { - this.closure$comparator_0 = closure$comparator_0; - }, {compare:function(a, b) { - if (a === b) { - return 0; - } - if (a == null) { - return-1; - } - if (b == null) { - return 1; - } - return this.closure$comparator_0.compare(a, b); - }}, {}), nullsFirst_9wwew7$:function(comparator) { - return new _.kotlin.comparisons.nullsFirst$f(comparator); - }, nullsFirst:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.nullsFirst", function() { - return _.kotlin.comparisons.nullsFirst_9wwew7$(_.kotlin.comparisons.naturalOrder()); - }), nullsLast$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$comparator_0) { - this.closure$comparator_0 = closure$comparator_0; - }, {compare:function(a, b) { - if (a === b) { - return 0; - } - if (a == null) { - return 1; - } - if (b == null) { - return-1; - } - return this.closure$comparator_0.compare(a, b); - }}, {}), nullsLast_9wwew7$:function(comparator) { - return new _.kotlin.comparisons.nullsLast$f(comparator); - }, nullsLast:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.nullsLast", function() { - return _.kotlin.comparisons.nullsLast_9wwew7$(_.kotlin.comparisons.naturalOrder()); - }), naturalOrder:function() { - var tmp$0; - return Kotlin.isType(tmp$0 = _.kotlin.comparisons.NaturalOrderComparator, Kotlin.Comparator) ? tmp$0 : Kotlin.throwCCE(); - }, reverseOrder:function() { - var tmp$0; - return Kotlin.isType(tmp$0 = _.kotlin.comparisons.ReverseOrderComparator, Kotlin.Comparator) ? tmp$0 : Kotlin.throwCCE(); - }, reversed_n7glsb$:function($receiver) { - var tmp$0, tmp$1; - if (Kotlin.isType($receiver, _.kotlin.comparisons.ReversedComparator)) { - return $receiver.comparator; - } else { - if (Kotlin.equals($receiver, _.kotlin.comparisons.NaturalOrderComparator)) { - return Kotlin.isType(tmp$0 = _.kotlin.comparisons.ReverseOrderComparator, Kotlin.Comparator) ? tmp$0 : Kotlin.throwCCE(); - } else { - if (Kotlin.equals($receiver, _.kotlin.comparisons.ReverseOrderComparator)) { - return Kotlin.isType(tmp$1 = _.kotlin.comparisons.NaturalOrderComparator, Kotlin.Comparator) ? tmp$1 : Kotlin.throwCCE(); - } else { - return new _.kotlin.comparisons.ReversedComparator($receiver); - } - } - } - }, ReversedComparator:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(comparator) { - this.comparator = comparator; - }, {compare:function(a, b) { - return this.comparator.compare(b, a); - }, reversed:function() { - return this.comparator; - }}), NaturalOrderComparator:Kotlin.createObject(function() { - return[Kotlin.Comparator]; - }, null, {compare:function(c1, c2) { - return Kotlin.compareTo(c1, c2); - }, reversed:function() { - return _.kotlin.comparisons.ReverseOrderComparator; - }}), ReverseOrderComparator:Kotlin.createObject(function() { - return[Kotlin.Comparator]; - }, null, {compare:function(c1, c2) { - return Kotlin.compareTo(c2, c1); - }, reversed:function() { - return _.kotlin.comparisons.NaturalOrderComparator; - }})}), internal:Kotlin.definePackage(null, {NoInfer:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), Exact:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), LowPriorityInOverloadResolution:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), HidesMembers:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), OnlyInputTypes:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), InlineOnly:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), InlineExposed:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null)}), properties:Kotlin.definePackage(null, {Delegates:Kotlin.createObject(null, null, {notNull:function() { - return new _.kotlin.properties.NotNullVar; - }, observable_toa4sq$:Kotlin.defineInlineFunction("stdlib.kotlin.properties.Delegates.observable_toa4sq$", function(initialValue, onChange) { - return new _.kotlin.properties.Delegates.observable$f(onChange, initialValue); - }), vetoable_jyribq$:Kotlin.defineInlineFunction("stdlib.kotlin.properties.Delegates.vetoable_jyribq$", function(initialValue, onChange) { - return new _.kotlin.properties.Delegates.vetoable$f(onChange, initialValue); - })}, {observable$f:Kotlin.createClass(function() { - return[_.kotlin.properties.ObservableProperty]; - }, function $fun(closure$onChange_0, initialValue) { - this.closure$onChange_0 = closure$onChange_0; - $fun.baseInitializer.call(this, initialValue); - }, {afterChange_lle7lx$:function(property, oldValue, newValue) { - this.closure$onChange_0(property, oldValue, newValue); - }}, {}), vetoable$f:Kotlin.createClass(function() { - return[_.kotlin.properties.ObservableProperty]; - }, function $fun(closure$onChange_0, initialValue) { - this.closure$onChange_0 = closure$onChange_0; - $fun.baseInitializer.call(this, initialValue); - }, {beforeChange_lle7lx$:function(property, oldValue, newValue) { - return this.closure$onChange_0(property, oldValue, newValue); - }}, {})}), NotNullVar:Kotlin.createClass(function() { - return[_.kotlin.properties.ReadWriteProperty]; - }, function() { - this.value_s2ygim$ = null; - }, {getValue_dsk1ci$:function(thisRef, property) { - var tmp$0; - tmp$0 = this.value_s2ygim$; - if (tmp$0 == null) { - throw new Kotlin.IllegalStateException("Property " + property.name + " should be initialized before get."); - } - return tmp$0; - }, setValue_w32e13$:function(thisRef, property, value) { - this.value_s2ygim$ = value; - }}), ReadOnlyProperty:Kotlin.createTrait(null), ReadWriteProperty:Kotlin.createTrait(null), ObservableProperty:Kotlin.createClass(function() { - return[_.kotlin.properties.ReadWriteProperty]; - }, function(initialValue) { - this.value_gpmoc7$ = initialValue; - }, {beforeChange_lle7lx$:function(property, oldValue, newValue) { - return true; - }, afterChange_lle7lx$:function(property, oldValue, newValue) { - }, getValue_dsk1ci$:function(thisRef, property) { - return this.value_gpmoc7$; - }, setValue_w32e13$:function(thisRef, property, value) { - var oldValue = this.value_gpmoc7$; - if (!this.beforeChange_lle7lx$(property, oldValue, value)) { - return; - } - this.value_gpmoc7$ = value; - this.afterChange_lle7lx$(property, oldValue, value); - }})})}), java:Kotlin.definePackage(null, {io:Kotlin.definePackage(null, {Serializable:Kotlin.createTrait(null)}), lang:Kotlin.definePackage(null, {Runnable$f:Kotlin.createClass(function() { - return[Kotlin.Runnable]; - }, function(closure$action_0) { - this.closure$action_0 = closure$action_0; - }, {run:function() { - this.closure$action_0(); - }}, {}), Runnable_qshda6$:function(action) { - return new _.java.lang.Runnable$f(action); - }, StringBuilder_za3lpa$:Kotlin.defineInlineFunction("stdlib.java.lang.StringBuilder_za3lpa$", function(capacity) { - return new Kotlin.StringBuilder; - }), StringBuilder_6bul2c$:Kotlin.defineInlineFunction("stdlib.java.lang.StringBuilder_6bul2c$", function(content) { - return new Kotlin.StringBuilder(content.toString()); - })}), util:Kotlin.definePackage(null, {Comparator$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$comparison_0) { - this.closure$comparison_0 = closure$comparison_0; - }, {compare:function(obj1, obj2) { - return this.closure$comparison_0(obj1, obj2); - }}, {}), Comparator_67l1x5$:Kotlin.defineInlineFunction("stdlib.java.util.Comparator_67l1x5$", function(comparison) { - return new _.java.util.Comparator$f(comparison); - }), HashSet_wtfk93$:function(c) { - var $receiver = new Kotlin.ComplexHashSet(c.size); - $receiver.addAll_wtfk93$(c); - return $receiver; - }, LinkedHashSet_wtfk93$:function(c) { - var $receiver = new Kotlin.LinkedHashSet(c.size); - $receiver.addAll_wtfk93$(c); - return $receiver; - }, HashMap_r12sna$:function(m) { - var $receiver = new Kotlin.ComplexHashMap(m.size); - $receiver.putAll_r12sna$(m); - return $receiver; - }, LinkedHashMap_r12sna$:function(m) { - var $receiver = new Kotlin.LinkedHashMap(m.size); - $receiver.putAll_r12sna$(m); - return $receiver; - }, ArrayList_wtfk93$:function(c) { - var $receiver = new Kotlin.ArrayList; - $receiver.array = Kotlin.copyToArray(c); - return $receiver; - }, Collections:Kotlin.createObject(null, null, {max_kqnpsu$:function(col, comp) { - return Kotlin.collectionsMax(col, comp); - }, sort_pr3zit$:function(list) { - Kotlin.collectionsSort(list, _.kotlin.comparisons.naturalOrder()); - }, sort_k5qxi4$:function(list, comparator) { - Kotlin.collectionsSort(list, comparator); - }, reverse_heioe9$:function(list) { - var tmp$0; - var size = list.size; - tmp$0 = (size / 2 | 0) - 1; - for (var i = 0;i <= tmp$0;i++) { - var i2 = size - i - 1; - var tmp = list.get_za3lpa$(i); - list.set_vux3hl$(i, list.get_za3lpa$(i2)); - list.set_vux3hl$(i2, tmp); - } - }})})}), org:Kotlin.definePackage(null, {khronos:Kotlin.definePackage(null, {webgl:Kotlin.definePackage(null, {WebGLContextAttributes_aby97w$:Kotlin.defineInlineFunction("stdlib.org.khronos.webgl.WebGLContextAttributes_aby97w$", function(alpha, depth, stencil, antialias, premultipliedAlpha, preserveDrawingBuffer, preferLowPowerToHighPerformance, failIfMajorPerformanceCaveat) { - if (alpha === void 0) { - alpha = true; - } - if (depth === void 0) { - depth = true; - } - if (stencil === void 0) { - stencil = false; - } - if (antialias === void 0) { - antialias = true; - } - if (premultipliedAlpha === void 0) { - premultipliedAlpha = true; - } - if (preserveDrawingBuffer === void 0) { - preserveDrawingBuffer = false; - } - if (preferLowPowerToHighPerformance === void 0) { - preferLowPowerToHighPerformance = false; - } - if (failIfMajorPerformanceCaveat === void 0) { - failIfMajorPerformanceCaveat = false; - } - var o = {}; - o["alpha"] = alpha; - o["depth"] = depth; - o["stencil"] = stencil; - o["antialias"] = antialias; - o["premultipliedAlpha"] = premultipliedAlpha; - o["preserveDrawingBuffer"] = preserveDrawingBuffer; - o["preferLowPowerToHighPerformance"] = preferLowPowerToHighPerformance; - o["failIfMajorPerformanceCaveat"] = failIfMajorPerformanceCaveat; - return o; - }), WebGLContextEventInit_o0ij6q$:Kotlin.defineInlineFunction("stdlib.org.khronos.webgl.WebGLContextEventInit_o0ij6q$", function(statusMessage, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["statusMessage"] = statusMessage; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - })})}), w3c:Kotlin.definePackage(null, {dom:Kotlin.definePackage(null, {events:Kotlin.definePackage(null, {UIEventInit_vz9i9r$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.UIEventInit_vz9i9r$", function(view, detail, bubbles, cancelable) { - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), FocusEventInit_n9ip3s$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.FocusEventInit_n9ip3s$", function(relatedTarget, view, detail, bubbles, cancelable) { - if (relatedTarget === void 0) { - relatedTarget = null; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["relatedTarget"] = relatedTarget; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), MouseEventInit_h05so9$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.MouseEventInit_h05so9$", function(screenX, screenY, clientX, clientY, button, buttons, relatedTarget, ctrlKey, shiftKey, altKey, metaKey, modifierAltGraph, modifierCapsLock, modifierFn, modifierFnLock, modifierHyper, modifierNumLock, modifierOS, modifierScrollLock, modifierSuper, modifierSymbol, modifierSymbolLock, view, detail, bubbles, cancelable) { - if (screenX === void 0) { - screenX = 0; - } - if (screenY === void 0) { - screenY = 0; - } - if (clientX === void 0) { - clientX = 0; - } - if (clientY === void 0) { - clientY = 0; - } - if (button === void 0) { - button = 0; - } - if (buttons === void 0) { - buttons = 0; - } - if (relatedTarget === void 0) { - relatedTarget = null; - } - if (ctrlKey === void 0) { - ctrlKey = false; - } - if (shiftKey === void 0) { - shiftKey = false; - } - if (altKey === void 0) { - altKey = false; - } - if (metaKey === void 0) { - metaKey = false; - } - if (modifierAltGraph === void 0) { - modifierAltGraph = false; - } - if (modifierCapsLock === void 0) { - modifierCapsLock = false; - } - if (modifierFn === void 0) { - modifierFn = false; - } - if (modifierFnLock === void 0) { - modifierFnLock = false; - } - if (modifierHyper === void 0) { - modifierHyper = false; - } - if (modifierNumLock === void 0) { - modifierNumLock = false; - } - if (modifierOS === void 0) { - modifierOS = false; - } - if (modifierScrollLock === void 0) { - modifierScrollLock = false; - } - if (modifierSuper === void 0) { - modifierSuper = false; - } - if (modifierSymbol === void 0) { - modifierSymbol = false; - } - if (modifierSymbolLock === void 0) { - modifierSymbolLock = false; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["screenX"] = screenX; - o["screenY"] = screenY; - o["clientX"] = clientX; - o["clientY"] = clientY; - o["button"] = button; - o["buttons"] = buttons; - o["relatedTarget"] = relatedTarget; - o["ctrlKey"] = ctrlKey; - o["shiftKey"] = shiftKey; - o["altKey"] = altKey; - o["metaKey"] = metaKey; - o["modifierAltGraph"] = modifierAltGraph; - o["modifierCapsLock"] = modifierCapsLock; - o["modifierFn"] = modifierFn; - o["modifierFnLock"] = modifierFnLock; - o["modifierHyper"] = modifierHyper; - o["modifierNumLock"] = modifierNumLock; - o["modifierOS"] = modifierOS; - o["modifierScrollLock"] = modifierScrollLock; - o["modifierSuper"] = modifierSuper; - o["modifierSymbol"] = modifierSymbol; - o["modifierSymbolLock"] = modifierSymbolLock; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), EventModifierInit_wnf6pc$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.EventModifierInit_wnf6pc$", function(ctrlKey, shiftKey, altKey, metaKey, modifierAltGraph, modifierCapsLock, modifierFn, modifierFnLock, modifierHyper, modifierNumLock, modifierOS, modifierScrollLock, modifierSuper, modifierSymbol, modifierSymbolLock, view, detail, bubbles, cancelable) { - if (ctrlKey === void 0) { - ctrlKey = false; - } - if (shiftKey === void 0) { - shiftKey = false; - } - if (altKey === void 0) { - altKey = false; - } - if (metaKey === void 0) { - metaKey = false; - } - if (modifierAltGraph === void 0) { - modifierAltGraph = false; - } - if (modifierCapsLock === void 0) { - modifierCapsLock = false; - } - if (modifierFn === void 0) { - modifierFn = false; - } - if (modifierFnLock === void 0) { - modifierFnLock = false; - } - if (modifierHyper === void 0) { - modifierHyper = false; - } - if (modifierNumLock === void 0) { - modifierNumLock = false; - } - if (modifierOS === void 0) { - modifierOS = false; - } - if (modifierScrollLock === void 0) { - modifierScrollLock = false; - } - if (modifierSuper === void 0) { - modifierSuper = false; - } - if (modifierSymbol === void 0) { - modifierSymbol = false; - } - if (modifierSymbolLock === void 0) { - modifierSymbolLock = false; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["ctrlKey"] = ctrlKey; - o["shiftKey"] = shiftKey; - o["altKey"] = altKey; - o["metaKey"] = metaKey; - o["modifierAltGraph"] = modifierAltGraph; - o["modifierCapsLock"] = modifierCapsLock; - o["modifierFn"] = modifierFn; - o["modifierFnLock"] = modifierFnLock; - o["modifierHyper"] = modifierHyper; - o["modifierNumLock"] = modifierNumLock; - o["modifierOS"] = modifierOS; - o["modifierScrollLock"] = modifierScrollLock; - o["modifierSuper"] = modifierSuper; - o["modifierSymbol"] = modifierSymbol; - o["modifierSymbolLock"] = modifierSymbolLock; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), WheelEventInit_2knbe1$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.WheelEventInit_2knbe1$", function(deltaX, deltaY, deltaZ, deltaMode, screenX, screenY, clientX, clientY, button, buttons, relatedTarget, ctrlKey, shiftKey, altKey, metaKey, modifierAltGraph, modifierCapsLock, modifierFn, modifierFnLock, modifierHyper, modifierNumLock, modifierOS, modifierScrollLock, modifierSuper, modifierSymbol, modifierSymbolLock, view, detail, bubbles, cancelable) { - if (deltaX === void 0) { - deltaX = 0; - } - if (deltaY === void 0) { - deltaY = 0; - } - if (deltaZ === void 0) { - deltaZ = 0; - } - if (deltaMode === void 0) { - deltaMode = 0; - } - if (screenX === void 0) { - screenX = 0; - } - if (screenY === void 0) { - screenY = 0; - } - if (clientX === void 0) { - clientX = 0; - } - if (clientY === void 0) { - clientY = 0; - } - if (button === void 0) { - button = 0; - } - if (buttons === void 0) { - buttons = 0; - } - if (relatedTarget === void 0) { - relatedTarget = null; - } - if (ctrlKey === void 0) { - ctrlKey = false; - } - if (shiftKey === void 0) { - shiftKey = false; - } - if (altKey === void 0) { - altKey = false; - } - if (metaKey === void 0) { - metaKey = false; - } - if (modifierAltGraph === void 0) { - modifierAltGraph = false; - } - if (modifierCapsLock === void 0) { - modifierCapsLock = false; - } - if (modifierFn === void 0) { - modifierFn = false; - } - if (modifierFnLock === void 0) { - modifierFnLock = false; - } - if (modifierHyper === void 0) { - modifierHyper = false; - } - if (modifierNumLock === void 0) { - modifierNumLock = false; - } - if (modifierOS === void 0) { - modifierOS = false; - } - if (modifierScrollLock === void 0) { - modifierScrollLock = false; - } - if (modifierSuper === void 0) { - modifierSuper = false; - } - if (modifierSymbol === void 0) { - modifierSymbol = false; - } - if (modifierSymbolLock === void 0) { - modifierSymbolLock = false; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["deltaX"] = deltaX; - o["deltaY"] = deltaY; - o["deltaZ"] = deltaZ; - o["deltaMode"] = deltaMode; - o["screenX"] = screenX; - o["screenY"] = screenY; - o["clientX"] = clientX; - o["clientY"] = clientY; - o["button"] = button; - o["buttons"] = buttons; - o["relatedTarget"] = relatedTarget; - o["ctrlKey"] = ctrlKey; - o["shiftKey"] = shiftKey; - o["altKey"] = altKey; - o["metaKey"] = metaKey; - o["modifierAltGraph"] = modifierAltGraph; - o["modifierCapsLock"] = modifierCapsLock; - o["modifierFn"] = modifierFn; - o["modifierFnLock"] = modifierFnLock; - o["modifierHyper"] = modifierHyper; - o["modifierNumLock"] = modifierNumLock; - o["modifierOS"] = modifierOS; - o["modifierScrollLock"] = modifierScrollLock; - o["modifierSuper"] = modifierSuper; - o["modifierSymbol"] = modifierSymbol; - o["modifierSymbolLock"] = modifierSymbolLock; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), KeyboardEventInit_f73pgi$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.KeyboardEventInit_f73pgi$", function(key, code, location, repeat, isComposing, ctrlKey, shiftKey, altKey, metaKey, modifierAltGraph, modifierCapsLock, modifierFn, modifierFnLock, modifierHyper, modifierNumLock, modifierOS, modifierScrollLock, modifierSuper, modifierSymbol, modifierSymbolLock, view, detail, bubbles, cancelable) { - if (key === void 0) { - key = ""; - } - if (code === void 0) { - code = ""; - } - if (location === void 0) { - location = 0; - } - if (repeat === void 0) { - repeat = false; - } - if (isComposing === void 0) { - isComposing = false; - } - if (ctrlKey === void 0) { - ctrlKey = false; - } - if (shiftKey === void 0) { - shiftKey = false; - } - if (altKey === void 0) { - altKey = false; - } - if (metaKey === void 0) { - metaKey = false; - } - if (modifierAltGraph === void 0) { - modifierAltGraph = false; - } - if (modifierCapsLock === void 0) { - modifierCapsLock = false; - } - if (modifierFn === void 0) { - modifierFn = false; - } - if (modifierFnLock === void 0) { - modifierFnLock = false; - } - if (modifierHyper === void 0) { - modifierHyper = false; - } - if (modifierNumLock === void 0) { - modifierNumLock = false; - } - if (modifierOS === void 0) { - modifierOS = false; - } - if (modifierScrollLock === void 0) { - modifierScrollLock = false; - } - if (modifierSuper === void 0) { - modifierSuper = false; - } - if (modifierSymbol === void 0) { - modifierSymbol = false; - } - if (modifierSymbolLock === void 0) { - modifierSymbolLock = false; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["key"] = key; - o["code"] = code; - o["location"] = location; - o["repeat"] = repeat; - o["isComposing"] = isComposing; - o["ctrlKey"] = ctrlKey; - o["shiftKey"] = shiftKey; - o["altKey"] = altKey; - o["metaKey"] = metaKey; - o["modifierAltGraph"] = modifierAltGraph; - o["modifierCapsLock"] = modifierCapsLock; - o["modifierFn"] = modifierFn; - o["modifierFnLock"] = modifierFnLock; - o["modifierHyper"] = modifierHyper; - o["modifierNumLock"] = modifierNumLock; - o["modifierOS"] = modifierOS; - o["modifierScrollLock"] = modifierScrollLock; - o["modifierSuper"] = modifierSuper; - o["modifierSymbol"] = modifierSymbol; - o["modifierSymbolLock"] = modifierSymbolLock; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), CompositionEventInit_v3o02b$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.CompositionEventInit_v3o02b$", function(data, view, detail, bubbles, cancelable) { - if (data === void 0) { - data = ""; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["data"] = data; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - })}), TrackEventInit_u7e3y1$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.TrackEventInit_u7e3y1$", function(track, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["track"] = track; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), AutocompleteErrorEventInit_o0ij6q$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.AutocompleteErrorEventInit_o0ij6q$", function(reason, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["reason"] = reason; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), RelatedEventInit_w30gy5$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.RelatedEventInit_w30gy5$", function(relatedTarget, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["relatedTarget"] = relatedTarget; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), CanvasRenderingContext2DSettings_6taknv$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.CanvasRenderingContext2DSettings_6taknv$", function(alpha) { - if (alpha === void 0) { - alpha = true; - } - var o = {}; - o["alpha"] = alpha; - return o; - }), HitRegionOptions_7peykz$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.HitRegionOptions_7peykz$", function(path, fillRule, id, parentID, cursor, control, label, role) { - if (path === void 0) { - path = null; - } - if (fillRule === void 0) { - fillRule = "nonzero"; - } - if (id === void 0) { - id = ""; - } - if (parentID === void 0) { - parentID = null; - } - if (cursor === void 0) { - cursor = "inherit"; - } - if (control === void 0) { - control = null; - } - if (label === void 0) { - label = null; - } - if (role === void 0) { - role = null; - } - var o = {}; - o["path"] = path; - o["fillRule"] = fillRule; - o["id"] = id; - o["parentID"] = parentID; - o["cursor"] = cursor; - o["control"] = control; - o["label"] = label; - o["role"] = role; - return o; - }), DragEventInit_mm3m7l$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.DragEventInit_mm3m7l$", function(dataTransfer, screenX, screenY, clientX, clientY, button, buttons, relatedTarget, ctrlKey, shiftKey, altKey, metaKey, modifierAltGraph, modifierCapsLock, modifierFn, modifierFnLock, modifierHyper, modifierNumLock, modifierOS, modifierScrollLock, modifierSuper, modifierSymbol, modifierSymbolLock, view, detail, bubbles, cancelable) { - if (screenX === void 0) { - screenX = 0; - } - if (screenY === void 0) { - screenY = 0; - } - if (clientX === void 0) { - clientX = 0; - } - if (clientY === void 0) { - clientY = 0; - } - if (button === void 0) { - button = 0; - } - if (buttons === void 0) { - buttons = 0; - } - if (relatedTarget === void 0) { - relatedTarget = null; - } - if (ctrlKey === void 0) { - ctrlKey = false; - } - if (shiftKey === void 0) { - shiftKey = false; - } - if (altKey === void 0) { - altKey = false; - } - if (metaKey === void 0) { - metaKey = false; - } - if (modifierAltGraph === void 0) { - modifierAltGraph = false; - } - if (modifierCapsLock === void 0) { - modifierCapsLock = false; - } - if (modifierFn === void 0) { - modifierFn = false; - } - if (modifierFnLock === void 0) { - modifierFnLock = false; - } - if (modifierHyper === void 0) { - modifierHyper = false; - } - if (modifierNumLock === void 0) { - modifierNumLock = false; - } - if (modifierOS === void 0) { - modifierOS = false; - } - if (modifierScrollLock === void 0) { - modifierScrollLock = false; - } - if (modifierSuper === void 0) { - modifierSuper = false; - } - if (modifierSymbol === void 0) { - modifierSymbol = false; - } - if (modifierSymbolLock === void 0) { - modifierSymbolLock = false; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["dataTransfer"] = dataTransfer; - o["screenX"] = screenX; - o["screenY"] = screenY; - o["clientX"] = clientX; - o["clientY"] = clientY; - o["button"] = button; - o["buttons"] = buttons; - o["relatedTarget"] = relatedTarget; - o["ctrlKey"] = ctrlKey; - o["shiftKey"] = shiftKey; - o["altKey"] = altKey; - o["metaKey"] = metaKey; - o["modifierAltGraph"] = modifierAltGraph; - o["modifierCapsLock"] = modifierCapsLock; - o["modifierFn"] = modifierFn; - o["modifierFnLock"] = modifierFnLock; - o["modifierHyper"] = modifierHyper; - o["modifierNumLock"] = modifierNumLock; - o["modifierOS"] = modifierOS; - o["modifierScrollLock"] = modifierScrollLock; - o["modifierSuper"] = modifierSuper; - o["modifierSymbol"] = modifierSymbol; - o["modifierSymbolLock"] = modifierSymbolLock; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), PopStateEventInit_xro667$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.PopStateEventInit_xro667$", function(state, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["state"] = state; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), HashChangeEventInit_9djc0g$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.HashChangeEventInit_9djc0g$", function(oldURL, newURL, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["oldURL"] = oldURL; - o["newURL"] = newURL; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), PageTransitionEventInit_ws0pad$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.PageTransitionEventInit_ws0pad$", function(persisted, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["persisted"] = persisted; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), ErrorEventInit_os3ye3$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.ErrorEventInit_os3ye3$", function(message, filename, lineno, colno, error, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["message"] = message; - o["filename"] = filename; - o["lineno"] = lineno; - o["colno"] = colno; - o["error"] = error; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), MessageEventInit_b4x2sp$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.MessageEventInit_b4x2sp$", function(data, origin, lastEventId, source, ports, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["data"] = data; - o["origin"] = origin; - o["lastEventId"] = lastEventId; - o["source"] = source; - o["ports"] = ports; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), EventSourceInit_6taknv$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.EventSourceInit_6taknv$", function(withCredentials) { - if (withCredentials === void 0) { - withCredentials = false; - } - var o = {}; - o["withCredentials"] = withCredentials; - return o; - }), CloseEventInit_kz92y6$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.CloseEventInit_kz92y6$", function(wasClean, code, reason, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["wasClean"] = wasClean; - o["code"] = code; - o["reason"] = reason; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), StorageEventInit_hhd9ie$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.StorageEventInit_hhd9ie$", function(key, oldValue, newValue, url, storageArea, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["key"] = key; - o["oldValue"] = oldValue; - o["newValue"] = newValue; - o["url"] = url; - o["storageArea"] = storageArea; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), EventInit_dqye30$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.EventInit_dqye30$", function(bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), CustomEventInit_xro667$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.CustomEventInit_xro667$", function(detail, bubbles, cancelable) { - if (detail === void 0) { - detail = null; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), MutationObserverInit_aj2h80$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.MutationObserverInit_aj2h80$", function(childList, attributes, characterData, subtree, attributeOldValue, characterDataOldValue, attributeFilter) { - if (childList === void 0) { - childList = false; - } - if (subtree === void 0) { - subtree = false; - } - var o = {}; - o["childList"] = childList; - o["attributes"] = attributes; - o["characterData"] = characterData; - o["subtree"] = subtree; - o["attributeOldValue"] = attributeOldValue; - o["characterDataOldValue"] = characterDataOldValue; - o["attributeFilter"] = attributeFilter; - return o; - }), EditingBeforeInputEventInit_9djc0g$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.EditingBeforeInputEventInit_9djc0g$", function(command, value, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["command"] = command; - o["value"] = value; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), EditingInputEventInit_9djc0g$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.EditingInputEventInit_9djc0g$", function(command, value, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["command"] = command; - o["value"] = value; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), DOMPointInit_6y0v78$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.DOMPointInit_6y0v78$", function(x, y, z, w) { - if (x === void 0) { - x = 0; - } - if (y === void 0) { - y = 0; - } - if (z === void 0) { - z = 0; - } - if (w === void 0) { - w = 1; - } - var o = {}; - o["x"] = x; - o["y"] = y; - o["z"] = z; - o["w"] = w; - return o; - }), DOMRectInit_6y0v78$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.DOMRectInit_6y0v78$", function(x, y, width, height) { - if (x === void 0) { - x = 0; - } - if (y === void 0) { - y = 0; - } - if (width === void 0) { - width = 0; - } - if (height === void 0) { - height = 0; - } - var o = {}; - o["x"] = x; - o["y"] = y; - o["width"] = width; - o["height"] = height; - return o; - }), ScrollOptions_61zpoe$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.ScrollOptions_61zpoe$", function(behavior) { - if (behavior === void 0) { - behavior = "auto"; - } - var o = {}; - o["behavior"] = behavior; - return o; - }), ScrollOptionsHorizontal_t0es5s$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.ScrollOptionsHorizontal_t0es5s$", function(x, behavior) { - if (behavior === void 0) { - behavior = "auto"; - } - var o = {}; - o["x"] = x; - o["behavior"] = behavior; - return o; - }), ScrollOptionsVertical_t0es5s$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.ScrollOptionsVertical_t0es5s$", function(y, behavior) { - if (behavior === void 0) { - behavior = "auto"; - } - var o = {}; - o["y"] = y; - o["behavior"] = behavior; - return o; - }), BoxQuadOptions_axdi75$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.BoxQuadOptions_axdi75$", function(box, relativeTo) { - if (box === void 0) { - box = "border"; - } - var o = {}; - o["box"] = box; - o["relativeTo"] = relativeTo; - return o; - }), ConvertCoordinateOptions_puj7f4$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.ConvertCoordinateOptions_puj7f4$", function(fromBox, toBox) { - if (fromBox === void 0) { - fromBox = "border"; - } - if (toBox === void 0) { - toBox = "border"; - } - var o = {}; - o["fromBox"] = fromBox; - o["toBox"] = toBox; - return o; - })}), fetch:Kotlin.definePackage(null, {RequestInit_rz7b8m$:Kotlin.defineInlineFunction("stdlib.org.w3c.fetch.RequestInit_rz7b8m$", function(method, headers, body, mode, credentials, cache, redirect) { - var o = {}; - o["method"] = method; - o["headers"] = headers; - o["body"] = body; - o["mode"] = mode; - o["credentials"] = credentials; - o["cache"] = cache; - o["redirect"] = redirect; - return o; - }), ResponseInit_v2gkk6$:Kotlin.defineInlineFunction("stdlib.org.w3c.fetch.ResponseInit_v2gkk6$", function(status, statusText, headers) { - if (status === void 0) { - status = 200; - } - if (statusText === void 0) { - statusText = "OK"; - } - var o = {}; - o["status"] = status; - o["statusText"] = statusText; - o["headers"] = headers; - return o; - })}), files:Kotlin.definePackage(null, {BlobPropertyBag_61zpoe$:Kotlin.defineInlineFunction("stdlib.org.w3c.files.BlobPropertyBag_61zpoe$", function(type) { - if (type === void 0) { - type = ""; - } - var o = {}; - o["type"] = type; - return o; - }), FilePropertyBag_bm4lxs$:Kotlin.defineInlineFunction("stdlib.org.w3c.files.FilePropertyBag_bm4lxs$", function(type, lastModified) { - if (type === void 0) { - type = ""; - } - var o = {}; - o["type"] = type; - o["lastModified"] = lastModified; - return o; - })}), notifications:Kotlin.definePackage(null, {NotificationOptions_kav9qg$:Kotlin.defineInlineFunction("stdlib.org.w3c.notifications.NotificationOptions_kav9qg$", function(dir, lang, body, tag, icon, sound, vibrate, renotify, silent, noscreen, sticky, data) { - if (dir === void 0) { - dir = "auto"; - } - if (lang === void 0) { - lang = ""; - } - if (body === void 0) { - body = ""; - } - if (tag === void 0) { - tag = ""; - } - if (renotify === void 0) { - renotify = false; - } - if (silent === void 0) { - silent = false; - } - if (noscreen === void 0) { - noscreen = false; - } - if (sticky === void 0) { - sticky = false; - } - if (data === void 0) { - data = null; - } - var o = {}; - o["dir"] = dir; - o["lang"] = lang; - o["body"] = body; - o["tag"] = tag; - o["icon"] = icon; - o["sound"] = sound; - o["vibrate"] = vibrate; - o["renotify"] = renotify; - o["silent"] = silent; - o["noscreen"] = noscreen; - o["sticky"] = sticky; - o["data"] = data; - return o; - }), GetNotificationOptions_61zpoe$:Kotlin.defineInlineFunction("stdlib.org.w3c.notifications.GetNotificationOptions_61zpoe$", function(tag) { - if (tag === void 0) { - tag = ""; - } - var o = {}; - o["tag"] = tag; - return o; - }), NotificationEventInit_feq8qm$:Kotlin.defineInlineFunction("stdlib.org.w3c.notifications.NotificationEventInit_feq8qm$", function(notification, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["notification"] = notification; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - })}), workers:Kotlin.definePackage(null, {RegistrationOptions_61zpoe$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.RegistrationOptions_61zpoe$", function(scope) { - var o = {}; - o["scope"] = scope; - return o; - }), ServiceWorkerMessageEventInit_sy6pe0$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.ServiceWorkerMessageEventInit_sy6pe0$", function(data, origin, lastEventId, source, ports, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["data"] = data; - o["origin"] = origin; - o["lastEventId"] = lastEventId; - o["source"] = source; - o["ports"] = ports; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), ClientQueryOptions_8kj6y5$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.ClientQueryOptions_8kj6y5$", function(includeUncontrolled, type) { - if (includeUncontrolled === void 0) { - includeUncontrolled = false; - } - if (type === void 0) { - type = "window"; - } - var o = {}; - o["includeUncontrolled"] = includeUncontrolled; - o["type"] = type; - return o; - }), ExtendableEventInit_dqye30$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.ExtendableEventInit_dqye30$", function(bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), FetchEventInit_b3bcq8$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.FetchEventInit_b3bcq8$", function(request, client, isReload, bubbles, cancelable) { - if (isReload === void 0) { - isReload = false; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["request"] = request; - o["client"] = client; - o["isReload"] = isReload; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), ExtendableMessageEventInit_9wcmnd$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.ExtendableMessageEventInit_9wcmnd$", function(data, origin, lastEventId, source, ports, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["data"] = data; - o["origin"] = origin; - o["lastEventId"] = lastEventId; - o["source"] = source; - o["ports"] = ports; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), CacheQueryOptions_qfoyx9$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.CacheQueryOptions_qfoyx9$", function(ignoreSearch, ignoreMethod, ignoreVary, cacheName) { - if (ignoreSearch === void 0) { - ignoreSearch = false; - } - if (ignoreMethod === void 0) { - ignoreMethod = false; - } - if (ignoreVary === void 0) { - ignoreVary = false; - } - var o = {}; - o["ignoreSearch"] = ignoreSearch; - o["ignoreMethod"] = ignoreMethod; - o["ignoreVary"] = ignoreVary; - o["cacheName"] = cacheName; - return o; - }), CacheBatchOperation_2un2y0$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.CacheBatchOperation_2un2y0$", function(type, request, response, options) { - var o = {}; - o["type"] = type; - o["request"] = request; - o["response"] = response; - o["options"] = options; - return o; - })}), xhr:Kotlin.definePackage(null, {ProgressEventInit_vo5a85$:Kotlin.defineInlineFunction("stdlib.org.w3c.xhr.ProgressEventInit_vo5a85$", function(lengthComputable, loaded, total, bubbles, cancelable) { - if (lengthComputable === void 0) { - lengthComputable = false; - } - if (loaded === void 0) { - loaded = 0; - } - if (total === void 0) { - total = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["lengthComputable"] = lengthComputable; - o["loaded"] = loaded; - o["total"] = total; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - })})})})}); - Kotlin.defineModule("stdlib", _); -})(Kotlin); -if (typeof module !== "undefined" && module.exports) { - module.exports = Kotlin; -} -; \ No newline at end of file diff --git a/car_srv/kotlinSrv/package.json b/car_srv/kotlinSrv/package.json deleted file mode 100644 index 8a807668a67..00000000000 --- a/car_srv/kotlinSrv/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "CarServer", - "version": "1.0.0", - "description": "", - "main": "main.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start": "node main.js" - }, - "author": "maxim", - "license": "ISC", - "devDependencies": { - "udev": "^0.3.0", - "commander": "^2.9.0", - "protobufjs": "^5.0.1", - "xml-parser": "^1.2.1" - } -} diff --git a/car_srv/kotlinSrv/run.sh b/car_srv/kotlinSrv/run.sh deleted file mode 100755 index 7637972e071..00000000000 --- a/car_srv/kotlinSrv/run.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -cd build/js -node main.js $* diff --git a/car_srv/kotlinSrv/settings.gradle b/car_srv/kotlinSrv/settings.gradle deleted file mode 100644 index c33607a4bd2..00000000000 --- a/car_srv/kotlinSrv/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = 'CarServer' - diff --git a/car_srv/kotlinSrv/src/Config.kt b/car_srv/kotlinSrv/src/Config.kt deleted file mode 100644 index 7c37549b827..00000000000 --- a/car_srv/kotlinSrv/src/Config.kt +++ /dev/null @@ -1,41 +0,0 @@ -class Config(val configFileName: String = "config.cfg") { - - - private var serverIp = "127.0.0.1" - private var thisCarIp = "127.0.0.1" - - fun loadConfig(): Boolean { - - try { - fs.accessSync(configFileName, fs.F_OK) - } catch (e: dynamic) { - // create it - fs.openSync(configFileName, "w") - } - - val data: String = fs.readFileSync(configFileName, "utf8") - data.split("\n").forEach { line -> - val keyValue = line.split(":") - if (!line.equals("")) { - if (keyValue.size != 2) { - return false - } - - println(keyValue.toString()) - when (keyValue[0]) { - "mainServerIp" -> serverIp = keyValue[1] - "thisServerIp" -> thisCarIp = keyValue[1] - } - } - } - return true - } - - fun getIp(): String { - return serverIp - } - - fun getCarIp(): String { - return thisCarIp - } -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/JSImport.kt b/car_srv/kotlinSrv/src/JSImport.kt deleted file mode 100644 index 6adf303ee41..00000000000 --- a/car_srv/kotlinSrv/src/JSImport.kt +++ /dev/null @@ -1,97 +0,0 @@ -@native -fun require(name: String): dynamic = noImpl - -@native -fun setTimeout(callBack: () -> Unit, ms: Int): dynamic = noImpl - -fun encodeProtoBuf(protoMessage: T): ByteArray { - val routeBytes: ByteArray - when (protoMessage) { - is LocationResponse -> { - val protoSize = protoMessage.getSizeNoTag() - routeBytes = ByteArray(protoSize) - val codedOutput = CodedOutputStream(routeBytes) - protoMessage.writeTo(codedOutput) - } - is UploadResult -> { - val protoSize = protoMessage.getSizeNoTag() - routeBytes = ByteArray(protoSize) - val codedOutput = CodedOutputStream(routeBytes) - protoMessage.writeTo(codedOutput) - } - is DebugResponseMemoryStats -> { - val protoSize = protoMessage.getSizeNoTag() - routeBytes = ByteArray(protoSize) - val codedOutput = CodedOutputStream(routeBytes) - protoMessage.writeTo(codedOutput) - } - - is DebugRequest -> { - val protoSize = protoMessage.getSizeNoTag() - routeBytes = ByteArray(protoSize) - val codedOutput = CodedOutputStream(routeBytes) - protoMessage.writeTo(codedOutput) - } - - is RouteResponse -> { - val protoSize = protoMessage.getSizeNoTag() - routeBytes = ByteArray(protoSize) - val codedOutput = CodedOutputStream(routeBytes) - protoMessage.writeTo(codedOutput) - } - - is RouteRequest -> { - val protoSize = protoMessage.getSizeNoTag() - routeBytes = ByteArray(protoSize) - val codedOutput = CodedOutputStream(routeBytes) - protoMessage.writeTo(codedOutput) - } - is RouteMetricRequest -> { - val protoSize = protoMessage.getSizeNoTag() - routeBytes = ByteArray(protoSize) - val codedOutput = CodedOutputStream(routeBytes) - protoMessage.writeTo(codedOutput) - } - - is TaskRequest -> { - val protoSize = protoMessage.getSizeNoTag() - routeBytes = ByteArray(protoSize) - val codedOutput = CodedOutputStream(routeBytes) - protoMessage.writeTo(codedOutput) - } - - is RouteDoneRequest -> { - val protoSize = protoMessage.getSizeNoTag() - routeBytes = ByteArray(protoSize) - val codedOutput = CodedOutputStream(routeBytes) - protoMessage.writeTo(codedOutput) - } - - is SonarResponse -> { - val protoSize = protoMessage.getSizeNoTag() - routeBytes = ByteArray(protoSize) - val codedOutput = CodedOutputStream(routeBytes) - protoMessage.writeTo(codedOutput) - } - - is SonarRequest -> { - val protoSize = protoMessage.getSizeNoTag() - routeBytes = ByteArray(protoSize) - val codedOutput = CodedOutputStream(routeBytes) - protoMessage.writeTo(codedOutput) - } - is SonarExploreAngleRequest -> { - val protoSize = protoMessage.getSizeNoTag() - routeBytes = ByteArray(protoSize) - val codedOutput = CodedOutputStream(routeBytes) - protoMessage.writeTo(codedOutput) - } - - else -> { - println("PROTO MESSAGE DON'T ENCODE!") - routeBytes = ByteArray(0) - } - - } - return routeBytes -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/MCConnectObserver.kt b/car_srv/kotlinSrv/src/MCConnectObserver.kt deleted file mode 100644 index 9e1ba9649cc..00000000000 --- a/car_srv/kotlinSrv/src/MCConnectObserver.kt +++ /dev/null @@ -1,6 +0,0 @@ -interface MCConnectObserver { - - fun connect(transportFileName: V) - fun disconnect() - -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/MCConnection.kt b/car_srv/kotlinSrv/src/MCConnection.kt deleted file mode 100644 index 86cc561a7a7..00000000000 --- a/car_srv/kotlinSrv/src/MCConnection.kt +++ /dev/null @@ -1,129 +0,0 @@ -class McTransport() : MCConnectObserver { - - private var writeStream: dynamic = null - private var readStream: dynamic = null - private val resultBytes = arrayListOf() - private var callback: (bytes: ByteArray) -> Unit = {} - - init { - McConditionMonitor.instance.addObserver(this) - } - - private fun sendBytes(bytes: ByteArray) { - val bytesHeader = encodeInt(bytes.size) - println("write: $bytesHeader") - writeStream.write(js("new Buffer(bytesHeader)")) - println("write: $bytes") - writeStream.write(js("new Buffer(bytes)")) - } - - - fun sendProtoBuf(message: DebugRequest) { - val typeMessage = getProtoBufTypeMessage(TaskRequest.Type.DEBUG) - sendProtoBufType(typeMessage) - sendBytes(encodeProtoBuf(message)) - } - - fun sendProtoBuf(message: SonarRequest) { - val typeMessage = getProtoBufTypeMessage(TaskRequest.Type.SONAR) - sendProtoBufType(typeMessage) - sendBytes(encodeProtoBuf(message)) - } - - fun sendProtoBuf(request: SonarExploreAngleRequest) { - val typeMessage = getProtoBufTypeMessage(TaskRequest.Type.SONAR_EXPLORE) - sendProtoBufType(typeMessage) - sendBytes(encodeProtoBuf(request)) - } - - fun sendProtoBuf(message: RouteRequest) { - val typeMessage = getProtoBufTypeMessage(TaskRequest.Type.ROUTE) - sendProtoBufType(typeMessage) - sendBytes(encodeProtoBuf(message)) - } - - fun sendProtoBuf(request: RouteMetricRequest) { - val typeMessage = getProtoBufTypeMessage(TaskRequest.Type.ROUTE_METRIC) - sendProtoBufType(typeMessage) - sendBytes(encodeProtoBuf(request)) - } - - private fun sendProtoBufType(messageType: TaskRequest) { - val typeBytes = encodeProtoBuf(messageType) - sendBytes(typeBytes) - } - - private fun getProtoBufTypeMessage(type: TaskRequest.Type): TaskRequest { - val result = TaskRequest.BuilderTaskRequest(type) - return result.build() - } - - private fun initStreams(pathToFile: String) { - writeStream = fs.createWriteStream(pathToFile) - readStream = fs.createReadStream(pathToFile) - readStream.on("readable", fun() { - val data = readStream.read() ?: return - var messageLength = getBodyLength(resultBytes) - - for (i in 0..data.length - 1) { - println("read byte :" + data[i]) - resultBytes.add(data[i]) - if (messageLength == -1) { - messageLength = getBodyLength(resultBytes) - } - if (messageLength != -1 && messageLength + protoHeaderLength == resultBytes.size) { - callback.invoke(resultBytes.drop(4).toByteArray()) - resultBytes.clear() - } - } - }) - } - - override fun connect(transportFileName: String) { - initStreams(transportFileName) - } - - override fun disconnect() { - closeStreams() - } - - fun setCallBack(cb: (bytes: ByteArray) -> Unit) { - this.callback = cb - } - - private fun closeStreams() { - writeStream.end() - writeStream = null - readStream = null - } - - private fun getBodyLength(resultBytes: List): Int { - if (resultBytes.size < protoHeaderLength) { - //need first ${protoHeaderLength} bytes - header - return -1 - } - return decodeInt(resultBytes.toByteArray()) - } - - private fun encodeInt(i: Int): ByteArray { - val result = ByteArray(4) - result[0] = i.shr(24).toByte() - result[1] = i.shr(16).toByte() - result[2] = i.shr(8).toByte() - result[3] = i.toByte() - - return result - } - - private fun decodeInt(bytes: ByteArray): Int { - var result = 0 - result += bytes[3] - result += bytes[2].toInt().shl(8) - result += bytes[1].toInt().shl(16) - result += bytes[0].toInt().shl(24) - return result - } -} - -private val protoHeaderLength: Int = 4 -val mcTransport = McTransport() \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/Main.kt b/car_srv/kotlinSrv/src/Main.kt deleted file mode 100644 index b88575cc5ff..00000000000 --- a/car_srv/kotlinSrv/src/Main.kt +++ /dev/null @@ -1,43 +0,0 @@ -import control.car.ControllerToUsb -import net.Client -import net.server.handlers.AbstractHandler -import net.server.handlers.debug.Memory -import net.server.handlers.debug.Sonar -import net.server.handlers.flash.LoadBin -import net.server.handlers.main.* -import net.server.handlers.rc.Control - -val carServerPort: Int = 8888 -val mainServerPort = 7925 - -val config = Config() -val fs: dynamic = require("fs") -fun main(args: Array) { - - if (!config.loadConfig()) { - println("incorrect config format!") - js("process.exit(1)") - } - - val carController = ControllerToUsb() - - val handlers = mutableMapOf() - handlers.put("/rc/control", Control()) - handlers.put("/loadBin", LoadBin()) - handlers.put("/sonar", GetSonarData(carController)) - handlers.put("/sonarExplore", SonarExplore(carController)) - handlers.put("/route", SetRoute(carController)) - handlers.put("/routeMetric", SetRouteMetric(carController)) - handlers.put("/debug/memory", Memory()) - handlers.put("/debug/sonar", Sonar()) - - Client.instance.connectToServer(config.getCarIp(), carServerPort) - - mcTransport.setCallBack { bytes -> - println("read: " + bytes.toString()) - } - - net.server.start(handlers, carServerPort) - val mcConditionMonitor = McConditionMonitor.instance - mcConditionMonitor.start() -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/McConditionMonitor.kt b/car_srv/kotlinSrv/src/McConditionMonitor.kt deleted file mode 100644 index d1672893cc2..00000000000 --- a/car_srv/kotlinSrv/src/McConditionMonitor.kt +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Created by user on 7/27/16. - * observable class, check mc condition and notify observers about changes - */ -class McConditionMonitor private constructor() { - - private val udev: dynamic = require("udev") - private val exec: dynamic = require("child_process").execSync - private val observersList: MutableList> = arrayListOf() - - fun start() { - val monitor = udev.monitor() - monitor.on("add", { device -> - if (isOurMcDevice(device)) { - connectDevice(device) - } - }) - - monitor.on("remove", { device -> - if (isOurMcDevice(device)) { - disconnectDevice() - } - }) - - readFileIfMcConnected() - } - - fun addObserver(MCConnectObserver: MCConnectObserver) { - observersList.add(MCConnectObserver) - } - - private fun notifyMCConnect(nodeName: String) { - for (observer in observersList) { - observer.connect(nodeName) - } - } - - private fun notifyMCDisconnect() { - for (observer in observersList) { - observer.disconnect() - } - } - - private fun isOurMcDevice(device: dynamic): Boolean { - val mcState = McState.instance - return (device.ID_VENDOR_ID == mcState.VENDORID) - && (device.ID_MODEL_ID == mcState.MODELID) - && (device.SUBSYSTEM == "tty") - } - - private fun disconnectDevice() { - println("mc disconnected") - notifyMCDisconnect() - } - - private fun connectDevice(device: dynamic) { - val transportFile: String = device.DEVNAME - println("mc connected. transport file is " + transportFile) - exec("stty -F $transportFile raw -echo -echoe -echok") - notifyMCConnect(transportFile) - } - - private fun readFileIfMcConnected() { - val allTtyDevices = udev.list("tty") - for (device in allTtyDevices) { - if (isOurMcDevice(device)) { - connectDevice(device) - break - } - } - } - - companion object { - val instance = McConditionMonitor() - } - -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/McState.kt b/car_srv/kotlinSrv/src/McState.kt deleted file mode 100644 index 40658e109fa..00000000000 --- a/car_srv/kotlinSrv/src/McState.kt +++ /dev/null @@ -1,30 +0,0 @@ -class McState : MCConnectObserver { - - val VENDORID = "0483" - val MODELID = "5740" - - private var connected = false - private var transportFileName = "" - - init { - McConditionMonitor.instance.addObserver(this) - } - - fun isConnected(): Boolean { - return connected - } - - override fun connect(transportFileName: String) { - this.transportFileName = transportFileName - connected = true - } - - override fun disconnect() { - connected = false - } - - companion object { - val instance = McState() - } - -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/control/Controller.kt b/car_srv/kotlinSrv/src/control/Controller.kt deleted file mode 100644 index a2574b829a0..00000000000 --- a/car_srv/kotlinSrv/src/control/Controller.kt +++ /dev/null @@ -1,13 +0,0 @@ -package control - -import RouteMetricRequest -import RouteRequest -import SonarRequest -import SonarExploreAngleRequest - -interface Controller { - fun executeRoute(route: RouteRequest, callback: (ByteArray) -> Unit) - fun executeMetricRoute(request: RouteMetricRequest, callback: (ByteArray) -> Unit) - fun executeRequestSensorData(sonarRequest: SonarRequest, callback: (ByteArray) -> Unit) - fun executeRequestSensorExploreData(request: SonarExploreAngleRequest, callback: (ByteArray) -> Unit) -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/control/car/ControllerToUsb.kt b/car_srv/kotlinSrv/src/control/car/ControllerToUsb.kt deleted file mode 100644 index bfe31e48893..00000000000 --- a/car_srv/kotlinSrv/src/control/car/ControllerToUsb.kt +++ /dev/null @@ -1,47 +0,0 @@ -package control.car - -import RouteMetricRequest -import RouteRequest -import SonarRequest -import SonarExploreAngleRequest -import control.Controller -import mcTransport - -class ControllerToUsb : Controller { - override fun executeRoute(route: RouteRequest, callback: (ByteArray) -> Unit) { - println("Execute route:") - - mcTransport.setCallBack { bytes -> - callback.invoke(bytes) - } - - mcTransport.sendProtoBuf(route) - } - - override fun executeMetricRoute(request: RouteMetricRequest, callback: (ByteArray) -> Unit) { - println("Execute metric route:") - - mcTransport.setCallBack { bytes -> - callback.invoke(bytes) - } - - mcTransport.sendProtoBuf(request) - } - - override fun executeRequestSensorData(sonarRequest: SonarRequest, callback: (ByteArray) -> Unit) { - println("sonar data") - mcTransport.setCallBack { bytes -> - callback.invoke(bytes) - } - mcTransport.sendProtoBuf(sonarRequest) - } - - override fun executeRequestSensorExploreData(request: SonarExploreAngleRequest, callback: (ByteArray) -> Unit) { - println("SonarExplore data") - mcTransport.setCallBack { bytes -> - callback.invoke(bytes) - } - - mcTransport.sendProtoBuf(request) - } -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/Client.kt b/car_srv/kotlinSrv/src/net/Client.kt deleted file mode 100644 index c345db33b2e..00000000000 --- a/car_srv/kotlinSrv/src/net/Client.kt +++ /dev/null @@ -1,62 +0,0 @@ -package net - -import CodedInputStream -import CodedOutputStream -import ConnectionRequest -import ConnectionResponse -import config -import mainServerPort -import require - -class Client() { - - private val http = require("http") - private var uid: Int = -1 - - fun sendRequest(dataBuffer: dynamic, url: String, successCallback: (responseData: ByteArray) -> Unit, errorCallback: (err: dynamic) -> Unit) { - val options: dynamic = {} - //serverAddress, port and url used on js function. Idea don's see this - val serverAddress = config.getIp() - val port = mainServerPort - js("options = {hostname:serverAddress, port:port, path:url, method:'POST'}") - - val request = http.request(options, { response -> - val resData = mutableListOf() - response.on("data", { data -> - for (i in 0..data.length - 1) { - resData.add(data[i]) - } - }) - response.on("end", { - successCallback.invoke(resData.toByteArray()) - }) - }) - request.on("error", { err -> - errorCallback.invoke(err) - }) - request.write(dataBuffer) - request.end() - } - - fun connectToServer(thisIp: String, thisPort: Int) { - val requestObject = ConnectionRequest.BuilderConnectionRequest(thisIp.split(".").map { str -> parseInt(str, 10) }.toIntArray(), thisPort).build() - val bytes = ByteArray(requestObject.getSizeNoTag()) - requestObject.writeTo(CodedOutputStream(bytes)) - sendRequest(js("new Buffer(bytes)"), "/connect", { resultData -> - val responseObject = ConnectionResponse.BuilderConnectionResponse(0, 0).build() - responseObject.mergeFrom(CodedInputStream(resultData)) - if (responseObject.code == 0) { - this.uid = responseObject.uid - } else { - println("server login error\n" + - "code: ${responseObject.code}") - } - }, { error -> - println("connection error (to main server). error message:\n" + error) - }) - } - - companion object { - val instance = Client() - } -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/Server.kt b/car_srv/kotlinSrv/src/net/server/Server.kt deleted file mode 100644 index d970a117854..00000000000 --- a/car_srv/kotlinSrv/src/net/server/Server.kt +++ /dev/null @@ -1,32 +0,0 @@ -package net.server - - -import net.server.handlers.AbstractHandler -import require - -fun start(handlers: MutableMap, port: Int) { - val http = require("http") - val url = require("url") - http.createServer({ request, response -> - val content = mutableListOf() - val urlName = url.parse(request.url).pathname - val handler = handlers[urlName] - request.on("data", { - data -> - for (i in 0..data.length - 1) { - content.add(data[i]) - } - }) - request.on("end", { - if (handler != null) { - try { - handler.execute(content, response) - } catch (e: dynamic) { - response.end() - } - } else { - response.end() - } - }) - }).listen(port) -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/AbstractHandler.kt b/car_srv/kotlinSrv/src/net/server/handlers/AbstractHandler.kt deleted file mode 100644 index 836a069feb3..00000000000 --- a/car_srv/kotlinSrv/src/net/server/handlers/AbstractHandler.kt +++ /dev/null @@ -1,21 +0,0 @@ -package net.server.handlers - -abstract class AbstractHandler { - fun execute(data: List, response: dynamic) { - val callBack = { resultBytes: ByteArray -> - val resultBuffer = js("new Buffer(resultBytes)") - response.write(resultBuffer) - response.end() - } - - try { - getBytesResponse(data.toByteArray(), callBack) - } catch (e: dynamic) { - println("error in executing handler!") - println(e.toString()) - callBack.invoke(ByteArray(0)) - } - } - - abstract fun getBytesResponse(data: ByteArray, callback: (b: ByteArray) -> Unit) -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/debug/Memory.kt b/car_srv/kotlinSrv/src/net/server/handlers/debug/Memory.kt deleted file mode 100644 index 7488e349f82..00000000000 --- a/car_srv/kotlinSrv/src/net/server/handlers/debug/Memory.kt +++ /dev/null @@ -1,31 +0,0 @@ -package net.server.handlers.debug - -import CodedInputStream -import DebugRequest -import DebugResponseMemoryStats -import McState -import encodeProtoBuf -import mcTransport -import net.server.handlers.AbstractHandler - -class Memory() : AbstractHandler() { - val request = DebugRequest.BuilderDebugRequest(DebugRequest.Type.MEMORY_STATS) - val response = DebugResponseMemoryStats.BuilderDebugResponseMemoryStats(0, 0, 0, 0) - - override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) { - if (!McState.instance.isConnected()) { - println("mc is disconnected!") - val responseMessage = response.build() - callback.invoke(encodeProtoBuf(responseMessage)) - return - } - - mcTransport.setCallBack { bytes -> - callback.invoke(bytes) - } - - val message = request.build() - message.mergeFrom(CodedInputStream(data)) - mcTransport.sendProtoBuf(message) - } -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/debug/Sonar.kt b/car_srv/kotlinSrv/src/net/server/handlers/debug/Sonar.kt deleted file mode 100644 index c2b8dd250a2..00000000000 --- a/car_srv/kotlinSrv/src/net/server/handlers/debug/Sonar.kt +++ /dev/null @@ -1,31 +0,0 @@ -package net.server.handlers.debug - -import CodedInputStream -import DebugRequest -import DebugResponseSonarStats -import McState -import encodeProtoBuf -import mcTransport -import net.server.handlers.AbstractHandler - -class Sonar : AbstractHandler() { - val request = DebugRequest.BuilderDebugRequest(DebugRequest.Type.SONAR_STATS) - val response = DebugResponseSonarStats.BuilderDebugResponseSonarStats(0, 0, 0, 0) - - override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) { - if (!McState.instance.isConnected()) { - println("mc is disconnected!") - val responseMessage = response.build() - callback.invoke(encodeProtoBuf(responseMessage)) - return - } - - mcTransport.setCallBack { bytes -> - callback.invoke(bytes) - } - - val message = request.build() - message.mergeFrom(CodedInputStream(data)) - mcTransport.sendProtoBuf(message) - } -} diff --git a/car_srv/kotlinSrv/src/net/server/handlers/flash/LoadBin.kt b/car_srv/kotlinSrv/src/net/server/handlers/flash/LoadBin.kt deleted file mode 100644 index 023f66d7c48..00000000000 --- a/car_srv/kotlinSrv/src/net/server/handlers/flash/LoadBin.kt +++ /dev/null @@ -1,41 +0,0 @@ -package net.server.handlers.flash - -import CodedInputStream -import Upload -import UploadResult -import encodeProtoBuf -import fs -import net.server.handlers.AbstractHandler -import require - -class LoadBin : AbstractHandler { - - val exec: dynamic - - val fromServerObjectBuilder: Upload.BuilderUpload - val toServerObjectBuilder: UploadResult.BuilderUploadResult - - constructor() : super() { - this.fromServerObjectBuilder = Upload.BuilderUpload(ByteArray(0)) - this.toServerObjectBuilder = UploadResult.BuilderUploadResult(0) - this.exec = require("child_process").exec - } - - override fun getBytesResponse(data: ByteArray, callback: (b: ByteArray) -> Unit) { - val message = fromServerObjectBuilder.build() - message.mergeFrom(CodedInputStream(data)) - fs.writeFile("./flash.bin", js("new Buffer(data)"), { err, stdOut, stdErr -> - if (err) { - println("error in save flash.bin file\n $err") - val responseMessage = toServerObjectBuilder.setResultCode(14).build() - callback.invoke(encodeProtoBuf(responseMessage)) - } - val stFlashCommand = "./st-flash write ./flash.bin " + "0x08000000" - exec(stFlashCommand, { err, stdOutRes, stdErrRes -> - val resultCode = if (err != null) 15 else 0 - val responseMessage = toServerObjectBuilder.setResultCode(resultCode).build() - callback.invoke(encodeProtoBuf(responseMessage)) - }) - }) - } -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/main/GetSonarData.kt b/car_srv/kotlinSrv/src/net/server/handlers/main/GetSonarData.kt deleted file mode 100644 index b7419e56cfd..00000000000 --- a/car_srv/kotlinSrv/src/net/server/handlers/main/GetSonarData.kt +++ /dev/null @@ -1,29 +0,0 @@ -package net.server.handlers.main - -import CodedInputStream -import McState -import SonarRequest -import SonarResponse -import control.Controller -import encodeProtoBuf -import net.server.handlers.AbstractHandler - -class GetSonarData(val controller: Controller) : AbstractHandler() { - val fromServerObjectBuilder = SonarRequest.BuilderSonarRequest(IntArray(0), IntArray(0), 0, SonarRequest.Smoothing.NONE) - val toServerObjectBuilder = SonarResponse.BuilderSonarResponse(IntArray(0)) - - override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) { - val message = fromServerObjectBuilder.build() - message.mergeFrom(CodedInputStream(data)) - - if (McState.instance.isConnected()) { - controller.executeRequestSensorData(message, callback) - return - } - - println("mc is disconnected!") - val responseMessage = toServerObjectBuilder.build() - callback.invoke(encodeProtoBuf(responseMessage)) - return - } -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/main/SetRoute.kt b/car_srv/kotlinSrv/src/net/server/handlers/main/SetRoute.kt deleted file mode 100644 index abd2b918a0a..00000000000 --- a/car_srv/kotlinSrv/src/net/server/handlers/main/SetRoute.kt +++ /dev/null @@ -1,28 +0,0 @@ -package net.server.handlers.main - -import CodedInputStream -import McState -import RouteRequest -import RouteResponse -import control.Controller -import encodeProtoBuf -import net.server.handlers.AbstractHandler - -class SetRoute(var controller: Controller) : AbstractHandler() { - val requestBuilder = RouteRequest.BuilderRouteRequest(IntArray(0), IntArray(0)) - val responseBuilder = RouteResponse.BuilderRouteResponse(0) - - override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) { - val message = requestBuilder.build() - message.mergeFrom(CodedInputStream(data)) - - if (McState.instance.isConnected()) { - controller.executeRoute(message, callback) - return - } - - println("mc is disconnected!") - val responseMessage = responseBuilder.setCode(16).build() - callback.invoke(encodeProtoBuf(responseMessage)) - } -} \ No newline at end of file diff --git a/car_srv/kotlinSrv/src/net/server/handlers/main/SetRouteMetric.kt b/car_srv/kotlinSrv/src/net/server/handlers/main/SetRouteMetric.kt deleted file mode 100644 index 26d01cc5be0..00000000000 --- a/car_srv/kotlinSrv/src/net/server/handlers/main/SetRouteMetric.kt +++ /dev/null @@ -1,28 +0,0 @@ -package net.server.handlers.main - -import CodedInputStream -import McState -import RouteResponse -import control.Controller -import encodeProtoBuf -import net.server.handlers.AbstractHandler - - -class SetRouteMetric(val controller: Controller) : AbstractHandler() { - val requestBuilder = RouteMetricRequest.BuilderRouteMetricRequest(IntArray(0), IntArray(0)) - val responseBuilder = RouteResponse.BuilderRouteResponse(0) - - override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) { - val message = requestBuilder.build() - message.mergeFrom(CodedInputStream(data)) - - if (McState.instance.isConnected()) { - controller.executeMetricRoute(message, callback) - return - } - - println("mc is disconnected!") - val responseMessage = responseBuilder.setCode(16).build() - callback.invoke(encodeProtoBuf(responseMessage)) - } -} diff --git a/car_srv/kotlinSrv/src/net/server/handlers/main/SonarExplore.kt b/car_srv/kotlinSrv/src/net/server/handlers/main/SonarExplore.kt deleted file mode 100644 index 15bdf279c38..00000000000 --- a/car_srv/kotlinSrv/src/net/server/handlers/main/SonarExplore.kt +++ /dev/null @@ -1,29 +0,0 @@ -package net.server.handlers.main - -import CodedInputStream -import McState -import SonarExploreAngleRequest -import SonarExploreAngleResponse -import control.Controller -import encodeProtoBuf -import net.server.handlers.AbstractHandler - -class SonarExplore(val controller: Controller) : AbstractHandler() { - val request = SonarExploreAngleRequest.BuilderSonarExploreAngleRequest(0, 0) - val response = SonarExploreAngleResponse.BuilderSonarExploreAngleResponse(IntArray(0)) - - override fun getBytesResponse(data: ByteArray, callback: (ByteArray) -> Unit) { - val message = request.build() - message.mergeFrom(CodedInputStream(data)) - - if (McState.instance.isConnected()) { - controller.executeRequestSensorExploreData(message, callback) - return - } - - println("mc is disconnected!") - val responseMessage = response.build() - callback.invoke(encodeProtoBuf(responseMessage)) - return - } -} diff --git a/car_srv/kotlinSrv/src/net/server/handlers/rc/Control.kt b/car_srv/kotlinSrv/src/net/server/handlers/rc/Control.kt deleted file mode 100644 index d9c46af72b9..00000000000 --- a/car_srv/kotlinSrv/src/net/server/handlers/rc/Control.kt +++ /dev/null @@ -1,36 +0,0 @@ -package net.server.handlers.rc - -import DirectionRequest -import net.server.handlers.AbstractHandler - -class Control() : AbstractHandler() { - - val request = DirectionRequest.BuilderDirectionRequest(DirectionRequest.Command.fromIntToCommand(0), 0, false) - - override fun getBytesResponse(data: ByteArray, callback: (b: ByteArray) -> Unit) { - //TODO now this handler don't make nothing. need fix:) -// val message = fromServerObjectBuilder.build() -// message.mergeFrom(CodedInputStream(data)) -// val commandNumber = message.command -// val sid = message.sid -// val command = when (commandNumber) { -// DirectionRequest.Command.stop -> { -// MoveDirection.STOP -// } -// DirectionRequest.Command.forward -> { -// MoveDirection.FORWARD -// } -// DirectionRequest.Command.backward -> { -// MoveDirection.BACKWARD -// } -// DirectionRequest.Command.right -> { -// MoveDirection.RIGHT -// } -// DirectionRequest.Command.left -> { -// MoveDirection.LEFT -// } -// else -> MoveDirection.STOP -// } - callback.invoke(ByteArray(0)) - } -} \ No newline at end of file diff --git a/car_srv/src/.gitignore b/car_srv/src/.gitignore deleted file mode 100644 index e48df2f951b..00000000000 --- a/car_srv/src/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.idea/workspace.xml -.idea/uiDesigner.xml -.idea/jsLibraryMappings.xml -.idea/libraries/ -protobufjs -node_modules -out diff --git a/car_srv/src/.idea/misc.xml b/car_srv/src/.idea/misc.xml deleted file mode 100644 index 72abef0a732..00000000000 --- a/car_srv/src/.idea/misc.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/car_srv/src/.idea/modules.xml b/car_srv/src/.idea/modules.xml deleted file mode 100644 index 2e66e1cf2f8..00000000000 --- a/car_srv/src/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/car_srv/src/.idea/stFlashServer.iml b/car_srv/src/.idea/stFlashServer.iml deleted file mode 100644 index 8e8876855ea..00000000000 --- a/car_srv/src/.idea/stFlashServer.iml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/car_srv/src/car.js b/car_srv/src/car.js deleted file mode 100644 index b3d8c8e7eff..00000000000 --- a/car_srv/src/car.js +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Created by user on 7/21/16. - */ - -const fs = require("fs"); -const main = require("./main.js"); -const directionClass = main.protoConstructorControl.DirectionRequest; - -function Car() { - this.uid = ""; - this.x = 0; - this.y = 0; - this.angle = 0; - this.velocityMove = 0.1; - this.velocityRotation = 10; - this.paused = false; - this.transportError = false; - this.currentDirection = 0; - this.executeTimeLeft = 0; - this.moveList = [];//object of direction and time to execute this direction. field: direction:byte, executeTime:double (seconds) - this.nextMoveListIndex = 0; - - this.reset = reset; - this.pause = pause; - this.move = move; - this.setDirection = setDirection; - this.resume = resume; - this.getDirectionByte = getDirectionByte; - this.setPath = setPath; - - return this; -} -function reset() { - this.currentDirection = 0; - this.executeTimeLeft = 0; - this.moveList = []; - this.nextMoveListIndex = 0; -} - -function pause() { - this.paused = true; -} - -function resume() { - this.paused = false; -} - -function move(delta) { - var deltaSeconds = delta / 1000; - console.log("x=" + this.x + " y=" + this.y + " angle=" + this.angle); - if (this.paused) { - return; - } - if (this.executeTimeLeft > 0) { - this.executeTimeLeft -= deltaSeconds; - if (this.currentDirection == this.getDirectionByte(directionClass.Command.left)) { - this.angle += deltaSeconds * this.velocityRotation; - } else if (this.currentDirection == this.getDirectionByte(directionClass.Command.right)) { - this.angle -= deltaSeconds * this.velocityRotation; - } else if (this.currentDirection == this.getDirectionByte(directionClass.Command.forward)) { - this.x += this.velocityMove * deltaSeconds * Math.cos(this.angle * Math.PI / 180); - this.y += this.velocityMove * deltaSeconds * Math.sin(this.angle * Math.PI / 180); - } - } else { - if (this.nextMoveListIndex == this.moveList.length) { - //this was last move point - this.setDirection(this.getDirectionByte(directionClass.Command.stop), null) - } else { - var currentMove = this.moveList[this.nextMoveListIndex]; - this.currentDirection = currentMove.direction; - this.executeTimeLeft = currentMove.executeTime; - this.setDirection(this.currentDirection, null); - this.nextMoveListIndex++; - } - } -} - -//args wayPointsList contains object of points. field {distance, angle_delta}. this fun parse this to move list with field direction and move time with using velocity of move and rotation -function setPath(wayPointsList) { - this.reset(); - for (var i = 0; i < wayPointsList.length; i++) { - var currentPoint = wayPointsList[i]; - var angle = currentPoint.angle_delta; - var distance = currentPoint.distance; - if (angle != 0) { - //need rotation. check direction left or right - if (angle >= 180) { - this.moveList.push({ - "direction": getDirectionByte(directionClass.Command.right), - "executeTime": (angle / this.velocityRotation) - }); - } else { - this.moveList.push({ - "direction": getDirectionByte(directionClass.Command.left), - "executeTime": (angle / this.velocityRotation) - }); - } - } - this.moveList.push({ - "direction": getDirectionByte(directionClass.Command.forward), - "executeTime": (distance / this.velocityMove) - }); - } -} - -function setDirection(directionByte, callBack) { - fs.appendFile(main.transportFilePath, directionByte, "binary", function (error) { - var code = 0; - var errorMsg = ""; - if (error) { - console.log(error); - errorMsg = error; - } - if (callBack != null) { - callBack(code, errorMsg) - } - }); -} - -function getDirectionByte(command) { - resultByte = -1; - switch (command) { - case directionClass.Command.stop: - { - resultByte = "0"; - break; - } - case directionClass.Command.forward: - { - resultByte = "1"; - break; - } - case directionClass.Command.backward: - { - resultByte = "2"; - break; - } - case directionClass.Command.right: - { - resultByte = "3"; - break; - } - case directionClass.Command.left: - { - resultByte = "4"; - break; - } - } - return resultByte -} - -exports.getCar = Car; \ No newline at end of file diff --git a/car_srv/src/client.js b/car_srv/src/client.js deleted file mode 100644 index 2a6673be5c5..00000000000 --- a/car_srv/src/client.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Created by user on 7/22/16. - */ -const main = require("./main.js"); -const http = require("http"); -function sendData(data, url, callBack) { - var options = { - hostname: main.serverAddress, - port: main.serverPort, - path: url, - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Content-Length': Buffer.byteLength(data) - } - }; - var req = http.request(options, function (response) { - var answerData = []; - response.on("data", function (datas) { - for (var i = 0; i < datas.length; i++) { - answerData.push(datas[i]); - } - }); - response.on("end", function () { - callBack(answerData) - }); - }); - //todo errors - req.write(data); - req.end(); -} - -exports.sendData = sendData; \ No newline at end of file diff --git a/car_srv/src/handlers/controlHandler.js b/car_srv/src/handlers/controlHandler.js deleted file mode 100644 index 4ac6deaa140..00000000000 --- a/car_srv/src/handlers/controlHandler.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Created by user on 7/21/16. - */ - -const main = require("./../main.js"); - -function handle(httpContent, response) { - var directionClass = main.protoConstructorControl.DirectionRequest; - var directionObject = directionClass.decode(httpContent); - var resultByte = main.thisCar.getDirectionByte(directionObject.command); - main.thisCar.reset(); - main.thisCar.moveList.push({ - "direction": resultByte, - "executeTime": 100000 - }); - console.log(resultByte); - var directionResponse = new main.protoConstructorControl.DirectionResponse({ - "code": 0, - errorMsg: "" - }); - var byteBuffer = directionResponse.encode(); - var byteArray = []; - for (var i = 0; i < byteBuffer.limit; i++) { - byteArray.push(byteBuffer.buffer[i]); - } - response.writeHead(200, {"Content-Type": "text/plain"}); - response.write(new Buffer(byteArray)); - response.end(); - // main.thisCar.setDirection(resultByte, function (code, errorMsg) { - // var directionResponse = new main.protoConstructorControl.DirectionResponse({ - // "code": code, - // errorMsg: errorMsg - // }); - // response.writeHead(200, {"Content-Type": "text/plain"}); - // response.write(directionResponse.encode().buffer); - // response.end(); - // }); -} - -exports.handler = handle; \ No newline at end of file diff --git a/car_srv/src/handlers/loadBinHandler.js b/car_srv/src/handlers/loadBinHandler.js deleted file mode 100644 index 3fa6e30602a..00000000000 --- a/car_srv/src/handlers/loadBinHandler.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Created by user on 7/21/16. - */ - -const fs = require("fs"); -const main = require("./../main.js"); -const exec = require('child_process').exec; - -function handle(httpContent, response) { - var uploadClass = main.protoConstructorCarkot.Upload; - var uploadObject = uploadClass.decode(httpContent); - fs.writeFile(main.binFilePath, uploadObject.data.buffer, "binary", function (error) { - var uploadResultClass = main.protoConstructorCarkot.UploadResult; - var code = 0; - var stdErr = ""; - if (error) { - code = 2; - stdErr = error.toString(); - } else { - code = 0; - var shCommand = main.commandPrefix + " " + main.binFilePath + " " + uploadObject.base; - exec(shCommand, function (error, stdout, stderr) { - if (error) { - code = 1; - console.error(error); - } - - var resultObject = new uploadResultClass({ - "stdOut": stdout.toString(), - "resultCode": code, - "stdErr": (stderr.toString() + "\n error:" + error) - }); - var byteBuffer = resultObject.encode(); - var byteArray = []; - for (var i = 0; i < byteBuffer.limit; i++) { - byteArray.push(byteBuffer.buffer[i]); - } - response.writeHead(200, {"Content-Type": "text/plain", "Content-length": byteArray.length}); - response.write(new Buffer(byteArray)); - response.end(); - console.log(shCommand); - }); - } - - }); -} - -exports.handler = handle; \ No newline at end of file diff --git a/car_srv/src/handlers/setRouteHandler.js b/car_srv/src/handlers/setRouteHandler.js deleted file mode 100644 index 2c90dad1b96..00000000000 --- a/car_srv/src/handlers/setRouteHandler.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Created by user on 7/21/16. - */ - -const main = require("./../main.js"); - -function handle(httpContent, response) { - const routeClass = main.protoConstructorRoute.RouteRequest; - const routeObject = routeClass.decode(httpContent); - const wayPoints = routeObject.way_points; - main.thisCar.setPath(wayPoints); - - var routeResponse = new main.protoConstructorRoute.RouteResponse({ - "code": 0, - "errorMsg": "" - }); - - var byteBuffer = routeResponse.encode(); - var byteArray = []; - for (var i = 0; i < byteBuffer.limit; i++) { - byteArray.push(byteBuffer.buffer[i]); - } - - response.writeHead(200, {"Content-Type": "text/plain", "Content-length": byteArray.length}); - response.write(new Buffer(byteArray)); - response.end(); - -} - -exports.handler = handle; \ No newline at end of file diff --git a/car_srv/src/main.js b/car_srv/src/main.js deleted file mode 100644 index 01bcadeac6a..00000000000 --- a/car_srv/src/main.js +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Created by maxim zaitsev on 7/11/16. - */ - -const server = require("./server.js"); -const router = require("./router.js"); -const commander = require("commander"); -const protoBuf = require("protobufjs"); -const fs = require("fs"); -const udev = require("udev"); -const client = require("./client.js"); - -//parsing command line args -commander - .version('1.0.0') - .option('-p, --proto [path]', 'path to dir with proto files. need here carkot.proto and route.proto. default ./proto/') - .option('-f, --flash [path]', 'path to save bin file with name flash.bin. default ./') - // .option('-s, --serial [path]', 'path to file that represents MCU serial port default ./serial')//dont need more. use path from udev monitor - .parse(process.argv); - -//add slash to end of paths if need -if (commander.protopath) { - if (commander.protopath.substr(commander.protopath.length - 1) != "/") { - commander.protopath = commander.protopath + "/"; - } -} -if (commander.flash) { - if (commander.flash.substr(commander.flash.length - 1) != "/") { - commander.flash = commander.flash + "/"; - } -} - -//classes for protobuf decode/encode -const builderCarkot = protoBuf.loadProtoFile((commander.protopath ? commander.protopath : "./proto/") + "carkot.proto"); -const builderControl = protoBuf.loadProtoFile((commander.protopath ? commander.protopath : "./proto/" + "direction.proto")); -const builderRoute = protoBuf.loadProtoFile((commander.protopath ? commander.protopath : "./proto/" + "route.proto")); -const builderConnect = protoBuf.loadProtoFile((commander.protopath ? commander.protopath : "./proto/" + "connect.proto")); - -var executeShell = "./st-flash"; -exports.protoConstructorCarkot = builderCarkot.build("carkot"); -exports.protoConstructorControl = builderControl.build("carkot"); -exports.protoConstructorRoute = builderRoute.build("carkot"); -exports.protoConstructorConnect = builderConnect.build("carkot"); -exports.commandPrefix = executeShell + " write"; -exports.binFilePath = (commander.flash ? commander.flash : "./") + "flash.bin"; -exports.transportFilePath = "/dev/ttyACM0";//todo плохо:) -exports.serverAddress = "127.0.0.1"; -exports.serverPort = 7925; - -//init this car -var connectRequest = new exports.protoConstructorConnect.ConnectionRequest({ - // "ip": "192.168.43.135",//todo its ip of this server in local wifi network. hardcore is bad here:) - "ip": "127.0.0.1",//todo for tests on local mashine - "port": 8888 -}); -client.sendData(connectRequest.encode().buffer, "/connect", function (data) { - var connectionResponse = exports.protoConstructorConnect.ConnectionResponse.decode(data); - exports.thisCar.uid = connectionResponse.uid -}); -var car = require("./car.js").getCar(); -exports.thisCar = car; - -//handlers for client requests -var handle = {}; -handle["/loadBin"] = require("./handlers/loadBinHandler").handler; -handle["/control"] = require("./handlers/controlHandler").handler; -handle["/route"] = require("./handlers/setRouteHandler").handler; - -//add event handlers from udev monitor (add device and remove device) -const monitor = udev.monitor(); -monitor.on('add', function (device) { - if (device.ID_VENDOR_ID == "0483" && device.ID_MODEL_ID == "5740" && device.SUBSYSTEM == "tty") { - //mc connected - console.log("connected. transport file is " + device.DEVNAME); - exports.transportFilePath = device.DEVNAME; - console.log(device.DEVNAME); - } -}); -monitor.on('remove', function (device) { - if (device.ID_VENDOR_ID == "0483" && device.ID_MODEL_ID == "5740" && device.SUBSYSTEM == "tty") { - //mc disconnected - console.log("disconnected") - } -}); - -//check of exists st-flash util -if (typeof fs.access == "function") { - fs.access(executeShell, fs.F_OK, function (error) { - if (!error) { - server.start(router.route, handle); - } else { - console.log("file " + executeShell + " not found. Copy this file to server root dir"); - } - }); -} else { - console.log("warning: you have old version of node.js. Check existence of the file st-flash on root of server dir yourself"); - server.start(router.route, handle); -} - -//move car -var delta = 100; -setInterval(moveCar, delta); -function moveCar() { - car.move(delta) -} \ No newline at end of file diff --git a/car_srv/src/package.json b/car_srv/src/package.json deleted file mode 100644 index f0ed83361da..00000000000 --- a/car_srv/src/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "stflashserver", - "version": "1.0.0", - "description": "", - "main": "main.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start": "node main.js" - }, - "author": "maxim", - "license": "ISC", - "devDependencies": { - "udev": "^0.3.0", - "commander": "^2.9.0", - "protobufjs": "^5.0.1" - } -} diff --git a/car_srv/src/proto/carkot.proto b/car_srv/src/proto/carkot.proto deleted file mode 100644 index 410af522d1c..00000000000 --- a/car_srv/src/proto/carkot.proto +++ /dev/null @@ -1,39 +0,0 @@ -syntax = "proto3"; -package carkot; - -option java_package = "proto"; -option java_outer_classname = "Carkot"; - -message Upload { - message Method { - enum TYPE { - DFU = 0; - STLINK = 1; - } - // Type of upload method. - TYPE type = 1; - // Upload port. - string port = 2; - // Device address, smth like 8087:0ABA. - string device = 3; - // Additional programmator-specific arguments. - repeated string arguments = 4; - } - // Firmware data. - bytes data = 1; - // Firmware load address (string, to avoid 64-bit woes). - string base = 2; - // Method of firmware upload. - Method method = 3; -} - -message UploadResult { - string stdOut = 1; - string stdErr = 2; - int32 resultCode = 3; -} - -message LogMessage { - string source = 1; - bytes message = 2; -} diff --git a/car_srv/src/proto/connect.proto b/car_srv/src/proto/connect.proto deleted file mode 100644 index 49df5b9aaa9..00000000000 --- a/car_srv/src/proto/connect.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; -package carkot; - -option java_package = "proto.car"; -option java_outer_classname = "Connect"; - -message ConnectionRequest { - string ip = 1; - int32 port = 2; -} - -message ConnectionResponse { - int32 uid = 1; - int32 code = 2; - string errorMsg = 3; - -} diff --git a/car_srv/src/proto/direction.proto b/car_srv/src/proto/direction.proto deleted file mode 100644 index ca614a16ea6..00000000000 --- a/car_srv/src/proto/direction.proto +++ /dev/null @@ -1,21 +0,0 @@ -syntax = "proto3"; -package carkot; - -option java_package = "proto.car"; -option java_outer_classname = "Direction"; - -message DirectionRequest { - enum Command { - stop = 0; - forward = 1; - backward = 2; - left = 3; - right = 4; - } - Command command = 1; -} - -message DirectionResponse { - int32 code = 1; - string errorMsg = 2; -} diff --git a/car_srv/src/proto/location.proto b/car_srv/src/proto/location.proto deleted file mode 100644 index 0d477c8217e..00000000000 --- a/car_srv/src/proto/location.proto +++ /dev/null @@ -1,18 +0,0 @@ -syntax = "proto3"; -package carkot; - -option java_package = "proto.car"; -option java_outer_classname = "Location"; - -message LocationResponse { - - LocationData locationResponseData = 1; - int32 code = 2; - string errorMsg = 3; - - message LocationData { - double x = 1; - double y = 2; - double angle = 3; - } -} diff --git a/car_srv/src/proto/route.proto b/car_srv/src/proto/route.proto deleted file mode 100644 index 864845be2f0..00000000000 --- a/car_srv/src/proto/route.proto +++ /dev/null @@ -1,19 +0,0 @@ -syntax = "proto3"; -package carkot; - -option java_package = "proto.car"; -option java_outer_classname = "Route"; - -message RouteRequest { - repeated WayPoint way_points = 1; - - message WayPoint { - double distance = 2; - double angle_delta = 3; - } -} - -message RouteResponse { - int32 code = 1; - string errorMsg = 2; -} diff --git a/car_srv/src/proto/route_done.proto b/car_srv/src/proto/route_done.proto deleted file mode 100644 index 5fe75d274f2..00000000000 --- a/car_srv/src/proto/route_done.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; -package carkot; - -option java_package = "proto.car"; -option java_outer_classname = "RouteDone"; - -message RouteDoneResponse { - int32 code = 1; - string errorMsg = 2; -} diff --git a/car_srv/src/router.js b/car_srv/src/router.js deleted file mode 100644 index ae1c30e82bd..00000000000 --- a/car_srv/src/router.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Created by user on 7/11/16. - */ -function route(handle, pathname, httpContent, response) { - if (typeof handle[pathname] === 'function') { - handle[pathname](httpContent, response); - } else { - console.log("No request handler found for " + pathname); - response.writeHead(404, {"Content-Type": "text/plain"}); - response.write("404 Not found"); - response.end(); - } -} -exports.route = route; \ No newline at end of file diff --git a/car_srv/src/server.js b/car_srv/src/server.js deleted file mode 100644 index 3444865f4b4..00000000000 --- a/car_srv/src/server.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Created by user on 7/11/16. - */ -var http = require("http"); -var url = require("url"); - -function start(route, handlers) { - function onRequest(request, response) { - var pathname = url.parse(request.url).pathname; - var httpContent = []; - request.on("data", function (datas) { - for (var i = 0; i < datas.length; i++) { - // httpContent.push(strDatas.charCodeAt(i)); - httpContent.push(datas[i]); - } - }); - - request.on("end", function () { - console.log(pathname); - console.log(httpContent); - route(handlers, pathname, httpContent, response); - }); - } - - http.createServer(onRequest).listen(8888); - console.log("Server has started."); -} -exports.start = start; \ No newline at end of file diff --git a/translator/.idea/compiler.xml b/experiments/translator/.idea/compiler.xml similarity index 100% rename from translator/.idea/compiler.xml rename to experiments/translator/.idea/compiler.xml diff --git a/car_srv/clients/flash/.idea/copyright/profiles_settings.xml b/experiments/translator/.idea/copyright/profiles_settings.xml similarity index 100% rename from car_srv/clients/flash/.idea/copyright/profiles_settings.xml rename to experiments/translator/.idea/copyright/profiles_settings.xml diff --git a/translator/.idea/gradle.xml b/experiments/translator/.idea/gradle.xml similarity index 100% rename from translator/.idea/gradle.xml rename to experiments/translator/.idea/gradle.xml diff --git a/translator/.idea/libraries/Gradle__com_github_jshmrsn_karg_a636b3e.xml b/experiments/translator/.idea/libraries/Gradle__com_github_jshmrsn_karg_a636b3e.xml similarity index 100% rename from translator/.idea/libraries/Gradle__com_github_jshmrsn_karg_a636b3e.xml rename to experiments/translator/.idea/libraries/Gradle__com_github_jshmrsn_karg_a636b3e.xml diff --git a/translator/.idea/libraries/Gradle__junit_junit_4_12.xml b/experiments/translator/.idea/libraries/Gradle__junit_junit_4_12.xml similarity index 100% rename from translator/.idea/libraries/Gradle__junit_junit_4_12.xml rename to experiments/translator/.idea/libraries/Gradle__junit_junit_4_12.xml diff --git a/translator/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/experiments/translator/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml similarity index 100% rename from translator/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml rename to experiments/translator/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml diff --git a/translator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_compiler_1_0_3.xml b/experiments/translator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_compiler_1_0_3.xml similarity index 100% rename from translator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_compiler_1_0_3.xml rename to experiments/translator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_compiler_1_0_3.xml diff --git a/translator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_1.xml b/experiments/translator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_1.xml similarity index 100% rename from translator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_1.xml rename to experiments/translator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_1.xml diff --git a/translator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_1.xml b/experiments/translator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_1.xml similarity index 100% rename from translator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_1.xml rename to experiments/translator/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_1.xml diff --git a/translator/.idea/misc.xml b/experiments/translator/.idea/misc.xml similarity index 100% rename from translator/.idea/misc.xml rename to experiments/translator/.idea/misc.xml diff --git a/translator/.idea/modules.xml b/experiments/translator/.idea/modules.xml similarity index 100% rename from translator/.idea/modules.xml rename to experiments/translator/.idea/modules.xml diff --git a/translator/.idea/modules/ast-kotlin.iml b/experiments/translator/.idea/modules/ast-kotlin.iml similarity index 100% rename from translator/.idea/modules/ast-kotlin.iml rename to experiments/translator/.idea/modules/ast-kotlin.iml diff --git a/translator/.idea/modules/ast-kotlin_main.iml b/experiments/translator/.idea/modules/ast-kotlin_main.iml similarity index 100% rename from translator/.idea/modules/ast-kotlin_main.iml rename to experiments/translator/.idea/modules/ast-kotlin_main.iml diff --git a/translator/.idea/modules/ast-kotlin_test.iml b/experiments/translator/.idea/modules/ast-kotlin_test.iml similarity index 100% rename from translator/.idea/modules/ast-kotlin_test.iml rename to experiments/translator/.idea/modules/ast-kotlin_test.iml diff --git a/translator/.idea/modules/translator.iml b/experiments/translator/.idea/modules/translator.iml similarity index 100% rename from translator/.idea/modules/translator.iml rename to experiments/translator/.idea/modules/translator.iml diff --git a/translator/.idea/modules/translator_main.iml b/experiments/translator/.idea/modules/translator_main.iml similarity index 100% rename from translator/.idea/modules/translator_main.iml rename to experiments/translator/.idea/modules/translator_main.iml diff --git a/translator/.idea/modules/translator_test.iml b/experiments/translator/.idea/modules/translator_test.iml similarity index 100% rename from translator/.idea/modules/translator_test.iml rename to experiments/translator/.idea/modules/translator_test.iml diff --git a/translator/.idea/uiDesigner.xml b/experiments/translator/.idea/uiDesigner.xml similarity index 100% rename from translator/.idea/uiDesigner.xml rename to experiments/translator/.idea/uiDesigner.xml diff --git a/translator/.idea/vcs.xml b/experiments/translator/.idea/vcs.xml similarity index 100% rename from translator/.idea/vcs.xml rename to experiments/translator/.idea/vcs.xml diff --git a/LICENSE b/experiments/translator/LICENSE similarity index 100% rename from LICENSE rename to experiments/translator/LICENSE diff --git a/translator/Makefile b/experiments/translator/Makefile similarity index 100% rename from translator/Makefile rename to experiments/translator/Makefile diff --git a/translator/README.md b/experiments/translator/README.md similarity index 100% rename from translator/README.md rename to experiments/translator/README.md diff --git a/translator/build.gradle b/experiments/translator/build.gradle similarity index 100% rename from translator/build.gradle rename to experiments/translator/build.gradle diff --git a/car_srv/clients/flash/gradle/wrapper/gradle-wrapper.jar b/experiments/translator/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from car_srv/clients/flash/gradle/wrapper/gradle-wrapper.jar rename to experiments/translator/gradle/wrapper/gradle-wrapper.jar diff --git a/translator/gradle/wrapper/gradle-wrapper.properties b/experiments/translator/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from translator/gradle/wrapper/gradle-wrapper.properties rename to experiments/translator/gradle/wrapper/gradle-wrapper.properties diff --git a/translator/gradlew b/experiments/translator/gradlew similarity index 100% rename from translator/gradlew rename to experiments/translator/gradlew diff --git a/car_srv/clients/flash/gradlew.bat b/experiments/translator/gradlew.bat similarity index 100% rename from car_srv/clients/flash/gradlew.bat rename to experiments/translator/gradlew.bat diff --git a/translator/run_one_test.sh b/experiments/translator/run_one_test.sh similarity index 100% rename from translator/run_one_test.sh rename to experiments/translator/run_one_test.sh diff --git a/translator/run_tests.sh b/experiments/translator/run_tests.sh similarity index 100% rename from translator/run_tests.sh rename to experiments/translator/run_tests.sh diff --git a/translator/settings.gradle b/experiments/translator/settings.gradle similarity index 100% rename from translator/settings.gradle rename to experiments/translator/settings.gradle diff --git a/translator/src/main/kotlin/DefaultArguments.kt b/experiments/translator/src/main/kotlin/DefaultArguments.kt similarity index 100% rename from translator/src/main/kotlin/DefaultArguments.kt rename to experiments/translator/src/main/kotlin/DefaultArguments.kt diff --git a/translator/src/main/kotlin/main.kt b/experiments/translator/src/main/kotlin/main.kt similarity index 100% rename from translator/src/main/kotlin/main.kt rename to experiments/translator/src/main/kotlin/main.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/ProjectTranslator.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/ProjectTranslator.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/ProjectTranslator.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/ProjectTranslator.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/codegens/BlockCodegen.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/codegens/BlockCodegen.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/codegens/BlockCodegen.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/codegens/BlockCodegen.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/codegens/ClassCodegen.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/codegens/ClassCodegen.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/codegens/ClassCodegen.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/codegens/ClassCodegen.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/codegens/FunctionCodegen.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/codegens/FunctionCodegen.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/codegens/FunctionCodegen.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/codegens/FunctionCodegen.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/codegens/ObjectCodegen.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/codegens/ObjectCodegen.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/codegens/ObjectCodegen.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/codegens/ObjectCodegen.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/codegens/PropertyCodegen.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/codegens/PropertyCodegen.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/codegens/PropertyCodegen.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/codegens/PropertyCodegen.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/codegens/StructCodegen.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/codegens/StructCodegen.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/codegens/StructCodegen.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/codegens/StructCodegen.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/debug/debug.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/debug/debug.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/debug/debug.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/debug/debug.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/exceptions/TranslationException.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/exceptions/TranslationException.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/exceptions/TranslationException.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/exceptions/TranslationException.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/exceptions/UnimplementedException.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/exceptions/UnimplementedException.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/exceptions/UnimplementedException.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/exceptions/UnimplementedException.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMCall.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMCall.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMCall.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMCall.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMClassVariable.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMClassVariable.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMClassVariable.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMClassVariable.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMConstant.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMConstant.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMConstant.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMConstant.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMLabel.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMLabel.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMLabel.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMLabel.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMNode.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMNode.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMNode.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMNode.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMScope.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMScope.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMScope.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMScope.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMSingleValue.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMSingleValue.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMSingleValue.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMSingleValue.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMArray.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMArray.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMArray.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMArray.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMBooleanType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMBooleanType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMBooleanType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMBooleanType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFloatType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFloatType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFloatType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFloatType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFunctionType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFunctionType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFunctionType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFunctionType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMNullType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMNullType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMNullType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMNullType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMStringType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMStringType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMStringType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMStringType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMVoidType.kt b/experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMVoidType.kt similarity index 100% rename from translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMVoidType.kt rename to experiments/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMVoidType.kt diff --git a/translator/src/test/kotlin/tests/array_extensions_1/array_extensions_1.kt b/experiments/translator/src/test/kotlin/tests/array_extensions_1/array_extensions_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/array_extensions_1/array_extensions_1.kt rename to experiments/translator/src/test/kotlin/tests/array_extensions_1/array_extensions_1.kt diff --git a/translator/src/test/kotlin/tests/array_extensions_1/array_extensions_1.txt b/experiments/translator/src/test/kotlin/tests/array_extensions_1/array_extensions_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/array_extensions_1/array_extensions_1.txt rename to experiments/translator/src/test/kotlin/tests/array_extensions_1/array_extensions_1.txt diff --git a/translator/src/test/kotlin/tests/array_extensions_2/array_extensions_2.kt b/experiments/translator/src/test/kotlin/tests/array_extensions_2/array_extensions_2.kt similarity index 100% rename from translator/src/test/kotlin/tests/array_extensions_2/array_extensions_2.kt rename to experiments/translator/src/test/kotlin/tests/array_extensions_2/array_extensions_2.kt diff --git a/translator/src/test/kotlin/tests/array_extensions_2/array_extensions_2.txt b/experiments/translator/src/test/kotlin/tests/array_extensions_2/array_extensions_2.txt similarity index 100% rename from translator/src/test/kotlin/tests/array_extensions_2/array_extensions_2.txt rename to experiments/translator/src/test/kotlin/tests/array_extensions_2/array_extensions_2.txt diff --git a/translator/src/test/kotlin/tests/assignment_operators_1/assignment_operators_1.kt b/experiments/translator/src/test/kotlin/tests/assignment_operators_1/assignment_operators_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/assignment_operators_1/assignment_operators_1.kt rename to experiments/translator/src/test/kotlin/tests/assignment_operators_1/assignment_operators_1.kt diff --git a/translator/src/test/kotlin/tests/assignment_operators_1/assignment_operators_1.txt b/experiments/translator/src/test/kotlin/tests/assignment_operators_1/assignment_operators_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/assignment_operators_1/assignment_operators_1.txt rename to experiments/translator/src/test/kotlin/tests/assignment_operators_1/assignment_operators_1.txt diff --git a/translator/src/test/kotlin/tests/booleanarray_1/booleanarray_1.kt b/experiments/translator/src/test/kotlin/tests/booleanarray_1/booleanarray_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/booleanarray_1/booleanarray_1.kt rename to experiments/translator/src/test/kotlin/tests/booleanarray_1/booleanarray_1.kt diff --git a/translator/src/test/kotlin/tests/booleanarray_1/booleanarray_1.txt b/experiments/translator/src/test/kotlin/tests/booleanarray_1/booleanarray_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/booleanarray_1/booleanarray_1.txt rename to experiments/translator/src/test/kotlin/tests/booleanarray_1/booleanarray_1.txt diff --git a/translator/src/test/kotlin/tests/bytearray_1/bytearray_1.kt b/experiments/translator/src/test/kotlin/tests/bytearray_1/bytearray_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/bytearray_1/bytearray_1.kt rename to experiments/translator/src/test/kotlin/tests/bytearray_1/bytearray_1.kt diff --git a/translator/src/test/kotlin/tests/bytearray_1/bytearray_1.txt b/experiments/translator/src/test/kotlin/tests/bytearray_1/bytearray_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/bytearray_1/bytearray_1.txt rename to experiments/translator/src/test/kotlin/tests/bytearray_1/bytearray_1.txt diff --git a/translator/src/test/kotlin/tests/callbacks_1/callbacks_1.c b/experiments/translator/src/test/kotlin/tests/callbacks_1/callbacks_1.c similarity index 100% rename from translator/src/test/kotlin/tests/callbacks_1/callbacks_1.c rename to experiments/translator/src/test/kotlin/tests/callbacks_1/callbacks_1.c diff --git a/translator/src/test/kotlin/tests/callbacks_1/callbacks_1.kt b/experiments/translator/src/test/kotlin/tests/callbacks_1/callbacks_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/callbacks_1/callbacks_1.kt rename to experiments/translator/src/test/kotlin/tests/callbacks_1/callbacks_1.kt diff --git a/translator/src/test/kotlin/tests/callbacks_1/callbacks_1.txt b/experiments/translator/src/test/kotlin/tests/callbacks_1/callbacks_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/callbacks_1/callbacks_1.txt rename to experiments/translator/src/test/kotlin/tests/callbacks_1/callbacks_1.txt diff --git a/translator/src/test/kotlin/tests/class_alignment_1/class_alignment_1.kt b/experiments/translator/src/test/kotlin/tests/class_alignment_1/class_alignment_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/class_alignment_1/class_alignment_1.kt rename to experiments/translator/src/test/kotlin/tests/class_alignment_1/class_alignment_1.kt diff --git a/translator/src/test/kotlin/tests/class_alignment_1/class_alignment_1.txt b/experiments/translator/src/test/kotlin/tests/class_alignment_1/class_alignment_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/class_alignment_1/class_alignment_1.txt rename to experiments/translator/src/test/kotlin/tests/class_alignment_1/class_alignment_1.txt diff --git a/translator/src/test/kotlin/tests/class_class_argument_1/class_class_argument_1.kt b/experiments/translator/src/test/kotlin/tests/class_class_argument_1/class_class_argument_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/class_class_argument_1/class_class_argument_1.kt rename to experiments/translator/src/test/kotlin/tests/class_class_argument_1/class_class_argument_1.kt diff --git a/translator/src/test/kotlin/tests/class_class_argument_1/class_class_argument_1.txt b/experiments/translator/src/test/kotlin/tests/class_class_argument_1/class_class_argument_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/class_class_argument_1/class_class_argument_1.txt rename to experiments/translator/src/test/kotlin/tests/class_class_argument_1/class_class_argument_1.txt diff --git a/translator/src/test/kotlin/tests/class_default_argument_1/class_default_argument_1.kt b/experiments/translator/src/test/kotlin/tests/class_default_argument_1/class_default_argument_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/class_default_argument_1/class_default_argument_1.kt rename to experiments/translator/src/test/kotlin/tests/class_default_argument_1/class_default_argument_1.kt diff --git a/translator/src/test/kotlin/tests/class_default_argument_1/class_default_argument_1.txt b/experiments/translator/src/test/kotlin/tests/class_default_argument_1/class_default_argument_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/class_default_argument_1/class_default_argument_1.txt rename to experiments/translator/src/test/kotlin/tests/class_default_argument_1/class_default_argument_1.txt diff --git a/translator/src/test/kotlin/tests/class_init_section_1/class_init_section_1.kt b/experiments/translator/src/test/kotlin/tests/class_init_section_1/class_init_section_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/class_init_section_1/class_init_section_1.kt rename to experiments/translator/src/test/kotlin/tests/class_init_section_1/class_init_section_1.kt diff --git a/translator/src/test/kotlin/tests/class_init_section_1/class_init_section_1.txt b/experiments/translator/src/test/kotlin/tests/class_init_section_1/class_init_section_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/class_init_section_1/class_init_section_1.txt rename to experiments/translator/src/test/kotlin/tests/class_init_section_1/class_init_section_1.txt diff --git a/translator/src/test/kotlin/tests/class_method_access_1/class_method_access_1.kt b/experiments/translator/src/test/kotlin/tests/class_method_access_1/class_method_access_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/class_method_access_1/class_method_access_1.kt rename to experiments/translator/src/test/kotlin/tests/class_method_access_1/class_method_access_1.kt diff --git a/translator/src/test/kotlin/tests/class_method_access_1/class_method_access_1.txt b/experiments/translator/src/test/kotlin/tests/class_method_access_1/class_method_access_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/class_method_access_1/class_method_access_1.txt rename to experiments/translator/src/test/kotlin/tests/class_method_access_1/class_method_access_1.txt diff --git a/translator/src/test/kotlin/tests/class_methods_1/class_methods_1.kt b/experiments/translator/src/test/kotlin/tests/class_methods_1/class_methods_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/class_methods_1/class_methods_1.kt rename to experiments/translator/src/test/kotlin/tests/class_methods_1/class_methods_1.kt diff --git a/translator/src/test/kotlin/tests/class_methods_1/class_methods_1.txt b/experiments/translator/src/test/kotlin/tests/class_methods_1/class_methods_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/class_methods_1/class_methods_1.txt rename to experiments/translator/src/test/kotlin/tests/class_methods_1/class_methods_1.txt diff --git a/translator/src/test/kotlin/tests/class_reassignment_1/class_reassignment_1.kt b/experiments/translator/src/test/kotlin/tests/class_reassignment_1/class_reassignment_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/class_reassignment_1/class_reassignment_1.kt rename to experiments/translator/src/test/kotlin/tests/class_reassignment_1/class_reassignment_1.kt diff --git a/translator/src/test/kotlin/tests/class_reassignment_1/class_reassignment_1.txt b/experiments/translator/src/test/kotlin/tests/class_reassignment_1/class_reassignment_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/class_reassignment_1/class_reassignment_1.txt rename to experiments/translator/src/test/kotlin/tests/class_reassignment_1/class_reassignment_1.txt diff --git a/translator/src/test/kotlin/tests/class_reassignment_2/class_reassignment_2.kt b/experiments/translator/src/test/kotlin/tests/class_reassignment_2/class_reassignment_2.kt similarity index 100% rename from translator/src/test/kotlin/tests/class_reassignment_2/class_reassignment_2.kt rename to experiments/translator/src/test/kotlin/tests/class_reassignment_2/class_reassignment_2.kt diff --git a/translator/src/test/kotlin/tests/class_reassignment_2/class_reassignment_2.txt b/experiments/translator/src/test/kotlin/tests/class_reassignment_2/class_reassignment_2.txt similarity index 100% rename from translator/src/test/kotlin/tests/class_reassignment_2/class_reassignment_2.txt rename to experiments/translator/src/test/kotlin/tests/class_reassignment_2/class_reassignment_2.txt diff --git a/translator/src/test/kotlin/tests/class_variable_access_1/class_variable_access_1.kt b/experiments/translator/src/test/kotlin/tests/class_variable_access_1/class_variable_access_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/class_variable_access_1/class_variable_access_1.kt rename to experiments/translator/src/test/kotlin/tests/class_variable_access_1/class_variable_access_1.kt diff --git a/translator/src/test/kotlin/tests/class_variable_access_1/class_variable_access_1.txt b/experiments/translator/src/test/kotlin/tests/class_variable_access_1/class_variable_access_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/class_variable_access_1/class_variable_access_1.txt rename to experiments/translator/src/test/kotlin/tests/class_variable_access_1/class_variable_access_1.txt diff --git a/translator/src/test/kotlin/tests/classfields_1/classfields_1.kt b/experiments/translator/src/test/kotlin/tests/classfields_1/classfields_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/classfields_1/classfields_1.kt rename to experiments/translator/src/test/kotlin/tests/classfields_1/classfields_1.kt diff --git a/translator/src/test/kotlin/tests/classfields_1/classfields_1.txt b/experiments/translator/src/test/kotlin/tests/classfields_1/classfields_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/classfields_1/classfields_1.txt rename to experiments/translator/src/test/kotlin/tests/classfields_1/classfields_1.txt diff --git a/translator/src/test/kotlin/tests/classfields_2/classfields_2.kt b/experiments/translator/src/test/kotlin/tests/classfields_2/classfields_2.kt similarity index 100% rename from translator/src/test/kotlin/tests/classfields_2/classfields_2.kt rename to experiments/translator/src/test/kotlin/tests/classfields_2/classfields_2.kt diff --git a/translator/src/test/kotlin/tests/classfields_2/classfields_2.txt b/experiments/translator/src/test/kotlin/tests/classfields_2/classfields_2.txt similarity index 100% rename from translator/src/test/kotlin/tests/classfields_2/classfields_2.txt rename to experiments/translator/src/test/kotlin/tests/classfields_2/classfields_2.txt diff --git a/translator/src/test/kotlin/tests/companion_object_1/companion_object_1.kt b/experiments/translator/src/test/kotlin/tests/companion_object_1/companion_object_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/companion_object_1/companion_object_1.kt rename to experiments/translator/src/test/kotlin/tests/companion_object_1/companion_object_1.kt diff --git a/translator/src/test/kotlin/tests/companion_object_1/companion_object_1.txt b/experiments/translator/src/test/kotlin/tests/companion_object_1/companion_object_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/companion_object_1/companion_object_1.txt rename to experiments/translator/src/test/kotlin/tests/companion_object_1/companion_object_1.txt diff --git a/translator/src/test/kotlin/tests/companion_object_2/companion_object_2.kt b/experiments/translator/src/test/kotlin/tests/companion_object_2/companion_object_2.kt similarity index 100% rename from translator/src/test/kotlin/tests/companion_object_2/companion_object_2.kt rename to experiments/translator/src/test/kotlin/tests/companion_object_2/companion_object_2.kt diff --git a/translator/src/test/kotlin/tests/companion_object_2/companion_object_2.txt b/experiments/translator/src/test/kotlin/tests/companion_object_2/companion_object_2.txt similarity index 100% rename from translator/src/test/kotlin/tests/companion_object_2/companion_object_2.txt rename to experiments/translator/src/test/kotlin/tests/companion_object_2/companion_object_2.txt diff --git a/translator/src/test/kotlin/tests/complex_dot_expr/complex_dot_expr.kt b/experiments/translator/src/test/kotlin/tests/complex_dot_expr/complex_dot_expr.kt similarity index 100% rename from translator/src/test/kotlin/tests/complex_dot_expr/complex_dot_expr.kt rename to experiments/translator/src/test/kotlin/tests/complex_dot_expr/complex_dot_expr.kt diff --git a/translator/src/test/kotlin/tests/complex_dot_expr/complex_dot_expr.txt b/experiments/translator/src/test/kotlin/tests/complex_dot_expr/complex_dot_expr.txt similarity index 100% rename from translator/src/test/kotlin/tests/complex_dot_expr/complex_dot_expr.txt rename to experiments/translator/src/test/kotlin/tests/complex_dot_expr/complex_dot_expr.txt diff --git a/translator/src/test/kotlin/tests/declaration_test_1/declaration_test_1.kt b/experiments/translator/src/test/kotlin/tests/declaration_test_1/declaration_test_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/declaration_test_1/declaration_test_1.kt rename to experiments/translator/src/test/kotlin/tests/declaration_test_1/declaration_test_1.kt diff --git a/translator/src/test/kotlin/tests/declaration_test_1/declaration_test_1.txt b/experiments/translator/src/test/kotlin/tests/declaration_test_1/declaration_test_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/declaration_test_1/declaration_test_1.txt rename to experiments/translator/src/test/kotlin/tests/declaration_test_1/declaration_test_1.txt diff --git a/translator/src/test/kotlin/tests/dfs_1/dfs_1.kt b/experiments/translator/src/test/kotlin/tests/dfs_1/dfs_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/dfs_1/dfs_1.kt rename to experiments/translator/src/test/kotlin/tests/dfs_1/dfs_1.kt diff --git a/translator/src/test/kotlin/tests/dfs_1/dfs_1.txt b/experiments/translator/src/test/kotlin/tests/dfs_1/dfs_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/dfs_1/dfs_1.txt rename to experiments/translator/src/test/kotlin/tests/dfs_1/dfs_1.txt diff --git a/translator/src/test/kotlin/tests/different_type_binary_operator_1/different_type_binary_operator_1.kt b/experiments/translator/src/test/kotlin/tests/different_type_binary_operator_1/different_type_binary_operator_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/different_type_binary_operator_1/different_type_binary_operator_1.kt rename to experiments/translator/src/test/kotlin/tests/different_type_binary_operator_1/different_type_binary_operator_1.kt diff --git a/translator/src/test/kotlin/tests/different_type_binary_operator_1/different_type_binary_operator_1.txt b/experiments/translator/src/test/kotlin/tests/different_type_binary_operator_1/different_type_binary_operator_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/different_type_binary_operator_1/different_type_binary_operator_1.txt rename to experiments/translator/src/test/kotlin/tests/different_type_binary_operator_1/different_type_binary_operator_1.txt diff --git a/translator/src/test/kotlin/tests/do_while_1/do_while_1.kt b/experiments/translator/src/test/kotlin/tests/do_while_1/do_while_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/do_while_1/do_while_1.kt rename to experiments/translator/src/test/kotlin/tests/do_while_1/do_while_1.kt diff --git a/translator/src/test/kotlin/tests/do_while_1/do_while_1.txt b/experiments/translator/src/test/kotlin/tests/do_while_1/do_while_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/do_while_1/do_while_1.txt rename to experiments/translator/src/test/kotlin/tests/do_while_1/do_while_1.txt diff --git a/translator/src/test/kotlin/tests/elvis_1/elvis_1.kt b/experiments/translator/src/test/kotlin/tests/elvis_1/elvis_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/elvis_1/elvis_1.kt rename to experiments/translator/src/test/kotlin/tests/elvis_1/elvis_1.kt diff --git a/translator/src/test/kotlin/tests/elvis_1/elvis_1.txt b/experiments/translator/src/test/kotlin/tests/elvis_1/elvis_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/elvis_1/elvis_1.txt rename to experiments/translator/src/test/kotlin/tests/elvis_1/elvis_1.txt diff --git a/translator/src/test/kotlin/tests/enum_complex/enum_complex.kt b/experiments/translator/src/test/kotlin/tests/enum_complex/enum_complex.kt similarity index 100% rename from translator/src/test/kotlin/tests/enum_complex/enum_complex.kt rename to experiments/translator/src/test/kotlin/tests/enum_complex/enum_complex.kt diff --git a/translator/src/test/kotlin/tests/enum_complex/enum_complex.txt b/experiments/translator/src/test/kotlin/tests/enum_complex/enum_complex.txt similarity index 100% rename from translator/src/test/kotlin/tests/enum_complex/enum_complex.txt rename to experiments/translator/src/test/kotlin/tests/enum_complex/enum_complex.txt diff --git a/translator/src/test/kotlin/tests/enum_inner_fields/enum_inner_fields.kt b/experiments/translator/src/test/kotlin/tests/enum_inner_fields/enum_inner_fields.kt similarity index 100% rename from translator/src/test/kotlin/tests/enum_inner_fields/enum_inner_fields.kt rename to experiments/translator/src/test/kotlin/tests/enum_inner_fields/enum_inner_fields.kt diff --git a/translator/src/test/kotlin/tests/enum_inner_fields/enum_inner_fields.txt b/experiments/translator/src/test/kotlin/tests/enum_inner_fields/enum_inner_fields.txt similarity index 100% rename from translator/src/test/kotlin/tests/enum_inner_fields/enum_inner_fields.txt rename to experiments/translator/src/test/kotlin/tests/enum_inner_fields/enum_inner_fields.txt diff --git a/translator/src/test/kotlin/tests/floating_point_operators_1/floating_point_operators_1.kt b/experiments/translator/src/test/kotlin/tests/floating_point_operators_1/floating_point_operators_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/floating_point_operators_1/floating_point_operators_1.kt rename to experiments/translator/src/test/kotlin/tests/floating_point_operators_1/floating_point_operators_1.kt diff --git a/translator/src/test/kotlin/tests/floating_point_operators_1/floating_point_operators_1.txt b/experiments/translator/src/test/kotlin/tests/floating_point_operators_1/floating_point_operators_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/floating_point_operators_1/floating_point_operators_1.txt rename to experiments/translator/src/test/kotlin/tests/floating_point_operators_1/floating_point_operators_1.txt diff --git a/translator/src/test/kotlin/tests/for_1/for_1.kt b/experiments/translator/src/test/kotlin/tests/for_1/for_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/for_1/for_1.kt rename to experiments/translator/src/test/kotlin/tests/for_1/for_1.kt diff --git a/translator/src/test/kotlin/tests/for_1/for_1.txt b/experiments/translator/src/test/kotlin/tests/for_1/for_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/for_1/for_1.txt rename to experiments/translator/src/test/kotlin/tests/for_1/for_1.txt diff --git a/translator/src/test/kotlin/tests/function_default_arguments_1/function_default_arguments_1.kt b/experiments/translator/src/test/kotlin/tests/function_default_arguments_1/function_default_arguments_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/function_default_arguments_1/function_default_arguments_1.kt rename to experiments/translator/src/test/kotlin/tests/function_default_arguments_1/function_default_arguments_1.kt diff --git a/translator/src/test/kotlin/tests/function_default_arguments_1/function_default_arguments_1.txt b/experiments/translator/src/test/kotlin/tests/function_default_arguments_1/function_default_arguments_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/function_default_arguments_1/function_default_arguments_1.txt rename to experiments/translator/src/test/kotlin/tests/function_default_arguments_1/function_default_arguments_1.txt diff --git a/translator/src/test/kotlin/tests/function_eq/function_eq.kt b/experiments/translator/src/test/kotlin/tests/function_eq/function_eq.kt similarity index 100% rename from translator/src/test/kotlin/tests/function_eq/function_eq.kt rename to experiments/translator/src/test/kotlin/tests/function_eq/function_eq.kt diff --git a/translator/src/test/kotlin/tests/function_eq/function_eq.txt b/experiments/translator/src/test/kotlin/tests/function_eq/function_eq.txt similarity index 100% rename from translator/src/test/kotlin/tests/function_eq/function_eq.txt rename to experiments/translator/src/test/kotlin/tests/function_eq/function_eq.txt diff --git a/translator/src/test/kotlin/tests/function_extensions_1/function_extensions_1.kt b/experiments/translator/src/test/kotlin/tests/function_extensions_1/function_extensions_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/function_extensions_1/function_extensions_1.kt rename to experiments/translator/src/test/kotlin/tests/function_extensions_1/function_extensions_1.kt diff --git a/translator/src/test/kotlin/tests/function_extensions_1/function_extensions_1.txt b/experiments/translator/src/test/kotlin/tests/function_extensions_1/function_extensions_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/function_extensions_1/function_extensions_1.txt rename to experiments/translator/src/test/kotlin/tests/function_extensions_1/function_extensions_1.txt diff --git a/translator/src/test/kotlin/tests/function_extensions_double_argument_1/function_extensions_double_argument_1.kt b/experiments/translator/src/test/kotlin/tests/function_extensions_double_argument_1/function_extensions_double_argument_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/function_extensions_double_argument_1/function_extensions_double_argument_1.kt rename to experiments/translator/src/test/kotlin/tests/function_extensions_double_argument_1/function_extensions_double_argument_1.kt diff --git a/translator/src/test/kotlin/tests/function_extensions_double_argument_1/function_extensions_double_argument_1.txt b/experiments/translator/src/test/kotlin/tests/function_extensions_double_argument_1/function_extensions_double_argument_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/function_extensions_double_argument_1/function_extensions_double_argument_1.txt rename to experiments/translator/src/test/kotlin/tests/function_extensions_double_argument_1/function_extensions_double_argument_1.txt diff --git a/translator/src/test/kotlin/tests/get_set_operators_1/get_set_operators_1.kt b/experiments/translator/src/test/kotlin/tests/get_set_operators_1/get_set_operators_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/get_set_operators_1/get_set_operators_1.kt rename to experiments/translator/src/test/kotlin/tests/get_set_operators_1/get_set_operators_1.kt diff --git a/translator/src/test/kotlin/tests/get_set_operators_1/get_set_operators_1.txt b/experiments/translator/src/test/kotlin/tests/get_set_operators_1/get_set_operators_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/get_set_operators_1/get_set_operators_1.txt rename to experiments/translator/src/test/kotlin/tests/get_set_operators_1/get_set_operators_1.txt diff --git a/translator/src/test/kotlin/tests/global_vars_1/global_vars_1.kt b/experiments/translator/src/test/kotlin/tests/global_vars_1/global_vars_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/global_vars_1/global_vars_1.kt rename to experiments/translator/src/test/kotlin/tests/global_vars_1/global_vars_1.kt diff --git a/translator/src/test/kotlin/tests/global_vars_1/global_vars_1.txt b/experiments/translator/src/test/kotlin/tests/global_vars_1/global_vars_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/global_vars_1/global_vars_1.txt rename to experiments/translator/src/test/kotlin/tests/global_vars_1/global_vars_1.txt diff --git a/translator/src/test/kotlin/tests/if_1/if_1.kt b/experiments/translator/src/test/kotlin/tests/if_1/if_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/if_1/if_1.kt rename to experiments/translator/src/test/kotlin/tests/if_1/if_1.kt diff --git a/translator/src/test/kotlin/tests/if_1/if_1.txt b/experiments/translator/src/test/kotlin/tests/if_1/if_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/if_1/if_1.txt rename to experiments/translator/src/test/kotlin/tests/if_1/if_1.txt diff --git a/translator/src/test/kotlin/tests/if_2/if_2.kt b/experiments/translator/src/test/kotlin/tests/if_2/if_2.kt similarity index 100% rename from translator/src/test/kotlin/tests/if_2/if_2.kt rename to experiments/translator/src/test/kotlin/tests/if_2/if_2.kt diff --git a/translator/src/test/kotlin/tests/if_2/if_2.txt b/experiments/translator/src/test/kotlin/tests/if_2/if_2.txt similarity index 100% rename from translator/src/test/kotlin/tests/if_2/if_2.txt rename to experiments/translator/src/test/kotlin/tests/if_2/if_2.txt diff --git a/translator/src/test/kotlin/tests/if_boolean_argument_1/if_boolean_argument_1.kt b/experiments/translator/src/test/kotlin/tests/if_boolean_argument_1/if_boolean_argument_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/if_boolean_argument_1/if_boolean_argument_1.kt rename to experiments/translator/src/test/kotlin/tests/if_boolean_argument_1/if_boolean_argument_1.kt diff --git a/translator/src/test/kotlin/tests/if_boolean_argument_1/if_boolean_argument_1.txt b/experiments/translator/src/test/kotlin/tests/if_boolean_argument_1/if_boolean_argument_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/if_boolean_argument_1/if_boolean_argument_1.txt rename to experiments/translator/src/test/kotlin/tests/if_boolean_argument_1/if_boolean_argument_1.txt diff --git a/translator/src/test/kotlin/tests/if_expression_1/if_expression_1.kt b/experiments/translator/src/test/kotlin/tests/if_expression_1/if_expression_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/if_expression_1/if_expression_1.kt rename to experiments/translator/src/test/kotlin/tests/if_expression_1/if_expression_1.kt diff --git a/translator/src/test/kotlin/tests/if_expression_1/if_expression_1.txt b/experiments/translator/src/test/kotlin/tests/if_expression_1/if_expression_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/if_expression_1/if_expression_1.txt rename to experiments/translator/src/test/kotlin/tests/if_expression_1/if_expression_1.txt diff --git a/translator/src/test/kotlin/tests/initialization_in_place_and_this_1/initialization_in_place_and_this_1.kt b/experiments/translator/src/test/kotlin/tests/initialization_in_place_and_this_1/initialization_in_place_and_this_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/initialization_in_place_and_this_1/initialization_in_place_and_this_1.kt rename to experiments/translator/src/test/kotlin/tests/initialization_in_place_and_this_1/initialization_in_place_and_this_1.kt diff --git a/translator/src/test/kotlin/tests/initialization_in_place_and_this_1/initialization_in_place_and_this_1.txt b/experiments/translator/src/test/kotlin/tests/initialization_in_place_and_this_1/initialization_in_place_and_this_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/initialization_in_place_and_this_1/initialization_in_place_and_this_1.txt rename to experiments/translator/src/test/kotlin/tests/initialization_in_place_and_this_1/initialization_in_place_and_this_1.txt diff --git a/translator/src/test/kotlin/tests/initialized_class_fields_1/initialized_class_fields_1.kt b/experiments/translator/src/test/kotlin/tests/initialized_class_fields_1/initialized_class_fields_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/initialized_class_fields_1/initialized_class_fields_1.kt rename to experiments/translator/src/test/kotlin/tests/initialized_class_fields_1/initialized_class_fields_1.kt diff --git a/translator/src/test/kotlin/tests/initialized_class_fields_1/initialized_class_fields_1.txt b/experiments/translator/src/test/kotlin/tests/initialized_class_fields_1/initialized_class_fields_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/initialized_class_fields_1/initialized_class_fields_1.txt rename to experiments/translator/src/test/kotlin/tests/initialized_class_fields_1/initialized_class_fields_1.txt diff --git a/translator/src/test/kotlin/tests/intarray_1/intarray_1.kt b/experiments/translator/src/test/kotlin/tests/intarray_1/intarray_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/intarray_1/intarray_1.kt rename to experiments/translator/src/test/kotlin/tests/intarray_1/intarray_1.kt diff --git a/translator/src/test/kotlin/tests/intarray_1/intarray_1.txt b/experiments/translator/src/test/kotlin/tests/intarray_1/intarray_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/intarray_1/intarray_1.txt rename to experiments/translator/src/test/kotlin/tests/intarray_1/intarray_1.txt diff --git a/translator/src/test/kotlin/tests/long_operations_1/long_operations_1.kt b/experiments/translator/src/test/kotlin/tests/long_operations_1/long_operations_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/long_operations_1/long_operations_1.kt rename to experiments/translator/src/test/kotlin/tests/long_operations_1/long_operations_1.kt diff --git a/translator/src/test/kotlin/tests/long_operations_1/long_operations_1.txt b/experiments/translator/src/test/kotlin/tests/long_operations_1/long_operations_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/long_operations_1/long_operations_1.txt rename to experiments/translator/src/test/kotlin/tests/long_operations_1/long_operations_1.txt diff --git a/translator/src/test/kotlin/tests/nested_classes/nested_classes.kt b/experiments/translator/src/test/kotlin/tests/nested_classes/nested_classes.kt similarity index 100% rename from translator/src/test/kotlin/tests/nested_classes/nested_classes.kt rename to experiments/translator/src/test/kotlin/tests/nested_classes/nested_classes.kt diff --git a/translator/src/test/kotlin/tests/nested_classes/nested_classes.txt b/experiments/translator/src/test/kotlin/tests/nested_classes/nested_classes.txt similarity index 100% rename from translator/src/test/kotlin/tests/nested_classes/nested_classes.txt rename to experiments/translator/src/test/kotlin/tests/nested_classes/nested_classes.txt diff --git a/translator/src/test/kotlin/tests/null_comparison_1/null_comparison_1.kt b/experiments/translator/src/test/kotlin/tests/null_comparison_1/null_comparison_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/null_comparison_1/null_comparison_1.kt rename to experiments/translator/src/test/kotlin/tests/null_comparison_1/null_comparison_1.kt diff --git a/translator/src/test/kotlin/tests/null_comparison_1/null_comparison_1.txt b/experiments/translator/src/test/kotlin/tests/null_comparison_1/null_comparison_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/null_comparison_1/null_comparison_1.txt rename to experiments/translator/src/test/kotlin/tests/null_comparison_1/null_comparison_1.txt diff --git a/translator/src/test/kotlin/tests/nullable_1/nullable_1.kt b/experiments/translator/src/test/kotlin/tests/nullable_1/nullable_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/nullable_1/nullable_1.kt rename to experiments/translator/src/test/kotlin/tests/nullable_1/nullable_1.kt diff --git a/translator/src/test/kotlin/tests/nullable_1/nullable_1.txt b/experiments/translator/src/test/kotlin/tests/nullable_1/nullable_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/nullable_1/nullable_1.txt rename to experiments/translator/src/test/kotlin/tests/nullable_1/nullable_1.txt diff --git a/translator/src/test/kotlin/tests/nullable_class_fields_1/nullable_class_fields_1.kt b/experiments/translator/src/test/kotlin/tests/nullable_class_fields_1/nullable_class_fields_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/nullable_class_fields_1/nullable_class_fields_1.kt rename to experiments/translator/src/test/kotlin/tests/nullable_class_fields_1/nullable_class_fields_1.kt diff --git a/translator/src/test/kotlin/tests/nullable_class_fields_1/nullable_class_fields_1.txt b/experiments/translator/src/test/kotlin/tests/nullable_class_fields_1/nullable_class_fields_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/nullable_class_fields_1/nullable_class_fields_1.txt rename to experiments/translator/src/test/kotlin/tests/nullable_class_fields_1/nullable_class_fields_1.txt diff --git a/translator/src/test/kotlin/tests/nullable_primitive_types_1/nullable_primitive_types_1.kt b/experiments/translator/src/test/kotlin/tests/nullable_primitive_types_1/nullable_primitive_types_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/nullable_primitive_types_1/nullable_primitive_types_1.kt rename to experiments/translator/src/test/kotlin/tests/nullable_primitive_types_1/nullable_primitive_types_1.kt diff --git a/translator/src/test/kotlin/tests/nullable_primitive_types_1/nullable_primitive_types_1.txt b/experiments/translator/src/test/kotlin/tests/nullable_primitive_types_1/nullable_primitive_types_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/nullable_primitive_types_1/nullable_primitive_types_1.txt rename to experiments/translator/src/test/kotlin/tests/nullable_primitive_types_1/nullable_primitive_types_1.txt diff --git a/translator/src/test/kotlin/tests/numeric_literals_1/numeric_literals_1.kt b/experiments/translator/src/test/kotlin/tests/numeric_literals_1/numeric_literals_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/numeric_literals_1/numeric_literals_1.kt rename to experiments/translator/src/test/kotlin/tests/numeric_literals_1/numeric_literals_1.kt diff --git a/translator/src/test/kotlin/tests/numeric_literals_1/numeric_literals_1.txt b/experiments/translator/src/test/kotlin/tests/numeric_literals_1/numeric_literals_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/numeric_literals_1/numeric_literals_1.txt rename to experiments/translator/src/test/kotlin/tests/numeric_literals_1/numeric_literals_1.txt diff --git a/translator/src/test/kotlin/tests/object_1/object_1.kt b/experiments/translator/src/test/kotlin/tests/object_1/object_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/object_1/object_1.kt rename to experiments/translator/src/test/kotlin/tests/object_1/object_1.kt diff --git a/translator/src/test/kotlin/tests/object_1/object_1.txt b/experiments/translator/src/test/kotlin/tests/object_1/object_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/object_1/object_1.txt rename to experiments/translator/src/test/kotlin/tests/object_1/object_1.txt diff --git a/translator/src/test/kotlin/tests/postfix_1/postfix_1.kt b/experiments/translator/src/test/kotlin/tests/postfix_1/postfix_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/postfix_1/postfix_1.kt rename to experiments/translator/src/test/kotlin/tests/postfix_1/postfix_1.kt diff --git a/translator/src/test/kotlin/tests/postfix_1/postfix_1.txt b/experiments/translator/src/test/kotlin/tests/postfix_1/postfix_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/postfix_1/postfix_1.txt rename to experiments/translator/src/test/kotlin/tests/postfix_1/postfix_1.txt diff --git a/translator/src/test/kotlin/tests/primitives_1/primitives_1.kt b/experiments/translator/src/test/kotlin/tests/primitives_1/primitives_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/primitives_1/primitives_1.kt rename to experiments/translator/src/test/kotlin/tests/primitives_1/primitives_1.kt diff --git a/translator/src/test/kotlin/tests/primitives_1/primitives_1.txt b/experiments/translator/src/test/kotlin/tests/primitives_1/primitives_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/primitives_1/primitives_1.txt rename to experiments/translator/src/test/kotlin/tests/primitives_1/primitives_1.txt diff --git a/translator/src/test/kotlin/tests/proto_crossbranch_test/proto_crossbranch_test.kt b/experiments/translator/src/test/kotlin/tests/proto_crossbranch_test/proto_crossbranch_test.kt similarity index 100% rename from translator/src/test/kotlin/tests/proto_crossbranch_test/proto_crossbranch_test.kt rename to experiments/translator/src/test/kotlin/tests/proto_crossbranch_test/proto_crossbranch_test.kt diff --git a/translator/src/test/kotlin/tests/proto_crossbranch_test/proto_crossbranch_test.txt b/experiments/translator/src/test/kotlin/tests/proto_crossbranch_test/proto_crossbranch_test.txt similarity index 100% rename from translator/src/test/kotlin/tests/proto_crossbranch_test/proto_crossbranch_test.txt rename to experiments/translator/src/test/kotlin/tests/proto_crossbranch_test/proto_crossbranch_test.txt diff --git a/translator/src/test/kotlin/tests/proto_location_test/proto_location_test.kt b/experiments/translator/src/test/kotlin/tests/proto_location_test/proto_location_test.kt similarity index 100% rename from translator/src/test/kotlin/tests/proto_location_test/proto_location_test.kt rename to experiments/translator/src/test/kotlin/tests/proto_location_test/proto_location_test.kt diff --git a/translator/src/test/kotlin/tests/proto_location_test/proto_location_test.txt b/experiments/translator/src/test/kotlin/tests/proto_location_test/proto_location_test.txt similarity index 100% rename from translator/src/test/kotlin/tests/proto_location_test/proto_location_test.txt rename to experiments/translator/src/test/kotlin/tests/proto_location_test/proto_location_test.txt diff --git a/translator/src/test/kotlin/tests/proto_multiple_messages/proto_multiple_messages.kt b/experiments/translator/src/test/kotlin/tests/proto_multiple_messages/proto_multiple_messages.kt similarity index 100% rename from translator/src/test/kotlin/tests/proto_multiple_messages/proto_multiple_messages.kt rename to experiments/translator/src/test/kotlin/tests/proto_multiple_messages/proto_multiple_messages.kt diff --git a/translator/src/test/kotlin/tests/proto_multiple_messages/proto_multiple_messages.txt b/experiments/translator/src/test/kotlin/tests/proto_multiple_messages/proto_multiple_messages.txt similarity index 100% rename from translator/src/test/kotlin/tests/proto_multiple_messages/proto_multiple_messages.txt rename to experiments/translator/src/test/kotlin/tests/proto_multiple_messages/proto_multiple_messages.txt diff --git a/translator/src/test/kotlin/tests/proto_repeated_varint/proto_repeated_varint.kt b/experiments/translator/src/test/kotlin/tests/proto_repeated_varint/proto_repeated_varint.kt similarity index 100% rename from translator/src/test/kotlin/tests/proto_repeated_varint/proto_repeated_varint.kt rename to experiments/translator/src/test/kotlin/tests/proto_repeated_varint/proto_repeated_varint.kt diff --git a/translator/src/test/kotlin/tests/proto_repeated_varint/proto_repeated_varint.txt b/experiments/translator/src/test/kotlin/tests/proto_repeated_varint/proto_repeated_varint.txt similarity index 100% rename from translator/src/test/kotlin/tests/proto_repeated_varint/proto_repeated_varint.txt rename to experiments/translator/src/test/kotlin/tests/proto_repeated_varint/proto_repeated_varint.txt diff --git a/translator/src/test/kotlin/tests/proto_repeated_zigzag/proto_repeated_zigzag.kt b/experiments/translator/src/test/kotlin/tests/proto_repeated_zigzag/proto_repeated_zigzag.kt similarity index 100% rename from translator/src/test/kotlin/tests/proto_repeated_zigzag/proto_repeated_zigzag.kt rename to experiments/translator/src/test/kotlin/tests/proto_repeated_zigzag/proto_repeated_zigzag.kt diff --git a/translator/src/test/kotlin/tests/proto_repeated_zigzag/proto_repeated_zigzag.txt b/experiments/translator/src/test/kotlin/tests/proto_repeated_zigzag/proto_repeated_zigzag.txt similarity index 100% rename from translator/src/test/kotlin/tests/proto_repeated_zigzag/proto_repeated_zigzag.txt rename to experiments/translator/src/test/kotlin/tests/proto_repeated_zigzag/proto_repeated_zigzag.txt diff --git a/translator/src/test/kotlin/tests/proto_tagorder_test/proto_tagorder_test.kt b/experiments/translator/src/test/kotlin/tests/proto_tagorder_test/proto_tagorder_test.kt similarity index 100% rename from translator/src/test/kotlin/tests/proto_tagorder_test/proto_tagorder_test.kt rename to experiments/translator/src/test/kotlin/tests/proto_tagorder_test/proto_tagorder_test.kt diff --git a/translator/src/test/kotlin/tests/proto_tagorder_test/proto_tagorder_test.txt b/experiments/translator/src/test/kotlin/tests/proto_tagorder_test/proto_tagorder_test.txt similarity index 100% rename from translator/src/test/kotlin/tests/proto_tagorder_test/proto_tagorder_test.txt rename to experiments/translator/src/test/kotlin/tests/proto_tagorder_test/proto_tagorder_test.txt diff --git a/translator/src/test/kotlin/tests/proto_varint/proto_varint.kt b/experiments/translator/src/test/kotlin/tests/proto_varint/proto_varint.kt similarity index 100% rename from translator/src/test/kotlin/tests/proto_varint/proto_varint.kt rename to experiments/translator/src/test/kotlin/tests/proto_varint/proto_varint.kt diff --git a/translator/src/test/kotlin/tests/proto_varint/proto_varint.txt b/experiments/translator/src/test/kotlin/tests/proto_varint/proto_varint.txt similarity index 100% rename from translator/src/test/kotlin/tests/proto_varint/proto_varint.txt rename to experiments/translator/src/test/kotlin/tests/proto_varint/proto_varint.txt diff --git a/translator/src/test/kotlin/tests/proto_zigzag/proto_zigzag.kt b/experiments/translator/src/test/kotlin/tests/proto_zigzag/proto_zigzag.kt similarity index 100% rename from translator/src/test/kotlin/tests/proto_zigzag/proto_zigzag.kt rename to experiments/translator/src/test/kotlin/tests/proto_zigzag/proto_zigzag.kt diff --git a/translator/src/test/kotlin/tests/proto_zigzag/proto_zigzag.txt b/experiments/translator/src/test/kotlin/tests/proto_zigzag/proto_zigzag.txt similarity index 100% rename from translator/src/test/kotlin/tests/proto_zigzag/proto_zigzag.txt rename to experiments/translator/src/test/kotlin/tests/proto_zigzag/proto_zigzag.txt diff --git a/translator/src/test/kotlin/tests/range_operator_1/range_operator_1.kt b/experiments/translator/src/test/kotlin/tests/range_operator_1/range_operator_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/range_operator_1/range_operator_1.kt rename to experiments/translator/src/test/kotlin/tests/range_operator_1/range_operator_1.kt diff --git a/translator/src/test/kotlin/tests/range_operator_1/range_operator_1.txt b/experiments/translator/src/test/kotlin/tests/range_operator_1/range_operator_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/range_operator_1/range_operator_1.txt rename to experiments/translator/src/test/kotlin/tests/range_operator_1/range_operator_1.txt diff --git a/translator/src/test/kotlin/tests/reassigment_0/reassigment_0.kt b/experiments/translator/src/test/kotlin/tests/reassigment_0/reassigment_0.kt similarity index 100% rename from translator/src/test/kotlin/tests/reassigment_0/reassigment_0.kt rename to experiments/translator/src/test/kotlin/tests/reassigment_0/reassigment_0.kt diff --git a/translator/src/test/kotlin/tests/reassigment_0/reassigment_0.txt b/experiments/translator/src/test/kotlin/tests/reassigment_0/reassigment_0.txt similarity index 100% rename from translator/src/test/kotlin/tests/reassigment_0/reassigment_0.txt rename to experiments/translator/src/test/kotlin/tests/reassigment_0/reassigment_0.txt diff --git a/translator/src/test/kotlin/tests/reassigment_1/reassigment_1.kt b/experiments/translator/src/test/kotlin/tests/reassigment_1/reassigment_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/reassigment_1/reassigment_1.kt rename to experiments/translator/src/test/kotlin/tests/reassigment_1/reassigment_1.kt diff --git a/translator/src/test/kotlin/tests/reassigment_1/reassigment_1.txt b/experiments/translator/src/test/kotlin/tests/reassigment_1/reassigment_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/reassigment_1/reassigment_1.txt rename to experiments/translator/src/test/kotlin/tests/reassigment_1/reassigment_1.txt diff --git a/translator/src/test/kotlin/tests/referential_equality_1/referential_equality_1.kt b/experiments/translator/src/test/kotlin/tests/referential_equality_1/referential_equality_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/referential_equality_1/referential_equality_1.kt rename to experiments/translator/src/test/kotlin/tests/referential_equality_1/referential_equality_1.kt diff --git a/translator/src/test/kotlin/tests/referential_equality_1/referential_equality_1.txt b/experiments/translator/src/test/kotlin/tests/referential_equality_1/referential_equality_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/referential_equality_1/referential_equality_1.txt rename to experiments/translator/src/test/kotlin/tests/referential_equality_1/referential_equality_1.txt diff --git a/translator/src/test/kotlin/tests/referential_equality_2/referential_equality_2.kt b/experiments/translator/src/test/kotlin/tests/referential_equality_2/referential_equality_2.kt similarity index 100% rename from translator/src/test/kotlin/tests/referential_equality_2/referential_equality_2.kt rename to experiments/translator/src/test/kotlin/tests/referential_equality_2/referential_equality_2.kt diff --git a/translator/src/test/kotlin/tests/referential_equality_2/referential_equality_2.txt b/experiments/translator/src/test/kotlin/tests/referential_equality_2/referential_equality_2.txt similarity index 100% rename from translator/src/test/kotlin/tests/referential_equality_2/referential_equality_2.txt rename to experiments/translator/src/test/kotlin/tests/referential_equality_2/referential_equality_2.txt diff --git a/translator/src/test/kotlin/tests/return_1/return_1.kt b/experiments/translator/src/test/kotlin/tests/return_1/return_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/return_1/return_1.kt rename to experiments/translator/src/test/kotlin/tests/return_1/return_1.kt diff --git a/translator/src/test/kotlin/tests/return_1/return_1.txt b/experiments/translator/src/test/kotlin/tests/return_1/return_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/return_1/return_1.txt rename to experiments/translator/src/test/kotlin/tests/return_1/return_1.txt diff --git a/translator/src/test/kotlin/tests/safe_access_operator/safe_access_operator.kt b/experiments/translator/src/test/kotlin/tests/safe_access_operator/safe_access_operator.kt similarity index 100% rename from translator/src/test/kotlin/tests/safe_access_operator/safe_access_operator.kt rename to experiments/translator/src/test/kotlin/tests/safe_access_operator/safe_access_operator.kt diff --git a/translator/src/test/kotlin/tests/safe_access_operator/safe_access_operator.txt b/experiments/translator/src/test/kotlin/tests/safe_access_operator/safe_access_operator.txt similarity index 100% rename from translator/src/test/kotlin/tests/safe_access_operator/safe_access_operator.txt rename to experiments/translator/src/test/kotlin/tests/safe_access_operator/safe_access_operator.txt diff --git a/translator/src/test/kotlin/tests/secondary_constructor_1/secondary_constructor_1.kt b/experiments/translator/src/test/kotlin/tests/secondary_constructor_1/secondary_constructor_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/secondary_constructor_1/secondary_constructor_1.kt rename to experiments/translator/src/test/kotlin/tests/secondary_constructor_1/secondary_constructor_1.kt diff --git a/translator/src/test/kotlin/tests/secondary_constructor_1/secondary_constructor_1.txt b/experiments/translator/src/test/kotlin/tests/secondary_constructor_1/secondary_constructor_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/secondary_constructor_1/secondary_constructor_1.txt rename to experiments/translator/src/test/kotlin/tests/secondary_constructor_1/secondary_constructor_1.txt diff --git a/translator/src/test/kotlin/tests/serialization_test/serialization_test.kt b/experiments/translator/src/test/kotlin/tests/serialization_test/serialization_test.kt similarity index 100% rename from translator/src/test/kotlin/tests/serialization_test/serialization_test.kt rename to experiments/translator/src/test/kotlin/tests/serialization_test/serialization_test.kt diff --git a/translator/src/test/kotlin/tests/serialization_test/serialization_test.txt b/experiments/translator/src/test/kotlin/tests/serialization_test/serialization_test.txt similarity index 100% rename from translator/src/test/kotlin/tests/serialization_test/serialization_test.txt rename to experiments/translator/src/test/kotlin/tests/serialization_test/serialization_test.txt diff --git a/translator/src/test/kotlin/tests/simple_class_2/simple_class_2.kt b/experiments/translator/src/test/kotlin/tests/simple_class_2/simple_class_2.kt similarity index 100% rename from translator/src/test/kotlin/tests/simple_class_2/simple_class_2.kt rename to experiments/translator/src/test/kotlin/tests/simple_class_2/simple_class_2.kt diff --git a/translator/src/test/kotlin/tests/simple_class_2/simple_class_2.txt b/experiments/translator/src/test/kotlin/tests/simple_class_2/simple_class_2.txt similarity index 100% rename from translator/src/test/kotlin/tests/simple_class_2/simple_class_2.txt rename to experiments/translator/src/test/kotlin/tests/simple_class_2/simple_class_2.txt diff --git a/translator/src/test/kotlin/tests/simple_proto_test_1/simple_proto_test_1.kt b/experiments/translator/src/test/kotlin/tests/simple_proto_test_1/simple_proto_test_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/simple_proto_test_1/simple_proto_test_1.kt rename to experiments/translator/src/test/kotlin/tests/simple_proto_test_1/simple_proto_test_1.kt diff --git a/translator/src/test/kotlin/tests/simple_proto_test_1/simple_proto_test_1.txt b/experiments/translator/src/test/kotlin/tests/simple_proto_test_1/simple_proto_test_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/simple_proto_test_1/simple_proto_test_1.txt rename to experiments/translator/src/test/kotlin/tests/simple_proto_test_1/simple_proto_test_1.txt diff --git a/translator/src/test/kotlin/tests/simply_class_1/simply_class_1.kt b/experiments/translator/src/test/kotlin/tests/simply_class_1/simply_class_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/simply_class_1/simply_class_1.kt rename to experiments/translator/src/test/kotlin/tests/simply_class_1/simply_class_1.kt diff --git a/translator/src/test/kotlin/tests/simply_class_1/simply_class_1.txt b/experiments/translator/src/test/kotlin/tests/simply_class_1/simply_class_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/simply_class_1/simply_class_1.txt rename to experiments/translator/src/test/kotlin/tests/simply_class_1/simply_class_1.txt diff --git a/translator/src/test/kotlin/tests/smartcast_1/smartcast_1.kt b/experiments/translator/src/test/kotlin/tests/smartcast_1/smartcast_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/smartcast_1/smartcast_1.kt rename to experiments/translator/src/test/kotlin/tests/smartcast_1/smartcast_1.kt diff --git a/translator/src/test/kotlin/tests/smartcast_1/smartcast_1.txt b/experiments/translator/src/test/kotlin/tests/smartcast_1/smartcast_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/smartcast_1/smartcast_1.txt rename to experiments/translator/src/test/kotlin/tests/smartcast_1/smartcast_1.txt diff --git a/translator/src/test/kotlin/tests/stress_test_1/stress_test_1.kt b/experiments/translator/src/test/kotlin/tests/stress_test_1/stress_test_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/stress_test_1/stress_test_1.kt rename to experiments/translator/src/test/kotlin/tests/stress_test_1/stress_test_1.kt diff --git a/translator/src/test/kotlin/tests/stress_test_1/stress_test_1.txt b/experiments/translator/src/test/kotlin/tests/stress_test_1/stress_test_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/stress_test_1/stress_test_1.txt rename to experiments/translator/src/test/kotlin/tests/stress_test_1/stress_test_1.txt diff --git a/translator/src/test/kotlin/tests/string_print_test_1/string_print_test_1.kt b/experiments/translator/src/test/kotlin/tests/string_print_test_1/string_print_test_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/string_print_test_1/string_print_test_1.kt rename to experiments/translator/src/test/kotlin/tests/string_print_test_1/string_print_test_1.kt diff --git a/translator/src/test/kotlin/tests/string_print_test_1/string_print_test_1.txt b/experiments/translator/src/test/kotlin/tests/string_print_test_1/string_print_test_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/string_print_test_1/string_print_test_1.txt rename to experiments/translator/src/test/kotlin/tests/string_print_test_1/string_print_test_1.txt diff --git a/translator/src/test/kotlin/tests/this_test_1/this_test_1.kt b/experiments/translator/src/test/kotlin/tests/this_test_1/this_test_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/this_test_1/this_test_1.kt rename to experiments/translator/src/test/kotlin/tests/this_test_1/this_test_1.kt diff --git a/translator/src/test/kotlin/tests/this_test_1/this_test_1.txt b/experiments/translator/src/test/kotlin/tests/this_test_1/this_test_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/this_test_1/this_test_1.txt rename to experiments/translator/src/test/kotlin/tests/this_test_1/this_test_1.txt diff --git a/translator/src/test/kotlin/tests/unary_operators_1/unary_operators_1.kt b/experiments/translator/src/test/kotlin/tests/unary_operators_1/unary_operators_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/unary_operators_1/unary_operators_1.kt rename to experiments/translator/src/test/kotlin/tests/unary_operators_1/unary_operators_1.kt diff --git a/translator/src/test/kotlin/tests/unary_operators_1/unary_operators_1.txt b/experiments/translator/src/test/kotlin/tests/unary_operators_1/unary_operators_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/unary_operators_1/unary_operators_1.txt rename to experiments/translator/src/test/kotlin/tests/unary_operators_1/unary_operators_1.txt diff --git a/translator/src/test/kotlin/tests/variables_assigment_1/variables_assigment_1.kt b/experiments/translator/src/test/kotlin/tests/variables_assigment_1/variables_assigment_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/variables_assigment_1/variables_assigment_1.kt rename to experiments/translator/src/test/kotlin/tests/variables_assigment_1/variables_assigment_1.kt diff --git a/translator/src/test/kotlin/tests/variables_assigment_1/variables_assigment_1.txt b/experiments/translator/src/test/kotlin/tests/variables_assigment_1/variables_assigment_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/variables_assigment_1/variables_assigment_1.txt rename to experiments/translator/src/test/kotlin/tests/variables_assigment_1/variables_assigment_1.txt diff --git a/translator/src/test/kotlin/tests/when_block/when_block.kt b/experiments/translator/src/test/kotlin/tests/when_block/when_block.kt similarity index 100% rename from translator/src/test/kotlin/tests/when_block/when_block.kt rename to experiments/translator/src/test/kotlin/tests/when_block/when_block.kt diff --git a/translator/src/test/kotlin/tests/when_block/when_block.txt b/experiments/translator/src/test/kotlin/tests/when_block/when_block.txt similarity index 100% rename from translator/src/test/kotlin/tests/when_block/when_block.txt rename to experiments/translator/src/test/kotlin/tests/when_block/when_block.txt diff --git a/translator/src/test/kotlin/tests/when_expression_1/when_expression_1.kt b/experiments/translator/src/test/kotlin/tests/when_expression_1/when_expression_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/when_expression_1/when_expression_1.kt rename to experiments/translator/src/test/kotlin/tests/when_expression_1/when_expression_1.kt diff --git a/translator/src/test/kotlin/tests/when_expression_1/when_expression_1.txt b/experiments/translator/src/test/kotlin/tests/when_expression_1/when_expression_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/when_expression_1/when_expression_1.txt rename to experiments/translator/src/test/kotlin/tests/when_expression_1/when_expression_1.txt diff --git a/translator/src/test/kotlin/tests/while_1/while_1.kt b/experiments/translator/src/test/kotlin/tests/while_1/while_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/while_1/while_1.kt rename to experiments/translator/src/test/kotlin/tests/while_1/while_1.kt diff --git a/translator/src/test/kotlin/tests/while_1/while_1.txt b/experiments/translator/src/test/kotlin/tests/while_1/while_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/while_1/while_1.txt rename to experiments/translator/src/test/kotlin/tests/while_1/while_1.txt diff --git a/translator/src/test/kotlin/tests/while_2/while_2.c b/experiments/translator/src/test/kotlin/tests/while_2/while_2.c similarity index 100% rename from translator/src/test/kotlin/tests/while_2/while_2.c rename to experiments/translator/src/test/kotlin/tests/while_2/while_2.c diff --git a/translator/src/test/kotlin/tests/while_2/while_2.kt b/experiments/translator/src/test/kotlin/tests/while_2/while_2.kt similarity index 100% rename from translator/src/test/kotlin/tests/while_2/while_2.kt rename to experiments/translator/src/test/kotlin/tests/while_2/while_2.kt diff --git a/translator/src/test/kotlin/tests/while_2/while_2.txt b/experiments/translator/src/test/kotlin/tests/while_2/while_2.txt similarity index 100% rename from translator/src/test/kotlin/tests/while_2/while_2.txt rename to experiments/translator/src/test/kotlin/tests/while_2/while_2.txt diff --git a/translator/src/test/kotlin/tests/while_argument_side_effects_1/while_argument_side_effects_1.kt b/experiments/translator/src/test/kotlin/tests/while_argument_side_effects_1/while_argument_side_effects_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/while_argument_side_effects_1/while_argument_side_effects_1.kt rename to experiments/translator/src/test/kotlin/tests/while_argument_side_effects_1/while_argument_side_effects_1.kt diff --git a/translator/src/test/kotlin/tests/while_argument_side_effects_1/while_argument_side_effects_1.txt b/experiments/translator/src/test/kotlin/tests/while_argument_side_effects_1/while_argument_side_effects_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/while_argument_side_effects_1/while_argument_side_effects_1.txt rename to experiments/translator/src/test/kotlin/tests/while_argument_side_effects_1/while_argument_side_effects_1.txt diff --git a/translator/src/test/kotlin/tests/while_break_1/while_break_1.kt b/experiments/translator/src/test/kotlin/tests/while_break_1/while_break_1.kt similarity index 100% rename from translator/src/test/kotlin/tests/while_break_1/while_break_1.kt rename to experiments/translator/src/test/kotlin/tests/while_break_1/while_break_1.kt diff --git a/translator/src/test/kotlin/tests/while_break_1/while_break_1.txt b/experiments/translator/src/test/kotlin/tests/while_break_1/while_break_1.txt similarity index 100% rename from translator/src/test/kotlin/tests/while_break_1/while_break_1.txt rename to experiments/translator/src/test/kotlin/tests/while_break_1/while_break_1.txt diff --git a/kotstd/Makefile b/kotstd/Makefile deleted file mode 100644 index 96cc6f46659..00000000000 --- a/kotstd/Makefile +++ /dev/null @@ -1,57 +0,0 @@ - -BUILD_DIR=$(PWD)/build -INCLUDE_DIR=$(PWD)/include -LIB_DIR=$(PWD)/ll -LIB_ARM_DIR=$(LIB_DIR)/arm -LIB_X86_DIR=$(LIB_DIR)/x86 -LIBC=$(PWD)/c -LLVM_ARM_FILES = $(patsubst $(LIBC)/%.c,$(LIB_ARM_DIR)/%.ll,$(wildcard $(LIBC)/*.c)) -LLVM_X86_FILES = $(patsubst $(LIBC)/%.c,$(LIB_X86_DIR)/%.ll,$(wildcard $(LIBC)/*.c)) - -KT=$(PWD)/../translator/build/libs/translator-1.0.jar -LLINK=llvm-link-3.6 -CC=clang-3.6 - -CCFLAGS_ARM=-g -S -Wall -m32 -emit-llvm -nostdlib -ffreestanding -march=armv7-m -mthumb -flto -O0 -target arm-none-eabi -DARM -Wno-int-to-pointer-cast -Wno-gcc-compat -CCFLAGS=-g -O0 -S -Wall -emit-llvm -nostdlib -ffreestanding -Wno-int-to-pointer-cast -Wno-gcc-compat -CCFLAGS_DEBUG=-g -O0 -S -Wall -emit-llvm -nostdlib -ffreestanding -DDBG -LLINK_FLAGS=-S - -KT_ALL_DEPS=java -jar $(KT) -LLINK_ALL_DEPS=$(LLINK) $(LLINK_FLAGS) $(filter %.ll,$^) > $@ - -all: $(BUILD_DIR) $(BUILD_DIR)/stdlib_arm.ll $(BUILD_DIR)/stdlib_x86.ll -debug: memory_debug $(BUILD_DIR) $(BUILD_DIR)/stdlib_arm.ll $(BUILD_DIR)/stdlib_x86.ll - -$(BUILD_DIR): - mkdir -p $(BUILD_DIR) - mkdir -p $(LIB_ARM_DIR) - mkdir -p $(LIB_X86_DIR) - -$(BUILD_DIR)/stdlib_arm.ll: $(LLVM_ARM_FILES) - $(LLINK_ALL_DEPS) - -$(BUILD_DIR)/stdlib_x86.ll: $(LLVM_X86_FILES) - $(LLINK_ALL_DEPS) - -$(BUILD_DIR)/classes_x86.ll: $(INCLUDE_DIR)/*.kt - $(KT_ALL_DEPS) -o $@ $(filter %.kt,$^) - -$(BUILD_DIR)/classes_arm.ll: $(INCLUDE_DIR)/*.kt - $(KT_ALL_DEPS) --arm -o $@ $(filter %.kt,$^) - -$(LIB_X86_DIR)/%.ll: $(LIBC)/%.c - $(CC) $(CCFLAGS) -c $< -o $(LIB_X86_DIR)/$(basename $(notdir $<)).ll - -$(LIB_ARM_DIR)/%.ll: $(LIBC)/%.c - $(CC) $(CCFLAGS_ARM) -c $< -o $(LIB_ARM_DIR)/$(basename $(notdir $<)).ll - -memory_debug: - $(CC) $(CCFLAGS_DEBUG) $(LIBC)/memory.c -o $(LIB_X86_DIR)/memory.ll - -clean: - rm -rf $(BUILD_DIR) - rm -rf $(LIB_DIR) - -.PHONY: all clean - diff --git a/kotstd/c/arm.c b/kotstd/c/arm.c deleted file mode 100644 index 41bbd674ef4..00000000000 --- a/kotstd/c/arm.c +++ /dev/null @@ -1,11 +0,0 @@ -#ifdef ARM - - -int printf(const char *__fmt, ...) __attribute__((weak)){ - /* - * We dont have support output on ARM. - */ - return 0; -} - -#endif \ No newline at end of file diff --git a/kotstd/c/array_c.c b/kotstd/c/array_c.c deleted file mode 100644 index 240a000b0ac..00000000000 --- a/kotstd/c/array_c.c +++ /dev/null @@ -1,57 +0,0 @@ -extern char* malloc_heap(int size) __attribute__((weak)); - -int malloc_array(int x) __attribute__((weak)){ - return (int) malloc_heap(x); -} - -char kotlinclib_byte_array_get_ix(int data, int index) __attribute__((weak)){ - return *((char *) data + index); -} - -void kotlinclib_byte_array_set_ix(int data, int index, char value) __attribute__((weak)){ - char *ptr = (char *) data; - *(ptr + index) = value; -} - -char kotlinclib_boolean_array_get_ix(int data, int index) __attribute__((weak)){ - return kotlinclib_byte_array_get_ix(data, index); -} - -void kotlinclib_boolean_array_set_ix(int data, int index, char value) __attribute__((weak)){ - kotlinclib_byte_array_set_ix(data, index, value); -} - -char kotlinclib_char_array_get_ix(int data, int index) __attribute__((weak)){ - return kotlinclib_char_array_get_ix(data, index); -} - -void kotlinclib_char_array_set_ix(int data, int index, char value) __attribute__((weak)){ - kotlinclib_char_array_set_ix(data, index, value); -} - -int kotlinclib_int_array_get_ix(int data, int index) __attribute__((weak)){ - return *((int *) data + index); -} - -void kotlinclib_int_array_set_ix(int data, int index, int value) __attribute__((weak)){ - int *ptr = (int *) data; - *(ptr + index) = value; -} - -short kotlinclib_short_array_get_ix(int data, int index) __attribute__((weak)){ - return *((short *) data + index); -} - -void kotlinclib_short_array_set_ix(int data, int index, short value) __attribute__((weak)){ - short *ptr = (short *) data; - *(ptr + index) = value; -} - -long long kotlinclib_long_array_get_ix(int data, int index) __attribute__((weak)){ - return *((long long *) data + index); -} - -void kotlinclib_long_array_set_ix(int data, int index, long long value) __attribute__((weak)){ - long long *ptr = (long long *) data; - *(ptr + index) = value; -} diff --git a/kotstd/c/assert_c.c b/kotstd/c/assert_c.c deleted file mode 100644 index 659705443f5..00000000000 --- a/kotstd/c/assert_c.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -void assert_c( value) __attribute__((weak)){ - #ifndef ARM - if (!value) { - printf("Exception in thread \"main\" java.lang.AssertionError: Assertion failed\n"); - abort(); - } - #endif -} \ No newline at end of file diff --git a/kotstd/c/console_c.c b/kotstd/c/console_c.c deleted file mode 100644 index bd7025c1dde..00000000000 --- a/kotstd/c/console_c.c +++ /dev/null @@ -1,92 +0,0 @@ -#include - -void kotlinclib_print_int(int message) { - printf("%d", message); -} - -void kotlinclib_print_long(long long message) { - printf("%lld", message); -} - -void kotlinclib_print_byte(char message) { - printf("%d", message); -} - -void kotlinclib_print_short(short message) { - printf("%d", message); -} - -void kotlinclib_print_char(char message) { - printf("%c", message); -} - -void kotlinclib_print_boolean(int message) { - if (message == 0) { - printf("false"); - } - else { - printf("true"); - } -} - -void kotlinclib_print_float(float message) { - printf("%f", message); -} - -void kotlinclib_print_double(double message) { - printf("%lf", message); -} - -void kotlinclib_print_string(char *message) { - printf("%s", message); -} - - -void kotlinclib_println() { - kotlinclib_print_char('\n'); -} - -void kotlinclib_println_int(int message) { - kotlinclib_print_int(message); - kotlinclib_println(); -} - -void kotlinclib_println_long(long long message) { - kotlinclib_print_long(message); - kotlinclib_println(); -} - -void kotlinclib_println_byte(char message) { - kotlinclib_print_byte(message); - kotlinclib_println(); -} - -void kotlinclib_println_short(short message) { - kotlinclib_print_short(message); - kotlinclib_println(); -} - -void kotlinclib_println_char(char message) { - kotlinclib_print_char(message); - kotlinclib_println(); -} - -void kotlinclib_println_boolean(int message) { - kotlinclib_print_boolean(message); - kotlinclib_println(); -} - -void kotlinclib_println_float(float message) { - kotlinclib_print_float(message); - kotlinclib_println(); -} - -void kotlinclib_println_double(double message) { - kotlinclib_print_double(message); - kotlinclib_println(); -} - -void kotlinclib_println_string(char *message) { - kotlinclib_print_string(message); - kotlinclib_println(); -} diff --git a/kotstd/c/memory.c b/kotstd/c/memory.c deleted file mode 100644 index 18844c7c0ef..00000000000 --- a/kotstd/c/memory.c +++ /dev/null @@ -1,82 +0,0 @@ - -#define STATIC_AREA_SIZE 30000 -#define DYNAMIC_AREA_SIZE 30000 - -#define STATIC_HEAP 0 -#define DYNAMIC_HEAP 1 - -#ifdef ARM - -char static_area[STATIC_AREA_SIZE]; -char dynamic_area[DYNAMIC_AREA_SIZE]; - -char* heaps[2] = { - (char*) static_area, - (char*) dynamic_area -}; - -int heap_tails[2] = {0, 0}; -int active_heap = STATIC_HEAP; - -int dynamic_heap_consume = 0; -int dynamic_heap_max = 0; - -#else -char* malloc(int); -#endif - -#ifdef DBG - static int total = 0; - int printf(const char * restrict format, ... ); -#endif - -char* malloc_heap(int size) { -#ifdef ARM - char* ptr = heaps[active_heap] + heap_tails[active_heap]; - heap_tails[active_heap] += size; - - return ptr; - -#else - #ifdef DBG - total = total + size; - printf("Alloc [%d] TOTAL: [%d]\n", size, total); - #endif - return malloc(size); -#endif -} - -void set_active_heap(int heap) { -#ifdef ARM - active_heap = heap; -#endif -} - -void clean_dynamic_heap() { -#ifdef ARM - dynamic_heap_consume += heap_tails[DYNAMIC_HEAP]; - if (heap_tails[DYNAMIC_HEAP] > dynamic_heap_max) { - dynamic_heap_max = heap_tails[DYNAMIC_HEAP]; - } - - heap_tails[DYNAMIC_HEAP] = 0; -#endif -} - -#ifdef ARM -int dynamic_heap_tail() { - return heap_tails[DYNAMIC_HEAP]; -} - -int static_heap_tail() { - return heap_tails[STATIC_HEAP]; -} - -int dynamic_heap_max_bytes() { - return dynamic_heap_max; -} - -int dynamic_heap_total() { - return dynamic_heap_consume; -} -#endif diff --git a/kotstd/c/primitives_c.c b/kotstd/c/primitives_c.c deleted file mode 100644 index 236d2b75d7d..00000000000 --- a/kotstd/c/primitives_c.c +++ /dev/null @@ -1,90 +0,0 @@ -#define MAKE_CONVERT(from, from_type, to, to_type) to_type kotlinclib_ ## from ## To ## to ( from_type value ) __attribute__(( weak)) { return (to_type) value;} - - -MAKE_CONVERT(int, int, Byte, char) -MAKE_CONVERT(int, int, Char, char) -MAKE_CONVERT(int, int, Short, short) -MAKE_CONVERT(int, int, Long, long) -MAKE_CONVERT(int, int, Float, float) -MAKE_CONVERT(int, int, Double, double) - - -MAKE_CONVERT(byte, char, Char, char) -MAKE_CONVERT(byte, char, Short, short) -MAKE_CONVERT(byte, char, Int, int) -MAKE_CONVERT(byte, char, Long, long) -MAKE_CONVERT(byte, char, Float, float) -MAKE_CONVERT(byte, char, Double, double) - - -MAKE_CONVERT(char, char, Byte, char) -MAKE_CONVERT(char, char, Short, short) -MAKE_CONVERT(char, char, Int, int) -MAKE_CONVERT(char, char, Long, long) -MAKE_CONVERT(char, char, Float, float) -MAKE_CONVERT(char, char, Double, double) - - -MAKE_CONVERT(short, short, Byte, char) -MAKE_CONVERT(short, short, Char, char) -MAKE_CONVERT(short, short, Int, int) -MAKE_CONVERT(short, short, Long, long) -MAKE_CONVERT(short, short, Float, float) -MAKE_CONVERT(short, short, Double, double) - - -MAKE_CONVERT(long, long, Byte, char) -MAKE_CONVERT(long, long, Char, char) -MAKE_CONVERT(long, long, Short, short) -MAKE_CONVERT(long, long, Int, int) -MAKE_CONVERT(long, long, Float, float) -MAKE_CONVERT(long, long, Double, double) - - -MAKE_CONVERT(float, float, Byte, char) -MAKE_CONVERT(float, float, Char, char) -MAKE_CONVERT(float, float, Short, short) -MAKE_CONVERT(float, float, Int, int) -MAKE_CONVERT(float, float, Long, long) -MAKE_CONVERT(float, float, Double, double) - - -MAKE_CONVERT(double, double, Byte, char) -MAKE_CONVERT(double, double, Char, char) -MAKE_CONVERT(double, double, Short, short) -MAKE_CONVERT(double, double, Int, int) -MAKE_CONVERT(double, double, Long, long) -MAKE_CONVERT(double, double, Float, float) - - -int kotlinclib_int_size() __attribute__((weak)){ - return sizeof (int); -} - -int kotlinclib_long_size() __attribute__((weak)){ - return sizeof (long long); -} - -int kotlinclib_boolean_size() __attribute__((weak)){ - return sizeof (char); -} - -int kotlinclib_short_size() __attribute__((weak)){ - return sizeof (short); -} - -int kotlinclib_double_size() __attribute__((weak)){ - return sizeof (double); -} - -int kotlinclib_float_size() __attribute__((weak)){ - return sizeof (float); -} - -int kotlinclib_char_size() __attribute__((weak)){ - return sizeof (char); -} - -int kotlinclib_byte_size() __attribute__((weak)){ - return sizeof (char); -} \ No newline at end of file diff --git a/kotstd/kt/Assert.kt b/kotstd/kt/Assert.kt deleted file mode 100644 index fc253e0f13e..00000000000 --- a/kotstd/kt/Assert.kt +++ /dev/null @@ -1,8 +0,0 @@ -package kotlin - -external fun assert_c(value: Boolean) - -fun assert(value: Boolean) { - println(value) - assert_c(value) -} \ No newline at end of file diff --git a/kotstd/kt/BooleanArray.kt b/kotstd/kt/BooleanArray.kt deleted file mode 100644 index 8a6da5a3095..00000000000 --- a/kotstd/kt/BooleanArray.kt +++ /dev/null @@ -1,122 +0,0 @@ -package kotlin - -external fun kotlinclib_boolean_array_get_ix(dataRawPtr: Int, index: Int): Byte -external fun kotlinclib_boolean_array_set_ix(dataRawPtr: Int, index: Int, value: Byte) -external fun kotlinclib_boolean_size(): Int - -class BooleanArray(var size: Int) { - val dataRawPtr: Int - - /** Returns the number of elements in the array. */ - //size: Int - - init { - this.dataRawPtr = malloc_array(kotlinclib_boolean_size() * this.size) - var index = 0 - while (index < this.size) { - set(index, false) - index = index + 1 - } - } - - /** Returns the array element at the given [index]. This method can be called using the index operator. */ - operator fun get(index: Int): Boolean { - val res = kotlinclib_boolean_array_get_ix(this.dataRawPtr, index) == 1.toByte() - return res - } - - - /** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */ - operator fun set(index: Int, value: Boolean) { - if (value == true) { - kotlinclib_boolean_array_set_ix(this.dataRawPtr, index, 1.toByte()) - } else { - kotlinclib_boolean_array_set_ix(this.dataRawPtr, index, 0.toByte()) - } - } - - fun clone(): BooleanArray { - val newInstance = BooleanArray(this.size) - var index = 0 - while (index < this.size) { - val value = this.get(index) - newInstance.set(index, value) - index = index + 1 - } - - return newInstance - } -} - -fun BooleanArray.print() { - var index = 0 - print('[') - while (index < size) { - print(get(index)) - index++ - if (index < size) { - print(';') - print(' ') - } - } - print(']') -} - -fun BooleanArray.println() { - this.print() - //println() -} - - -fun BooleanArray.copyOf(newSize: Int): BooleanArray { - val newInstance = BooleanArray(newSize) - var index = 0 - val end = if (newSize > this.size) this.size else newSize - while (index < end) { - val value = this.get(index) - newInstance.set(index, value) - index = index + 1 - } - - while (index < newSize) { - newInstance.set(index, false) - index = index + 1 - } - - return newInstance -} - -fun BooleanArray.copyOfRange(fromIndex: Int, toIndex: Int): BooleanArray { - val newInstance = BooleanArray(toIndex - fromIndex) - var index = fromIndex - while (index < toIndex) { - val value = this.get(index) - newInstance.set(index - fromIndex, value) - index = index + 1 - } - - return newInstance -} - -operator fun BooleanArray.plus(element: Boolean): BooleanArray { - val index = size - val result = this.copyOf(index + 1) - result[index] = element - return result -} - -operator fun BooleanArray.plus(elements: BooleanArray): BooleanArray { - val thisSize = size - val arraySize = elements.size - val resultSize = thisSize + arraySize - val newInstance = this.copyOf(resultSize) - var index = thisSize - - while (index < resultSize) { - val value = elements.get(index - thisSize) - newInstance.set(index, value) - index = index + 1 - } - - return newInstance -} \ No newline at end of file diff --git a/kotstd/kt/ByteArray.kt b/kotstd/kt/ByteArray.kt deleted file mode 100644 index 6543e0f6d8a..00000000000 --- a/kotstd/kt/ByteArray.kt +++ /dev/null @@ -1,121 +0,0 @@ -package kotlin - -external fun malloc_array(size: Int): Int -external fun kotlinclib_byte_array_get_ix(dataRawPtr: Int, index: Int): Byte -external fun kotlinclib_byte_array_set_ix(dataRawPtr: Int, index: Int, value: Byte) -external fun kotlinclib_byte_size(): Int - - -class ByteArray(var size: Int) { - val dataRawPtr: Int - - /** Returns the number of elements in the array. */ - //size: Int - - init { - this.dataRawPtr = malloc_array(kotlinclib_byte_size() * this.size) - var index = 0 - - while (index < this.size) { - set(index, 0) - index = index + 1 - } - } - - /** Returns the array element at the given [index]. This method can be called using the index operator. */ - operator fun get(index: Int): Byte { - return kotlinclib_byte_array_get_ix(this.dataRawPtr, index) - } - - - /** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */ - operator fun set(index: Int, value: Byte) { - kotlinclib_byte_array_set_ix(this.dataRawPtr, index, value) - } - - - fun clone(): ByteArray { - val newInstance = ByteArray(this.size) - var index = 0 - while (index < this.size) { - val value = this.get(index) - newInstance.set(index, value) - index = index + 1 - } - - return newInstance - } - -} - -fun ByteArray.print() { - var index = 0 - print('[') - while (index < size) { - print(get(index)) - index++ - if (index < size) { - print(';') - print(' ') - } - } - print(']') -} - -fun ByteArray.println() { - this.print() - //println() -} - -fun ByteArray.copyOf(newSize: Int): ByteArray { - val newInstance = ByteArray(newSize) - var index = 0 - val end = if (newSize > this.size) this.size else newSize - while (index < end) { - val value = this.get(index) - newInstance.set(index, value) - index = index + 1 - } - - while (index < newSize) { - newInstance.set(index, 0) - index = index + 1 - } - - return newInstance -} - -fun ByteArray.copyOfRange(fromIndex: Int, toIndex: Int): ByteArray { - val newInstance = ByteArray(toIndex - fromIndex) - var index = fromIndex - while (index < toIndex) { - val value = this.get(index) - newInstance.set(index - fromIndex, value) - index = index + 1 - } - - return newInstance -} - -operator fun ByteArray.plus(element: Byte): ByteArray { - val index = size - val result = this.copyOf(index + 1) - result[index] = element - return result -} - -operator fun ByteArray.plus(elements: ByteArray): ByteArray { - val thisSize = size - val arraySize = elements.size - val resultSize = thisSize + arraySize - val newInstance = this.copyOf(resultSize) - var index = thisSize - - while (index < resultSize) { - val value = elements.get(index - thisSize) - newInstance.set(index, value) - index = index + 1 - } - - return newInstance -} \ No newline at end of file diff --git a/kotstd/kt/CodedInputStream.kt b/kotstd/kt/CodedInputStream.kt deleted file mode 100644 index 38cd0a28561..00000000000 --- a/kotstd/kt/CodedInputStream.kt +++ /dev/null @@ -1,217 +0,0 @@ -/** - * Created by Dmitry Savvinov on 7/6/16. - * - * Hides details of work with Protobuf encoding - * - * Note that CodedInputStream reads protobuf-defined types from stream (such as int32, sint32, etc), - * while CodedOutputStream has methods for writing Kotlin-types (such as Boolean, Int, Long, Short, etc) - * - */ - -// TODO get this out of native translator stdlib -// TODO: refactor correctness checks into readTag -class CodedInputStream(val buffer: ByteArray) { - val inputStream: KotlinInputStream - init { - inputStream = KotlinInputStream(buffer) - } - - fun mark() { - inputStream.mark() - } - - fun reset() { - inputStream.reset() - } - - fun readInt32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.VARINT, actualWireType) - return readInt32NoTag() - } - - // Note that unsigned integer types are stored as their signed counterparts with top bit - // simply stored in the sign bit - similar to Java's protobuf implementation. Hence, all - // methods reading unsigned ints simply redirect call to corresponding signed-reading method - fun readUInt32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readUInt32NoTag() - } - - fun readUInt32NoTag(): Int { - return readInt32NoTag() - } - - fun readInt64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readInt64NoTag() - } - - // See note on unsigned integers implementations above - fun readUInt64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readUInt64NoTag() - } - - fun readUInt64NoTag(): Long { - return readInt64NoTag() - } - - fun readBool(expectedFieldNumber: Int): Boolean { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readBoolNoTag() - } - - fun readBoolNoTag(): Boolean { - val readValue = readInt32NoTag() - val boolValue = when (readValue) { - 0 -> false - 1 -> true - else -> false - } - return boolValue - } - - // Reading enums is like reading one int32 number. Caller is responsible for converting this ordinal to enum-object - fun readEnum(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readEnumNoTag() - } - - fun readEnumNoTag(): Int { - return readUInt32NoTag() - } - - fun readSInt32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readSInt32NoTag() - } - - fun readSInt32NoTag(): Int { - return readZigZag32NoTag() - } - - fun readSInt64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readSInt64NoTag() - } - - fun readSInt64NoTag(): Long { - return readZigZag64NoTag() - } - fun readBytes(expectedFieldNumber: Int): ByteArray { - val tag = readTag(expectedFieldNumber, WireType.LENGTH_DELIMITED) - return readBytesNoTag() - } - - fun readBytesNoTag(): ByteArray { - val length = readInt32NoTag() - return readRawBytes(length) - } - - /** ============ Utility methods ================== - * They are left non-private for cases when one wants to implement her/his own protocol format. - * Then she/he can re-use low-level methods for operating with raw values, that are not annotated with Protobuf tags. - */ - - fun checkFieldCorrectness( - expectedFieldNumber: Int, - actualFieldNumber: Int, - expectedWireType: WireType, - actualWireType: WireType) { - if (expectedFieldNumber != actualFieldNumber) { - return - } - - if (expectedWireType.id != actualWireType.id) { - return - } - } - - fun readRawBytes(count: Int): ByteArray { - val ba = ByteArray(count) - var i = 0 - while (i < count) { - ba[i] = inputStream.read().toByte() - i++ - } - return ba - } - - // reads tag. Note that it returns 0 for the end of message! - fun readTag(expectedFieldNumber: Int, expectedWireType: WireType): Int { - if (isAtEnd()) { - return 0 // we can safely return 0 as sign of end of message, because 0-tags are illegal - } - val tag = readInt32NoTag() - if (tag == 0) { // if we somehow had read 0-tag, then message is corrupted - return 0 - } - - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, expectedWireType, actualWireType) - return tag - } - - // reads varint not larger than 32-bit integer according to protobuf varint-encoding - fun readInt32NoTag(): Int { - var done: Boolean = false - var result: Long = 0 - var step: Int = 0 - while (!done) { - val byte: Int = inputStream.read().toInt() - result = result or - ( - (byte and WireFormat.VARINT_INFO_BITS_MASK).toLong() - shl - (WireFormat.VARINT_INFO_BITS_COUNT * step) - ).toLong() - step++ - if ((byte and WireFormat.VARINT_UTIL_BIT_MASK) == 0) { - done = true - } - } - return result.toInt() - } - - // reads varint not larger than 64-bit integer according to protobuf varint-encoding - fun readInt64NoTag(): Long { - var done: Boolean = false - var result: Long = 0 - var step: Int = 0 - while (!done) { - val byte: Int = inputStream.read().toInt() - result = result or - ( - (byte and WireFormat.VARINT_INFO_BITS_MASK).toLong() - shl - (WireFormat.VARINT_INFO_BITS_COUNT * step) - ) - step++ - if ((byte and WireFormat.VARINT_UTIL_BIT_MASK) == 0 /* || byte == -1 ???? */) { - done = true - } - } - return result - } - - // reads zig-zag encoded integer not larger than 32-bit long - fun readZigZag32NoTag(): Int { - val value = readInt32NoTag() - return (value ushr 1) xor (-(value and 1)) // bit magic for decoding zig-zag number - } - - // reads zig-zag encoded integer not larger than 64-bit long - fun readZigZag64NoTag(): Long { - val value = readInt64NoTag() - return (value ushr 1) xor (-(value and 1L)) // bit magic for decoding zig-zag number - } - - // checks if at least one more byte can be read from underlying input stream - fun isAtEnd(): Boolean { - return inputStream.isAtEnd() - } -} diff --git a/kotstd/kt/CodedOutputStream.kt b/kotstd/kt/CodedOutputStream.kt deleted file mode 100644 index 9c40747b99c..00000000000 --- a/kotstd/kt/CodedOutputStream.kt +++ /dev/null @@ -1,167 +0,0 @@ -/** - * Created by user on 7/6/16. - */ - -class CodedOutputStream(val buffer: ByteArray) { - val output = KotlinOutputStream(buffer) - - fun toByteArray(): ByteArray { - return buffer - } - - fun writeTag(fieldNumber: Int, type: WireType) { - val tag = (fieldNumber shl 3) or type.id - writeRawVarint32(tag) - } - - fun writeInt32(fieldNumber: Int, value: Int) { - writeTag(fieldNumber, WireType.VARINT) - writeInt32NoTag(value) - } - - fun writeInt32NoTag(value: Int) { - if (value < 0) { // sign-extend negative values - writeRawVarint64(value.toLong()) - return - } - writeRawVarint32(value) - } - - // Note that unsigned integer types are stored as their signed counterparts with top bit - // simply stored in the sign bit - similar to Java's protobuf implementation. Hence, all - // methods, writing unsigned ints simply redirect call to corresponding signed-writing method - fun writeUInt32(fieldNumber: Int, value: Int) { - writeTag(fieldNumber, WireType.VARINT) - writeUInt32NoTag(value) - } - - fun writeUInt32NoTag(value: Int) { - writeRawVarint32(value) - } - - fun writeInt64(fieldNumber: Int, value: Long) { - writeTag(fieldNumber, WireType.VARINT) - writeInt64NoTag(value) - } - - fun writeInt64NoTag(value: Long) { - writeRawVarint64(value) - } - - // See notes on unsigned integers implementation above - fun writeUInt64(fieldNumber: Int, value: Long) { - writeTag(fieldNumber, WireType.VARINT) - writeUInt64NoTag(value) - } - - fun writeUInt64NoTag(value: Long) { - writeRawVarint64(value) - } - - fun writeBool(fieldNumber: Int, value: Boolean) { - writeTag(fieldNumber, WireType.VARINT) - writeBoolNoTag(value) - } - - fun writeBoolNoTag(value: Boolean) { - writeRawVarint32(if (value) 1 else 0) - } - - // Writing enums is like writing one int32 number. Caller is responsible for converting enum-object to ordinal - fun writeEnum(fieldNumber: Int, value: Int) { - writeTag(fieldNumber, WireType.VARINT) - writeEnumNoTag(value) - } - - fun writeEnumNoTag(value: Int) { - writeRawVarint32(value) - } - - fun writeSInt32(fieldNumber: Int, value: Int) { - writeTag(fieldNumber, WireType.VARINT) - writeSInt32NoTag(value) - } - - fun writeSInt32NoTag(value: Int) { - writeUInt32NoTag((value shl 1) xor (value shr 31)) - } - - fun writeSInt64(fieldNumber: Int, value: Long) { - writeTag(fieldNumber, WireType.VARINT) - writeSInt64NoTag(value) - } - - fun writeSInt64NoTag(value: Long) { - writeUInt64NoTag((value shl 1) xor (value shr 63)) - } - - fun writeBytes(fieldNumber: Int, value: ByteArray) { - if (value.size == 0) { - return - } - writeTag(fieldNumber, WireType.LENGTH_DELIMITED) - writeBytesNoTag(value) - } - - fun writeBytesNoTag(value: ByteArray) { - writeRawVarint32(value.size) - output.write(value) - } - - /** ============ Utility methods ================== - * They are left non-private for cases when one wants to implement her/his own protocol format. - * Then she/he can re-use low-level methods for operating with raw values, that are not annotated with Protobuf tags. - */ - - fun writeRawVarint32(value: Int) { - var curValue: Int = value - - // we have at most 32 information bits. With overhead of 1 bit per 7 bits we need at most 5 bytes for encoding - val res = ByteArray(5) - - var resSize = 0 - do { - // encode current 7 bits - var curByte = (curValue and WireFormat.VARINT_INFO_BITS_MASK) - - // discard encoded bits. Note that unsigned shift is needed for cases with negative numbers - curValue = curValue ushr WireFormat.VARINT_INFO_BITS_COUNT - - // check if there will be next byte in encoding and set util bit if needed - if (curValue != 0) { - curByte = curByte or WireFormat.VARINT_UTIL_BIT_MASK - } - - res[resSize] = curByte.toByte() - resSize++ - } while (curValue != 0) - output.write(res, 0, resSize) - } - - fun writeRawVarint64(value: Long) { - var curValue: Long = value - - // we have at most 64 information bits. With overhead of 1 bit per 7 bits we need at most 10 bytes for encoding - val res = ByteArray(10) - - var resSize = 0 - do { - // encode current 7 bits - var curByte = (curValue and WireFormat.VARINT_INFO_BITS_MASK.toLong()) - - // discard encoded bits. Note that unsigned shift is needed for cases with negative numbers - curValue = curValue ushr WireFormat.VARINT_INFO_BITS_COUNT - - // check if there will be next byte and set util bit if needed - if (curValue != 0L) { - curByte = curByte or WireFormat.VARINT_UTIL_BIT_MASK.toLong() - } - - res[resSize] = curByte.toByte() - resSize++ - } while(curValue != 0L) - output.write(res, 0, resSize) - } - - -} diff --git a/kotstd/kt/Console.kt b/kotstd/kt/Console.kt deleted file mode 100644 index c4077be14d4..00000000000 --- a/kotstd/kt/Console.kt +++ /dev/null @@ -1,171 +0,0 @@ -package kotlin - -/* -* Library for console interaction -*/ - -external fun kotlinclib_print_int(message: Int) -external fun kotlinclib_print_long(message: Long) -external fun kotlinclib_print_byte(message: Byte) -external fun kotlinclib_print_short(message: Short) -external fun kotlinclib_print_char(message: Char) -external fun kotlinclib_print_boolean(message: Boolean) -external fun kotlinclib_print_float(message: Float) -external fun kotlinclib_print_double(message: Double) -external fun kotlinclib_print_string(message: String) -external fun kotlinclib_println_int(message: Int) -external fun kotlinclib_println_long(message: Long) -external fun kotlinclib_println_byte(message: Byte) -external fun kotlinclib_println_short(message: Short) -external fun kotlinclib_println_char(message: Char) -external fun kotlinclib_println_boolean(message: Boolean) -external fun kotlinclib_println_float(message: Float) -external fun kotlinclib_println_double(message: Double) -external fun kotlinclib_println_string(message: String) -external fun kotlinclib_println() - -/** Prints the given message to the standard output stream. */ -fun print(message: Int) { - kotlinclib_print_int(message) -} - -/** Prints the given message to the standard output stream. */ -fun print(message: Long) { - kotlinclib_print_long(message) -} - -/** Prints the given message to the standard output stream. */ -fun print(message: Byte) { - kotlinclib_print_byte(message) -} - -/** Prints the given message to the standard output stream. */ -fun print(message: Short) { - kotlinclib_print_short(message) -} - -/** Prints the given message to the standard output stream. */ -fun print(message: Char) { - kotlinclib_print_char(message) -} - -/** Prints the given message to the standard output stream. */ -fun print(message: Boolean) { - kotlinclib_print_boolean(message) -} - -/** Prints the given message to the standard output stream. */ -fun print(message: Float) { - kotlinclib_print_float(message) -} - -/** Prints the given message to the standard output stream. */ -fun print(message: Double) { - kotlinclib_print_double(message) -} - -/** Prints the given message to the standard output stream. */ -fun print(message: String) { - kotlinclib_print_string(message) -} - -/** Prints the given message and newline to the standard output stream. */ -fun print(message: ByteArray) { - message.print() -} - -/** Prints the given message and newline to the standard output stream. */ -fun print(message: BooleanArray) { - message.print() -} - -/** Prints the given message and newline to the standard output stream. */ -fun print(message: IntArray) { - message.print() -} - -/** Prints the given message and newline to the standard output stream. */ -fun print(message: LongArray) { - message.print() -} - -/** Prints the given message and newline to the standard output stream. */ -fun print(message: ShortArray) { - message.print() -} - - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: Int) { - kotlinclib_println_int(message) -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: Long) { - kotlinclib_println_long(message) -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: Byte) { - kotlinclib_println_byte(message) -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: Short) { - kotlinclib_println_short(message) -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: Char) { - kotlinclib_println_char(message) -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: Boolean) { - kotlinclib_println_boolean(message) -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: Float) { - kotlinclib_println_float(message) -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: Double) { - kotlinclib_println_double(message) -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: String) { - kotlinclib_println_string(message) -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: ByteArray) { - message.println() -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: BooleanArray) { - message.println() -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: IntArray) { - message.println() -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: LongArray) { - message.println() -} - -/** Prints the given message and newline to the standard output stream. */ -fun println(message: ShortArray) { - message.println() -} - -/** Prints newline to the standard output stream. */ -fun println() { - kotlinclib_println() -} \ No newline at end of file diff --git a/kotstd/kt/IntArray.kt b/kotstd/kt/IntArray.kt deleted file mode 100644 index 52cb222b767..00000000000 --- a/kotstd/kt/IntArray.kt +++ /dev/null @@ -1,196 +0,0 @@ -package kotlin - -external fun kotlinclib_int_array_get_ix(dataRawPtr: Int, index: Int): Int -external fun kotlinclib_int_array_set_ix(dataRawPtr: Int, index: Int, value: Int) -external fun kotlinclib_int_size(): Int - - -class IntArray(var size: Int) { - val dataRawPtr: Int - - //[TODO move up] - /** Returns the number of elements in the array. */ - //size: Int - - init { - this.dataRawPtr = malloc_array(kotlinclib_int_size() * this.size) - var index = 0 - while (index < this.size) { - set(index, 0) - index = index + 1 - } - } - - /** Returns the array element at the given [index]. This method can be called using the index operator. */ - operator fun get(index: Int): Int { - return kotlinclib_int_array_get_ix(this.dataRawPtr, index) - } - - - /** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */ - operator fun set(index: Int, value: Int) { - kotlinclib_int_array_set_ix(this.dataRawPtr, index, value) - } - - - fun clone(): IntArray { - val newInstance = IntArray(this.size) - var index = 0 - while (index < this.size) { - val value = this.get(index) - newInstance.set(index, value) - index = index + 1 - } - - return newInstance - } - -} - -fun IntArray.print() { - var index = 0 - print('[') - while (index < size) { - print(get(index)) - index++ - if (index < size) { - print(';') - print(' ') - } - } - print(']') -} - -fun IntArray.println() { - this.print() - //println() -} - -fun IntArray.copyOf(newSize: Int): IntArray { - val newInstance = IntArray(newSize) - var index = 0 - val end = if (newSize > this.size) this.size else newSize - while (index < end) { - val value = this.get(index) - newInstance.set(index, value) - index = index + 1 - } - - while (index < newSize) { - newInstance.set(index, 0) - index = index + 1 - } - - return newInstance -} - -fun IntArray.copyOfRange(fromIndex: Int, toIndex: Int): IntArray { - val newInstance = IntArray(toIndex - fromIndex) - var index = fromIndex - while (index < toIndex) { - val value = this.get(index) - newInstance.set(index - fromIndex, value) - index = index + 1 - } - - return newInstance -} - -operator fun IntArray.plus(element: Int): IntArray { - val index = size - val result = this.copyOf(index + 1) - result[index] = element - return result -} - -operator fun IntArray.plus(elements: IntArray): IntArray { - val thisSize = size - val arraySize = elements.size - val resultSize = thisSize + arraySize - val newInstance = this.copyOf(resultSize) - var index = thisSize - - while (index < resultSize) { - val value = elements.get(index - thisSize) - newInstance.set(index, value) - index = index + 1 - } - - return newInstance -} - -fun IntArray.max(from: Int = 0): Int { - var result = from - var i = from - while (i < size - 1) { - result = if (get(i) > get(result)) i else result - i++ - } - - return get(result) -} - -fun IntArray.min(from: Int = 0): Int { - var result = from - var i = from - while (i < size - 1) { - result = if (this.get(i) < this.get(result)) i else result - i++ - } - - return this.get(result) -} - -fun IntArray.sum(): Int { - var result = 0 - var i = 0 - while (i < size - 1) { - result += this.get(i) - i++ - } - - return result -} - -fun IntArray.sort(): IntArray { - val result = this.clone() - var i = 0 - while (i < size - 1) { - result[i] = this.max(i) - i++ - } - - return result -} - -fun IntArray.mean(): Int = - this.sum() / this.size - -fun IntArray.median(): Int = - this.sort()[this.size / 2] - -fun IntArray.filter(predicate: (Int) -> Boolean): IntArray { - var resultSize = 0 - var i = 0 - while (i < size - 1) { - if (predicate(get(i))) { - resultSize++ - } - - i++ - } - - val result = IntArray(resultSize) - var j = 0 - i = 0 - while (i < size - 1) { - if (predicate(get(i))) { - result[j] = get(i) - j++ - } - - i++ - } - - return result -} diff --git a/kotstd/kt/Iterators.kt b/kotstd/kt/Iterators.kt deleted file mode 100644 index 836b06babe9..00000000000 --- a/kotstd/kt/Iterators.kt +++ /dev/null @@ -1,94 +0,0 @@ -package kotlin.collections - -/** An iterator over a sequence of values of type `Byte`. */ -public abstract class ByteIterator { - final fun next() = nextByte() - - /** Returns the next value in the sequence without boxing. */ - public abstract fun nextByte(): Byte - - public abstract fun hasNext(): Boolean -} - -/** An iterator over a sequence of values of type `Char`. */ -public abstract class CharIterator { - final fun next() = nextChar() - - /** Returns the next value in the sequence without boxing. */ - public abstract fun nextChar(): Char - - public abstract fun hasNext(): Boolean -} - -/** An iterator over a sequence of values of type `Short`. */ -public abstract class ShortIterator { - final fun next() = nextShort() - - /** Returns the next value in the sequence without boxing. */ - public abstract fun nextShort(): Short - - public abstract fun hasNext(): Boolean -} - -/** An iterator over a sequence of values of type `Int`. */ -class IntIterator(first: Int, last: Int, val step: Int) { - private var next = first - private val finalElement = last - private var hasNext: Boolean = if (step > 0) first <= last else first >= last - - final fun next() = nextInt () - - fun hasNext(): Boolean = hasNext - - fun nextInt(): Int { - val value = next - if (value == finalElement) { - hasNext = false - } - else { - next += step - } - return value - } -} - - -/** An iterator over a sequence of values of type `Long`. */ -public abstract class LongIterator { - final fun next() = nextLong() - - /** Returns the next value in the sequence without boxing. */ - public abstract fun nextLong(): Long - - public abstract fun hasNext(): Boolean -} - -/** An iterator over a sequence of values of type `Float`. */ -public abstract class FloatIterator { - final fun next() = nextFloat() - - /** Returns the next value in the sequence without boxing. */ - public abstract fun nextFloat(): Float - - public abstract fun hasNext(): Boolean -} - -/** An iterator over a sequence of values of type `Double`. */ -public abstract class DoubleIterator { - final fun next() = nextDouble() - - /** Returns the next value in the sequence without boxing. */ - public abstract fun nextDouble(): Double - - public abstract fun hasNext(): Boolean -} - -/** An iterator over a sequence of values of type `Boolean`. */ -public abstract class BooleanIterator { - final fun next() = nextBoolean() - - /** Returns the next value in the sequence without boxing. */ - public abstract fun nextBoolean(): Boolean - - public abstract fun hasNext(): Boolean -} \ No newline at end of file diff --git a/kotstd/kt/KotlinInputStream.kt b/kotstd/kt/KotlinInputStream.kt deleted file mode 100644 index ee2c40aa387..00000000000 --- a/kotstd/kt/KotlinInputStream.kt +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Created by user on 8/8/16. - */ - -class KotlinInputStream(val buffer: ByteArray) { - var pos = 0 - var mark_ = 0 - - fun read(): Byte { - pos += 1 - return buffer[pos - 1] - } - - fun isAtEnd(): Boolean { - return pos >= buffer.size - } - - fun mark() { - mark_ = pos - } - - fun reset() { - pos = mark_ - } -} diff --git a/kotstd/kt/KotlinOutputStream.kt b/kotstd/kt/KotlinOutputStream.kt deleted file mode 100644 index 51f80aaf766..00000000000 --- a/kotstd/kt/KotlinOutputStream.kt +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Created by user on 8/8/16. - */ - -class KotlinOutputStream(val buffer: ByteArray) { - var pos = 0 - - fun write (data: ByteArray) { - write(data, 0, data.size) - } - - fun write (data: ByteArray, begin: Int, size: Int) { - var i = begin - while (i < begin + size) { - buffer[pos] = data[i] - pos += 1 - i++ - } - } -} diff --git a/kotstd/kt/LongArray.kt b/kotstd/kt/LongArray.kt deleted file mode 100644 index c5953e5b741..00000000000 --- a/kotstd/kt/LongArray.kt +++ /dev/null @@ -1,118 +0,0 @@ -package kotlin - -external fun kotlinclib_long_array_get_ix(dataRawPtr: Int, index: Int): Long -external fun kotlinclib_long_array_set_ix(dataRawPtr: Int, index: Int, value: Long) -external fun kotlinclib_long_size(): Int - - -class LongArray(var size: Int) { - val dataRawPtr: Int - - /** Returns the number of elements in the array. */ - //size: Int - - init { - this.dataRawPtr = malloc_array(kotlinclib_long_size() * this.size) - var index = 0 - while (index < this.size) { - set(index, 0) - index = index + 1 - } - } - - /** Returns the array element at the given [index]. This method can be called using the index operator. */ - operator fun get(index: Int): Long { - return kotlinclib_long_array_get_ix(this.dataRawPtr, index) - } - - - /** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */ - operator fun set(index: Int, value: Long) { - kotlinclib_long_array_set_ix(this.dataRawPtr, index, value) - } - - - fun clone(): LongArray { - val newInstance = LongArray(this.size) - var index = 0 - while (index < this.size) { - val value = this.get(index) - newInstance.set(index, value) - index = index + 1 - } - - return newInstance - } -} - -fun LongArray.print() { - var index = 0 - print('[') - while (index < size) { - print(get(index)) - index++ - if (index < size) { - print(';') - print(' ') - } - } - print(']') -} - -fun LongArray.println() { - this.print() - //println() -} - -fun LongArray.copyOf(newSize: Int): LongArray { - val newInstance = LongArray(newSize) - var index = 0 - val end = if (newSize > this.size) this.size else newSize - while (index < end) { - val value = this.get(index) - newInstance.set(index, value) - index = index + 1 - } - - while (index < newSize) { - newInstance.set(index, 0) - index = index + 1 - } - - return newInstance -} - -fun LongArray.copyOfRange(fromIndex: Int, toIndex: Int): LongArray { - val newInstance = LongArray(toIndex - fromIndex) - var index = fromIndex - while (index < toIndex) { - val value = this.get(index) - newInstance.set(index - fromIndex, value) - index = index + 1 - } - - return newInstance -} - -operator fun LongArray.plus(element: Long): LongArray { - val index = size - val result = this.copyOf(index + 1) - result[index] = element - return result -} - -operator fun LongArray.plus(elements: LongArray): LongArray { - val thisSize = size - val arraySize = elements.size - val resultSize = thisSize + arraySize - val newInstance = this.copyOf(resultSize) - var index = thisSize - - while (index < resultSize) { - val value = elements.get(index - thisSize) - newInstance.set(index, value) - index = index + 1 - } - - return newInstance -} \ No newline at end of file diff --git a/kotstd/kt/Primitives.kt b/kotstd/kt/Primitives.kt deleted file mode 100644 index 3da2e500545..00000000000 --- a/kotstd/kt/Primitives.kt +++ /dev/null @@ -1,251 +0,0 @@ -package kotlin - -external fun kotlinclib_byteToChar(value: Byte): Char -external fun kotlinclib_byteToShort(value: Byte): Short -external fun kotlinclib_byteToInt(value: Byte): Int -external fun kotlinclib_byteToLong(value: Byte): Long -external fun kotlinclib_byteToFloat(value: Byte): Float -external fun kotlinclib_byteToDouble(value: Byte): Double - - -fun Byte.toByte(): Byte { - return this -} - -fun Byte.toInt(): Int { - return kotlinclib_byteToInt(this) -} - -fun Byte.toChar(): Char { - return kotlinclib_byteToChar(this) -} - -fun Byte.toShort(): Short { - return kotlinclib_byteToShort(this) -} - -fun Byte.toLong(): Long { - return kotlinclib_byteToLong(this) -} - -fun Byte.toFloat(): Float { - return kotlinclib_byteToFloat(this) -} - -fun Byte.toDouble(): Double { - return kotlinclib_byteToDouble(this) -} - -external fun kotlinclib_charToByte(value: Char): Byte -external fun kotlinclib_charToShort(value: Char): Short -external fun kotlinclib_charToInt(value: Char): Int -external fun kotlinclib_charToLong(value: Char): Long -external fun kotlinclib_charToFloat(value: Char): Float -external fun kotlinclib_charToDouble(value: Char): Double - - -fun Char.toByte(): Byte { - return kotlinclib_charToByte(this) -} - -fun Char.toInt(): Int { - return kotlinclib_charToInt(this) -} - -fun Char.toChar(): Char { - return this -} - -fun Char.toShort(): Short { - return kotlinclib_charToShort(this) -} - -fun Char.toLong(): Long { - return kotlinclib_charToLong(this) -} - -fun Char.toFloat(): Float { - return kotlinclib_charToFloat(this) -} - -fun Char.toDouble(): Double { - return kotlinclib_charToDouble(this) -} - -external fun kotlinclib_doubleToByte(value: Double): Byte -external fun kotlinclib_doubleToChar(value: Double): Char -external fun kotlinclib_doubleToShort(value: Double): Short -external fun kotlinclib_doubleToInt(value: Double): Int -external fun kotlinclib_doubleToLong(value: Double): Long -external fun kotlinclib_doubleToFloat(value: Double): Float - -fun Double.toByte(): Byte { - return kotlinclib_doubleToByte(this) -} - -fun Double.toChar(): Char { - return kotlinclib_doubleToChar(this) -} - -fun Double.toShort(): Short { - return kotlinclib_doubleToShort(this) -} - -fun Double.toInt(): Int { - return kotlinclib_doubleToInt(this) -} - -fun Double.toLong(): Long { - return kotlinclib_doubleToLong(this) -} - -fun Double.toFloat(): Float { - return kotlinclib_doubleToFloat(this) -} - -fun Double.toDouble(): Double { - return this -} - - -external fun kotlinclib_floatToByte(value: Float): Byte -external fun kotlinclib_floatToChar(value: Float): Char -external fun kotlinclib_floatToShort(value: Float): Short -external fun kotlinclib_floatToInt(value: Float): Int -external fun kotlinclib_floatToLong(value: Float): Long -external fun kotlinclib_floatToDouble(value: Float): Double - -fun Float.toByte(): Byte { - return kotlinclib_floatToByte(this) -} - -fun Float.toChar(): Char { - return kotlinclib_floatToChar(this) -} - -fun Float.toShort(): Short { - return kotlinclib_floatToShort(this) -} - -fun Float.toInt(): Int { - return kotlinclib_floatToInt(this) -} - -fun Float.toLong(): Long { - return kotlinclib_floatToLong(this) -} - -fun Float.toFloat(): Float { - return this -} - -fun Float.toDouble(): Double { - return kotlinclib_floatToDouble(this) -} - - -external fun kotlinclib_intToByte(value: Int): Byte -external fun kotlinclib_intToChar(value: Int): Char -external fun kotlinclib_intToShort(value: Int): Short -external fun kotlinclib_intToLong(value: Int): Long -external fun kotlinclib_intToFloat(value: Int): Float -external fun kotlinclib_intToDouble(value: Int): Double - -fun Int.toByte(): Byte { - return kotlinclib_intToByte(this) -} - -fun Int.toInt(): Int { - return this -} - -fun Int.toChar(): Char { - return kotlinclib_intToChar(this) -} - -fun Int.toShort(): Short { - return kotlinclib_intToShort(this) -} - -fun Int.toLong(): Long { - return kotlinclib_intToLong(this) -} - -fun Int.toFloat(): Float { - return kotlinclib_intToFloat(this) -} - -fun Int.toDouble(): Double { - return kotlinclib_intToDouble(this) -} - -external fun kotlinclib_longToByte(value: Long): Byte -external fun kotlinclib_longToChar(value: Long): Char -external fun kotlinclib_longToShort(value: Long): Short -external fun kotlinclib_longToInt(value: Long): Int -external fun kotlinclib_longToFloat(value: Long): Float -external fun kotlinclib_longToDouble(value: Long): Double - -fun Long.toByte(): Byte { - return kotlinclib_longToByte(this) -} - -fun Long.toLong(): Long { - return this -} - -fun Long.toChar(): Char { - return kotlinclib_longToChar(this) -} - -fun Long.toShort(): Short { - return kotlinclib_longToShort(this) -} - -fun Long.toInt(): Int { - return kotlinclib_longToInt(this) -} - -fun Long.toFloat(): Float { - return kotlinclib_longToFloat(this) -} - -fun Long.toDouble(): Double { - return kotlinclib_longToDouble(this) -} - -external fun kotlinclib_shortToByte(value: Short): Byte -external fun kotlinclib_shortToChar(value: Short): Char -external fun kotlinclib_shortToInt(value: Short): Int -external fun kotlinclib_shortToLong(value: Short): Long -external fun kotlinclib_shortToFloat(value: Short): Float -external fun kotlinclib_shortToDouble(value: Short): Double - - -fun Short.toByte(): Byte { - return kotlinclib_shortToByte(this) -} - -fun Short.toInt(): Int { - return kotlinclib_shortToInt(this) -} - -fun Short.toChar(): Char { - return kotlinclib_shortToChar(this) -} - -fun Short.toShort(): Short { - return this -} - -fun Short.toLong(): Long { - return kotlinclib_shortToLong(this) -} - -fun Short.toFloat(): Float { - return kotlinclib_shortToFloat(this) -} - -fun Short.toDouble(): Double { - return kotlinclib_shortToDouble(this) -} diff --git a/kotstd/kt/Progressions.kt b/kotstd/kt/Progressions.kt deleted file mode 100644 index ec9bbb3ec09..00000000000 --- a/kotstd/kt/Progressions.kt +++ /dev/null @@ -1,50 +0,0 @@ -package kotlin - -/** - * A progression of values of type `Int`. - */ -public open class IntProgression -constructor -( - start: Int, - endInclusive: Int, - val step: Int -) { - init { - if (step == 0) { - println("Step must be non-zero.") - assert(false) - } - } - - /** - * The first element in the progression. - */ - public val first: Int = start - - /** - * The last element in the progression. - */ - public val last: Int = getProgressionLastElement(start.toInt(), endInclusive.toInt(), step).toInt() - - - fun iterator(): IntIterator = IntIterator(first, last, step) - - /** Checks if the progression is empty. */ - public open fun isEmpty(): Boolean = if (step > 0) first > last else first < last - - //[TODO] equals - - override fun hashCode(): Int = - if (isEmpty()) -1 else (31 * (31 * first + last) + step) - - companion object { - /** - * Creates IntProgression within the specified bounds of a closed range. - - * The progression starts with the [rangeStart] value and goes toward the [rangeEnd] value not excluding it, with the specified [step]. - * In order to go backwards the [step] must be negative. - */ - public fun fromClosedRange(rangeStart: Int, rangeEnd: Int, step: Int): IntProgression = IntProgression(rangeStart, rangeEnd, step) - } -} diff --git a/kotstd/kt/Ranges.kt b/kotstd/kt/Ranges.kt deleted file mode 100644 index 4c12faa5e3d..00000000000 --- a/kotstd/kt/Ranges.kt +++ /dev/null @@ -1,25 +0,0 @@ -package kotlin.ranges - -import kotlin.IntProgression -import kotlin.collections.IntIterator - -public class IntRange(val start: Int, val endInclusive: Int) { - val progression = IntProgression(start, endInclusive, 1) - val first: Int - val last: Int - - init { - this.first = progression.first - this.last = progression.last - } - - fun contains(value: Int): Boolean = first <= value && value <= last - - fun isEmpty(): Boolean = first > last - - fun iterator(): IntIterator = progression.iterator() - - override fun hashCode(): Int = - if (isEmpty()) -1 else (31 * first + last) - -} diff --git a/kotstd/kt/ShortArray.kt b/kotstd/kt/ShortArray.kt deleted file mode 100644 index 7b7023ba9af..00000000000 --- a/kotstd/kt/ShortArray.kt +++ /dev/null @@ -1,120 +0,0 @@ -package kotlin - -external fun kotlinclib_short_array_get_ix(dataRawPtr: Int, index: Int): Short -external fun kotlinclib_short_array_set_ix(dataRawPtr: Int, index: Int, value: Short) -external fun kotlinclib_short_size(): Int - - -class ShortArray(var size: Int) { - val dataRawPtr: Int - - /** Returns the number of elements in the array. */ - //size: Int - - init { - this.dataRawPtr = malloc_array(kotlinclib_short_size() * this.size) - var index = 0 - while (index < this.size) { - set(index, 0) - index = index + 1 - } - } - - /** Returns the array element at the given [index]. This method can be called using the index operator. */ - operator fun get(index: Int): Short { - return kotlinclib_short_array_get_ix(this.dataRawPtr, index) - } - - - /** Sets the element at the given [index] to the given [value]. This method can be called using the index operator. */ - operator fun set(index: Int, value: Short) { - kotlinclib_short_array_set_ix(this.dataRawPtr, index, value) - } - - - fun clone(): ShortArray { - val newInstance = ShortArray(this.size) - var index = 0 - while (index < this.size) { - val value = this.get(index) - newInstance.set(index, value) - index = index + 1 - } - - return newInstance - } - -} - -fun ShortArray.print() { - var index = 0 - print('[') - while (index < size) { - print(get(index)) - index++ - if (index < size) { - print(';') - print(' ') - } - } - print(']') -} - -fun ShortArray.println() { - this.print() - //println() -} - - -fun ShortArray.copyOf(newSize: Int): ShortArray { - val newInstance = ShortArray(newSize) - var index = 0 - val end = if (newSize > this.size) this.size else newSize - while (index < end) { - val value = this.get(index) - newInstance.set(index, value) - index = index + 1 - } - - while (index < newSize) { - newInstance.set(index, 0) - index = index + 1 - } - - return newInstance -} - -fun ShortArray.copyOfRange(fromIndex: Int, toIndex: Int): ShortArray { - val newInstance = ShortArray(toIndex - fromIndex) - var index = fromIndex - while (index < toIndex) { - val value = this.get(index) - newInstance.set(index - fromIndex, value) - index = index + 1 - } - - return newInstance -} - -operator fun ShortArray.plus(element: Short): ShortArray { - val index = size - val result = this.copyOf(index + 1) - result[index] = element - return result -} - -operator fun ShortArray.plus(elements: ShortArray): ShortArray { - val thisSize = size - val arraySize = elements.size - val resultSize = thisSize + arraySize - val newInstance = this.copyOf(resultSize) - var index = thisSize - - while (index < resultSize) { - val value = elements.get(index - thisSize) - newInstance.set(index, value) - index = index + 1 - } - - return newInstance -} \ No newline at end of file diff --git a/kotstd/kt/WireFormat.kt b/kotstd/kt/WireFormat.kt deleted file mode 100644 index d43c6e37003..00000000000 --- a/kotstd/kt/WireFormat.kt +++ /dev/null @@ -1,164 +0,0 @@ - -object WireFormat { - // couple of constants for magic numbers - val TAG_TYPE_BITS: Int = 3 - val TAG_TYPE_MASK: Int = (1 shl TAG_TYPE_BITS) - 1 - val VARINT_INFO_BITS_COUNT: Int = 7 - val VARINT_INFO_BITS_MASK: Int = 0b01111111 // mask for separating lowest 7 bits, where actual information stored - val VARINT_UTIL_BIT_MASK: Int = 0b10000000 // mask for separating highest bit, that indicates next byte presence - val FIXED_32_BYTE_SIZE: Int = 4 - val FIXED_64_BYTE_SIZE: Int = 8 - - fun getTagWireType(tag: Int): WireType { - return WireType.from((tag and TAG_TYPE_MASK).toByte()) - } - - fun getTagFieldNumber(tag: Int): Int { - return tag ushr TAG_TYPE_BITS - } - - // TODO: refactor casts into function overloading as soon as translator will support it - fun getTagSize(fieldNumber: Int, wireType: WireType): Int { - return getVarint32Size((fieldNumber shl 3) or wireType.id) - } - - fun getVarint32Size(value: Int): Int { - var curValue = value - var size = 0 - do { - size += 1 - curValue = curValue ushr VARINT_INFO_BITS_COUNT - } while (curValue != 0) - return size - } - - fun getVarint64Size(value: Long): Int { - var curValue = value - var size = 0 - do { - size += 1 - curValue = curValue ushr VARINT_INFO_BITS_COUNT - }while (curValue != 0L) - return size - } - - fun getZigZag32Size(value: Int): Int { - return getVarint32Size((value shl 1) xor (value shr 31)) - } - - fun getZigZag64Size(value: Long): Int { - return getVarint64Size((value shl 1) xor (value shr 63)) - } - - fun getInt32Size(fieldNumber: Int, value: Int): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getInt32SizeNoTag(value) - } - - fun getInt32SizeNoTag(value: Int): Int { - if (value < 0) { - return getVarint64Size(value.toLong()) - } - return getVarint32Size(value) - } - - fun getUInt32Size(fieldNumber: Int, value: Int): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getUInt32SizeNoTag(value) - } - - fun getUInt32SizeNoTag(value: Int): Int { - return getVarint32Size(value) - } - - fun getInt64Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getUInt64SizeNoTag(value) - } - - fun getInt64SizeNoTag(value: Long): Int { - return getVarint64Size(value) - } - - fun getUInt64Size(fieldNumber: Int, value: Long): Int { - return getInt64Size(fieldNumber, value) - } - - fun getUInt64SizeNoTag(value: Long): Int { - return getVarint64Size(value) - } - - fun getBoolSize(fieldNumber: Int, value: Boolean): Int { - val intValue = if (value) 1 else 0 - return getInt32Size(fieldNumber, intValue) - } - - fun getBoolSizeNoTag(value: Boolean): Int { - val intValue = if (value) 1 else 0 - return getInt32SizeNoTag(intValue) - } - - fun getEnumSize(fieldNumber: Int, value: Int): Int { - return getInt32Size(fieldNumber, value) - } - - fun getEnumSizeNoTag(value: Int): Int { - return getInt32SizeNoTag(value) - } - - fun getSInt32Size(fieldNumber: Int, value: Int): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getZigZag32Size(value) - } - - fun getSInt32SizeNoTag(value: Int): Int { - return getZigZag32Size(value) - } - - fun getSInt64Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getZigZag64Size(value) - } - - fun getSInt64SizeNoTag(value: Long): Int { - return getZigZag64Size(value) - } - - fun getFixed32Size(fieldNumber: Int, value: Int): Int { - return getTagSize(fieldNumber, WireType.FIX_32) + FIXED_32_BYTE_SIZE - } - - fun getFixed32SizeNoTag(value: Int): Int { - return FIXED_32_BYTE_SIZE - } - - fun getFixed64Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.FIX_64) + FIXED_64_BYTE_SIZE - } - - fun getFixed64SizeNoTag(value: Long): Int { - return FIXED_64_BYTE_SIZE - } - - fun getDoubleSize(fieldNumber: Int, value: Double): Int { - return getTagSize(fieldNumber, WireType.FIX_64) + FIXED_64_BYTE_SIZE - } - - fun getDoubleSizeNoTag(value: Double): Int { - return FIXED_64_BYTE_SIZE - } - - fun getFloatSize(fieldNumber: Int, value: Float): Int { - return getTagSize(fieldNumber, WireType.FIX_32) + FIXED_32_BYTE_SIZE - } - - fun getFloatSizeNoTag(value: Float): Int { - return FIXED_32_BYTE_SIZE - } - - fun getBytesSize(fieldNumber: Int, value: ByteArray): Int { - if (value.size == 0) - return 0 - var size = 0 - return value.size + getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) + getVarint32Size(value.size) - } - - fun getBytesSizeNoTag(value: ByteArray): Int { - return value.size + getVarint32Size(value.size) - } -} diff --git a/kotstd/kt/WireType.kt b/kotstd/kt/WireType.kt deleted file mode 100644 index 4ffc150fa68..00000000000 --- a/kotstd/kt/WireType.kt +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Created by Dmitry Savvinov on 7/6/16. - * Enum for possible WireTypes. - * See details at [official Google reference](https://developers.google.com/protocol-buffers/docs/encoding#structure) - */ - -enum class WireType(val id: Int) { - VARINT(0), // int32, int64, uint32, uint64, sint32, sint64, bool, enum - FIX_64(1), // fixed64, sfixed64, double - LENGTH_DELIMITED(2), // string, bytes, embedded messages, packed repeated fields - START_GROUP(3), // groups (deprecated) - END_GROUP(4), // groups (deprecated) - FIX_32(5), // fixed32, sfixed32, float - UNDEFINED(6); // indicates error when parsing from Int - - companion object { - fun from (value: Byte): WireType { - return when (value) { - 0.toByte() -> VARINT - 1.toByte() -> FIX_64 - 2.toByte() -> LENGTH_DELIMITED - 3.toByte() -> START_GROUP - 4.toByte() -> END_GROUP - 5.toByte() -> FIX_32 - else -> UNDEFINED - } - } - } -} diff --git a/kotstd/kt/progressionUtil.kt b/kotstd/kt/progressionUtil.kt deleted file mode 100644 index a03312f71e4..00000000000 --- a/kotstd/kt/progressionUtil.kt +++ /dev/null @@ -1,71 +0,0 @@ -package kotlin - -// a mod b (in arithmetical sense) -private fun mod(a: Int, b: Int): Int { - val mod = a % b - return if (mod >= 0) mod else mod + b -} - -private fun mod(a: Long, b: Long): Long { - val mod = a % b - return if (mod >= 0) mod else mod + b -} - -// (a - b) mod c -private fun differenceModulo(a: Int, b: Int, c: Int): Int { - return mod(mod(a, c) - mod(b, c), c) -} - -private fun differenceModulo(a: Long, b: Long, c: Long): Long { - return mod(mod(a, c) - mod(b, c), c) -} - -/** - * Calculates the final element of a bounded arithmetic progression, i.e. the last element of the progression which is in the range - * from [start] to [end] in case of a positive [step], or from [end] to [start] in case of a negative - * [step]. - * - * No validation on passed parameters is performed. The given parameters should satisfy the condition: either - * `step > 0` and `start >= end`, or `step < 0` and`start >= end`. - * @param start first element of the progression - * @param end ending bound for the progression - * @param step increment, or difference of successive elements in the progression - * @return the final element of the progression - * @suppress - */ -fun getProgressionLastElement(start: Int, end: Int, step: Int): Int { - if (step > 0) { - return end - differenceModulo(end, start, step) - } else if (step < 0) { - return end + differenceModulo(start, end, -step) - } else { - println("Step is zero.") - assert(false) - return -1 - } -} - -/** - * Calculates the final element of a bounded arithmetic progression, i.e. the last element of the progression which is in the range - * from [start] to [end] in case of a positive [step], or from [end] to [start] in case of a negative - * [step]. - * - * No validation on passed parameters is performed. The given parameters should satisfy the condition: either - * `step > 0` and `start >= end`, or `step < 0` and`start >= end`. - * @param start first element of the progression - * @param end ending bound for the progression - * @param step increment, or difference of successive elements in the progression - * @return the final element of the progression - * @suppress - */ -internal fun getProgressionLastElement(start: Long, end: Long, step: Long): Long { - if (step > 0) { - return end - differenceModulo(end, start, step) - } else if (step < 0) { - return end + differenceModulo(start, end, -step) - } else { - println("Step is zero.") - assert(false) - return -1L - } -} diff --git a/mcu_utils/fw/README.md b/mcu_utils/fw/README.md deleted file mode 100644 index f0d48cccbc3..00000000000 --- a/mcu_utils/fw/README.md +++ /dev/null @@ -1,8 +0,0 @@ -Warning! -fancyblink and stm32f4-stock firmware doesn't work on our -STM32F407G-DISC board. - -stm32f4_usb_cdc.bin is a number crunching fmw -that communicates with PC using USB virtual serial port. -You can cat /dev/ttyACM0 or 1 -to see its messages. diff --git a/mcu_utils/fw/fancyblink.bin b/mcu_utils/fw/fancyblink.bin deleted file mode 100644 index ff076e55e65b54c5447121695594e432083161a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5264 zcmd_se{dA#9mny#ALNn{$dM2NLC7T}1vE-bQb7<57m`2{2oOQ22q6^AKnE#hz(yQv8$IG9r{$K5`sf%@x7CjR&Hwv$>)y2T%79UmR&DGy0-myuZ3Qo04^Df|XJnmgiv646Hxg`x@A6D;e?L$fQ(IhH`JsQYkyR9Q zwuD?6C(?tDx4v@4mFPTO+1%jr?Rmb$=6|T%D zOIfqaRoWcq(r-5ShLtq+`U(((WSg+?MBw>Ee&S(HfuNcd2!)KF{Uv zP;Q3-U9HU?zS?%@bg(Bg;IO-ky6aASPW~s{cWqvhx4FJhy`S~f=Xslrs6K+V}ZuIA8m|K)_C)+d3|GuhSE1Sr*dw=#atp_K<_`Z-&1|glx1M z!~Onnk1u@W(QwaiLw1i5C}?$Y%=++=o5TIvLZO!Qa4U-=LM@Ml9A(^dwWG|*ckF&+ zT(+Gl?lHEOIh{n?^m(OmPJI`}*)ohkx?u|%0mqg4BFA-Sep;%7Qv%V_iMDi( zkVxBY>O!<6)0VEL6ryxPs;N7%hbfIHx0rendm|klWSBCEeUNSX60tA(p+9a#j_G#d z9mvI<$U{E9jJq%pgK#&7;2sRay(q+Rj6g9;P>N9~M+L^965~*X37CjUn2ZPTAf}-j zHTWuKp%%08HO$34%*O&O#3QJ~Vl2T@EXN8oU=>#5yI6~LSdR_Zgho7rt@ts1f*sh2 z-PnT{@d{qWe)wQ$Q#e6J89lnKSSbnlCgLlYiW!)NId~Y~z#=?~C3qYSSdFz%59${hzKubUnH*(KTAv{1@7~ zk2BDH>Hc)Dy65B2{U3$KL*w!WG)@|?*Kr6MM~$b(RpYC1)_7~&HU4@IdLGYX7k&;s zFFiLsKRw4Scp8n+bKZdO<4Nc}(EFhGq5)4}8J0lrkKUt2(0ir#YcBM@)nX=UFcniU z855xQbqw_Wj>HIfq4#?T1|lE1$bsfVHZqZpo=8P95|MydbbtZPH_bcEzpK!E)V$RE z)I8OE)x6dG)jWO!n%A1&n&+=!A6|m;z%J~-b|_CMUu=Z(hw_N>iSml_OFb6j5iEf6 z&}_^?4V0&puavixzm&(6&y?4c-<0Q+@09nH|C9%n50w|wp*)#_By@uEsPd@+S`V|K^|3e7kP5Az zZfHG?Lkt{H(W!M;>#x?~f8rm|`mA;OJzRhvTF1}gB#uMtyw-cI`&$212ONOv0@Vkq z6JEw%sD4l#p?X4fh3boEu?^3l5voHr;wh*;QJtcCWerrnti%c|$5Jf8V|Wy*e-=XZ zkm@4UN2-%lFU^MPC)H6iQG@B2h6ka#YclS~M5r#Sg6gzNj6ns;pn9$ps_#_m6=66E zaW7O44u$H&yDrCK3ACkSgm~H#7a`VcD~ih$LyXpezGzOf zPf;AE$hOs|X#Wq`I7X~vt!*o^E4<&@R@5glTJ0NqzWDoQ$K7oI7oYjRuqUaG7o*Pj EH)+m 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

    _Jrl)kIH@3CbPie1fXld<8Tm7V2!|4&Jl4f#Yg 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 diff --git a/mcu_utils/fw/stm32f4-stock.bin b/mcu_utils/fw/stm32f4-stock.bin deleted file mode 100755 index 26e8c0b08a5fedeedad738d721029469dad712ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2097152 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

    I?eEU%PG%)pRTK2w5OtbA5Y3S{f4#)<*&3ZX$g z2H-J|w1lt#w3OpNmHFH0Wy6#6mMo1diR3N`VX~rX(%`gx$3lufK zFMEyz^Pp_k4Px|RX!bwu36`mUg7lt+te%IP%qk6WQ2s%G+i8`0MC}+R)#s z0oNE-C^CGyaf`|gY-~AN*%Hoa%?U3JRdwd(hM^=ak;RcE6^Fx3c_rc2PBl;ppSd^^ zff7K~pyiPZfqxMCYP*QCtU=uoRFi}JD{C755>fS)hQcZq9~w~;kBq2YrRUYt$~zyA z8p3v<#(PABy7@ zs(nyp1#{J8tgC~n^^}@TdPP{-o_X{cRTX?j%?q}v?7+r2x{603rTox+&yceJl)th} z^r3f9O@h?6oC0os9)x%soWixIB8%HXk+PwOG3p^mZaS9LB~dOpWn9TT;GBu9mnAjR zLS>;6vh7)1Q<}F9`WZrB@Bo}%P#Eb#%g@`ZAGzt8pMA2ra1o z+h3~QuwZP*#-s3(zqI0hl^QQcjB#$q%j(Mkc(EO@>1}GSH;BHvg3n(#dn zN&~-y@2Ls3j_ez1$EO2P2iz&g^cepPwP|BlS77aa=I+waP^bjUb6lO@5m>R!)x~-L zpjvTC-Lt2(6@2`9=gaEtyWml_sgDQ`?dm`78dQIuI;eiS{kQ6Tp!69y0`D@9h)6x` z8nhA21qkNMj?&H_3;{E!zO*Mu*1m$lJv4x6?V?3c=@9&>?MGS>X5@fa_;#& zu}z3qsoUd2HPCd7$6Lcc63RduT0^<{iz_kyycTuE%j)Egcu1WL#MO*=$a~fF%Eer1 zBIRxB?CvA#w1WI6mcl*bzlwW8G#0P_h<~f7-ZST;>qf#qC}lU{;&6W8wzftZ85XH$ z&x;a-+(o8u#D zao|8{+mgH=qOXd)mbQw06&3p{+O-;c#n{+|7yV0;D)HMA$?pob-dj}mjymNDs(-qB zP^AZ30ykkv$<0$M2GzH%(u$mN{3mvC3`(sgy&TG0QW01wtvgGh^#~ew1=~VpBR{4q zTpW5woxK}g;Kxw#H1A>$?L2KTq_t^ViS{WIgRfMm??Wd}`h)64EIeOE`itIRS^nZs zPBfI0lMffAK9Vkaw-tSPhA4{}gRNQ^>KfR8Q9SS;4QkoTaE*h%S4Z}oDjv=WAFBYr zSP|8q`bw#77d*j5`Re1ahId-SIpxnTDpP;3jy$6dV0jtY6Mv_C1pl2^*OjXO>5JP9 z)Jp-lvSpuh<75w zSYE;KT95oSVeH>{zc(ga9d`@KU18GJ6!9lES-E+^a3ZKpET(!||m>Ik`�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 diff --git a/mcu_utils/linux-arm/st-util b/mcu_utils/linux-arm/st-util deleted file mode 100755 index 318c5e6340f324dc96322ad2444e4dc9a729504d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252196 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�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 z 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%0A1Hd%^mg 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 aC#9qvtpe7JINpu(TMM7meM2uE`u_*D58>tj diff --git a/mcu_utils/linux-x86_64/st-flash b/mcu_utils/linux-x86_64/st-flash deleted file mode 100755 index 4f51f6cb502979d934f0a433ae8e9a7295f4fd4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252472 zcmb@v4SZC^^*4Su2@(Q&Bceu&dV!!pdC3AQLC`GOz)ejM2`EZw2+0N_AxX2l5UbV1 zO@!+j<)^mtYptbft!=Ght-OSi7Xpc|E#OP>r4kW!mdL9LC}5uNIdkvs-AzJ$p8tRI z$=*9NXU?2C=ggTiXXf6$H#>KFoWr45pE%`ug;MJ-$>c2gttcCJ#B-XyGL=cn0DNDr zj8M)(x*z9J36*6=T~C;(t!pBeDhgps!2hH;nK3CYlW(l+P?@b*SBpZrQhSk4rg#8UkXHY$&RXNB>To=k4^SaJL%0N`4aXFDkSt(|{6cgUMb`oNItgF>O>Kpyf zG5a?sE)ywAXVOJ+^LOM*u=JVrnXj1c^;S;en#niTb)pGqU9EaIqh6SFS@n$H$!6(n zv%S9fqL}nsSF^jyxU$kk*GwE&Ry?MxwA^1krh3vfW3HJv)>|=lJolUM6YPwcbGapp zj~Y@$^AP-#4p6zPZQ07qg~v}G8F}g4vFGMZ|J7BGZKkrR_$M6HuT`y@L+LkbAmwG^ zKMVh9mpnLhTK2nNZvOOjO_mA9x!3!1KpG;Pd*R|H(e^yx9jm_xAxmwGaF`eZa@{0Y3)xYxs}-{Jal5 zPxL`&OCRt8h%?*q@j`pCb!k9=<*biUmOJzag^+204AJNm%0uMa#^`pCbm zkNl7OX!n6W+MV48e0Lx4^?krk0lbF)*iT0vbY9*^{>eV_|IkPNEHtRaHj1>n4?X!? zAM}6S2mWz=;CUJF=PDN~Enh9<)~)%p81Tu;Manue-y&@V=U=QSUrTr^f2o-t3%`%) z9H{8$Wm=$o{g2shXH2_qp>(jKDhZEA!z-Bo{N6=loMY2z(o0tga^~a}6nm;Xi%Y#e zPt}~ftg?!7&z!-BhL^h6*Yw zJ>|f^ytK$uu%gtrq+oezaY1Eiu}Mh5Vvo-%F7|kfs!A(;6;<}aqKfj8(#8I&LSJb` zxm8e9R^bJGC8g!1R@Nea+0p`ERbjce#1n#`A0TOjy zUsY-OVt`xJ6%=}lO2h3^2QBbokFT(3Nx@Q2Rk^3Ept!1Zd4v>CRaHe*L3!aaj|E*+ zR#>{MptKxpFDWbvXH%PyQ9-$X*`i2w8=ne`i>o|dZv>5}u&Q85VOh9);7a(Oy3{KR zqlhdhEb@U^3#F%8A}Asqxkf1|Df4@mKpiT<313M;(UPT#w{&rNVVP3t_dy9rMT(YE zenClLX_->EsG`b;Y|;^^4(EZ5zKSws*|Ne)rKqs1tfB}2U`lyK0q&)AmwA>IEvrO+ ziM=IXafRQfl%T01g&->LR2Z2b*d!t_$5Xx>xlrUPWtqR68UdDS(B)J7-ZGD;QYl$c zRq7+9mN>W<)N+}x6fyzEq9s)*U2bn1J&U5GipT>f3lqRl@*;D5EGsN6S4gpx0#9+F zuMnk+yk1#|tny-IMsCiutb*}lofE^ik-G_FBlqLSUQL5Lj{oBM+e#-OMI|yVVeH>= z?443MEes@V1e$VSVE7|*W!*?Ex{FgB<{#b3j|1NCRj86|rXTyCU%|cYr`*l<3Vv~E z>DlBVuQb!Xi%JKOr~E%=+J7;nue2IyZE|&cy>d9xeK9+r>{ApGu zt|^BXa;iVREm|oO{>-!GCxvqrWuYy9pe=uiEq{ztjeQ!j^xTEnhjZkW-{18sEvUL|gta zTYj=Ff4D6_#g;$9map0JQ*HTaw)~N{{B&FX<+l7uw)`t>`I)x-G+VxI%O7RSpJmIx z(w0BZmVcEkf1xdZv@L&$EuYpL)~C{zKi0~`wc3_H&X!+e%TKrEud?MkZTYKh`QvT* zYi#)wZTV|$`E1P1vgd61*Vy3K+48Tog>j6H8>6rZ?2W>7P@YOm1i$r>iJUrZ%*e(|1ssOl)X1rx#J0Olzoy)3;NahD)fD z)3Yf}ZgyxPr+-XoGOeLmoSsH$GO3|VPEV#ZnbJ@?r^i#8OlU~s^p%t*(-}(U^l(a( z$qXr+zL?TvDnp0AN5;s(lqM4y>g041rO7mgc5ph5(t|18!s+imMEX2RujBMlN|Ol; zt>yH7N|Wget>*MzN|VV8)o}U)N|UJzRdRY4rOCvF7IOM^N|R{|&EoV{N?%OrOinja znoLbhRrO7mf)^hp|N|Q+nt>*M1N|PxH)o}WDN|Ol+RdRYZ zrOEV!7ION>lqQoCn#Jj9lqORX%H;H9N|T8RrE_{brOC8}G)`YhX)-CHWKIvKG?|i+ z!s&}CO(rCC_!P^Z(quY9ot#dhG?|Rh4o=5WdOW3DIQ`uRNKc^jI!+&@G?|RhT2Ak$ zG?|LfYEJK^G?|D{4W~b#G?|7_rL4bOQ%Y7N%^%mTu3OvlxzIl*h2N27>=fQ4Npz&*ZIeWYd5R)4Z9aL|zx=t!h8G6qy(B2}P~ z3BdZnK$sJ}HPP9k2VU#ejej3~K|j7Tx1q4xb!?j>+xSea-vzAM_50LS9?+#XfabiS zea-{A;Z9A|jkc~q>Sapc^x5~`z<6FmCk6xT?$qQG^fY;zx*=h>^H?Jd&A@gL^JSbK z=yH^xcCz>etXq|JwkvQT?#_ScK_CRdaUeJuh`}NCp#n6X7rdf*DiKZQC)fC#=q^NW zT!HW7)Vklmh&c~rJNLPo$h>7c54ak#9j?IkIOnk&gHsN1%Q?Y>4klRag7)Oq@5?c^ zt993)YH&(w6LChA`ibk?P^Q*BfL4PEsZHxH%~YBRYpyYJ02Ih&)TK^b?NG!}5H3r} z1c|f5NwR3-`;*<>xyBdba@dRd7Jo9`{~B_vZ&B+%06I!1p)7DB&c}t9n1!7v1Q!wr z@E6p>+JB@@L3`(c9<}asv+89My6$PT)%+JQCh$hLxZ^w7=2qBH!v6qlv$0zbLfMM- z2~zdc`cvpJrW1Ys0@qJm3tT^S6|}hr{ znjy63p=(6lI)I|MA9y7t5wF%i7Lf#T6p{%23|OezN6ZPe{#@W9xz_Ka`oX%?pP+Z{ z46$NJPJCVJLP{9>^^6_r%6|fq04gPbx^fY45>Ryn=>D0=(}TX$MAV{Y>VHH`?Kaxf z`Uxm%J_)MDtZ%!!L!W?ks%Z zMlW)L&vOrThX5Nkf-FT>rwi_+ZiLK!{s$8S_tSq<^95_r$1-Z~G^uuQaiVJruqzk^ z@vQsKV=mV4oZyrW@iw}y8{0#>p|J!@ojxWjgtj5i`C;I0m=U#Z9gv~(%mgtNeI!ow z!!`6Plwj28#s_lXtewdNC$tsSn`fE~`0zLgDl-YfkYtiViwLB|1ldR+IRI&HGjpD$ zoNJNeg1sVJu53}$(C{*C{e-h>Da$(~ocF97>>iF%nE>%I+NEmY>}V<--) z2Tq)$8=o!zkQ$cqpfa@SBMOn~BUTMi#E8RrpbM@MTjG*=Vcp%U*#kGnX zbVs|s^LyXADTb0n3eciEs_r zOC{TVg`^tk+0NIT-7aJICTgyc+uZ&&lmRdpu{lOUs&5|6k?ABnOqIqSqf4Ck4Jp=x z+*;Vq8@v5W_1bM~frkuzTghrYcy`7+n$k!PG>_Wm1;2)bKLZI}8^AA=Uqt2Shs(>T zd^?pt&gE0TeH*+oLXCMSU=--wD^y-1&HbXPdw-{<7{1g~buIp3>Uwu-_p1JM z`F_<52VGCEnh{6WQ>$jgx2=|U41fX#03ZW&69DiTz*k}-OqLiJ9ta#LCrsh`ZIEw@ zUUbYR5HQTy0yNWr1|(gN8rR0J!dy!?ak%M6HxAsKrLIr77T5lIa87C>m^y@IO7pUR zG$zj!@Y4k0%2bCd6BbmKc>8y?h+{`tWiWp7;a?diH|6~{Q)#@97`O&s&9{Tw;%CdC z74;wbhUh_ziap(MefG=`U5BdR`+QUX^SLTeG|u~-S&>md22QHaRp;x$%;fG)l0*c) zIu_nxhp%Y?3EiEmBk+H)2($3-EVJX+V)3`d!v8)BK3&4k%{RUQ^^tDV0F>-_9|+Km zJ7hKEAi9r!Ork~a`~_@Mh=1Y!e;wPNGpfBz*`B(7M!LHGCZ}87Fk`&B;ogbH);AI_>@cP$#MrO75dzkNq1+GZ z0*esTKflys(iYg6?(SK$$iJZ0^oEyL!(&0OjP1gMqG0d|q+Q%0*Tz5s#(Il|(n7ZY z=z_tu1h}uULK5#1 z#G{0xewS}TFhH%roVhZFDxSjlm{X$;QYaug03t zII0_8H7Qy`r*51kT@rspbLf@ttl)WI_aHd}Bp>M>4i~1H`3stqd5+AO`3&fQ>wwY; zM9F%?oYaI^(l!CQQhpE5D9&s;dA-)Zcn88Fs2#Hzt zb8dc9@|3ttm>@7HC6+hAmGhw3ffMn*WaqKKiG)n`vG#_EuOw@zLA<0!lHhFxA0@bk zX{WJpyQpPkO?UUb0Z~&=lSo|+lr!*Myju4XZkz`K-w~GW4Ws{>pv7f2j&Ll_<_?Qp zz+)V2{EKnuEkfHyXaj_n2|P0m_rrsezyT58g9g7_s`1WPEms$lCqhd>n$6@=(4PT8 zreK&#|7uGDxD%QSMoJtT!#F791i8IY0w)l~a2Ld7Uy{&c#{)be3Unj~AEw^KvN-T< zyl+w9+l0nU;M+)>L&P5A?M!w30oA=5dFS3a^ z>l;bhHn%64PC1}WJ_SBG(KH0$m=s@kbiEn&cLT3ESU-)|N&Y?Qr#Khp+P!o0Y4pGC zY{`)}&G<%+e7EsQWAg9q(}lRR7zQ=)X}o`EPB0tGei(#Yc+$blN>GHUp8^!!o$$kJ zUPFv~!yAp0s6M&HP{%1yK`|p_m#?!0M)0)pHte$0;e%lvWC_`d?4)W2a4~xjQ6P9ImXv>^S3A|uxo)Y)AZoV zB~X9eK>SOe%DJ?BH%>S|)B`Q)Mp^10TG*v@-NyQw+c4!S-DuTEy`P(LLRYiiI@TJW zW56=J?n~4gZcfkxdr#>>;Bp(s)D64D5R5?G_&6tiVk%{){H?@Jv7>wZP9 zaWaSWP|s+qdJ2q8bGF!GJz;rL2@hv`p>00Kchdfxw*YV zimuuwx>{(Dc<>8w)7Bo%hkZGSsc07>&p~@^;H8IHQv*$qngajzO!e2Ianv6WQ-8I+ zzJ2~`oEFtlRwmSct&rP~p1EqC0~WN8`V0p@#`p?q81bQUjCUI60iiHZ-*T~x_Zyc* zH6oUxG;ngric3i~b1@h`=DD6`$C_2#2I~vfX+LY%l*UoWlIyq~=$*I(DlnhrDJ>z{ zyED+EJcT;nE<6)GAELA&Yaa~B@~a?Z-`Iw%&cKPwR*Y%zY9@&h0@r{VIfFM1!EM*a ztDA<=^*xZgbvwvSM@o{L_7s{f$5^tHo2k%1a<-5ZF@o7+Xj}+LjHpD6XN(ADD0fL@ zE<6+A!%=Dyo=k*aZ4y2)&}I@IGCsh-2lZg>TE$W#X>P1|#b&1eU!Xs(7y4g-_LAz^ zMi6_Mz4OeIlf-u_3Bl3`Hr0^ijlm)41v>``|_W?|zEIu{+`_(z+jNMLef z8foiJs$?P-<)IHhqsB~tnlQHaW3ja@K=YR=GU^nOw{3l>0UgVlWNIzw9z-?iop#UC zA$qI@N0BLqfOxS4#Xl)FAgAW8^xFAga;!cz(mn$L&BjDeQ~CbG@WlpO{Aq4!AESs{ z&bI?$G8gvCWxU#WE%kwf zFW%lKql%LK_e{)bC_@11Lv?)~`ZIMq>Nr~(XIkKaHiwQ)9`ReMb=?!GRO{}yrIUa5 z8UWLIYm@CaqEe_BfE2Gd13%{watfE&`8nk$5q_r8N^m>;oz2v%xO*oAgOhM$E(`0d z>Xs-RRMq0U#XsWOZn)xIravrosVrQV%o+y8_W7`CTOog&yf;1-p)aMGcI9IIH}Mdv zQ45!o$PwN!J{KpCz+an^TKh#e1Y6sEZUUT>&9v2{)@k68IJpQ_>RS-_Q|sIG;H z{%yz9E96akX5w+R?hD|m-=)^?!By`F&~6N!5excLf^(CnY5)!94K;WT6r78uUM5c` z=*Lb#uo`#9qc!+O_9|S|y4O(IjZHK?n3pJ>z{cdKO;$0Rz)wFsGd&m}Jh{OjH7E@s z<6FX!k4aH=X5|{MB50hHW4t;m2Up;55{|$&jaE4Jc%52b2KvdsP%vUcZt7W~rXlHdq)Su7%zJg)|-l z-#PS)cGd1B{_C|{=_sE?6zwXlW(AN7ej4wGpiHo*BM*bVshI%xT@z$&3cZXa6ZBQ; z^X{iC{$GlYf_LA{Gba%~6alynRukH8Y^JY}k5-(6Qq8gStMGU*>%S7NUjwSdSsz>c zV*gm~ee;rArww5Zx;H4i=^ZsnCP8}EF1Yv|+yjhhwT_;u2tG=>eI075E2o3u=;xr^ zU|DKfu0yEzJxC&sf0WqCyN1soeGCxTjeH-su4CJAw*hx~*r2KVA67|t%6h}n^gQEB z=P_&i=QcFarjiafTFc8gq^`_H(|YhMz2UA&6!hl8z!xWUBOBTGpNL24sBiUA|Ez7L zqSg>Xw}CX=eWm{at~!RHtG1m=#9jn)b85e&dmzp=zOQ;T7t#K-yo`hDN)IT5(t;ke zOBUjpugpCGwXPOrZa|`NPAYU}kMjU9i~9~hBEHn2jc21XRK-O*00bi24YVhSpIR_- z(%2&|AsE2E0^hr91mq0IX4F4mjtPmJ1)Ct-El}icu>(@1s1MdMkeL|9$)E5x@=#uM z8$zwm0(BT$_KjrHTj1Tf8F(Z63~z?hwCR({p(O)O8Fr6zErIQmOw?t=k8BtgT2r^m|)<=ol zjH9|bWB0K(ELQjU2Ie+oCFDR%c}52fPxR;C2-*-ki{Yi@6g|d{fF7Kf>IN%zybrEq zobWvj<~_3s%mW!FbI*A)Q`yW)cq4iRV3+Y9kq#D-8F!PX6h5{f<&zV9g11|Be)C5RgrarqAb4x*L!gtiEA^iV+a)2OX%uAe(Rxg8{Cr;q^AWU*~1L9U~i4)o0d59 zDtA6)duG+)bd6Uw!h|U+`Vj)9_0Zsk842VpN&1ZwtwL>!@DuwzUo~l3T&9d|r|^6g zW%02aC)UHzJ70snK1;)bnWGuaY4)6lO z4nklYUd2?_(Yjm+$qgk-I7Pf-f5O-%F2@`Jt5)%M z4JXlB5L3n4Yu(eC(s+tA3;`DmeS#}+YLHva>I}0*t>dFvv0ED~Pgm={crgaF)4q_o zNwTMAZ~wsSaqaFUZ)p|1Ky2ZjV`qyDxCbYf|F*n!IwNA^VrT(zGmw8*U8PCFNrwa-<%PiAdX zki`;o%k5+YNpA!&t%DF>m3uYWa7YI=9(wC92D;}qz84wbL1Vv!cx(=TPwFy?7t{MC z3NbKTA0uZKq(k+S8=GJF?Sp3hZvoMG!TCeZGwX+t#*i`Vzky(eY#)mp-w(|d12q}|=$ck>nsaeoLgnpbqR#d3G=edi(d0oct$indcw6>GUl z=(ZeHZ-F_XKY%FaPN*t;*Gwbj;Yk<^W~X)&IrdIXyAi#<9KGhMT@5DO6|tSanBcw# zI#Ia;EP{VSG46jrV2U|m^tsOz=bsYl0-zk{Tde88rDlI=pAM{@(ZikCSjIFGH6L&- zb2=b<3f@(dMp(R4>zq6fVY*4EQRHbp+HrHM*?ZAQ%$6HfH_!|*^w?I6z|kNN=81y)^ZN`-~~D z*FK-xL&l9d?LoY&Ir$1W;=6&@5RI4Bcint^zad&rT-N$szfoJ4?kdiB*Z-s*y!!DM zG^Kegh!M;F#U$L13{eOY!p-|@W!sW-tHb^kYTrh+lTaH6HpOT{fNrL8H|-m{ZsV|8 ze-_w-NiEs(m)in+zYp_D++=bx)Cl!3?Mu;0^1Jll!{q!pcj3sOe*8#1f`Qxb%?>?@ zR!z9z)SZ9TFg1OWjjpCWW6nKTssy$<#IxuMM$?Oc5D$RD?2ONR9z7T&oG$gnH{*j8 zu>#%3KaIDMit<_lHgz?_%YYrW;@A9SNyG1Mkb7nn*WMo@ok3{?OgLsPbJ##KP_Q zTqKb>$Ep}%`YEYKn@B?cU@ur$^6$*=jt@UP=s7*FnMp0s+ z5D|uYvhk{Om+SapoCL&*kh~o%I-|XZ6<74>Ib3u=`VF<)sToOSXDpR_vWa;(kx3)$ zZ$Bn?8NsM8Fs2%^6KEwf8U=yvDMmYV7bFZ72R>xmG+It9HUCTip`*nYAK7yQuP1UY zt=BnzH=0MJcnNjg!Q#}>uE0Kr|8t7tW!HC0@0sPR*8LjXlj9Gi==CRhJf5t`MFOIf zbWU%WsKKcgk6Pq*qE0YC5%Kz#d(tr~FZ#2lWE&^k7-SVNgKQ8XlB19_N>Ba?WA?o_ z!uEiADd{^G^ugg6?eOn+#}|XRj6?K*#d2)SZ4Z@UU{a83sKpj=KA27> zBWO{?O^a%_cJJ|%7{?^747BVf7p?0)QY)z&DX}=)vIr-jLbsvoV#sT9{*dGQh#cQI z4}c{Zk5`OqZ1<4X=BB1JRstL8>`?5n#OgLjyKmvKE`Cal&=%z$F#(Z$caS6fKP|}4 z*rwk1a(@njrnnuQ>U}jxNX*=WhlXi---A%`B_QR`c92f?M__7%*vW}ICQ2#2eF zn_B;O6jKZTL+dDrFeMMqWz;o+%Wk6+F|%wZW*BH#mrnCH>soN?JAcG{n*6M(K6uE+ zk<&1!Kh)?iud^Ec9p&O-Fh%N)|1j=aavU9b8OOa#vl>QEL5s#gF%`YSpz=S*hmz1r zifLpb=3g3_T*tR!)-=iT6g_B1J8Xg#N4 zNE#u)rW8l@a@83vxr9}`jv0`sUIZ#+-$b}?w}V+|WJ4xt6`tc_OXO-8GFtXjZy1y& zl4NgPMypysmaK&Fi7DeHz@s}tlJ8Q?ZVZn^u^9MhY$b*UW9H`hj1|+Yx9$%XZ>4{a z(Jv-a72`0%S)@dv(OBxpCADoS`4}mG-%ClXA-|C8#tv&KXn_=gBkzURk+ilGpCCqy00_l% zgh(zZ8PS>;MAasuI1|wY{m3^w;Ld=lQCHH@FU(PS6utcu^q&;mqanWL?+Wq zgfqR=l?kC6(Ym?*#F*g0whw&vUi}g> zn<-K#R<@z!ai}u7^c%`0?_K59}U_p(h@S(>`(CJYUqTC^ zBTrtx>!`iM&2} zKN+jl7~YF(Adk>}(4Xejz$z|mv7@WM8U-?5aUJP2STG&yJ=UMQ(bCkvo&^y-oP{!w zl@24%L}9cXf=Zao%Q#`$0qp<%4z2_q3pJPKC(%DK7aa&a1`M*3Yk)*@N?Lr8J(+?Z zkd`bb?<}+u;LYo)_TuJnJ3Fzql(Y^6%Mb{-j#`VH`5BDyEWQ9;q03QShGAJ|as&@;ZpAyWSr z+0GVhw9x~u1}GTyJ{yNa;_h$IOAM<)GL7}=?O30}s~cqQ6CV;6ad_B=)9eICdy>~$ zAS(3=8OLab!Sx|t6Tl^;6=AZt40=FI-JhhUVW}(kfYthXsub9kPBDfyqcvMyzqL`f z#ti}jEFyM-#Y2+-N-n0c8}zf4)-w*nd8gB4bs3OQXgt1LeBLZH3b)P=0T{XjcSf6( zHSMcLjhYM~4S4_|9^L{I9}e})bub?48;!>^3KHqjs$qKYF5GnEeHt$VRu5h$mNrvY z@u1bNf6)9epLew)Nc7-MiF(HjQ{FRJ+(>KaGvq%bjjn+^QyjjtoGsX!q4Sn_9I$;x zGSuc|`;2pOJ9rv4^@g<1=*|lM3=aQ0LckBhc>=88J{KS1KCr!}k??G+K_}Ggt?gNt zDD7F7CauaEx{)Npj5X&Yj^E)h^_;nRMmw!8@{BiKn>G$4xxGays;*y=tOxH+%td5i z5EPVRUeRF&8~!dGIIKLUz`OoeDVG@thR6E5+gOmyL&$ ze<9(a&7=f_c>7JQ-%E&0C7|cYt$iwWy%*23-6hG9gu;kn_gy>!0U)mMtkEG>;I^p~ z&4L803rOEj=7`Olf# zNRg_Z?adCi2h7yiaWv-Q7eZJ~iY9`AVZv!L-&ouv`Y$Zanz(QPY|gIZUO9rz_G_s9 zOVK_@b-MO7&!dd9i6DWEJ0+jInX^!!|T(5sa z^uNQT^G+q`X8Ln6p2ShiHlQ62Imo<#3CCu+UbLHNZ@Bvsg|n{~N#qhDjXjvp#cBA2 zuHa2tUc+>#0o)|0$9@)nuF);VQD4I1A423sQSXK?)k$ps6@<`(co_%f=MQ-Q7mr=+ z$GJ^BiH!D{@RVFU*k6LE!#U&xIjs&H3v<3l2QExb6gli_a|aHJ2e|{esTx+oWU`I@ z&SMlN^Z^;90F!Y!9jQAfr{Pw5ZW$nE@4gT>1H`$DroqRyVyX*lOEGrXx+nEa#!Hxf z=P_dcyS_7F^q|PSt*32OiH zzT4-G8%z}PD2q)+q}BImDQ5BkuL@scbI(O%_~6vLlK3A`8n=+ypMXg_Q$pe;W{K7ad~+0s}0 z17h0e_gVDPekJ$+r9Rtde}w0A>oLS{Okc#B67RL9#J%EDNz;Fs)BB5S$PcvU^gEHD zIUV>h@zKm48SUL-KB44s)#e-SGVZ5=MSe>F8<8{zMmZ=YtDDzQf7Y*)g;CCloZsnr z)pzpQBxSBzk#2m`KEtWB&lr#Y2};w~{N(dV@eM{(BOKK3j2%8{zp$ohI)PHLpM1=Q zyV9{)dT*cSbopCH59TYQTSkPW|{Y}YU#g;5jx%*;`nGm+DkZ26;j z@FZ|@p^v<5esWH1mVo}xqn|UAXD@MnZf?W0eHb*>6YI3hPej0KMJXP=WD@YqnOH87 zsC9opW32~LaIor9wJs5Bb=+O1*0m!WcbBMjPtcvZzMeYY`dLbAXR@)C(!`|J&cp#b zkoYCB&-D+AC=J*#U^@v1QQlpUAB&mAMo|?F#(+9L!M&;|y*TjB`dM;oXG#=pp#p#ttt>z$FAT!n=}ea7 zb6@tNF9WuRZa^L0w>9gvewG+pDb$}~%=U5qq;U=rLW=#hoW^KvK<8^|xqzjDSc%;t zYl0b&E#dvv$y@VnLq+XvC61^+0#?t7PZ? z`4`J>n=u03@5ccMo7<%q9ke{JTx*R?nFgn!}!Tzf780@mw_7 zYO#%KLPPjGIGp3n2s}J+psp0JAvC)Te!Xb0ls4AI8}rbtMV0J9T@?i*O(< z{c;&kzDZ2N@QbqawsNX=rt+5mQckLOruw9XeU>*LCOJ(1GjU@Zc9(>-58?9~E@S8m zJu2JJuVDPr^X`_LVaVB)o*cyJW%u~CFIh+p)$zPk9@1ltKP36AhFMrS@5)}~8cxsQ1b`5~>7QR$|+()DVUvnEq zQ4YdT*F8tbTi|-Bb&C@)<|cE~9b&I6U_yU&Hbkt#dx@ zgo@vwtZ^qJ-;N9fAkBy@9#ME-PW-eVB)%GsXZ}7!SQ;@t^_MNfwqhx+H`Kd9x~rj} zJFlpFX2X=zC(sKz41jTUIM4VV1k+nT!FRmLGbeB`5n(K~4#(Pg&rsttDL)QQNf#s0 z#gf{)Qzr!y{O@Gf;T?HTqfvVHcXG*8{aUq-=A4qLH{$MfzH?vee?HGRPVfIqA*P3} z!Z+3jG6tLpAxqlL{eY`MJu{SJyN{#KWTv{G#mGK@_@$5JAPyr*QFuKZx76tgruFe4 zH?VDOsMg1gk5vX^o>qR7I1#sa+ zlj!~fwhkr1y_? z=HC6rSjpXmYWzSK^;+XmFD^ubIY=hLXT1uv&;g6O??5zXGB-t*$;lDW3)%?Avkktq zCjGB)WJzBzaBESMD@df%Oa|S7VheebnMdQ%*+L3B`NnG-FGGEr`=NV7YH?3DLvd9w zF0g!Y;l-FKn8h&)Hj>~}H^vIIL}Vgb4H4AQZ%>i>r6Wxb?jtI5NMvEjgrg*b6r6%E z%hzF*NktnGq%zuQ=+rNu04=nS;I_CXj?g{L9BkU$s`=LM`@(vYLxhE5}ZC+pS3N^LvU3!P7SDpKFuK(_I*!LA)0tPJ ztLq%b44Z^dbD#~!J+Gskqn}Y7P0W!PbTVOAk_q#_n}d_DUGJLyH{pP(nHM%Sxkjg2 zA0WvGwk@%l8WUdfQN;3T!6k~)ln7yv{aTIQg327D9nXIQ6J&<7SvEQ+;+cEUxj;Vp z$Ik!~vE<}D!+L`wlIp7eC7lhE-A?_%Gs$~sH!~AO^b%_F9uZJW%~iy}r$QSw0rZ1iyOrTes;GpkrXn;f9@B%DK#z+4B zdhi!G@39sQ(NvEQ36ysZ3Ev30--ul=k%xw8m$4raMZ1h;s6=}8l^O3NZ6*I#zLp9H z-sve-sBU_c&SJ|hyz6WYPjGH1PMp!+UCcI^d~eoxh$3*}xY6cYO7lVhRJy^IL9W1w zv*o5SA{x;CV`BI7Adc>hHo2kFfsERdbMvR=tMx(Da~bqDOPuYD+4OrHWl(1htg=I2 zvYOkbfgul$Gd^fKv zOb3utT9$j7M*ALNsRZ(IwNH-&x0sPKk~18n1+Ol?M^kWa zM(yZ#3+_OJJY_-RPK5?(bMZASA78_#;cG;exDlROaLgD02mj8?R02)InM0#r3Npo2 zC?{nYo5z#NrCH zJH*XTk^+7och740BT{eZ{LH=JZy3{BoMmCtDK}pE--01dkG6<=(QrS0wS}43TQ@n!8aDG$Jh8XZ0o?J|O2Y-ZKtPV9nAd$|4pUyV6LHZv9ISx>S z-xCdiV?_oglNilI4SZ5!zYJLwfgL<9I(+#U7mGmxyh#$v5O_!Q+~P~$l3Xxw)K#y5 zw|*ZOj-wzrbrg0&)cQY5uBSx}9rTwQ;bC(z$mf^UKU9U@SmWl~p5vxr;?pXjI8pjBZ0Th}G7W4FwV|3!2J0kkxr%(s7W82j_vR`C{-oQ187t>_C<-1Ip zF?t~FxhUO(7cm5;&B989CPCbX=sH$X+tpP^fkKW943-2}#=jz%PBiX_#q>H}@c|PK zY6s$QX~yVOtO}3gP#kQjZJhlTIKfN2a>#ZXh3$$w55+_6#mB9oMu!tQUSRq+p~eC0 zVyy6Nw9A^r@3rrHoLvdHz-bJ#afEYy{t&C%{QDP-L7qCcV$D3%9uu>FMfQ=;yEV8l zpl-gB{M7Jx+Ts7Y!zIU&OFPoRuVFh2o$PR><68-R3QdB(!}Z01IXtyx;^@6T-tf4m zgZG>fDzZ?BwLG2q;cH^AUcOnFUfK+{diHjJ3ZX)F4O!qp{*`w6ZMFoK3+6;?&l;|D@J<6YL1SnBg3$Z0 zXyNq?+S6YCFYQ(L(O%eYXY zX3m%N!W*{Ck*-9^BO-5@Uo?^6>X4>pj;$v@W_N{FzV*MvG?0fEI-~>Jr8~ZaPNW)%tFb23YY8R`RA|fACwdRr?7@v6H8>DggMJc#v_#zKh9L%@?XkHaA&GdQtP{X==0HKt}VoC^BEU@->S>Nc^2&8 zL|iIq{cgPSzxh-BvD_k;{N< zZJSy6U&{H9-lzYL44}}CFj-;H5kAx%9{;`icUOxC;k`nzm($_P8r(~ZNk#`Il%x}y z3}Pbq5O~3Bo#-Gn9h%k~W}v-WduxyMZ3gC-89WE-fsWxg(S3~=N^S5=mdI`F5g)K$ z0XN)#5owr=sQ3W}n}P=_i3Ys*gu8qg^DW{93|^M%lEahUh&2iJj1)w!aLHoKUw{+$`_LWM zZ?-7}I2M3i?}p=6;rwjM-(s!LWUDcw7Bf^>ZoQ4$_@2JNV>rsd^UnoMbBIEW*2sF&*_xQ)(2-P2#&TiQ3u6;a35u&+(uElc>JiO3?{4T8MG~Dm5>I4!}NhT7_G*? zqnIE3kUydm8O5MZBkF=T+T6fs|BTEN(HC)}z`KF&RZGWoTxg|B|6sAxDQ2^1-D+pA4S;8gb3TrIKG{4IPS#Ci|&VA;9=)P*d$hf z4tigIQ#V>7n|>B3ko-scF7x*%qSm1}jUnjOo4i%fOdI{e^#C@M(%};7cuMLWBzT{q z4L#Kj{6^$7(23)YthpVyf>IS z{64-rve{HX9o)v#bc#tgmg2dn_|BsX@v7MH`G$|7Hnp3dKsoV6t$zXaYd5b&nwX{5 zKZ&$#^MY`M&U8|}Xa(rSN!qp$4)AToK;76KT7@dGZ?aZPn9}jchDfKPmMj_5dZVix&hh^qnlb{*^dHiQ5sXRl<{ zS@m(a!_S39YIgWOR1SR(o5yxlwyTBPHRZm5S^!Fs0EDDE-BR&Q1(?DFV|$L4-t_x+0AGTtT^*KR)b(kkHN=0X-r~_9N-N&X8*lJ85xGB! z?VwJet81ZO=GE!#2eWcRP@&pSq5( ze@|`U>p$4=?my<$!IMH-#^K={}ENjbHC8wt90TPLcrhiKVTy`e6Z-+kGQ z{iI~tm&bJo4My5z!d|SK&P*W)FOHJPu;qg2iyQAyIIj--IQ+~)a8`0q$3u8iGtu%b z!O8@8!!$>2YgvE9`kw?pk(GFhJE#w0;{jzCq*{S(THquOxzc*)-kSp_lhnEv+~TJx z{9fStx<~^Bp~eqLAfTNF$vUbRoccZ$AxMfdLh?yB@pu3+UIGgBgA%a52TqPx>uBv7 zIC;B&IBGp@BHV04SOA1we`R<;)B*x0K(PitY=gOuUcj;MChpOgn5)=L3p= zj~wM0X8C8f@^6TF!Ks&0Q55MP-G@nnNEd$t2*t;ye!EC^z1>#-6%_LCk&A)oYeeBz zo2L=5y2^LUw-ez9y0GGKHPr0Kq!l>fRPTQd=v@t~K1SLVd@Plo3}J2szD-r{ABe_l zzgsb6?T^&QS|_!tfyu}KG`-E#gc_mV@1V@u6Z6RGN-#Qvf<`t_Bb|7sJH7iFcv9ES zhfHNz3los2-hY>@&5!!mKaE6V8j-YxzME<`z`q|I=5J$sO_CB%ZzETq-l_)N5NIPA zN!J$oZc5*n2^pNlL2~+WN;nt-d-P|W$T99tNXvnK;s^ck`fPq@w%ZZH3$yX2Y%B|1 z*lw&u&qX5zMG-Qlgb|->EQ4xE2MAAP?4nO!{4H z*&b*Z^2=1vG7~=xMc0r6*!Y=w*A_~P|I~mzbk{_+LwiAqd_;X43h=%XJ}9>7YOoya zZ1rB*I1#X}E%e>AkZP<$4Li-5pd|DgWEwkV(4z4Kso{s~vDHWdz%U#|V#P1Tb^yx! zJsf(en6Wp?7Lh|#fZ2zl|I={DAwD5hn%HWflK9xferRMT0Q4O^mKHtz;kQLc!Ac;) zP5T_y)7i7awappjH>lXPU3`5n$p8$b(>dG_Ti$PIIg@L&;cd&@rm+)7_%Qmxkysow zwb5LcD!7A<&!G*GMFbh|!^U8XnI^(%&vIwfx?h2t!Fu`P37i|-k4g=*zUOz}UVtK; z0HM>nbu`tvg8l?Nj$j<3nzkw=R&d0afHXKep6Li1VN5?yhU`eFCZQ4=YoxR@5d31MdW= zC#%axh#urlhc^}wKv3&{EW_(8ySw&U=V-Vv4nM;s3rSPEwwJ7yI&nF)&aPuJej%E%hZCAdO~}aOpx(jO z5SUX^BJmvzYsnCF0_x=_kaGYc-uOk7{cL;=4|r_4If0UMR8PqxzAIj<=^U#Enw8zkLTbmfe|b+v)Hq|w8)NRNnx2!^DXgcMHN-{ z{KX!hmW8Yo^Vwe&FwV-8BX3YHamz2U}W`EqAeYm>FHU zUqItZg4z(s@xlmfxp(*q7Z>ziROK%>+v9m{3rAuXgsXTHKJ8mG%E%7DU?q(rCDz{s-VWw#{3xKx4LebtKC z2!DB5MbT1?2gR@?CEs6EQT$<^Hj=Alh;N5swz*pk1gb64Z;pfA-aSNM!1Od zVKO?rw7gsIP?n@vKvL-@0hQUjR_oy)+L}(#Xny{mR)RC-}#W z^lM;yNhQ?Zt5K6aPkDq|bcMRBO_80BCfj6n3@7JA4JpM_UbqO8(_(GH_%Vwx4a@n0 z`-T}2{h6$dgiiI^Co4O)H%TVx6a1Jt>~zZ>mBnV;bO5UCsVeZUz;FxOEW3`ts1|t& z*u}6z$O(z?lvPwLrSAAEO+#r}7)+*^VwamX%Wk){G*319=QGV1gk*jQ2m*vZF_}Gx zlG3VWD+;STT5*NPTYiO4^ZF|*E2?~2p++Wd9LUy6sRJd2MbHBbs~=pSZK1s`kzm;~ z)BF)FR+G@oMR#h83X7KFc&vWxEYL0v6e*<_t3Yi`&9%ipm$xTJ8o2kZlpq2x5OKeqld{utaASP#5pLom%mW3F~)jUAg_Ju!mb&Tq-jJ{suV^pkM3G@ffQ7eW`q zikw>^XH)4LV@$$*^`OJvvG{=M9Mf5qW8ZgYCHzwOpzzmWRAKluvtqHQs0?*|nA^Fp zZuYfdo6E~Fe4vu0m^?;$N5cw7ln9*5pY6)iOj`nDC6xoyn|5RAv{9qA>EvmnVviyS z#55rAhApi^%h|M);9A-kZ5AxdWSUg8e6m)2XUZ!IE*~U93wwhM&mfq9i1cc7A6VHC zd$bZ>r%;C@mXsYq(-kLB826u7hh4cb*ULUhEN}%!UR^v6{}N$%xGMQ@XMAL=Fb$QK zlol~($@6FFgRjdV1s_=w`H@|wLQDeeOUjBKOnP@zkPoxCqM{h{x%s&z2CbB@?2iVr zDoRSQM3V-ds)Xs$G2=+$Wfe&eIkfq6@+OSW<>?qwHd``1Qid%kgR;SdmzI~>yje+5 znX{lbP|Uz4|0HR{Wnqj+GcU`K3MW& z#-Lxt>|3rV#iHito~nv4zX%5#*}|xG7|&tQtV2+LSeS zd^(unU4rpp&g|p{F;bFsbcdLhupA`*2=}LtA2)sCxZH^*#rbn`b7tPC-GYT*VL43> zWR)yuc{E0CNg*vK$&aqE=66Qs)!>~^pJBt z2{HN{mKR0`vrkf4RHaoe9&LHY@H9x#iRftiVW|oHge7p#EX{>x!Y$=b&f@ZlD&ia% zER7-b0O|>Un1&^0bW#lRHf4qR!xm^>`^|0tRS@QJR^%2eg4gjtDdrB^sFY%7_}D9C7hQd24&Q}wog%`g4x+Fw>x{<+!+NE#!t(c zV-nIg{H?Qd=4AJ%&?~%z%APqVdv=fhRg{C7CebF`Jha{`9_o13+}X2%sUYtrcXnTV zl6a^?SvSqj&OunVcYG2KSo7x~I-O6n_1dn4n|{;mEZN~R!_Cgl2gchNUGMmq-|pEt zw`3R0oSo0CK0~|tbFybqKZv~E@tOUdJ2MP+MmX>#FFP+v%>NDEm76;|dj`6620Dq~ z0Ae!F1jmYF0h(3`7J+6*!~_@ly^F|w@_DL#qcOpeYGX?0;0Z=10ICYBNq-7;+Gx4s?1kdw4`9Er>fjjR#043ims$#fs8da zJO{Q=l3$itE%&UT-j|dv_DiplryO`sPU*UucmZAz1qPgwm1g_-GVDamG(FXl3V(U= zXl;?-r(sRJ2=P=f9nLEPPHB}@6^oE{CsrF|;_f6b6QR2s!tSyXkrM@SDPC4sT3+C-jLrnb z6sDs52xQd?t{M$lwPL)L8-YYH5^j94QdoYc5~V^4^pAx}Y~!0G#pF3U9?SD2#PT^* z9}X#+>{l{NGg+_;&1;Q$Rm`hqUPn@F$y4MhT~2xxo+_Y5#1-#iFa@gsiV77KFQSMM zMaHL0)$pWgL4K}6Q($bx=^pfrGEwOD@Ny>70_R1wGqXYhY7~=#V?dR(8?$c41e!j6 zUgRqYYj2BAFGt0q(98}O+B;DNQQHKhLFFfF6-y~zMt3EJWnN6^G7*lMQ9KJwfsQL2 z+khx&`$YPDSeYsmbtND~FA)0UyCmB}RJuM`UoO^=n`BmGBtW}ZvBT0pTC$>GkrhFN za!b!<5eCB2$_m6EqTq|ls_gJGj@6^aYz!ijfIZ&Gf{1qCqc(Yxq)lRnn(T}ftC54u z(yNHRc#1KOWt0ZDh08F!Y29KPAX7qKMC=g21V2|4dNHbbuLV#P4&)ES&6JX%ST@G1 z6)h{CtU=YFX_H67TvS!lB6X^T7CKNOJzN+M=u$BlD!neLSiFFs(000sU+PS6w3462 zm56AH7;+mn9b-i_?GEFWePX?|$Okr zIm`w4*EW5V0Xp6#utn%3f1}`f?ma~2p=F4QR}@)7r%e&l<@aJB`>Om!BtXW!o#jc=CH`X0-Q)raOu$QqKx$QpC;(C@Vx5jsiu!(OqaU4y3cyS?s~gC_m|e zOum_AUMtP(;rnEMvYBQee9@$XvB{g8h!pUO0$1LgB^VlmJps%uR%K-I7#MN+HHYrt zqL^Qr!d@erVI^ng^qb_}t*+TK`+hcRE{Jljw1<4(}XM`WKV}n--U8N0^v9)a@8CqA>kL+;zk7|LKzRh{rq5 zJ3K^n>~u^%yi?Yhe(g2Y)zzl2tW3W)eCO2iJjJE{WjMo8?k)A*87{Ea3CeV*mRqr+ zN4XVBQl?M51~Cj6^yw3?jkGY40vnt;!Io)a*V1SgtFmH+r)m`HhjZO`mKQE7Ez+_} z5E}KA7u|_cr>0|nF1Gnxrn{HitU}+|FzFJCdN-@g@9hP;chpyp$7&P}XUQlxd{^*= zj&p>WGjZZIk$Y!)_+%Pk4e2&iG$S96F;yTW# zBkGKzGUoTbr|RCmX*$k)&-45Kv!5raQ+3{R>eQ+AR^9H34w~hN;Y>Y2M^6K!*b+@r9jA;bF19^xj46&5M|l1TktWqY!GWmO=BlJb)nO}M zc48OzFD%4rl^=LbwWk7io0-8EUm|$^On5M1 zF9eT21}J}^s|};2#(AHJBb_%2yY%sWQ?0L+#^q@o%OU#WAf!}EUw@73mJ&y%!sTgP z>3_g=)3}K#akN(HE7Uj(@0{_|)IOG3;fghGK`MQ<34J*lcd^Dfeqp`QOWH4OG;XKH zF{cT}(az$?II*Z}ydK+2;~q$bt4-i~YTP~-?iE{~3s<6X@1(*tB=il`xNlP7;w+W2 zFIVG!(75Buy9fR&H;jnJMYW$D9MdCI2ONCVMdR8$8Aqb4K9brW-;m~~Ycej5#9I96 zdh4oj{WOmGzQT6T`l!dB&bR2l#N}(;tmJY~Uu{BPRO3or`AUBi9IQAD8*=fEp~g*g z;T-$o(6=ABsA0r4?&M?~(fq{4wO zIOr?YxYtwJ7X?h)H%8;$ONBE`2gi5p`8ld_j2=D@zP0O@?QaEoe0y&h$F@ts&!38) zjs(4bdShb)!X0<5i{F2qC^CQj72q!aWF&;!7#vY}kV@1Xdy3gzqgK zKv;e){D8K%31JjrF21=|g>W}s5Z}%CPT0vf!f*?;1No z=Hq4aod|a#Jb=);8TwnH90*Gh=I(+&5bi{{oAFzqpK*k_ctN|g9`%86FT#4pZ-t)` zTKKA7X={`NVJ*TXx1)U_Jah;2w}BmaBYzgco%lJ|Xj_#39^ep`{u=rbE_o2?xzLNS z3gM>+YY~<|jCO`__oK)^4}N_dH zy$EX&=D&b?M7SH_VT8PgDvYl^>_iwxXuSmc5LP3sN0_@GenYqyVHhi;(*FSt;is>_ z{|INj3VRSPLD+zB{~v&hz#o4^J4bj3VJ$-IPbe?b5gtak7h!%ELq4b$`Ir|@HO%U; z**-I1Z8HO5rlUwkcvfTMi3%eBQ{xSzyT;c~gipA*35Cama>r$7oNv_{!`hXdSlqoU z6;OT@{`NxeKqia|p=EMSVi=~8@wllBJ;#Kww=d-+tZ95`lkaX*#_`O&`$kfnffFB zDAK1xp5@p2XM`f&HfDM#cVsAxEXIicY0pC7^XD`+-bx+fFVAc^Y;?w{_%F3<7}UEN zxIMrPBQB|aSJ~A{9zJXjPXpfo{1_%A?3fygOoJ6j5GzK7a>oiul(g%ALhcac)-plt znSe^3mo6xmJsr^QqjPonlk7P+$sX401mG)yALr;@ivo_9cER#32fr5lDNX%0Ar$on z={IHZSn(UnR|ou_QyUv^puVL1M}?xEmG0)Q+%0}N2)SI$`P-Y3JJT&UO0pBbWcpwq z&3^l5!N^hQ`m#jH?gNXF#Um_1-!IV_(`|_X`#p>yAs8pbAVg% zA8^e765ux3xTJbsp486RE*=4%YqBj(?Zvpd!RMKz8WJ2hDPvA3cZ~Q_^_R~fcLZ|x zrII_%k(-#YEFm`m*zOp=m&|W${H>PL^^N+{^?ec=ln;|I^r#j%Y>Jk0^*dD@4ys7ySR!H50v9i&$w zeF+mdj+aANw|B}N1Ahjw$&*gkJp7R;H4eD|FbEx?jQG2h54Dt5?e+2lOiEm<; zXFO_84Z9VIe)KawrPt>fuL^f2{Won6%

    tis|BY4(0kLii}!06|ho9s{OSq}UP;NK%&f9RJ> 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

    &UIkg{wF7jP{LZ<#%(sQP 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

    ult3cQRmW_+l zQWeY*o?0R3Lbs?3z2~W7f$%D24NpBz#9%Il_M{t3dcZSn1}?H*TB1p=hNn2oF+Lj_@#L6$n2CR=WAo=$+^k2^T9X zN4Qj31;SIo`e^gVs$!mSiL#1>v?&`LVbXk9!CkO%p4uu9UZt!Y;a8PaAiNH&^yoLB z_d8CJ@Wqc*ya~NOKszw%it0WbRwn%r_}iIRE)E!dMUCmS^X&e;1wxzENOx?+Nmz6{ z`WaeX)Hl{zB&X6HIzNV)aUW#{oxYiLpX1Yqm@a%oy7225=l1f^Z1X28flz)`5v&~H z0btpgB{jtfS`GJa7G0;RNP+MoW#tHe4wf}f>Mu@^@Qn&V=guNJrP=uEN#g5jElc=K zWi=80kFs)vk0>ik_@uIOgbZ3Pk%SC3^&(Coj!Ygh5&j+4)0dI?Mo06vBU*Dj0{kr6 zkE@uc;&E!Lg)nI=+$zE#8foiTwN)fc+G-3|<}Oeer;1s^W0aL6q%Fy_&4c@QH%Ob` zNiu)wY4D{|PDY_faAVm3AI%zJf$&si6$wwPh=|nLPLS~P$|?|EP@!u_=Kf_Ivs5up z$ard^M#7~kl_O*@CRzD1sk59QA>$Eqgvrpt8kq|lluntk|3BT)7E>wnO6Vf^m|0zi z(0`z5C=d>j?=CTa>BU9Guc%_4@Iz(g2Bush? zx0d;^u}WW&N-;fI-TV+|-uiL>euUOL8fQ?rucGT8Dw205E!qt} zXF1;-#Pg2jYmExDg8N(=Tvy!+MOIfAS%$7NRU{Yz!~BPe1bL{(bhPQT6bLUaa6%1t~x;|8q0^z3y+i8-gFN7n(vO^(t ztO^zgCn_r#$^dlLv5k77_4z9X>{lk|5LM2F_JR@o1Ci5i%1J&~=511k0oz`8ZzlQXpKctX9G$$|?{p1JNn;C#XoCuw7Y2Lb{Rb8X% zt|EED&B|&aq#Kz5Li(^XK+1UxHVb;ZMa?%7QY$@?wEYGYKPr)td8JnVCZUxzLijXT znP~mSek+yuH_*#dZ=;%OA-oGLJ9bh}I6*@Cw1NqD76wim=`^Vrmewdw(L8Ua=It6q zj)6VqSbhj2&_#=K=pnpAwTd+KGsp4`mC)6xB29#6C@a{~7&NtI!zVmTwVDX8Q&uY@ z`nhBI5p6+N?e?}uN`Y{=vWkQUD62qtAXsMd3T0B0RWMjn^!R}Wl_%UswOR=2M%EM| zeb{m#{n-V=?(tP#k z%`b(TKe=`i4pj3kgtRGAgh}&Z5!b`Up=zr@xI|e+!fs_12z$V?$su*E3Kj{kuMo6@ zasM)oPpD#^aIvy-gmf-hB&25(N4`wz3a3k$j3Z1p;~1-ojfAHvtA&uxCEbMdY~pCt zIIeTLgvmI*PBY_JtWFyVf1s=! zA>G(HCH0aMBzzgHOw={JOk#)zmm^FD7tTF{J4+oj5k8}=RzhZ`CTb#NgeKmmGO3+3 zj#k2C98E#daQMGar#V7;lEQbBYY~TC3wIw?mLniDPD3jYPE}TpaJI4vgmb{EQf=sM zaf*bmf23k7dOxR%*>!+lcdY*be9*Br1OCCW{QN{aSE z%9MRt18(xo)g#1_E>yzV%E}RD!AhU1x>}po60^vMm

    vm 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 Y)GeG}HFjMMANU(VUt|NFquT!e0)5UsQ~&?~ diff --git a/mcu_utils/macosx-x86_64/st-flash b/mcu_utils/macosx-x86_64/st-flash deleted file mode 100755 index 6fbb271ef5ebe582ea5cb1b4650daa374018d10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80996 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 diff --git a/mcu_utils/macosx-x86_64/st-util b/mcu_utils/macosx-x86_64/st-util deleted file mode 100755 index 733e0a125ed8acdab8c6ba6279acc31791e31f89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104716 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℞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 - - - - - - - - - - - \ No newline at end of file diff --git a/proto/compiler/.idea/compiler.xml b/proto/compiler/.idea/compiler.xml deleted file mode 100644 index 96cc43efa6a..00000000000 --- a/proto/compiler/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/proto/compiler/.idea/copyright/profiles_settings.xml b/proto/compiler/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3377d..00000000000 --- a/proto/compiler/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/proto/compiler/.idea/libraries/KotlinJavaRuntime.xml b/proto/compiler/.idea/libraries/KotlinJavaRuntime.xml deleted file mode 100644 index 207fc74dd51..00000000000 --- a/proto/compiler/.idea/libraries/KotlinJavaRuntime.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/proto/compiler/.idea/misc.xml b/proto/compiler/.idea/misc.xml deleted file mode 100644 index c6d8fb73c8c..00000000000 --- a/proto/compiler/.idea/misc.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/proto/compiler/.idea/modules.xml b/proto/compiler/.idea/modules.xml deleted file mode 100644 index b67420d2e33..00000000000 --- a/proto/compiler/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/proto/compiler/Makefile b/proto/compiler/Makefile deleted file mode 100644 index 0dddd319065..00000000000 --- a/proto/compiler/Makefile +++ /dev/null @@ -1,70 +0,0 @@ -CXX = g++ -CXXFLAGS = -O2 -std=c++11 -LDFLAGS = -lprotoc -lprotobuf - -# Generated artifacts -BUILDDIR = build -EXE = $(BUILDDIR)/protoc -JAR = $(BUILDDIR)/protokot-runtime.jar -SYMLINK = $(BUILDDIR)/sources - -# C++ part -PROTOC_DIR = google/src/google/protobuf/compiler/kotlin -PROTOC_EXE = $(PROTOC_DIR)/protoc - -# Kotlin part -RUNTIME_DIR = runtime -RUNTIME_SRC = $(RUNTIME_DIR)/src/main/kotlin -RUNTIME_JAR = $(RUNTIME_DIR)/build/libs/protokot-runtime.jar - -# Testing project -TEST_PROJECT = $(PROTOC_DIR)/protoc-tests -TRANSLATOR_DIR = ../../translator -TRANSLATOR_TEST_DIR = $(TRANSLATOR_DIR) - -# Produce protoc*, .jar-packed runtime and symlink to runtime sources -all: $(EXE) $(JAR) $(SYMLINK) - -# Place protoc* into build directory -$(EXE): $(BUILDDIR) protoc - cp $(PROTOC_EXE) $(EXE) - -# Build Protobuf Compiler via delegating call to another Makefile -protoc: - $(MAKE) -C $(PROTOC_DIR) - -# Place ProtoKot Runtime JAR into build directory -$(JAR): $(BUILDDIR) gradle_invoke - cp $(RUNTIME_JAR) $(JAR) - -# Build ProtoKot Runtime via delegating call to Gradle Script -gradle_invoke: - cd $(RUNTIME_DIR); gradle build - -$(SYMLINK): - ln -nsf ../$(RUNTIME_SRC) $(SYMLINK) - -# Create auxillary directories -$(BINDIR): - mkdir -p $(BINDIR) - -$(BUILDDIR): - mkdir -p $(BUILDDIR) - -# Testing -test: all - # Compile .proto-files for Java and JS tests - cd $(PROTOC_DIR); make generate - # Run Java and JS test - cd $(TEST_PROJECT); ./run_tests.sh - - # Rebuild translator JAR - cd $(TRANSLATOR_DIR); gradle jar - # Run Native tests - cd $(TRANSLATOR_TEST_DIR); ./run_tests.sh -t --proto -clean: - $(MAKE) -C $(PROTOC_DIR) clean - cd $(RUNTIME_DIR); gradle clean - rm -rf $(BUILDDIR) - -.PHONY: clean all generate test gradle_invoke diff --git a/proto/compiler/README.md b/proto/compiler/README.md deleted file mode 100644 index b09ef20848a..00000000000 --- a/proto/compiler/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# ProtoKot compiler - -## Building - -To build Protobuf Compiler (here and below "protoc") you should have Google Protobuf libraries installed. -You can check if your system meet requirements launching "pre-build" script - - $ proto/compiler/pre-build.sh - $ make - -Script will ask you for your permission to install prerequisites automatically. - -Note that this process requires pulling official google-protobuf repository from Github, then building it from scratch (which, in turn, -can require addition packages installation, like libtool, autoreconf, etc), and then installing it into your system. Make sure that you -have superuser permissions. - -After you have finished installation of all prerequisites, you can launch Makefile that will build ProtoKot library. - - $ cd proto/compiler/pre-build.sh - $ make - -This will produce build/ folder, where you can find three artifacts: executable proto-compiler protoc, runtime library protokot-runtime.jar -and symlink to runtime sources folder (in case you want to link against source files, not jar) - - $ cd build - $ ls - protoc* protokot-runtime.jar sources@ - -Usage of ProtoKot consists of two main steps: -1. Compiling .proto-file in .kt-file with protoc -2. Linking your code against Protokot Runtime Library (needed by generated classes) - -## Using compiler - - $ ./protoc --kotlin_out=$(DST_DIR) $(PATH_TO_PROTO)/$(PROTO_FILE) -I $(PATH_TO_PROTO) - -where $(DST_DIR) stands for path to place, where generated files should be stored, $(PATH_TO_PROTO) stands for path to .proto-file, and $(PROTO_FILE) -is .proto-file name. Note that you should specify $(PATH_TO_PROTO) second time using "-I" directive. - - -## Using generated code - -Example: - -```java -// All messages are immutable. Use Builders for creating new messages -// Currently you have to pass default arguments to Builders constructor by yourself. -// This will be changed in future. -val msg = Person.BuilderPerson("", 0, "") - // all setters return "this" builder so you can chain modifiers in LINQ-style - .setEmail("wtf@dasda.com") - .setId(42) - .setName("John Doe") - // don't forget to call build() to produce message - .build() - -// Messages work only with CodedStream classes, provided by ProtoKot-runtime library. -// You can create CodedStream passing reference to ByteArray. -// To get serialized size of message (in bytes) use Message.getSizeNoTag() method -val byteArray = ByteArray(msg.getSizeNoTag()) -val outs = CodedOutputStream(byteArray) -msg.writeTo(outs) - -// InputStreams are created in the same manner. -// WARNING! You have to pass reference to the buffer containing *ONLY* message and *NOTHING* except the message. -// That mean, trailing cells containing some trash are forbidden - -// - you will be getting errors if you try to parse message from such buffer. -var ins = CodedInputStream(byteArray) - -// Parse message from input stream -var readMsg = Person.BuilderPerson(0, "", 0).parseFrom(ins).build() - -// Check is parse succeeded -// Note that currently exceptions are not supported, errors are reported using Message.errorCode field -// You can find description of error codes in carkot/proto/compiler/error_codes.txt -assert(readMsg.errorCode == 0) -assert(msg == readMsg) -``` - diff --git a/proto/compiler/error_codes.txt b/proto/compiler/error_codes.txt deleted file mode 100644 index aef2cc98324..00000000000 --- a/proto/compiler/error_codes.txt +++ /dev/null @@ -1,4 +0,0 @@ -1 - mismatch of expected and actual WireType in parseFieldFrom method -2 - read message of size that exceeds expected in parseFromWithSize method -3 - read message of size that is not equal to expected. Can occur when deserializing nested message (code generated in C++ method generateSerializationMethods) -4 - unsupported feature: unknown field encountered \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.deps/.dirstamp b/proto/compiler/google/src/google/protobuf/compiler/kotlin/.deps/.dirstamp deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.deps/kotlin_class_generator.Plo b/proto/compiler/google/src/google/protobuf/compiler/kotlin/.deps/kotlin_class_generator.Plo deleted file mode 100644 index eed5f8ec47c..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.deps/kotlin_class_generator.Plo +++ /dev/null @@ -1,438 +0,0 @@ -google/protobuf/compiler/kotlin/kotlin_class_generator.lo: \ - google/protobuf/compiler/kotlin/kotlin_class_generator.cc \ - /usr/include/stdc-predef.h \ - google/protobuf/compiler/kotlin/kotlin_class_generator.h \ - /usr/include/c++/5/vector /usr/include/c++/5/bits/stl_algobase.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/os_defines.h \ - /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ - /usr/include/x86_64-linux-gnu/bits/wordsize.h \ - /usr/include/x86_64-linux-gnu/gnu/stubs.h \ - /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/cpu_defines.h \ - /usr/include/c++/5/bits/functexcept.h \ - /usr/include/c++/5/bits/exception_defines.h \ - /usr/include/c++/5/bits/cpp_type_traits.h \ - /usr/include/c++/5/ext/type_traits.h \ - /usr/include/c++/5/ext/numeric_traits.h \ - /usr/include/c++/5/bits/stl_pair.h /usr/include/c++/5/bits/move.h \ - /usr/include/c++/5/bits/concept_check.h \ - /usr/include/c++/5/bits/stl_iterator_base_types.h \ - /usr/include/c++/5/bits/stl_iterator_base_funcs.h \ - /usr/include/c++/5/debug/debug.h /usr/include/c++/5/bits/stl_iterator.h \ - /usr/include/c++/5/bits/ptr_traits.h \ - /usr/include/c++/5/bits/predefined_ops.h \ - /usr/include/c++/5/bits/allocator.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/c++allocator.h \ - /usr/include/c++/5/ext/new_allocator.h /usr/include/c++/5/new \ - /usr/include/c++/5/exception \ - /usr/include/c++/5/bits/atomic_lockfree_defines.h \ - /usr/include/c++/5/bits/memoryfwd.h \ - /usr/include/c++/5/bits/stl_construct.h \ - /usr/include/c++/5/ext/alloc_traits.h \ - /usr/include/c++/5/bits/stl_uninitialized.h \ - /usr/include/c++/5/bits/stl_vector.h \ - /usr/include/c++/5/bits/stl_bvector.h \ - /usr/include/c++/5/bits/range_access.h \ - /usr/include/c++/5/bits/vector.tcc google/protobuf/io/printer.h \ - /usr/include/c++/5/string /usr/include/c++/5/bits/stringfwd.h \ - /usr/include/c++/5/bits/char_traits.h /usr/include/c++/5/bits/postypes.h \ - /usr/include/c++/5/cwchar /usr/include/wchar.h /usr/include/stdio.h \ - /usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h \ - /usr/include/x86_64-linux-gnu/bits/wchar.h \ - /usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h /usr/include/xlocale.h \ - /usr/include/x86_64-linux-gnu/bits/wchar2.h \ - /usr/include/c++/5/bits/localefwd.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/c++locale.h \ - /usr/include/c++/5/clocale /usr/include/locale.h \ - /usr/include/x86_64-linux-gnu/bits/locale.h /usr/include/c++/5/iosfwd \ - /usr/include/c++/5/cctype /usr/include/ctype.h \ - /usr/include/x86_64-linux-gnu/bits/types.h \ - /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/endian.h \ - /usr/include/x86_64-linux-gnu/bits/endian.h \ - /usr/include/x86_64-linux-gnu/bits/byteswap.h \ - /usr/include/x86_64-linux-gnu/bits/byteswap-16.h \ - /usr/include/c++/5/bits/ostream_insert.h \ - /usr/include/c++/5/bits/cxxabi_forced.h \ - /usr/include/c++/5/bits/stl_function.h \ - /usr/include/c++/5/backward/binders.h \ - /usr/include/c++/5/bits/basic_string.h \ - /usr/include/c++/5/ext/atomicity.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/gthr.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/gthr-default.h \ - /usr/include/pthread.h /usr/include/sched.h /usr/include/time.h \ - /usr/include/x86_64-linux-gnu/bits/sched.h \ - /usr/include/x86_64-linux-gnu/bits/time.h \ - /usr/include/x86_64-linux-gnu/bits/timex.h \ - /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ - /usr/include/x86_64-linux-gnu/bits/setjmp.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/atomic_word.h \ - /usr/include/c++/5/bits/basic_string.tcc /usr/include/c++/5/map \ - /usr/include/c++/5/bits/stl_tree.h /usr/include/c++/5/bits/stl_map.h \ - /usr/include/c++/5/bits/stl_multimap.h google/protobuf/stubs/common.h \ - google/protobuf/stubs/port.h /usr/include/assert.h /usr/include/stdlib.h \ - /usr/include/x86_64-linux-gnu/bits/waitflags.h \ - /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ - /usr/include/x86_64-linux-gnu/sys/types.h \ - /usr/include/x86_64-linux-gnu/sys/select.h \ - /usr/include/x86_64-linux-gnu/bits/select.h \ - /usr/include/x86_64-linux-gnu/bits/sigset.h \ - /usr/include/x86_64-linux-gnu/bits/select2.h \ - /usr/include/x86_64-linux-gnu/sys/sysmacros.h /usr/include/alloca.h \ - /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ - /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ - /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/c++/5/cstddef \ - /usr/include/string.h /usr/include/x86_64-linux-gnu/bits/string3.h \ - /usr/lib/gcc/x86_64-linux-gnu/5/include/stdint.h /usr/include/stdint.h \ - /usr/include/x86_64-linux-gnu/sys/param.h \ - /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/limits.h \ - /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/syslimits.h \ - /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ - /usr/include/x86_64-linux-gnu/bits/local_lim.h \ - /usr/include/linux/limits.h \ - /usr/include/x86_64-linux-gnu/bits/posix2_lim.h \ - /usr/include/x86_64-linux-gnu/bits/xopen_lim.h \ - /usr/include/x86_64-linux-gnu/bits/stdio_lim.h /usr/include/signal.h \ - /usr/include/x86_64-linux-gnu/bits/signum.h \ - /usr/include/x86_64-linux-gnu/bits/siginfo.h \ - /usr/include/x86_64-linux-gnu/bits/sigaction.h \ - /usr/include/x86_64-linux-gnu/bits/sigcontext.h \ - /usr/include/x86_64-linux-gnu/bits/sigstack.h \ - /usr/include/x86_64-linux-gnu/sys/ucontext.h \ - /usr/include/x86_64-linux-gnu/bits/sigthread.h \ - /usr/include/x86_64-linux-gnu/bits/param.h /usr/include/linux/param.h \ - /usr/include/x86_64-linux-gnu/asm/param.h \ - /usr/include/asm-generic/param.h /usr/include/byteswap.h \ - google/protobuf/stubs/macros.h google/protobuf/stubs/platform_macros.h \ - google/protobuf/stubs/logging.h google/protobuf/stubs/scoped_ptr.h \ - google/protobuf/stubs/mutex.h google/protobuf/stubs/callback.h \ - google/protobuf/stubs/type_traits.h /usr/include/c++/5/utility \ - /usr/include/c++/5/bits/stl_relops.h \ - google/protobuf/stubs/template_util.h google/protobuf/descriptor.h \ - /usr/include/c++/5/memory /usr/include/c++/5/bits/stl_tempbuf.h \ - /usr/include/c++/5/bits/stl_raw_storage_iter.h \ - /usr/include/c++/5/backward/auto_ptr.h \ - google/protobuf/stubs/shared_ptr.h google/protobuf/stubs/atomicops.h \ - google/protobuf/stubs/atomicops_internals_x86_gcc.h \ - /usr/include/c++/5/algorithm /usr/include/c++/5/bits/stl_algo.h \ - /usr/include/c++/5/cstdlib /usr/include/c++/5/bits/algorithmfwd.h \ - /usr/include/c++/5/bits/stl_heap.h /usr/include/c++/5/set \ - /usr/include/c++/5/bits/stl_set.h /usr/include/c++/5/bits/stl_multiset.h - -/usr/include/stdc-predef.h: - -google/protobuf/compiler/kotlin/kotlin_class_generator.h: - -/usr/include/c++/5/vector: - -/usr/include/c++/5/bits/stl_algobase.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/os_defines.h: - -/usr/include/features.h: - -/usr/include/x86_64-linux-gnu/sys/cdefs.h: - -/usr/include/x86_64-linux-gnu/bits/wordsize.h: - -/usr/include/x86_64-linux-gnu/gnu/stubs.h: - -/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/cpu_defines.h: - -/usr/include/c++/5/bits/functexcept.h: - -/usr/include/c++/5/bits/exception_defines.h: - -/usr/include/c++/5/bits/cpp_type_traits.h: - -/usr/include/c++/5/ext/type_traits.h: - -/usr/include/c++/5/ext/numeric_traits.h: - -/usr/include/c++/5/bits/stl_pair.h: - -/usr/include/c++/5/bits/move.h: - -/usr/include/c++/5/bits/concept_check.h: - -/usr/include/c++/5/bits/stl_iterator_base_types.h: - -/usr/include/c++/5/bits/stl_iterator_base_funcs.h: - -/usr/include/c++/5/debug/debug.h: - -/usr/include/c++/5/bits/stl_iterator.h: - -/usr/include/c++/5/bits/ptr_traits.h: - -/usr/include/c++/5/bits/predefined_ops.h: - -/usr/include/c++/5/bits/allocator.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/c++allocator.h: - -/usr/include/c++/5/ext/new_allocator.h: - -/usr/include/c++/5/new: - -/usr/include/c++/5/exception: - -/usr/include/c++/5/bits/atomic_lockfree_defines.h: - -/usr/include/c++/5/bits/memoryfwd.h: - -/usr/include/c++/5/bits/stl_construct.h: - -/usr/include/c++/5/ext/alloc_traits.h: - -/usr/include/c++/5/bits/stl_uninitialized.h: - -/usr/include/c++/5/bits/stl_vector.h: - -/usr/include/c++/5/bits/stl_bvector.h: - -/usr/include/c++/5/bits/range_access.h: - -/usr/include/c++/5/bits/vector.tcc: - -google/protobuf/io/printer.h: - -/usr/include/c++/5/string: - -/usr/include/c++/5/bits/stringfwd.h: - -/usr/include/c++/5/bits/char_traits.h: - -/usr/include/c++/5/bits/postypes.h: - -/usr/include/c++/5/cwchar: - -/usr/include/wchar.h: - -/usr/include/stdio.h: - -/usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h: - -/usr/include/x86_64-linux-gnu/bits/wchar.h: - -/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h: - -/usr/include/xlocale.h: - -/usr/include/x86_64-linux-gnu/bits/wchar2.h: - -/usr/include/c++/5/bits/localefwd.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/c++locale.h: - -/usr/include/c++/5/clocale: - -/usr/include/locale.h: - -/usr/include/x86_64-linux-gnu/bits/locale.h: - -/usr/include/c++/5/iosfwd: - -/usr/include/c++/5/cctype: - -/usr/include/ctype.h: - -/usr/include/x86_64-linux-gnu/bits/types.h: - -/usr/include/x86_64-linux-gnu/bits/typesizes.h: - -/usr/include/endian.h: - -/usr/include/x86_64-linux-gnu/bits/endian.h: - -/usr/include/x86_64-linux-gnu/bits/byteswap.h: - -/usr/include/x86_64-linux-gnu/bits/byteswap-16.h: - -/usr/include/c++/5/bits/ostream_insert.h: - -/usr/include/c++/5/bits/cxxabi_forced.h: - -/usr/include/c++/5/bits/stl_function.h: - -/usr/include/c++/5/backward/binders.h: - -/usr/include/c++/5/bits/basic_string.h: - -/usr/include/c++/5/ext/atomicity.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/gthr.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/gthr-default.h: - -/usr/include/pthread.h: - -/usr/include/sched.h: - -/usr/include/time.h: - -/usr/include/x86_64-linux-gnu/bits/sched.h: - -/usr/include/x86_64-linux-gnu/bits/time.h: - -/usr/include/x86_64-linux-gnu/bits/timex.h: - -/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: - -/usr/include/x86_64-linux-gnu/bits/setjmp.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/atomic_word.h: - -/usr/include/c++/5/bits/basic_string.tcc: - -/usr/include/c++/5/map: - -/usr/include/c++/5/bits/stl_tree.h: - -/usr/include/c++/5/bits/stl_map.h: - -/usr/include/c++/5/bits/stl_multimap.h: - -google/protobuf/stubs/common.h: - -google/protobuf/stubs/port.h: - -/usr/include/assert.h: - -/usr/include/stdlib.h: - -/usr/include/x86_64-linux-gnu/bits/waitflags.h: - -/usr/include/x86_64-linux-gnu/bits/waitstatus.h: - -/usr/include/x86_64-linux-gnu/sys/types.h: - -/usr/include/x86_64-linux-gnu/sys/select.h: - -/usr/include/x86_64-linux-gnu/bits/select.h: - -/usr/include/x86_64-linux-gnu/bits/sigset.h: - -/usr/include/x86_64-linux-gnu/bits/select2.h: - -/usr/include/x86_64-linux-gnu/sys/sysmacros.h: - -/usr/include/alloca.h: - -/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: - -/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: - -/usr/include/x86_64-linux-gnu/bits/stdlib.h: - -/usr/include/c++/5/cstddef: - -/usr/include/string.h: - -/usr/include/x86_64-linux-gnu/bits/string3.h: - -/usr/lib/gcc/x86_64-linux-gnu/5/include/stdint.h: - -/usr/include/stdint.h: - -/usr/include/x86_64-linux-gnu/sys/param.h: - -/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/limits.h: - -/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/syslimits.h: - -/usr/include/limits.h: - -/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: - -/usr/include/x86_64-linux-gnu/bits/local_lim.h: - -/usr/include/linux/limits.h: - -/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: - -/usr/include/x86_64-linux-gnu/bits/xopen_lim.h: - -/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: - -/usr/include/signal.h: - -/usr/include/x86_64-linux-gnu/bits/signum.h: - -/usr/include/x86_64-linux-gnu/bits/siginfo.h: - -/usr/include/x86_64-linux-gnu/bits/sigaction.h: - -/usr/include/x86_64-linux-gnu/bits/sigcontext.h: - -/usr/include/x86_64-linux-gnu/bits/sigstack.h: - -/usr/include/x86_64-linux-gnu/sys/ucontext.h: - -/usr/include/x86_64-linux-gnu/bits/sigthread.h: - -/usr/include/x86_64-linux-gnu/bits/param.h: - -/usr/include/linux/param.h: - -/usr/include/x86_64-linux-gnu/asm/param.h: - -/usr/include/asm-generic/param.h: - -/usr/include/byteswap.h: - -google/protobuf/stubs/macros.h: - -google/protobuf/stubs/platform_macros.h: - -google/protobuf/stubs/logging.h: - -google/protobuf/stubs/scoped_ptr.h: - -google/protobuf/stubs/mutex.h: - -google/protobuf/stubs/callback.h: - -google/protobuf/stubs/type_traits.h: - -/usr/include/c++/5/utility: - -/usr/include/c++/5/bits/stl_relops.h: - -google/protobuf/stubs/template_util.h: - -google/protobuf/descriptor.h: - -/usr/include/c++/5/memory: - -/usr/include/c++/5/bits/stl_tempbuf.h: - -/usr/include/c++/5/bits/stl_raw_storage_iter.h: - -/usr/include/c++/5/backward/auto_ptr.h: - -google/protobuf/stubs/shared_ptr.h: - -google/protobuf/stubs/atomicops.h: - -google/protobuf/stubs/atomicops_internals_x86_gcc.h: - -/usr/include/c++/5/algorithm: - -/usr/include/c++/5/bits/stl_algo.h: - -/usr/include/c++/5/cstdlib: - -/usr/include/c++/5/bits/algorithmfwd.h: - -/usr/include/c++/5/bits/stl_heap.h: - -/usr/include/c++/5/set: - -/usr/include/c++/5/bits/stl_set.h: - -/usr/include/c++/5/bits/stl_multiset.h: diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.deps/kotlin_file_generator.Plo b/proto/compiler/google/src/google/protobuf/compiler/kotlin/.deps/kotlin_file_generator.Plo deleted file mode 100644 index 5513bd3e86d..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.deps/kotlin_file_generator.Plo +++ /dev/null @@ -1,448 +0,0 @@ -google/protobuf/compiler/kotlin/kotlin_file_generator.lo: \ - google/protobuf/compiler/kotlin/kotlin_file_generator.cc \ - /usr/include/stdc-predef.h google/protobuf/descriptor.h \ - /usr/include/c++/5/memory /usr/include/c++/5/bits/stl_algobase.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/os_defines.h \ - /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \ - /usr/include/x86_64-linux-gnu/bits/wordsize.h \ - /usr/include/x86_64-linux-gnu/gnu/stubs.h \ - /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/cpu_defines.h \ - /usr/include/c++/5/bits/functexcept.h \ - /usr/include/c++/5/bits/exception_defines.h \ - /usr/include/c++/5/bits/cpp_type_traits.h \ - /usr/include/c++/5/ext/type_traits.h \ - /usr/include/c++/5/ext/numeric_traits.h \ - /usr/include/c++/5/bits/stl_pair.h /usr/include/c++/5/bits/move.h \ - /usr/include/c++/5/bits/concept_check.h \ - /usr/include/c++/5/bits/stl_iterator_base_types.h \ - /usr/include/c++/5/bits/stl_iterator_base_funcs.h \ - /usr/include/c++/5/debug/debug.h /usr/include/c++/5/bits/stl_iterator.h \ - /usr/include/c++/5/bits/ptr_traits.h \ - /usr/include/c++/5/bits/predefined_ops.h \ - /usr/include/c++/5/bits/allocator.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/c++allocator.h \ - /usr/include/c++/5/ext/new_allocator.h /usr/include/c++/5/new \ - /usr/include/c++/5/exception \ - /usr/include/c++/5/bits/atomic_lockfree_defines.h \ - /usr/include/c++/5/bits/memoryfwd.h \ - /usr/include/c++/5/bits/stl_construct.h \ - /usr/include/c++/5/ext/alloc_traits.h \ - /usr/include/c++/5/bits/stl_uninitialized.h \ - /usr/include/c++/5/bits/stl_tempbuf.h \ - /usr/include/c++/5/bits/stl_raw_storage_iter.h \ - /usr/include/c++/5/backward/auto_ptr.h \ - google/protobuf/stubs/shared_ptr.h google/protobuf/stubs/atomicops.h \ - google/protobuf/stubs/common.h /usr/include/c++/5/string \ - /usr/include/c++/5/bits/stringfwd.h \ - /usr/include/c++/5/bits/char_traits.h /usr/include/c++/5/bits/postypes.h \ - /usr/include/c++/5/cwchar /usr/include/wchar.h /usr/include/stdio.h \ - /usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h \ - /usr/include/x86_64-linux-gnu/bits/wchar.h \ - /usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h /usr/include/xlocale.h \ - /usr/include/x86_64-linux-gnu/bits/wchar2.h \ - /usr/include/c++/5/bits/localefwd.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/c++locale.h \ - /usr/include/c++/5/clocale /usr/include/locale.h \ - /usr/include/x86_64-linux-gnu/bits/locale.h /usr/include/c++/5/iosfwd \ - /usr/include/c++/5/cctype /usr/include/ctype.h \ - /usr/include/x86_64-linux-gnu/bits/types.h \ - /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/endian.h \ - /usr/include/x86_64-linux-gnu/bits/endian.h \ - /usr/include/x86_64-linux-gnu/bits/byteswap.h \ - /usr/include/x86_64-linux-gnu/bits/byteswap-16.h \ - /usr/include/c++/5/bits/ostream_insert.h \ - /usr/include/c++/5/bits/cxxabi_forced.h \ - /usr/include/c++/5/bits/stl_function.h \ - /usr/include/c++/5/backward/binders.h \ - /usr/include/c++/5/bits/range_access.h \ - /usr/include/c++/5/bits/basic_string.h \ - /usr/include/c++/5/ext/atomicity.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/gthr.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/gthr-default.h \ - /usr/include/pthread.h /usr/include/sched.h /usr/include/time.h \ - /usr/include/x86_64-linux-gnu/bits/sched.h \ - /usr/include/x86_64-linux-gnu/bits/time.h \ - /usr/include/x86_64-linux-gnu/bits/timex.h \ - /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ - /usr/include/x86_64-linux-gnu/bits/setjmp.h \ - /usr/include/x86_64-linux-gnu/c++/5/bits/atomic_word.h \ - /usr/include/c++/5/bits/basic_string.tcc google/protobuf/stubs/port.h \ - /usr/include/assert.h /usr/include/stdlib.h \ - /usr/include/x86_64-linux-gnu/bits/waitflags.h \ - /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ - /usr/include/x86_64-linux-gnu/sys/types.h \ - /usr/include/x86_64-linux-gnu/sys/select.h \ - /usr/include/x86_64-linux-gnu/bits/select.h \ - /usr/include/x86_64-linux-gnu/bits/sigset.h \ - /usr/include/x86_64-linux-gnu/bits/select2.h \ - /usr/include/x86_64-linux-gnu/sys/sysmacros.h /usr/include/alloca.h \ - /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ - /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ - /usr/include/x86_64-linux-gnu/bits/stdlib.h /usr/include/c++/5/cstddef \ - /usr/include/string.h /usr/include/x86_64-linux-gnu/bits/string3.h \ - /usr/lib/gcc/x86_64-linux-gnu/5/include/stdint.h /usr/include/stdint.h \ - /usr/include/x86_64-linux-gnu/sys/param.h \ - /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/limits.h \ - /usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/syslimits.h \ - /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \ - /usr/include/x86_64-linux-gnu/bits/local_lim.h \ - /usr/include/linux/limits.h \ - /usr/include/x86_64-linux-gnu/bits/posix2_lim.h \ - /usr/include/x86_64-linux-gnu/bits/xopen_lim.h \ - /usr/include/x86_64-linux-gnu/bits/stdio_lim.h /usr/include/signal.h \ - /usr/include/x86_64-linux-gnu/bits/signum.h \ - /usr/include/x86_64-linux-gnu/bits/siginfo.h \ - /usr/include/x86_64-linux-gnu/bits/sigaction.h \ - /usr/include/x86_64-linux-gnu/bits/sigcontext.h \ - /usr/include/x86_64-linux-gnu/bits/sigstack.h \ - /usr/include/x86_64-linux-gnu/sys/ucontext.h \ - /usr/include/x86_64-linux-gnu/bits/sigthread.h \ - /usr/include/x86_64-linux-gnu/bits/param.h /usr/include/linux/param.h \ - /usr/include/x86_64-linux-gnu/asm/param.h \ - /usr/include/asm-generic/param.h /usr/include/byteswap.h \ - google/protobuf/stubs/macros.h google/protobuf/stubs/platform_macros.h \ - google/protobuf/stubs/logging.h google/protobuf/stubs/scoped_ptr.h \ - google/protobuf/stubs/mutex.h google/protobuf/stubs/callback.h \ - google/protobuf/stubs/type_traits.h /usr/include/c++/5/utility \ - /usr/include/c++/5/bits/stl_relops.h \ - google/protobuf/stubs/template_util.h \ - google/protobuf/stubs/atomicops_internals_x86_gcc.h \ - /usr/include/c++/5/algorithm /usr/include/c++/5/bits/stl_algo.h \ - /usr/include/c++/5/cstdlib /usr/include/c++/5/bits/algorithmfwd.h \ - /usr/include/c++/5/bits/stl_heap.h /usr/include/c++/5/set \ - /usr/include/c++/5/bits/stl_tree.h /usr/include/c++/5/bits/stl_set.h \ - /usr/include/c++/5/bits/stl_multiset.h /usr/include/c++/5/vector \ - /usr/include/c++/5/bits/stl_vector.h \ - /usr/include/c++/5/bits/stl_bvector.h /usr/include/c++/5/bits/vector.tcc \ - google/protobuf/io/zero_copy_stream.h \ - google/protobuf/compiler/kotlin/kotlin_file_generator.h \ - google/protobuf/compiler/kotlin/kotlin_class_generator.h \ - google/protobuf/io/printer.h /usr/include/c++/5/map \ - /usr/include/c++/5/bits/stl_map.h /usr/include/c++/5/bits/stl_multimap.h \ - google/protobuf/compiler/code_generator.h - -/usr/include/stdc-predef.h: - -google/protobuf/descriptor.h: - -/usr/include/c++/5/memory: - -/usr/include/c++/5/bits/stl_algobase.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/os_defines.h: - -/usr/include/features.h: - -/usr/include/x86_64-linux-gnu/sys/cdefs.h: - -/usr/include/x86_64-linux-gnu/bits/wordsize.h: - -/usr/include/x86_64-linux-gnu/gnu/stubs.h: - -/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/cpu_defines.h: - -/usr/include/c++/5/bits/functexcept.h: - -/usr/include/c++/5/bits/exception_defines.h: - -/usr/include/c++/5/bits/cpp_type_traits.h: - -/usr/include/c++/5/ext/type_traits.h: - -/usr/include/c++/5/ext/numeric_traits.h: - -/usr/include/c++/5/bits/stl_pair.h: - -/usr/include/c++/5/bits/move.h: - -/usr/include/c++/5/bits/concept_check.h: - -/usr/include/c++/5/bits/stl_iterator_base_types.h: - -/usr/include/c++/5/bits/stl_iterator_base_funcs.h: - -/usr/include/c++/5/debug/debug.h: - -/usr/include/c++/5/bits/stl_iterator.h: - -/usr/include/c++/5/bits/ptr_traits.h: - -/usr/include/c++/5/bits/predefined_ops.h: - -/usr/include/c++/5/bits/allocator.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/c++allocator.h: - -/usr/include/c++/5/ext/new_allocator.h: - -/usr/include/c++/5/new: - -/usr/include/c++/5/exception: - -/usr/include/c++/5/bits/atomic_lockfree_defines.h: - -/usr/include/c++/5/bits/memoryfwd.h: - -/usr/include/c++/5/bits/stl_construct.h: - -/usr/include/c++/5/ext/alloc_traits.h: - -/usr/include/c++/5/bits/stl_uninitialized.h: - -/usr/include/c++/5/bits/stl_tempbuf.h: - -/usr/include/c++/5/bits/stl_raw_storage_iter.h: - -/usr/include/c++/5/backward/auto_ptr.h: - -google/protobuf/stubs/shared_ptr.h: - -google/protobuf/stubs/atomicops.h: - -google/protobuf/stubs/common.h: - -/usr/include/c++/5/string: - -/usr/include/c++/5/bits/stringfwd.h: - -/usr/include/c++/5/bits/char_traits.h: - -/usr/include/c++/5/bits/postypes.h: - -/usr/include/c++/5/cwchar: - -/usr/include/wchar.h: - -/usr/include/stdio.h: - -/usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h: - -/usr/include/x86_64-linux-gnu/bits/wchar.h: - -/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h: - -/usr/include/xlocale.h: - -/usr/include/x86_64-linux-gnu/bits/wchar2.h: - -/usr/include/c++/5/bits/localefwd.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/c++locale.h: - -/usr/include/c++/5/clocale: - -/usr/include/locale.h: - -/usr/include/x86_64-linux-gnu/bits/locale.h: - -/usr/include/c++/5/iosfwd: - -/usr/include/c++/5/cctype: - -/usr/include/ctype.h: - -/usr/include/x86_64-linux-gnu/bits/types.h: - -/usr/include/x86_64-linux-gnu/bits/typesizes.h: - -/usr/include/endian.h: - -/usr/include/x86_64-linux-gnu/bits/endian.h: - -/usr/include/x86_64-linux-gnu/bits/byteswap.h: - -/usr/include/x86_64-linux-gnu/bits/byteswap-16.h: - -/usr/include/c++/5/bits/ostream_insert.h: - -/usr/include/c++/5/bits/cxxabi_forced.h: - -/usr/include/c++/5/bits/stl_function.h: - -/usr/include/c++/5/backward/binders.h: - -/usr/include/c++/5/bits/range_access.h: - -/usr/include/c++/5/bits/basic_string.h: - -/usr/include/c++/5/ext/atomicity.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/gthr.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/gthr-default.h: - -/usr/include/pthread.h: - -/usr/include/sched.h: - -/usr/include/time.h: - -/usr/include/x86_64-linux-gnu/bits/sched.h: - -/usr/include/x86_64-linux-gnu/bits/time.h: - -/usr/include/x86_64-linux-gnu/bits/timex.h: - -/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h: - -/usr/include/x86_64-linux-gnu/bits/setjmp.h: - -/usr/include/x86_64-linux-gnu/c++/5/bits/atomic_word.h: - -/usr/include/c++/5/bits/basic_string.tcc: - -google/protobuf/stubs/port.h: - -/usr/include/assert.h: - -/usr/include/stdlib.h: - -/usr/include/x86_64-linux-gnu/bits/waitflags.h: - -/usr/include/x86_64-linux-gnu/bits/waitstatus.h: - -/usr/include/x86_64-linux-gnu/sys/types.h: - -/usr/include/x86_64-linux-gnu/sys/select.h: - -/usr/include/x86_64-linux-gnu/bits/select.h: - -/usr/include/x86_64-linux-gnu/bits/sigset.h: - -/usr/include/x86_64-linux-gnu/bits/select2.h: - -/usr/include/x86_64-linux-gnu/sys/sysmacros.h: - -/usr/include/alloca.h: - -/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: - -/usr/include/x86_64-linux-gnu/bits/stdlib-float.h: - -/usr/include/x86_64-linux-gnu/bits/stdlib.h: - -/usr/include/c++/5/cstddef: - -/usr/include/string.h: - -/usr/include/x86_64-linux-gnu/bits/string3.h: - -/usr/lib/gcc/x86_64-linux-gnu/5/include/stdint.h: - -/usr/include/stdint.h: - -/usr/include/x86_64-linux-gnu/sys/param.h: - -/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/limits.h: - -/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed/syslimits.h: - -/usr/include/limits.h: - -/usr/include/x86_64-linux-gnu/bits/posix1_lim.h: - -/usr/include/x86_64-linux-gnu/bits/local_lim.h: - -/usr/include/linux/limits.h: - -/usr/include/x86_64-linux-gnu/bits/posix2_lim.h: - -/usr/include/x86_64-linux-gnu/bits/xopen_lim.h: - -/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: - -/usr/include/signal.h: - -/usr/include/x86_64-linux-gnu/bits/signum.h: - -/usr/include/x86_64-linux-gnu/bits/siginfo.h: - -/usr/include/x86_64-linux-gnu/bits/sigaction.h: - -/usr/include/x86_64-linux-gnu/bits/sigcontext.h: - -/usr/include/x86_64-linux-gnu/bits/sigstack.h: - -/usr/include/x86_64-linux-gnu/sys/ucontext.h: - -/usr/include/x86_64-linux-gnu/bits/sigthread.h: - -/usr/include/x86_64-linux-gnu/bits/param.h: - -/usr/include/linux/param.h: - -/usr/include/x86_64-linux-gnu/asm/param.h: - -/usr/include/asm-generic/param.h: - -/usr/include/byteswap.h: - -google/protobuf/stubs/macros.h: - -google/protobuf/stubs/platform_macros.h: - -google/protobuf/stubs/logging.h: - -google/protobuf/stubs/scoped_ptr.h: - -google/protobuf/stubs/mutex.h: - -google/protobuf/stubs/callback.h: - -google/protobuf/stubs/type_traits.h: - -/usr/include/c++/5/utility: - -/usr/include/c++/5/bits/stl_relops.h: - -google/protobuf/stubs/template_util.h: - -google/protobuf/stubs/atomicops_internals_x86_gcc.h: - -/usr/include/c++/5/algorithm: - -/usr/include/c++/5/bits/stl_algo.h: - -/usr/include/c++/5/cstdlib: - -/usr/include/c++/5/bits/algorithmfwd.h: - -/usr/include/c++/5/bits/stl_heap.h: - -/usr/include/c++/5/set: - -/usr/include/c++/5/bits/stl_tree.h: - -/usr/include/c++/5/bits/stl_set.h: - -/usr/include/c++/5/bits/stl_multiset.h: - -/usr/include/c++/5/vector: - -/usr/include/c++/5/bits/stl_vector.h: - -/usr/include/c++/5/bits/stl_bvector.h: - -/usr/include/c++/5/bits/vector.tcc: - -google/protobuf/io/zero_copy_stream.h: - -google/protobuf/compiler/kotlin/kotlin_file_generator.h: - -google/protobuf/compiler/kotlin/kotlin_class_generator.h: - -google/protobuf/io/printer.h: - -/usr/include/c++/5/map: - -/usr/include/c++/5/bits/stl_map.h: - -/usr/include/c++/5/bits/stl_multimap.h: - -google/protobuf/compiler/code_generator.h: diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.dirstamp b/proto/compiler/google/src/google/protobuf/compiler/kotlin/.dirstamp deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.idea/kotlin.iml b/proto/compiler/google/src/google/protobuf/compiler/kotlin/.idea/kotlin.iml deleted file mode 100644 index 887d93de37f..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.idea/kotlin.iml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.idea/misc.xml b/proto/compiler/google/src/google/protobuf/compiler/kotlin/.idea/misc.xml deleted file mode 100644 index 9658992fde3..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.idea/misc.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.idea/modules.xml b/proto/compiler/google/src/google/protobuf/compiler/kotlin/.idea/modules.xml deleted file mode 100644 index a1680807709..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.libs/kotlin_class_generator.o b/proto/compiler/google/src/google/protobuf/compiler/kotlin/.libs/kotlin_class_generator.o deleted file mode 100644 index 1519cdd39d2e56cdd2dd3679b2ac68c1d3b70981..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679312 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 diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/.libs/kotlin_file_generator.o b/proto/compiler/google/src/google/protobuf/compiler/kotlin/.libs/kotlin_file_generator.o deleted file mode 100644 index e8e4dd40e039be882c94b03c547f6223fb805a03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303360 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

    rIOsC9CkuP^0L{IucgLTRrO#C*`2gKL2 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 z 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 MQ<$Fp|2cmDKMU*XGynhq diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/Makefile b/proto/compiler/google/src/google/protobuf/compiler/kotlin/Makefile deleted file mode 100644 index ef92415c9fd..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/Makefile +++ /dev/null @@ -1,81 +0,0 @@ -CXX = g++ -CXXFLAGS = -O2 -std=c++11 -LDFLAGS = -lprotoc -lprotobuf - -EXE = protoc -SRCDIR = src -BINDIR = bin -TESTDIR = test -PROJECTS = protoc-tests - -# Project for Java-backend -JVPROJECT = $(PROJECTS)/kt_java_tests -JVKTOUT = $(JVPROJECT)/src/kotlin_msg -JAVAOUT = $(JVPROJECT)/src - -# Project for JS-backed -JSPROJECT = $(PROJECTS)/kt_js_tests -JSKTOUT = $(JSPROJECT)/src/kotlin_msg -JSOUT = $(JSPROJECT)/src/js_msg - - -# Build protoc-executable -all: $(EXE) - -OBJECTS = $(patsubst $(SRCDIR)/%.cc,$(BINDIR)/%.o,$(wildcard $(SRCDIR)/*.cc)) - -$(EXE): $(BINDIR) $(OBJECTS) - $(CXX) $(OBJECTS) -o $(EXE) $(LDFLAGS) - -$(BINDIR)/%.o: $(SRCDIR)/%.cc - $(CXX) $(CXXFLAGS) -c -MMD -o $@ $< - -include $(wildcard $(BINDIR)/*.d) - - -# Create auxillary directories -$(BINDIR): - mkdir -p $(BINDIR) - -$(JVKTOUT): - mkdir -p $(JVKTOUT) - -$(JAVAOUT): - mkdir -p $(JAVAOUT) - -$(JSKTOUT): - mkdir -p $(JSKTOUT) - -$(JSOUT): - mkdir -p $(JSOUT) - -clean: - rm -rf $(BINDIR) - rm $(EXE) - rm -rf $(JVKTOUT) - rm -rf $(JAVAOUT)/java_msg - rm -rf $(JSKTOUT) - rm -rf $(JSOUT) - -# Java-backend tests generation -$(JVKTOUT)/%.kt: $(TESTDIR)/%.proto $(EXE) - ./protoc --kotlin_out=$(JVKTOUT) $< - -java: $(TESTDIR)/*.proto - protoc --java_out=$(JAVAOUT) $^ - -JVKT_ARTIFACTS = $(patsubst $(TESTDIR)/%.proto,$(JVKTOUT)/%.kt,$(wildcard $(TESTDIR)/*.proto)) - -# JS-backend tests generation -$(JSKTOUT)/%.kt: $(TESTDIR)/%.proto $(EXE) - ./protoc --kotlin_out=$(JSKTOUT) $< - -js: $(TESTDIR)/*.proto - protoc --js_out=$(JSOUT) $^ - -JS_ARTIFACTS = $(patsubst $(TESTDIR)/%.proto,$(JSKTOUT)/%.kt,$(wildcard $(TESTDIR)/*.proto)) - -# Generate proto-messages from proto-sources -generate: $(JVKTOUT) $(JAVAOUT) $(JVKT_ARTIFACTS) $(JSKTOUT) $(JSOUT) $(JS_ARTIFACTS) js java - -.PHONY: clean all generate java js diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/build.gradle b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/build.gradle deleted file mode 100644 index c5e8bc13593..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/build.gradle +++ /dev/null @@ -1,39 +0,0 @@ -buildscript { - ext.kotlin_version = '1.0.3' - - repositories { - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.2" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -apply plugin: 'java' -apply plugin: 'kotlin' -apply plugin: 'idea' -apply plugin: 'application' - -mainClassName = 'kt_java_tests.MainKt' - -repositories { - mavenCentral() -} - -task runTests() { -} - -runTests.dependsOn run - -dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib:1.0.1" - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - // https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java - compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.0.0' - compile files ('../../../../../../../../build/protokot-runtime.jar') -} - -sourceSets { - main.java.srcDirs += 'src' -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradle/wrapper/gradle-wrapper.jar b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 941144813d241db74e1bf25b6804c679fbe7f0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53636 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 DXC5Z7 diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradle/wrapper/gradle-wrapper.properties b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 7bc198b6300..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Tue Aug 16 15:36:51 MSK 2016 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-bin.zip diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradlew b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradlew deleted file mode 100755 index 9d82f789151..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# 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 -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# 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 - -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" ] ; 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 - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradlew.bat b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradlew.bat deleted file mode 100644 index aec99730b4e..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@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 - -@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= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@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 Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_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=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -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/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/BaseExtendedTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/BaseExtendedTest.kt deleted file mode 100644 index 29150574b42..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/BaseExtendedTest.kt +++ /dev/null @@ -1,244 +0,0 @@ -package kt_java_tests - -import java_msg.BaseMessage -import java_msg.ExtendedMessage -import Base -import CodedInputStream -import Extended -import java.io.ByteArrayOutputStream - - -object BaseExtendedTest { - fun generateKtBaseMessage(): Base { - val arrSize = RandomGen.rnd.nextInt(1000) - val arr = LongArray(arrSize) - for (i in 0..(arrSize - 1)) { - arr[i] = RandomGen.rnd.nextLong() - } - - val flag = if (RandomGen.rnd.nextInt() % 2 == 0) false else true - - val int = RandomGen.rnd.nextInt() - - return Base.BuilderBase(arr, flag, int).build() - } - - fun generateKtExtendedMessage(): Extended { - val arrSize = RandomGen.rnd.nextInt(1000) - val arr = LongArray(arrSize) - for (i in 0..(arrSize - 1)) { - arr[i] = RandomGen.rnd.nextLong() - } - - val flag = if (RandomGen.rnd.nextInt() % 2 == 0) false else true - - val int = RandomGen.rnd.nextInt() - - val long = RandomGen.rnd.nextLong() - - val longsSize = RandomGen.rnd.nextInt(1000) - val longs = LongArray(longsSize) - for (i in 0..(longsSize - 1)) { - longs[i] = RandomGen.rnd.nextLong() - } - - return Extended.BuilderExtended(arr, longs, flag, long, int).build() - } - - fun generateJvBaseMessage(): BaseMessage.Base { - val arrSize = RandomGen.rnd.nextInt(1000) - val arr = LongArray(arrSize) - for (i in 0..(arrSize - 1)) { - arr[i] = RandomGen.rnd.nextLong() - } - - val flag = if (RandomGen.rnd.nextInt() % 2 == 0) false else true - - val int = RandomGen.rnd.nextInt() - - return BaseMessage.Base.newBuilder() - .addAllArr(arr.asIterable()) - .setFlag(flag) - .setInt(int) - .build() - } - - fun generateJvExtendedMessage(): ExtendedMessage.Extended { - val arrSize = RandomGen.rnd.nextInt(1000) - val arr = LongArray(arrSize) - for (i in 0..(arrSize - 1)) { - arr[i] = RandomGen.rnd.nextLong() - } - - val flag = if (RandomGen.rnd.nextInt() % 2 == 0) false else true - - val int = RandomGen.rnd.nextInt() - - val long = RandomGen.rnd.nextLong() - - val longsSize = RandomGen.rnd.nextInt(1000) - val longs = LongArray(longsSize) - for (i in 0..(longsSize - 1)) { - longs[i] = RandomGen.rnd.nextLong() - } - - return ExtendedMessage.Extended.newBuilder() - .addAllArr(arr.asIterable()) - .addAllArrLongs(longs.asIterable()) - .setFlag(flag) - .setInt(int) - .setLong(long) - .build() - } - - fun compareBases(kt: Base, jv: BaseMessage.Base): Boolean { - return kt.flag == jv.flag && - kt.int == jv.int && - Util.compareArrays(kt.arr.asIterable(), jv.arrList) - } - - fun compareExtended(kt: Extended, jv: ExtendedMessage.Extended): Boolean { - return kt.flag == jv.flag && - kt.int == jv.int && - Util.compareArrays(kt.arr.asIterable(), jv.arrList) && - Util.compareArrays(kt.arr_longs.asIterable(), jv.arrLongsList) && - kt.long == jv.long - } - - fun compareBaseKtToJavaExtended(kt: Base, jv: ExtendedMessage.Extended): Boolean { - return kt.flag == jv.flag && - kt.int == jv.int && - Util.compareArrays(kt.arr.asIterable(), jv.arrList) - } - - fun compareExtendedKtToJavaBase(kt: Extended, jv: BaseMessage.Base): Boolean { - return kt.flag == jv.flag && - kt.int == jv.int && - Util.compareArrays(kt.arr.asIterable(), jv.arrList) - } - - fun baseKtToBaseJavaOnce() { - val kt = generateKtBaseMessage() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = BaseMessage.Base.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareBases(kt, jv)) - } - - fun baseJavaToBaseKtOnce() { - val outs = ByteArrayOutputStream(100000) - - val jv = generateJvBaseMessage() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = Base.BuilderBase(LongArray(0), false, 0).build() - kt.mergeFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareBases(kt, jv)) - } - - fun baseKtToExtendedJavaOnce() { - val kt = generateKtBaseMessage() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = ExtendedMessage.Extended.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareBaseKtToJavaExtended(kt, jv)) - } - - fun extendedJavaToBaseKtOnce() { - val outs = ByteArrayOutputStream(100000) - - val jv = generateJvExtendedMessage() - jv.writeTo(outs) - - val ins = CodedInputStream(outs.toByteArray()) - - val kt = Base.BuilderBase(LongArray(0), false, 0).build() - kt.mergeFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareBaseKtToJavaExtended(kt, jv)) - } - - fun extendedKtToBaseJavaOnce() { - val kt = generateKtExtendedMessage() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = BaseMessage.Base.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareExtendedKtToJavaBase(kt, jv)) - } - - fun baseJavaToExtendedKtOnce() { - val outs = ByteArrayOutputStream(100000) - - val jv = generateJvBaseMessage() - jv.writeTo(outs) - - val ins = CodedInputStream(outs.toByteArray()) - - val kt = Extended.BuilderExtended(LongArray(0), LongArray(0), false, 0L, 0).build() - kt.mergeFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareExtendedKtToJavaBase(kt, jv)) - } - - fun extendedKtToExtendedJavaOnce() { - val kt = generateKtExtendedMessage() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = ExtendedMessage.Extended.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareExtended(kt, jv)) - } - - fun extendedJavaToExtendedKtOnce() { - val outs = ByteArrayOutputStream(100000) - - val jv = generateJvExtendedMessage() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = Extended.BuilderExtended(LongArray(0), LongArray(0), false, 0L, 0).build() - kt.mergeFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareExtended(kt, jv)) - } - - val testRuns = 1000 - fun runTests() { - for (i in 0..testRuns) { - // base - base - baseJavaToBaseKtOnce() - baseKtToBaseJavaOnce() - - // base - extended - baseKtToExtendedJavaOnce() - // extendedJavaToBaseKtOnce() - currently failing, proper parsing of unknown fields is needed. - - // extended - base - baseJavaToExtendedKtOnce() - extendedKtToBaseJavaOnce() - - // extended - extended - extendedJavaToExtendedKtOnce() - extendedKtToExtendedJavaOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/ConnectTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/ConnectTest.kt deleted file mode 100644 index e934cc29ac8..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/ConnectTest.kt +++ /dev/null @@ -1,87 +0,0 @@ -package kt_java_tests - -import java_msg.Connect -import CodedInputStream -import ConnectionRequest -import java.io.ByteArrayOutputStream - -object ConnectTest { - fun generateKotlinConnectionRequestMessage(): ConnectionRequest { - val arrSize = RandomGen.rnd.nextInt(1000) - val arr = IntArray(arrSize) - for (i in 0..(arrSize - 1)) { - arr[i] = RandomGen.rnd.nextInt() - } - - val port = RandomGen.rnd.nextInt() - - val msg = ConnectionRequest.BuilderConnectionRequest(arr, port).build() - - return msg - } - - - fun generateJavaConnectionRequest(): Connect.ConnectionRequest { - val arrSize = RandomGen.rnd.nextInt(1000) - val arr = IntArray(arrSize) - for (i in 0..(arrSize - 1)) { - arr[i] = RandomGen.rnd.nextInt() - } - - val port = RandomGen.rnd.nextInt() - - val msg = Connect.ConnectionRequest.newBuilder().addAllIp(arr.asIterable()).setPort(port).build() - - return msg - } - - - - fun compareConnectionRequests(kt: ConnectionRequest, jv: Connect.ConnectionRequest): Boolean { - return Util.compareArrays(kt.ip.asIterable(), jv.ipList.asIterable()) - } - - - fun ktToJavaOnce() { - val ktConnectionRequest = generateKotlinConnectionRequestMessage() - val outs = Util.getKtOutputStream(ktConnectionRequest.getSizeNoTag()) - ktConnectionRequest.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jvConnectionRequest = Connect.ConnectionRequest.parseFrom(ins) - - Util.assert(ktConnectionRequest.errorCode == 0) - Util.assert(compareConnectionRequests(ktConnectionRequest, jvConnectionRequest)) - } - - val testRuns = 10 - - fun KtToJava() { - for (i in 0..testRuns) { - ktToJavaOnce() - } - } - - fun JavaToKtOnce() { - val outs = ByteArrayOutputStream(100000) - - val jvConnectionRequest = generateJavaConnectionRequest() - jvConnectionRequest.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val ktConnectionRequest = ConnectionRequest.BuilderConnectionRequest(IntArray(0), 0).parseFrom(ins).build() - - Util.assert(ktConnectionRequest.errorCode == 0) - Util.assert(compareConnectionRequests(ktConnectionRequest, jvConnectionRequest)) - } - - fun JavaToKt() { - for (i in 0..testRuns) { - JavaToKtOnce() - } - } - - fun runTests() { - KtToJava() - JavaToKt() - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/CrossBranchTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/CrossBranchTest.kt deleted file mode 100644 index f34b7ca2a00..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/CrossBranchTest.kt +++ /dev/null @@ -1,126 +0,0 @@ -package kt_java_tests - -import java_msg.CrossBranchOuterClass -import CodedInputStream -import CrossBranch -import java.io.ByteArrayOutputStream - -object CrossBranchTest { - fun generateKtGrandFather(): CrossBranch.Grandfather { - fun generateKtRightFather(): CrossBranch.Grandfather.RightFather { - fun generateKtRightLeftSon(): CrossBranch.Grandfather.RightFather.RightLeftSon { - fun generateKtLeftLeftSon(): CrossBranch.Grandfather.LeftFather.LeftLeftSon { - return CrossBranch.Grandfather.LeftFather.LeftLeftSon.BuilderLeftLeftSon(RandomGen.rnd.nextInt()).build() - } - - val msg = CrossBranch.Grandfather.RightFather.RightLeftSon.BuilderRightLeftSon( - generateKtLeftLeftSon() - ).build() - return msg - } - - fun generateKtRightRightSon(): CrossBranch.Grandfather.RightFather.RightRightSon { - fun generateKtLeftRightSon(): CrossBranch.Grandfather.LeftFather.LeftRightSon { - return CrossBranch.Grandfather.LeftFather.LeftRightSon.BuilderLeftRightSon(RandomGen.rnd.nextInt()).build() - } - - return CrossBranch.Grandfather.RightFather.RightRightSon.BuilderRightRightSon( - generateKtLeftRightSon() - ).build() - } - - val msg = CrossBranch.Grandfather.RightFather.BuilderRightFather( - generateKtRightLeftSon(), - generateKtRightRightSon() - ).build() - - return msg - } - - return CrossBranch.Grandfather.BuilderGrandfather(generateKtRightFather()).build() - } - - fun generateJvGrandFather(): CrossBranchOuterClass.CrossBranch.Grandfather { - fun generateJvRightFather(): CrossBranchOuterClass.CrossBranch.Grandfather.RightFather { - fun generateJvRightLeftSon(): CrossBranchOuterClass.CrossBranch.Grandfather.RightFather.RightLeftSon { - fun generateJvLeftLeftSon(): CrossBranchOuterClass.CrossBranch.Grandfather.LeftFather.LeftLeftSon { - return CrossBranchOuterClass.CrossBranch.Grandfather.LeftFather.LeftLeftSon.newBuilder() - .setSonField(RandomGen.rnd.nextInt()).build() - } - - return CrossBranchOuterClass.CrossBranch.Grandfather.RightFather.RightLeftSon.newBuilder() - .setSonField(generateJvLeftLeftSon()).build() - } - - fun generateJvRightRightSon(): CrossBranchOuterClass.CrossBranch.Grandfather.RightFather.RightRightSon { - fun generateJvLeftRightSon(): CrossBranchOuterClass.CrossBranch.Grandfather.LeftFather.LeftRightSon { - return CrossBranchOuterClass.CrossBranch.Grandfather.LeftFather.LeftRightSon.newBuilder() - .setSonField(RandomGen.rnd.nextInt()).build() - } - - return CrossBranchOuterClass.CrossBranch.Grandfather.RightFather.RightRightSon.newBuilder() - .setSonField(generateJvLeftRightSon()).build() - } - - return CrossBranchOuterClass.CrossBranch.Grandfather.RightFather.newBuilder() - .setRls( - generateJvRightLeftSon() - ) - .setRrs( - generateJvRightRightSon() - ) - .build() - } - - return CrossBranchOuterClass.CrossBranch.Grandfather.newBuilder().setRf(generateJvRightFather()).build() - } - - fun compareGrandFathers(kt: CrossBranch.Grandfather, jv: CrossBranchOuterClass.CrossBranch.Grandfather): Boolean { - return kt.rf.rls.son_field.son_field == jv.rf.rls.sonField.sonField && - kt.rf.rrs.son_field.son_field == jv.rf.rrs.sonField.sonField - } - - val testRuns = 10 - - fun KtToJavaOnce() { - val kt = generateKtGrandFather() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = CrossBranchOuterClass.CrossBranch.Grandfather.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareGrandFathers(kt, jv)) - } - - fun KtToJava() { - for (i in 0..testRuns) { - KtToJavaOnce() - } - } - - fun JavaToKtOnce() { - val outs = ByteArrayOutputStream(100000) - - val jv = generateJvGrandFather() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = generateKtGrandFather() - kt.mergeFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareGrandFathers(kt, jv)) - } - - fun JavaToKT() { - for (i in 0..testRuns) { - JavaToKtOnce() - } - } - - fun runTests() { - KtToJava() - JavaToKT() - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/DirectionTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/DirectionTest.kt deleted file mode 100644 index 2ba342732fb..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/DirectionTest.kt +++ /dev/null @@ -1,68 +0,0 @@ -package kt_java_tests - -import java_msg.Direction -import CodedInputStream -import DirectionRequest -import java.io.ByteArrayOutputStream - -object DirectionTest { - fun generateKtDirectionRequest(): DirectionRequest { - return DirectionRequest.BuilderDirectionRequest( - DirectionRequest.Command.fromIntToCommand(RandomGen.rnd.nextInt(4)) - ).build() - } - - fun generateJvDirectionRequest(): Direction.DirectionRequest { - return Direction.DirectionRequest.newBuilder() - .setCommandValue(RandomGen.rnd.nextInt(4) - ).build() - } - - fun compareDirectionRequests(kt: DirectionRequest, jv: Direction.DirectionRequest): Boolean { - return kt.command.id == jv.command.number - } - - val testRuns = 1000 - - fun KtToJavaOnce() { - val kt = generateKtDirectionRequest() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = Direction.DirectionRequest.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareDirectionRequests(kt, jv)) - } - - fun KtToJava() { - for (i in 0..testRuns) { - KtToJavaOnce() - } - } - - fun JavaToKtOnce() { - val outs = ByteArrayOutputStream(100000) - - val jv = generateJvDirectionRequest() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = generateKtDirectionRequest() - kt.mergeFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareDirectionRequests(kt, jv)) - } - - fun JavaToKT() { - for (i in 0..testRuns) { - JavaToKtOnce() - } - } - - fun runTests() { - KtToJava() - JavaToKT() - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/Location.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/Location.kt deleted file mode 100644 index 55da1a83176..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/Location.kt +++ /dev/null @@ -1,81 +0,0 @@ -package kt_java_tests - -import java_msg.Location -import CodedInputStream -import LocationResponse -import java.io.ByteArrayOutputStream - -object Location { - fun generateKtLocationResponse(): LocationResponse { - fun generateKtLocationData(): LocationResponse.LocationData { - return LocationResponse.LocationData.BuilderLocationData( - RandomGen.rnd.nextInt(), - RandomGen.rnd.nextInt(), - RandomGen.rnd.nextInt() - ).build() - } - - return LocationResponse.BuilderLocationResponse( - generateKtLocationData(), - RandomGen.rnd.nextInt(), - RandomGen.rnd.nextInt() - ).build() - } - - fun generateJvLocationResponse(): Location.LocationResponse { - fun generateJvLocationData(): Location.LocationResponse.LocationData { - return java_msg.Location.LocationResponse.LocationData.newBuilder() - .setX(RandomGen.rnd.nextInt()) - .setY(RandomGen.rnd.nextInt()) - .setAngle(RandomGen.rnd.nextInt()) - .build() - } - - return java_msg.Location.LocationResponse.newBuilder() - .setLocationResponseData(generateJvLocationData()) - .setCode(RandomGen.rnd.nextInt()) - .build() - } - - fun compareLocationResponses(kt: LocationResponse, jv: Location.LocationResponse): Boolean { - fun compareLocationDatas(kt: LocationResponse.LocationData, jv: Location.LocationResponse.LocationData): Boolean { - return kt.x == jv.x && kt.y == jv.y && kt.angle == jv.angle - } - - return kt.code == jv.code && compareLocationDatas(kt.locationResponseData, jv.locationResponseData) - } - - fun ktToJavaOnce() { - val kt = generateKtLocationResponse() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = java_msg.Location.LocationResponse.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareLocationResponses(kt, jv)) - } - - fun JavaToKtOnce() { - val outs = ByteArrayOutputStream(100000) - - val jv = generateJvLocationResponse() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = LocationResponse.BuilderLocationResponse(LocationResponse.LocationData.BuilderLocationData(0, 0, 0).build(), 0, 0).build() - kt.mergeFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareLocationResponses(kt, jv)) - } - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - ktToJavaOnce() - JavaToKtOnce() - } - } -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/MultipleMessagesTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/MultipleMessagesTest.kt deleted file mode 100644 index d7fe1a73101..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/MultipleMessagesTest.kt +++ /dev/null @@ -1,72 +0,0 @@ -package kt_java_tests - -import java_msg.MultipleMessages -import CodedInputStream -import FirstMessage -import SecondMessage -import ThirdMessage -import java.io.ByteArrayOutputStream - -object MultipleMessagesTest { - fun generateKtFirstMessage(): FirstMessage { - return FirstMessage.BuilderFirstMessage(RandomGen.rnd.nextInt()).build() - } - - fun generateKtSecondMessage(): SecondMessage { - return SecondMessage.BuilderSecondMessage(generateKtFirstMessage()).build() - } - - fun generateKtThirdMessage(): ThirdMessage { - return ThirdMessage.BuilderThirdMessage(generateKtSecondMessage()).build() - } - - fun generateJvFirstMessage(): MultipleMessages.FirstMessage { - return MultipleMessages.FirstMessage.newBuilder().setIntField(RandomGen.rnd.nextInt()).build() - } - - fun generateJvSecondMessage(): MultipleMessages.SecondMessage { - return MultipleMessages.SecondMessage.newBuilder().setFirstMsg(generateJvFirstMessage()).build() - } - - fun generateJvThirdMessage(): MultipleMessages.ThirdMessage { - return MultipleMessages.ThirdMessage.newBuilder().setSecondMsg(generateJvSecondMessage()).build() - } - - fun compareThirdMessages(kt: ThirdMessage, jv: MultipleMessages.ThirdMessage): Boolean { - return kt.second_msg.first_msg.int_field == jv.secondMsg.firstMsg.intField - } - - fun ktToJavaOnce() { - val kt = generateKtThirdMessage() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = MultipleMessages.ThirdMessage.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareThirdMessages(kt, jv)) - } - - fun JavaToKtOnce() { - val outs = ByteArrayOutputStream(100000) - - val jv = generateJvThirdMessage() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = ThirdMessage.BuilderThirdMessage(SecondMessage.BuilderSecondMessage(FirstMessage.BuilderFirstMessage(0).build()).build()).build() - kt.mergeFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareThirdMessages(kt, jv)) - } - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - ktToJavaOnce() - JavaToKtOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/RandomGen.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/RandomGen.kt deleted file mode 100644 index 79b2720a199..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/RandomGen.kt +++ /dev/null @@ -1,7 +0,0 @@ -package kt_java_tests - -import java.util.* - -object RandomGen { - val rnd = Random(42); -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/RepeatedVarintsTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/RepeatedVarintsTest.kt deleted file mode 100644 index a506c0528d7..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/RepeatedVarintsTest.kt +++ /dev/null @@ -1,88 +0,0 @@ -package kt_java_tests - -import java_msg.RepeatedVarints -import CodedInputStream -import MessageRepeatedVarints -import java.io.ByteArrayOutputStream - -object RepeatedVarintsTest { - fun generateKtRepeatedVarints(): MessageRepeatedVarints { - val int = Util.generateIntArray() - val long = Util.generateLongArray() - val sint = Util.generateIntArray() - val slong = Util.generateLongArray() - val bool = Util.generateBoolArray() - val uint = Util.generateIntArray() - val ulong = Util.generateLongArray() - - return MessageRepeatedVarints.BuilderMessageRepeatedVarints( - int, long, sint, slong, bool, uint, ulong - ).build() - } - - fun generateJvRepeatedVarints(): RepeatedVarints.MessageRepeatedVarints { - val int = Util.generateIntArray() - val long = Util.generateLongArray() - val sint = Util.generateIntArray() - val slong = Util.generateLongArray() - val bool = Util.generateBoolArray() - val uint = Util.generateIntArray() - val ulong = Util.generateLongArray() - - return RepeatedVarints.MessageRepeatedVarints.newBuilder() - .addAllInt(int.asIterable()) - .addAllLong(long.asIterable()) - .addAllSint(sint.asIterable()) - .addAllSlong(slong.asIterable()) - .addAllBl(bool.asIterable()) - .addAllUint(uint.asIterable()) - .addAllUlong(ulong.asIterable()) - .build() - } - - fun compareRepeatedVarints(kt: MessageRepeatedVarints, jv: RepeatedVarints.MessageRepeatedVarints): Boolean { - return Util.compareArrays(kt.int.asIterable(), jv.intList) && - Util.compareArrays(kt.long.asIterable(), jv.longList) && - Util.compareArrays(kt.sint.asIterable(), jv.sintList) && - Util.compareArrays(kt.slong.asIterable(), jv.slongList) && - Util.compareArrays(kt.bl.asIterable(), jv.blList) && - Util.compareArrays(kt.uint.asIterable(), jv.uintList) && - Util.compareArrays(kt.ulong.asIterable(), jv.ulongList) - } - - fun ktToJavaOnce() { - val kt = generateKtRepeatedVarints() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = RepeatedVarints.MessageRepeatedVarints.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareRepeatedVarints(kt, jv)) - } - - fun jvToKtOnce() { - val outs = ByteArrayOutputStream(10000000) - - val jv = generateJvRepeatedVarints() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = MessageRepeatedVarints.BuilderMessageRepeatedVarints( - IntArray(0), LongArray(0), IntArray(0), LongArray(0), BooleanArray(0), IntArray(0), LongArray(0) - ).parseFrom(ins).build() - - Util.assert(kt.errorCode == 0) - Util.assert(compareRepeatedVarints(kt, jv)) - } - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - ktToJavaOnce() - jvToKtOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/RepeatedZigZag.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/RepeatedZigZag.kt deleted file mode 100644 index 7d68aa961af..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/RepeatedZigZag.kt +++ /dev/null @@ -1,62 +0,0 @@ -package kt_java_tests - -import java_msg.RepeatedZigzag -import CodedInputStream -import MessageRepeatedZigZag -import java.io.ByteArrayOutputStream - -object RepeatedZigZag { - fun generateKtRepeatedZigZag(): MessageRepeatedZigZag { - val int = Util.generateIntArray() - val long = Util.generateLongArray() - return MessageRepeatedZigZag.BuilderMessageRepeatedZigZag(int, long).build() - } - - fun generateJvRepatedZigZag(): RepeatedZigzag.MessageRepeatedZigZag { - val int = Util.generateIntArray() - val long = Util.generateLongArray() - return RepeatedZigzag.MessageRepeatedZigZag.newBuilder() - .addAllInt(int.asIterable()) - .addAllLong(long.asIterable()) - .build() - } - - fun compareRepeatedZigZags(kt: MessageRepeatedZigZag, jv: RepeatedZigzag.MessageRepeatedZigZag): Boolean { - return Util.compareArrays(kt.int.asIterable(), jv.intList) && - Util.compareArrays(kt.long.asIterable(), jv.longList) - } - - fun ktToJavaOnce() { - val kt = generateKtRepeatedZigZag() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = RepeatedZigzag.MessageRepeatedZigZag.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareRepeatedZigZags(kt, jv)) - } - - fun jvToKtOnce() { - val outs = ByteArrayOutputStream(10000000) - - val jv = generateJvRepatedZigZag() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = MessageRepeatedZigZag.BuilderMessageRepeatedZigZag(IntArray(0), LongArray(0)).parseFrom(ins).build() - - Util.assert(kt.errorCode == 0) - Util.assert(compareRepeatedZigZags(kt, jv)) - } - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - ktToJavaOnce() - jvToKtOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/TagOrderTests.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/TagOrderTests.kt deleted file mode 100644 index 450d6a816ed..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/TagOrderTests.kt +++ /dev/null @@ -1,137 +0,0 @@ -package kt_java_tests - -import java_msg.TagOrderOuterClass -import java_msg.TagOrderShuffledOuterClass -import CodedInputStream -import TagOrder -import TagOrderShuffled -import java.io.ByteArrayOutputStream - -object TagOrderTests { - fun generateKtTag(): TagOrder { - val int = RandomGen.rnd.nextInt() - val slong_array = Util.generateLongArray() - val sint = RandomGen.rnd.nextInt() - val enum = TagOrder.Enum.fromIntToEnum(RandomGen.rnd.nextInt(2)) - - return TagOrder.BuilderTagOrder(int, sint, slong_array, enum).build() - } - - fun generateKtTagShuffled(): TagOrderShuffled { - val int = RandomGen.rnd.nextInt() - val slong_array = Util.generateLongArray() - val sint = RandomGen.rnd.nextInt() - val enum = TagOrderShuffled.Enum.fromIntToEnum(RandomGen.rnd.nextInt(2)) - - return TagOrderShuffled.BuilderTagOrderShuffled(int, sint, slong_array, enum).build() - } - - fun generateJvTag(): TagOrderOuterClass.TagOrder { - val int = RandomGen.rnd.nextInt() - val slong_array = Util.generateLongArray() - val sint = RandomGen.rnd.nextInt() - val enum = TagOrderOuterClass.TagOrder.Enum.forNumber(RandomGen.rnd.nextInt(2)) - - return TagOrderOuterClass.TagOrder.newBuilder() - .setInt(int) - .addAllSlongArray(slong_array.asIterable()) - .setSint(int) - .setEnumField(enum) - .build() - } - - fun generateJvTagShuffled(): TagOrderShuffledOuterClass.TagOrderShuffled { - val int = RandomGen.rnd.nextInt() - val slong_array = Util.generateLongArray() - val sint = RandomGen.rnd.nextInt() - val enum = TagOrderShuffledOuterClass.TagOrderShuffled.Enum.forNumber(RandomGen.rnd.nextInt(2)) - - return TagOrderShuffledOuterClass.TagOrderShuffled.newBuilder() - .setInt(int) - .addAllSlongArray(slong_array.asIterable()) - .setSint(int) - .setEnumField(enum) - .build() - } - - fun compareTagAndShuffledTag(kt: TagOrder, jv: TagOrderShuffledOuterClass.TagOrderShuffled): Boolean { - return kt.enum_field.id == jv.enumField.number && - kt.int == jv.int && - kt.sint == jv.sint && - Util.compareArrays(kt.slong_array.asIterable(), jv.slongArrayList) - } - - fun compareShuffledAndTag(kt: TagOrderShuffled, jv: TagOrderOuterClass.TagOrder): Boolean { - return kt.enum_field.id == jv.enumField.number && - kt.int == jv.int && - kt.sint == jv.sint && - Util.compareArrays(kt.slong_array.asIterable(), jv.slongArrayList) - } - - fun jvTagToKtShuffledOnce() { - val outs = ByteArrayOutputStream(100000) - - val jv = generateJvTag() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = TagOrderShuffled.BuilderTagOrderShuffled( - 0, 0, LongArray(0), TagOrderShuffled.Enum.first_val - ).parseFrom(ins).build() - - Util.assert(kt.errorCode == 0) - Util.assert(compareShuffledAndTag(kt, jv)) - } - - fun jvShuffledToKtTagOnce() { - val outs = ByteArrayOutputStream(100000) - - val jv = generateJvTagShuffled() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = TagOrder.BuilderTagOrder( - 0, 0, LongArray(0), TagOrder.Enum.first_val - ).parseFrom(ins).build() - - Util.assert(kt.errorCode == 0) - Util.assert(compareTagAndShuffledTag(kt, jv)) - } - - fun ktTagToJvShuffled() { - val kt = generateKtTag() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = TagOrderShuffledOuterClass.TagOrderShuffled.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareTagAndShuffledTag(kt, jv)) - } - - fun ktShuffledToJvTag() { - val kt = generateKtTagShuffled() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = TagOrderOuterClass.TagOrder.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareShuffledAndTag(kt, jv)) - } - - val testRuns = 1000 - fun runTests() { - for (i in 0..testRuns) { - // kt -> java - ktShuffledToJvTag() - ktTagToJvShuffled() - - // java -> kt - jvShuffledToKtTagOnce() - jvTagToKtShuffledOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/Util.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/Util.kt deleted file mode 100644 index 2d95f4f40e8..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/Util.kt +++ /dev/null @@ -1,57 +0,0 @@ -package kt_java_tests - -import java.io.InputStream -import kotlin.system.exitProcess -import CodedOutputStream - -object Util { - var ARRAY_MAX_SIZE = 1000 - - fun assert(condition: Boolean) { - if (!condition) { - println("Assertion failed") - exitProcess(1) - } - } - - fun compareArrays (lhs: Iterable, rhs: Iterable): Boolean { - return lhs.count() == rhs.count() && lhs.filter { !rhs.contains(it) }.isEmpty() - } - - fun getKtOutputStream(size: Int): CodedOutputStream { - val ba = ByteArray(size) - val outs = CodedOutputStream(ba) - return outs - } - - fun KtOutputStreamToInputStream(kt: CodedOutputStream): InputStream { - return kt.buffer.inputStream() - } - - fun generateIntArray(): IntArray { - val size = RandomGen.rnd.nextInt(ARRAY_MAX_SIZE) - val arr = IntArray(size) - for (i in 0..(size - 1)) { - arr[i] = RandomGen.rnd.nextInt() - } - return arr - } - - fun generateLongArray(): LongArray { - val size = RandomGen.rnd.nextInt(ARRAY_MAX_SIZE) - val arr = LongArray(size) - for (i in 0..(size - 1)) { - arr[i] = RandomGen.rnd.nextLong() - } - return arr - } - - fun generateBoolArray(): BooleanArray { - val size = RandomGen.rnd.nextInt(ARRAY_MAX_SIZE) - val arr = BooleanArray(size) - for (i in 0..(size - 1)) { - arr[i] = RandomGen.rnd.nextBoolean() - } - return arr - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/VarintsTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/VarintsTest.kt deleted file mode 100644 index e7355c480c9..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/VarintsTest.kt +++ /dev/null @@ -1,223 +0,0 @@ -package kt_java_tests - -import java_msg.Varints -import CodedInputStream -import MessageVarints -import java.io.ByteArrayOutputStream - -object VarintsTest { - fun generateKtVarint(): MessageVarints { - val int = RandomGen.rnd.nextInt() - val long = RandomGen.rnd.nextLong() - val sint = RandomGen.rnd.nextInt() - val slong = RandomGen.rnd.nextLong() - val bl = RandomGen.rnd.nextBoolean() - val uint = RandomGen.rnd.nextInt() - val ulong = RandomGen.rnd.nextLong() - val enum = MessageVarints.TestEnum.fromIntToTestEnum(RandomGen.rnd.nextInt(2)) - - return MessageVarints.BuilderMessageVarints( - int, long, sint, slong, bl, enum, uint, ulong - ).build() - } - - fun generateMaxKtVarint(): MessageVarints { - val int = Int.MAX_VALUE - val long = Long.MAX_VALUE - val sint = Int.MAX_VALUE - val slong = Long.MAX_VALUE - val bl = false - val uint = Int.MAX_VALUE - val ulong = Long.MAX_VALUE - val enum = MessageVarints.TestEnum.fromIntToTestEnum(RandomGen.rnd.nextInt(2)) - - return MessageVarints.BuilderMessageVarints( - int, long, sint, slong, bl, enum, uint, ulong - ).build() - } - - fun generateMinKtVarint(): MessageVarints { - val int = Int.MIN_VALUE - val long = Long.MIN_VALUE - val sint = Int.MIN_VALUE - val slong = Long.MIN_VALUE - val uint = Int.MIN_VALUE - val ulong = Long.MIN_VALUE - val bl = false - val enum = MessageVarints.TestEnum.fromIntToTestEnum(RandomGen.rnd.nextInt(2)) - - return MessageVarints.BuilderMessageVarints( - int, long, sint, slong, bl, enum, uint, ulong - ).build() - } - - fun generateJvVarint(): Varints.MessageVarints { - val int = RandomGen.rnd.nextInt() - val long = RandomGen.rnd.nextLong() - val sint = RandomGen.rnd.nextInt() - val slong = RandomGen.rnd.nextLong() - val bl = RandomGen.rnd.nextBoolean() - val uint = RandomGen.rnd.nextInt() - val ulong = RandomGen.rnd.nextLong() - val enum = Varints.MessageVarints.TestEnum.forNumber(RandomGen.rnd.nextInt(2)) - - return Varints.MessageVarints.newBuilder() - .setInt(int) - .setLong(long) - .setSint(sint) - .setSlong(slong) - .setBl(bl) - .setUint(uint) - .setUlong(ulong) - .setEnumField(enum) - .build() - } - - fun generateMaxJvVarint(): Varints.MessageVarints { - val int = Int.MAX_VALUE - val long = Long.MAX_VALUE - val sint = Int.MAX_VALUE - val slong = Long.MAX_VALUE - val bl = false - val uint = Int.MAX_VALUE - val ulong = Long.MAX_VALUE - val enum = Varints.MessageVarints.TestEnum.forNumber(RandomGen.rnd.nextInt(2)) - - return Varints.MessageVarints.newBuilder() - .setInt(int) - .setLong(long) - .setSint(sint) - .setSlong(slong) - .setBl(bl) - .setUint(uint) - .setUlong(ulong) - .setEnumField(enum) - .build() - } - - fun generateMinJvVarint(): Varints.MessageVarints { - val int = Int.MIN_VALUE - val long = Long.MIN_VALUE - val sint = Int.MIN_VALUE - val slong = Long.MIN_VALUE - val uint = Int.MIN_VALUE - val ulong = Long.MIN_VALUE - val bl = false - val enum = Varints.MessageVarints.TestEnum.forNumber(RandomGen.rnd.nextInt(2)) - - return Varints.MessageVarints.newBuilder() - .setInt(int) - .setLong(long) - .setSint(sint) - .setSlong(slong) - .setBl(bl) - .setUint(uint) - .setUlong(ulong) - .setEnumField(enum) - .build() - } - - fun compareVarints(kt: MessageVarints, jv: Varints.MessageVarints): Boolean { - return kt.int == jv.int && - kt.long == jv.long && - kt.sint == jv.sint && - kt.slong == jv.slong && - kt.bl == jv.bl && - kt.uint == jv.uint && - kt.ulong == jv.ulong && - kt.enumField.id == jv.enumField.number - } - - fun ktToJavaOnce() { - val kt = generateKtVarint() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = Varints.MessageVarints.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareVarints(kt, jv)) - } - - fun jvToKtOnce() { - val outs = ByteArrayOutputStream(10000000) - - val jv = generateJvVarint() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = MessageVarints.BuilderMessageVarints( - 0, 0, 0, 0, false, MessageVarints.TestEnum.firstVal, 0, 0 - ).parseFrom(ins).build() - - Util.assert(kt.errorCode == 0) - Util.assert(compareVarints(kt, jv)) - } - - fun ktToJavaOnceMaxValues() { - val kt = generateMaxKtVarint() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = Varints.MessageVarints.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareVarints(kt, jv)) - } - - fun ktToJavaOnceMinValues() { - val kt = generateMinKtVarint() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = Varints.MessageVarints.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareVarints(kt, jv)) - } - - fun jvToKtOnceMaxValues() { - val outs = ByteArrayOutputStream(10000000) - - val jv = generateMaxJvVarint() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = MessageVarints.BuilderMessageVarints( - 0, 0, 0, 0, false, MessageVarints.TestEnum.firstVal, 0, 0 - ).parseFrom(ins).build() - - Util.assert(kt.errorCode == 0) - Util.assert(compareVarints(kt, jv)) - } - - fun jvToKtOnceMinValues() { - val outs = ByteArrayOutputStream(10000000) - - val jv = generateMinJvVarint() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = MessageVarints.BuilderMessageVarints( - 0, 0, 0, 0, false, MessageVarints.TestEnum.firstVal, 0, 0 - ).parseFrom(ins).build() - - Util.assert(kt.errorCode == 0) - Util.assert(compareVarints(kt, jv)) - } - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - ktToJavaOnce() - jvToKtOnce() - - ktToJavaOnceMaxValues() - jvToKtOnceMaxValues() - - ktToJavaOnceMinValues() - jvToKtOnceMinValues() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/ZigZagTests.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/ZigZagTests.kt deleted file mode 100644 index 8a1c801045c..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/ZigZagTests.kt +++ /dev/null @@ -1,144 +0,0 @@ -package kt_java_tests - -import java_msg.Zigzag -import CodedInputStream -import MessageZigZag -import java.io.ByteArrayOutputStream - -object ZigZagTests { - fun generateKtZigZag(): MessageZigZag { - val int = RandomGen.rnd.nextInt() - val long = RandomGen.rnd.nextLong() - - return MessageZigZag.BuilderMessageZigZag(int, long).build() - } - - fun generateMaxKtZigZag(): MessageZigZag { - val int = Int.MAX_VALUE - val long = Long.MAX_VALUE - - return MessageZigZag.BuilderMessageZigZag(int, long).build() - } - - fun generateMinKtZigZag(): MessageZigZag { - val int = Int.MIN_VALUE - val long = Long.MIN_VALUE - - return MessageZigZag.BuilderMessageZigZag(int, long).build() - } - - fun generateJvZigZag(): Zigzag.MessageZigZag { - val int = RandomGen.rnd.nextInt() - val long = RandomGen.rnd.nextLong() - - return Zigzag.MessageZigZag.newBuilder().setInt(int).setLong(long).build() - } - - fun generateMaxJvZigZag(): Zigzag.MessageZigZag { - val int = Int.MAX_VALUE - val long = Long.MAX_VALUE - - return Zigzag.MessageZigZag.newBuilder().setInt(int).setLong(long).build() - } - - fun generateMinJvZigZag(): Zigzag.MessageZigZag { - val int = Int.MIN_VALUE - val long = Long.MIN_VALUE - - return Zigzag.MessageZigZag.newBuilder().setInt(int).setLong(long).build() - } - - fun compareZigZags(kt: MessageZigZag, jv: Zigzag.MessageZigZag): Boolean { - return kt.int == jv.int && kt.long == jv.long; - } - - fun ktToJavaOnce() { - val kt = generateKtZigZag() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = Zigzag.MessageZigZag.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareZigZags(kt, jv)) - } - - fun ktToJavaOnceMaxValues() { - val kt = generateMaxKtZigZag() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = Zigzag.MessageZigZag.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareZigZags(kt, jv)) - } - - fun ktToJavaOnceMinValues() { - val kt = generateMinKtZigZag() - val outs = Util.getKtOutputStream(kt.getSizeNoTag()) - kt.writeTo(outs) - - val ins = Util.KtOutputStreamToInputStream(outs) - val jv = Zigzag.MessageZigZag.parseFrom(ins) - - Util.assert(kt.errorCode == 0) - Util.assert(compareZigZags(kt, jv)) - } - - fun jvToKtOnce() { - val outs = ByteArrayOutputStream(10000000) - - val jv = generateJvZigZag() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = MessageZigZag.BuilderMessageZigZag(0, 0L).parseFrom(ins).build() - - Util.assert(kt.errorCode == 0) - Util.assert(compareZigZags(kt, jv)) - } - - fun jvToKtOnceMaxValues() { - val outs = ByteArrayOutputStream(10000000) - - val jv = generateMaxJvZigZag() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = MessageZigZag.BuilderMessageZigZag(0, 0L).parseFrom(ins).build() - - Util.assert(kt.errorCode == 0) - Util.assert(compareZigZags(kt, jv)) - } - - fun jvToKtOnceMinValues() { - val outs = ByteArrayOutputStream(10000000) - - val jv = generateMaxJvZigZag() - jv.writeTo(outs) - val ins = CodedInputStream(outs.toByteArray()) - val kt = MessageZigZag.BuilderMessageZigZag(0, 0L).parseFrom(ins).build() - - Util.assert(kt.errorCode == 0) - Util.assert(compareZigZags(kt, jv)) - } - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - // random values - jvToKtOnce() - ktToJavaOnce() - - // max values - jvToKtOnceMaxValues() - ktToJavaOnceMaxValues() - - // min values - jvToKtOnceMinValues() - ktToJavaOnceMinValues() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/main.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/main.kt deleted file mode 100644 index b415b0eb07a..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_java_tests/src/kt_java_tests/main.kt +++ /dev/null @@ -1,53 +0,0 @@ -package kt_java_tests - -import java_msg.Varints - -/** - * Created by user on 8/11/16. - */ - -fun main(args: Array) { - print("Base-Extended tests...") - BaseExtendedTest.runTests() - println(" OK!") - - print("Connect Tests...") - ConnectTest.runTests() - println(" OK!") - - print("Cross-branch access tests...") - CrossBranchTest.runTests() - println(" OK!") - - print("Direction Tests...") - DirectionTest.runTests() - println(" OK!") - - print("Location Tests...") - Location.runTests() - println(" OK!") - - print("Multiple Messages Tests...") - MultipleMessagesTest.runTests() - println(" OK!") - - print("Repeated VarInts Tests...") - RepeatedVarintsTest.runTests() - println(" OK!") - - print("Repeated ZigZag Tests...") - RepeatedZigZag.runTests() - println(" OK!") - - print("Tag order Tests...") - TagOrderTests.runTests() - println(" OK!") - - print("Varints Tests...") - VarintsTest.runTests() - println(" OK!") - - print("ZigZag Tests...") - ZigZagTests.runTests() - println(" OK!") -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/build.gradle b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/build.gradle deleted file mode 100644 index 7e76bba42d6..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/build.gradle +++ /dev/null @@ -1,72 +0,0 @@ -buildscript { - ext.kotlin_version = '1.0.3' - - repositories { - mavenCentral() - } - - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} -plugins { - id "com.moowork.node" version "0.13" -} - -repositories { - mavenCentral() -} - - -apply plugin: "kotlin2js" - -sourceSets { - main.kotlin.srcDirs += 'src' - main.kotlin.srcDirs += '../../../../../../../../build/sources' -} - -dependencies { - compile "org.jetbrains.kotlin:kotlin-js-library:$kotlin_version" - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - -} - -task copyKotlinLib(type: Copy) { - from "${projectDir}/helpers/kotlin.js" - into "${projectDir}/build/js" -} - -task copyPackageJSON(type: Copy) { - from "${projectDir}/helpers/package.json" - into "${projectDir}/build/js" -} - -task copyProtoFiles(type: Copy) { - from "${projectDir}/src/js_msg" - into "${projectDir}/build/js/js_messages" -} - -task runTests(type: NodeTask) { - script = file("${projectDir}/build/js") - execOverrides { - it.workingDir = "${projectDir}/build/js" - } -} - -compileKotlin2Js { - kotlinOptions.outputFile = "build/js/js_tests.js" - kotlinOptions.outputPrefix = "${projectDir}/helpers/prefix.js" - kotlinOptions.main="call" -} - -npmInstall { - execOverrides { - it.workingDir = "${projectDir}/build/js" - } -} - -build.dependsOn copyKotlinLib -build.dependsOn copyProtoFiles -build.dependsOn copyPackageJSON -runTests.dependsOn build -runTests.dependsOn npmInstall diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradle/wrapper/gradle-wrapper.jar b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 941144813d241db74e1bf25b6804c679fbe7f0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53636 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 DXC5Z7 diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradle/wrapper/gradle-wrapper.properties b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 7a0b0d66a82..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Mon Aug 15 15:57:30 MSK 2016 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-bin.zip diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradlew b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradlew deleted file mode 100755 index 9d82f789151..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# 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 -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# 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 - -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" ] ; 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 - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradlew.bat b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradlew.bat deleted file mode 100644 index aec99730b4e..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@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 - -@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= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@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 Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_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=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -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/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/helpers/kotlin.js b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/helpers/kotlin.js deleted file mode 100644 index 1169c1d7241..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/helpers/kotlin.js +++ /dev/null @@ -1,23868 +0,0 @@ -'use strict';var Kotlin = {}; -(function(Kotlin) { - function toArray(obj) { - var array; - if (obj == null) { - array = []; - } else { - if (!Array.isArray(obj)) { - array = [obj]; - } else { - array = obj; - } - } - return array; - } - function copyProperties(to, from) { - if (to == null || from == null) { - return; - } - for (var p in from) { - if (from.hasOwnProperty(p)) { - to[p] = from[p]; - } - } - } - function getClass(basesArray) { - for (var i = 0;i < basesArray.length;i++) { - if (isNativeClass(basesArray[i]) || basesArray[i].$metadata$.type === Kotlin.TYPE.CLASS) { - return basesArray[i]; - } - } - return null; - } - var emptyFunction = function() { - return function() { - }; - }; - Kotlin.TYPE = {CLASS:"class", TRAIT:"trait", OBJECT:"object", INIT_FUN:"init fun"}; - Kotlin.classCount = 0; - Kotlin.newClassIndex = function() { - var tmp = Kotlin.classCount; - Kotlin.classCount++; - return tmp; - }; - function isNativeClass(obj) { - return!(obj == null) && obj.$metadata$ == null; - } - function applyExtension(current, bases, baseGetter) { - for (var i = 0;i < bases.length;i++) { - if (isNativeClass(bases[i])) { - continue; - } - var base = baseGetter(bases[i]); - for (var p in base) { - if (base.hasOwnProperty(p)) { - if (!current.hasOwnProperty(p) || current[p].$classIndex$ < base[p].$classIndex$) { - current[p] = base[p]; - } - } - } - } - } - function computeMetadata(bases, properties, staticProperties) { - var metadata = {}; - var p, property; - metadata.baseClasses = toArray(bases); - metadata.baseClass = getClass(metadata.baseClasses); - metadata.classIndex = Kotlin.newClassIndex(); - metadata.functions = {}; - metadata.properties = {}; - metadata.types = {}; - metadata.staticMembers = {}; - if (!(properties == null)) { - for (p in properties) { - if (properties.hasOwnProperty(p)) { - property = properties[p]; - property.$classIndex$ = metadata.classIndex; - if (typeof property === "function") { - metadata.functions[p] = property; - } else { - metadata.properties[p] = property; - } - } - } - } - if (typeof staticProperties !== "undefined") { - for (p in staticProperties) { - property = staticProperties[p]; - if (typeof property === "function" && property.type === Kotlin.TYPE.INIT_FUN) { - metadata.types[p] = property; - } else { - metadata.staticMembers[p] = property; - } - } - } - applyExtension(metadata.functions, metadata.baseClasses, function(it) { - return it.$metadata$.functions; - }); - applyExtension(metadata.properties, metadata.baseClasses, function(it) { - return it.$metadata$.properties; - }); - return metadata; - } - Kotlin.createClassNow = function(bases, constructor, properties, staticProperties) { - if (constructor == null) { - constructor = emptyFunction(); - } - var metadata = computeMetadata(bases, properties, staticProperties); - metadata.type = Kotlin.TYPE.CLASS; - copyProperties(constructor, metadata.staticMembers); - var prototypeObj; - if (metadata.baseClass !== null) { - prototypeObj = Object.create(metadata.baseClass.prototype); - } else { - prototypeObj = {}; - } - Object.defineProperties(prototypeObj, metadata.properties); - copyProperties(prototypeObj, metadata.functions); - prototypeObj.constructor = constructor; - defineNestedTypes(constructor, metadata.types); - if (metadata.baseClass != null) { - constructor.baseInitializer = metadata.baseClass; - } - constructor.$metadata$ = metadata; - constructor.prototype = prototypeObj; - return constructor; - }; - function defineNestedTypes(constructor, types) { - for (var innerTypeName in types) { - var innerType = types[innerTypeName]; - innerType.className = innerTypeName; - Object.defineProperty(constructor, innerTypeName, {get:innerType, configurable:true}); - } - } - Kotlin.createTraitNow = function(bases, properties, staticProperties) { - var obj = function() { - }; - obj.$metadata$ = computeMetadata(bases, properties, staticProperties); - obj.$metadata$.type = Kotlin.TYPE.TRAIT; - copyProperties(obj, obj.$metadata$.staticMembers); - obj.prototype = {}; - Object.defineProperties(obj.prototype, obj.$metadata$.properties); - copyProperties(obj.prototype, obj.$metadata$.functions); - defineNestedTypes(obj, obj.$metadata$.types); - return obj; - }; - function getBases(basesFun) { - if (typeof basesFun === "function") { - return basesFun(); - } else { - return basesFun; - } - } - Kotlin.createClass = function(basesFun, constructor, properties, staticProperties) { - function $o() { - var klass = Kotlin.createClassNow(getBases(basesFun), constructor, properties, staticProperties); - Object.defineProperty(this, $o.className, {value:klass}); - if (staticProperties && staticProperties.object_initializer$) { - staticProperties.object_initializer$(klass); - } - return klass; - } - $o.type = Kotlin.TYPE.INIT_FUN; - return $o; - }; - Kotlin.createEnumClass = function(basesFun, constructor, enumEntries, properties, staticProperties) { - staticProperties = staticProperties || {}; - staticProperties.object_initializer$ = function(cls) { - var enumEntryList = enumEntries(); - var i = 0; - var values = []; - for (var entryName in enumEntryList) { - if (enumEntryList.hasOwnProperty(entryName)) { - var entryFactory = enumEntryList[entryName]; - values.push(entryName); - var entryObject; - if (typeof entryFactory === "function" && entryFactory.type === Kotlin.TYPE.INIT_FUN) { - entryFactory.className = entryName; - entryObject = entryFactory.apply(cls); - } else { - entryObject = entryFactory(); - } - entryObject.ordinal$ = i++; - entryObject.name$ = entryName; - cls[entryName] = entryObject; - } - } - cls.valuesNames$ = values; - cls.values$ = null; - }; - staticProperties.values = function() { - if (this.values$ == null) { - this.values$ = []; - for (var i = 0;i < this.valuesNames$.length;++i) { - this.values$.push(this[this.valuesNames$[i]]); - } - } - return this.values$; - }; - staticProperties.valueOf_61zpoe$ = function(name) { - return this[name]; - }; - return Kotlin.createClass(basesFun, constructor, properties, staticProperties); - }; - Kotlin.createTrait = function(basesFun, properties, staticProperties) { - function $o() { - var klass = Kotlin.createTraitNow(getBases(basesFun), properties, staticProperties); - Object.defineProperty(this, $o.className, {value:klass}); - return klass; - } - $o.type = Kotlin.TYPE.INIT_FUN; - return $o; - }; - Kotlin.createObject = function(basesFun, constructor, functions, staticProperties) { - constructor = constructor || function() { - }; - function $o() { - var klass = Kotlin.createClassNow(getBases(basesFun), null, functions, staticProperties); - var obj = new klass; - var metadata = klass.$metadata$; - metadata.type = Kotlin.TYPE.OBJECT; - Object.defineProperty(this, $o.className, {value:obj}); - defineNestedTypes(obj, klass.$metadata$.types); - copyProperties(obj, metadata.staticMembers); - if (metadata.baseClass != null) { - constructor.baseInitializer = metadata.baseClass; - } - constructor.apply(obj); - return obj; - } - $o.type = Kotlin.TYPE.INIT_FUN; - return $o; - }; - Kotlin.callGetter = function(thisObject, klass, propertyName) { - return klass.$metadata$.properties[propertyName].get.call(thisObject); - }; - Kotlin.callSetter = function(thisObject, klass, propertyName, value) { - klass.$metadata$.properties[propertyName].set.call(thisObject, value); - }; - function isInheritanceFromTrait(metadata, trait) { - if (metadata == null || metadata.classIndex < trait.$metadata$.classIndex) { - return false; - } - var baseClasses = metadata.baseClasses; - var i; - for (i = 0;i < baseClasses.length;i++) { - if (baseClasses[i] === trait) { - return true; - } - } - for (i = 0;i < baseClasses.length;i++) { - if (isInheritanceFromTrait(baseClasses[i].$metadata$, trait)) { - return true; - } - } - return false; - } - Kotlin.isType = function(object, klass) { - if (object == null || (klass == null || typeof object !== "object" && typeof object !== "function")) { - return false; - } else { - if (object instanceof klass) { - return true; - } else { - if (isNativeClass(klass) || klass.$metadata$.type == Kotlin.TYPE.CLASS) { - return false; - } else { - var metadata = "$metadata$" in object ? object.$metadata$ : object.constructor.$metadata$; - return isInheritanceFromTrait(metadata, klass); - } - } - } - }; - Kotlin.getCallableRefForMemberFunction = function(klass, memberName) { - return function() { - var args = [].slice.call(arguments); - var instance = args.shift(); - return instance[memberName].apply(instance, args); - }; - }; - Kotlin.getCallableRefForExtensionFunction = function(extFun) { - return function() { - return extFun.apply(null, arguments); - }; - }; - Kotlin.getCallableRefForLocalExtensionFunction = function(extFun) { - return function() { - var args = [].slice.call(arguments); - var instance = args.shift(); - return extFun.apply(instance, args); - }; - }; - Kotlin.getCallableRefForConstructor = function(klass) { - return function() { - var obj = Object.create(klass.prototype); - klass.apply(obj, arguments); - return obj; - }; - }; - Kotlin.getCallableRefForTopLevelProperty = function(packageName, name, isVar) { - var getFun = function() { - return packageName[name]; - }; - var setFun = isVar ? function(value) { - packageName[name] = value; - } : null; - return getPropertyRefClass(name, getFun, "get", setFun, "set_za3rmp$", propertyRefClassMetadataCache.zeroArg); - }; - Kotlin.getCallableRefForMemberProperty = function(name, isVar) { - var getFun = function(receiver) { - return receiver[name]; - }; - var setFun = isVar ? function(receiver, value) { - receiver[name] = value; - } : null; - return getPropertyRefClass(name, getFun, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg); - }; - Kotlin.getCallableRefForExtensionProperty = function(name, getFun, setFun) { - var getFunWrapper = function(receiver, extensionReceiver) { - return getFun(receiver, extensionReceiver); - }; - return getPropertyRefClass(name, getFunWrapper, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg); - }; - function getPropertyRefClass(name, getFun, getName, setFun, setName, cache) { - var obj = getFun; - var isMutable = typeof setFun === "function"; - obj.$metadata$ = getPropertyRefMetadata(isMutable ? cache.mutable : cache.immutable); - obj[getName] = getFun; - if (isMutable) { - obj[setName] = setFun; - } - obj.constructor = obj; - Object.defineProperty(obj, "name", {get:function() { - return name; - }}); - return obj; - } - var propertyRefClassMetadataCache = {zeroArg:{mutable:{value:null, implementedInterface:function() { - return Kotlin.modules["stdlib"].kotlin.reflect.KMutableProperty0; - }}, immutable:{value:null, implementedInterface:function() { - return Kotlin.modules["stdlib"].kotlin.reflect.KProperty0; - }}}, oneArg:{mutable:{value:null, implementedInterface:function() { - return Kotlin.modules["stdlib"].kotlin.reflect.KMutableProperty1; - }}, immutable:{value:null, implementedInterface:function() { - return Kotlin.modules["stdlib"].kotlin.reflect.KProperty1; - }}}}; - function getPropertyRefMetadata(cache) { - if (cache.value === null) { - cache.value = {baseClasses:[cache.implementedInterface()], baseClass:null, classIndex:Kotlin.newClassIndex(), functions:{}, properties:{}, types:{}, staticMembers:{}}; - } - return cache.value; - } - Kotlin.modules = {}; - function createPackageGetter(instance, initializer) { - return function() { - if (initializer !== null) { - var tmp = initializer; - initializer = null; - tmp.call(instance); - } - return instance; - }; - } - function createDefinition(members, definition) { - if (typeof definition === "undefined") { - definition = {}; - } - if (members == null) { - return definition; - } - for (var p in members) { - if (members.hasOwnProperty(p)) { - if (typeof members[p] === "function") { - if (members[p].type === Kotlin.TYPE.INIT_FUN) { - members[p].className = p; - Object.defineProperty(definition, p, {get:members[p], configurable:true}); - } else { - definition[p] = members[p]; - } - } else { - Object.defineProperty(definition, p, members[p]); - } - } - } - return definition; - } - Kotlin.createDefinition = createDefinition; - Kotlin.definePackage = function(initializer, members) { - var definition = createDefinition(members); - if (initializer === null) { - return{value:definition}; - } else { - var getter = createPackageGetter(definition, initializer); - return{get:getter}; - } - }; - Kotlin.defineRootPackage = function(initializer, members) { - var definition = createDefinition(members); - if (initializer === null) { - definition.$initializer$ = emptyFunction(); - } else { - definition.$initializer$ = initializer; - } - return definition; - }; - Kotlin.defineModule = function(id, declaration) { - if (id in Kotlin.modules) { - throw new Error("Module " + id + " is already defined"); - } - declaration.$initializer$.call(declaration); - Object.defineProperty(Kotlin.modules, id, {value:declaration}); - }; - Kotlin.defineInlineFunction = function(tag, fun) { - return fun; - }; - Kotlin.isTypeOf = function(type) { - return function(object) { - return typeof object === type; - }; - }; - Kotlin.isInstanceOf = function(klass) { - return function(object) { - return Kotlin.isType(object, klass); - }; - }; - Kotlin.orNull = function(fn) { - return function(object) { - return object == null || fn(object); - }; - }; - Kotlin.isAny = function() { - return function(object) { - return object != null; - }; - }; - Kotlin.andPredicate = function(a, b) { - return function(object) { - return a(object) && b(object); - }; - }; - Kotlin.kotlinModuleMetadata = function(abiVersion, moduleName, data) { - }; -})(Kotlin); -(function(Kotlin) { - var CharSequence = Kotlin.createTraitNow(null); - if (typeof String.prototype.startsWith === "undefined") { - String.prototype.startsWith = function(searchString, position) { - position = position || 0; - return this.lastIndexOf(searchString, position) === position; - }; - } - if (typeof String.prototype.endsWith === "undefined") { - String.prototype.endsWith = function(searchString, position) { - var subjectString = this.toString(); - if (position === undefined || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - var lastIndex = subjectString.indexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; - }; - } - String.prototype.contains = function(s) { - return this.indexOf(s) !== -1; - }; - Kotlin.equals = function(obj1, obj2) { - if (obj1 == null) { - return obj2 == null; - } - if (obj2 == null) { - return false; - } - if (Array.isArray(obj1)) { - return Kotlin.arrayEquals(obj1, obj2); - } - if (typeof obj1 == "object" && typeof obj1.equals_za3rmp$ === "function") { - return obj1.equals_za3rmp$(obj2); - } - return obj1 === obj2; - }; - Kotlin.hashCode = function(obj) { - if (obj == null) { - return 0; - } - if ("function" == typeof obj.hashCode) { - return obj.hashCode(); - } - var objType = typeof obj; - if ("object" == objType || "function" == objType) { - return getObjectHashCode(obj); - } else { - if ("number" == objType) { - return obj | 0; - } - } - if ("boolean" == objType) { - return Number(obj); - } - var str = String(obj); - return getStringHashCode(str); - }; - Kotlin.toString = function(o) { - if (o == null) { - return "null"; - } else { - if (Array.isArray(o)) { - return Kotlin.arrayToString(o); - } else { - return o.toString(); - } - } - }; - Kotlin.arrayToString = function(a) { - return "[" + a.map(Kotlin.toString).join(", ") + "]"; - }; - Kotlin.compareTo = function(a, b) { - var typeA = typeof a; - var typeB = typeof a; - if (Kotlin.isChar(a) && typeB == "number") { - return Kotlin.primitiveCompareTo(a.charCodeAt(0), b); - } - if (typeA == "number" && Kotlin.isChar(b)) { - return Kotlin.primitiveCompareTo(a, b.charCodeAt(0)); - } - if (typeA == "number" || typeA == "string") { - return a < b ? -1 : a > b ? 1 : 0; - } - return a.compareTo_za3rmp$(b); - }; - Kotlin.primitiveCompareTo = function(a, b) { - return a < b ? -1 : a > b ? 1 : 0; - }; - Kotlin.isNumber = function(a) { - return typeof a == "number" || a instanceof Kotlin.Long; - }; - Kotlin.isChar = function(value) { - return typeof value == "string" && value.length == 1; - }; - Kotlin.isComparable = function(value) { - var type = typeof value; - return type === "string" || (type === "boolean" || (Kotlin.isNumber(value) || Kotlin.isType(value, Kotlin.Comparable))); - }; - Kotlin.isCharSequence = function(value) { - return typeof value === "string" || Kotlin.isType(value, CharSequence); - }; - Kotlin.charInc = function(value) { - return String.fromCharCode(value.charCodeAt(0) + 1); - }; - Kotlin.charDec = function(value) { - return String.fromCharCode(value.charCodeAt(0) - 1); - }; - Kotlin.toShort = function(a) { - return(a & 65535) << 16 >> 16; - }; - Kotlin.toByte = function(a) { - return(a & 255) << 24 >> 24; - }; - Kotlin.toChar = function(a) { - return String.fromCharCode(((a | 0) % 65536 & 65535) << 16 >>> 16); - }; - Kotlin.numberToLong = function(a) { - return a instanceof Kotlin.Long ? a : Kotlin.Long.fromNumber(a); - }; - Kotlin.numberToInt = function(a) { - return a instanceof Kotlin.Long ? a.toInt() : a | 0; - }; - Kotlin.numberToShort = function(a) { - return Kotlin.toShort(Kotlin.numberToInt(a)); - }; - Kotlin.numberToByte = function(a) { - return Kotlin.toByte(Kotlin.numberToInt(a)); - }; - Kotlin.numberToDouble = function(a) { - return+a; - }; - Kotlin.numberToChar = function(a) { - return Kotlin.toChar(Kotlin.numberToInt(a)); - }; - Kotlin.intUpto = function(from, to) { - return new Kotlin.NumberRange(from, to); - }; - Kotlin.intDownto = function(from, to) { - return new Kotlin.Progression(from, to, -1); - }; - Kotlin.Throwable = Error; - function createClassNowWithMessage(base) { - return Kotlin.createClassNow(base, function(message) { - this.message = message !== void 0 ? message : null; - }); - } - Kotlin.Error = createClassNowWithMessage(Kotlin.Throwable); - Kotlin.Exception = createClassNowWithMessage(Kotlin.Throwable); - Kotlin.RuntimeException = createClassNowWithMessage(Kotlin.Exception); - Kotlin.NullPointerException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.NoSuchElementException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.IllegalArgumentException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.IllegalStateException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.UnsupportedOperationException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.IndexOutOfBoundsException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.ClassCastException = createClassNowWithMessage(Kotlin.RuntimeException); - Kotlin.IOException = createClassNowWithMessage(Kotlin.Exception); - Kotlin.AssertionError = createClassNowWithMessage(Kotlin.Error); - Kotlin.throwNPE = function(message) { - throw new Kotlin.NullPointerException(message); - }; - Kotlin.throwCCE = function() { - throw new Kotlin.ClassCastException("Illegal cast"); - }; - function throwAbstractFunctionInvocationError(funName) { - return function() { - var message; - if (funName !== void 0) { - message = "Function " + funName + " is abstract"; - } else { - message = "Function is abstract"; - } - throw new TypeError(message); - }; - } - var POW_2_32 = 4294967296; - var OBJECT_HASH_CODE_PROPERTY_NAME = "kotlinHashCodeValue$"; - function getObjectHashCode(obj) { - if (!(OBJECT_HASH_CODE_PROPERTY_NAME in obj)) { - var hash = Math.random() * POW_2_32 | 0; - Object.defineProperty(obj, OBJECT_HASH_CODE_PROPERTY_NAME, {value:hash, enumerable:false}); - } - return obj[OBJECT_HASH_CODE_PROPERTY_NAME]; - } - function getStringHashCode(str) { - var hash = 0; - for (var i = 0;i < str.length;i++) { - var code = str.charCodeAt(i); - hash = hash * 31 + code | 0; - } - return hash; - } - var lazyInitClasses = {}; - lazyInitClasses.ArrayIterator = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.MutableIterator]; - }, function(array) { - this.array = array; - this.index = 0; - }, {next:function() { - return this.array[this.index++]; - }, hasNext:function() { - return this.index < this.array.length; - }, remove:function() { - if (this.index < 0 || this.index > this.array.length) { - throw new RangeError; - } - this.index--; - this.array.splice(this.index, 1); - }}); - lazyInitClasses.ListIterator = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.ListIterator]; - }, function(list, index) { - this.list = list; - this.size = list.size; - this.index = index === undefined ? 0 : index; - }, {hasNext:function() { - return this.index < this.size; - }, nextIndex:function() { - return this.index; - }, next:function() { - var index = this.index; - var result = this.list.get_za3lpa$(index); - this.index = index + 1; - return result; - }, hasPrevious:function() { - return this.index > 0; - }, previousIndex:function() { - return this.index - 1; - }, previous:function() { - var index = this.index - 1; - var result = this.list.get_za3lpa$(index); - this.index = index; - return result; - }}); - Kotlin.Enum = Kotlin.createClassNow(null, function() { - this.name$ = void 0; - this.ordinal$ = void 0; - }, {name:{get:function() { - return this.name$; - }}, ordinal:{get:function() { - return this.ordinal$; - }}, equals_za3rmp$:function(o) { - return this === o; - }, hashCode:function() { - return getObjectHashCode(this); - }, compareTo_za3rmp$:function(o) { - return this.ordinal$ < o.ordinal$ ? -1 : this.ordinal$ > o.ordinal$ ? 1 : 0; - }, toString:function() { - return this.name; - }}); - Kotlin.RandomAccess = Kotlin.createTraitNow(null); - Kotlin.PropertyMetadata = Kotlin.createClassNow(null, function(name) { - this.name = name; - }); - lazyInitClasses.AbstractCollection = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.MutableCollection]; - }, null, {addAll_wtfk93$:function(collection) { - var modified = false; - var it = collection.iterator(); - while (it.hasNext()) { - if (this.add_za3rmp$(it.next())) { - modified = true; - } - } - return modified; - }, removeAll_wtfk93$:function(c) { - var modified = false; - var it = this.iterator(); - while (it.hasNext()) { - if (c.contains_za3rmp$(it.next())) { - it.remove(); - modified = true; - } - } - return modified; - }, retainAll_wtfk93$:function(c) { - var modified = false; - var it = this.iterator(); - while (it.hasNext()) { - if (!c.contains_za3rmp$(it.next())) { - it.remove(); - modified = true; - } - } - return modified; - }, clear:function() { - throw new Kotlin.NotImplementedError("Not implemented yet, see KT-7809"); - }, containsAll_wtfk93$:function(c) { - var it = c.iterator(); - while (it.hasNext()) { - if (!this.contains_za3rmp$(it.next())) { - return false; - } - } - return true; - }, isEmpty:function() { - return this.size === 0; - }, iterator:function() { - return new Kotlin.ArrayIterator(this.toArray()); - }, equals_za3rmp$:function(o) { - if (this.size !== o.size) { - return false; - } - var iterator1 = this.iterator(); - var iterator2 = o.iterator(); - var i = this.size; - while (i-- > 0) { - if (!Kotlin.equals(iterator1.next(), iterator2.next())) { - return false; - } - } - return true; - }, toString:function() { - var builder = "["; - var iterator = this.iterator(); - var first = true; - var i = this.size; - while (i-- > 0) { - if (first) { - first = false; - } else { - builder += ", "; - } - builder += Kotlin.toString(iterator.next()); - } - builder += "]"; - return builder; - }, toJSON:function() { - return this.toArray(); - }}); - lazyInitClasses.AbstractList = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.MutableList, Kotlin.AbstractCollection]; - }, null, {iterator:function() { - return new Kotlin.ListIterator(this); - }, listIterator:function() { - return new Kotlin.ListIterator(this); - }, listIterator_za3lpa$:function(index) { - if (index < 0 || index > this.size) { - throw new Kotlin.IndexOutOfBoundsException("Index: " + index + ", size: " + this.size); - } - return new Kotlin.ListIterator(this, index); - }, add_za3rmp$:function(element) { - this.add_vux3hl$(this.size, element); - return true; - }, addAll_j97iir$:function(index, collection) { - throw new Kotlin.NotImplementedError("Not implemented yet, see KT-7809"); - }, remove_za3rmp$:function(o) { - var index = this.indexOf_za3rmp$(o); - if (index !== -1) { - this.removeAt_za3lpa$(index); - return true; - } - return false; - }, clear:function() { - throw new Kotlin.NotImplementedError("Not implemented yet, see KT-7809"); - }, contains_za3rmp$:function(o) { - return this.indexOf_za3rmp$(o) !== -1; - }, indexOf_za3rmp$:function(o) { - var i = this.listIterator(); - while (i.hasNext()) { - if (Kotlin.equals(i.next(), o)) { - return i.previousIndex(); - } - } - return-1; - }, lastIndexOf_za3rmp$:function(o) { - var i = this.listIterator_za3lpa$(this.size); - while (i.hasPrevious()) { - if (Kotlin.equals(i.previous(), o)) { - return i.nextIndex(); - } - } - return-1; - }, subList_vux9f0$:function(fromIndex, toIndex) { - if (fromIndex < 0 || toIndex > this.size) { - throw new Kotlin.IndexOutOfBoundsException; - } - if (fromIndex > toIndex) { - throw new Kotlin.IllegalArgumentException; - } - return new Kotlin.SubList(this, fromIndex, toIndex); - }, hashCode:function() { - var result = 1; - var i = this.iterator(); - while (i.hasNext()) { - var obj = i.next(); - result = 31 * result + Kotlin.hashCode(obj) | 0; - } - return result; - }}); - lazyInitClasses.SubList = Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function(list, fromIndex, toIndex) { - this.list = list; - this.offset = fromIndex; - this._size = toIndex - fromIndex; - }, {get_za3lpa$:function(index) { - this.checkRange(index); - return this.list.get_za3lpa$(index + this.offset); - }, set_vux3hl$:function(index, value) { - this.checkRange(index); - this.list.set_vux3hl$(index + this.offset, value); - }, size:{get:function() { - return this._size; - }}, add_vux3hl$:function(index, element) { - if (index < 0 || index > this.size) { - throw new Kotlin.IndexOutOfBoundsException; - } - this.list.add_vux3hl$(index + this.offset, element); - }, removeAt_za3lpa$:function(index) { - this.checkRange(index); - var result = this.list.removeAt_za3lpa$(index + this.offset); - this._size--; - return result; - }, checkRange:function(index) { - if (index < 0 || index >= this._size) { - throw new Kotlin.IndexOutOfBoundsException; - } - }}); - lazyInitClasses.ArrayList = Kotlin.createClass(function() { - return[Kotlin.AbstractList, Kotlin.RandomAccess]; - }, function() { - this.array = []; - }, {get_za3lpa$:function(index) { - this.checkRange(index); - return this.array[index]; - }, set_vux3hl$:function(index, value) { - this.checkRange(index); - this.array[index] = value; - }, size:{get:function() { - return this.array.length; - }}, iterator:function() { - return Kotlin.arrayIterator(this.array); - }, add_za3rmp$:function(element) { - this.array.push(element); - return true; - }, add_vux3hl$:function(index, element) { - this.array.splice(index, 0, element); - }, addAll_wtfk93$:function(collection) { - if (collection.size == 0) { - return false; - } - var it = collection.iterator(); - for (var i = this.array.length, n = collection.size;n-- > 0;) { - this.array[i++] = it.next(); - } - return true; - }, removeAt_za3lpa$:function(index) { - this.checkRange(index); - return this.array.splice(index, 1)[0]; - }, clear:function() { - this.array.length = 0; - }, indexOf_za3rmp$:function(o) { - for (var i = 0;i < this.array.length;i++) { - if (Kotlin.equals(this.array[i], o)) { - return i; - } - } - return-1; - }, lastIndexOf_za3rmp$:function(o) { - for (var i = this.array.length - 1;i >= 0;i--) { - if (Kotlin.equals(this.array[i], o)) { - return i; - } - } - return-1; - }, toArray:function() { - return this.array.slice(0); - }, toString:function() { - return Kotlin.arrayToString(this.array); - }, toJSON:function() { - return this.array; - }, checkRange:function(index) { - if (index < 0 || index >= this.array.length) { - throw new Kotlin.IndexOutOfBoundsException; - } - }}); - Kotlin.Runnable = Kotlin.createClassNow(null, null, {run:throwAbstractFunctionInvocationError("Runnable#run")}); - Kotlin.Comparable = Kotlin.createClassNow(null, null, {compareTo:throwAbstractFunctionInvocationError("Comparable#compareTo")}); - Kotlin.Appendable = Kotlin.createClassNow(null, null, {append:throwAbstractFunctionInvocationError("Appendable#append")}); - Kotlin.Closeable = Kotlin.createClassNow(null, null, {close:throwAbstractFunctionInvocationError("Closeable#close")}); - Kotlin.safeParseInt = function(str) { - var r = parseInt(str, 10); - return isNaN(r) ? null : r; - }; - Kotlin.safeParseDouble = function(str) { - var r = parseFloat(str); - return isNaN(r) ? null : r; - }; - Kotlin.arrayEquals = function(a, b) { - if (a === b) { - return true; - } - if (!Array.isArray(b) || a.length !== b.length) { - return false; - } - for (var i = 0, n = a.length;i < n;i++) { - if (!Kotlin.equals(a[i], b[i])) { - return false; - } - } - return true; - }; - var BaseOutput = Kotlin.createClassNow(null, null, {println:function(a) { - if (typeof a !== "undefined") { - this.print(a); - } - this.print("\n"); - }, flush:function() { - }}); - Kotlin.NodeJsOutput = Kotlin.createClassNow(BaseOutput, function(outputStream) { - this.outputStream = outputStream; - }, {print:function(a) { - this.outputStream.write(a); - }}); - Kotlin.OutputToConsoleLog = Kotlin.createClassNow(BaseOutput, null, {print:function(a) { - console.log(a); - }, println:function(a) { - this.print(typeof a !== "undefined" ? a : ""); - }}); - Kotlin.BufferedOutput = Kotlin.createClassNow(BaseOutput, function() { - this.buffer = ""; - }, {print:function(a) { - this.buffer += String(a); - }, flush:function() { - this.buffer = ""; - }}); - Kotlin.BufferedOutputToConsoleLog = Kotlin.createClassNow(Kotlin.BufferedOutput, function() { - Kotlin.BufferedOutput.call(this); - }, {print:function(a) { - var s = String(a); - var i = s.lastIndexOf("\n"); - if (i != -1) { - this.buffer += s.substr(0, i); - this.flush(); - s = s.substr(i + 1); - } - this.buffer += s; - }, flush:function() { - console.log(this.buffer); - this.buffer = ""; - }}); - Kotlin.out = function() { - var isNode = typeof process !== "undefined" && (process.versions && !!process.versions.node); - if (isNode) { - return new Kotlin.NodeJsOutput(process.stdout); - } - return new Kotlin.BufferedOutputToConsoleLog; - }(); - Kotlin.println = function(s) { - Kotlin.out.println(s); - }; - Kotlin.print = function(s) { - Kotlin.out.print(s); - }; - lazyInitClasses.RangeIterator = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(start, end, step) { - this.start = start; - this.end = end; - this.step = step; - this.i = start; - }, {next:function() { - var value = this.i; - this.i = this.i + this.step; - return value; - }, hasNext:function() { - if (this.step > 0) { - return this.i <= this.end; - } else { - return this.i >= this.end; - } - }}); - function isSameNotNullRanges(other) { - var classObject = this.constructor; - if (this instanceof classObject && other instanceof classObject) { - return this.isEmpty() && other.isEmpty() || this.first === other.first && (this.last === other.last && this.step === other.step); - } - return false; - } - function isSameLongRanges(other) { - var classObject = this.constructor; - if (this instanceof classObject && other instanceof classObject) { - return this.isEmpty() && other.isEmpty() || this.first.equals_za3rmp$(other.first) && (this.last.equals_za3rmp$(other.last) && this.step.equals_za3rmp$(other.step)); - } - return false; - } - function getProgressionFinalElement(start, end, step) { - function mod(a, b) { - var mod = a % b; - return mod >= 0 ? mod : mod + b; - } - function differenceModulo(a, b, c) { - return mod(mod(a, c) - mod(b, c), c); - } - if (step > 0) { - return end - differenceModulo(end, start, step); - } else { - if (step < 0) { - return end + differenceModulo(start, end, -step); - } else { - throw new Kotlin.IllegalArgumentException("Step is zero."); - } - } - } - function getProgressionFinalElementLong(start, end, step) { - function mod(a, b) { - var mod = a.modulo(b); - return!mod.isNegative() ? mod : mod.add(b); - } - function differenceModulo(a, b, c) { - return mod(mod(a, c).subtract(mod(b, c)), c); - } - var diff; - if (step.compareTo_za3rmp$(Kotlin.Long.ZERO) > 0) { - diff = differenceModulo(end, start, step); - return diff.isZero() ? end : end.subtract(diff); - } else { - if (step.compareTo_za3rmp$(Kotlin.Long.ZERO) < 0) { - diff = differenceModulo(start, end, step.unaryMinus()); - return diff.isZero() ? end : end.add(diff); - } else { - throw new Kotlin.IllegalArgumentException("Step is zero."); - } - } - } - lazyInitClasses.NumberProgression = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(start, end, step) { - this.first = start; - this.last = getProgressionFinalElement(start, end, step); - this.step = step; - if (this.step === 0) { - throw new Kotlin.IllegalArgumentException("Step must be non-zero"); - } - }, {iterator:function() { - return new Kotlin.RangeIterator(this.first, this.last, this.step); - }, isEmpty:function() { - return this.step > 0 ? this.first > this.last : this.first < this.last; - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * (31 * this.first + this.last) + this.step; - }, equals_za3rmp$:isSameNotNullRanges, toString:function() { - return this.step > 0 ? this.first.toString() + ".." + this.last + " step " + this.step : this.first.toString() + " downTo " + this.last + " step " + -this.step; - }}); - lazyInitClasses.NumberRange = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.ranges.ClosedRange, Kotlin.NumberProgression]; - }, function $fun(start, endInclusive) { - $fun.baseInitializer.call(this, start, endInclusive, 1); - this.start = start; - this.endInclusive = endInclusive; - }, {contains_htax2k$:function(item) { - return this.start <= item && item <= this.endInclusive; - }, isEmpty:function() { - return this.start > this.endInclusive; - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * this.start + this.endInclusive; - }, equals_za3rmp$:isSameNotNullRanges, toString:function() { - return this.start.toString() + ".." + this.endInclusive; - }}, {Companion:Kotlin.createObject(null, function() { - this.EMPTY = new Kotlin.NumberRange(1, 0); - })}); - lazyInitClasses.LongRangeIterator = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(start, end, step) { - this.start = start; - this.end = end; - this.step = step; - this.i = start; - }, {next:function() { - var value = this.i; - this.i = this.i.add(this.step); - return value; - }, hasNext:function() { - if (this.step.isNegative()) { - return this.i.compare(this.end) >= 0; - } else { - return this.i.compare(this.end) <= 0; - } - }}); - lazyInitClasses.LongProgression = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(start, end, step) { - this.first = start; - this.last = getProgressionFinalElementLong(start, end, step); - this.step = step; - if (this.step.isZero()) { - throw new Kotlin.IllegalArgumentException("Step must be non-zero"); - } - }, {iterator:function() { - return new Kotlin.LongRangeIterator(this.first, this.last, this.step); - }, isEmpty:function() { - return this.step.isNegative() ? this.first.compare(this.last) < 0 : this.first.compare(this.last) > 0; - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * (31 * this.first.toInt() + this.last.toInt()) + this.step.toInt(); - }, equals_za3rmp$:isSameLongRanges, toString:function() { - return!this.step.isNegative() ? this.first.toString() + ".." + this.last + " step " + this.step : this.first.toString() + " downTo " + this.last + " step " + this.step.unaryMinus(); - }}); - lazyInitClasses.LongRange = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.ranges.ClosedRange, Kotlin.LongProgression]; - }, function $fun(start, endInclusive) { - $fun.baseInitializer.call(this, start, endInclusive, Kotlin.Long.ONE); - this.start = start; - this.endInclusive = endInclusive; - }, {contains_htax2k$:function(item) { - return this.start.compareTo_za3rmp$(item) <= 0 && item.compareTo_za3rmp$(this.endInclusive) <= 0; - }, isEmpty:function() { - return this.start.compare(this.endInclusive) > 0; - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * this.start.toInt() + this.endInclusive.toInt(); - }, equals_za3rmp$:isSameLongRanges, toString:function() { - return this.start.toString() + ".." + this.endInclusive; - }}, {Companion:Kotlin.createObject(null, function() { - this.EMPTY = new Kotlin.LongRange(Kotlin.Long.ONE, Kotlin.Long.ZERO); - })}); - lazyInitClasses.CharRangeIterator = Kotlin.createClass(function() { - return[Kotlin.RangeIterator]; - }, function(start, end, step) { - Kotlin.RangeIterator.call(this, start, end, step); - }, {next:function() { - var value = this.i; - this.i = this.i + this.step; - return String.fromCharCode(value); - }}); - lazyInitClasses.CharProgression = Kotlin.createClassNow(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(start, end, step) { - this.first = start; - this.startCode = start.charCodeAt(0); - this.endCode = getProgressionFinalElement(this.startCode, end.charCodeAt(0), step); - this.last = String.fromCharCode(this.endCode); - this.step = step; - if (this.step === 0) { - throw new Kotlin.IllegalArgumentException("Increment must be non-zero"); - } - }, {iterator:function() { - return new Kotlin.CharRangeIterator(this.startCode, this.endCode, this.step); - }, isEmpty:function() { - return this.step > 0 ? this.startCode > this.endCode : this.startCode < this.endCode; - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * (31 * this.startCode | 0 + this.endCode | 0) + this.step | 0; - }, equals_za3rmp$:isSameNotNullRanges, toString:function() { - return this.step > 0 ? this.first.toString() + ".." + this.last + " step " + this.step : this.first.toString() + " downTo " + this.last + " step " + -this.step; - }}); - lazyInitClasses.CharRange = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.ranges.ClosedRange, Kotlin.CharProgression]; - }, function $fun(start, endInclusive) { - $fun.baseInitializer.call(this, start, endInclusive, 1); - this.start = start; - this.endInclusive = endInclusive; - }, {contains_htax2k$:function(item) { - return this.start <= item && item <= this.endInclusive; - }, isEmpty:function() { - return this.start > this.endInclusive; - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * this.startCode | 0 + this.endCode | 0; - }, equals_za3rmp$:isSameNotNullRanges, toString:function() { - return this.start.toString() + ".." + this.endInclusive; - }}, {Companion:Kotlin.createObject(null, function() { - this.EMPTY = new Kotlin.CharRange(Kotlin.toChar(1), Kotlin.toChar(0)); - })}); - Kotlin.Comparator = Kotlin.createClassNow(null, null, {compare:throwAbstractFunctionInvocationError("Comparator#compare")}); - Kotlin.collectionsMax = function(c, comp) { - if (c.isEmpty()) { - throw new Error; - } - var it = c.iterator(); - var max = it.next(); - while (it.hasNext()) { - var el = it.next(); - if (comp.compare(max, el) < 0) { - max = el; - } - } - return max; - }; - Kotlin.collectionsSort = function(mutableList, comparator) { - var boundComparator = void 0; - if (comparator !== void 0) { - boundComparator = comparator.compare.bind(comparator); - } - if (mutableList instanceof Array) { - mutableList.sort(boundComparator); - } - if (mutableList.size > 1) { - var array = Kotlin.copyToArray(mutableList); - array.sort(boundComparator); - for (var i = 0, n = array.length;i < n;i++) { - mutableList.set_vux3hl$(i, array[i]); - } - } - }; - Kotlin.primitiveArraySort = function(array) { - array.sort(Kotlin.primitiveCompareTo); - }; - Kotlin.copyToArray = function(collection) { - if (typeof collection.toArray !== "undefined") { - return collection.toArray(); - } - var array = []; - var it = collection.iterator(); - while (it.hasNext()) { - array.push(it.next()); - } - return array; - }; - Kotlin.StringBuilder = Kotlin.createClassNow([CharSequence], function(content) { - this.string = typeof content == "string" ? content : ""; - }, {length:{get:function() { - return this.string.length; - }}, substring:function(start, end) { - return this.string.substring(start, end); - }, charAt:function(index) { - return this.string.charAt(index); - }, append:function(obj, from, to) { - if (from == void 0 && to == void 0) { - this.string = this.string + obj.toString(); - } else { - if (to == void 0) { - this.string = this.string + obj.toString().substring(from); - } else { - this.string = this.string + obj.toString().substring(from, to); - } - } - return this; - }, reverse:function() { - this.string = this.string.split("").reverse().join(""); - return this; - }, toString:function() { - return this.string; - }}); - Kotlin.splitString = function(str, regex, limit) { - return str.split(new RegExp(regex), limit); - }; - Kotlin.nullArray = function(size) { - var res = []; - var i = size; - while (i > 0) { - res[--i] = null; - } - return res; - }; - Kotlin.numberArrayOfSize = function(size) { - return Kotlin.arrayFromFun(size, function() { - return 0; - }); - }; - Kotlin.charArrayOfSize = function(size) { - return Kotlin.arrayFromFun(size, function() { - return "\x00"; - }); - }; - Kotlin.booleanArrayOfSize = function(size) { - return Kotlin.arrayFromFun(size, function() { - return false; - }); - }; - Kotlin.longArrayOfSize = function(size) { - return Kotlin.arrayFromFun(size, function() { - return Kotlin.Long.ZERO; - }); - }; - Kotlin.arrayFromFun = function(size, initFun) { - var result = new Array(size); - for (var i = 0;i < size;i++) { - result[i] = initFun(i); - } - return result; - }; - Kotlin.arrayIterator = function(array) { - return new Kotlin.ArrayIterator(array); - }; - Kotlin.jsonAddProperties = function(obj1, obj2) { - for (var p in obj2) { - if (obj2.hasOwnProperty(p)) { - obj1[p] = obj2[p]; - } - } - return obj1; - }; - Kotlin.createDefinition(lazyInitClasses, Kotlin); -})(Kotlin); -(function(Kotlin) { - function Entry(key, value) { - this.key = key; - this.value = value; - } - Entry.prototype.getKey = function() { - return this.key; - }; - Entry.prototype.getValue = function() { - return this.value; - }; - Entry.prototype.hashCode = function() { - return mapEntryHashCode(this.key, this.value); - }; - Entry.prototype.equals_za3rmp$ = function(o) { - return o instanceof Entry && (Kotlin.equals(this.key, o.getKey()) && Kotlin.equals(this.value, o.getValue())); - }; - Entry.prototype.toString = function() { - return Kotlin.toString(this.key) + "\x3d" + Kotlin.toString(this.value); - }; - function hashMapPutAll(fromMap) { - var entries = fromMap.entries; - var it = entries.iterator(); - while (it.hasNext()) { - var e = it.next(); - this.put_wn2jw4$(e.getKey(), e.getValue()); - } - } - function hashSetEquals(o) { - if (o == null || this.size !== o.size) { - return false; - } - return this.containsAll_wtfk93$(o); - } - function hashSetHashCode() { - var h = 0; - var i = this.iterator(); - while (i.hasNext()) { - var obj = i.next(); - h += Kotlin.hashCode(obj); - } - return h; - } - function convertKeyToString(key) { - return key; - } - function convertKeyToNumber(key) { - return+key; - } - function convertKeyToBoolean(key) { - return key == "true"; - } - var FUNCTION = "function"; - var arrayRemoveAt = typeof Array.prototype.splice == FUNCTION ? function(arr, idx) { - arr.splice(idx, 1); - } : function(arr, idx) { - var itemsAfterDeleted, i, len; - if (idx === arr.length - 1) { - arr.length = idx; - } else { - itemsAfterDeleted = arr.slice(idx + 1); - arr.length = idx; - for (i = 0, len = itemsAfterDeleted.length;i < len;++i) { - arr[idx + i] = itemsAfterDeleted[i]; - } - } - }; - function hashObject(obj) { - if (obj == null) { - return ""; - } - var hashCode; - if (typeof obj == "string") { - return obj; - } else { - if (typeof obj.hashCode == FUNCTION) { - hashCode = obj.hashCode(); - return typeof hashCode == "string" ? hashCode : hashObject(hashCode); - } else { - if (typeof obj.toString == FUNCTION) { - return obj.toString(); - } else { - try { - return String(obj); - } catch (ex) { - return Object.prototype.toString.call(obj); - } - } - } - } - } - function mapEntryHashCode(key, value) { - return Kotlin.hashCode(key) ^ Kotlin.hashCode(value); - } - function equals_fixedValueHasEquals(fixedValue, variableValue) { - return fixedValue.equals_za3rmp$(variableValue); - } - function equals_fixedValueNoEquals(fixedValue, variableValue) { - return variableValue != null && typeof variableValue.equals_za3rmp$ == FUNCTION ? variableValue.equals_za3rmp$(fixedValue) : fixedValue === variableValue; - } - function Bucket(hash, firstKey, firstValue, equalityFunction) { - this[0] = hash; - this.entries = []; - this.addEntry(firstKey, firstValue); - if (equalityFunction !== null) { - this.getEqualityFunction = function() { - return equalityFunction; - }; - } - } - var EXISTENCE = 0, ENTRY = 1, ENTRY_INDEX_AND_VALUE = 2; - function createBucketSearcher(mode) { - return function(key) { - var i = this.entries.length, entry, equals = this.getEqualityFunction(key); - while (i--) { - entry = this.entries[i]; - if (equals(key, entry[0])) { - switch(mode) { - case EXISTENCE: - return true; - case ENTRY: - return entry; - case ENTRY_INDEX_AND_VALUE: - return[i, entry[1]]; - } - } - } - return false; - }; - } - function createBucketLister(entryProperty) { - return function(aggregatedArr) { - var startIndex = aggregatedArr.length; - for (var i = 0, len = this.entries.length;i < len;++i) { - aggregatedArr[startIndex + i] = this.entries[i][entryProperty]; - } - }; - } - Bucket.prototype = {getEqualityFunction:function(searchValue) { - return searchValue != null && typeof searchValue.equals_za3rmp$ == FUNCTION ? equals_fixedValueHasEquals : equals_fixedValueNoEquals; - }, getEntryForKey:createBucketSearcher(ENTRY), getEntryAndIndexForKey:createBucketSearcher(ENTRY_INDEX_AND_VALUE), removeEntryForKey:function(key) { - var result = this.getEntryAndIndexForKey(key); - if (result) { - arrayRemoveAt(this.entries, result[0]); - return result; - } - return null; - }, addEntry:function(key, value) { - this.entries[this.entries.length] = [key, value]; - }, keys:createBucketLister(0), values:createBucketLister(1), getEntries:function(entries) { - var startIndex = entries.length; - for (var i = 0, len = this.entries.length;i < len;++i) { - entries[startIndex + i] = this.entries[i].slice(0); - } - }, containsKey_za3rmp$:createBucketSearcher(EXISTENCE), containsValue_za3rmp$:function(value) { - var i = this.entries.length; - while (i--) { - if (value === this.entries[i][1]) { - return true; - } - } - return false; - }}; - function searchBuckets(buckets, hash) { - var i = buckets.length, bucket; - while (i--) { - bucket = buckets[i]; - if (hash === bucket[0]) { - return i; - } - } - return null; - } - function getBucketForHash(bucketsByHash, hash) { - var bucket = bucketsByHash[hash]; - return bucket && bucket instanceof Bucket ? bucket : null; - } - function Hashtable(hashingFunctionParam, equalityFunctionParam) { - this.buckets = []; - this.bucketsByHash = {}; - this.hashingFunction = typeof hashingFunctionParam == FUNCTION ? hashingFunctionParam : hashObject; - this.equalityFunction = typeof equalityFunctionParam == FUNCTION ? equalityFunctionParam : null; - this._size = 0; - } - Hashtable.prototype.put_wn2jw4$ = function(key, value) { - var hash = this.hashingFunction(key), bucket, bucketEntry, oldValue = null; - bucket = getBucketForHash(this.bucketsByHash, hash); - if (bucket) { - bucketEntry = bucket.getEntryForKey(key); - if (bucketEntry) { - oldValue = bucketEntry[1]; - bucketEntry[1] = value; - } else { - bucket.addEntry(key, value); - this._size++; - } - } else { - bucket = new Bucket(hash, key, value, this.equalityFunction); - this.buckets[this.buckets.length] = bucket; - this.bucketsByHash[hash] = bucket; - this._size++; - } - return oldValue; - }; - Hashtable.prototype.get_za3rmp$ = function(key) { - var hash = this.hashingFunction(key); - var bucket = getBucketForHash(this.bucketsByHash, hash); - if (bucket) { - var bucketEntry = bucket.getEntryForKey(key); - if (bucketEntry) { - return bucketEntry[1]; - } - } - return null; - }; - Hashtable.prototype.containsKey_za3rmp$ = function(key) { - var bucketKey = this.hashingFunction(key); - var bucket = getBucketForHash(this.bucketsByHash, bucketKey); - return bucket ? bucket.containsKey_za3rmp$(key) : false; - }; - Hashtable.prototype.containsValue_za3rmp$ = function(value) { - var i = this.buckets.length; - while (i--) { - if (this.buckets[i].containsValue_za3rmp$(value)) { - return true; - } - } - return false; - }; - Hashtable.prototype.clear = function() { - this.buckets.length = 0; - this.bucketsByHash = {}; - this._size = 0; - }; - Hashtable.prototype.isEmpty = function() { - return!this.buckets.length; - }; - Hashtable.prototype._keys = function() { - var aggregated = [], i = this.buckets.length; - while (i--) { - this.buckets[i].keys(aggregated); - } - return aggregated; - }; - Hashtable.prototype._values = function() { - var aggregated = [], i = this.buckets.length; - while (i--) { - this.buckets[i].values(aggregated); - } - return aggregated; - }; - Hashtable.prototype._entries = function() { - var aggregated = [], i = this.buckets.length; - while (i--) { - this.buckets[i].getEntries(aggregated); - } - return aggregated; - }; - Object.defineProperty(Hashtable.prototype, "values", {get:function() { - var values = this._values(); - var i = values.length; - var result = new Kotlin.ArrayList; - while (i--) { - result.add_za3rmp$(values[i]); - } - return result; - }, configurable:true}); - Hashtable.prototype.remove_za3rmp$ = function(key) { - var hash = this.hashingFunction(key), bucketIndex, oldValue = null, result = null; - var bucket = getBucketForHash(this.bucketsByHash, hash); - if (bucket) { - result = bucket.removeEntryForKey(key); - if (result !== null) { - this._size--; - oldValue = result[1]; - if (!bucket.entries.length) { - bucketIndex = searchBuckets(this.buckets, hash); - arrayRemoveAt(this.buckets, bucketIndex); - delete this.bucketsByHash[hash]; - } - } - } - return oldValue; - }; - Object.defineProperty(Hashtable.prototype, "size", {get:function() { - return this._size; - }}); - Hashtable.prototype.each = function(callback) { - var entries = this._entries(), i = entries.length, entry; - while (i--) { - entry = entries[i]; - callback(entry[0], entry[1]); - } - }; - Hashtable.prototype.putAll_r12sna$ = hashMapPutAll; - Hashtable.prototype.clone = function() { - var clone = new Hashtable(this.hashingFunction, this.equalityFunction); - clone.putAll_r12sna$(this); - return clone; - }; - Object.defineProperty(Hashtable.prototype, "keys", {get:function() { - var res = new Kotlin.ComplexHashSet; - var keys = this._keys(); - var i = keys.length; - while (i--) { - res.add_za3rmp$(keys[i]); - } - return res; - }, configurable:true}); - Object.defineProperty(Hashtable.prototype, "entries", {get:function() { - var result = new Kotlin.ComplexHashSet; - var entries = this._entries(); - var i = entries.length; - while (i--) { - var entry = entries[i]; - result.add_za3rmp$(new Entry(entry[0], entry[1])); - } - return result; - }, configurable:true}); - Hashtable.prototype.hashCode = function() { - var h = 0; - var entries = this._entries(); - var i = entries.length; - while (i--) { - var entry = entries[i]; - h += mapEntryHashCode(entry[0], entry[1]); - } - return h; - }; - Hashtable.prototype.equals_za3rmp$ = function(o) { - if (o == null || this.size !== o.size) { - return false; - } - var entries = this._entries(); - var i = entries.length; - while (i--) { - var entry = entries[i]; - var key = entry[0]; - var value = entry[1]; - if (value == null) { - if (!(o.get_za3rmp$(key) == null && o.contains_za3rmp$(key))) { - return false; - } - } else { - if (!Kotlin.equals(value, o.get_za3rmp$(key))) { - return false; - } - } - } - return true; - }; - Hashtable.prototype.toString = function() { - var entries = this._entries(); - var length = entries.length; - if (length === 0) { - return "{}"; - } - var builder = "{"; - for (var i = 0;;) { - var entry = entries[i]; - var key = entry[0]; - var value = entry[1]; - builder += (key === this ? "(this Map)" : Kotlin.toString(key)) + "\x3d" + (value === this ? "(this Map)" : Kotlin.toString(value)); - if (++i >= length) { - return builder + "}"; - } - builder += ", "; - } - }; - Kotlin.HashTable = Hashtable; - var lazyInitClasses = {}; - lazyInitClasses.HashMap = Kotlin.createClass(function() { - return[Kotlin.HashTable, Kotlin.modules["builtins"].kotlin.collections.MutableMap]; - }, function() { - Kotlin.HashTable.call(this); - }); - Object.defineProperty(Kotlin, "ComplexHashMap", {get:function() { - return Kotlin.HashMap; - }}); - lazyInitClasses.PrimitiveHashMapValuesIterator = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(map, keys) { - this.map = map; - this.keys = keys; - this.size = keys.length; - this.index = 0; - }, {next:function() { - if (!this.hasNext()) { - throw new Kotlin.NoSuchElementException; - } - return this.map[this.keys[this.index++]]; - }, hasNext:function() { - return this.index < this.size; - }}); - lazyInitClasses.PrimitiveHashMapValues = Kotlin.createClass(function() { - return[Kotlin.AbstractCollection]; - }, function(map) { - this.map = map; - }, {iterator:function() { - return new Kotlin.PrimitiveHashMapValuesIterator(this.map.map, Object.keys(this.map.map)); - }, isEmpty:function() { - return this.map.isEmpty(); - }, size:{get:function() { - return this.map.size; - }}, contains_za3rmp$:function(o) { - return this.map.containsValue_za3rmp$(o); - }}); - lazyInitClasses.AbstractPrimitiveHashMap = Kotlin.createClass(function() { - return[Kotlin.HashMap]; - }, function() { - this.$size = 0; - this.map = Object.create(null); - }, {size:{get:function() { - return this.$size; - }}, isEmpty:function() { - return this.$size === 0; - }, containsKey_za3rmp$:function(key) { - return this.map[key] !== void 0; - }, containsValue_za3rmp$:function(value) { - var map = this.map; - for (var key in map) { - if (map[key] === value) { - return true; - } - } - return false; - }, get_za3rmp$:function(key) { - return this.map[key]; - }, put_wn2jw4$:function(key, value) { - var prevValue = this.map[key]; - this.map[key] = value === void 0 ? null : value; - if (prevValue === void 0) { - this.$size++; - } - return prevValue; - }, remove_za3rmp$:function(key) { - var prevValue = this.map[key]; - if (prevValue !== void 0) { - delete this.map[key]; - this.$size--; - } - return prevValue; - }, clear:function() { - this.$size = 0; - this.map = {}; - }, putAll_r12sna$:hashMapPutAll, entries:{get:function() { - var result = new Kotlin.ComplexHashSet; - var map = this.map; - for (var key in map) { - result.add_za3rmp$(new Entry(this.convertKeyToKeyType(key), map[key])); - } - return result; - }}, getKeySetClass:function() { - throw new Error("Kotlin.AbstractPrimitiveHashMap.getKetSetClass is abstract"); - }, convertKeyToKeyType:function(key) { - throw new Error("Kotlin.AbstractPrimitiveHashMap.convertKeyToKeyType is abstract"); - }, keys:{get:function() { - var result = new (this.getKeySetClass()); - var map = this.map; - for (var key in map) { - result.add_za3rmp$(key); - } - return result; - }}, values:{get:function() { - return new Kotlin.PrimitiveHashMapValues(this); - }}, toJSON:function() { - return this.map; - }, toString:function() { - if (this.isEmpty()) { - return "{}"; - } - var map = this.map; - var isFirst = true; - var builder = "{"; - for (var key in map) { - var value = map[key]; - builder += (isFirst ? "" : ", ") + Kotlin.toString(key) + "\x3d" + (value === this ? "(this Map)" : Kotlin.toString(value)); - isFirst = false; - } - return builder + "}"; - }, equals_za3rmp$:function(o) { - if (o == null || this.size !== o.size) { - return false; - } - var map = this.map; - for (var key in map) { - var key_ = this.convertKeyToKeyType(key); - var value = map[key]; - if (value == null) { - if (!(o.get_za3rmp$(key_) == null && o.contains_za3rmp$(key_))) { - return false; - } - } else { - if (!Kotlin.equals(value, o.get_za3rmp$(key_))) { - return false; - } - } - } - return true; - }, hashCode:function() { - var h = 0; - var map = this.map; - for (var key in map) { - h += mapEntryHashCode(this.convertKeyToKeyType(key), map[key]); - } - return h; - }}); - lazyInitClasses.DefaultPrimitiveHashMap = Kotlin.createClass(function() { - return[Kotlin.AbstractPrimitiveHashMap]; - }, function() { - Kotlin.AbstractPrimitiveHashMap.call(this); - }, {getKeySetClass:function() { - return Kotlin.DefaultPrimitiveHashSet; - }, convertKeyToKeyType:convertKeyToString}); - lazyInitClasses.PrimitiveNumberHashMap = Kotlin.createClass(function() { - return[Kotlin.AbstractPrimitiveHashMap]; - }, function() { - Kotlin.AbstractPrimitiveHashMap.call(this); - this.$keySetClass$ = Kotlin.PrimitiveNumberHashSet; - }, {getKeySetClass:function() { - return Kotlin.PrimitiveNumberHashSet; - }, convertKeyToKeyType:convertKeyToNumber}); - lazyInitClasses.PrimitiveBooleanHashMap = Kotlin.createClass(function() { - return[Kotlin.AbstractPrimitiveHashMap]; - }, function() { - Kotlin.AbstractPrimitiveHashMap.call(this); - }, {getKeySetClass:function() { - return Kotlin.PrimitiveBooleanHashSet; - }, convertKeyToKeyType:convertKeyToBoolean}); - lazyInitClasses.LinkedHashMap = Kotlin.createClass(function() { - return[Kotlin.ComplexHashMap]; - }, function() { - Kotlin.ComplexHashMap.call(this); - this.orderedKeys = []; - }, {put_wn2jw4$:function(key, value) { - if (!this.containsKey_za3rmp$(key)) { - this.orderedKeys.push(key); - } - return Kotlin.ComplexHashMap.prototype.put_wn2jw4$.call(this, key, value); - }, remove_za3rmp$:function(key) { - var i = this.orderedKeys.indexOf(key); - if (i != -1) { - this.orderedKeys.splice(i, 1); - } - return Kotlin.ComplexHashMap.prototype.remove_za3rmp$.call(this, key); - }, clear:function() { - Kotlin.ComplexHashMap.prototype.clear.call(this); - this.orderedKeys = []; - }, keys:{get:function() { - var set = new Kotlin.LinkedHashSet; - set.map = this; - return set; - }}, entries:{get:function() { - var set = new Kotlin.LinkedHashSet; - for (var i = 0, c = this.orderedKeys, l = c.length;i < l;i++) { - set.add_za3rmp$(new Entry(c[i], this.get_za3rmp$(c[i]))); - } - return set; - }}}); - lazyInitClasses.LinkedHashSet = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.MutableSet, Kotlin.HashSet]; - }, function() { - this.map = new Kotlin.LinkedHashMap; - }, {equals_za3rmp$:hashSetEquals, hashCode:hashSetHashCode, size:{get:function() { - return this.map.size; - }}, contains_za3rmp$:function(element) { - return this.map.containsKey_za3rmp$(element); - }, iterator:function() { - return new Kotlin.SetIterator(this); - }, add_za3rmp$:function(element) { - return this.map.put_wn2jw4$(element, true) == null; - }, remove_za3rmp$:function(element) { - return this.map.remove_za3rmp$(element) != null; - }, clear:function() { - this.map.clear(); - }, toArray:function() { - return this.map.orderedKeys.slice(); - }}); - lazyInitClasses.SetIterator = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.MutableIterator]; - }, function(set) { - this.set = set; - this.keys = set.toArray(); - this.index = 0; - }, {next:function() { - if (!this.hasNext()) { - throw new Kotlin.NoSuchElementException; - } - return this.keys[this.index++]; - }, hasNext:function() { - return this.index < this.keys.length; - }, remove:function() { - if (this.index === 0) { - throw Kotlin.IllegalStateException(); - } - this.set.remove_za3rmp$(this.keys[this.index - 1]); - }}); - lazyInitClasses.AbstractPrimitiveHashSet = Kotlin.createClass(function() { - return[Kotlin.HashSet]; - }, function() { - this.$size = 0; - this.map = Object.create(null); - }, {equals_za3rmp$:hashSetEquals, hashCode:hashSetHashCode, size:{get:function() { - return this.$size; - }}, contains_za3rmp$:function(key) { - return this.map[key] === true; - }, iterator:function() { - return new Kotlin.SetIterator(this); - }, add_za3rmp$:function(element) { - var prevElement = this.map[element]; - this.map[element] = true; - if (prevElement === true) { - return false; - } else { - this.$size++; - return true; - } - }, remove_za3rmp$:function(element) { - if (this.map[element] === true) { - delete this.map[element]; - this.$size--; - return true; - } else { - return false; - } - }, clear:function() { - this.$size = 0; - this.map = {}; - }, convertKeyToKeyType:function(key) { - throw new Error("Kotlin.AbstractPrimitiveHashSet.convertKeyToKeyType is abstract"); - }, toArray:function() { - var result = Object.keys(this.map); - for (var i = 0;i < result.length;i++) { - result[i] = this.convertKeyToKeyType(result[i]); - } - return result; - }}); - lazyInitClasses.DefaultPrimitiveHashSet = Kotlin.createClass(function() { - return[Kotlin.AbstractPrimitiveHashSet]; - }, function() { - Kotlin.AbstractPrimitiveHashSet.call(this); - }, {toArray:function() { - return Object.keys(this.map); - }, convertKeyToKeyType:convertKeyToString}); - lazyInitClasses.PrimitiveNumberHashSet = Kotlin.createClass(function() { - return[Kotlin.AbstractPrimitiveHashSet]; - }, function() { - Kotlin.AbstractPrimitiveHashSet.call(this); - }, {convertKeyToKeyType:convertKeyToNumber}); - lazyInitClasses.PrimitiveBooleanHashSet = Kotlin.createClass(function() { - return[Kotlin.AbstractPrimitiveHashSet]; - }, function() { - Kotlin.AbstractPrimitiveHashSet.call(this); - }, {convertKeyToKeyType:convertKeyToBoolean}); - function HashSet(hashingFunction, equalityFunction) { - var hashTable = new Kotlin.HashTable(hashingFunction, equalityFunction); - this.addAll_wtfk93$ = Kotlin.AbstractCollection.prototype.addAll_wtfk93$; - this.removeAll_wtfk93$ = Kotlin.AbstractCollection.prototype.removeAll_wtfk93$; - this.retainAll_wtfk93$ = Kotlin.AbstractCollection.prototype.retainAll_wtfk93$; - this.containsAll_wtfk93$ = Kotlin.AbstractCollection.prototype.containsAll_wtfk93$; - this.add_za3rmp$ = function(o) { - return!hashTable.put_wn2jw4$(o, true); - }; - this.toArray = function() { - return hashTable._keys(); - }; - this.iterator = function() { - return new Kotlin.SetIterator(this); - }; - this.remove_za3rmp$ = function(o) { - return hashTable.remove_za3rmp$(o) != null; - }; - this.contains_za3rmp$ = function(o) { - return hashTable.containsKey_za3rmp$(o); - }; - this.clear = function() { - hashTable.clear(); - }; - Object.defineProperty(this, "size", {get:function() { - return hashTable.size; - }}); - this.isEmpty = function() { - return hashTable.isEmpty(); - }; - this.clone = function() { - var h = new HashSet(hashingFunction, equalityFunction); - h.addAll_wtfk93$(hashTable.keys()); - return h; - }; - this.equals_za3rmp$ = hashSetEquals; - this.toString = function() { - var builder = "["; - var iter = this.iterator(); - var first = true; - while (iter.hasNext()) { - if (first) { - first = false; - } else { - builder += ", "; - } - builder += iter.next(); - } - builder += "]"; - return builder; - }; - this.intersection = function(hashSet) { - var intersection = new HashSet(hashingFunction, equalityFunction); - var values = hashSet.values, i = values.length, val; - while (i--) { - val = values[i]; - if (hashTable.containsKey_za3rmp$(val)) { - intersection.add_za3rmp$(val); - } - } - return intersection; - }; - this.union = function(hashSet) { - var union = this.clone(); - var values = hashSet.values, i = values.length, val; - while (i--) { - val = values[i]; - if (!hashTable.containsKey_za3rmp$(val)) { - union.add_za3rmp$(val); - } - } - return union; - }; - this.isSubsetOf = function(hashSet) { - var values = hashTable.keys(), i = values.length; - while (i--) { - if (!hashSet.contains_za3rmp$(values[i])) { - return false; - } - } - return true; - }; - this.hashCode = hashSetHashCode; - } - lazyInitClasses.HashSet = Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.MutableSet, Kotlin.AbstractCollection]; - }, function() { - HashSet.call(this); - }); - Object.defineProperty(Kotlin, "ComplexHashSet", {get:function() { - return Kotlin.HashSet; - }}); - Kotlin.createDefinition(lazyInitClasses, Kotlin); -})(Kotlin); -(function(Kotlin) { - Kotlin.Long = function(low, high) { - this.low_ = low | 0; - this.high_ = high | 0; - }; - Kotlin.Long.IntCache_ = {}; - Kotlin.Long.fromInt = function(value) { - if (-128 <= value && value < 128) { - var cachedObj = Kotlin.Long.IntCache_[value]; - if (cachedObj) { - return cachedObj; - } - } - var obj = new Kotlin.Long(value | 0, value < 0 ? -1 : 0); - if (-128 <= value && value < 128) { - Kotlin.Long.IntCache_[value] = obj; - } - return obj; - }; - Kotlin.Long.fromNumber = function(value) { - if (isNaN(value) || !isFinite(value)) { - return Kotlin.Long.ZERO; - } else { - if (value <= -Kotlin.Long.TWO_PWR_63_DBL_) { - return Kotlin.Long.MIN_VALUE; - } else { - if (value + 1 >= Kotlin.Long.TWO_PWR_63_DBL_) { - return Kotlin.Long.MAX_VALUE; - } else { - if (value < 0) { - return Kotlin.Long.fromNumber(-value).negate(); - } else { - return new Kotlin.Long(value % Kotlin.Long.TWO_PWR_32_DBL_ | 0, value / Kotlin.Long.TWO_PWR_32_DBL_ | 0); - } - } - } - } - }; - Kotlin.Long.fromBits = function(lowBits, highBits) { - return new Kotlin.Long(lowBits, highBits); - }; - Kotlin.Long.fromString = function(str, opt_radix) { - if (str.length == 0) { - throw Error("number format error: empty string"); - } - var radix = opt_radix || 10; - if (radix < 2 || 36 < radix) { - throw Error("radix out of range: " + radix); - } - if (str.charAt(0) == "-") { - return Kotlin.Long.fromString(str.substring(1), radix).negate(); - } else { - if (str.indexOf("-") >= 0) { - throw Error('number format error: interior "-" character: ' + str); - } - } - var radixToPower = Kotlin.Long.fromNumber(Math.pow(radix, 8)); - var result = Kotlin.Long.ZERO; - for (var i = 0;i < str.length;i += 8) { - var size = Math.min(8, str.length - i); - var value = parseInt(str.substring(i, i + size), radix); - if (size < 8) { - var power = Kotlin.Long.fromNumber(Math.pow(radix, size)); - result = result.multiply(power).add(Kotlin.Long.fromNumber(value)); - } else { - result = result.multiply(radixToPower); - result = result.add(Kotlin.Long.fromNumber(value)); - } - } - return result; - }; - Kotlin.Long.TWO_PWR_16_DBL_ = 1 << 16; - Kotlin.Long.TWO_PWR_24_DBL_ = 1 << 24; - Kotlin.Long.TWO_PWR_32_DBL_ = Kotlin.Long.TWO_PWR_16_DBL_ * Kotlin.Long.TWO_PWR_16_DBL_; - Kotlin.Long.TWO_PWR_31_DBL_ = Kotlin.Long.TWO_PWR_32_DBL_ / 2; - Kotlin.Long.TWO_PWR_48_DBL_ = Kotlin.Long.TWO_PWR_32_DBL_ * Kotlin.Long.TWO_PWR_16_DBL_; - Kotlin.Long.TWO_PWR_64_DBL_ = Kotlin.Long.TWO_PWR_32_DBL_ * Kotlin.Long.TWO_PWR_32_DBL_; - Kotlin.Long.TWO_PWR_63_DBL_ = Kotlin.Long.TWO_PWR_64_DBL_ / 2; - Kotlin.Long.ZERO = Kotlin.Long.fromInt(0); - Kotlin.Long.ONE = Kotlin.Long.fromInt(1); - Kotlin.Long.NEG_ONE = Kotlin.Long.fromInt(-1); - Kotlin.Long.MAX_VALUE = Kotlin.Long.fromBits(4294967295 | 0, 2147483647 | 0); - Kotlin.Long.MIN_VALUE = Kotlin.Long.fromBits(0, 2147483648 | 0); - Kotlin.Long.TWO_PWR_24_ = Kotlin.Long.fromInt(1 << 24); - Kotlin.Long.prototype.toInt = function() { - return this.low_; - }; - Kotlin.Long.prototype.toNumber = function() { - return this.high_ * Kotlin.Long.TWO_PWR_32_DBL_ + this.getLowBitsUnsigned(); - }; - Kotlin.Long.prototype.toString = function(opt_radix) { - var radix = opt_radix || 10; - if (radix < 2 || 36 < radix) { - throw Error("radix out of range: " + radix); - } - if (this.isZero()) { - return "0"; - } - if (this.isNegative()) { - if (this.equals(Kotlin.Long.MIN_VALUE)) { - var radixLong = Kotlin.Long.fromNumber(radix); - var div = this.div(radixLong); - var rem = div.multiply(radixLong).subtract(this); - return div.toString(radix) + rem.toInt().toString(radix); - } else { - return "-" + this.negate().toString(radix); - } - } - var radixToPower = Kotlin.Long.fromNumber(Math.pow(radix, 6)); - var rem = this; - var result = ""; - while (true) { - var remDiv = rem.div(radixToPower); - var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt(); - var digits = intval.toString(radix); - rem = remDiv; - if (rem.isZero()) { - return digits + result; - } else { - while (digits.length < 6) { - digits = "0" + digits; - } - result = "" + digits + result; - } - } - }; - Kotlin.Long.prototype.getHighBits = function() { - return this.high_; - }; - Kotlin.Long.prototype.getLowBits = function() { - return this.low_; - }; - Kotlin.Long.prototype.getLowBitsUnsigned = function() { - return this.low_ >= 0 ? this.low_ : Kotlin.Long.TWO_PWR_32_DBL_ + this.low_; - }; - Kotlin.Long.prototype.getNumBitsAbs = function() { - if (this.isNegative()) { - if (this.equals(Kotlin.Long.MIN_VALUE)) { - return 64; - } else { - return this.negate().getNumBitsAbs(); - } - } else { - var val = this.high_ != 0 ? this.high_ : this.low_; - for (var bit = 31;bit > 0;bit--) { - if ((val & 1 << bit) != 0) { - break; - } - } - return this.high_ != 0 ? bit + 33 : bit + 1; - } - }; - Kotlin.Long.prototype.isZero = function() { - return this.high_ == 0 && this.low_ == 0; - }; - Kotlin.Long.prototype.isNegative = function() { - return this.high_ < 0; - }; - Kotlin.Long.prototype.isOdd = function() { - return(this.low_ & 1) == 1; - }; - Kotlin.Long.prototype.equals = function(other) { - return this.high_ == other.high_ && this.low_ == other.low_; - }; - Kotlin.Long.prototype.notEquals = function(other) { - return this.high_ != other.high_ || this.low_ != other.low_; - }; - Kotlin.Long.prototype.lessThan = function(other) { - return this.compare(other) < 0; - }; - Kotlin.Long.prototype.lessThanOrEqual = function(other) { - return this.compare(other) <= 0; - }; - Kotlin.Long.prototype.greaterThan = function(other) { - return this.compare(other) > 0; - }; - Kotlin.Long.prototype.greaterThanOrEqual = function(other) { - return this.compare(other) >= 0; - }; - Kotlin.Long.prototype.compare = function(other) { - if (this.equals(other)) { - return 0; - } - var thisNeg = this.isNegative(); - var otherNeg = other.isNegative(); - if (thisNeg && !otherNeg) { - return-1; - } - if (!thisNeg && otherNeg) { - return 1; - } - if (this.subtract(other).isNegative()) { - return-1; - } else { - return 1; - } - }; - Kotlin.Long.prototype.negate = function() { - if (this.equals(Kotlin.Long.MIN_VALUE)) { - return Kotlin.Long.MIN_VALUE; - } else { - return this.not().add(Kotlin.Long.ONE); - } - }; - Kotlin.Long.prototype.add = function(other) { - var a48 = this.high_ >>> 16; - var a32 = this.high_ & 65535; - var a16 = this.low_ >>> 16; - var a00 = this.low_ & 65535; - var b48 = other.high_ >>> 16; - var b32 = other.high_ & 65535; - var b16 = other.low_ >>> 16; - var b00 = other.low_ & 65535; - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 + b00; - c16 += c00 >>> 16; - c00 &= 65535; - c16 += a16 + b16; - c32 += c16 >>> 16; - c16 &= 65535; - c32 += a32 + b32; - c48 += c32 >>> 16; - c32 &= 65535; - c48 += a48 + b48; - c48 &= 65535; - return Kotlin.Long.fromBits(c16 << 16 | c00, c48 << 16 | c32); - }; - Kotlin.Long.prototype.subtract = function(other) { - return this.add(other.negate()); - }; - Kotlin.Long.prototype.multiply = function(other) { - if (this.isZero()) { - return Kotlin.Long.ZERO; - } else { - if (other.isZero()) { - return Kotlin.Long.ZERO; - } - } - if (this.equals(Kotlin.Long.MIN_VALUE)) { - return other.isOdd() ? Kotlin.Long.MIN_VALUE : Kotlin.Long.ZERO; - } else { - if (other.equals(Kotlin.Long.MIN_VALUE)) { - return this.isOdd() ? Kotlin.Long.MIN_VALUE : Kotlin.Long.ZERO; - } - } - if (this.isNegative()) { - if (other.isNegative()) { - return this.negate().multiply(other.negate()); - } else { - return this.negate().multiply(other).negate(); - } - } else { - if (other.isNegative()) { - return this.multiply(other.negate()).negate(); - } - } - if (this.lessThan(Kotlin.Long.TWO_PWR_24_) && other.lessThan(Kotlin.Long.TWO_PWR_24_)) { - return Kotlin.Long.fromNumber(this.toNumber() * other.toNumber()); - } - var a48 = this.high_ >>> 16; - var a32 = this.high_ & 65535; - var a16 = this.low_ >>> 16; - var a00 = this.low_ & 65535; - var b48 = other.high_ >>> 16; - var b32 = other.high_ & 65535; - var b16 = other.low_ >>> 16; - var b00 = other.low_ & 65535; - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 * b00; - c16 += c00 >>> 16; - c00 &= 65535; - c16 += a16 * b00; - c32 += c16 >>> 16; - c16 &= 65535; - c16 += a00 * b16; - c32 += c16 >>> 16; - c16 &= 65535; - c32 += a32 * b00; - c48 += c32 >>> 16; - c32 &= 65535; - c32 += a16 * b16; - c48 += c32 >>> 16; - c32 &= 65535; - c32 += a00 * b32; - c48 += c32 >>> 16; - c32 &= 65535; - c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; - c48 &= 65535; - return Kotlin.Long.fromBits(c16 << 16 | c00, c48 << 16 | c32); - }; - Kotlin.Long.prototype.div = function(other) { - if (other.isZero()) { - throw Error("division by zero"); - } else { - if (this.isZero()) { - return Kotlin.Long.ZERO; - } - } - if (this.equals(Kotlin.Long.MIN_VALUE)) { - if (other.equals(Kotlin.Long.ONE) || other.equals(Kotlin.Long.NEG_ONE)) { - return Kotlin.Long.MIN_VALUE; - } else { - if (other.equals(Kotlin.Long.MIN_VALUE)) { - return Kotlin.Long.ONE; - } else { - var halfThis = this.shiftRight(1); - var approx = halfThis.div(other).shiftLeft(1); - if (approx.equals(Kotlin.Long.ZERO)) { - return other.isNegative() ? Kotlin.Long.ONE : Kotlin.Long.NEG_ONE; - } else { - var rem = this.subtract(other.multiply(approx)); - var result = approx.add(rem.div(other)); - return result; - } - } - } - } else { - if (other.equals(Kotlin.Long.MIN_VALUE)) { - return Kotlin.Long.ZERO; - } - } - if (this.isNegative()) { - if (other.isNegative()) { - return this.negate().div(other.negate()); - } else { - return this.negate().div(other).negate(); - } - } else { - if (other.isNegative()) { - return this.div(other.negate()).negate(); - } - } - var res = Kotlin.Long.ZERO; - var rem = this; - while (rem.greaterThanOrEqual(other)) { - var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber())); - var log2 = Math.ceil(Math.log(approx) / Math.LN2); - var delta = log2 <= 48 ? 1 : Math.pow(2, log2 - 48); - var approxRes = Kotlin.Long.fromNumber(approx); - var approxRem = approxRes.multiply(other); - while (approxRem.isNegative() || approxRem.greaterThan(rem)) { - approx -= delta; - approxRes = Kotlin.Long.fromNumber(approx); - approxRem = approxRes.multiply(other); - } - if (approxRes.isZero()) { - approxRes = Kotlin.Long.ONE; - } - res = res.add(approxRes); - rem = rem.subtract(approxRem); - } - return res; - }; - Kotlin.Long.prototype.modulo = function(other) { - return this.subtract(this.div(other).multiply(other)); - }; - Kotlin.Long.prototype.not = function() { - return Kotlin.Long.fromBits(~this.low_, ~this.high_); - }; - Kotlin.Long.prototype.and = function(other) { - return Kotlin.Long.fromBits(this.low_ & other.low_, this.high_ & other.high_); - }; - Kotlin.Long.prototype.or = function(other) { - return Kotlin.Long.fromBits(this.low_ | other.low_, this.high_ | other.high_); - }; - Kotlin.Long.prototype.xor = function(other) { - return Kotlin.Long.fromBits(this.low_ ^ other.low_, this.high_ ^ other.high_); - }; - Kotlin.Long.prototype.shiftLeft = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var low = this.low_; - if (numBits < 32) { - var high = this.high_; - return Kotlin.Long.fromBits(low << numBits, high << numBits | low >>> 32 - numBits); - } else { - return Kotlin.Long.fromBits(0, low << numBits - 32); - } - } - }; - Kotlin.Long.prototype.shiftRight = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var high = this.high_; - if (numBits < 32) { - var low = this.low_; - return Kotlin.Long.fromBits(low >>> numBits | high << 32 - numBits, high >> numBits); - } else { - return Kotlin.Long.fromBits(high >> numBits - 32, high >= 0 ? 0 : -1); - } - } - }; - Kotlin.Long.prototype.shiftRightUnsigned = function(numBits) { - numBits &= 63; - if (numBits == 0) { - return this; - } else { - var high = this.high_; - if (numBits < 32) { - var low = this.low_; - return Kotlin.Long.fromBits(low >>> numBits | high << 32 - numBits, high >>> numBits); - } else { - if (numBits == 32) { - return Kotlin.Long.fromBits(high, 0); - } else { - return Kotlin.Long.fromBits(high >>> numBits - 32, 0); - } - } - } - }; - Kotlin.Long.prototype.equals_za3rmp$ = function(other) { - return other instanceof Kotlin.Long && this.equals(other); - }; - Kotlin.Long.prototype.compareTo_za3rmp$ = Kotlin.Long.prototype.compare; - Kotlin.Long.prototype.inc = function() { - return this.add(Kotlin.Long.ONE); - }; - Kotlin.Long.prototype.dec = function() { - return this.add(Kotlin.Long.NEG_ONE); - }; - Kotlin.Long.prototype.valueOf = function() { - return this.toNumber(); - }; - Kotlin.Long.prototype.unaryPlus = function() { - return this; - }; - Kotlin.Long.prototype.unaryMinus = Kotlin.Long.prototype.negate; - Kotlin.Long.prototype.inv = Kotlin.Long.prototype.not; - Kotlin.Long.prototype.rangeTo = function(other) { - return new Kotlin.LongRange(this, other); - }; -})(Kotlin); -(function(Kotlin) { - var _ = Kotlin.defineRootPackage(null, {kotlin:Kotlin.definePackage(null, {collections:Kotlin.definePackage(null, {Iterable:Kotlin.createTrait(null), MutableIterable:Kotlin.createTrait(function() { - return[_.kotlin.collections.Iterable]; - }), Collection:Kotlin.createTrait(function() { - return[_.kotlin.collections.Iterable]; - }), MutableCollection:Kotlin.createTrait(function() { - return[_.kotlin.collections.MutableIterable, _.kotlin.collections.Collection]; - }), List:Kotlin.createTrait(function() { - return[_.kotlin.collections.Collection]; - }), MutableList:Kotlin.createTrait(function() { - return[_.kotlin.collections.MutableCollection, _.kotlin.collections.List]; - }), Set:Kotlin.createTrait(function() { - return[_.kotlin.collections.Collection]; - }), MutableSet:Kotlin.createTrait(function() { - return[_.kotlin.collections.MutableCollection, _.kotlin.collections.Set]; - }), Map:Kotlin.createTrait(null, null, {Entry:Kotlin.createTrait(null)}), MutableMap:Kotlin.createTrait(function() { - return[_.kotlin.collections.Map]; - }, null, {MutableEntry:Kotlin.createTrait(function() { - return[_.kotlin.collections.Map.Entry]; - })}), Iterator:Kotlin.createTrait(null), MutableIterator:Kotlin.createTrait(function() { - return[_.kotlin.collections.Iterator]; - }), ListIterator:Kotlin.createTrait(function() { - return[_.kotlin.collections.Iterator]; - }), MutableListIterator:Kotlin.createTrait(function() { - return[_.kotlin.collections.MutableIterator, _.kotlin.collections.ListIterator]; - }), ByteIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextByte(); - }}), CharIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextChar(); - }}), ShortIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextShort(); - }}), IntIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextInt(); - }}), LongIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextLong(); - }}), FloatIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextFloat(); - }}), DoubleIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextDouble(); - }}), BooleanIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.Iterator]; - }, null, {next:function() { - return this.nextBoolean(); - }})}), Function:Kotlin.createTrait(null), ranges:Kotlin.definePackage(null, {ClosedRange:Kotlin.createTrait(null, {contains_htax2k$:function(value) { - return Kotlin.compareTo(value, this.start) >= 0 && Kotlin.compareTo(value, this.endInclusive) <= 0; - }, isEmpty:function() { - return Kotlin.compareTo(this.start, this.endInclusive) > 0; - }})}), annotation:Kotlin.definePackage(null, {AnnotationTarget:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{CLASS:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, ANNOTATION_CLASS:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, TYPE_PARAMETER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, PROPERTY:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, FIELD:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, LOCAL_VARIABLE:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, VALUE_PARAMETER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, CONSTRUCTOR:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, FUNCTION:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, PROPERTY_GETTER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, PROPERTY_SETTER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, TYPE:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, EXPRESSION:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, FILE:function() { - return new _.kotlin.annotation.AnnotationTarget; - }}; - }), AnnotationRetention:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{SOURCE:function() { - return new _.kotlin.annotation.AnnotationRetention; - }, BINARY:function() { - return new _.kotlin.annotation.AnnotationRetention; - }, RUNTIME:function() { - return new _.kotlin.annotation.AnnotationRetention; - }}; - }), Target:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, function(allowedTargets) { - this.allowedTargets = allowedTargets; - }), Retention:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, function(value) { - if (value === void 0) { - value = _.kotlin.annotation.AnnotationRetention.RUNTIME; - } - this.value = value; - }), Repeatable:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), MustBeDocumented:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null)})})}); - Kotlin.defineModule("builtins", _); -})(Kotlin); -(function(Kotlin) { - var _ = Kotlin.defineRootPackage(null, {kotlin:Kotlin.definePackage(null, {js:Kotlin.definePackage(null, {jsTypeOf_za3rmp$:Kotlin.defineInlineFunction("stdlib.kotlin.js.jsTypeOf_za3rmp$", function(a) { - return typeof a; - }), asDynamic_s8jyvl$:Kotlin.defineInlineFunction("stdlib.kotlin.js.asDynamic_s8jyvl$", function($receiver) { - return $receiver; - }), iterator_s8jyvl$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var r = $receiver; - if ($receiver["iterator"] != null) { - tmp$2 = $receiver["iterator"](); - } else { - if (Array.isArray(r)) { - tmp$2 = Kotlin.arrayIterator(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - } else { - tmp$2 = (Kotlin.isType(tmp$1 = r, Kotlin.modules["builtins"].kotlin.collections.Iterable) ? tmp$1 : Kotlin.throwCCE()).iterator(); - } - } - return tmp$2; - }, json_eoa9s7$:function(pairs) { - var tmp$1, tmp$2, tmp$3; - var res = {}; - tmp$1 = pairs, tmp$2 = tmp$1.length; - for (var tmp$3 = 0;tmp$3 !== tmp$2;++tmp$3) { - var tmp$0 = tmp$1[tmp$3], name = tmp$0.component1(), value = tmp$0.component2(); - res[name] = value; - } - return res; - }, internal:Kotlin.definePackage(null, {DoubleCompanionObject:Kotlin.createObject(null, function() { - this.MIN_VALUE = Number.MIN_VALUE; - this.MAX_VALUE = Number.MAX_VALUE; - this.POSITIVE_INFINITY = Number.POSITIVE_INFINITY; - this.NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY; - this.NaN = Number.NaN; - }), FloatCompanionObject:Kotlin.createObject(null, function() { - this.MIN_VALUE = Number.MIN_VALUE; - this.MAX_VALUE = Number.MAX_VALUE; - this.POSITIVE_INFINITY = Number.POSITIVE_INFINITY; - this.NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY; - this.NaN = Number.NaN; - }), IntCompanionObject:Kotlin.createObject(null, function() { - this.MIN_VALUE = -2147483647 - 1; - this.MAX_VALUE = 2147483647; - }), LongCompanionObject:Kotlin.createObject(null, function() { - this.MIN_VALUE = Kotlin.Long.MIN_VALUE; - this.MAX_VALUE = Kotlin.Long.MAX_VALUE; - }), ShortCompanionObject:Kotlin.createObject(null, function() { - this.MIN_VALUE = -32768; - this.MAX_VALUE = 32767; - }), ByteCompanionObject:Kotlin.createObject(null, function() { - this.MIN_VALUE = -128; - this.MAX_VALUE = 127; - }), CharCompanionObject:Kotlin.createObject(null, function() { - this.MIN_HIGH_SURROGATE = "\ud800"; - this.MAX_HIGH_SURROGATE = "\udbff"; - this.MIN_LOW_SURROGATE = "\udc00"; - this.MAX_LOW_SURROGATE = "\udfff"; - this.MIN_SURROGATE = this.MIN_HIGH_SURROGATE; - this.MAX_SURROGATE = this.MAX_LOW_SURROGATE; - }), StringCompanionObject:Kotlin.createObject(null, null), EnumCompanionObject:Kotlin.createObject(null, null)})}), jvm:Kotlin.definePackage(null, {JvmOverloads:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), JvmName:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, function(name) { - this.name = name; - }), JvmMultifileClass:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null)}), text:Kotlin.definePackage(null, {isWhitespace_myv2d1$:function($receiver) { - var $receiver_0 = $receiver.toString(); - var regex = "[\\s\\xA0]"; - var result = $receiver_0.match(regex); - return result != null && result.length > 0; - }, isHighSurrogate_myv2d1$:function($receiver) { - return(new Kotlin.CharRange(Kotlin.modules["stdlib"].kotlin.js.internal.CharCompanionObject.MIN_HIGH_SURROGATE, Kotlin.modules["stdlib"].kotlin.js.internal.CharCompanionObject.MAX_HIGH_SURROGATE)).contains_htax2k$($receiver); - }, isLowSurrogate_myv2d1$:function($receiver) { - return(new Kotlin.CharRange(Kotlin.modules["stdlib"].kotlin.js.internal.CharCompanionObject.MIN_LOW_SURROGATE, Kotlin.modules["stdlib"].kotlin.js.internal.CharCompanionObject.MAX_LOW_SURROGATE)).contains_htax2k$($receiver); - }, RegexOption:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun(value) { - $fun.baseInitializer.call(this); - this.value = value; - }, function() { - return{IGNORE_CASE:function() { - return new _.kotlin.text.RegexOption("i"); - }, MULTILINE:function() { - return new _.kotlin.text.RegexOption("m"); - }}; - }), MatchGroup:Kotlin.createClass(null, function(value) { - this.value = value; - }, {component1:function() { - return this.value; - }, copy_61zpoe$:function(value) { - return new _.kotlin.text.MatchGroup(value === void 0 ? this.value : value); - }, toString:function() { - return "MatchGroup(value\x3d" + Kotlin.toString(this.value) + ")"; - }, hashCode:function() { - var result = 0; - result = result * 31 + Kotlin.hashCode(this.value) | 0; - return result; - }, equals_za3rmp$:function(other) { - return this === other || other !== null && (typeof other === "object" && (Object.getPrototypeOf(this) === Object.getPrototypeOf(other) && Kotlin.equals(this.value, other.value))); - }}), Regex:Kotlin.createClass(null, function(pattern, options) { - this.pattern = pattern; - this.options = _.kotlin.collections.toSet_q5oq31$(options); - var destination = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault(options, 10)); - var tmp$4; - tmp$4 = options.iterator(); - while (tmp$4.hasNext()) { - var item = tmp$4.next(); - destination.add_za3rmp$(item.value); - } - this.nativePattern_ug9tz2$ = new RegExp(pattern, _.kotlin.collections.joinToString_ld60a2$(destination, "") + "g"); - }, {matches_6bul2c$:function(input) { - _.kotlin.text.js.reset_bckwes$(this.nativePattern_ug9tz2$); - var match = this.nativePattern_ug9tz2$.exec(input.toString()); - return match != null && (match.index === 0 && this.nativePattern_ug9tz2$.lastIndex === input.length); - }, containsMatchIn_6bul2c$:function(input) { - _.kotlin.text.js.reset_bckwes$(this.nativePattern_ug9tz2$); - return this.nativePattern_ug9tz2$.test(input.toString()); - }, hasMatch_6bul2c$:function(input) { - return this.containsMatchIn_6bul2c$(input); - }, find_905azu$:function(input, startIndex) { - if (startIndex === void 0) { - startIndex = 0; - } - return _.kotlin.text.findNext(this.nativePattern_ug9tz2$, input.toString(), startIndex); - }, match_905azu$:function(input, startIndex) { - if (startIndex === void 0) { - startIndex = 0; - } - return this.find_905azu$(input, startIndex); - }, findAll_905azu$:function(input, startIndex) { - if (startIndex === void 0) { - startIndex = 0; - } - return _.kotlin.sequences.generateSequence_x7nywq$(_.kotlin.text.Regex.findAll_905azu$f(input, startIndex, this), _.kotlin.text.Regex.findAll_905azu$f_0); - }, matchAll_905azu$:function(input, startIndex) { - if (startIndex === void 0) { - startIndex = 0; - } - return this.findAll_905azu$(input, startIndex); - }, matchEntire_6bul2c$:function(input) { - if (_.kotlin.text.startsWith_cjsvxq$(this.pattern, "^") && _.kotlin.text.endsWith_cjsvxq$(this.pattern, "$")) { - return this.find_905azu$(input); - } else { - return(new _.kotlin.text.Regex("^" + _.kotlin.text.trimEnd_1hgcu2$(_.kotlin.text.trimStart_1hgcu2$(this.pattern, ["^"]), ["$"]) + "$", this.options)).find_905azu$(input); - } - }, replace_x2uqeu$:function(input, replacement) { - return input.toString().replace(this.nativePattern_ug9tz2$, replacement); - }, replace_ftxfdg$:Kotlin.defineInlineFunction("stdlib.kotlin.text.Regex.replace_ftxfdg$", function(input, transform) { - var match = this.find_905azu$(input); - if (match == null) { - return input.toString(); - } - var lastStart = 0; - var length = input.length; - var sb = new Kotlin.StringBuilder; - do { - var foundMatch = match != null ? match : Kotlin.throwNPE(); - sb.append(input, lastStart, foundMatch.range.start); - sb.append(transform(foundMatch)); - lastStart = foundMatch.range.endInclusive + 1; - match = foundMatch.next(); - } while (lastStart < length && match != null); - if (lastStart < length) { - sb.append(input, lastStart, length); - } - return sb.toString(); - }), replaceFirst_x2uqeu$:function(input, replacement) { - var $receiver = this.options; - var destination = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)); - var tmp$1; - tmp$1 = $receiver.iterator(); - while (tmp$1.hasNext()) { - var item = tmp$1.next(); - destination.add_za3rmp$(item.value); - } - var nonGlobalOptions = _.kotlin.collections.joinToString_ld60a2$(destination, ""); - return input.toString().replace(new RegExp(this.pattern, nonGlobalOptions), replacement); - }, split_905azu$:function(input, limit) { - var matches; - var tmp$0; - if (limit === void 0) { - limit = 0; - } - if (!(limit >= 0)) { - var message = "Limit must be non-negative, but was " + limit; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - var it = this.findAll_905azu$(input); - matches = limit === 0 ? it : _.kotlin.sequences.take_8xunab$(it, limit - 1); - var result = new Kotlin.ArrayList; - var lastStart = 0; - tmp$0 = matches.iterator(); - while (tmp$0.hasNext()) { - var match = tmp$0.next(); - result.add_za3rmp$(input.substring(lastStart, match.range.start).toString()); - lastStart = match.range.endInclusive + 1; - } - result.add_za3rmp$(input.substring(lastStart, input.length).toString()); - return result; - }, toString:function() { - return this.nativePattern_ug9tz2$.toString(); - }}, {findAll_905azu$f:function(closure$input, closure$startIndex, this$Regex) { - return function() { - return this$Regex.find_905azu$(closure$input, closure$startIndex); - }; - }, findAll_905azu$f_0:function(match) { - return match.next(); - }, Companion:Kotlin.createObject(null, function() { - _.kotlin.text.Regex.Companion.patternEscape_v9iwb0$ = new RegExp("[-\\\\^$*+?.()|[\\]{}]", "g"); - _.kotlin.text.Regex.Companion.replacementEscape_tq1d2u$ = new RegExp("\\$", "g"); - }, {fromLiteral_61zpoe$:function(literal) { - return _.kotlin.text.Regex_61zpoe$(_.kotlin.text.Regex.Companion.escape_61zpoe$(literal)); - }, escape_61zpoe$:function(literal) { - return literal.replace(_.kotlin.text.Regex.Companion.patternEscape_v9iwb0$, "\\$\x26"); - }, escapeReplacement_61zpoe$:function(literal) { - return literal.replace(_.kotlin.text.Regex.Companion.replacementEscape_tq1d2u$, "$$$$"); - }}), object_initializer$:function() { - _.kotlin.text.Regex.Companion; - }}), Regex_sb3q2$:function(pattern, option) { - return new _.kotlin.text.Regex(pattern, _.kotlin.collections.setOf_za3rmp$(option)); - }, Regex_61zpoe$:function(pattern) { - return new _.kotlin.text.Regex(pattern, _.kotlin.collections.emptySet()); - }, findNext$f:Kotlin.createClass(function() { - return[_.kotlin.text.MatchResult]; - }, function(closure$match, this$findNext_0, closure$input_0, closure$range) { - this.closure$match_0 = closure$match; - this.this$findNext_0 = this$findNext_0; - this.closure$input_0 = closure$input_0; - this.closure$range_0 = closure$range; - this.$range_e5n1wm$ = closure$range; - this.$groups_7q1wp7$ = new _.kotlin.text.findNext$f.groups$f(closure$match); - this.groupValues__5s7w6t$ = null; - }, {range:{get:function() { - return this.$range_e5n1wm$; - }}, value:{get:function() { - var tmp$0; - return(tmp$0 = this.closure$match_0[0]) != null ? tmp$0 : Kotlin.throwNPE(); - }}, groups:{get:function() { - return this.$groups_7q1wp7$; - }}, groupValues:{get:function() { - var tmp$0; - if (this.groupValues__5s7w6t$ == null) { - this.groupValues__5s7w6t$ = new _.kotlin.text.findNext$f.f$f(this.closure$match_0); - } - return(tmp$0 = this.groupValues__5s7w6t$) != null ? tmp$0 : Kotlin.throwNPE(); - }}, next:function() { - return _.kotlin.text.findNext(this.this$findNext_0, this.closure$input_0, this.closure$range_0.isEmpty() ? this.closure$range_0.start + 1 : this.closure$range_0.endInclusive + 1); - }}, {f$f:Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function $fun(closure$match_0) { - this.closure$match_0 = closure$match_0; - $fun.baseInitializer.call(this); - }, {size:{get:function() { - return this.closure$match_0.length; - }}, get_za3lpa$:function(index) { - var tmp$0; - return(tmp$0 = this.closure$match_0[index]) != null ? tmp$0 : ""; - }}, {}), groups$f:Kotlin.createClass(function() { - return[_.kotlin.text.MatchGroupCollection]; - }, function(closure$match_0) { - this.closure$match_0 = closure$match_0; - }, {size:{get:function() { - return this.closure$match_0.length; - }}, isEmpty:function() { - return this.size === 0; - }, contains_za3rmp$:function(element) { - var tmp$0; - tmp$0 = this.iterator(); - while (tmp$0.hasNext()) { - var element_0 = tmp$0.next(); - if (Kotlin.equals(element_0, element)) { - return true; - } - } - return false; - }, containsAll_wtfk93$:function(elements) { - var tmp$0; - tmp$0 = elements.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!this.contains_za3rmp$(element)) { - return false; - } - } - return true; - }, iterator:function() { - return _.kotlin.sequences.map_mzhnvn$(_.kotlin.collections.asSequence_q5oq31$(_.kotlin.collections.get_indices_mwto7b$(this)), _.kotlin.text.findNext$f.groups$f.iterator$f(this)).iterator(); - }, get_za3lpa$:function(index) { - var tmp$0; - return(tmp$0 = this.closure$match_0[index]) != null ? new _.kotlin.text.MatchGroup(tmp$0) : null; - }}, {iterator$f:function(this$) { - return function(it) { - return this$.get_za3lpa$(it); - }; - }})}), findNext:function($receiver, input, from) { - $receiver.lastIndex = from; - var match = $receiver.exec(input); - if (match == null) { - return null; - } - var range = new Kotlin.NumberRange(match.index, $receiver.lastIndex - 1); - return new _.kotlin.text.findNext$f(match, $receiver, input, range); - }, nativeIndexOf:function($receiver, ch, fromIndex) { - return $receiver.indexOf(ch.toString(), fromIndex); - }, nativeLastIndexOf:function($receiver, ch, fromIndex) { - return $receiver.lastIndexOf(ch.toString(), fromIndex); - }, startsWith_41xvrb$:function($receiver, prefix, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (!ignoreCase) { - return $receiver.startsWith(prefix, 0); - } else { - return _.kotlin.text.regionMatches_qb0ndp$($receiver, 0, prefix, 0, prefix.length, ignoreCase); - } - }, startsWith_rh6gah$:function($receiver, prefix, startIndex, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (!ignoreCase) { - return $receiver.startsWith(prefix, startIndex); - } else { - return _.kotlin.text.regionMatches_qb0ndp$($receiver, startIndex, prefix, 0, prefix.length, ignoreCase); - } - }, endsWith_41xvrb$:function($receiver, suffix, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (!ignoreCase) { - return $receiver.endsWith(suffix); - } else { - return _.kotlin.text.regionMatches_qb0ndp$($receiver, $receiver.length - suffix.length, suffix, 0, suffix.length, ignoreCase); - } - }, matches_94jgcu$:Kotlin.defineInlineFunction("stdlib.kotlin.text.matches_94jgcu$", function($receiver, regex) { - var result = $receiver.match(regex); - return result != null && result.length > 0; - }), isBlank_gw00vq$:function($receiver) { - var tmp$0 = $receiver.length === 0; - if (!tmp$0) { - var $receiver_0 = typeof $receiver === "string" ? $receiver : $receiver.toString(); - var regex = "^[\\s\\xA0]+$"; - var result = $receiver_0.match(regex); - tmp$0 = result != null && result.length > 0; - } - return tmp$0; - }, equals_41xvrb$:function($receiver, other, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver == null ? other == null : !ignoreCase ? Kotlin.equals($receiver, other) : other != null && Kotlin.equals($receiver.toLowerCase(), other.toLowerCase()); - }, regionMatches_qb0ndp$:function($receiver, thisOffset, other, otherOffset, length, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return _.kotlin.text.regionMatchesImpl($receiver, thisOffset, other, otherOffset, length, ignoreCase); - }, capitalize_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.capitalize_pdl1w0$", function($receiver) { - return $receiver.length > 0 ? $receiver.substring(0, 1).toUpperCase() + $receiver.substring(1) : $receiver; - }), decapitalize_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.decapitalize_pdl1w0$", function($receiver) { - return $receiver.length > 0 ? $receiver.substring(0, 1).toLowerCase() + $receiver.substring(1) : $receiver; - }), repeat_kljjvw$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Count 'n' must be non-negative, but was " + n + "."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - tmp$0 = ""; - } else { - if (n === 1) { - tmp$0 = $receiver.toString(); - } else { - var result = ""; - if (!($receiver.length === 0)) { - var s = $receiver.toString(); - var count = n; - while (true) { - if ((count & 1) === 1) { - result += s; - } - count = count >>> 1; - if (count === 0) { - break; - } - s += s; - } - } - return result; - } - } - return tmp$0; - }, replace_dn5w6f$:function($receiver, oldValue, newValue, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.replace(new RegExp(_.kotlin.text.Regex.Companion.escape_61zpoe$(oldValue), ignoreCase ? "gi" : "g"), _.kotlin.text.Regex.Companion.escapeReplacement_61zpoe$(newValue)); - }, replace_bt3k83$:function($receiver, oldChar, newChar, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.replace(new RegExp(_.kotlin.text.Regex.Companion.escape_61zpoe$(oldChar.toString()), ignoreCase ? "gi" : "g"), newChar.toString()); - }, replaceFirstLiteral_dn5w6f$:function($receiver, oldValue, newValue, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.replace(new RegExp(_.kotlin.text.Regex.Companion.escape_61zpoe$(oldValue), ignoreCase ? "i" : ""), _.kotlin.text.Regex.Companion.escapeReplacement_61zpoe$(newValue)); - }, replaceFirst_dn5w6f$:function($receiver, oldValue, newValue, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.replace(new RegExp(_.kotlin.text.Regex.Companion.escape_61zpoe$(oldValue), ignoreCase ? "i" : ""), _.kotlin.text.Regex.Companion.escapeReplacement_61zpoe$(newValue)); - }, replaceFirst_bt3k83$:function($receiver, oldChar, newChar, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.replace(new RegExp(_.kotlin.text.Regex.Companion.escape_61zpoe$(oldChar.toString()), ignoreCase ? "i" : ""), newChar.toString()); - }, elementAt_kljjvw$:Kotlin.defineInlineFunction("stdlib.kotlin.text.elementAt_kljjvw$", function($receiver, index) { - return $receiver.charAt(index); - }), elementAtOrElse_a9lqqp$:Kotlin.defineInlineFunction("stdlib.kotlin.text.elementAtOrElse_a9lqqp$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.text.get_lastIndex_gw00vq$($receiver) ? $receiver.charAt(index) : defaultValue(index); - }), elementAtOrNull_kljjvw$:Kotlin.defineInlineFunction("stdlib.kotlin.text.elementAtOrNull_kljjvw$", function($receiver, index) { - return _.kotlin.text.getOrNull_kljjvw$($receiver, index); - }), find_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.find_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.findLast_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver.charAt(index); - if (predicate(element)) { - return element; - } - } - return null; - }), first_gw00vq$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Char sequence is empty."); - } - return $receiver.charAt(0); - }, first_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.first_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Char sequence contains no character matching the predicate."); - }), firstOrNull_gw00vq$:function($receiver) { - return $receiver.length === 0 ? null : $receiver.charAt(0); - }, firstOrNull_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.firstOrNull_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), getOrElse_a9lqqp$:Kotlin.defineInlineFunction("stdlib.kotlin.text.getOrElse_a9lqqp$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.text.get_lastIndex_gw00vq$($receiver) ? $receiver.charAt(index) : defaultValue(index); - }), getOrNull_kljjvw$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.text.get_lastIndex_gw00vq$($receiver) ? $receiver.charAt(index) : null; - }, indexOfFirst_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.indexOfFirst_gwcya$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver.charAt(index))) { - return index; - } - } - return-1; - }), indexOfLast_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.indexOfLast_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver.charAt(index))) { - return index; - } - } - return-1; - }), last_gw00vq$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Char sequence is empty."); - } - return $receiver.charAt(_.kotlin.text.get_lastIndex_gw00vq$($receiver)); - }, last_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.last_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver.charAt(index); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Char sequence contains no character matching the predicate."); - }), lastOrNull_gw00vq$:function($receiver) { - return $receiver.length === 0 ? null : $receiver.charAt($receiver.length - 1); - }, lastOrNull_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.lastOrNull_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver.charAt(index); - if (predicate(element)) { - return element; - } - } - return null; - }), single_gw00vq$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Char sequence is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver.charAt(0); - } else { - throw new Kotlin.IllegalArgumentException("Char sequence has more than one element."); - } - } - return tmp$1; - }, single_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.single_gwcya$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Char sequence contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Char sequence contains no character matching the predicate."); - } - return Kotlin.isChar(tmp$1 = single) ? tmp$1 : Kotlin.throwCCE(); - }), singleOrNull_gw00vq$:function($receiver) { - return $receiver.length === 1 ? $receiver.charAt(0) : null; - }, singleOrNull_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.singleOrNull_gwcya$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), drop_kljjvw$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return $receiver.substring(_.kotlin.ranges.coerceAtMost_rksjo2$(n, $receiver.length), $receiver.length); - }, drop_n7iutu$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return $receiver.substring(_.kotlin.ranges.coerceAtMost_rksjo2$(n, $receiver.length)); - }, dropLast_kljjvw$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.text.take_kljjvw$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_n7iutu$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.text.take_n7iutu$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLastWhile_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.dropLastWhile_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(0, index + 1); - } - } - return ""; - }), dropLastWhile_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.dropLastWhile_ggikb8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(0, index + 1); - } - } - return ""; - }), dropWhile_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.dropWhile_gwcya$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(index, $receiver.length); - } - } - return ""; - }), dropWhile_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.dropWhile_ggikb8$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(index); - } - } - return ""; - }), filter_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filter_gwcya$", function($receiver, predicate) { - var destination = new Kotlin.StringBuilder; - var tmp$0; - tmp$0 = $receiver.length - 1; - for (var index = 0;index <= tmp$0;index++) { - var element = $receiver.charAt(index); - if (predicate(element)) { - destination.append(element); - } - } - return destination; - }), filter_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filter_ggikb8$", function($receiver, predicate) { - var destination = new Kotlin.StringBuilder; - var tmp$0; - tmp$0 = $receiver.length - 1; - for (var index = 0;index <= tmp$0;index++) { - var element = $receiver.charAt(index); - if (predicate(element)) { - destination.append(element); - } - } - return destination.toString(); - }), filterIndexed_ig59fr$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterIndexed_ig59fr$", function($receiver, predicate) { - var destination = new Kotlin.StringBuilder; - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.append(item); - } - } - return destination; - }), filterIndexed_kq57hd$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterIndexed_kq57hd$", function($receiver, predicate) { - var destination = new Kotlin.StringBuilder; - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.append(item); - } - } - return destination.toString(); - }), filterIndexedTo_ulxqbb$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterIndexedTo_ulxqbb$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.append(item); - } - } - return destination; - }), filterNot_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterNot_gwcya$", function($receiver, predicate) { - var destination = new Kotlin.StringBuilder; - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.append(element); - } - } - return destination; - }), filterNot_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterNot_ggikb8$", function($receiver, predicate) { - var destination = new Kotlin.StringBuilder; - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.append(element); - } - } - return destination.toString(); - }), filterNotTo_ppzoqm$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterNotTo_ppzoqm$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.append(element); - } - } - return destination; - }), filterTo_ppzoqm$:Kotlin.defineInlineFunction("stdlib.kotlin.text.filterTo_ppzoqm$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = $receiver.length - 1; - for (var index = 0;index <= tmp$0;index++) { - var element = $receiver.charAt(index); - if (predicate(element)) { - destination.append(element); - } - } - return destination; - }), slice_2g2kgt$:function($receiver, indices) { - if (indices.isEmpty()) { - return ""; - } - return _.kotlin.text.subSequence_2g2kgt$($receiver, indices); - }, slice_590b93$:function($receiver, indices) { - if (indices.isEmpty()) { - return ""; - } - return _.kotlin.text.substring_590b93$($receiver, indices); - }, slice_8iyt66$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return ""; - } - var result = new Kotlin.StringBuilder; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var i = tmp$0.next(); - result.append($receiver.charAt(i)); - } - return result; - }, slice_fxv5mg$:Kotlin.defineInlineFunction("stdlib.kotlin.text.slice_fxv5mg$", function($receiver, indices) { - var tmp$0; - return _.kotlin.text.slice_8iyt66$($receiver, indices).toString(); - }), take_kljjvw$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return $receiver.substring(0, _.kotlin.ranges.coerceAtMost_rksjo2$(n, $receiver.length)); - }, take_n7iutu$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return $receiver.substring(0, _.kotlin.ranges.coerceAtMost_rksjo2$(n, $receiver.length)); - }, takeLast_kljjvw$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - var length = $receiver.length; - return $receiver.substring(length - _.kotlin.ranges.coerceAtMost_rksjo2$(n, length), length); - }, takeLast_n7iutu$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested character count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - var length = $receiver.length; - return $receiver.substring(length - _.kotlin.ranges.coerceAtMost_rksjo2$(n, length)); - }, takeLastWhile_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.takeLastWhile_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.text.get_lastIndex_gw00vq$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(index + 1, $receiver.length); - } - } - return $receiver.substring(0, $receiver.length); - }), takeLastWhile_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.takeLastWhile_ggikb8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.text.get_lastIndex_gw00vq$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(index + 1); - } - } - return $receiver; - }), takeWhile_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.takeWhile_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.length - 1; - for (var index = 0;index <= tmp$0;index++) { - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(0, index); - } - } - return $receiver.substring(0, $receiver.length); - }), takeWhile_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.takeWhile_ggikb8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.length - 1; - for (var index = 0;index <= tmp$0;index++) { - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(0, index); - } - } - return $receiver; - }), reversed_gw00vq$:function($receiver) { - return(new Kotlin.StringBuilder($receiver.toString())).reverse(); - }, reversed_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.reversed_pdl1w0$", function($receiver) { - var tmp$0; - return _.kotlin.text.reversed_gw00vq$($receiver).toString(); - }), associate_1p4vo8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.associate_1p4vo8$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateBy_g3n5bm$:Kotlin.defineInlineFunction("stdlib.kotlin.text.associateBy_g3n5bm$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_27fiyi$:Kotlin.defineInlineFunction("stdlib.kotlin.text.associateBy_27fiyi$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_cggu5g$:Kotlin.defineInlineFunction("stdlib.kotlin.text.associateByTo_cggu5g$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_bo8xay$:Kotlin.defineInlineFunction("stdlib.kotlin.text.associateByTo_bo8xay$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateTo_vkk1fc$:Kotlin.defineInlineFunction("stdlib.kotlin.text.associateTo_vkk1fc$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), toCollection_7095o1$:function($receiver, destination) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toHashSet_gw00vq$:function($receiver) { - return _.kotlin.text.toCollection_7095o1$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toList_gw00vq$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver.charAt(0)); - } else { - tmp$1 = _.kotlin.text.toMutableList_gw00vq$($receiver); - } - } - return tmp$1; - }, toMutableList_gw00vq$:function($receiver) { - return _.kotlin.text.toCollection_7095o1$($receiver, new Kotlin.ArrayList($receiver.length)); - }, toSet_gw00vq$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver.charAt(0)); - } else { - tmp$1 = _.kotlin.text.toCollection_7095o1$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, flatMap_1mpcl3$:Kotlin.defineInlineFunction("stdlib.kotlin.text.flatMap_1mpcl3$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_qq0qxe$:Kotlin.defineInlineFunction("stdlib.kotlin.text.flatMapTo_qq0qxe$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), groupBy_g3n5bm$:Kotlin.defineInlineFunction("stdlib.kotlin.text.groupBy_g3n5bm$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_27fiyi$:Kotlin.defineInlineFunction("stdlib.kotlin.text.groupBy_27fiyi$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_j5rwb5$:Kotlin.defineInlineFunction("stdlib.kotlin.text.groupByTo_j5rwb5$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_eemzmj$:Kotlin.defineInlineFunction("stdlib.kotlin.text.groupByTo_eemzmj$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), map_g3n5bm$:Kotlin.defineInlineFunction("stdlib.kotlin.text.map_g3n5bm$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapIndexed_psxq2r$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapIndexed_psxq2r$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedNotNull_psxq2r$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapIndexedNotNull_psxq2r$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapIndexedNotNullTo_rct1as$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapIndexedNotNullTo_rct1as$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapIndexedTo_rct1as$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapIndexedTo_rct1as$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapNotNull_g3n5bm$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapNotNull_g3n5bm$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapNotNullTo_4sukax$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapNotNullTo_4sukax$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapTo_4sukax$:Kotlin.defineInlineFunction("stdlib.kotlin.text.mapTo_4sukax$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), withIndex_gw00vq$f:function(this$withIndex) { - return function() { - return _.kotlin.text.iterator_gw00vq$(this$withIndex); - }; - }, withIndex_gw00vq$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.text.withIndex_gw00vq$f($receiver)); - }, all_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.all_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), any_gw00vq$:function($receiver) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.any_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), count_gw00vq$:Kotlin.defineInlineFunction("stdlib.kotlin.text.count_gw00vq$", function($receiver) { - return $receiver.length; - }), count_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.count_gwcya$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), fold_u4nbyf$:Kotlin.defineInlineFunction("stdlib.kotlin.text.fold_u4nbyf$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), foldIndexed_hj7gsc$:Kotlin.defineInlineFunction("stdlib.kotlin.text.foldIndexed_hj7gsc$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldRight_dr5uf3$:Kotlin.defineInlineFunction("stdlib.kotlin.text.foldRight_dr5uf3$", function($receiver, initial, operation) { - var index = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver.charAt(index--), accumulator); - } - return accumulator; - }), foldRightIndexed_qclpl6$:Kotlin.defineInlineFunction("stdlib.kotlin.text.foldRightIndexed_qclpl6$", function($receiver, initial, operation) { - var index = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver.charAt(index), accumulator); - --index; - } - return accumulator; - }), forEach_1m5ltu$:Kotlin.defineInlineFunction("stdlib.kotlin.text.forEach_1m5ltu$", function($receiver, action) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEachIndexed_ivsfzd$:Kotlin.defineInlineFunction("stdlib.kotlin.text.forEachIndexed_ivsfzd$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), max_gw00vq$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver.charAt(0); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver.charAt(i); - if (max < e) { - max = e; - } - } - return max; - }, maxBy_eowu5k$:Kotlin.defineInlineFunction("stdlib.kotlin.text.maxBy_eowu5k$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver.charAt(0); - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver.charAt(i); - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxWith_ho1wg9$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver.charAt(0); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver.charAt(i); - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, min_gw00vq$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver.charAt(0); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver.charAt(i); - if (min > e) { - min = e; - } - } - return min; - }, minBy_eowu5k$:Kotlin.defineInlineFunction("stdlib.kotlin.text.minBy_eowu5k$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver.charAt(0); - var minValue = selector(minElem); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver.charAt(i); - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minWith_ho1wg9$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver.charAt(0); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver.charAt(i); - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, none_gw00vq$:function($receiver) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.none_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), reduce_jbdc00$:Kotlin.defineInlineFunction("stdlib.kotlin.text.reduce_jbdc00$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty char sequence can't be reduced."); - } - var accumulator = $receiver.charAt(0); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver.charAt(index)); - } - return accumulator; - }), reduceIndexed_dv672j$:Kotlin.defineInlineFunction("stdlib.kotlin.text.reduceIndexed_dv672j$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty char sequence can't be reduced."); - } - var accumulator = $receiver.charAt(0); - tmp$0 = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver.charAt(index)); - } - return accumulator; - }), reduceRight_jbdc00$:Kotlin.defineInlineFunction("stdlib.kotlin.text.reduceRight_jbdc00$", function($receiver, operation) { - var index = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty char sequence can't be reduced."); - } - var accumulator = $receiver.charAt(index--); - while (index >= 0) { - accumulator = operation($receiver.charAt(index--), accumulator); - } - return accumulator; - }), reduceRightIndexed_dv672j$:Kotlin.defineInlineFunction("stdlib.kotlin.text.reduceRightIndexed_dv672j$", function($receiver, operation) { - var index = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty char sequence can't be reduced."); - } - var accumulator = $receiver.charAt(index--); - while (index >= 0) { - accumulator = operation(index, $receiver.charAt(index), accumulator); - --index; - } - return accumulator; - }), sumBy_g3i1jp$:Kotlin.defineInlineFunction("stdlib.kotlin.text.sumBy_g3i1jp$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_pj8hgv$:Kotlin.defineInlineFunction("stdlib.kotlin.text.sumByDouble_pj8hgv$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), partition_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.partition_gwcya$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.StringBuilder; - var second = new Kotlin.StringBuilder; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.append(element); - } else { - second.append(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.partition_ggikb8$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.StringBuilder; - var second = new Kotlin.StringBuilder; - tmp$0 = _.kotlin.text.iterator_gw00vq$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.append(element); - } else { - second.append(element); - } - } - return new _.kotlin.Pair(first.toString(), second.toString()); - }), zip_4ewbza$:function($receiver, other) { - var tmp$0; - var length = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(length); - tmp$0 = length - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver.charAt(i), other.charAt(i))); - } - return list; - }, zip_3n5ypu$:Kotlin.defineInlineFunction("stdlib.kotlin.text.zip_3n5ypu$", function($receiver, other, transform) { - var tmp$0; - var length = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(length); - tmp$0 = length - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver.charAt(i), other.charAt(i))); - } - return list; - }), asIterable_gw00vq$f:function(this$asIterable) { - return function() { - return _.kotlin.text.iterator_gw00vq$(this$asIterable); - }; - }, asIterable_gw00vq$:function($receiver) { - var tmp$0 = typeof $receiver === "string"; - if (tmp$0) { - tmp$0 = $receiver.length === 0; - } - if (tmp$0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.text.asIterable_gw00vq$f($receiver)); - }, asSequence_gw00vq$f:function(this$asSequence) { - return function() { - return _.kotlin.text.iterator_gw00vq$(this$asSequence); - }; - }, asSequence_gw00vq$:function($receiver) { - var tmp$0 = typeof $receiver === "string"; - if (tmp$0) { - tmp$0 = $receiver.length === 0; - } - if (tmp$0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.text.asSequence_gw00vq$f($receiver)); - }, plus_68uai5$:Kotlin.defineInlineFunction("stdlib.kotlin.text.plus_68uai5$", function($receiver, other) { - return $receiver.toString() + other; - }), equals_bapbyp$:function($receiver, other, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if ($receiver === other) { - return true; - } - if (!ignoreCase) { - return false; - } - if ($receiver.toUpperCase() === other.toUpperCase()) { - return true; - } - if ($receiver.toLowerCase() === other.toLowerCase()) { - return true; - } - return false; - }, isSurrogate_myv2d1$:function($receiver) { - return(new Kotlin.CharRange(Kotlin.modules["stdlib"].kotlin.js.internal.CharCompanionObject.MIN_SURROGATE, Kotlin.modules["stdlib"].kotlin.js.internal.CharCompanionObject.MAX_SURROGATE)).contains_htax2k$($receiver); - }, trimMargin_94jgcu$:function($receiver, marginPrefix) { - if (marginPrefix === void 0) { - marginPrefix = "|"; - } - return _.kotlin.text.replaceIndentByMargin_ex0kps$($receiver, "", marginPrefix); - }, replaceIndentByMargin_ex0kps$:function($receiver, newIndent, marginPrefix) { - if (newIndent === void 0) { - newIndent = ""; - } - if (marginPrefix === void 0) { - marginPrefix = "|"; - } - if (!!_.kotlin.text.isBlank_gw00vq$(marginPrefix)) { - var message = "marginPrefix must be non-blank string."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - var lines = _.kotlin.text.lines_gw00vq$($receiver); - lines.size; - var indentAddFunction = _.kotlin.text.getIndentFunction(newIndent); - var lastIndex = _.kotlin.collections.get_lastIndex_a7ptmv$(lines); - var destination = new Kotlin.ArrayList; - var tmp$3; - var index = 0; - tmp$3 = lines.iterator(); - while (tmp$3.hasNext()) { - var item = tmp$3.next(); - var tmp$2; - var index_0 = index++; - var tmp$5, tmp$4; - var tmp$1; - if ((index_0 === 0 || index_0 === lastIndex) && _.kotlin.text.isBlank_gw00vq$(item)) { - tmp$1 = null; - } else { - var indentCutFunction$result; - var firstNonWhitespaceIndex; - indexOfFirst_gwcya$break: { - var tmp$9, tmp$6, tmp$7, tmp$8; - tmp$9 = _.kotlin.text.get_indices_gw00vq$(item), tmp$6 = tmp$9.first, tmp$7 = tmp$9.last, tmp$8 = tmp$9.step; - for (var index_1 = tmp$6;index_1 <= tmp$7;index_1 += tmp$8) { - if (!_.kotlin.text.isWhitespace_myv2d1$(item.charAt(index_1))) { - firstNonWhitespaceIndex = index_1; - break indexOfFirst_gwcya$break; - } - } - firstNonWhitespaceIndex = -1; - } - if (firstNonWhitespaceIndex === -1) { - indentCutFunction$result = null; - } else { - if (_.kotlin.text.startsWith_rh6gah$(item, marginPrefix, firstNonWhitespaceIndex)) { - indentCutFunction$result = item.substring(firstNonWhitespaceIndex + marginPrefix.length); - } else { - indentCutFunction$result = null; - } - } - tmp$1 = (tmp$4 = (tmp$5 = indentCutFunction$result) != null ? indentAddFunction(tmp$5) : null) != null ? tmp$4 : item; - } - (tmp$2 = tmp$1) != null ? destination.add_za3rmp$(tmp$2) : null; - } - return _.kotlin.collections.joinTo_euycuk$(destination, new Kotlin.StringBuilder, "\n").toString(); - }, trimIndent_pdl1w0$:function($receiver) { - return _.kotlin.text.replaceIndent_94jgcu$($receiver, ""); - }, replaceIndent_94jgcu$:function($receiver, newIndent) { - var tmp$0; - if (newIndent === void 0) { - newIndent = ""; - } - var lines = _.kotlin.text.lines_gw00vq$($receiver); - var destination = new Kotlin.ArrayList; - var tmp$3; - tmp$3 = lines.iterator(); - while (tmp$3.hasNext()) { - var element = tmp$3.next(); - if (!_.kotlin.text.isBlank_gw00vq$(element)) { - destination.add_za3rmp$(element); - } - } - var destination_0 = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault(destination, 10)); - var tmp$4; - tmp$4 = destination.iterator(); - while (tmp$4.hasNext()) { - var item = tmp$4.next(); - destination_0.add_za3rmp$(_.kotlin.text.indentWidth(item)); - } - var minCommonIndent = (tmp$0 = _.kotlin.collections.min_349qs3$(destination_0)) != null ? tmp$0 : 0; - lines.size; - var indentAddFunction = _.kotlin.text.getIndentFunction(newIndent); - var lastIndex = _.kotlin.collections.get_lastIndex_a7ptmv$(lines); - var destination_1 = new Kotlin.ArrayList; - var tmp$8; - var index = 0; - tmp$8 = lines.iterator(); - while (tmp$8.hasNext()) { - var item_0 = tmp$8.next(); - var tmp$7; - var index_0 = index++; - var tmp$6, tmp$9; - (tmp$7 = (index_0 === 0 || index_0 === lastIndex) && _.kotlin.text.isBlank_gw00vq$(item_0) ? null : (tmp$9 = (tmp$6 = _.kotlin.text.drop_n7iutu$(item_0, minCommonIndent)) != null ? indentAddFunction(tmp$6) : null) != null ? tmp$9 : item_0) != null ? destination_1.add_za3rmp$(tmp$7) : null; - } - return _.kotlin.collections.joinTo_euycuk$(destination_1, new Kotlin.StringBuilder, "\n").toString(); - }, prependIndent_94jgcu$f:function(closure$indent) { - return function(it) { - if (_.kotlin.text.isBlank_gw00vq$(it)) { - if (it.length < closure$indent.length) { - return closure$indent; - } else { - return it; - } - } else { - return closure$indent + it; - } - }; - }, prependIndent_94jgcu$:function($receiver, indent) { - if (indent === void 0) { - indent = " "; - } - return _.kotlin.sequences.joinToString_mbzd5w$(_.kotlin.sequences.map_mzhnvn$(_.kotlin.text.lineSequence_gw00vq$($receiver), _.kotlin.text.prependIndent_94jgcu$f(indent)), "\n"); - }, indentWidth:function($receiver) { - var it_0; - indexOfFirst_gwcya$break: { - var tmp$4, tmp$1, tmp$2, tmp$3; - tmp$4 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$4.first, tmp$2 = tmp$4.last, tmp$3 = tmp$4.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!_.kotlin.text.isWhitespace_myv2d1$($receiver.charAt(index))) { - it_0 = index; - break indexOfFirst_gwcya$break; - } - } - it_0 = -1; - } - return it_0 === -1 ? $receiver.length : it_0; - }, getIndentFunction$f:function(line) { - return line; - }, getIndentFunction$f_0:function(closure$indent) { - return function(line) { - return closure$indent + line; - }; - }, getIndentFunction:function(indent) { - if (indent.length === 0) { - return _.kotlin.text.getIndentFunction$f; - } else { - return _.kotlin.text.getIndentFunction$f_0(indent); - } - }, reindent:function($receiver, resultSizeEstimate, indentAddFunction, indentCutFunction) { - var lastIndex = _.kotlin.collections.get_lastIndex_a7ptmv$($receiver); - var destination = new Kotlin.ArrayList; - var tmp$3; - var index = 0; - tmp$3 = $receiver.iterator(); - while (tmp$3.hasNext()) { - var item = tmp$3.next(); - var tmp$2; - var index_0 = index++; - var tmp$5, tmp$4; - (tmp$2 = (index_0 === 0 || index_0 === lastIndex) && _.kotlin.text.isBlank_gw00vq$(item) ? null : (tmp$4 = (tmp$5 = indentCutFunction(item)) != null ? indentAddFunction(tmp$5) : null) != null ? tmp$4 : item) != null ? destination.add_za3rmp$(tmp$2) : null; - } - return _.kotlin.collections.joinTo_euycuk$(destination, new Kotlin.StringBuilder, "\n").toString(); - }, buildString_bb10bd$:Kotlin.defineInlineFunction("stdlib.kotlin.text.buildString_bb10bd$", function(builderAction) { - var $receiver = new Kotlin.StringBuilder; - builderAction.call($receiver); - return $receiver.toString(); - }), append_rjuq1o$:function($receiver, value) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = value, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - $receiver.append(item); - } - return $receiver; - }, append_7lvk3c$:function($receiver, value) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = value, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - $receiver.append(item); - } - return $receiver; - }, append_j3ibnd$:function($receiver, value) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = value, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - $receiver.append(item); - } - return $receiver; - }, trim_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trim_gwcya$", function($receiver, predicate) { - var startIndex = 0; - var endIndex = $receiver.length - 1; - var startFound = false; - while (startIndex <= endIndex) { - var index = !startFound ? startIndex : endIndex; - var match = predicate($receiver.charAt(index)); - if (!startFound) { - if (!match) { - startFound = true; - } else { - startIndex += 1; - } - } else { - if (!match) { - break; - } else { - endIndex -= 1; - } - } - } - return $receiver.substring(startIndex, endIndex + 1); - }), trim_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trim_ggikb8$", function($receiver, predicate) { - var tmp$0; - var startIndex = 0; - var endIndex = $receiver.length - 1; - var startFound = false; - while (startIndex <= endIndex) { - var index = !startFound ? startIndex : endIndex; - var match = predicate($receiver.charAt(index)); - if (!startFound) { - if (!match) { - startFound = true; - } else { - startIndex += 1; - } - } else { - if (!match) { - break; - } else { - endIndex -= 1; - } - } - } - return $receiver.substring(startIndex, endIndex + 1).toString(); - }), trimStart_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trimStart_gwcya$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(index, $receiver.length); - } - } - return ""; - }), trimStart_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trimStart_ggikb8$", function($receiver, predicate) { - var tmp$0; - var trimStart_gwcya$result; - trimStart_gwcya$break: { - var tmp$4, tmp$1, tmp$2, tmp$3; - tmp$4 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$4.first, tmp$2 = tmp$4.last, tmp$3 = tmp$4.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!predicate($receiver.charAt(index))) { - trimStart_gwcya$result = $receiver.substring(index, $receiver.length); - break trimStart_gwcya$break; - } - } - trimStart_gwcya$result = ""; - } - return trimStart_gwcya$result.toString(); - }), trimEnd_gwcya$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trimEnd_gwcya$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver.charAt(index))) { - return $receiver.substring(0, index + 1).toString(); - } - } - return ""; - }), trimEnd_ggikb8$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trimEnd_ggikb8$", function($receiver, predicate) { - var tmp$0; - var trimEnd_gwcya$result; - trimEnd_gwcya$break: { - var tmp$1; - tmp$1 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$1.hasNext()) { - var index = tmp$1.next(); - if (!predicate($receiver.charAt(index))) { - trimEnd_gwcya$result = $receiver.substring(0, index + 1).toString(); - break trimEnd_gwcya$break; - } - } - trimEnd_gwcya$result = ""; - } - return trimEnd_gwcya$result.toString(); - }), trim_g0p4tc$:function($receiver, chars) { - var startIndex = 0; - var endIndex = $receiver.length - 1; - var startFound = false; - while (startIndex <= endIndex) { - var index = !startFound ? startIndex : endIndex; - var match = _.kotlin.collections.contains_q79yhh$(chars, $receiver.charAt(index)); - if (!startFound) { - if (!match) { - startFound = true; - } else { - startIndex += 1; - } - } else { - if (!match) { - break; - } else { - endIndex -= 1; - } - } - } - return $receiver.substring(startIndex, endIndex + 1); - }, trim_1hgcu2$:function($receiver, chars) { - var tmp$0; - var startIndex = 0; - var endIndex = $receiver.length - 1; - var startFound = false; - while (startIndex <= endIndex) { - var index = !startFound ? startIndex : endIndex; - var match = _.kotlin.collections.contains_q79yhh$(chars, $receiver.charAt(index)); - if (!startFound) { - if (!match) { - startFound = true; - } else { - startIndex += 1; - } - } else { - if (!match) { - break; - } else { - endIndex -= 1; - } - } - } - return $receiver.substring(startIndex, endIndex + 1).toString(); - }, trimStart_g0p4tc$:function($receiver, chars) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!_.kotlin.collections.contains_q79yhh$(chars, $receiver.charAt(index))) { - return $receiver.substring(index, $receiver.length); - } - } - return ""; - }, trimStart_1hgcu2$:function($receiver, chars) { - var tmp$0; - var trimStart_gwcya$result; - trimStart_gwcya$break: { - var tmp$4, tmp$1, tmp$2, tmp$3; - tmp$4 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$4.first, tmp$2 = tmp$4.last, tmp$3 = tmp$4.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!_.kotlin.collections.contains_q79yhh$(chars, $receiver.charAt(index))) { - trimStart_gwcya$result = $receiver.substring(index, $receiver.length); - break trimStart_gwcya$break; - } - } - trimStart_gwcya$result = ""; - } - return trimStart_gwcya$result.toString(); - }, trimEnd_g0p4tc$:function($receiver, chars) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!_.kotlin.collections.contains_q79yhh$(chars, $receiver.charAt(index))) { - return $receiver.substring(0, index + 1).toString(); - } - } - return ""; - }, trimEnd_1hgcu2$:function($receiver, chars) { - var tmp$0; - var trimEnd_gwcya$result; - trimEnd_gwcya$break: { - var tmp$1; - tmp$1 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$1.hasNext()) { - var index = tmp$1.next(); - if (!_.kotlin.collections.contains_q79yhh$(chars, $receiver.charAt(index))) { - trimEnd_gwcya$result = $receiver.substring(0, index + 1).toString(); - break trimEnd_gwcya$break; - } - } - trimEnd_gwcya$result = ""; - } - return trimEnd_gwcya$result.toString(); - }, trim_gw00vq$:function($receiver) { - var startIndex = 0; - var endIndex = $receiver.length - 1; - var startFound = false; - while (startIndex <= endIndex) { - var index = !startFound ? startIndex : endIndex; - var match = _.kotlin.text.isWhitespace_myv2d1$($receiver.charAt(index)); - if (!startFound) { - if (!match) { - startFound = true; - } else { - startIndex += 1; - } - } else { - if (!match) { - break; - } else { - endIndex -= 1; - } - } - } - return $receiver.substring(startIndex, endIndex + 1); - }, trim_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trim_pdl1w0$", function($receiver) { - var tmp$0; - return _.kotlin.text.trim_gw00vq$($receiver).toString(); - }), trimStart_gw00vq$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.text.get_indices_gw00vq$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (!_.kotlin.text.isWhitespace_myv2d1$($receiver.charAt(index))) { - return $receiver.substring(index, $receiver.length); - } - } - return ""; - }, trimStart_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trimStart_pdl1w0$", function($receiver) { - var tmp$0; - return _.kotlin.text.trimStart_gw00vq$($receiver).toString(); - }), trimEnd_gw00vq$:function($receiver) { - var tmp$0; - tmp$0 = _.kotlin.ranges.reversed_zf1xzd$(_.kotlin.text.get_indices_gw00vq$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!_.kotlin.text.isWhitespace_myv2d1$($receiver.charAt(index))) { - return $receiver.substring(0, index + 1).toString(); - } - } - return ""; - }, trimEnd_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.trimEnd_pdl1w0$", function($receiver) { - var tmp$0; - return _.kotlin.text.trimEnd_gw00vq$($receiver).toString(); - }), padStart_dz660z$:function($receiver, length, padChar) { - var tmp$0; - if (padChar === void 0) { - padChar = " "; - } - if (length < 0) { - throw new Kotlin.IllegalArgumentException("Desired length " + length + " is less than zero."); - } - if (length <= $receiver.length) { - return $receiver.substring(0, $receiver.length); - } - var sb = new Kotlin.StringBuilder; - tmp$0 = length - $receiver.length; - for (var i = 1;i <= tmp$0;i++) { - sb.append(padChar); - } - sb.append($receiver); - return sb; - }, padStart_b68f8p$:function($receiver, length, padChar) { - var tmp$0; - if (padChar === void 0) { - padChar = " "; - } - return _.kotlin.text.padStart_dz660z$($receiver, length, padChar).toString(); - }, padEnd_dz660z$:function($receiver, length, padChar) { - var tmp$0; - if (padChar === void 0) { - padChar = " "; - } - if (length < 0) { - throw new Kotlin.IllegalArgumentException("Desired length " + length + " is less than zero."); - } - if (length <= $receiver.length) { - return $receiver.substring(0, $receiver.length); - } - var sb = new Kotlin.StringBuilder; - sb.append($receiver); - tmp$0 = length - $receiver.length; - for (var i = 1;i <= tmp$0;i++) { - sb.append(padChar); - } - return sb; - }, padEnd_b68f8p$:function($receiver, length, padChar) { - var tmp$0; - if (padChar === void 0) { - padChar = " "; - } - return _.kotlin.text.padEnd_dz660z$($receiver, length, padChar).toString(); - }, isNullOrEmpty_gw00vq$:Kotlin.defineInlineFunction("stdlib.kotlin.text.isNullOrEmpty_gw00vq$", function($receiver) { - return $receiver == null || $receiver.length === 0; - }), isEmpty_gw00vq$:Kotlin.defineInlineFunction("stdlib.kotlin.text.isEmpty_gw00vq$", function($receiver) { - return $receiver.length === 0; - }), isNotEmpty_gw00vq$:Kotlin.defineInlineFunction("stdlib.kotlin.text.isNotEmpty_gw00vq$", function($receiver) { - return $receiver.length > 0; - }), isNotBlank_gw00vq$:Kotlin.defineInlineFunction("stdlib.kotlin.text.isNotBlank_gw00vq$", function($receiver) { - return!_.kotlin.text.isBlank_gw00vq$($receiver); - }), isNullOrBlank_gw00vq$:Kotlin.defineInlineFunction("stdlib.kotlin.text.isNullOrBlank_gw00vq$", function($receiver) { - return $receiver == null || _.kotlin.text.isBlank_gw00vq$($receiver); - }), iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.CharIterator]; - }, function $fun(this$iterator_0) { - this.this$iterator_0 = this$iterator_0; - $fun.baseInitializer.call(this); - this.index_1xj8pz$ = 0; - }, {nextChar:function() { - return this.this$iterator_0.charAt(this.index_1xj8pz$++); - }, hasNext:function() { - return this.index_1xj8pz$ < this.this$iterator_0.length; - }}, {}), iterator_gw00vq$:function($receiver) { - return new _.kotlin.text.iterator$f($receiver); - }, orEmpty_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.orEmpty_pdl1w0$", function($receiver) { - return $receiver != null ? $receiver : ""; - }), get_indices_gw00vq$:{value:function($receiver) { - return new Kotlin.NumberRange(0, $receiver.length - 1); - }}, get_lastIndex_gw00vq$:{value:function($receiver) { - return $receiver.length - 1; - }}, hasSurrogatePairAt_kljjvw$:function($receiver, index) { - return(new Kotlin.NumberRange(0, $receiver.length - 2)).contains_htax2k$(index) && (_.kotlin.text.isHighSurrogate_myv2d1$($receiver.charAt(index)) && _.kotlin.text.isLowSurrogate_myv2d1$($receiver.charAt(index + 1))); - }, substring_590b93$:function($receiver, range) { - return $receiver.substring(range.start, range.endInclusive + 1); - }, subSequence_2g2kgt$:function($receiver, range) { - return $receiver.substring(range.start, range.endInclusive + 1); - }, subSequence_78fvzw$:Kotlin.defineInlineFunction("stdlib.kotlin.text.subSequence_78fvzw$", function($receiver, start, end) { - return $receiver.substring(start, end); - }), substring_7bp3tu$:Kotlin.defineInlineFunction("stdlib.kotlin.text.substring_7bp3tu$", function($receiver, startIndex, endIndex) { - if (endIndex === void 0) { - endIndex = $receiver.length; - } - return $receiver.substring(startIndex, endIndex).toString(); - }), substring_2g2kgt$:function($receiver, range) { - return $receiver.substring(range.start, range.endInclusive + 1).toString(); - }, substringBefore_7uhrl1$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_ilfvta$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(0, index); - }, substringBefore_ex0kps$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_30chhv$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(0, index); - }, substringAfter_7uhrl1$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_ilfvta$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(index + 1, $receiver.length); - }, substringAfter_ex0kps$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_30chhv$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(index + delimiter.length, $receiver.length); - }, substringBeforeLast_7uhrl1$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_ilfvta$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(0, index); - }, substringBeforeLast_ex0kps$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_30chhv$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(0, index); - }, substringAfterLast_7uhrl1$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_ilfvta$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(index + 1, $receiver.length); - }, substringAfterLast_ex0kps$:function($receiver, delimiter, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_30chhv$($receiver, delimiter); - return index === -1 ? missingDelimiterValue : $receiver.substring(index + delimiter.length, $receiver.length); - }, replaceRange_r7eg9y$:function($receiver, startIndex, endIndex, replacement) { - if (endIndex < startIndex) { - throw new Kotlin.IndexOutOfBoundsException("End index (" + endIndex + ") is less than start index (" + startIndex + ")."); - } - var sb = new Kotlin.StringBuilder; - sb.append($receiver, 0, startIndex); - sb.append(replacement); - sb.append($receiver, endIndex, $receiver.length); - return sb; - }, replaceRange_tb247g$:Kotlin.defineInlineFunction("stdlib.kotlin.text.replaceRange_tb247g$", function($receiver, startIndex, endIndex, replacement) { - var tmp$0; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, startIndex, endIndex, replacement).toString(); - }), replaceRange_jrbvad$:function($receiver, range, replacement) { - return _.kotlin.text.replaceRange_r7eg9y$($receiver, range.start, range.endInclusive + 1, replacement); - }, replaceRange_dvlf5r$:Kotlin.defineInlineFunction("stdlib.kotlin.text.replaceRange_dvlf5r$", function($receiver, range, replacement) { - var tmp$0; - return _.kotlin.text.replaceRange_jrbvad$($receiver, range, replacement).toString(); - }), removeRange_7bp3tu$:function($receiver, startIndex, endIndex) { - if (endIndex < startIndex) { - throw new Kotlin.IndexOutOfBoundsException("End index (" + endIndex + ") is less than start index (" + startIndex + ")."); - } - if (endIndex === startIndex) { - return $receiver.substring(0, $receiver.length); - } - var sb = new Kotlin.StringBuilder; - sb.append($receiver, 0, startIndex); - sb.append($receiver, endIndex, $receiver.length); - return sb; - }, removeRange_78fvzw$:Kotlin.defineInlineFunction("stdlib.kotlin.text.removeRange_78fvzw$", function($receiver, startIndex, endIndex) { - var tmp$0; - return _.kotlin.text.removeRange_7bp3tu$($receiver, startIndex, endIndex).toString(); - }), removeRange_2g2kgt$:function($receiver, range) { - return _.kotlin.text.removeRange_7bp3tu$($receiver, range.start, range.endInclusive + 1); - }, removeRange_590b93$:Kotlin.defineInlineFunction("stdlib.kotlin.text.removeRange_590b93$", function($receiver, range) { - var tmp$0; - return _.kotlin.text.removeRange_2g2kgt$($receiver, range).toString(); - }), removePrefix_4ewbza$:function($receiver, prefix) { - if (_.kotlin.text.startsWith_kzp0od$($receiver, prefix)) { - return $receiver.substring(prefix.length, $receiver.length); - } - return $receiver.substring(0, $receiver.length); - }, removePrefix_a14n4c$:function($receiver, prefix) { - if (_.kotlin.text.startsWith_kzp0od$($receiver, prefix)) { - return $receiver.substring(prefix.length); - } - return $receiver; - }, removeSuffix_4ewbza$:function($receiver, suffix) { - if (_.kotlin.text.endsWith_kzp0od$($receiver, suffix)) { - return $receiver.substring(0, $receiver.length - suffix.length); - } - return $receiver.substring(0, $receiver.length); - }, removeSuffix_a14n4c$:function($receiver, suffix) { - if (_.kotlin.text.endsWith_kzp0od$($receiver, suffix)) { - return $receiver.substring(0, $receiver.length - suffix.length); - } - return $receiver; - }, removeSurrounding_9b5scy$:function($receiver, prefix, suffix) { - if ($receiver.length >= prefix.length + suffix.length && (_.kotlin.text.startsWith_kzp0od$($receiver, prefix) && _.kotlin.text.endsWith_kzp0od$($receiver, suffix))) { - return $receiver.substring(prefix.length, $receiver.length - suffix.length); - } - return $receiver.substring(0, $receiver.length); - }, removeSurrounding_f5o6fo$:function($receiver, prefix, suffix) { - if ($receiver.length >= prefix.length + suffix.length && (_.kotlin.text.startsWith_kzp0od$($receiver, prefix) && _.kotlin.text.endsWith_kzp0od$($receiver, suffix))) { - return $receiver.substring(prefix.length, $receiver.length - suffix.length); - } - return $receiver; - }, removeSurrounding_4ewbza$:function($receiver, delimiter) { - return _.kotlin.text.removeSurrounding_9b5scy$($receiver, delimiter, delimiter); - }, removeSurrounding_a14n4c$:function($receiver, delimiter) { - return _.kotlin.text.removeSurrounding_f5o6fo$($receiver, delimiter, delimiter); - }, replaceBefore_tzm4on$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_ilfvta$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, 0, index, replacement).toString(); - } - }, replaceBefore_s3e0ge$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_30chhv$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, 0, index, replacement).toString(); - } - }, replaceAfter_tzm4on$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_ilfvta$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, index + 1, $receiver.length, replacement).toString(); - } - }, replaceAfter_s3e0ge$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.indexOf_30chhv$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, index + delimiter.length, $receiver.length, replacement).toString(); - } - }, replaceAfterLast_s3e0ge$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_30chhv$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, index + delimiter.length, $receiver.length, replacement).toString(); - } - }, replaceAfterLast_tzm4on$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_ilfvta$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, index + 1, $receiver.length, replacement).toString(); - } - }, replaceBeforeLast_tzm4on$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_ilfvta$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, 0, index, replacement).toString(); - } - }, replaceBeforeLast_s3e0ge$:function($receiver, delimiter, replacement, missingDelimiterValue) { - if (missingDelimiterValue === void 0) { - missingDelimiterValue = $receiver; - } - var index = _.kotlin.text.lastIndexOf_30chhv$($receiver, delimiter); - if (index === -1) { - return missingDelimiterValue; - } else { - var tmp$1; - return _.kotlin.text.replaceRange_r7eg9y$($receiver, 0, index, replacement).toString(); - } - }, replace_8h3bgl$:Kotlin.defineInlineFunction("stdlib.kotlin.text.replace_8h3bgl$", function($receiver, regex, replacement) { - return regex.replace_x2uqeu$($receiver, replacement); - }), replace_c95is1$:Kotlin.defineInlineFunction("stdlib.kotlin.text.replace_c95is1$", function($receiver, regex, transform) { - var match = regex.find_905azu$($receiver); - if (match == null) { - return $receiver.toString(); - } - var lastStart = 0; - var length = $receiver.length; - var sb = new Kotlin.StringBuilder; - do { - var foundMatch = match != null ? match : Kotlin.throwNPE(); - sb.append($receiver, lastStart, foundMatch.range.start); - sb.append(transform(foundMatch)); - lastStart = foundMatch.range.endInclusive + 1; - match = foundMatch.next(); - } while (lastStart < length && match != null); - if (lastStart < length) { - sb.append($receiver, lastStart, length); - } - return sb.toString(); - }), replaceFirst_8h3bgl$:Kotlin.defineInlineFunction("stdlib.kotlin.text.replaceFirst_8h3bgl$", function($receiver, regex, replacement) { - return regex.replaceFirst_x2uqeu$($receiver, replacement); - }), matches_pg0hzr$:Kotlin.defineInlineFunction("stdlib.kotlin.text.matches_pg0hzr$", function($receiver, regex) { - return regex.matches_6bul2c$($receiver); - }), regionMatchesImpl:function($receiver, thisOffset, other, otherOffset, length, ignoreCase) { - var tmp$0; - if (otherOffset < 0 || (thisOffset < 0 || (thisOffset > $receiver.length - length || otherOffset > other.length - length))) { - return false; - } - tmp$0 = length - 1; - for (var index = 0;index <= tmp$0;index++) { - if (!_.kotlin.text.equals_bapbyp$($receiver.charAt(thisOffset + index), other.charAt(otherOffset + index), ignoreCase)) { - return false; - } - } - return true; - }, startsWith_cjsvxq$:function($receiver, char, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.length > 0 && _.kotlin.text.equals_bapbyp$($receiver.charAt(0), char, ignoreCase); - }, endsWith_cjsvxq$:function($receiver, char, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return $receiver.length > 0 && _.kotlin.text.equals_bapbyp$($receiver.charAt(_.kotlin.text.get_lastIndex_gw00vq$($receiver)), char, ignoreCase); - }, startsWith_kzp0od$:function($receiver, prefix, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (!ignoreCase && (typeof $receiver === "string" && typeof prefix === "string")) { - return _.kotlin.text.startsWith_41xvrb$($receiver, prefix); - } else { - return _.kotlin.text.regionMatchesImpl($receiver, 0, prefix, 0, prefix.length, ignoreCase); - } - }, startsWith_q2992l$:function($receiver, prefix, startIndex, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (!ignoreCase && (typeof $receiver === "string" && typeof prefix === "string")) { - return _.kotlin.text.startsWith_rh6gah$($receiver, prefix, startIndex); - } else { - return _.kotlin.text.regionMatchesImpl($receiver, startIndex, prefix, 0, prefix.length, ignoreCase); - } - }, endsWith_kzp0od$:function($receiver, suffix, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (!ignoreCase && (typeof $receiver === "string" && typeof suffix === "string")) { - return _.kotlin.text.endsWith_41xvrb$($receiver, suffix); - } else { - return _.kotlin.text.regionMatchesImpl($receiver, $receiver.length - suffix.length, suffix, 0, suffix.length, ignoreCase); - } - }, commonPrefixWith_kzp0od$:function($receiver, other, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - var shortestLength = Math.min($receiver.length, other.length); - var i = 0; - while (i < shortestLength && _.kotlin.text.equals_bapbyp$($receiver.charAt(i), other.charAt(i), ignoreCase)) { - i++; - } - if (_.kotlin.text.hasSurrogatePairAt_kljjvw$($receiver, i - 1) || _.kotlin.text.hasSurrogatePairAt_kljjvw$(other, i - 1)) { - i--; - } - return $receiver.substring(0, i).toString(); - }, commonSuffixWith_kzp0od$:function($receiver, other, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - var thisLength = $receiver.length; - var otherLength = other.length; - var shortestLength = Math.min(thisLength, otherLength); - var i = 0; - while (i < shortestLength && _.kotlin.text.equals_bapbyp$($receiver.charAt(thisLength - i - 1), other.charAt(otherLength - i - 1), ignoreCase)) { - i++; - } - if (_.kotlin.text.hasSurrogatePairAt_kljjvw$($receiver, thisLength - i - 1) || _.kotlin.text.hasSurrogatePairAt_kljjvw$(other, otherLength - i - 1)) { - i--; - } - return $receiver.substring(thisLength - i, thisLength).toString(); - }, findAnyOf:function($receiver, chars, startIndex, ignoreCase, last) { - var index; - var matchingCharIndex; - var tmp$0; - if (!ignoreCase && (chars.length === 1 && typeof $receiver === "string")) { - var char = _.kotlin.collections.single_355nu0$(chars); - index = !last ? $receiver.indexOf(char.toString(), startIndex) : $receiver.lastIndexOf(char.toString(), startIndex); - return index < 0 ? null : _.kotlin.to_l1ob02$(index, char); - } - var indices = !last ? new Kotlin.NumberRange(Math.max(startIndex, 0), _.kotlin.text.get_lastIndex_gw00vq$($receiver)) : _.kotlin.ranges.downTo_rksjo2$(Math.min(startIndex, _.kotlin.text.get_lastIndex_gw00vq$($receiver)), 0); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index_0 = tmp$0.next(); - var charAtIndex = $receiver.charAt(index_0); - indexOfFirst_mf0bwc$break: { - var tmp$5, tmp$2, tmp$3, tmp$4; - tmp$5 = _.kotlin.collections.get_indices_355nu0$(chars), tmp$2 = tmp$5.first, tmp$3 = tmp$5.last, tmp$4 = tmp$5.step; - for (var index_1 = tmp$2;index_1 <= tmp$3;index_1 += tmp$4) { - if (_.kotlin.text.equals_bapbyp$(chars[index_1], charAtIndex, ignoreCase)) { - matchingCharIndex = index_1; - break indexOfFirst_mf0bwc$break; - } - } - matchingCharIndex = -1; - } - if (matchingCharIndex >= 0) { - return _.kotlin.to_l1ob02$(index_0, chars[matchingCharIndex]); - } - } - return null; - }, indexOfAny_cfilrb$:function($receiver, chars, startIndex, ignoreCase) { - var tmp$0, tmp$1; - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return(tmp$1 = (tmp$0 = _.kotlin.text.findAnyOf($receiver, chars, startIndex, ignoreCase, false)) != null ? tmp$0.first : null) != null ? tmp$1 : -1; - }, lastIndexOfAny_cfilrb$:function($receiver, chars, startIndex, ignoreCase) { - var tmp$0, tmp$1; - if (startIndex === void 0) { - startIndex = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return(tmp$1 = (tmp$0 = _.kotlin.text.findAnyOf($receiver, chars, startIndex, ignoreCase, true)) != null ? tmp$0.first : null) != null ? tmp$1 : -1; - }, indexOf_1:function($receiver, other, startIndex, endIndex, ignoreCase, last) { - var tmp$0, tmp$1; - if (last === void 0) { - last = false; - } - var indices = !last ? new Kotlin.NumberRange(_.kotlin.ranges.coerceAtLeast_rksjo2$(startIndex, 0), _.kotlin.ranges.coerceAtMost_rksjo2$(endIndex, $receiver.length)) : _.kotlin.ranges.downTo_rksjo2$(_.kotlin.ranges.coerceAtMost_rksjo2$(startIndex, _.kotlin.text.get_lastIndex_gw00vq$($receiver)), _.kotlin.ranges.coerceAtLeast_rksjo2$(endIndex, 0)); - if (typeof $receiver === "string" && typeof other === "string") { - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (_.kotlin.text.regionMatches_qb0ndp$(other, 0, $receiver, index, other.length, ignoreCase)) { - return index; - } - } - } else { - tmp$1 = indices.iterator(); - while (tmp$1.hasNext()) { - var index_0 = tmp$1.next(); - if (_.kotlin.text.regionMatchesImpl(other, 0, $receiver, index_0, other.length, ignoreCase)) { - return index_0; - } - } - } - return-1; - }, findAnyOf_1:function($receiver, strings, startIndex, ignoreCase, last) { - var matchingString; - var matchingString_0; - var tmp$0, tmp$1; - if (!ignoreCase && strings.size === 1) { - var string = _.kotlin.collections.single_q5oq31$(strings); - var index = !last ? _.kotlin.text.indexOf_30chhv$($receiver, string, startIndex) : _.kotlin.text.lastIndexOf_30chhv$($receiver, string, startIndex); - return index < 0 ? null : _.kotlin.to_l1ob02$(index, string); - } - var indices = !last ? new Kotlin.NumberRange(_.kotlin.ranges.coerceAtLeast_rksjo2$(startIndex, 0), $receiver.length) : _.kotlin.ranges.downTo_rksjo2$(_.kotlin.ranges.coerceAtMost_rksjo2$(startIndex, _.kotlin.text.get_lastIndex_gw00vq$($receiver)), 0); - if (typeof $receiver === "string") { - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index_0 = tmp$0.next(); - firstOrNull_udlcbx$break: { - var tmp$2; - tmp$2 = strings.iterator(); - while (tmp$2.hasNext()) { - var element = tmp$2.next(); - if (_.kotlin.text.regionMatches_qb0ndp$(element, 0, $receiver, index_0, element.length, ignoreCase)) { - matchingString = element; - break firstOrNull_udlcbx$break; - } - } - matchingString = null; - } - if (matchingString != null) { - return _.kotlin.to_l1ob02$(index_0, matchingString); - } - } - } else { - tmp$1 = indices.iterator(); - while (tmp$1.hasNext()) { - var index_1 = tmp$1.next(); - firstOrNull_udlcbx$break_0: { - var tmp$3; - tmp$3 = strings.iterator(); - while (tmp$3.hasNext()) { - var element_0 = tmp$3.next(); - if (_.kotlin.text.regionMatchesImpl(element_0, 0, $receiver, index_1, element_0.length, ignoreCase)) { - matchingString_0 = element_0; - break firstOrNull_udlcbx$break_0; - } - } - matchingString_0 = null; - } - if (matchingString_0 != null) { - return _.kotlin.to_l1ob02$(index_1, matchingString_0); - } - } - } - return null; - }, findAnyOf_o41fp7$:function($receiver, strings, startIndex, ignoreCase) { - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return _.kotlin.text.findAnyOf_1($receiver, strings, startIndex, ignoreCase, false); - }, findLastAnyOf_o41fp7$:function($receiver, strings, startIndex, ignoreCase) { - if (startIndex === void 0) { - startIndex = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return _.kotlin.text.findAnyOf_1($receiver, strings, startIndex, ignoreCase, true); - }, indexOfAny_o41fp7$:function($receiver, strings, startIndex, ignoreCase) { - var tmp$0, tmp$1; - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return(tmp$1 = (tmp$0 = _.kotlin.text.findAnyOf_1($receiver, strings, startIndex, ignoreCase, false)) != null ? tmp$0.first : null) != null ? tmp$1 : -1; - }, lastIndexOfAny_o41fp7$:function($receiver, strings, startIndex, ignoreCase) { - var tmp$0, tmp$1; - if (startIndex === void 0) { - startIndex = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return(tmp$1 = (tmp$0 = _.kotlin.text.findAnyOf_1($receiver, strings, startIndex, ignoreCase, true)) != null ? tmp$0.first : null) != null ? tmp$1 : -1; - }, indexOf_ilfvta$:function($receiver, char, startIndex, ignoreCase) { - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return ignoreCase || !(typeof $receiver === "string") ? _.kotlin.text.indexOfAny_cfilrb$($receiver, [char], startIndex, ignoreCase) : $receiver.indexOf(char.toString(), startIndex); - }, indexOf_30chhv$:function($receiver, string, startIndex, ignoreCase) { - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return ignoreCase || !(typeof $receiver === "string") ? _.kotlin.text.indexOf_1($receiver, string, startIndex, $receiver.length, ignoreCase) : $receiver.indexOf(string, startIndex); - }, lastIndexOf_ilfvta$:function($receiver, char, startIndex, ignoreCase) { - if (startIndex === void 0) { - startIndex = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return ignoreCase || !(typeof $receiver === "string") ? _.kotlin.text.lastIndexOfAny_cfilrb$($receiver, [char], startIndex, ignoreCase) : $receiver.lastIndexOf(char.toString(), startIndex); - }, lastIndexOf_30chhv$:function($receiver, string, startIndex, ignoreCase) { - if (startIndex === void 0) { - startIndex = _.kotlin.text.get_lastIndex_gw00vq$($receiver); - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - return ignoreCase || !(typeof $receiver === "string") ? _.kotlin.text.indexOf_1($receiver, string, startIndex, 0, ignoreCase, true) : $receiver.lastIndexOf(string, startIndex); - }, contains_kzp0od$:function($receiver, other, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return typeof other === "string" ? _.kotlin.text.indexOf_30chhv$($receiver, other, void 0, ignoreCase) >= 0 : _.kotlin.text.indexOf_1($receiver, other, 0, $receiver.length, ignoreCase) >= 0; - }, contains_cjsvxq$:function($receiver, char, ignoreCase) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - return _.kotlin.text.indexOf_ilfvta$($receiver, char, void 0, ignoreCase) >= 0; - }, contains_pg0hzr$:Kotlin.defineInlineFunction("stdlib.kotlin.text.contains_pg0hzr$", function($receiver, regex) { - return regex.containsMatchIn_6bul2c$($receiver); - }), DelimitedRangesSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(input, startIndex, limit, getNextMatch) { - this.input_furd7s$ = input; - this.startIndex_82cxqa$ = startIndex; - this.limit_ft78vr$ = limit; - this.getNextMatch_1m429e$ = getNextMatch; - }, {iterator:function() { - return new _.kotlin.text.DelimitedRangesSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$DelimitedRangesSequence) { - this.this$DelimitedRangesSequence_0 = this$DelimitedRangesSequence; - this.nextState = -1; - this.currentStartIndex = Math.min(Math.max(this$DelimitedRangesSequence.startIndex_82cxqa$, 0), this$DelimitedRangesSequence.input_furd7s$.length); - this.nextSearchIndex = this.currentStartIndex; - this.nextItem = null; - this.counter = 0; - }, {calcNext:function() { - if (this.nextSearchIndex < 0) { - this.nextState = 0; - this.nextItem = null; - } else { - if (this.this$DelimitedRangesSequence_0.limit_ft78vr$ > 0 && ++this.counter >= this.this$DelimitedRangesSequence_0.limit_ft78vr$ || this.nextSearchIndex > this.this$DelimitedRangesSequence_0.input_furd7s$.length) { - this.nextItem = new Kotlin.NumberRange(this.currentStartIndex, _.kotlin.text.get_lastIndex_gw00vq$(this.this$DelimitedRangesSequence_0.input_furd7s$)); - this.nextSearchIndex = -1; - } else { - var match = this.this$DelimitedRangesSequence_0.getNextMatch_1m429e$.call(this.this$DelimitedRangesSequence_0.input_furd7s$, this.nextSearchIndex); - if (match == null) { - this.nextItem = new Kotlin.NumberRange(this.currentStartIndex, _.kotlin.text.get_lastIndex_gw00vq$(this.this$DelimitedRangesSequence_0.input_furd7s$)); - this.nextSearchIndex = -1; - } else { - var tmp$0 = match, index = tmp$0.component1(), length = tmp$0.component2(); - this.nextItem = new Kotlin.NumberRange(this.currentStartIndex, index - 1); - this.currentStartIndex = index + length; - this.nextSearchIndex = this.currentStartIndex + (length === 0 ? 1 : 0); - } - } - this.nextState = 1; - } - }, next:function() { - var tmp$0; - if (this.nextState === -1) { - this.calcNext(); - } - if (this.nextState === 0) { - throw new Kotlin.NoSuchElementException; - } - var result = Kotlin.isType(tmp$0 = this.nextItem, Kotlin.NumberRange) ? tmp$0 : Kotlin.throwCCE(); - this.nextItem = null; - this.nextState = -1; - return result; - }, hasNext:function() { - if (this.nextState === -1) { - this.calcNext(); - } - return this.nextState === 1; - }}, {})}), rangesDelimitedBy_1$f_0:function(closure$delimiters, closure$ignoreCase) { - return function(startIndex) { - var tmp$0; - return(tmp$0 = _.kotlin.text.findAnyOf(this, closure$delimiters, startIndex, closure$ignoreCase, false)) != null ? _.kotlin.to_l1ob02$(tmp$0.first, 1) : null; - }; - }, rangesDelimitedBy_1:function($receiver, delimiters, startIndex, ignoreCase, limit) { - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (limit === void 0) { - limit = 0; - } - if (!(limit >= 0)) { - var message = "Limit must be non-negative, but was " + limit + "."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return new _.kotlin.text.DelimitedRangesSequence($receiver, startIndex, limit, _.kotlin.text.rangesDelimitedBy_1$f_0(delimiters, ignoreCase)); - }, rangesDelimitedBy$f_0:function(closure$delimitersList, closure$ignoreCase) { - return function(startIndex) { - var tmp$0; - return(tmp$0 = _.kotlin.text.findAnyOf_1(this, closure$delimitersList, startIndex, closure$ignoreCase, false)) != null ? _.kotlin.to_l1ob02$(tmp$0.first, tmp$0.second.length) : null; - }; - }, rangesDelimitedBy:function($receiver, delimiters, startIndex, ignoreCase, limit) { - if (startIndex === void 0) { - startIndex = 0; - } - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (limit === void 0) { - limit = 0; - } - if (!(limit >= 0)) { - var message = "Limit must be non-negative, but was " + limit + "."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - var delimitersList = _.kotlin.collections.asList_eg9ybj$(delimiters); - return new _.kotlin.text.DelimitedRangesSequence($receiver, startIndex, limit, _.kotlin.text.rangesDelimitedBy$f_0(delimitersList, ignoreCase)); - }, splitToSequence_l2gz7$f:function(this$splitToSequence) { - return function(it) { - return _.kotlin.text.substring_2g2kgt$(this$splitToSequence, it); - }; - }, splitToSequence_l2gz7$:function($receiver, delimiters, ignoreCase, limit) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (limit === void 0) { - limit = 0; - } - return _.kotlin.sequences.map_mzhnvn$(_.kotlin.text.rangesDelimitedBy($receiver, delimiters, void 0, ignoreCase, limit), _.kotlin.text.splitToSequence_l2gz7$f($receiver)); - }, split_l2gz7$:function($receiver, delimiters, ignoreCase, limit) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (limit === void 0) { - limit = 0; - } - var $receiver_0 = _.kotlin.sequences.asIterable_uya9q7$(_.kotlin.text.rangesDelimitedBy($receiver, delimiters, void 0, ignoreCase, limit)); - var destination = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault($receiver_0, 10)); - var tmp$0; - tmp$0 = $receiver_0.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(_.kotlin.text.substring_2g2kgt$($receiver, item)); - } - return destination; - }, splitToSequence_rhc0qh$f:function(this$splitToSequence) { - return function(it) { - return _.kotlin.text.substring_2g2kgt$(this$splitToSequence, it); - }; - }, splitToSequence_rhc0qh$:function($receiver, delimiters, ignoreCase, limit) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (limit === void 0) { - limit = 0; - } - return _.kotlin.sequences.map_mzhnvn$(_.kotlin.text.rangesDelimitedBy_1($receiver, delimiters, void 0, ignoreCase, limit), _.kotlin.text.splitToSequence_rhc0qh$f($receiver)); - }, split_rhc0qh$:function($receiver, delimiters, ignoreCase, limit) { - if (ignoreCase === void 0) { - ignoreCase = false; - } - if (limit === void 0) { - limit = 0; - } - var $receiver_0 = _.kotlin.sequences.asIterable_uya9q7$(_.kotlin.text.rangesDelimitedBy_1($receiver, delimiters, void 0, ignoreCase, limit)); - var destination = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault($receiver_0, 10)); - var tmp$0; - tmp$0 = $receiver_0.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(_.kotlin.text.substring_2g2kgt$($receiver, item)); - } - return destination; - }, split_nhz2th$:Kotlin.defineInlineFunction("stdlib.kotlin.text.split_nhz2th$", function($receiver, regex, limit) { - if (limit === void 0) { - limit = 0; - } - return regex.split_905azu$($receiver, limit); - }), lineSequence_gw00vq$:function($receiver) { - return _.kotlin.text.splitToSequence_l2gz7$($receiver, ["\r\n", "\n", "\r"]); - }, lines_gw00vq$:function($receiver) { - return _.kotlin.sequences.toList_uya9q7$(_.kotlin.text.lineSequence_gw00vq$($receiver)); - }, Typography:Kotlin.createObject(null, function() { - this.quote = '"'; - this.dollar = "$"; - this.amp = "\x26"; - this.less = "\x3c"; - this.greater = "\x3e"; - this.nbsp = "\u00a0"; - this.times = "\u00d7"; - this.cent = "\u00a2"; - this.pound = "\u00a3"; - this.section = "\u00a7"; - this.copyright = "\u00a9"; - this.leftGuillemete = "\u00ab"; - this.rightGuillemete = "\u00bb"; - this.registered = "\u00ae"; - this.degree = "\u00b0"; - this.plusMinus = "\u00b1"; - this.paragraph = "\u00b6"; - this.middleDot = "\u00b7"; - this.half = "\u00bd"; - this.ndash = "\u2013"; - this.mdash = "\u2014"; - this.leftSingleQuote = "\u2018"; - this.rightSingleQuote = "\u2019"; - this.lowSingleQuote = "\u201a"; - this.leftDoubleQuote = "\u201c"; - this.rightDoubleQuote = "\u201d"; - this.lowDoubleQuote = "\u201e"; - this.dagger = "\u2020"; - this.doubleDagger = "\u2021"; - this.bullet = "\u2022"; - this.ellipsis = "\u2026"; - this.prime = "\u2032"; - this.doublePrime = "\u2033"; - this.euro = "\u20ac"; - this.tm = "\u2122"; - this.almostEqual = "\u2248"; - this.notEqual = "\u2260"; - this.lessOrEqual = "\u2264"; - this.greaterOrEqual = "\u2265"; - }), MatchGroupCollection:Kotlin.createTrait(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Collection]; - }), MatchResult:Kotlin.createTrait(null, {destructured:{get:function() { - return new _.kotlin.text.MatchResult.Destructured(this); - }}}, {Destructured:Kotlin.createClass(null, function(match) { - this.match = match; - }, {component1:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component1", function() { - return this.match.groupValues.get_za3lpa$(1); - }), component2:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component2", function() { - return this.match.groupValues.get_za3lpa$(2); - }), component3:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component3", function() { - return this.match.groupValues.get_za3lpa$(3); - }), component4:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component4", function() { - return this.match.groupValues.get_za3lpa$(4); - }), component5:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component5", function() { - return this.match.groupValues.get_za3lpa$(5); - }), component6:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component6", function() { - return this.match.groupValues.get_za3lpa$(6); - }), component7:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component7", function() { - return this.match.groupValues.get_za3lpa$(7); - }), component8:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component8", function() { - return this.match.groupValues.get_za3lpa$(8); - }), component9:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component9", function() { - return this.match.groupValues.get_za3lpa$(9); - }), component10:Kotlin.defineInlineFunction("stdlib.kotlin.text.MatchResult.Destructured.component10", function() { - return this.match.groupValues.get_za3lpa$(10); - }), toList:function() { - return this.match.groupValues.subList_vux9f0$(1, this.match.groupValues.size); - }})}), toRegex_pdl1w0$:Kotlin.defineInlineFunction("stdlib.kotlin.text.toRegex_pdl1w0$", function($receiver) { - return _.kotlin.text.Regex_61zpoe$($receiver); - }), toRegex_1fh9rc$:Kotlin.defineInlineFunction("stdlib.kotlin.text.toRegex_1fh9rc$", function($receiver, option) { - return _.kotlin.text.Regex_sb3q2$($receiver, option); - }), toRegex_qbq406$:Kotlin.defineInlineFunction("stdlib.kotlin.text.toRegex_qbq406$", function($receiver, options) { - return new _.kotlin.text.Regex($receiver, options); - }), js:Kotlin.definePackage(null, {reset_bckwes$:function($receiver) { - $receiver.lastIndex = 0; - }})}), collections:Kotlin.definePackage(function() { - this.INT_MAX_POWER_OF_TWO_y8578v$ = (Kotlin.modules["stdlib"].kotlin.js.internal.IntCompanionObject.MAX_VALUE / 2 | 0) + 1; - }, {listOf_za3rmp$:function(element) { - return _.kotlin.collections.arrayListOf_9mqe4v$([element]); - }, setOf_za3rmp$:function(element) { - return _.kotlin.collections.hashSetOf_9mqe4v$([element]); - }, mapOf_dvvt93$:function(pair) { - return _.kotlin.collections.hashMapOf_eoa9s7$([pair]); - }, asList_eg9ybj$:function($receiver) { - var al = new Kotlin.ArrayList; - al.array = $receiver; - return al; - }, asList_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_l1lu5s$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_964n92$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_355nu0$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_bvy38t$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_rjqrz0$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_tmsbgp$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_se6h4y$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), asList_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asList_i2lc78$", function($receiver) { - var tmp$0; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$0 = $receiver) ? tmp$0 : Kotlin.throwCCE()); - }), copyOf_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_eg9ybj$", function($receiver) { - return $receiver.slice(); - }), copyOf_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_l1lu5s$", function($receiver) { - return $receiver.slice(); - }), copyOf_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_964n92$", function($receiver) { - return $receiver.slice(); - }), copyOf_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_355nu0$", function($receiver) { - return $receiver.slice(); - }), copyOf_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_bvy38t$", function($receiver) { - return $receiver.slice(); - }), copyOf_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_rjqrz0$", function($receiver) { - return $receiver.slice(); - }), copyOf_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_tmsbgp$", function($receiver) { - return $receiver.slice(); - }), copyOf_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_se6h4y$", function($receiver) { - return $receiver.slice(); - }), copyOf_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOf_i2lc78$", function($receiver) { - return $receiver.slice(); - }), copyOf_ucmip8$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, 0); - }, copyOf_7naycm$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, 0); - }, copyOf_tb5gmf$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, 0); - }, copyOf_x09c4g$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, Kotlin.Long.ZERO); - }, copyOf_2e964m$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, 0); - }, copyOf_3qx2rv$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, 0); - }, copyOf_rz0vgy$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, false); - }, copyOf_cwi0e2$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, "\x00"); - }, copyOf_ke1fvl$:function($receiver, newSize) { - return _.kotlin.arrayCopyResize($receiver, newSize, null); - }, copyOfRange_51gnn7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_51gnn7$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_dbbxfg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_dbbxfg$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_iwvzfi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_iwvzfi$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_4q6m98$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_4q6m98$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_2w253b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_2w253b$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_guntdk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_guntdk$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_qzgok5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_qzgok5$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_v260a6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_v260a6$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), copyOfRange_6rk7s8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.copyOfRange_6rk7s8$", function($receiver, fromIndex, toIndex) { - return $receiver.slice(fromIndex, toIndex); - }), plus_ke19y6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_ke19y6$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_bsmqrv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_bsmqrv$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_hgt5d7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_hgt5d7$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_q79yhh$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_q79yhh$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_96a6a3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_96a6a3$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_thi4tv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_thi4tv$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_tb5gmf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_tb5gmf$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_ssilt7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_ssilt7$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_x27eb7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_x27eb7$", function($receiver, element) { - return $receiver.concat([element]); - }), plus_b1982w$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_pxf0th$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_426zor$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_esr9qt$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_3mnc6t$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_202n65$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_5oi5bn$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_wdqs0l$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_o0d0y5$:function($receiver, elements) { - return _.kotlin.arrayPlusCollection($receiver, elements); - }, plus_741p1q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_741p1q$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_xju7f2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_xju7f2$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_1033ji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_1033ji$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_ak8uzy$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_ak8uzy$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_bo3qya$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_bo3qya$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_p55a6y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_p55a6y$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_e0lu4g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_e0lu4g$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_7caxwu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_7caxwu$", function($receiver, elements) { - return $receiver.concat(elements); - }), plus_phu9d2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plus_phu9d2$", function($receiver, elements) { - return $receiver.concat(elements); - }), plusElement_ke19y6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusElement_ke19y6$", function($receiver, element) { - return $receiver.concat([element]); - }), sort_ehvuiv$f:function(a, b) { - return Kotlin.compareTo(a, b); - }, sort_ehvuiv$:function($receiver) { - if ($receiver.length > 1) { - $receiver.sort(_.kotlin.collections.sort_ehvuiv$f); - } - }, sort_se6h4y$f:function(a, b) { - return a.compareTo_za3rmp$(b); - }, sort_se6h4y$:function($receiver) { - if ($receiver.length > 1) { - $receiver.sort(_.kotlin.collections.sort_se6h4y$f); - } - }, sortWith_pf0rc$f:function(closure$comparator) { - return function(a, b) { - return closure$comparator.compare(a, b); - }; - }, sortWith_pf0rc$:function($receiver, comparator) { - if ($receiver.length > 1) { - $receiver.sort(_.kotlin.collections.sortWith_pf0rc$f(comparator)); - } - }, toTypedArray_l1lu5s$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_964n92$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_355nu0$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_bvy38t$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_rjqrz0$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_tmsbgp$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_se6h4y$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, toTypedArray_i2lc78$:function($receiver) { - var tmp$0; - return Array.isArray(tmp$0 = $receiver.slice()) ? tmp$0 : Kotlin.throwCCE(); - }, component1_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_eg9ybj$", function($receiver) { - return $receiver[0]; - }), component1_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_964n92$", function($receiver) { - return $receiver[0]; - }), component1_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_i2lc78$", function($receiver) { - return $receiver[0]; - }), component1_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_tmsbgp$", function($receiver) { - return $receiver[0]; - }), component1_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_se6h4y$", function($receiver) { - return $receiver[0]; - }), component1_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_rjqrz0$", function($receiver) { - return $receiver[0]; - }), component1_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_bvy38t$", function($receiver) { - return $receiver[0]; - }), component1_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_l1lu5s$", function($receiver) { - return $receiver[0]; - }), component1_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_355nu0$", function($receiver) { - return $receiver[0]; - }), component2_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_eg9ybj$", function($receiver) { - return $receiver[1]; - }), component2_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_964n92$", function($receiver) { - return $receiver[1]; - }), component2_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_i2lc78$", function($receiver) { - return $receiver[1]; - }), component2_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_tmsbgp$", function($receiver) { - return $receiver[1]; - }), component2_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_se6h4y$", function($receiver) { - return $receiver[1]; - }), component2_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_rjqrz0$", function($receiver) { - return $receiver[1]; - }), component2_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_bvy38t$", function($receiver) { - return $receiver[1]; - }), component2_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_l1lu5s$", function($receiver) { - return $receiver[1]; - }), component2_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_355nu0$", function($receiver) { - return $receiver[1]; - }), component3_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_eg9ybj$", function($receiver) { - return $receiver[2]; - }), component3_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_964n92$", function($receiver) { - return $receiver[2]; - }), component3_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_i2lc78$", function($receiver) { - return $receiver[2]; - }), component3_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_tmsbgp$", function($receiver) { - return $receiver[2]; - }), component3_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_se6h4y$", function($receiver) { - return $receiver[2]; - }), component3_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_rjqrz0$", function($receiver) { - return $receiver[2]; - }), component3_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_bvy38t$", function($receiver) { - return $receiver[2]; - }), component3_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_l1lu5s$", function($receiver) { - return $receiver[2]; - }), component3_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_355nu0$", function($receiver) { - return $receiver[2]; - }), component4_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_eg9ybj$", function($receiver) { - return $receiver[3]; - }), component4_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_964n92$", function($receiver) { - return $receiver[3]; - }), component4_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_i2lc78$", function($receiver) { - return $receiver[3]; - }), component4_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_tmsbgp$", function($receiver) { - return $receiver[3]; - }), component4_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_se6h4y$", function($receiver) { - return $receiver[3]; - }), component4_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_rjqrz0$", function($receiver) { - return $receiver[3]; - }), component4_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_bvy38t$", function($receiver) { - return $receiver[3]; - }), component4_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_l1lu5s$", function($receiver) { - return $receiver[3]; - }), component4_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_355nu0$", function($receiver) { - return $receiver[3]; - }), component5_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_eg9ybj$", function($receiver) { - return $receiver[4]; - }), component5_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_964n92$", function($receiver) { - return $receiver[4]; - }), component5_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_i2lc78$", function($receiver) { - return $receiver[4]; - }), component5_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_tmsbgp$", function($receiver) { - return $receiver[4]; - }), component5_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_se6h4y$", function($receiver) { - return $receiver[4]; - }), component5_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_rjqrz0$", function($receiver) { - return $receiver[4]; - }), component5_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_bvy38t$", function($receiver) { - return $receiver[4]; - }), component5_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_l1lu5s$", function($receiver) { - return $receiver[4]; - }), component5_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_355nu0$", function($receiver) { - return $receiver[4]; - }), contains_ke19y6$:function($receiver, element) { - return _.kotlin.collections.indexOf_ke19y6$($receiver, element) >= 0; - }, contains_hgt5d7$:function($receiver, element) { - return _.kotlin.collections.indexOf_hgt5d7$($receiver, element) >= 0; - }, contains_x27eb7$:function($receiver, element) { - return _.kotlin.collections.indexOf_x27eb7$($receiver, element) >= 0; - }, contains_tb5gmf$:function($receiver, element) { - return _.kotlin.collections.indexOf_tb5gmf$($receiver, element) >= 0; - }, contains_ssilt7$:function($receiver, element) { - return _.kotlin.collections.indexOf_ssilt7$($receiver, element) >= 0; - }, contains_thi4tv$:function($receiver, element) { - return _.kotlin.collections.indexOf_thi4tv$($receiver, element) >= 0; - }, contains_96a6a3$:function($receiver, element) { - return _.kotlin.collections.indexOf_96a6a3$($receiver, element) >= 0; - }, contains_bsmqrv$:function($receiver, element) { - return _.kotlin.collections.indexOf_bsmqrv$($receiver, element) >= 0; - }, contains_q79yhh$:function($receiver, element) { - return _.kotlin.collections.indexOf_q79yhh$($receiver, element) >= 0; - }, elementAt_ke1fvl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_ke1fvl$", function($receiver, index) { - return $receiver[index]; - }), elementAt_ucmip8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_ucmip8$", function($receiver, index) { - return $receiver[index]; - }), elementAt_7naycm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_7naycm$", function($receiver, index) { - return $receiver[index]; - }), elementAt_tb5gmf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_tb5gmf$", function($receiver, index) { - return $receiver[index]; - }), elementAt_x09c4g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_x09c4g$", function($receiver, index) { - return $receiver[index]; - }), elementAt_2e964m$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_2e964m$", function($receiver, index) { - return $receiver[index]; - }), elementAt_3qx2rv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_3qx2rv$", function($receiver, index) { - return $receiver[index]; - }), elementAt_rz0vgy$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_rz0vgy$", function($receiver, index) { - return $receiver[index]; - }), elementAt_cwi0e2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_cwi0e2$", function($receiver, index) { - return $receiver[index]; - }), elementAtOrElse_pgyyp0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_pgyyp0$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_eg9ybj$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_wdmei7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_wdmei7$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_964n92$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_ytfokv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_ytfokv$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_i2lc78$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_hvqa2x$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_hvqa2x$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_tmsbgp$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_37uoi9$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_37uoi9$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_se6h4y$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_t52ijz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_t52ijz$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_rjqrz0$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_sbr6cx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_sbr6cx$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_bvy38t$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_puwlef$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_puwlef$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_l1lu5s$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrElse_3wujvz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_3wujvz$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_355nu0$($receiver) ? $receiver[index] : defaultValue(index); - }), elementAtOrNull_ke1fvl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_ke1fvl$", function($receiver, index) { - return _.kotlin.collections.getOrNull_ke1fvl$($receiver, index); - }), elementAtOrNull_ucmip8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_ucmip8$", function($receiver, index) { - return _.kotlin.collections.getOrNull_ucmip8$($receiver, index); - }), elementAtOrNull_7naycm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_7naycm$", function($receiver, index) { - return _.kotlin.collections.getOrNull_7naycm$($receiver, index); - }), elementAtOrNull_tb5gmf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_tb5gmf$", function($receiver, index) { - return _.kotlin.collections.getOrNull_tb5gmf$($receiver, index); - }), elementAtOrNull_x09c4g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_x09c4g$", function($receiver, index) { - return _.kotlin.collections.getOrNull_x09c4g$($receiver, index); - }), elementAtOrNull_2e964m$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_2e964m$", function($receiver, index) { - return _.kotlin.collections.getOrNull_2e964m$($receiver, index); - }), elementAtOrNull_3qx2rv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_3qx2rv$", function($receiver, index) { - return _.kotlin.collections.getOrNull_3qx2rv$($receiver, index); - }), elementAtOrNull_rz0vgy$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_rz0vgy$", function($receiver, index) { - return _.kotlin.collections.getOrNull_rz0vgy$($receiver, index); - }), elementAtOrNull_cwi0e2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_cwi0e2$", function($receiver, index) { - return _.kotlin.collections.getOrNull_cwi0e2$($receiver, index); - }), find_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return element; - } - } - return null; - }), find_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), find_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), find_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return element; - } - } - return null; - }), find_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), find_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), find_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), find_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), find_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_dgtl0h$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_eg9ybj$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_964n92$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_i2lc78$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_74vioc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_tmsbgp$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_se6h4y$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_rjqrz0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_bvy38t$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_l1lu5s$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_355nu0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), first_eg9ybj$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_964n92$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_l1lu5s$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_355nu0$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[0]; - }, first_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), first_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), firstOrNull_eg9ybj$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_964n92$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_i2lc78$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_tmsbgp$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_se6h4y$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_rjqrz0$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_bvy38t$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_l1lu5s$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_355nu0$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[0]; - }, firstOrNull_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), firstOrNull_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), getOrElse_pgyyp0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_pgyyp0$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_eg9ybj$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_wdmei7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_wdmei7$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_964n92$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_ytfokv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_ytfokv$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_i2lc78$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_hvqa2x$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_hvqa2x$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_tmsbgp$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_37uoi9$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_37uoi9$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_se6h4y$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_t52ijz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_t52ijz$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_rjqrz0$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_sbr6cx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_sbr6cx$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_bvy38t$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_puwlef$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_puwlef$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_l1lu5s$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrElse_3wujvz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_3wujvz$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_355nu0$($receiver) ? $receiver[index] : defaultValue(index); - }), getOrNull_ke1fvl$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_eg9ybj$($receiver) ? $receiver[index] : null; - }, getOrNull_ucmip8$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_964n92$($receiver) ? $receiver[index] : null; - }, getOrNull_7naycm$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_i2lc78$($receiver) ? $receiver[index] : null; - }, getOrNull_tb5gmf$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_tmsbgp$($receiver) ? $receiver[index] : null; - }, getOrNull_x09c4g$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_se6h4y$($receiver) ? $receiver[index] : null; - }, getOrNull_2e964m$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_rjqrz0$($receiver) ? $receiver[index] : null; - }, getOrNull_3qx2rv$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_bvy38t$($receiver) ? $receiver[index] : null; - }, getOrNull_rz0vgy$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_l1lu5s$($receiver) ? $receiver[index] : null; - }, getOrNull_cwi0e2$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_355nu0$($receiver) ? $receiver[index] : null; - }, indexOf_ke19y6$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3, tmp$4, tmp$5, tmp$6, tmp$7; - if (element == null) { - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if ($receiver[index] == null) { - return index; - } - } - } else { - tmp$4 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$5 = tmp$4.first, tmp$6 = tmp$4.last, tmp$7 = tmp$4.step; - for (var index_0 = tmp$5;index_0 <= tmp$6;index_0 += tmp$7) { - if (Kotlin.equals(element, $receiver[index_0])) { - return index_0; - } - } - } - return-1; - }, indexOf_hgt5d7$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_964n92$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, indexOf_x27eb7$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_i2lc78$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, indexOf_tb5gmf$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_tmsbgp$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, indexOf_ssilt7$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_se6h4y$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element.equals_za3rmp$($receiver[index])) { - return index; - } - } - return-1; - }, indexOf_thi4tv$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_rjqrz0$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, indexOf_96a6a3$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_bvy38t$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, indexOf_bsmqrv$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_l1lu5s$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (Kotlin.equals(element, $receiver[index])) { - return index; - } - } - return-1; - }, indexOf_q79yhh$:function($receiver, element) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_355nu0$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, indexOfFirst_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_1seo9s$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_964n92$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_pqtrl8$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_i2lc78$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_tmsbgp$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_c9nn9k$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_se6h4y$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_jp64to$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_rjqrz0$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_56tpji$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_bvy38t$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_n9o8rw$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_l1lu5s$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfFirst_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_mf0bwc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = _.kotlin.collections.get_indices_355nu0$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_dgtl0h$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_eg9ybj$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_964n92$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_i2lc78$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_74vioc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_tmsbgp$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_se6h4y$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_rjqrz0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_bvy38t$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_l1lu5s$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), indexOfLast_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_355nu0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (predicate($receiver[index])) { - return index; - } - } - return-1; - }), last_eg9ybj$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_eg9ybj$($receiver)]; - }, last_964n92$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_964n92$($receiver)]; - }, last_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_i2lc78$($receiver)]; - }, last_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_tmsbgp$($receiver)]; - }, last_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_se6h4y$($receiver)]; - }, last_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_rjqrz0$($receiver)]; - }, last_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_bvy38t$($receiver)]; - }, last_l1lu5s$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_l1lu5s$($receiver)]; - }, last_355nu0$:function($receiver) { - if ($receiver.length === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } - return $receiver[_.kotlin.collections.get_lastIndex_355nu0$($receiver)]; - }, last_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_dgtl0h$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_eg9ybj$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_964n92$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_i2lc78$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_74vioc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_tmsbgp$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_se6h4y$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_rjqrz0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_bvy38t$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_l1lu5s$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), last_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_355nu0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - }), lastIndexOf_ke19y6$:function($receiver, element) { - var tmp$0, tmp$1; - if (element == null) { - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_eg9ybj$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if ($receiver[index] == null) { - return index; - } - } - } else { - tmp$1 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_eg9ybj$($receiver)).iterator(); - while (tmp$1.hasNext()) { - var index_0 = tmp$1.next(); - if (Kotlin.equals(element, $receiver[index_0])) { - return index_0; - } - } - } - return-1; - }, lastIndexOf_hgt5d7$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_964n92$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, lastIndexOf_x27eb7$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_i2lc78$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, lastIndexOf_tb5gmf$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_tmsbgp$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, lastIndexOf_ssilt7$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_se6h4y$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element.equals_za3rmp$($receiver[index])) { - return index; - } - } - return-1; - }, lastIndexOf_thi4tv$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_rjqrz0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, lastIndexOf_96a6a3$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_bvy38t$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, lastIndexOf_bsmqrv$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_l1lu5s$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (Kotlin.equals(element, $receiver[index])) { - return index; - } - } - return-1; - }, lastIndexOf_q79yhh$:function($receiver, element) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_355nu0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (element === $receiver[index]) { - return index; - } - } - return-1; - }, lastOrNull_eg9ybj$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_964n92$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_i2lc78$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_tmsbgp$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_se6h4y$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_rjqrz0$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_bvy38t$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_l1lu5s$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_355nu0$:function($receiver) { - return $receiver.length === 0 ? null : $receiver[$receiver.length - 1]; - }, lastOrNull_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_dgtl0h$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_eg9ybj$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_964n92$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_i2lc78$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_74vioc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_tmsbgp$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_se6h4y$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_rjqrz0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_bvy38t$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_l1lu5s$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), lastOrNull_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.reversed_q5oq31$(_.kotlin.collections.get_indices_355nu0$($receiver)).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - var element = $receiver[index]; - if (predicate(element)) { - return element; - } - } - return null; - }), single_eg9ybj$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_964n92$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_i2lc78$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_tmsbgp$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_se6h4y$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_rjqrz0$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_bvy38t$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_l1lu5s$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_355nu0$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("Array is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver[0]; - } else { - throw new Kotlin.IllegalArgumentException("Array has more than one element."); - } - } - return tmp$1; - }, single_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var single = null; - var found = false; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return(tmp$3 = single) == null || tmp$3 != null ? tmp$3 : Kotlin.throwCCE(); - }), single_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_1seo9s$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return typeof(tmp$1 = single) === "number" ? tmp$1 : Kotlin.throwCCE(); - }), single_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_pqtrl8$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return typeof(tmp$1 = single) === "number" ? tmp$1 : Kotlin.throwCCE(); - }), single_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var single = null; - var found = false; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return typeof(tmp$3 = single) === "number" ? tmp$3 : Kotlin.throwCCE(); - }), single_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_c9nn9k$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return Kotlin.isType(tmp$1 = single, Kotlin.Long) ? tmp$1 : Kotlin.throwCCE(); - }), single_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_jp64to$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return typeof(tmp$1 = single) === "number" ? tmp$1 : Kotlin.throwCCE(); - }), single_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_56tpji$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return typeof(tmp$1 = single) === "number" ? tmp$1 : Kotlin.throwCCE(); - }), single_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_n9o8rw$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return typeof(tmp$1 = single) === "boolean" ? tmp$1 : Kotlin.throwCCE(); - }), single_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_mf0bwc$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Array contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Array contains no element matching the predicate."); - } - return Kotlin.isChar(tmp$1 = single) ? tmp$1 : Kotlin.throwCCE(); - }), singleOrNull_eg9ybj$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_964n92$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_i2lc78$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_tmsbgp$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_se6h4y$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_rjqrz0$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_bvy38t$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_l1lu5s$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_355nu0$:function($receiver) { - return $receiver.length === 1 ? $receiver[0] : null; - }, singleOrNull_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var single = null; - var found = false; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_1seo9s$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_pqtrl8$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var single = null; - var found = false; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_c9nn9k$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_jp64to$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_56tpji$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_n9o8rw$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), singleOrNull_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_mf0bwc$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), drop_ke1fvl$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_ke1fvl$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_ucmip8$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_ucmip8$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_7naycm$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_7naycm$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_tb5gmf$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_tb5gmf$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_x09c4g$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_x09c4g$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_2e964m$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_2e964m$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_3qx2rv$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_3qx2rv$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_rz0vgy$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_rz0vgy$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, drop_cwi0e2$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.takeLast_cwi0e2$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_ke1fvl$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_ke1fvl$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_ucmip8$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_ucmip8$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_7naycm$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_7naycm$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_tb5gmf$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_tb5gmf$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_x09c4g$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_x09c4g$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_2e964m$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_2e964m$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_3qx2rv$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_3qx2rv$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_rz0vgy$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_rz0vgy$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLast_cwi0e2$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_cwi0e2$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.length - n, 0)); - }, dropLastWhile_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_dgtl0h$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_eg9ybj$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_ke1fvl$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_964n92$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_ucmip8$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_i2lc78$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_7naycm$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_74vioc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_tmsbgp$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_tb5gmf$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_se6h4y$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_x09c4g$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_rjqrz0$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_2e964m$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_bvy38t$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_3qx2rv$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_l1lu5s$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_rz0vgy$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropLastWhile_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_355nu0$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.take_cwi0e2$($receiver, index + 1); - } - } - return _.kotlin.collections.emptyList(); - }), dropWhile_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_1seo9s$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_pqtrl8$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_c9nn9k$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_jp64to$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_56tpji$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_n9o8rw$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), dropWhile_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_mf0bwc$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), filter_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_dgtl0h$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_1seo9s$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_pqtrl8$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_74vioc$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_c9nn9k$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_jp64to$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_56tpji$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_n9o8rw$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filter_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_mf0bwc$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterIndexed_qy3he2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_qy3he2$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_vs9yol$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_vs9yol$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_sj8ypt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_sj8ypt$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_mb5uch$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_mb5uch$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_esogdp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_esogdp$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_vlcunz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_vlcunz$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_qd2zlp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_qd2zlp$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_5j3lt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_5j3lt$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexed_ke0vuh$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_ke0vuh$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_xjbu2f$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_xjbu2f$", function($receiver, destination, predicate) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_4r47cg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_4r47cg$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_lttaj6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_lttaj6$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_muamox$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_muamox$", function($receiver, destination, predicate) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_fhrm4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_fhrm4$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_nzxn4e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_nzxn4e$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_1tmjh1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_1tmjh1$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_t5hn6u$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_t5hn6u$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_80tdpi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_80tdpi$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIsInstance_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIsInstance_eg9ybj$", function(isR, $receiver) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (element == null || isR(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterIsInstanceTo_ajv5ds$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIsInstanceTo_ajv5ds$", function(isR, $receiver, destination) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (isR(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_dgtl0h$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_1seo9s$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_pqtrl8$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_74vioc$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_c9nn9k$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_jp64to$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_56tpji$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_n9o8rw$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_mf0bwc$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotNull_eg9ybj$:function($receiver) { - return _.kotlin.collections.filterNotNullTo_ajv5ds$($receiver, new Kotlin.ArrayList); - }, filterNotNullTo_ajv5ds$:function($receiver, destination) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (element != null) { - destination.add_za3rmp$(element); - } - } - return destination; - }, filterNotTo_hjvcb0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_hjvcb0$", function($receiver, destination, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_xaona3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_xaona3$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_czbilj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_czbilj$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_hufq5w$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_hufq5w$", function($receiver, destination, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_ejt5vl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_ejt5vl$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_a2xp8n$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_a2xp8n$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_py67j4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_py67j4$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_wtv3qz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_wtv3qz$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotTo_xspnld$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_xspnld$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_hjvcb0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_hjvcb0$", function($receiver, destination, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_xaona3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_xaona3$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_czbilj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_czbilj$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_hufq5w$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_hufq5w$", function($receiver, destination, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_ejt5vl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_ejt5vl$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_a2xp8n$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_a2xp8n$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_py67j4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_py67j4$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_wtv3qz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_wtv3qz$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_xspnld$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_xspnld$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), slice_umgy94$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - return _.kotlin.collections.asList_eg9ybj$($receiver.slice(indices.start, indices.endInclusive + 1)); - }, slice_yhzrrx$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_jsa5ur$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_w9c7lc$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_n1ctuf$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_tf1fwd$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_z0313o$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_tur8s7$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_kwtr7z$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var $receiver_1 = $receiver.slice(indices.start, indices.endInclusive + 1); - var tmp$1; - return _.kotlin.collections.asList_eg9ybj$(Array.isArray(tmp$1 = $receiver_1) ? tmp$1 : Kotlin.throwCCE()); - }, slice_k1z9y1$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_8bcmtu$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_z4poy4$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_tpf8wv$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_liqtfe$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_u6v72s$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_qp9dhh$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_4xk008$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, slice_ia2tr4$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver[index]); - } - return list; - }, sliceArray_b1ebut$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.nullArray($receiver, indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_n1pimy$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.numberArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_xl46hs$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.numberArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_5oi5bn$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.numberArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_11np7e$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.longArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_k9291c$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.numberArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_5ptw4x$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.numberArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_vreslo$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.booleanArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_yudz04$:function($receiver, indices) { - var tmp$0; - var result = Kotlin.charArrayOfSize(indices.size); - var targetIndex = 0; - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var sourceIndex = tmp$0.next(); - result[targetIndex++] = $receiver[sourceIndex]; - } - return result; - }, sliceArray_umgy94$:function($receiver, indices) { - if (indices.isEmpty()) { - return $receiver.slice(0, 0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_yhzrrx$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.numberArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_jsa5ur$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.numberArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_w9c7lc$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.numberArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_n1ctuf$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.longArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_tf1fwd$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.numberArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_z0313o$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.numberArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_tur8s7$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.booleanArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, sliceArray_kwtr7z$:function($receiver, indices) { - if (indices.isEmpty()) { - return Kotlin.charArrayOfSize(0); - } - return $receiver.slice(indices.start, indices.endInclusive + 1); - }, take_ke1fvl$:function($receiver, n) { - var tmp$0, tmp$1, tmp$2; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_eg9ybj$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_ucmip8$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_964n92$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_7naycm$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_i2lc78$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_tb5gmf$:function($receiver, n) { - var tmp$0, tmp$1, tmp$2; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_tmsbgp$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_x09c4g$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_se6h4y$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_2e964m$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_rjqrz0$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_3qx2rv$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_bvy38t$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_rz0vgy$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_l1lu5s$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, take_cwi0e2$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (n >= $receiver.length) { - return _.kotlin.collections.toList_355nu0$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return list; - }, takeLast_ke1fvl$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_eg9ybj$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_ucmip8$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_964n92$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_7naycm$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_i2lc78$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_tb5gmf$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_tmsbgp$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_x09c4g$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_se6h4y$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_2e964m$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_rjqrz0$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_3qx2rv$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_bvy38t$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_rz0vgy$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_l1lu5s$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLast_cwi0e2$:function($receiver, n) { - var tmp$0, tmp$1; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.length; - if (n >= size) { - return _.kotlin.collections.toList_355nu0$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver[size - 1]); - } - var list = new Kotlin.ArrayList(n); - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver[index]); - } - return list; - }, takeLastWhile_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_dgtl0h$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_eg9ybj$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_ke1fvl$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_eg9ybj$($receiver); - }), takeLastWhile_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_964n92$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_ucmip8$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_964n92$($receiver); - }), takeLastWhile_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_i2lc78$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_7naycm$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_i2lc78$($receiver); - }), takeLastWhile_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_74vioc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_tmsbgp$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_tb5gmf$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_tmsbgp$($receiver); - }), takeLastWhile_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_se6h4y$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_x09c4g$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_se6h4y$($receiver); - }), takeLastWhile_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_rjqrz0$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_2e964m$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_rjqrz0$($receiver); - }), takeLastWhile_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_bvy38t$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_3qx2rv$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_bvy38t$($receiver); - }), takeLastWhile_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_l1lu5s$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_rz0vgy$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_l1lu5s$($receiver); - }), takeLastWhile_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_355nu0$($receiver), 0).iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - if (!predicate($receiver[index])) { - return _.kotlin.collections.drop_cwi0e2$($receiver, index + 1); - } - } - return _.kotlin.collections.toList_355nu0$($receiver); - }), takeWhile_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_1seo9s$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_pqtrl8$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_c9nn9k$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_jp64to$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_56tpji$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_n9o8rw$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), takeWhile_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_mf0bwc$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), reverse_eg9ybj$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_964n92$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_964n92$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_i2lc78$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_tmsbgp$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_se6h4y$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_rjqrz0$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_bvy38t$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_l1lu5s$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reverse_355nu0$:function($receiver) { - var tmp$0; - var midPoint = ($receiver.length / 2 | 0) - 1; - if (midPoint < 0) { - return; - } - var reverseIndex = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - tmp$0 = midPoint; - for (var index = 0;index <= tmp$0;index++) { - var tmp = $receiver[index]; - $receiver[index] = $receiver[reverseIndex]; - $receiver[reverseIndex] = tmp; - reverseIndex--; - } - }, reversed_eg9ybj$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_eg9ybj$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_964n92$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_964n92$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_i2lc78$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_tmsbgp$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_se6h4y$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_rjqrz0$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_bvy38t$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_l1lu5s$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_l1lu5s$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversed_355nu0$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - var list = _.kotlin.collections.toMutableList_355nu0$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, reversedArray_eg9ybj$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.nullArray($receiver, $receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_964n92$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.numberArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_964n92$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_i2lc78$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.numberArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_tmsbgp$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.numberArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_se6h4y$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.longArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_rjqrz0$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.numberArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_bvy38t$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.numberArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_l1lu5s$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.booleanArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, reversedArray_355nu0$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return $receiver; - } - var result = Kotlin.charArrayOfSize($receiver.length); - var lastIndex = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - tmp$0 = lastIndex; - for (var i = 0;i <= tmp$0;i++) { - result[lastIndex - i] = $receiver[i]; - } - return result; - }, sortBy_2kbc8r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortBy_2kbc8r$", function($receiver, selector) { - if ($receiver.length > 1) { - _.kotlin.collections.sortWith_pf0rc$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - } - }), sortByDescending_2kbc8r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortByDescending_2kbc8r$", function($receiver, selector) { - if ($receiver.length > 1) { - _.kotlin.collections.sortWith_pf0rc$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - } - }), sortDescending_ehvuiv$:function($receiver) { - _.kotlin.collections.sortWith_pf0rc$($receiver, _.kotlin.comparisons.reverseOrder()); - }, sortDescending_964n92$:function($receiver) { - if ($receiver.length > 1) { - Kotlin.primitiveArraySort($receiver); - _.kotlin.collections.reverse_964n92$($receiver); - } - }, sortDescending_i2lc78$:function($receiver) { - if ($receiver.length > 1) { - Kotlin.primitiveArraySort($receiver); - _.kotlin.collections.reverse_i2lc78$($receiver); - } - }, sortDescending_tmsbgp$:function($receiver) { - if ($receiver.length > 1) { - Kotlin.primitiveArraySort($receiver); - _.kotlin.collections.reverse_tmsbgp$($receiver); - } - }, sortDescending_se6h4y$:function($receiver) { - if ($receiver.length > 1) { - _.kotlin.collections.sort_se6h4y$($receiver); - _.kotlin.collections.reverse_se6h4y$($receiver); - } - }, sortDescending_rjqrz0$:function($receiver) { - if ($receiver.length > 1) { - Kotlin.primitiveArraySort($receiver); - _.kotlin.collections.reverse_rjqrz0$($receiver); - } - }, sortDescending_bvy38t$:function($receiver) { - if ($receiver.length > 1) { - Kotlin.primitiveArraySort($receiver); - _.kotlin.collections.reverse_bvy38t$($receiver); - } - }, sortDescending_355nu0$:function($receiver) { - if ($receiver.length > 1) { - Kotlin.primitiveArraySort($receiver); - _.kotlin.collections.reverse_355nu0$($receiver); - } - }, sorted_ehvuiv$:function($receiver) { - return _.kotlin.collections.asList_eg9ybj$(_.kotlin.collections.sortedArray_ehvuiv$($receiver)); - }, sorted_964n92$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_964n92$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sorted_i2lc78$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_i2lc78$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sorted_tmsbgp$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_tmsbgp$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sorted_se6h4y$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_se6h4y$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sorted_rjqrz0$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_rjqrz0$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sorted_bvy38t$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_bvy38t$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sorted_355nu0$:function($receiver) { - var $receiver_0 = _.kotlin.collections.toTypedArray_355nu0$($receiver); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedArray_ehvuiv$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sort_ehvuiv$($receiver_2); - return $receiver_2; - }, sortedArray_964n92$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_2); - return $receiver_2; - }, sortedArray_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_2); - return $receiver_2; - }, sortedArray_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_2); - return $receiver_2; - }, sortedArray_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sort_se6h4y$($receiver_2); - return $receiver_2; - }, sortedArray_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_2); - return $receiver_2; - }, sortedArray_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_2); - return $receiver_2; - }, sortedArray_355nu0$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_2); - return $receiver_2; - }, sortedArrayDescending_ehvuiv$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortWith_pf0rc$($receiver_2, _.kotlin.comparisons.reverseOrder()); - return $receiver_2; - }, sortedArrayDescending_964n92$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_964n92$($receiver_2); - return $receiver_2; - }, sortedArrayDescending_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_i2lc78$($receiver_2); - return $receiver_2; - }, sortedArrayDescending_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_tmsbgp$($receiver_2); - return $receiver_2; - }, sortedArrayDescending_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_se6h4y$($receiver_2); - return $receiver_2; - }, sortedArrayDescending_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_rjqrz0$($receiver_2); - return $receiver_2; - }, sortedArrayDescending_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_bvy38t$($receiver_2); - return $receiver_2; - }, sortedArrayDescending_355nu0$:function($receiver) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortDescending_355nu0$($receiver_2); - return $receiver_2; - }, sortedArrayWith_pf0rc$:function($receiver, comparator) { - if ($receiver.length === 0) { - return $receiver; - } - var $receiver_2 = $receiver.slice(); - _.kotlin.collections.sortWith_pf0rc$($receiver_2, comparator); - return $receiver_2; - }, sortedBy_2kbc8r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_2kbc8r$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_pf0rc$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_lmseli$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_lmseli$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_g2jn7p$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_urwa3e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_urwa3e$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_bpm5rn$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_no6awq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_no6awq$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_naiwod$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_5sy41q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_5sy41q$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_jujh3x$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_mn0nhi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_mn0nhi$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_w3205p$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_7pamz8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_7pamz8$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_1f7czx$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_g2bjom$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_g2bjom$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_es41ir$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedBy_xjz7li$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_xjz7li$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_r5s4t3$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedByDescending_2kbc8r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_2kbc8r$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_pf0rc$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_lmseli$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_lmseli$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_g2jn7p$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_urwa3e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_urwa3e$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_bpm5rn$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_no6awq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_no6awq$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_naiwod$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_5sy41q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_5sy41q$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_jujh3x$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_mn0nhi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_mn0nhi$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_w3205p$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_7pamz8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_7pamz8$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_1f7czx$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_g2bjom$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_g2bjom$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_es41ir$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedByDescending_xjz7li$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_xjz7li$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_r5s4t3$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedDescending_ehvuiv$:function($receiver) { - return _.kotlin.collections.sortedWith_pf0rc$($receiver, _.kotlin.comparisons.reverseOrder()); - }, sortedDescending_964n92$:function($receiver) { - var $receiver_1 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_1); - return _.kotlin.collections.reversed_964n92$($receiver_1); - }, sortedDescending_i2lc78$:function($receiver) { - var $receiver_1 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_1); - return _.kotlin.collections.reversed_i2lc78$($receiver_1); - }, sortedDescending_tmsbgp$:function($receiver) { - var $receiver_1 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_1); - return _.kotlin.collections.reversed_tmsbgp$($receiver_1); - }, sortedDescending_se6h4y$:function($receiver) { - var $receiver_1 = $receiver.slice(); - _.kotlin.collections.sort_se6h4y$($receiver_1); - return _.kotlin.collections.reversed_se6h4y$($receiver_1); - }, sortedDescending_rjqrz0$:function($receiver) { - var $receiver_1 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_1); - return _.kotlin.collections.reversed_rjqrz0$($receiver_1); - }, sortedDescending_bvy38t$:function($receiver) { - var $receiver_1 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_1); - return _.kotlin.collections.reversed_bvy38t$($receiver_1); - }, sortedDescending_355nu0$:function($receiver) { - var $receiver_1 = $receiver.slice(); - Kotlin.primitiveArraySort($receiver_1); - return _.kotlin.collections.reversed_355nu0$($receiver_1); - }, sortedWith_pf0rc$:function($receiver, comparator) { - return _.kotlin.collections.asList_eg9ybj$(_.kotlin.collections.sortedArrayWith_pf0rc$($receiver, comparator)); - }, sortedWith_g2jn7p$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_964n92$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_bpm5rn$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_i2lc78$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_naiwod$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_tmsbgp$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_jujh3x$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_se6h4y$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_w3205p$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_rjqrz0$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_1f7czx$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_bvy38t$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_es41ir$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_l1lu5s$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, sortedWith_r5s4t3$:function($receiver, comparator) { - var $receiver_0 = _.kotlin.collections.toTypedArray_355nu0$($receiver); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - }, get_indices_eg9ybj$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_eg9ybj$($receiver)); - }}, get_indices_964n92$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_964n92$($receiver)); - }}, get_indices_i2lc78$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_i2lc78$($receiver)); - }}, get_indices_tmsbgp$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_tmsbgp$($receiver)); - }}, get_indices_se6h4y$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_se6h4y$($receiver)); - }}, get_indices_rjqrz0$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_rjqrz0$($receiver)); - }}, get_indices_bvy38t$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_bvy38t$($receiver)); - }}, get_indices_l1lu5s$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_l1lu5s$($receiver)); - }}, get_indices_355nu0$:{value:function($receiver) { - return new Kotlin.NumberRange(0, _.kotlin.collections.get_lastIndex_355nu0$($receiver)); - }}, isEmpty_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_eg9ybj$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_964n92$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_i2lc78$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_tmsbgp$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_se6h4y$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_rjqrz0$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_bvy38t$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_l1lu5s$", function($receiver) { - return $receiver.length === 0; - }), isEmpty_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isEmpty_355nu0$", function($receiver) { - return $receiver.length === 0; - }), isNotEmpty_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_eg9ybj$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_964n92$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_i2lc78$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_tmsbgp$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_se6h4y$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_rjqrz0$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_bvy38t$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_l1lu5s$", function($receiver) { - return!($receiver.length === 0); - }), isNotEmpty_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_355nu0$", function($receiver) { - return!($receiver.length === 0); - }), get_lastIndex_eg9ybj$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_964n92$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_i2lc78$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_tmsbgp$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_se6h4y$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_rjqrz0$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_bvy38t$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_l1lu5s$:{value:function($receiver) { - return $receiver.length - 1; - }}, get_lastIndex_355nu0$:{value:function($receiver) { - return $receiver.length - 1; - }}, toBooleanArray_7y31dn$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.booleanArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toByteArray_mgx7ed$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.numberArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toCharArray_moaglf$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.charArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toDoubleArray_hb77ya$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.numberArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toFloatArray_wafl1t$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.numberArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toIntArray_eko7cy$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.numberArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toLongArray_r1royx$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.longArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, toShortArray_ekmd3j$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - var result = Kotlin.numberArrayOfSize($receiver.length); - tmp$0 = _.kotlin.collections.get_indices_eg9ybj$($receiver), tmp$1 = tmp$0.first, tmp$2 = tmp$0.last, tmp$3 = tmp$0.step; - for (var index = tmp$1;index <= tmp$2;index += tmp$3) { - result[index] = $receiver[index]; - } - return result; - }, associate_8vmyt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_8vmyt$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_tgl7q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_tgl7q$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_e2sx9i$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_e2sx9i$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_xlvinu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_xlvinu$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_tk5abm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_tk5abm$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_h6wt46$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_h6wt46$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_fifeb0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_fifeb0$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_3tjkyu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_3tjkyu$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associate_359jka$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_359jka$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateBy_rie7ol$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_rie7ol$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_g2md44$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_g2md44$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_k6apf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_k6apf4$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_x640pc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_x640pc$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_uqemus$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_uqemus$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_xtltf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_xtltf4$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_r03ely$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_r03ely$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_msp2nk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_msp2nk$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_6rjtds$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_6rjtds$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_w3c4fn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_w3c4fn$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_px3eju$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_px3eju$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_1kbpp4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_1kbpp4$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_roawnf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_roawnf$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_ktcn5y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_ktcn5y$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_x5l9ko$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_x5l9ko$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_5h63vp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_5h63vp$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_3yyqis$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_3yyqis$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateBy_bixbbo$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_bixbbo$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity($receiver.length), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_xn9vqz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_xn9vqz$", function($receiver, destination, keySelector) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_l102rk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_l102rk$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_75gvpc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_75gvpc$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_en2rcd$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_en2rcd$", function($receiver, destination, keySelector) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_gbiqoc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_gbiqoc$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_t143fk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_t143fk$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_fbozex$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_fbozex$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_83ixn8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_83ixn8$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_wnqwum$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_wnqwum$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_6dagur$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_6dagur$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_3dm5x2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_3dm5x2$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_7cumig$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_7cumig$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_f2qsrv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_f2qsrv$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_9mh1ly$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_9mh1ly$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_j7feqg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_j7feqg$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_uv5qij$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_uv5qij$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_fdk0po$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_fdk0po$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_my3tn0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_my3tn0$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateTo_m765wl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_m765wl$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_aa8jay$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_aa8jay$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_ympge2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_ympge2$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_qnwrru$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_qnwrru$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_flvp0e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_flvp0e$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_616w56$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_616w56$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_jxocj8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_jxocj8$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_wfiona$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_wfiona$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateTo_5nnqga$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_5nnqga$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), toCollection_ajv5ds$:function($receiver, destination) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_ay7s2l$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_abmk3v$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_aws6s5$:function($receiver, destination) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_uqoool$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_2jmgtx$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_yloohh$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_a59y9h$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toCollection_9hvz9d$:function($receiver, destination) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toHashSet_eg9ybj$:function($receiver) { - return _.kotlin.collections.toCollection_ajv5ds$($receiver, new Kotlin.ComplexHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_964n92$:function($receiver) { - return _.kotlin.collections.toCollection_ay7s2l$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_i2lc78$:function($receiver) { - return _.kotlin.collections.toCollection_abmk3v$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_tmsbgp$:function($receiver) { - return _.kotlin.collections.toCollection_aws6s5$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_se6h4y$:function($receiver) { - return _.kotlin.collections.toCollection_uqoool$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_rjqrz0$:function($receiver) { - return _.kotlin.collections.toCollection_2jmgtx$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_bvy38t$:function($receiver) { - return _.kotlin.collections.toCollection_yloohh$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_l1lu5s$:function($receiver) { - return _.kotlin.collections.toCollection_a59y9h$($receiver, new Kotlin.PrimitiveBooleanHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toHashSet_355nu0$:function($receiver) { - return _.kotlin.collections.toCollection_9hvz9d$($receiver, new Kotlin.PrimitiveNumberHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - }, toList_eg9ybj$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_eg9ybj$($receiver); - } - } - return tmp$1; - }, toList_964n92$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_964n92$($receiver); - } - } - return tmp$1; - }, toList_i2lc78$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_i2lc78$($receiver); - } - } - return tmp$1; - }, toList_tmsbgp$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_tmsbgp$($receiver); - } - } - return tmp$1; - }, toList_se6h4y$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_se6h4y$($receiver); - } - } - return tmp$1; - }, toList_rjqrz0$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_rjqrz0$($receiver); - } - } - return tmp$1; - }, toList_bvy38t$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_bvy38t$($receiver); - } - } - return tmp$1; - }, toList_l1lu5s$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_l1lu5s$($receiver); - } - } - return tmp$1; - }, toList_355nu0$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toMutableList_355nu0$($receiver); - } - } - return tmp$1; - }, toMutableList_eg9ybj$:function($receiver) { - return _.java.util.ArrayList_wtfk93$(_.kotlin.collections.asCollection($receiver)); - }, toMutableList_964n92$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toMutableList_i2lc78$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toMutableList_tmsbgp$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - list.add_za3rmp$(item); - } - return list; - }, toMutableList_se6h4y$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toMutableList_rjqrz0$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toMutableList_bvy38t$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toMutableList_l1lu5s$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toMutableList_355nu0$:function($receiver) { - var tmp$0; - var list = new Kotlin.ArrayList($receiver.length); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - list.add_za3rmp$(item); - } - return list; - }, toSet_eg9ybj$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_ajv5ds$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_964n92$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_ay7s2l$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_i2lc78$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_abmk3v$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_tmsbgp$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_aws6s5$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_se6h4y$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_uqoool$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_rjqrz0$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_2jmgtx$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_bvy38t$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_yloohh$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_l1lu5s$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_a59y9h$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, toSet_355nu0$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$($receiver[0]); - } else { - tmp$1 = _.kotlin.collections.toCollection_9hvz9d$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - return tmp$1; - }, flatMap_9lt8ay$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_9lt8ay$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_3mjriv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_3mjriv$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_bh8vgr$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_bh8vgr$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_f8uktn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_f8uktn$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_2nev2p$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_2nev2p$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_d20dhn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_d20dhn$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_y2hta3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_y2hta3$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_ikx8ln$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_ikx8ln$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMap_986epn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_986epn$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_snzct$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_snzct$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_8oemzk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_8oemzk$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_kihasu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_kihasu$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_2puvzs$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_2puvzs$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_clttnk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_clttnk$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_pj001a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_pj001a$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_rtxif4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_rtxif4$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_812y0a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_812y0a$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_4mn2jk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_4mn2jk$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), groupBy_rie7ol$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_rie7ol$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_g2md44$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_g2md44$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_k6apf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_k6apf4$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_x640pc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_x640pc$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_uqemus$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_uqemus$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_xtltf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_xtltf4$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_r03ely$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_r03ely$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_msp2nk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_msp2nk$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_6rjtds$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_6rjtds$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_w3c4fn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_w3c4fn$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_px3eju$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_px3eju$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_1kbpp4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_1kbpp4$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_roawnf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_roawnf$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_ktcn5y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_ktcn5y$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_x5l9ko$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_x5l9ko$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_5h63vp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_5h63vp$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_3yyqis$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_3yyqis$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupBy_bixbbo$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_bixbbo$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_uwewbq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_uwewbq$", function($receiver, destination, keySelector) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_i9dcot$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_i9dcot$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_y8hm29$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_y8hm29$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_3veyxd$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_3veyxd$", function($receiver, destination, keySelector) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_ht8exh$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_ht8exh$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_67q775$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_67q775$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_agwn6d$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_agwn6d$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_iwlqrz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_iwlqrz$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_udsjtt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_udsjtt$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_h5lvbm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_h5lvbm$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_col8dz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_col8dz$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_152lxl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_152lxl$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_2mlql2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_2mlql2$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var key = keySelector(element); - var tmp$3; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$3 = answer; - } else { - tmp$3 = value; - } - var list = tmp$3; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_bnbmqj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_bnbmqj$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_lix5qv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_lix5qv$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_6o498c$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_6o498c$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_p4mhb1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_p4mhb1$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_ghv9wz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_ghv9wz$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), map_rie7ol$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_rie7ol$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_g2md44$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_g2md44$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_k6apf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_k6apf4$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_x640pc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_x640pc$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_uqemus$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_uqemus$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_xtltf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_xtltf4$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_r03ely$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_r03ely$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_msp2nk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_msp2nk$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), map_6rjtds$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_6rjtds$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapIndexed_d6xsp2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_d6xsp2$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_8jepyn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_8jepyn$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_wnrzaz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_wnrzaz$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_yva9b9$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_yva9b9$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_jr48ix$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_jr48ix$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_3bjddx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_3bjddx$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_7c4mm7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_7c4mm7$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_y1gkw5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_y1gkw5$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexed_t492ff$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_t492ff$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.length); - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedNotNull_d6xsp2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedNotNull_d6xsp2$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - var tmp$3; - (tmp$3 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$3) : null; - } - return destination; - }), mapIndexedNotNullTo_dlwz7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedNotNullTo_dlwz7$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - var tmp$3; - (tmp$3 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$3) : null; - } - return destination; - }), mapIndexedTo_dlwz7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_dlwz7$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_nikm7u$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_nikm7u$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_bkzh1a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_bkzh1a$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_c7wlwo$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_c7wlwo$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_312cqi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_312cqi$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_ndq9q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_ndq9q$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_t1nf4q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_t1nf4q$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_yhbe06$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_yhbe06$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedTo_u7did6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_u7did6$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapNotNull_rie7ol$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapNotNull_rie7ol$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var tmp$3; - (tmp$3 = transform(element)) != null ? destination.add_za3rmp$(tmp$3) : null; - } - return destination; - }), mapNotNullTo_b5g94o$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapNotNullTo_b5g94o$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - var tmp$3; - (tmp$3 = transform(element)) != null ? destination.add_za3rmp$(tmp$3) : null; - } - return destination; - }), mapTo_b5g94o$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_b5g94o$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_y9zzej$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_y9zzej$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_finokt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_finokt$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_qgiq1f$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_qgiq1f$", function($receiver, destination, transform) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_g8ovid$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_g8ovid$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_j2zksz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_j2zksz$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_u6234r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_u6234r$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_yuho05$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_yuho05$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapTo_1u018b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_1u018b$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), withIndex_eg9ybj$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_eg9ybj$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_eg9ybj$f($receiver)); - }, withIndex_964n92$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_964n92$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_964n92$f($receiver)); - }, withIndex_i2lc78$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_i2lc78$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_i2lc78$f($receiver)); - }, withIndex_tmsbgp$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_tmsbgp$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_tmsbgp$f($receiver)); - }, withIndex_se6h4y$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_se6h4y$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_se6h4y$f($receiver)); - }, withIndex_rjqrz0$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_rjqrz0$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_rjqrz0$f($receiver)); - }, withIndex_bvy38t$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_bvy38t$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_bvy38t$f($receiver)); - }, withIndex_l1lu5s$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_l1lu5s$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_l1lu5s$f($receiver)); - }, withIndex_355nu0$f:function(this$withIndex) { - return function() { - return Kotlin.arrayIterator(this$withIndex); - }; - }, withIndex_355nu0$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_355nu0$f($receiver)); - }, distinct_eg9ybj$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_eg9ybj$($receiver)); - }, distinct_964n92$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_964n92$($receiver)); - }, distinct_i2lc78$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_i2lc78$($receiver)); - }, distinct_tmsbgp$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_tmsbgp$($receiver)); - }, distinct_se6h4y$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_se6h4y$($receiver)); - }, distinct_rjqrz0$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_rjqrz0$($receiver)); - }, distinct_bvy38t$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_bvy38t$($receiver)); - }, distinct_l1lu5s$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_l1lu5s$($receiver)); - }, distinct_355nu0$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_355nu0$($receiver)); - }, distinctBy_rie7ol$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_rie7ol$", function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var e = tmp$0[tmp$2]; - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_g2md44$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_g2md44$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_k6apf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_k6apf4$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_x640pc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_x640pc$", function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var e = tmp$0[tmp$2]; - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_uqemus$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_uqemus$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_xtltf4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_xtltf4$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_r03ely$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_r03ely$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_msp2nk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_msp2nk$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), distinctBy_6rjtds$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_6rjtds$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), intersect_k1u664$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_eg9ybj$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_q8x1w7$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_964n92$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_gi9hh5$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_i2lc78$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_tpf8wv$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_tmsbgp$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_rwqrtj$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_se6h4y$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_v8iop3$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_rjqrz0$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_7a8nt5$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_bvy38t$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_6ly3kh$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_l1lu5s$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, intersect_1h1v6f$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_355nu0$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, subtract_k1u664$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_eg9ybj$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_q8x1w7$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_964n92$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_gi9hh5$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_i2lc78$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_tpf8wv$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_tmsbgp$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_rwqrtj$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_se6h4y$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_v8iop3$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_rjqrz0$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_7a8nt5$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_bvy38t$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_6ly3kh$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_l1lu5s$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, subtract_1h1v6f$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_355nu0$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, toMutableSet_eg9ybj$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_964n92$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_i2lc78$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_tmsbgp$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_se6h4y$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_rjqrz0$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_bvy38t$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_l1lu5s$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, toMutableSet_355nu0$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.length)); - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, union_k1u664$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_eg9ybj$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_q8x1w7$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_964n92$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_gi9hh5$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_i2lc78$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_tpf8wv$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_tmsbgp$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_rwqrtj$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_se6h4y$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_v8iop3$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_rjqrz0$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_7a8nt5$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_bvy38t$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_6ly3kh$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_l1lu5s$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, union_1h1v6f$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_355nu0$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, all_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!predicate(element)) { - return false; - } - } - return true; - }), all_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), all_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), all_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!predicate(element)) { - return false; - } - } - return true; - }), all_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), all_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), all_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), all_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), all_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), any_eg9ybj$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - return true; - } - return false; - }, any_964n92$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_i2lc78$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_tmsbgp$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - return true; - } - return false; - }, any_se6h4y$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_rjqrz0$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_bvy38t$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_l1lu5s$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_355nu0$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return true; - } - } - return false; - }), any_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), any_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), any_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return true; - } - } - return false; - }), any_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), any_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), any_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), any_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), any_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), count_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_eg9ybj$", function($receiver) { - return $receiver.length; - }), count_964n92$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_964n92$", function($receiver) { - return $receiver.length; - }), count_i2lc78$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_i2lc78$", function($receiver) { - return $receiver.length; - }), count_tmsbgp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_tmsbgp$", function($receiver) { - return $receiver.length; - }), count_se6h4y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_se6h4y$", function($receiver) { - return $receiver.length; - }), count_rjqrz0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_rjqrz0$", function($receiver) { - return $receiver.length; - }), count_bvy38t$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_bvy38t$", function($receiver) { - return $receiver.length; - }), count_l1lu5s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_l1lu5s$", function($receiver) { - return $receiver.length; - }), count_355nu0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_355nu0$", function($receiver) { - return $receiver.length; - }), count_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - count++; - } - } - return count; - }), count_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_1seo9s$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), count_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_pqtrl8$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), count_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - count++; - } - } - return count; - }), count_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_c9nn9k$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), count_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_jp64to$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), count_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_56tpji$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), count_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_n9o8rw$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), count_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_mf0bwc$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), fold_pshek8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_pshek8$", function($receiver, initial, operation) { - var tmp$0, tmp$1, tmp$2; - var accumulator = initial; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_pqv817$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_pqv817$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_9mm9fh$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_9mm9fh$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_5dqkgz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_5dqkgz$", function($receiver, initial, operation) { - var tmp$0, tmp$1, tmp$2; - var accumulator = initial; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_re4yqz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_re4yqz$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_t23qwz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_t23qwz$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_8pmi6j$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_8pmi6j$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_86qr6z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_86qr6z$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), fold_xpqlgr$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_xpqlgr$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), foldIndexed_gmwb6l$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_gmwb6l$", function($receiver, initial, operation) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - var accumulator = initial; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_jy2lti$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_jy2lti$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_xco1ea$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_xco1ea$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_qjubp4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_qjubp4$", function($receiver, initial, operation) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - var accumulator = initial; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_8ys392$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_8ys392$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_pljay6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_pljay6$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_8s951y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_8s951y$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_w9wt4a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_w9wt4a$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldIndexed_5d3uiy$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_5d3uiy$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldRight_pshek8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_pshek8$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_af40en$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_af40en$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_964n92$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_w1nri5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_w1nri5$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_fwp7kz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_fwp7kz$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_8g1vz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_8g1vz$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_tb9j25$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_tb9j25$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_5fhoof$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_5fhoof$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_n2j045$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_n2j045$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRight_6kfpv5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_6kfpv5$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), foldRightIndexed_gmwb6l$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_gmwb6l$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_g7wmmc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_g7wmmc$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_964n92$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_f9eii6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_f9eii6$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_xyb360$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_xyb360$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_insxdw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_insxdw$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_wrtz0y$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_wrtz0y$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_5cv1t0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_5cv1t0$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_7hxhjq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_7hxhjq$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), foldRightIndexed_wieq4k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_wieq4k$", function($receiver, initial, operation) { - var index = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - var accumulator = initial; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), forEach_5wd4f$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_5wd4f$", function($receiver, action) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - action(element); - } - }), forEach_qhbdc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_qhbdc$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEach_e5s73w$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_e5s73w$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEach_xiw8tg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_xiw8tg$", function($receiver, action) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - action(element); - } - }), forEach_tn4k60$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_tn4k60$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEach_h9w2yk$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_h9w2yk$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEach_fleo5e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_fleo5e$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEach_3wiut8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_3wiut8$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEach_32a9pw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_32a9pw$", function($receiver, action) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEachIndexed_gwl0xm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_gwl0xm$", function($receiver, action) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - action(index++, item); - } - }), forEachIndexed_jprgez$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_jprgez$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), forEachIndexed_ici84x$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_ici84x$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), forEachIndexed_f65lpr$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_f65lpr$", function($receiver, action) { - var tmp$0, tmp$1, tmp$2; - var index = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var item = tmp$0[tmp$2]; - action(index++, item); - } - }), forEachIndexed_qmdk59$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_qmdk59$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), forEachIndexed_vlkvnz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_vlkvnz$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), forEachIndexed_enmwj1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_enmwj1$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), forEachIndexed_aiefap$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_aiefap$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), forEachIndexed_l1n7qv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_l1n7qv$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), max_ehvuiv$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (Kotlin.compareTo(max, e) < 0) { - max = e; - } - } - return max; - }, max_964n92$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max < e) { - max = e; - } - } - return max; - }, max_i2lc78$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max < e) { - max = e; - } - } - return max; - }, max_tmsbgp$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max < e) { - max = e; - } - } - return max; - }, max_se6h4y$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max.compareTo_za3rmp$(e) < 0) { - max = e; - } - } - return max; - }, max_rjqrz0$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max < e) { - max = e; - } - } - return max; - }, max_bvy38t$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max < e) { - max = e; - } - } - return max; - }, max_355nu0$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (max < e) { - max = e; - } - } - return max; - }, maxBy_2kbc8r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_2kbc8r$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_lmseli$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_lmseli$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_urwa3e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_urwa3e$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_no6awq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_no6awq$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_5sy41q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_5sy41q$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_mn0nhi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_mn0nhi$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_7pamz8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_7pamz8$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_g2bjom$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_g2bjom$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxBy_xjz7li$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_xjz7li$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var maxElem = $receiver[0]; - var maxValue = selector(maxElem); - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxWith_pf0rc$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_g2jn7p$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_bpm5rn$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_naiwod$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_jujh3x$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_w3205p$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_1f7czx$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_es41ir$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, maxWith_r5s4t3$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var max = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, min_ehvuiv$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (Kotlin.compareTo(min, e) > 0) { - min = e; - } - } - return min; - }, min_964n92$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min > e) { - min = e; - } - } - return min; - }, min_i2lc78$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min > e) { - min = e; - } - } - return min; - }, min_tmsbgp$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min > e) { - min = e; - } - } - return min; - }, min_se6h4y$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min.compareTo_za3rmp$(e) > 0) { - min = e; - } - } - return min; - }, min_rjqrz0$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min > e) { - min = e; - } - } - return min; - }, min_bvy38t$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min > e) { - min = e; - } - } - return min; - }, min_355nu0$:function($receiver) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (min > e) { - min = e; - } - } - return min; - }, minBy_2kbc8r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_2kbc8r$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_lmseli$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_lmseli$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_urwa3e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_urwa3e$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_no6awq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_no6awq$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_5sy41q$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_5sy41q$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_mn0nhi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_mn0nhi$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_7pamz8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_7pamz8$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_g2bjom$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_g2bjom$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minBy_xjz7li$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_xjz7li$", function($receiver, selector) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var minElem = $receiver[0]; - var minValue = selector(minElem); - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minWith_pf0rc$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_g2jn7p$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_bpm5rn$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_naiwod$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_jujh3x$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_w3205p$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_1f7czx$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_es41ir$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, minWith_r5s4t3$:function($receiver, comparator) { - var tmp$0; - if ($receiver.length === 0) { - return null; - } - var min = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var i = 1;i <= tmp$0;i++) { - var e = $receiver[i]; - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, none_eg9ybj$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - return false; - } - return true; - }, none_964n92$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_i2lc78$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_tmsbgp$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - return false; - } - return true; - }, none_se6h4y$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_rjqrz0$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_bvy38t$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_l1lu5s$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_355nu0$:function($receiver) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return false; - } - } - return true; - }), none_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_1seo9s$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), none_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_pqtrl8$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), none_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - return false; - } - } - return true; - }), none_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_c9nn9k$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), none_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_jp64to$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), none_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_56tpji$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), none_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_n9o8rw$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), none_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_mf0bwc$", function($receiver, predicate) { - var tmp$0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), reduce_lkiuaf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_lkiuaf$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_8rebxu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_8rebxu$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_pwt076$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_pwt076$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_yv55jc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_yv55jc$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_5c5tpi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_5c5tpi$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_i6ldku$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_i6ldku$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_cutd5o$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_cutd5o$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_w96cka$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_w96cka$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduce_nazham$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_nazham$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_9qa3fw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_9qa3fw$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_xe3tfn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_xe3tfn$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_964n92$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_vhxmnd$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_vhxmnd$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_r0o6e5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_r0o6e5$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_uzo0it$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_uzo0it$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_nqrynd$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_nqrynd$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_gqpg33$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_gqpg33$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_v2dtf3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_v2dtf3$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceIndexed_1pqzxj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_1pqzxj$", function($receiver, operation) { - var tmp$0; - if ($receiver.length === 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[0]; - tmp$0 = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - for (var index = 1;index <= tmp$0;index++) { - accumulator = operation(index, accumulator, $receiver[index]); - } - return accumulator; - }), reduceRight_lkiuaf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_lkiuaf$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_8rebxu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_8rebxu$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_964n92$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_pwt076$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_pwt076$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_yv55jc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_yv55jc$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_5c5tpi$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_5c5tpi$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_i6ldku$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_i6ldku$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_cutd5o$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_cutd5o$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_w96cka$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_w96cka$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRight_nazham$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_nazham$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation($receiver[index--], accumulator); - } - return accumulator; - }), reduceRightIndexed_9qa3fw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_9qa3fw$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_eg9ybj$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_xe3tfn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_xe3tfn$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_964n92$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_vhxmnd$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_vhxmnd$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_i2lc78$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_r0o6e5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_r0o6e5$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_tmsbgp$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_uzo0it$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_uzo0it$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_se6h4y$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_nqrynd$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_nqrynd$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_rjqrz0$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_gqpg33$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_gqpg33$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_bvy38t$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_v2dtf3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_v2dtf3$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_l1lu5s$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), reduceRightIndexed_1pqzxj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_1pqzxj$", function($receiver, operation) { - var index = _.kotlin.collections.get_lastIndex_355nu0$($receiver); - if (index < 0) { - throw new Kotlin.UnsupportedOperationException("Empty array can't be reduced."); - } - var accumulator = $receiver[index--]; - while (index >= 0) { - accumulator = operation(index, $receiver[index], accumulator); - --index; - } - return accumulator; - }), sumBy_ri93wo$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_ri93wo$", function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += selector(element); - } - return sum; - }), sumBy_g2h9c7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_g2h9c7$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumBy_k65ln7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_k65ln7$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumBy_x5ywxf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_x5ywxf$", function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += selector(element); - } - return sum; - }), sumBy_uqjqmp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_uqjqmp$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumBy_xtgpn7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_xtgpn7$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumBy_qzyau1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_qzyau1$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumBy_msjyvn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_msjyvn$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumBy_6rox5p$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_6rox5p$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_jubvhg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_jubvhg$", function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += selector(element); - } - return sum; - }), sumByDouble_wd5ypp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_wd5ypp$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_5p59zj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_5p59zj$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_55ogr5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_55ogr5$", function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += selector(element); - } - return sum; - }), sumByDouble_wthnh1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_wthnh1$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_f248nj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_f248nj$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_y6x5hx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_y6x5hx$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_ltfntb$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_ltfntb$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_3iivbz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_3iivbz$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), requireNoNulls_eg9ybj$:function($receiver) { - var tmp$0, tmp$1, tmp$2, tmp$3; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (element == null) { - throw new Kotlin.IllegalArgumentException("null element found in " + $receiver + "."); - } - } - return Array.isArray(tmp$3 = $receiver) ? tmp$3 : Kotlin.throwCCE(); - }, partition_dgtl0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_dgtl0h$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_1seo9s$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_1seo9s$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_pqtrl8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_pqtrl8$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_74vioc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_74vioc$", function($receiver, predicate) { - var tmp$0, tmp$1, tmp$2; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_c9nn9k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_c9nn9k$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_jp64to$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_jp64to$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_56tpji$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_56tpji$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_n9o8rw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_n9o8rw$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), partition_mf0bwc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_mf0bwc$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), zip_741p1q$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_nrhj8n$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_ika9yl$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_1nxere$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_7q8x59$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_uckx6b$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_9gp42m$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_yey03l$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_zemuah$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_2rmu0o$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_2rmu0o$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_4t7xkx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_4t7xkx$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_em1vhp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_em1vhp$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_uo1iqb$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_uo1iqb$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_9x7n3z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_9x7n3z$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_49cwib$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_49cwib$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_9xp40v$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_9xp40v$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_pnti4b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_pnti4b$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_b8vhfj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_b8vhfj$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_k1u664$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_8bhqlr$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_z4usq1$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_tpkcos$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_lilpnh$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_u6q3av$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_qp49pk$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_4xew8b$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_ia7xj1$:function($receiver, other) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i++], element)); - } - return list; - }, zip_wdyzkq$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_wdyzkq$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_1w04c7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_1w04c7$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_gpk9wx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_gpk9wx$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_i6q5r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_i6q5r$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_4n0ikv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_4n0ikv$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_j1q8tt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_j1q8tt$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_wmo9n$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_wmo9n$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_rz83z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_rz83z$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_ha4syt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_ha4syt$", function($receiver, other, transform) { - var tmp$0; - var arraySize = $receiver.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault(other, 10), arraySize)); - var i = 0; - tmp$0 = other.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform($receiver[i++], element)); - } - return list; - }), zip_1033ji$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_phu9d2$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_e0lu4g$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_7caxwu$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_p55a6y$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_bo3qya$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_xju7f2$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_ak8uzy$:function($receiver, other) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(_.kotlin.to_l1ob02$($receiver[i], other[i])); - } - return list; - }, zip_9zfo4u$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_9zfo4u$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_xs8ib4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_xs8ib4$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_mp4cls$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_mp4cls$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_83qj9u$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_83qj9u$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_kxvwwg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_kxvwwg$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_g1c01a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_g1c01a$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_ujqlps$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_ujqlps$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), zip_grqpda$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_grqpda$", function($receiver, other, transform) { - var tmp$0; - var size = Math.min($receiver.length, other.length); - var list = new Kotlin.ArrayList(size); - tmp$0 = size - 1; - for (var i = 0;i <= tmp$0;i++) { - list.add_za3rmp$(transform($receiver[i], other[i])); - } - return list; - }), joinTo_7uchso$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0, tmp$1, tmp$2; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element == null ? "null" : element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_barwct$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_2qnkcz$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_w9i6k3$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0, tmp$1, tmp$2; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_ac0spn$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_a0zr9v$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_5dssjp$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_q1okz1$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinTo_at1d3j$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinToString_qtax42$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_7uchso$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_k0u3cz$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_barwct$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_av5xiv$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_2qnkcz$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_gctiqr$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_w9i6k3$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_kp0x6r$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_ac0spn$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_92s1ft$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_a0zr9v$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_47ib1f$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_5dssjp$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_tyzo35$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_q1okz1$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, joinToString_d1dl19$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_at1d3j$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, asIterable_eg9ybj$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_eg9ybj$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_eg9ybj$f($receiver)); - }, asIterable_964n92$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_964n92$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_964n92$f($receiver)); - }, asIterable_i2lc78$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_i2lc78$f($receiver)); - }, asIterable_tmsbgp$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_tmsbgp$f($receiver)); - }, asIterable_se6h4y$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_se6h4y$f($receiver)); - }, asIterable_rjqrz0$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_rjqrz0$f($receiver)); - }, asIterable_bvy38t$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_bvy38t$f($receiver)); - }, asIterable_l1lu5s$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_l1lu5s$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_l1lu5s$f($receiver)); - }, asIterable_355nu0$f:function(this$asIterable) { - return function() { - return Kotlin.arrayIterator(this$asIterable); - }; - }, asIterable_355nu0$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.collections.emptyList(); - } - return new _.kotlin.collections.Iterable$f(_.kotlin.collections.asIterable_355nu0$f($receiver)); - }, asSequence_eg9ybj$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_eg9ybj$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_eg9ybj$f($receiver)); - }, asSequence_964n92$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_964n92$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_964n92$f($receiver)); - }, asSequence_i2lc78$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_i2lc78$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_i2lc78$f($receiver)); - }, asSequence_tmsbgp$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_tmsbgp$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_tmsbgp$f($receiver)); - }, asSequence_se6h4y$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_se6h4y$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_se6h4y$f($receiver)); - }, asSequence_rjqrz0$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_rjqrz0$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_rjqrz0$f($receiver)); - }, asSequence_bvy38t$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_bvy38t$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_bvy38t$f($receiver)); - }, asSequence_l1lu5s$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_l1lu5s$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_l1lu5s$f($receiver)); - }, asSequence_355nu0$f:function(this$asSequence) { - return function() { - return Kotlin.arrayIterator(this$asSequence); - }; - }, asSequence_355nu0$:function($receiver) { - if ($receiver.length === 0) { - return _.kotlin.sequences.emptySequence(); - } - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_355nu0$f($receiver)); - }, average_mgx7ed$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_ekmd3j$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_eko7cy$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_r1royx$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_wafl1t$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_hb77ya$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_964n92$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_i2lc78$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_tmsbgp$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - var count = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_se6h4y$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_rjqrz0$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_bvy38t$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, sum_mgx7ed$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - } - return sum; - }, sum_ekmd3j$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - } - return sum; - }, sum_eko7cy$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - } - return sum; - }, sum_r1royx$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = Kotlin.Long.ZERO; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum = sum.add(element); - } - return sum; - }, sum_wafl1t$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - } - return sum; - }, sum_hb77ya$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - } - return sum; - }, sum_964n92$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_i2lc78$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_tmsbgp$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var sum = 0; - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - sum += element; - } - return sum; - }, sum_se6h4y$:function($receiver) { - var tmp$0; - var sum = Kotlin.Long.ZERO; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum = sum.add(element); - } - return sum; - }, sum_rjqrz0$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_bvy38t$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = Kotlin.arrayIterator($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, component1_a7ptmv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_a7ptmv$", function($receiver) { - return $receiver.get_za3lpa$(0); - }), component2_a7ptmv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_a7ptmv$", function($receiver) { - return $receiver.get_za3lpa$(1); - }), component3_a7ptmv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component3_a7ptmv$", function($receiver) { - return $receiver.get_za3lpa$(2); - }), component4_a7ptmv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component4_a7ptmv$", function($receiver) { - return $receiver.get_za3lpa$(3); - }), component5_a7ptmv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component5_a7ptmv$", function($receiver) { - return $receiver.get_za3lpa$(4); - }), contains_cwuzrm$:function($receiver, element) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return $receiver.contains_za3rmp$(element); - } - return _.kotlin.collections.indexOf_cwuzrm$($receiver, element) >= 0; - }, elementAt_cwv5p1$f:function(closure$index) { - return function(it) { - throw new Kotlin.IndexOutOfBoundsException("Collection doesn't contain element at index " + closure$index + "."); - }; - }, elementAt_cwv5p1$:function($receiver, index) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return $receiver.get_za3lpa$(index); - } - return _.kotlin.collections.elementAtOrElse_1h02b4$($receiver, index, _.kotlin.collections.elementAt_cwv5p1$f(index)); - }, elementAt_3iu80n$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAt_3iu80n$", function($receiver, index) { - return $receiver.get_za3lpa$(index); - }), elementAtOrElse_1h02b4$:function($receiver, index, defaultValue) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_a7ptmv$($receiver) ? $receiver.get_za3lpa$(index) : defaultValue(index); - } - if (index < 0) { - return defaultValue(index); - } - var iterator = $receiver.iterator(); - var count = 0; - while (iterator.hasNext()) { - var element = iterator.next(); - if (index === count++) { - return element; - } - } - return defaultValue(index); - }, elementAtOrElse_vup1yc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrElse_vup1yc$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_a7ptmv$($receiver) ? $receiver.get_za3lpa$(index) : defaultValue(index); - }), elementAtOrNull_cwv5p1$:function($receiver, index) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return _.kotlin.collections.getOrNull_3iu80n$($receiver, index); - } - if (index < 0) { - return null; - } - var iterator = $receiver.iterator(); - var count = 0; - while (iterator.hasNext()) { - var element = iterator.next(); - if (index === count++) { - return element; - } - } - return null; - }, elementAtOrNull_3iu80n$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.elementAtOrNull_3iu80n$", function($receiver, index) { - return _.kotlin.collections.getOrNull_3iu80n$($receiver, index); - }), find_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.find_udlcbx$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_udlcbx$", function($receiver, predicate) { - var tmp$0; - var last = null; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - last = element; - } - } - return last; - }), findLast_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.findLast_ymzesn$", function($receiver, predicate) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - var element = iterator.previous(); - if (predicate(element)) { - return element; - } - } - return null; - }), first_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return _.kotlin.collections.first_a7ptmv$($receiver); - } else { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.NoSuchElementException("Collection is empty."); - } - return iterator.next(); - } - }, first_a7ptmv$:function($receiver) { - if ($receiver.isEmpty()) { - throw new Kotlin.NoSuchElementException("List is empty."); - } - return $receiver.get_za3lpa$(0); - }, first_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.first_udlcbx$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Collection contains no element matching the predicate."); - }), firstOrNull_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - if ($receiver.isEmpty()) { - return null; - } else { - return $receiver.get_za3lpa$(0); - } - } else { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - return iterator.next(); - } - }, firstOrNull_a7ptmv$:function($receiver) { - return $receiver.isEmpty() ? null : $receiver.get_za3lpa$(0); - }, firstOrNull_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.firstOrNull_udlcbx$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), getOrElse_vup1yc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_vup1yc$", function($receiver, index, defaultValue) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_a7ptmv$($receiver) ? $receiver.get_za3lpa$(index) : defaultValue(index); - }), getOrNull_3iu80n$:function($receiver, index) { - return index >= 0 && index <= _.kotlin.collections.get_lastIndex_a7ptmv$($receiver) ? $receiver.get_za3lpa$(index) : null; - }, indexOf_cwuzrm$:function($receiver, element) { - var tmp$0; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return $receiver.indexOf_za3rmp$(element); - } - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (Kotlin.equals(element, item)) { - return index; - } - index++; - } - return-1; - }, indexOf_3iudy2$:function($receiver, element) { - return $receiver.indexOf_za3rmp$(element); - }, indexOfFirst_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_udlcbx$", function($receiver, predicate) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(item)) { - return index; - } - index++; - } - return-1; - }), indexOfFirst_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfFirst_ymzesn$", function($receiver, predicate) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(item)) { - return index; - } - index++; - } - return-1; - }), indexOfLast_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_udlcbx$", function($receiver, predicate) { - var tmp$0; - var lastIndex = -1; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(item)) { - lastIndex = index; - } - index++; - } - return lastIndex; - }), indexOfLast_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.indexOfLast_ymzesn$", function($receiver, predicate) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - if (predicate(iterator.previous())) { - return iterator.nextIndex(); - } - } - return-1; - }), last_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return _.kotlin.collections.last_a7ptmv$($receiver); - } else { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.NoSuchElementException("Collection is empty."); - } - var last = iterator.next(); - while (iterator.hasNext()) { - last = iterator.next(); - } - return last; - } - }, last_a7ptmv$:function($receiver) { - if ($receiver.isEmpty()) { - throw new Kotlin.NoSuchElementException("List is empty."); - } - return $receiver.get_za3lpa$(_.kotlin.collections.get_lastIndex_a7ptmv$($receiver)); - }, last_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_udlcbx$", function($receiver, predicate) { - var tmp$0, tmp$1; - var last = null; - var found = false; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - last = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Collection contains no element matching the predicate."); - } - return(tmp$1 = last) == null || tmp$1 != null ? tmp$1 : Kotlin.throwCCE(); - }), last_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.last_ymzesn$", function($receiver, predicate) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - var element = iterator.previous(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("List contains no element matching the predicate."); - }), lastIndexOf_cwuzrm$:function($receiver, element) { - var tmp$0; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return $receiver.lastIndexOf_za3rmp$(element); - } - var lastIndex = -1; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (Kotlin.equals(element, item)) { - lastIndex = index; - } - index++; - } - return lastIndex; - }, lastIndexOf_3iudy2$:function($receiver, element) { - return $receiver.lastIndexOf_za3rmp$(element); - }, lastOrNull_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return $receiver.isEmpty() ? null : $receiver.get_za3lpa$($receiver.size - 1); - } else { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var last = iterator.next(); - while (iterator.hasNext()) { - last = iterator.next(); - } - return last; - } - }, lastOrNull_a7ptmv$:function($receiver) { - return $receiver.isEmpty() ? null : $receiver.get_za3lpa$($receiver.size - 1); - }, lastOrNull_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_udlcbx$", function($receiver, predicate) { - var tmp$0; - var last = null; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - last = element; - } - } - return last; - }), lastOrNull_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.lastOrNull_ymzesn$", function($receiver, predicate) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - var element = iterator.previous(); - if (predicate(element)) { - return element; - } - } - return null; - }), single_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return _.kotlin.collections.single_a7ptmv$($receiver); - } else { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.NoSuchElementException("Collection is empty."); - } - var single = iterator.next(); - if (iterator.hasNext()) { - throw new Kotlin.IllegalArgumentException("Collection has more than one element."); - } - return single; - } - }, single_a7ptmv$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - throw new Kotlin.NoSuchElementException("List is empty."); - } else { - if (tmp$0 === 1) { - tmp$1 = $receiver.get_za3lpa$(0); - } else { - throw new Kotlin.IllegalArgumentException("List has more than one element."); - } - } - return tmp$1; - }, single_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.single_udlcbx$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Collection contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Collection contains no element matching the predicate."); - } - return(tmp$1 = single) == null || tmp$1 != null ? tmp$1 : Kotlin.throwCCE(); - }), singleOrNull_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - return $receiver.size === 1 ? $receiver.get_za3lpa$(0) : null; - } else { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var single = iterator.next(); - if (iterator.hasNext()) { - return null; - } - return single; - } - }, singleOrNull_a7ptmv$:function($receiver) { - return $receiver.size === 1 ? $receiver.get_za3lpa$(0) : null; - }, singleOrNull_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.singleOrNull_udlcbx$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), drop_cwv5p1$:function($receiver, n) { - var tmp$0, tmp$1, tmp$2; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var list; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - var resultSize = $receiver.size - n; - if (resultSize <= 0) { - return _.kotlin.collections.emptyList(); - } - if (resultSize === 1) { - return _.kotlin.collections.listOf_za3rmp$(_.kotlin.collections.last_q5oq31$($receiver)); - } - list = new Kotlin.ArrayList(resultSize); - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List)) { - if (Kotlin.isType($receiver, Kotlin.RandomAccess)) { - tmp$0 = $receiver.size - 1; - for (var index = n;index <= tmp$0;index++) { - list.add_za3rmp$($receiver.get_za3lpa$(index)); - } - } else { - tmp$1 = _.kotlin.collections.iterator_123wqf$($receiver.listIterator_za3lpa$(n)); - while (tmp$1.hasNext()) { - var item = tmp$1.next(); - list.add_za3rmp$(item); - } - } - return list; - } - } else { - list = new Kotlin.ArrayList; - } - var count = 0; - tmp$2 = $receiver.iterator(); - while (tmp$2.hasNext()) { - var item_0 = tmp$2.next(); - if (count++ >= n) { - list.add_za3rmp$(item_0); - } - } - return _.kotlin.collections.optimizeReadOnlyList(list); - }, dropLast_3iu80n$:function($receiver, n) { - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - return _.kotlin.collections.take_cwv5p1$($receiver, _.kotlin.ranges.coerceAtLeast_rksjo2$($receiver.size - n, 0)); - }, dropLastWhile_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropLastWhile_ymzesn$", function($receiver, predicate) { - if (!$receiver.isEmpty()) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - if (!predicate(iterator.previous())) { - return _.kotlin.collections.take_cwv5p1$($receiver, iterator.nextIndex() + 1); - } - } - } - return _.kotlin.collections.emptyList(); - }), dropWhile_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.dropWhile_udlcbx$", function($receiver, predicate) { - var tmp$0; - var yielding = false; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (yielding) { - list.add_za3rmp$(item); - } else { - if (!predicate(item)) { - list.add_za3rmp$(item); - yielding = true; - } - } - } - return list; - }), filter_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_udlcbx$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterIndexed_6wagxu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexed_6wagxu$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIndexedTo_ej6hz7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIndexedTo_ej6hz7$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIsInstance_q5oq31$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIsInstance_q5oq31$", function(isR, $receiver) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (element == null || isR(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterIsInstanceTo_xc5ofo$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterIsInstanceTo_xc5ofo$", function(isR, $receiver, destination) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (isR(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_udlcbx$", function($receiver, predicate) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNotNull_q5oq31$:function($receiver) { - return _.kotlin.collections.filterNotNullTo_xc5ofo$($receiver, new Kotlin.ArrayList); - }, filterNotNullTo_xc5ofo$:function($receiver, destination) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (element != null) { - destination.add_za3rmp$(element); - } - } - return destination; - }, filterNotTo_u1o9so$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_u1o9so$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_u1o9so$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_u1o9so$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), slice_smmin4$:function($receiver, indices) { - if (indices.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - return _.kotlin.collections.toList_q5oq31$($receiver.subList_vux9f0$(indices.start, indices.endInclusive + 1)); - }, slice_5fse6p$:function($receiver, indices) { - var tmp$0; - var size = _.kotlin.collections.collectionSizeOrDefault(indices, 10); - if (size === 0) { - return _.kotlin.collections.emptyList(); - } - var list = new Kotlin.ArrayList(size); - tmp$0 = indices.iterator(); - while (tmp$0.hasNext()) { - var index = tmp$0.next(); - list.add_za3rmp$($receiver.get_za3lpa$(index)); - } - return list; - }, take_cwv5p1$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - if (n >= $receiver.size) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$(_.kotlin.collections.first_q5oq31$($receiver)); - } - } - var count = 0; - var list = new Kotlin.ArrayList(n); - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (count++ === n) { - break; - } - list.add_za3rmp$(item); - } - return _.kotlin.collections.optimizeReadOnlyList(list); - }, takeLast_3iu80n$:function($receiver, n) { - var tmp$0, tmp$1, tmp$2; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - return _.kotlin.collections.emptyList(); - } - var size = $receiver.size; - if (n >= size) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - if (n === 1) { - return _.kotlin.collections.listOf_za3rmp$(_.kotlin.collections.last_a7ptmv$($receiver)); - } - var list = new Kotlin.ArrayList(n); - if (Kotlin.isType($receiver, Kotlin.RandomAccess)) { - tmp$0 = size - n; - tmp$1 = size - 1; - for (var index = tmp$0;index <= tmp$1;index++) { - list.add_za3rmp$($receiver.get_za3lpa$(index)); - } - } else { - tmp$2 = _.kotlin.collections.iterator_123wqf$($receiver.listIterator_za3lpa$(n)); - while (tmp$2.hasNext()) { - var item = tmp$2.next(); - list.add_za3rmp$(item); - } - } - return list; - }, takeLastWhile_ymzesn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeLastWhile_ymzesn$", function($receiver, predicate) { - if ($receiver.isEmpty()) { - return _.kotlin.collections.emptyList(); - } - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - if (!predicate(iterator.previous())) { - iterator.next(); - var expectedSize = $receiver.size - iterator.nextIndex(); - if (expectedSize === 0) { - return _.kotlin.collections.emptyList(); - } - var $receiver_0 = new Kotlin.ArrayList(expectedSize); - while (iterator.hasNext()) { - $receiver_0.add_za3rmp$(iterator.next()); - } - return $receiver_0; - } - } - return _.kotlin.collections.toList_q5oq31$($receiver); - }), takeWhile_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.takeWhile_udlcbx$", function($receiver, predicate) { - var tmp$0; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (!predicate(item)) { - break; - } - list.add_za3rmp$(item); - } - return list; - }), reverse_sqtfhv$:function($receiver) { - _.java.util.Collections.reverse_heioe9$($receiver); - }, reversed_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection) && $receiver.size <= 1) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var list = _.kotlin.collections.toMutableList_q5oq31$($receiver); - _.java.util.Collections.reverse_heioe9$(list); - return list; - }, sortBy_an8rl9$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortBy_an8rl9$", function($receiver, selector) { - if ($receiver.size > 1) { - _.kotlin.collections.sortWith_lcufbu$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - } - }), sortByDescending_an8rl9$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortByDescending_an8rl9$", function($receiver, selector) { - if ($receiver.size > 1) { - _.kotlin.collections.sortWith_lcufbu$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - } - }), sortDescending_h06zi1$:function($receiver) { - _.kotlin.collections.sortWith_lcufbu$($receiver, _.kotlin.comparisons.reverseOrder()); - }, sorted_349qs3$:function($receiver) { - var tmp$0; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - if ($receiver.size <= 1) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var $receiver_0 = Array.isArray(tmp$0 = Kotlin.copyToArray($receiver)) ? tmp$0 : Kotlin.throwCCE(); - _.kotlin.collections.sort_ehvuiv$($receiver_0); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - } - var $receiver_1 = _.kotlin.collections.toMutableList_q5oq31$($receiver); - _.kotlin.collections.sort_h06zi1$($receiver_1); - return $receiver_1; - }, sortedBy_l82ugp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedBy_l82ugp$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_7dpn5g$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedByDescending_l82ugp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sortedByDescending_l82ugp$", function($receiver, selector) { - return _.kotlin.collections.sortedWith_7dpn5g$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedDescending_349qs3$:function($receiver) { - return _.kotlin.collections.sortedWith_7dpn5g$($receiver, _.kotlin.comparisons.reverseOrder()); - }, sortedWith_7dpn5g$:function($receiver, comparator) { - var tmp$0; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - if ($receiver.size <= 1) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var $receiver_0 = Array.isArray(tmp$0 = Kotlin.copyToArray($receiver)) ? tmp$0 : Kotlin.throwCCE(); - _.kotlin.collections.sortWith_pf0rc$($receiver_0, comparator); - return _.kotlin.collections.asList_eg9ybj$($receiver_0); - } - var $receiver_1 = _.kotlin.collections.toMutableList_q5oq31$($receiver); - _.kotlin.collections.sortWith_lcufbu$($receiver_1, comparator); - return $receiver_1; - }, toBooleanArray_82yf0d$:function($receiver) { - var tmp$0; - var result = Kotlin.booleanArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toByteArray_lg9v1$:function($receiver) { - var tmp$0; - var result = Kotlin.numberArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toCharArray_stj23$:function($receiver) { - var tmp$0; - var result = Kotlin.charArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toDoubleArray_d8u8cq$:function($receiver) { - var tmp$0; - var result = Kotlin.numberArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toFloatArray_2vwy1$:function($receiver) { - var tmp$0; - var result = Kotlin.numberArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toIntArray_n17x8q$:function($receiver) { - var tmp$0; - var result = Kotlin.numberArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toLongArray_56arfl$:function($receiver) { - var tmp$0; - var result = Kotlin.longArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toShortArray_o8y0rt$:function($receiver) { - var tmp$0; - var result = Kotlin.numberArrayOfSize($receiver.size); - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, associate_l9f2x3$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associate_l9f2x3$", function($receiver, transform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateBy_fcza0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_fcza0h$", function($receiver, keySelector) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_qadzix$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateBy_qadzix$", function($receiver, keySelector, valueTransform) { - var capacity = _.kotlin.ranges.coerceAtLeast_rksjo2$(_.kotlin.collections.mapCapacity(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)), 16); - var destination = new Kotlin.LinkedHashMap(capacity); - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_57hlw1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_57hlw1$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_8dch1j$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateByTo_8dch1j$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateTo_j5xf4p$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.associateTo_j5xf4p$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), toCollection_xc5ofo$:function($receiver, destination) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toHashSet_q5oq31$:function($receiver) { - return _.kotlin.collections.toCollection_xc5ofo$($receiver, new Kotlin.ComplexHashSet(_.kotlin.collections.mapCapacity(_.kotlin.collections.collectionSizeOrDefault($receiver, 12)))); - }, toList_q5oq31$:function($receiver) { - var tmp$0, tmp$1; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.listOf_za3rmp$(Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List) ? $receiver.get_za3lpa$(0) : $receiver.iterator().next()); - } else { - tmp$1 = _.kotlin.collections.toMutableList_mwto7b$($receiver); - } - } - return tmp$1; - } - return _.kotlin.collections.optimizeReadOnlyList(_.kotlin.collections.toMutableList_q5oq31$($receiver)); - }, toMutableList_q5oq31$:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return _.kotlin.collections.toMutableList_mwto7b$($receiver); - } - return _.kotlin.collections.toCollection_xc5ofo$($receiver, new Kotlin.ArrayList); - }, toMutableList_mwto7b$:function($receiver) { - return _.java.util.ArrayList_wtfk93$($receiver); - }, toSet_q5oq31$:function($receiver) { - var tmp$0, tmp$1; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.setOf_za3rmp$(Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List) ? $receiver.get_za3lpa$(0) : $receiver.iterator().next()); - } else { - tmp$1 = _.kotlin.collections.toCollection_xc5ofo$($receiver, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.size))); - } - } - return tmp$1; - } - return _.kotlin.collections.optimizeReadOnlySet(_.kotlin.collections.toCollection_xc5ofo$($receiver, new Kotlin.LinkedHashSet)); - }, flatMap_pwhhp2$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_pwhhp2$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_k30zm7$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_k30zm7$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), groupBy_fcza0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_fcza0h$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_qadzix$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupBy_qadzix$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_i7ktse$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_i7ktse$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_t445s6$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.groupByTo_t445s6$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), map_fcza0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_fcza0h$", function($receiver, transform) { - var destination = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)); - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapIndexed_kgzjie$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexed_kgzjie$", function($receiver, transform) { - var destination = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)); - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapIndexedNotNull_kgzjie$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedNotNull_kgzjie$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapIndexedNotNullTo_9rrt4x$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedNotNullTo_9rrt4x$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapIndexedTo_9rrt4x$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapIndexedTo_9rrt4x$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapNotNull_fcza0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapNotNull_fcza0h$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapNotNullTo_nzn0z0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapNotNullTo_nzn0z0$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapTo_nzn0z0$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_nzn0z0$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), withIndex_q5oq31$f:function(this$withIndex) { - return function() { - return this$withIndex.iterator(); - }; - }, withIndex_q5oq31$:function($receiver) { - return new _.kotlin.collections.IndexingIterable(_.kotlin.collections.withIndex_q5oq31$f($receiver)); - }, distinct_q5oq31$:function($receiver) { - return _.kotlin.collections.toList_q5oq31$(_.kotlin.collections.toMutableSet_q5oq31$($receiver)); - }, distinctBy_fcza0h$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.distinctBy_fcza0h$", function($receiver, selector) { - var tmp$0; - var set = new Kotlin.ComplexHashSet; - var list = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var e = tmp$0.next(); - var key = selector(e); - if (set.add_za3rmp$(key)) { - list.add_za3rmp$(e); - } - } - return list; - }), intersect_71wgqg$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_q5oq31$($receiver); - _.kotlin.collections.retainAll_fwwv5a$(set, other); - return set; - }, subtract_71wgqg$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_q5oq31$($receiver); - _.kotlin.collections.removeAll_fwwv5a$(set, other); - return set; - }, toMutableSet_q5oq31$:function($receiver) { - var tmp$0; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - tmp$0 = _.java.util.LinkedHashSet_wtfk93$($receiver); - } else { - tmp$0 = _.kotlin.collections.toCollection_xc5ofo$($receiver, new Kotlin.LinkedHashSet); - } - return tmp$0; - }, union_71wgqg$:function($receiver, other) { - var set = _.kotlin.collections.toMutableSet_q5oq31$($receiver); - _.kotlin.collections.addAll_fwwv5a$(set, other); - return set; - }, all_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_udlcbx$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), any_q5oq31$:function($receiver) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_udlcbx$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), count_q5oq31$:function($receiver) { - var tmp$0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - count++; - } - return count; - }, count_mwto7b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_mwto7b$", function($receiver) { - return $receiver.size; - }), count_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_udlcbx$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), fold_x36ydg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.fold_x36ydg$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), foldIndexed_a212pb$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldIndexed_a212pb$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), foldRight_18gea8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRight_18gea8$", function($receiver, initial, operation) { - var accumulator = initial; - if (!$receiver.isEmpty()) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - accumulator = operation(iterator.previous(), accumulator); - } - } - return accumulator; - }), foldRightIndexed_77874r$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.foldRightIndexed_77874r$", function($receiver, initial, operation) { - var accumulator = initial; - if (!$receiver.isEmpty()) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - while (iterator.hasPrevious()) { - var index = iterator.previousIndex(); - accumulator = operation(index, iterator.previous(), accumulator); - } - } - return accumulator; - }), forEach_lcecrh$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_lcecrh$", function($receiver, action) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEachIndexed_4yeaaa$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEachIndexed_4yeaaa$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), max_349qs3$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var max = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (Kotlin.compareTo(max, e) < 0) { - max = e; - } - } - return max; - }, maxBy_l82ugp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_l82ugp$", function($receiver, selector) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var maxElem = iterator.next(); - var maxValue = selector(maxElem); - while (iterator.hasNext()) { - var e = iterator.next(); - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxWith_7dpn5g$:function($receiver, comparator) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var max = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, min_349qs3$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var min = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (Kotlin.compareTo(min, e) > 0) { - min = e; - } - } - return min; - }, minBy_l82ugp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_l82ugp$", function($receiver, selector) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var minElem = iterator.next(); - var minValue = selector(minElem); - while (iterator.hasNext()) { - var e = iterator.next(); - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minWith_7dpn5g$:function($receiver, comparator) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var min = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, none_q5oq31$:function($receiver) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_udlcbx$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), reduce_fsnvh9$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduce_fsnvh9$", function($receiver, operation) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.UnsupportedOperationException("Empty collection can't be reduced."); - } - var accumulator = iterator.next(); - while (iterator.hasNext()) { - accumulator = operation(accumulator, iterator.next()); - } - return accumulator; - }), reduceIndexed_3edsso$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceIndexed_3edsso$", function($receiver, operation) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.UnsupportedOperationException("Empty collection can't be reduced."); - } - var index = 1; - var accumulator = iterator.next(); - while (iterator.hasNext()) { - accumulator = operation(index++, accumulator, iterator.next()); - } - return accumulator; - }), reduceRight_mue0zz$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRight_mue0zz$", function($receiver, operation) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - if (!iterator.hasPrevious()) { - throw new Kotlin.UnsupportedOperationException("Empty list can't be reduced."); - } - var accumulator = iterator.previous(); - while (iterator.hasPrevious()) { - accumulator = operation(iterator.previous(), accumulator); - } - return accumulator; - }), reduceRightIndexed_4tyq1o$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.reduceRightIndexed_4tyq1o$", function($receiver, operation) { - var iterator = $receiver.listIterator_za3lpa$($receiver.size); - if (!iterator.hasPrevious()) { - throw new Kotlin.UnsupportedOperationException("Empty list can't be reduced."); - } - var accumulator = iterator.previous(); - while (iterator.hasPrevious()) { - var index = iterator.previousIndex(); - accumulator = operation(index, iterator.previous(), accumulator); - } - return accumulator; - }), sumBy_fcu68k$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumBy_fcu68k$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_jaowxc$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.sumByDouble_jaowxc$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), requireNoNulls_q5oq31$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (element == null) { - throw new Kotlin.IllegalArgumentException("null element found in " + $receiver + "."); - } - } - return Kotlin.isType(tmp$1 = $receiver, Kotlin.modules["builtins"].kotlin.collections.Iterable) ? tmp$1 : Kotlin.throwCCE(); - }, requireNoNulls_a7ptmv$:function($receiver) { - var tmp$0, tmp$1; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (element == null) { - throw new Kotlin.IllegalArgumentException("null element found in " + $receiver + "."); - } - } - return Kotlin.isType(tmp$1 = $receiver, Kotlin.modules["builtins"].kotlin.collections.List) ? tmp$1 : Kotlin.throwCCE(); - }, minus_cwuzrm$:function($receiver, element) { - var result = new Kotlin.ArrayList(_.kotlin.collections.collectionSizeOrDefault($receiver, 10)); - var removed = {v:false}; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element_0 = tmp$0.next(); - var predicate$result; - if (!removed.v && Kotlin.equals(element_0, element)) { - removed.v = true; - predicate$result = false; - } else { - predicate$result = true; - } - if (predicate$result) { - result.add_za3rmp$(element_0); - } - } - return result; - }, minus_uspeym$:function($receiver, elements) { - if (elements.length === 0) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var other = _.kotlin.collections.toHashSet_eg9ybj$(elements); - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!other.contains_za3rmp$(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }, minus_71wgqg$:function($receiver, elements) { - var other = _.kotlin.collections.convertToSetForSetOperationWith(elements, $receiver); - if (other.isEmpty()) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!other.contains_za3rmp$(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }, minus_81az5y$:function($receiver, elements) { - var other = _.kotlin.sequences.toHashSet_uya9q7$(elements); - if (other.isEmpty()) { - return _.kotlin.collections.toList_q5oq31$($receiver); - } - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!other.contains_za3rmp$(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }, minusElement_cwuzrm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minusElement_cwuzrm$", function($receiver, element) { - return _.kotlin.collections.minus_cwuzrm$($receiver, element); - }), partition_udlcbx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.partition_udlcbx$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), plus_cwuzrm$:function($receiver, element) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return _.kotlin.collections.plus_ukps2u$($receiver, element); - } - var result = new Kotlin.ArrayList; - _.kotlin.collections.addAll_fwwv5a$(result, $receiver); - result.add_za3rmp$(element); - return result; - }, plus_ukps2u$:function($receiver, element) { - var result = new Kotlin.ArrayList($receiver.size + 1); - result.addAll_wtfk93$($receiver); - result.add_za3rmp$(element); - return result; - }, plus_uspeym$:function($receiver, elements) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return _.kotlin.collections.plus_b3ixii$($receiver, elements); - } - var result = new Kotlin.ArrayList; - _.kotlin.collections.addAll_fwwv5a$(result, $receiver); - _.kotlin.collections.addAll_jzhv38$(result, elements); - return result; - }, plus_b3ixii$:function($receiver, elements) { - var result = new Kotlin.ArrayList($receiver.size + elements.length); - result.addAll_wtfk93$($receiver); - _.kotlin.collections.addAll_jzhv38$(result, elements); - return result; - }, plus_71wgqg$:function($receiver, elements) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return _.kotlin.collections.plus_hfjk0c$($receiver, elements); - } - var result = new Kotlin.ArrayList; - _.kotlin.collections.addAll_fwwv5a$(result, $receiver); - _.kotlin.collections.addAll_fwwv5a$(result, elements); - return result; - }, plus_hfjk0c$:function($receiver, elements) { - if (Kotlin.isType(elements, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - var result = new Kotlin.ArrayList($receiver.size + elements.size); - result.addAll_wtfk93$($receiver); - result.addAll_wtfk93$(elements); - return result; - } else { - var result_0 = _.java.util.ArrayList_wtfk93$($receiver); - _.kotlin.collections.addAll_fwwv5a$(result_0, elements); - return result_0; - } - }, plus_81az5y$:function($receiver, elements) { - var result = new Kotlin.ArrayList; - _.kotlin.collections.addAll_fwwv5a$(result, $receiver); - _.kotlin.collections.addAll_h3qeu8$(result, elements); - return result; - }, plus_9axfq2$:function($receiver, elements) { - var result = new Kotlin.ArrayList($receiver.size + 10); - result.addAll_wtfk93$($receiver); - _.kotlin.collections.addAll_h3qeu8$(result, elements); - return result; - }, plusElement_cwuzrm$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusElement_cwuzrm$", function($receiver, element) { - return _.kotlin.collections.plus_cwuzrm$($receiver, element); - }), plusElement_ukps2u$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusElement_ukps2u$", function($receiver, element) { - return _.kotlin.collections.plus_ukps2u$($receiver, element); - }), zip_uspeym$:function($receiver, other) { - var tmp$0; - var arraySize = other.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault($receiver, 10), arraySize)); - var i = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(_.kotlin.to_l1ob02$(element, other[i++])); - } - return list; - }, zip_6hx15g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_6hx15g$", function($receiver, other, transform) { - var tmp$0; - var arraySize = other.length; - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault($receiver, 10), arraySize)); - var i = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (i >= arraySize) { - break; - } - list.add_za3rmp$(transform(element, other[i++])); - } - return list; - }), zip_71wgqg$:function($receiver, other) { - var first = $receiver.iterator(); - var second = other.iterator(); - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault($receiver, 10), _.kotlin.collections.collectionSizeOrDefault(other, 10))); - while (first.hasNext() && second.hasNext()) { - list.add_za3rmp$(_.kotlin.to_l1ob02$(first.next(), second.next())); - } - return list; - }, zip_aqs41e$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.zip_aqs41e$", function($receiver, other, transform) { - var first = $receiver.iterator(); - var second = other.iterator(); - var list = new Kotlin.ArrayList(Math.min(_.kotlin.collections.collectionSizeOrDefault($receiver, 10), _.kotlin.collections.collectionSizeOrDefault(other, 10))); - while (first.hasNext() && second.hasNext()) { - list.add_za3rmp$(transform(first.next(), second.next())); - } - return list; - }), joinTo_euycuk$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element == null ? "null" : element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinToString_ld60a2$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.collections.joinTo_euycuk$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, asIterable_q5oq31$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asIterable_q5oq31$", function($receiver) { - return $receiver; - }), asSequence_q5oq31$f:function(this$asSequence) { - return function() { - return this$asSequence.iterator(); - }; - }, asSequence_q5oq31$:function($receiver) { - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_q5oq31$f($receiver)); - }, average_sx0vjz$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_fr8z0d$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_q1ah1m$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_oc6dzf$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_8et4tf$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_y4pxme$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, sum_sx0vjz$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_fr8z0d$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_q1ah1m$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_oc6dzf$:function($receiver) { - var tmp$0; - var sum = Kotlin.Long.ZERO; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum = sum.add(element); - } - return sum; - }, sum_8et4tf$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_y4pxme$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, toList_efxzmg$:function($receiver) { - if ($receiver.size === 0) { - return _.kotlin.collections.emptyList(); - } - var iterator = $receiver.entries.iterator(); - if (!iterator.hasNext()) { - return _.kotlin.collections.emptyList(); - } - var first = iterator.next(); - if (!iterator.hasNext()) { - return _.kotlin.collections.listOf_za3rmp$(new _.kotlin.Pair(first.key, first.value)); - } - var result = new Kotlin.ArrayList($receiver.size); - result.add_za3rmp$(new _.kotlin.Pair(first.key, first.value)); - do { - var $receiver_2 = iterator.next(); - result.add_za3rmp$(new _.kotlin.Pair($receiver_2.key, $receiver_2.value)); - } while (iterator.hasNext()); - return result; - }, flatMap_yh70lg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMap_yh70lg$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), flatMapTo_5n3275$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.flatMapTo_5n3275$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_fwwv5a$(destination, list); - } - return destination; - }), map_e1k39z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.map_e1k39z$", function($receiver, transform) { - var destination = new Kotlin.ArrayList($receiver.size); - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), mapNotNull_e1k39z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapNotNull_e1k39z$", function($receiver, transform) { - var destination = new Kotlin.ArrayList; - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapNotNullTo_v1ibx8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapNotNullTo_v1ibx8$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapTo_v1ibx8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapTo_v1ibx8$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), all_oixulp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.all_oixulp$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), any_efxzmg$:function($receiver) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_oixulp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.any_oixulp$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), count_efxzmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_efxzmg$", function($receiver) { - return $receiver.size; - }), count_oixulp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.count_oixulp$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), forEach_8umwe5$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_8umwe5$", function($receiver, action) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), maxBy_dubjrn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxBy_dubjrn$", function($receiver, selector) { - var iterator = $receiver.entries.iterator(); - if (!iterator.hasNext()) { - return null; - } - var maxElem = iterator.next(); - var maxValue = selector(maxElem); - while (iterator.hasNext()) { - var e = iterator.next(); - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxWith_9gigyu$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.maxWith_9gigyu$", function($receiver, comparator) { - return _.kotlin.collections.maxWith_7dpn5g$($receiver.entries, comparator); - }), minBy_dubjrn$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minBy_dubjrn$", function($receiver, selector) { - var iterator = $receiver.entries.iterator(); - if (!iterator.hasNext()) { - return null; - } - var minElem = iterator.next(); - var minValue = selector(minElem); - while (iterator.hasNext()) { - var e = iterator.next(); - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minWith_9gigyu$:function($receiver, comparator) { - return _.kotlin.collections.minWith_7dpn5g$($receiver.entries, comparator); - }, none_efxzmg$:function($receiver) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_oixulp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.none_oixulp$", function($receiver, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), asIterable_efxzmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.asIterable_efxzmg$", function($receiver) { - return $receiver.entries; - }), asSequence_efxzmg$f:function(this$asSequence) { - return function() { - return this$asSequence.entries.iterator(); - }; - }, asSequence_efxzmg$:function($receiver) { - return new _.kotlin.sequences.Sequence$f(_.kotlin.collections.asSequence_efxzmg$f($receiver)); - }, minus_bfnyky$:function($receiver, element) { - var result = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.size)); - var removed = {v:false}; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element_0 = tmp$0.next(); - var predicate$result; - if (!removed.v && Kotlin.equals(element_0, element)) { - removed.v = true; - predicate$result = false; - } else { - predicate$result = true; - } - if (predicate$result) { - result.add_za3rmp$(element_0); - } - } - return result; - }, minus_bs0yn6$:function($receiver, elements) { - var result = _.java.util.LinkedHashSet_wtfk93$($receiver); - _.kotlin.collections.removeAll_jzhv38$(result, elements); - return result; - }, minus_rp2n1o$:function($receiver, elements) { - var other = _.kotlin.collections.convertToSetForSetOperationWith(elements, $receiver); - if (other.isEmpty()) { - return _.kotlin.collections.toSet_q5oq31$($receiver); - } - if (Kotlin.isType(other, Kotlin.modules["builtins"].kotlin.collections.Set)) { - var destination = new Kotlin.LinkedHashSet; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!other.contains_za3rmp$(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - } - var result = _.java.util.LinkedHashSet_wtfk93$($receiver); - result.removeAll_wtfk93$(other); - return result; - }, minus_w7ip9a$:function($receiver, elements) { - var result = _.java.util.LinkedHashSet_wtfk93$($receiver); - _.kotlin.collections.removeAll_h3qeu8$(result, elements); - return result; - }, minusElement_bfnyky$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minusElement_bfnyky$", function($receiver, element) { - return _.kotlin.collections.minus_bfnyky$($receiver, element); - }), plus_bfnyky$:function($receiver, element) { - var result = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.size + 1)); - result.addAll_wtfk93$($receiver); - result.add_za3rmp$(element); - return result; - }, plus_bs0yn6$:function($receiver, elements) { - var result = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.size + elements.length)); - result.addAll_wtfk93$($receiver); - _.kotlin.collections.addAll_jzhv38$(result, elements); - return result; - }, plus_rp2n1o$:function($receiver, elements) { - var tmp$0, tmp$1; - var result = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity((tmp$1 = (tmp$0 = _.kotlin.collections.collectionSizeOrNull(elements)) != null ? $receiver.size + tmp$0 : null) != null ? tmp$1 : $receiver.size * 2)); - result.addAll_wtfk93$($receiver); - _.kotlin.collections.addAll_fwwv5a$(result, elements); - return result; - }, plus_w7ip9a$:function($receiver, elements) { - var result = new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity($receiver.size * 2)); - result.addAll_wtfk93$($receiver); - _.kotlin.collections.addAll_h3qeu8$(result, elements); - return result; - }, plusElement_bfnyky$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusElement_bfnyky$", function($receiver, element) { - return _.kotlin.collections.plus_bfnyky$($receiver, element); - }), State:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{Ready:function() { - return new _.kotlin.collections.State; - }, NotReady:function() { - return new _.kotlin.collections.State; - }, Done:function() { - return new _.kotlin.collections.State; - }, Failed:function() { - return new _.kotlin.collections.State; - }}; - }), AbstractIterator:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function() { - this.state_v5kh2x$ = _.kotlin.collections.State.NotReady; - this.nextValue_tlc62$ = null; - }, {hasNext:function() { - var tmp$0, tmp$1; - if (!(this.state_v5kh2x$ !== _.kotlin.collections.State.Failed)) { - var message = "Failed requirement."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - tmp$0 = this.state_v5kh2x$; - if (Kotlin.equals(tmp$0, _.kotlin.collections.State.Done)) { - tmp$1 = false; - } else { - if (Kotlin.equals(tmp$0, _.kotlin.collections.State.Ready)) { - tmp$1 = true; - } else { - tmp$1 = this.tryToComputeNext(); - } - } - return tmp$1; - }, next:function() { - var tmp$0; - if (!this.hasNext()) { - throw new Kotlin.NoSuchElementException; - } - this.state_v5kh2x$ = _.kotlin.collections.State.NotReady; - return(tmp$0 = this.nextValue_tlc62$) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - }, tryToComputeNext:function() { - this.state_v5kh2x$ = _.kotlin.collections.State.Failed; - this.computeNext(); - return this.state_v5kh2x$ === _.kotlin.collections.State.Ready; - }, setNext_za3rmp$:function(value) { - this.nextValue_tlc62$ = value; - this.state_v5kh2x$ = _.kotlin.collections.State.Ready; - }, done:function() { - this.state_v5kh2x$ = _.kotlin.collections.State.Done; - }}), orEmpty_eg9ybj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.orEmpty_eg9ybj$", function(isT, $receiver) { - return $receiver != null ? $receiver : []; - }), flatten_vrdqc4$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var tmp$6, tmp$4, tmp$5; - var sum = 0; - tmp$6 = $receiver, tmp$4 = tmp$6.length; - for (var tmp$5 = 0;tmp$5 !== tmp$4;++tmp$5) { - var element_0 = tmp$6[tmp$5]; - sum += element_0.length; - } - var result = new Kotlin.ArrayList(sum); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - _.kotlin.collections.addAll_jzhv38$(result, element); - } - return result; - }, unzip_sq63gn$:function($receiver) { - var tmp$0, tmp$1, tmp$2; - var listT = new Kotlin.ArrayList($receiver.length); - var listR = new Kotlin.ArrayList($receiver.length); - tmp$0 = $receiver, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var pair = tmp$0[tmp$2]; - listT.add_za3rmp$(pair.first); - listR.add_za3rmp$(pair.second); - } - return _.kotlin.to_l1ob02$(listT, listR); - }, EmptyIterator:Kotlin.createObject(function() { - return[Kotlin.modules["builtins"].kotlin.collections.ListIterator]; - }, null, {hasNext:function() { - return false; - }, hasPrevious:function() { - return false; - }, nextIndex:function() { - return 0; - }, previousIndex:function() { - return-1; - }, next:function() { - throw new Kotlin.NoSuchElementException; - }, previous:function() { - throw new Kotlin.NoSuchElementException; - }}), EmptyList:Kotlin.createObject(function() { - return[Kotlin.RandomAccess, _.java.io.Serializable, Kotlin.modules["builtins"].kotlin.collections.List]; - }, function() { - this.serialVersionUID_jwftuz$ = new Kotlin.Long(-1478467534, -1720727600); - }, {equals_za3rmp$:function(other) { - return Kotlin.isType(other, Kotlin.modules["builtins"].kotlin.collections.List) && other.isEmpty(); - }, hashCode:function() { - return 1; - }, toString:function() { - return "[]"; - }, size:{get:function() { - return 0; - }}, isEmpty:function() { - return true; - }, contains_za3rmp$:function(element) { - return false; - }, containsAll_wtfk93$:function(elements) { - return elements.isEmpty(); - }, get_za3lpa$:function(index) { - throw new Kotlin.IndexOutOfBoundsException("Empty list doesn't contain element at index " + index + "."); - }, indexOf_za3rmp$:function(element) { - return-1; - }, lastIndexOf_za3rmp$:function(element) { - return-1; - }, iterator:function() { - return _.kotlin.collections.EmptyIterator; - }, listIterator:function() { - return _.kotlin.collections.EmptyIterator; - }, listIterator_za3lpa$:function(index) { - if (index !== 0) { - throw new Kotlin.IndexOutOfBoundsException("Index: " + index); - } - return _.kotlin.collections.EmptyIterator; - }, subList_vux9f0$:function(fromIndex, toIndex) { - if (fromIndex === 0 && toIndex === 0) { - return this; - } - throw new Kotlin.IndexOutOfBoundsException("fromIndex: " + fromIndex + ", toIndex: " + toIndex); - }, readResolve:function() { - return _.kotlin.collections.EmptyList; - }}), asCollection:function($receiver) { - return new _.kotlin.collections.ArrayAsCollection($receiver, false); - }, ArrayAsCollection:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Collection]; - }, function(values, isVarargs) { - this.values = values; - this.isVarargs = isVarargs; - }, {size:{get:function() { - return this.values.length; - }}, isEmpty:function() { - return this.values.length === 0; - }, contains_za3rmp$:function(element) { - return _.kotlin.collections.contains_ke19y6$(this.values, element); - }, containsAll_wtfk93$:function(elements) { - var tmp$0; - tmp$0 = elements.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!this.contains_za3rmp$(element)) { - return false; - } - } - return true; - }, iterator:function() { - return Kotlin.arrayIterator(this.values); - }, toArray:function() { - var $receiver = this.values; - return this.isVarargs ? $receiver : $receiver.slice(); - }}, {}), emptyList:function() { - return _.kotlin.collections.EmptyList; - }, listOf_9mqe4v$:function(elements) { - return elements.length > 0 ? _.kotlin.collections.asList_eg9ybj$(elements) : _.kotlin.collections.emptyList(); - }, listOf:Kotlin.defineInlineFunction("stdlib.kotlin.collections.listOf", function() { - return _.kotlin.collections.emptyList(); - }), mutableListOf_9mqe4v$:function(elements) { - return elements.length === 0 ? new Kotlin.ArrayList : _.java.util.ArrayList_wtfk93$(new _.kotlin.collections.ArrayAsCollection(elements, true)); - }, arrayListOf_9mqe4v$:function(elements) { - return elements.length === 0 ? new Kotlin.ArrayList : _.java.util.ArrayList_wtfk93$(new _.kotlin.collections.ArrayAsCollection(elements, true)); - }, listOfNotNull_za3rmp$:function(element) { - return element != null ? _.kotlin.collections.listOf_za3rmp$(element) : _.kotlin.collections.emptyList(); - }, listOfNotNull_9mqe4v$:function(elements) { - return _.kotlin.collections.filterNotNull_eg9ybj$(elements); - }, get_indices_mwto7b$:{value:function($receiver) { - return new Kotlin.NumberRange(0, $receiver.size - 1); - }}, get_lastIndex_a7ptmv$:{value:function($receiver) { - return $receiver.size - 1; - }}, isNotEmpty_mwto7b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_mwto7b$", function($receiver) { - return!$receiver.isEmpty(); - }), orEmpty_mwto7b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.orEmpty_mwto7b$", function($receiver) { - return $receiver != null ? $receiver : _.kotlin.collections.emptyList(); - }), orEmpty_a7ptmv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.orEmpty_a7ptmv$", function($receiver) { - return $receiver != null ? $receiver : _.kotlin.collections.emptyList(); - }), containsAll_2px7j4$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.containsAll_2px7j4$", function($receiver, elements) { - return $receiver.containsAll_wtfk93$(elements); - }), optimizeReadOnlyList:function($receiver) { - var tmp$0; - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - return _.kotlin.collections.emptyList(); - } else { - if (tmp$0 === 1) { - return _.kotlin.collections.listOf_za3rmp$($receiver.get_za3lpa$(0)); - } else { - return $receiver; - } - } - }, binarySearch_i1wy23$:function($receiver, element, fromIndex, toIndex) { - if (fromIndex === void 0) { - fromIndex = 0; - } - if (toIndex === void 0) { - toIndex = $receiver.size; - } - _.kotlin.collections.rangeCheck($receiver.size, fromIndex, toIndex); - var low = fromIndex; - var high = toIndex - 1; - while (low <= high) { - var mid = low + high >>> 1; - var midVal = $receiver.get_za3lpa$(mid); - var cmp = _.kotlin.comparisons.compareValues_cj5vqg$(midVal, element); - if (cmp < 0) { - low = mid + 1; - } else { - if (cmp > 0) { - high = mid - 1; - } else { - return mid; - } - } - } - return-(low + 1); - }, binarySearch_1open$:function($receiver, element, comparator, fromIndex, toIndex) { - if (fromIndex === void 0) { - fromIndex = 0; - } - if (toIndex === void 0) { - toIndex = $receiver.size; - } - _.kotlin.collections.rangeCheck($receiver.size, fromIndex, toIndex); - var low = fromIndex; - var high = toIndex - 1; - while (low <= high) { - var mid = low + high >>> 1; - var midVal = $receiver.get_za3lpa$(mid); - var cmp = comparator.compare(midVal, element); - if (cmp < 0) { - low = mid + 1; - } else { - if (cmp > 0) { - high = mid - 1; - } else { - return mid; - } - } - } - return-(low + 1); - }, binarySearchBy_uuu8x$f:function(closure$selector, closure$key) { - return function(it) { - return _.kotlin.comparisons.compareValues_cj5vqg$(closure$selector(it), closure$key); - }; - }, binarySearchBy_uuu8x$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.binarySearchBy_uuu8x$", function($receiver, key, fromIndex, toIndex, selector) { - if (fromIndex === void 0) { - fromIndex = 0; - } - if (toIndex === void 0) { - toIndex = $receiver.size; - } - return _.kotlin.collections.binarySearch_e4ogxs$($receiver, fromIndex, toIndex, _.kotlin.collections.binarySearchBy_uuu8x$f(selector, key)); - }), binarySearch_e4ogxs$:function($receiver, fromIndex, toIndex, comparison) { - if (fromIndex === void 0) { - fromIndex = 0; - } - if (toIndex === void 0) { - toIndex = $receiver.size; - } - _.kotlin.collections.rangeCheck($receiver.size, fromIndex, toIndex); - var low = fromIndex; - var high = toIndex - 1; - while (low <= high) { - var mid = low + high >>> 1; - var midVal = $receiver.get_za3lpa$(mid); - var cmp = comparison(midVal); - if (cmp < 0) { - low = mid + 1; - } else { - if (cmp > 0) { - high = mid - 1; - } else { - return mid; - } - } - } - return-(low + 1); - }, rangeCheck:function(size, fromIndex, toIndex) { - if (fromIndex > toIndex) { - throw new Kotlin.IllegalArgumentException("fromIndex (" + fromIndex + ") is greater than toIndex (" + toIndex + ")."); - } else { - if (fromIndex < 0) { - throw new Kotlin.IndexOutOfBoundsException("fromIndex (" + fromIndex + ") is less than zero."); - } else { - if (toIndex > size) { - throw new Kotlin.IndexOutOfBoundsException("toIndex (" + toIndex + ") is greater than size (" + size + ")."); - } - } - } - }, IndexedValue:Kotlin.createClass(null, function(index, value) { - this.index = index; - this.value = value; - }, {component1:function() { - return this.index; - }, component2:function() { - return this.value; - }, copy_vux3hl$:function(index, value) { - return new _.kotlin.collections.IndexedValue(index === void 0 ? this.index : index, value === void 0 ? this.value : value); - }, toString:function() { - return "IndexedValue(index\x3d" + Kotlin.toString(this.index) + (", value\x3d" + Kotlin.toString(this.value)) + ")"; - }, hashCode:function() { - var result = 0; - result = result * 31 + Kotlin.hashCode(this.index) | 0; - result = result * 31 + Kotlin.hashCode(this.value) | 0; - return result; - }, equals_za3rmp$:function(other) { - return this === other || other !== null && (typeof other === "object" && (Object.getPrototypeOf(this) === Object.getPrototypeOf(other) && (Kotlin.equals(this.index, other.index) && Kotlin.equals(this.value, other.value)))); - }}), Iterable$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(closure$iterator_0) { - this.closure$iterator_0 = closure$iterator_0; - }, {iterator:function() { - return this.closure$iterator_0(); - }}, {}), Iterable_kxhynv$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.Iterable_kxhynv$", function(iterator) { - return new _.kotlin.collections.Iterable$f(iterator); - }), IndexingIterable:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(iteratorFactory) { - this.iteratorFactory_fvkcba$ = iteratorFactory; - }, {iterator:function() { - return new _.kotlin.collections.IndexingIterator(this.iteratorFactory_fvkcba$()); - }}), collectionSizeOrNull:function($receiver) { - return Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection) ? $receiver.size : null; - }, collectionSizeOrDefault:function($receiver, default_0) { - return Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection) ? $receiver.size : default_0; - }, safeToConvertToSet:function($receiver) { - return $receiver.size > 2 && Kotlin.isType($receiver, Kotlin.ArrayList); - }, convertToSetForSetOperationWith:function($receiver, source) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Set)) { - return $receiver; - } else { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - if (Kotlin.isType(source, Kotlin.modules["builtins"].kotlin.collections.Collection) && source.size < 2) { - return $receiver; - } else { - return _.kotlin.collections.safeToConvertToSet($receiver) ? _.kotlin.collections.toHashSet_q5oq31$($receiver) : $receiver; - } - } else { - return _.kotlin.collections.toHashSet_q5oq31$($receiver); - } - } - }, convertToSetForSetOperation:function($receiver) { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Set)) { - return $receiver; - } else { - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return _.kotlin.collections.safeToConvertToSet($receiver) ? _.kotlin.collections.toHashSet_q5oq31$($receiver) : $receiver; - } else { - return _.kotlin.collections.toHashSet_q5oq31$($receiver); - } - } - }, flatten_ryy49w$:function($receiver) { - var tmp$0; - var result = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.addAll_fwwv5a$(result, element); - } - return result; - }, unzip_mnrzhp$:function($receiver) { - var tmp$0; - var expectedSize = _.kotlin.collections.collectionSizeOrDefault($receiver, 10); - var listT = new Kotlin.ArrayList(expectedSize); - var listR = new Kotlin.ArrayList(expectedSize); - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var pair = tmp$0.next(); - listT.add_za3rmp$(pair.first); - listR.add_za3rmp$(pair.second); - } - return _.kotlin.to_l1ob02$(listT, listR); - }, iterator_123wqf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.iterator_123wqf$", function($receiver) { - return $receiver; - }), withIndex_123wqf$:function($receiver) { - return new _.kotlin.collections.IndexingIterator($receiver); - }, forEach_3ydtzt$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.forEach_3ydtzt$", function($receiver, operation) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_123wqf$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - operation(element); - } - }), IndexingIterator:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(iterator) { - this.iterator_qhnuqw$ = iterator; - this.index_9l0vtk$ = 0; - }, {hasNext:function() { - return this.iterator_qhnuqw$.hasNext(); - }, next:function() { - return new _.kotlin.collections.IndexedValue(this.index_9l0vtk$++, this.iterator_qhnuqw$.next()); - }}), getValue_lromyx$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getValue_lromyx$", function($receiver, thisRef, property) { - var tmp$0; - return(tmp$0 = _.kotlin.collections.getOrImplicitDefault($receiver, property.name)) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - }), getValue_pmw3g1$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getValue_pmw3g1$", function($receiver, thisRef, property) { - var tmp$0; - return(tmp$0 = _.kotlin.collections.getOrImplicitDefault($receiver, property.name)) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - }), setValue_vfsqka$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.setValue_vfsqka$", function($receiver, thisRef, property, value) { - $receiver.put_wn2jw4$(property.name, value); - }), getOrImplicitDefault:function($receiver, key) { - if (Kotlin.isType($receiver, _.kotlin.collections.MapWithDefault)) { - return $receiver.getOrImplicitDefault_za3rmp$(key); - } - var tmp$0; - var value = $receiver.get_za3rmp$(key); - if (value == null && !$receiver.containsKey_za3rmp$(key)) { - throw new Kotlin.NoSuchElementException("Key " + key + " is missing in the map."); - } else { - return(tmp$0 = value) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - } - }, withDefault_86p62k$:function($receiver, defaultValue) { - if (Kotlin.isType($receiver, _.kotlin.collections.MapWithDefault)) { - return _.kotlin.collections.withDefault_86p62k$($receiver.map, defaultValue); - } else { - return new _.kotlin.collections.MapWithDefaultImpl($receiver, defaultValue); - } - }, withDefault_g6ll1e$:function($receiver, defaultValue) { - if (Kotlin.isType($receiver, _.kotlin.collections.MutableMapWithDefault)) { - return _.kotlin.collections.withDefault_g6ll1e$($receiver.map, defaultValue); - } else { - return new _.kotlin.collections.MutableMapWithDefaultImpl($receiver, defaultValue); - } - }, MapWithDefault:Kotlin.createTrait(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Map]; - }), MutableMapWithDefault:Kotlin.createTrait(function() { - return[_.kotlin.collections.MapWithDefault, Kotlin.modules["builtins"].kotlin.collections.MutableMap]; - }), MapWithDefaultImpl:Kotlin.createClass(function() { - return[_.kotlin.collections.MapWithDefault]; - }, function(map, default_0) { - this.$map_5wo5ir$ = map; - this.default_61dz8o$ = default_0; - }, {map:{get:function() { - return this.$map_5wo5ir$; - }}, equals_za3rmp$:function(other) { - return Kotlin.equals(this.map, other); - }, hashCode:function() { - return Kotlin.hashCode(this.map); - }, toString:function() { - return this.map.toString(); - }, size:{get:function() { - return this.map.size; - }}, isEmpty:function() { - return this.map.isEmpty(); - }, containsKey_za3rmp$:function(key) { - return this.map.containsKey_za3rmp$(key); - }, containsValue_za3rmp$:function(value) { - return this.map.containsValue_za3rmp$(value); - }, get_za3rmp$:function(key) { - return this.map.get_za3rmp$(key); - }, keys:{get:function() { - return this.map.keys; - }}, values:{get:function() { - return this.map.values; - }}, entries:{get:function() { - return this.map.entries; - }}, getOrImplicitDefault_za3rmp$:function(key) { - var $receiver = this.map; - var tmp$0; - var value = $receiver.get_za3rmp$(key); - if (value == null && !$receiver.containsKey_za3rmp$(key)) { - return this.default_61dz8o$(key); - } else { - return(tmp$0 = value) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - } - }}, {}), MutableMapWithDefaultImpl:Kotlin.createClass(function() { - return[_.kotlin.collections.MutableMapWithDefault]; - }, function(map, default_0) { - this.$map_6ju9n7$ = map; - this.default_vonn6a$ = default_0; - }, {map:{get:function() { - return this.$map_6ju9n7$; - }}, equals_za3rmp$:function(other) { - return Kotlin.equals(this.map, other); - }, hashCode:function() { - return Kotlin.hashCode(this.map); - }, toString:function() { - return this.map.toString(); - }, size:{get:function() { - return this.map.size; - }}, isEmpty:function() { - return this.map.isEmpty(); - }, containsKey_za3rmp$:function(key) { - return this.map.containsKey_za3rmp$(key); - }, containsValue_za3rmp$:function(value) { - return this.map.containsValue_za3rmp$(value); - }, get_za3rmp$:function(key) { - return this.map.get_za3rmp$(key); - }, keys:{get:function() { - return this.map.keys; - }}, values:{get:function() { - return this.map.values; - }}, entries:{get:function() { - return this.map.entries; - }}, put_wn2jw4$:function(key, value) { - return this.map.put_wn2jw4$(key, value); - }, remove_za3rmp$:function(key) { - return this.map.remove_za3rmp$(key); - }, putAll_r12sna$:function(from) { - this.map.putAll_r12sna$(from); - }, clear:function() { - this.map.clear(); - }, getOrImplicitDefault_za3rmp$:function(key) { - var $receiver = this.map; - var tmp$0; - var value = $receiver.get_za3rmp$(key); - if (value == null && !$receiver.containsKey_za3rmp$(key)) { - return this.default_vonn6a$(key); - } else { - return(tmp$0 = value) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - } - }}, {}), EmptyMap:Kotlin.createObject(function() { - return[_.java.io.Serializable, Kotlin.modules["builtins"].kotlin.collections.Map]; - }, null, {equals_za3rmp$:function(other) { - return Kotlin.isType(other, Kotlin.modules["builtins"].kotlin.collections.Map) && other.isEmpty(); - }, hashCode:function() { - return 0; - }, toString:function() { - return "{}"; - }, size:{get:function() { - return 0; - }}, isEmpty:function() { - return true; - }, containsKey_za3rmp$:function(key) { - return false; - }, containsValue_za3rmp$:function(value) { - return false; - }, get_za3rmp$:function(key) { - return null; - }, entries:{get:function() { - return _.kotlin.collections.EmptySet; - }}, keys:{get:function() { - return _.kotlin.collections.EmptySet; - }}, values:{get:function() { - return _.kotlin.collections.EmptyList; - }}, readResolve:function() { - return _.kotlin.collections.EmptyMap; - }}), emptyMap:function() { - var tmp$0; - return Kotlin.isType(tmp$0 = _.kotlin.collections.EmptyMap, Kotlin.modules["builtins"].kotlin.collections.Map) ? tmp$0 : Kotlin.throwCCE(); - }, mapOf_eoa9s7$:function(pairs) { - return pairs.length > 0 ? _.kotlin.collections.linkedMapOf_eoa9s7$(pairs.slice()) : _.kotlin.collections.emptyMap(); - }, mapOf:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapOf", function() { - return _.kotlin.collections.emptyMap(); - }), mutableMapOf_eoa9s7$:function(pairs) { - var $receiver = new Kotlin.LinkedHashMap(_.kotlin.collections.mapCapacity(pairs.length)); - _.kotlin.collections.putAll_76v9np$($receiver, pairs); - return $receiver; - }, hashMapOf_eoa9s7$:function(pairs) { - var $receiver = new Kotlin.ComplexHashMap(_.kotlin.collections.mapCapacity(pairs.length)); - _.kotlin.collections.putAll_76v9np$($receiver, pairs); - return $receiver; - }, linkedMapOf_eoa9s7$:function(pairs) { - var $receiver = new Kotlin.LinkedHashMap(_.kotlin.collections.mapCapacity(pairs.length)); - _.kotlin.collections.putAll_76v9np$($receiver, pairs); - return $receiver; - }, mapCapacity:function(expectedSize) { - if (expectedSize < 3) { - return expectedSize + 1; - } - if (expectedSize < _.kotlin.collections.INT_MAX_POWER_OF_TWO_y8578v$) { - return expectedSize + (expectedSize / 3 | 0); - } - return Kotlin.modules["stdlib"].kotlin.js.internal.IntCompanionObject.MAX_VALUE; - }, isNotEmpty_efxzmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.isNotEmpty_efxzmg$", function($receiver) { - return!$receiver.isEmpty(); - }), orEmpty_efxzmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.orEmpty_efxzmg$", function($receiver) { - return $receiver != null ? $receiver : _.kotlin.collections.emptyMap(); - }), contains_9ju2mf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.contains_9ju2mf$", function($receiver, key) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.Map) ? tmp$0 : Kotlin.throwCCE()).containsKey_za3rmp$(key); - }), get_9ju2mf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.get_9ju2mf$", function($receiver, key) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.Map) ? tmp$0 : Kotlin.throwCCE()).get_za3rmp$(key); - }), containsKey_9ju2mf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.containsKey_9ju2mf$", function($receiver, key) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.Map) ? tmp$0 : Kotlin.throwCCE()).containsKey_za3rmp$(key); - }), containsValue_9ju2mf$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.containsValue_9ju2mf$", function($receiver, value) { - return $receiver.containsValue_za3rmp$(value); - }), remove_dr77nj$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.remove_dr77nj$", function($receiver, key) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.MutableMap) ? tmp$0 : Kotlin.throwCCE()).remove_za3rmp$(key); - }), component1_95c3g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component1_95c3g$", function($receiver) { - return $receiver.key; - }), component2_95c3g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.component2_95c3g$", function($receiver) { - return $receiver.value; - }), toPair_95c3g$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.toPair_95c3g$", function($receiver) { - return new _.kotlin.Pair($receiver.key, $receiver.value); - }), getOrElse_yh3n4j$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrElse_yh3n4j$", function($receiver, key, defaultValue) { - var tmp$0; - return(tmp$0 = $receiver.get_za3rmp$(key)) != null ? tmp$0 : defaultValue(); - }), getOrElseNullable:function($receiver, key, defaultValue) { - var tmp$0; - var value = $receiver.get_za3rmp$(key); - if (value == null && !$receiver.containsKey_za3rmp$(key)) { - return defaultValue(); - } else { - return(tmp$0 = value) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - } - }, getOrPut_5hy1z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.getOrPut_5hy1z$", function($receiver, key, defaultValue) { - var tmp$0; - var value = $receiver.get_za3rmp$(key); - if (value == null) { - var answer = defaultValue(); - $receiver.put_wn2jw4$(key, answer); - tmp$0 = answer; - } else { - tmp$0 = value; - } - return tmp$0; - }), iterator_efxzmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.iterator_efxzmg$", function($receiver) { - return $receiver.entries.iterator(); - }), mapValuesTo_6rxb0p$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapValuesTo_6rxb0p$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.entries.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(element.key, transform(element)); - } - return destination; - }), mapKeysTo_6rxb0p$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapKeysTo_6rxb0p$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.entries.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(transform(element), element.value); - } - return destination; - }), putAll_76v9np$:function($receiver, pairs) { - var tmp$1, tmp$2, tmp$3; - tmp$1 = pairs, tmp$2 = tmp$1.length; - for (var tmp$3 = 0;tmp$3 !== tmp$2;++tmp$3) { - var tmp$0 = tmp$1[tmp$3], key = tmp$0.component1(), value = tmp$0.component2(); - $receiver.put_wn2jw4$(key, value); - } - }, putAll_6588df$:function($receiver, pairs) { - var tmp$1; - tmp$1 = pairs.iterator(); - while (tmp$1.hasNext()) { - var tmp$0 = tmp$1.next(), key = tmp$0.component1(), value = tmp$0.component2(); - $receiver.put_wn2jw4$(key, value); - } - }, putAll_6ze1sl$:function($receiver, pairs) { - var tmp$1; - tmp$1 = pairs.iterator(); - while (tmp$1.hasNext()) { - var tmp$0 = tmp$1.next(), key = tmp$0.component1(), value = tmp$0.component2(); - $receiver.put_wn2jw4$(key, value); - } - }, mapValues_e1k39z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapValues_e1k39z$", function($receiver, transform) { - var destination = new Kotlin.LinkedHashMap(_.kotlin.collections.mapCapacity($receiver.size)); - var tmp$0; - tmp$0 = $receiver.entries.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(element.key, transform(element)); - } - return destination; - }), mapKeys_e1k39z$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.mapKeys_e1k39z$", function($receiver, transform) { - var destination = new Kotlin.LinkedHashMap(_.kotlin.collections.mapCapacity($receiver.size)); - var tmp$0; - tmp$0 = $receiver.entries.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(transform(element), element.value); - } - return destination; - }), filterKeys_m7gpmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterKeys_m7gpmg$", function($receiver, predicate) { - var tmp$0; - var result = new Kotlin.LinkedHashMap; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var entry = tmp$0.next(); - if (predicate(entry.key)) { - result.put_wn2jw4$(entry.key, entry.value); - } - } - return result; - }), filterValues_m7gpmg$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterValues_m7gpmg$", function($receiver, predicate) { - var tmp$0; - var result = new Kotlin.LinkedHashMap; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var entry = tmp$0.next(); - if (predicate(entry.value)) { - result.put_wn2jw4$(entry.key, entry.value); - } - } - return result; - }), filterTo_186nyl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterTo_186nyl$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.put_wn2jw4$(element.key, element.value); - } - } - return destination; - }), filter_oixulp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filter_oixulp$", function($receiver, predicate) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.put_wn2jw4$(element.key, element.value); - } - } - return destination; - }), filterNotTo_186nyl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNotTo_186nyl$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.put_wn2jw4$(element.key, element.value); - } - } - return destination; - }), filterNot_oixulp$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.filterNot_oixulp$", function($receiver, predicate) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = _.kotlin.collections.iterator_efxzmg$($receiver); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.put_wn2jw4$(element.key, element.value); - } - } - return destination; - }), toMap_mnrzhp$:function($receiver) { - var tmp$0, tmp$1; - if (Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - tmp$1 = _.kotlin.collections.emptyMap(); - } else { - if (tmp$0 === 1) { - tmp$1 = _.kotlin.collections.mapOf_dvvt93$(Kotlin.isType($receiver, Kotlin.modules["builtins"].kotlin.collections.List) ? $receiver.get_za3lpa$(0) : $receiver.iterator().next()); - } else { - tmp$1 = _.kotlin.collections.toMap_q9c1bb$($receiver, new Kotlin.LinkedHashMap(_.kotlin.collections.mapCapacity($receiver.size))); - } - } - return tmp$1; - } - return _.kotlin.collections.optimizeReadOnlyMap(_.kotlin.collections.toMap_q9c1bb$($receiver, new Kotlin.LinkedHashMap)); - }, toMap_q9c1bb$:function($receiver, destination) { - _.kotlin.collections.putAll_6588df$(destination, $receiver); - return destination; - }, toMap_sq63gn$:function($receiver) { - var tmp$0; - tmp$0 = $receiver.length; - if (tmp$0 === 0) { - return _.kotlin.collections.emptyMap(); - } else { - if (tmp$0 === 1) { - return _.kotlin.collections.mapOf_dvvt93$($receiver[0]); - } else { - return _.kotlin.collections.toMap_6ddun9$($receiver, new Kotlin.LinkedHashMap(_.kotlin.collections.mapCapacity($receiver.length))); - } - } - }, toMap_6ddun9$:function($receiver, destination) { - _.kotlin.collections.putAll_76v9np$(destination, $receiver); - return destination; - }, toMap_t83shn$:function($receiver) { - return _.kotlin.collections.optimizeReadOnlyMap(_.kotlin.collections.toMap_7lph5z$($receiver, new Kotlin.LinkedHashMap)); - }, toMap_7lph5z$:function($receiver, destination) { - _.kotlin.collections.putAll_6ze1sl$(destination, $receiver); - return destination; - }, plus_gd9jsf$:function($receiver, pair) { - if ($receiver.isEmpty()) { - return _.kotlin.collections.mapOf_dvvt93$(pair); - } else { - var $receiver_0 = _.java.util.LinkedHashMap_r12sna$($receiver); - $receiver_0.put_wn2jw4$(pair.first, pair.second); - return $receiver_0; - } - }, plus_1uo6lf$:function($receiver, pairs) { - if ($receiver.isEmpty()) { - return _.kotlin.collections.toMap_mnrzhp$(pairs); - } else { - var $receiver_0 = _.java.util.LinkedHashMap_r12sna$($receiver); - _.kotlin.collections.putAll_6588df$($receiver_0, pairs); - return $receiver_0; - } - }, plus_kx5j6p$:function($receiver, pairs) { - if ($receiver.isEmpty()) { - return _.kotlin.collections.toMap_sq63gn$(pairs); - } else { - var $receiver_0 = _.java.util.LinkedHashMap_r12sna$($receiver); - _.kotlin.collections.putAll_76v9np$($receiver_0, pairs); - return $receiver_0; - } - }, plus_85nxov$:function($receiver, pairs) { - var $receiver_0 = _.java.util.LinkedHashMap_r12sna$($receiver); - _.kotlin.collections.putAll_6ze1sl$($receiver_0, pairs); - return _.kotlin.collections.optimizeReadOnlyMap($receiver_0); - }, plus_y1w8a6$:function($receiver, map) { - var $receiver_0 = _.java.util.LinkedHashMap_r12sna$($receiver); - $receiver_0.putAll_r12sna$(map); - return $receiver_0; - }, plusAssign_fda80b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_fda80b$", function($receiver, pair) { - $receiver.put_wn2jw4$(pair.first, pair.second); - }), plusAssign_6588df$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_6588df$", function($receiver, pairs) { - _.kotlin.collections.putAll_6588df$($receiver, pairs); - }), plusAssign_76v9np$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_76v9np$", function($receiver, pairs) { - _.kotlin.collections.putAll_76v9np$($receiver, pairs); - }), plusAssign_6ze1sl$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_6ze1sl$", function($receiver, pairs) { - _.kotlin.collections.putAll_6ze1sl$($receiver, pairs); - }), plusAssign_wb8lso$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_wb8lso$", function($receiver, map) { - $receiver.putAll_r12sna$(map); - }), optimizeReadOnlyMap:function($receiver) { - var tmp$0; - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - return _.kotlin.collections.emptyMap(); - } else { - if (tmp$0 === 1) { - return $receiver; - } else { - return $receiver; - } - } - }, remove_4kvzvw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.remove_4kvzvw$", function($receiver, element) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.MutableCollection) ? tmp$0 : Kotlin.throwCCE()).remove_za3rmp$(element); - }), removeAll_dah1ga$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.removeAll_dah1ga$", function($receiver, elements) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.MutableCollection) ? tmp$0 : Kotlin.throwCCE()).removeAll_wtfk93$(elements); - }), retainAll_dah1ga$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.retainAll_dah1ga$", function($receiver, elements) { - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.MutableCollection) ? tmp$0 : Kotlin.throwCCE()).retainAll_wtfk93$(elements); - }), remove_ter78v$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.remove_ter78v$", function($receiver, index) { - return $receiver.removeAt_za3lpa$(index); - }), plusAssign_4kvzvw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_4kvzvw$", function($receiver, element) { - $receiver.add_za3rmp$(element); - }), plusAssign_fwwv5a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_fwwv5a$", function($receiver, elements) { - _.kotlin.collections.addAll_fwwv5a$($receiver, elements); - }), plusAssign_jzhv38$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_jzhv38$", function($receiver, elements) { - _.kotlin.collections.addAll_jzhv38$($receiver, elements); - }), plusAssign_h3qeu8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.plusAssign_h3qeu8$", function($receiver, elements) { - _.kotlin.collections.addAll_h3qeu8$($receiver, elements); - }), minusAssign_4kvzvw$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minusAssign_4kvzvw$", function($receiver, element) { - $receiver.remove_za3rmp$(element); - }), minusAssign_fwwv5a$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minusAssign_fwwv5a$", function($receiver, elements) { - _.kotlin.collections.removeAll_fwwv5a$($receiver, elements); - }), minusAssign_jzhv38$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minusAssign_jzhv38$", function($receiver, elements) { - _.kotlin.collections.removeAll_jzhv38$($receiver, elements); - }), minusAssign_h3qeu8$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.minusAssign_h3qeu8$", function($receiver, elements) { - _.kotlin.collections.removeAll_h3qeu8$($receiver, elements); - }), addAll_fwwv5a$:function($receiver, elements) { - var tmp$0; - if (Kotlin.isType(elements, Kotlin.modules["builtins"].kotlin.collections.Collection)) { - return $receiver.addAll_wtfk93$(elements); - } else { - var result = false; - tmp$0 = elements.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if ($receiver.add_za3rmp$(item)) { - result = true; - } - } - return result; - } - }, addAll_h3qeu8$:function($receiver, elements) { - var tmp$0; - var result = false; - tmp$0 = elements.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if ($receiver.add_za3rmp$(item)) { - result = true; - } - } - return result; - }, addAll_jzhv38$:function($receiver, elements) { - return $receiver.addAll_wtfk93$(_.kotlin.collections.asList_eg9ybj$(elements)); - }, removeAll_d717bt$:function($receiver, predicate) { - return _.kotlin.collections.filterInPlace($receiver, predicate, true); - }, retainAll_d717bt$:function($receiver, predicate) { - return _.kotlin.collections.filterInPlace($receiver, predicate, false); - }, filterInPlace:function($receiver, predicate, predicateResultToRemove) { - var result = {v:false}; - var $this = $receiver.iterator(); - while ($this.hasNext()) { - if (Kotlin.equals(predicate($this.next()), predicateResultToRemove)) { - $this.remove(); - result.v = true; - } - } - return result.v; - }, removeAll_5xdc4t$:function($receiver, predicate) { - return _.kotlin.collections.filterInPlace_1($receiver, predicate, true); - }, retainAll_5xdc4t$:function($receiver, predicate) { - return _.kotlin.collections.filterInPlace_1($receiver, predicate, false); - }, filterInPlace_1:function($receiver, predicate, predicateResultToRemove) { - var tmp$0, tmp$1, tmp$2; - if (!Kotlin.isType($receiver, Kotlin.RandomAccess)) { - return _.kotlin.collections.filterInPlace($receiver, predicate, predicateResultToRemove); - } - var writeIndex = 0; - tmp$1 = _.kotlin.collections.get_lastIndex_a7ptmv$($receiver); - for (var readIndex = 0;readIndex <= tmp$1;readIndex++) { - var element = $receiver.get_za3lpa$(readIndex); - if (Kotlin.equals(predicate(element), predicateResultToRemove)) { - continue; - } - if (writeIndex !== readIndex) { - $receiver.set_vux3hl$(writeIndex, element); - } - writeIndex++; - } - if (writeIndex < $receiver.size) { - tmp$2 = _.kotlin.ranges.downTo_rksjo2$(_.kotlin.collections.get_lastIndex_a7ptmv$($receiver), writeIndex).iterator(); - while (tmp$2.hasNext()) { - var removeIndex = tmp$2.next(); - $receiver.removeAt_za3lpa$(removeIndex); - } - return true; - } else { - return false; - } - }, removeAll_fwwv5a$:function($receiver, elements) { - var elements_0 = _.kotlin.collections.convertToSetForSetOperationWith(elements, $receiver); - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.MutableCollection) ? tmp$0 : Kotlin.throwCCE()).removeAll_wtfk93$(elements_0); - }, removeAll_h3qeu8$:function($receiver, elements) { - var set = _.kotlin.sequences.toHashSet_uya9q7$(elements); - return!set.isEmpty() && $receiver.removeAll_wtfk93$(set); - }, removeAll_jzhv38$:function($receiver, elements) { - return!(elements.length === 0) && $receiver.removeAll_wtfk93$(_.kotlin.collections.toHashSet_eg9ybj$(elements)); - }, retainAll_fwwv5a$:function($receiver, elements) { - var elements_0 = _.kotlin.collections.convertToSetForSetOperationWith(elements, $receiver); - var tmp$0; - return(Kotlin.isType(tmp$0 = $receiver, Kotlin.modules["builtins"].kotlin.collections.MutableCollection) ? tmp$0 : Kotlin.throwCCE()).retainAll_wtfk93$(elements_0); - }, retainAll_jzhv38$:function($receiver, elements) { - if (!(elements.length === 0)) { - return $receiver.retainAll_wtfk93$(_.kotlin.collections.toHashSet_eg9ybj$(elements)); - } else { - return _.kotlin.collections.retainNothing($receiver); - } - }, retainAll_h3qeu8$:function($receiver, elements) { - var set = _.kotlin.sequences.toHashSet_uya9q7$(elements); - if (!set.isEmpty()) { - return $receiver.retainAll_wtfk93$(set); - } else { - return _.kotlin.collections.retainNothing($receiver); - } - }, retainNothing:function($receiver) { - var result = !$receiver.isEmpty(); - $receiver.clear(); - return result; - }, sort_h06zi1$:function($receiver) { - if ($receiver.size > 1) { - _.java.util.Collections.sort_pr3zit$($receiver); - } - }, sortWith_lcufbu$:function($receiver, comparator) { - if ($receiver.size > 1) { - _.java.util.Collections.sort_k5qxi4$($receiver, comparator); - } - }, ReversedListReadOnly:Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function $fun(delegate) { - $fun.baseInitializer.call(this); - this.$delegate_h46x6d$ = delegate; - }, {delegate:{get:function() { - return this.$delegate_h46x6d$; - }}, size:{get:function() { - return this.delegate.size; - }}, get_za3lpa$:function(index) { - return this.delegate.get_za3lpa$(this.flipIndex_s8ev3o$(index)); - }, flipIndex_s8ev3o$:function($receiver) { - if ((new Kotlin.NumberRange(0, this.size - 1)).contains_htax2k$($receiver)) { - return this.size - $receiver - 1; - } else { - throw new Kotlin.IndexOutOfBoundsException("index " + $receiver + " should be in range [" + new Kotlin.NumberRange(0, this.size - 1) + "]."); - } - }, flipIndexForward_s8ev3o$:function($receiver) { - if ((new Kotlin.NumberRange(0, this.size)).contains_htax2k$($receiver)) { - return this.size - $receiver; - } else { - throw new Kotlin.IndexOutOfBoundsException("index " + $receiver + " should be in range [" + new Kotlin.NumberRange(0, this.size) + "]."); - } - }}), ReversedList:Kotlin.createClass(function() { - return[_.kotlin.collections.ReversedListReadOnly]; - }, function $fun(delegate) { - $fun.baseInitializer.call(this, delegate); - this.$delegate_20w7qr$ = delegate; - }, {delegate:{get:function() { - return this.$delegate_20w7qr$; - }}, clear:function() { - this.delegate.clear(); - }, removeAt_za3lpa$:function(index) { - return this.delegate.removeAt_za3lpa$(this.flipIndex_s8ev3o$(index)); - }, set_vux3hl$:function(index, element) { - return this.delegate.set_vux3hl$(this.flipIndex_s8ev3o$(index), element); - }, add_vux3hl$:function(index, element) { - this.delegate.add_vux3hl$(this.flipIndexForward_s8ev3o$(index), element); - }}), asReversed_a7ptmv$:function($receiver) { - return new _.kotlin.collections.ReversedListReadOnly($receiver); - }, asReversed_sqtfhv$:function($receiver) { - return new _.kotlin.collections.ReversedList($receiver); - }, EmptySet:Kotlin.createObject(function() { - return[_.java.io.Serializable, Kotlin.modules["builtins"].kotlin.collections.Set]; - }, null, {equals_za3rmp$:function(other) { - return Kotlin.isType(other, Kotlin.modules["builtins"].kotlin.collections.Set) && other.isEmpty(); - }, hashCode:function() { - return 0; - }, toString:function() { - return "[]"; - }, size:{get:function() { - return 0; - }}, isEmpty:function() { - return true; - }, contains_za3rmp$:function(element) { - return false; - }, containsAll_wtfk93$:function(elements) { - return elements.isEmpty(); - }, iterator:function() { - return _.kotlin.collections.EmptyIterator; - }, readResolve:function() { - return _.kotlin.collections.EmptySet; - }}), emptySet:function() { - return _.kotlin.collections.EmptySet; - }, setOf_9mqe4v$:function(elements) { - return elements.length > 0 ? _.kotlin.collections.toSet_eg9ybj$(elements) : _.kotlin.collections.emptySet(); - }, setOf:Kotlin.defineInlineFunction("stdlib.kotlin.collections.setOf", function() { - return _.kotlin.collections.emptySet(); - }), mutableSetOf_9mqe4v$:function(elements) { - return _.kotlin.collections.toCollection_ajv5ds$(elements, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity(elements.length))); - }, hashSetOf_9mqe4v$:function(elements) { - return _.kotlin.collections.toCollection_ajv5ds$(elements, new Kotlin.ComplexHashSet(_.kotlin.collections.mapCapacity(elements.length))); - }, linkedSetOf_9mqe4v$:function(elements) { - return _.kotlin.collections.toCollection_ajv5ds$(elements, new Kotlin.LinkedHashSet(_.kotlin.collections.mapCapacity(elements.length))); - }, orEmpty_9io49b$:Kotlin.defineInlineFunction("stdlib.kotlin.collections.orEmpty_9io49b$", function($receiver) { - return $receiver != null ? $receiver : _.kotlin.collections.emptySet(); - }), optimizeReadOnlySet:function($receiver) { - var tmp$0; - tmp$0 = $receiver.size; - if (tmp$0 === 0) { - return _.kotlin.collections.emptySet(); - } else { - if (tmp$0 === 1) { - return _.kotlin.collections.setOf_za3rmp$($receiver.iterator().next()); - } else { - return $receiver; - } - } - }}), synchronized_pzucw5$:Kotlin.defineInlineFunction("stdlib.kotlin.synchronized_pzucw5$", function(lock, block) { - return block(); - }), emptyArray:Kotlin.defineInlineFunction("stdlib.kotlin.emptyArray", function(isT) { - var tmp$0; - return Array.isArray(tmp$0 = Kotlin.nullArray(0)) ? tmp$0 : Kotlin.throwCCE(); - }), lazy_un3fny$:function(initializer) { - return new _.kotlin.UnsafeLazyImpl(initializer); - }, lazy_b4usna$:function(mode, initializer) { - return new _.kotlin.UnsafeLazyImpl(initializer); - }, lazy_pzucw5$:function(lock, initializer) { - return new _.kotlin.UnsafeLazyImpl(initializer); - }, arrayOfNulls:function(reference, size) { - var tmp$0; - return Array.isArray(tmp$0 = Kotlin.nullArray(size)) ? tmp$0 : Kotlin.throwCCE(); - }, arrayCopyResize:function(source, newSize, defaultValue) { - var result = source.slice(0, newSize); - var index = source.length; - if (newSize > index) { - result.length = newSize; - while (index < newSize) { - result[index++] = defaultValue; - } - } - return result; - }, arrayPlusCollection:function(array, collection) { - var tmp$0; - var result = array.slice(); - result.length += collection.size; - var index = array.length; - tmp$0 = collection.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - result[index++] = element; - } - return result; - }, toSingletonMap:function($receiver) { - return $receiver; - }, copyToArrayOfAny:function($receiver, isVarargs) { - return isVarargs ? $receiver : $receiver.slice(); - }, isNaN_yrwdxs$:function($receiver) { - return $receiver !== $receiver; - }, isNaN_81szl$:function($receiver) { - return $receiver !== $receiver; - }, isInfinite_yrwdxs$:function($receiver) { - return $receiver === Kotlin.modules["stdlib"].kotlin.js.internal.DoubleCompanionObject.POSITIVE_INFINITY || $receiver === Kotlin.modules["stdlib"].kotlin.js.internal.DoubleCompanionObject.NEGATIVE_INFINITY; - }, isInfinite_81szl$:function($receiver) { - return $receiver === Kotlin.modules["stdlib"].kotlin.js.internal.FloatCompanionObject.POSITIVE_INFINITY || $receiver === Kotlin.modules["stdlib"].kotlin.js.internal.FloatCompanionObject.NEGATIVE_INFINITY; - }, isFinite_yrwdxs$:function($receiver) { - return!_.kotlin.isInfinite_yrwdxs$($receiver) && !_.kotlin.isNaN_yrwdxs$($receiver); - }, isFinite_81szl$:function($receiver) { - return!_.kotlin.isInfinite_81szl$($receiver) && !_.kotlin.isNaN_81szl$($receiver); - }, Unit:Kotlin.createObject(null, null, {toString:function() { - return "kotlin.Unit"; - }}), Lazy:Kotlin.createTrait(null), lazyOf_za3rmp$:function(value) { - return new _.kotlin.InitializedLazyImpl(value); - }, getValue_em0fd4$:Kotlin.defineInlineFunction("stdlib.kotlin.getValue_em0fd4$", function($receiver, thisRef, property) { - return $receiver.value; - }), LazyThreadSafetyMode:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{SYNCHRONIZED:function() { - return new _.kotlin.LazyThreadSafetyMode; - }, PUBLICATION:function() { - return new _.kotlin.LazyThreadSafetyMode; - }, NONE:function() { - return new _.kotlin.LazyThreadSafetyMode; - }}; - }), UNINITIALIZED_VALUE:Kotlin.createObject(null, null), SynchronizedLazyImpl:Kotlin.createClass(function() { - return[_.java.io.Serializable, _.kotlin.Lazy]; - }, function(initializer, lock) { - if (lock === void 0) { - lock = null; - } - this.initializer_r73809$ = initializer; - this._value_vvwq51$ = _.kotlin.UNINITIALIZED_VALUE; - this.lock_1qw5us$ = lock != null ? lock : this; - }, {value:{get:function() { - var tmp$0; - var _v1 = this._value_vvwq51$; - if (_v1 !== _.kotlin.UNINITIALIZED_VALUE) { - return(tmp$0 = _v1) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - } - var tmp$2, tmp$1; - var _v2 = this._value_vvwq51$; - if (_v2 !== _.kotlin.UNINITIALIZED_VALUE) { - return(tmp$2 = _v2) == null || tmp$2 != null ? tmp$2 : Kotlin.throwCCE(); - } else { - var typedValue = ((tmp$1 = this.initializer_r73809$) != null ? tmp$1 : Kotlin.throwNPE())(); - this._value_vvwq51$ = typedValue; - this.initializer_r73809$ = null; - return typedValue; - } - }}, isInitialized:function() { - return this._value_vvwq51$ !== _.kotlin.UNINITIALIZED_VALUE; - }, toString:function() { - return this.isInitialized() ? Kotlin.toString(this.value) : "Lazy value not initialized yet."; - }, writeReplace:function() { - return new _.kotlin.InitializedLazyImpl(this.value); - }}, {}), UnsafeLazyImpl:Kotlin.createClass(function() { - return[_.java.io.Serializable, _.kotlin.Lazy]; - }, function(initializer) { - this.initializer_r8paat$ = initializer; - this._value_94f8d5$ = _.kotlin.UNINITIALIZED_VALUE; - }, {value:{get:function() { - var tmp$0, tmp$1; - if (this._value_94f8d5$ === _.kotlin.UNINITIALIZED_VALUE) { - this._value_94f8d5$ = ((tmp$0 = this.initializer_r8paat$) != null ? tmp$0 : Kotlin.throwNPE())(); - this.initializer_r8paat$ = null; - } - return(tmp$1 = this._value_94f8d5$) == null || tmp$1 != null ? tmp$1 : Kotlin.throwCCE(); - }}, isInitialized:function() { - return this._value_94f8d5$ !== _.kotlin.UNINITIALIZED_VALUE; - }, toString:function() { - return this.isInitialized() ? Kotlin.toString(this.value) : "Lazy value not initialized yet."; - }, writeReplace:function() { - return new _.kotlin.InitializedLazyImpl(this.value); - }}), InitializedLazyImpl:Kotlin.createClass(function() { - return[_.java.io.Serializable, _.kotlin.Lazy]; - }, function(value) { - this.$value_2jk7vi$ = value; - }, {value:{get:function() { - return this.$value_2jk7vi$; - }}, isInitialized:function() { - return true; - }, toString:function() { - return Kotlin.toString(this.value); - }}), require_6taknv$:Kotlin.defineInlineFunction("stdlib.kotlin.require_6taknv$", function(value) { - if (!value) { - var message = "Failed requirement."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - }), require_588y69$:Kotlin.defineInlineFunction("stdlib.kotlin.require_588y69$", function(value, lazyMessage) { - if (!value) { - var message = lazyMessage(); - throw new Kotlin.IllegalArgumentException(message.toString()); - } - }), requireNotNull_za3rmp$:Kotlin.defineInlineFunction("stdlib.kotlin.requireNotNull_za3rmp$", function(value) { - if (value == null) { - var message = "Required value was null."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } else { - return value; - } - }), requireNotNull_pzucw5$:Kotlin.defineInlineFunction("stdlib.kotlin.requireNotNull_pzucw5$", function(value, lazyMessage) { - if (value == null) { - var message = lazyMessage(); - throw new Kotlin.IllegalArgumentException(message.toString()); - } else { - return value; - } - }), check_6taknv$:Kotlin.defineInlineFunction("stdlib.kotlin.check_6taknv$", function(value) { - if (!value) { - var message = "Check failed."; - throw new Kotlin.IllegalStateException(message.toString()); - } - }), check_588y69$:Kotlin.defineInlineFunction("stdlib.kotlin.check_588y69$", function(value, lazyMessage) { - if (!value) { - var message = lazyMessage(); - throw new Kotlin.IllegalStateException(message.toString()); - } - }), checkNotNull_za3rmp$:Kotlin.defineInlineFunction("stdlib.kotlin.checkNotNull_za3rmp$", function(value) { - if (value == null) { - var message = "Required value was null."; - throw new Kotlin.IllegalStateException(message.toString()); - } else { - return value; - } - }), checkNotNull_pzucw5$:Kotlin.defineInlineFunction("stdlib.kotlin.checkNotNull_pzucw5$", function(value, lazyMessage) { - if (value == null) { - var message = lazyMessage(); - throw new Kotlin.IllegalStateException(message.toString()); - } else { - return value; - } - }), error_za3rmp$:Kotlin.defineInlineFunction("stdlib.kotlin.error_za3rmp$", function(message) { - throw new Kotlin.IllegalStateException(message.toString()); - }), NotImplementedError:Kotlin.createClass(function() { - return[Kotlin.Error]; - }, function $fun(message) { - if (message === void 0) { - message = "An operation is not implemented."; - } - $fun.baseInitializer.call(this, message); - }), TODO:Kotlin.defineInlineFunction("stdlib.kotlin.TODO", function() { - throw new _.kotlin.NotImplementedError; - }), TODO_61zpoe$:Kotlin.defineInlineFunction("stdlib.kotlin.TODO_61zpoe$", function(reason) { - throw new _.kotlin.NotImplementedError("An operation is not implemented: " + reason); - }), run_un3fny$:Kotlin.defineInlineFunction("stdlib.kotlin.run_un3fny$", function(block) { - return block(); - }), run_7hr6ff$:Kotlin.defineInlineFunction("stdlib.kotlin.run_7hr6ff$", function($receiver, block) { - return block.call($receiver); - }), with_hiyix$:Kotlin.defineInlineFunction("stdlib.kotlin.with_hiyix$", function(receiver, block) { - return block.call(receiver); - }), apply_ji1yox$:Kotlin.defineInlineFunction("stdlib.kotlin.apply_ji1yox$", function($receiver, block) { - block.call($receiver); - return $receiver; - }), let_7hr6ff$:Kotlin.defineInlineFunction("stdlib.kotlin.let_7hr6ff$", function($receiver, block) { - return block($receiver); - }), repeat_nxnjqh$:Kotlin.defineInlineFunction("stdlib.kotlin.repeat_nxnjqh$", function(times, action) { - var tmp$0; - tmp$0 = times - 1; - for (var index = 0;index <= tmp$0;index++) { - action(index); - } - }), Pair:Kotlin.createClass(function() { - return[_.java.io.Serializable]; - }, function(first, second) { - this.first = first; - this.second = second; - }, {toString:function() { - return "(" + this.first + ", " + this.second + ")"; - }, component1:function() { - return this.first; - }, component2:function() { - return this.second; - }, copy_wn2jw4$:function(first, second) { - return new _.kotlin.Pair(first === void 0 ? this.first : first, second === void 0 ? this.second : second); - }, hashCode:function() { - var result = 0; - result = result * 31 + Kotlin.hashCode(this.first) | 0; - result = result * 31 + Kotlin.hashCode(this.second) | 0; - return result; - }, equals_za3rmp$:function(other) { - return this === other || other !== null && (typeof other === "object" && (Object.getPrototypeOf(this) === Object.getPrototypeOf(other) && (Kotlin.equals(this.first, other.first) && Kotlin.equals(this.second, other.second)))); - }}), to_l1ob02$:function($receiver, that) { - return new _.kotlin.Pair($receiver, that); - }, toList_49pv07$:function($receiver) { - return _.kotlin.collections.listOf_9mqe4v$([$receiver.first, $receiver.second]); - }, Triple:Kotlin.createClass(function() { - return[_.java.io.Serializable]; - }, function(first, second, third) { - this.first = first; - this.second = second; - this.third = third; - }, {toString:function() { - return "(" + this.first + ", " + this.second + ", " + this.third + ")"; - }, component1:function() { - return this.first; - }, component2:function() { - return this.second; - }, component3:function() { - return this.third; - }, copy_2br51b$:function(first, second, third) { - return new _.kotlin.Triple(first === void 0 ? this.first : first, second === void 0 ? this.second : second, third === void 0 ? this.third : third); - }, hashCode:function() { - var result = 0; - result = result * 31 + Kotlin.hashCode(this.first) | 0; - result = result * 31 + Kotlin.hashCode(this.second) | 0; - result = result * 31 + Kotlin.hashCode(this.third) | 0; - return result; - }, equals_za3rmp$:function(other) { - return this === other || other !== null && (typeof other === "object" && (Object.getPrototypeOf(this) === Object.getPrototypeOf(other) && (Kotlin.equals(this.first, other.first) && (Kotlin.equals(this.second, other.second) && Kotlin.equals(this.third, other.third))))); - }}), toList_lyhsl6$:function($receiver) { - return _.kotlin.collections.listOf_9mqe4v$([$receiver.first, $receiver.second, $receiver.third]); - }, sequences:Kotlin.definePackage(null, {ConstrainedOnceSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence) { - this.sequenceRef_sxf5v1$ = sequence; - }, {iterator:function() { - var tmp$0; - tmp$0 = this.sequenceRef_sxf5v1$; - if (tmp$0 == null) { - throw new Kotlin.IllegalStateException("This sequence can be consumed only once."); - } - var sequence = tmp$0; - this.sequenceRef_sxf5v1$ = null; - return sequence.iterator(); - }}), contains_8xuhcw$:function($receiver, element) { - return _.kotlin.sequences.indexOf_8xuhcw$($receiver, element) >= 0; - }, elementAt_8xunab$f:function(closure$index) { - return function(it) { - throw new Kotlin.IndexOutOfBoundsException("Sequence doesn't contain element at index " + closure$index + "."); - }; - }, elementAt_8xunab$:function($receiver, index) { - return _.kotlin.sequences.elementAtOrElse_1xituq$($receiver, index, _.kotlin.sequences.elementAt_8xunab$f(index)); - }, elementAtOrElse_1xituq$:function($receiver, index, defaultValue) { - if (index < 0) { - return defaultValue(index); - } - var iterator = $receiver.iterator(); - var count = 0; - while (iterator.hasNext()) { - var element = iterator.next(); - if (index === count++) { - return element; - } - } - return defaultValue(index); - }, elementAtOrNull_8xunab$:function($receiver, index) { - if (index < 0) { - return null; - } - var iterator = $receiver.iterator(); - var count = 0; - while (iterator.hasNext()) { - var element = iterator.next(); - if (index === count++) { - return element; - } - } - return null; - }, find_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.find_6bub1b$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), findLast_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.findLast_6bub1b$", function($receiver, predicate) { - var tmp$0; - var last = null; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - last = element; - } - } - return last; - }), first_uya9q7$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.NoSuchElementException("Sequence is empty."); - } - return iterator.next(); - }, first_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.first_6bub1b$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - throw new Kotlin.NoSuchElementException("Sequence contains no element matching the predicate."); - }), firstOrNull_uya9q7$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - return iterator.next(); - }, firstOrNull_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.firstOrNull_6bub1b$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return element; - } - } - return null; - }), indexOf_8xuhcw$:function($receiver, element) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (Kotlin.equals(element, item)) { - return index; - } - index++; - } - return-1; - }, indexOfFirst_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.indexOfFirst_6bub1b$", function($receiver, predicate) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(item)) { - return index; - } - index++; - } - return-1; - }), indexOfLast_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.indexOfLast_6bub1b$", function($receiver, predicate) { - var tmp$0; - var lastIndex = -1; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(item)) { - lastIndex = index; - } - index++; - } - return lastIndex; - }), last_uya9q7$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.NoSuchElementException("Sequence is empty."); - } - var last = iterator.next(); - while (iterator.hasNext()) { - last = iterator.next(); - } - return last; - }, last_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.last_6bub1b$", function($receiver, predicate) { - var tmp$0, tmp$1; - var last = null; - var found = false; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - last = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Sequence contains no element matching the predicate."); - } - return(tmp$1 = last) == null || tmp$1 != null ? tmp$1 : Kotlin.throwCCE(); - }), lastIndexOf_8xuhcw$:function($receiver, element) { - var tmp$0; - var lastIndex = -1; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (Kotlin.equals(element, item)) { - lastIndex = index; - } - index++; - } - return lastIndex; - }, lastOrNull_uya9q7$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var last = iterator.next(); - while (iterator.hasNext()) { - last = iterator.next(); - } - return last; - }, lastOrNull_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.lastOrNull_6bub1b$", function($receiver, predicate) { - var tmp$0; - var last = null; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - last = element; - } - } - return last; - }), single_uya9q7$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.NoSuchElementException("Sequence is empty."); - } - var single = iterator.next(); - if (iterator.hasNext()) { - throw new Kotlin.IllegalArgumentException("Sequence has more than one element."); - } - return single; - }, single_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.single_6bub1b$", function($receiver, predicate) { - var tmp$0, tmp$1; - var single = null; - var found = false; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - throw new Kotlin.IllegalArgumentException("Sequence contains more than one matching element."); - } - single = element; - found = true; - } - } - if (!found) { - throw new Kotlin.NoSuchElementException("Sequence contains no element matching the predicate."); - } - return(tmp$1 = single) == null || tmp$1 != null ? tmp$1 : Kotlin.throwCCE(); - }), singleOrNull_uya9q7$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var single = iterator.next(); - if (iterator.hasNext()) { - return null; - } - return single; - }, singleOrNull_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.singleOrNull_6bub1b$", function($receiver, predicate) { - var tmp$0; - var single = null; - var found = false; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - if (found) { - return null; - } - single = element; - found = true; - } - } - if (!found) { - return null; - } - return single; - }), drop_8xunab$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - tmp$0 = $receiver; - } else { - if (Kotlin.isType($receiver, _.kotlin.sequences.DropTakeSequence)) { - tmp$0 = $receiver.drop_za3lpa$(n); - } else { - tmp$0 = new _.kotlin.sequences.DropSequence($receiver, n); - } - } - return tmp$0; - }, dropWhile_6bub1b$:function($receiver, predicate) { - return new _.kotlin.sequences.DropWhileSequence($receiver, predicate); - }, filter_6bub1b$:function($receiver, predicate) { - return new _.kotlin.sequences.FilteringSequence($receiver, true, predicate); - }, filterIndexed_2lipl8$f:function(closure$predicate) { - return function(it) { - return closure$predicate(it.index, it.value); - }; - }, filterIndexed_2lipl8$f_0:function(it) { - return it.value; - }, filterIndexed_2lipl8$:function($receiver, predicate) { - return new _.kotlin.sequences.TransformingSequence(new _.kotlin.sequences.FilteringSequence(new _.kotlin.sequences.IndexingSequence($receiver), true, _.kotlin.sequences.filterIndexed_2lipl8$f(predicate)), _.kotlin.sequences.filterIndexed_2lipl8$f_0); - }, filterIndexedTo_rs7kz9$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.filterIndexedTo_rs7kz9$", function($receiver, destination, predicate) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - if (predicate(index++, item)) { - destination.add_za3rmp$(item); - } - } - return destination; - }), filterIsInstance_uya9q7$f:function(isR) { - return function(it) { - return isR(it); - }; - }, filterIsInstance_uya9q7$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.filterIsInstance_uya9q7$", function(isR, $receiver) { - var tmp$0; - return Kotlin.isType(tmp$0 = _.kotlin.sequences.filter_6bub1b$($receiver, _.kotlin.sequences.filterIsInstance_uya9q7$f(isR)), _.kotlin.sequences.Sequence) ? tmp$0 : Kotlin.throwCCE(); - }), filterIsInstanceTo_9pj6f6$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.filterIsInstanceTo_9pj6f6$", function(isR, $receiver, destination) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (isR(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterNot_6bub1b$:function($receiver, predicate) { - return new _.kotlin.sequences.FilteringSequence($receiver, false, predicate); - }, filterNotNull_uya9q7$f:function(it) { - return it == null; - }, filterNotNull_uya9q7$:function($receiver) { - var tmp$0; - return Kotlin.isType(tmp$0 = _.kotlin.sequences.filterNot_6bub1b$($receiver, _.kotlin.sequences.filterNotNull_uya9q7$f), _.kotlin.sequences.Sequence) ? tmp$0 : Kotlin.throwCCE(); - }, filterNotNullTo_9pj6f6$:function($receiver, destination) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (element != null) { - destination.add_za3rmp$(element); - } - } - return destination; - }, filterNotTo_z1ybyi$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.filterNotTo_z1ybyi$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), filterTo_z1ybyi$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.filterTo_z1ybyi$", function($receiver, destination, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - destination.add_za3rmp$(element); - } - } - return destination; - }), take_8xunab$:function($receiver, n) { - var tmp$0; - if (!(n >= 0)) { - var message = "Requested element count " + n + " is less than zero."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (n === 0) { - tmp$0 = _.kotlin.sequences.emptySequence(); - } else { - if (Kotlin.isType($receiver, _.kotlin.sequences.DropTakeSequence)) { - tmp$0 = $receiver.take_za3lpa$(n); - } else { - tmp$0 = new _.kotlin.sequences.TakeSequence($receiver, n); - } - } - return tmp$0; - }, takeWhile_6bub1b$:function($receiver, predicate) { - return new _.kotlin.sequences.TakeWhileSequence($receiver, predicate); - }, sorted$f:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(this$sorted_0) { - this.this$sorted_0 = this$sorted_0; - }, {iterator:function() { - var sortedList = _.kotlin.sequences.toMutableList_uya9q7$(this.this$sorted_0); - _.kotlin.collections.sort_h06zi1$(sortedList); - return sortedList.iterator(); - }}, {}), sorted_f9rmbp$:function($receiver) { - return new _.kotlin.sequences.sorted$f($receiver); - }, sortedBy_5y3tfr$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.sortedBy_5y3tfr$", function($receiver, selector) { - return _.kotlin.sequences.sortedWith_pwgv1i$($receiver, new _.kotlin.comparisons.compareBy$f_0(selector)); - }), sortedByDescending_5y3tfr$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.sortedByDescending_5y3tfr$", function($receiver, selector) { - return _.kotlin.sequences.sortedWith_pwgv1i$($receiver, new _.kotlin.comparisons.compareByDescending$f(selector)); - }), sortedDescending_f9rmbp$:function($receiver) { - return _.kotlin.sequences.sortedWith_pwgv1i$($receiver, _.kotlin.comparisons.reverseOrder()); - }, sortedWith$f:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(this$sortedWith_0, closure$comparator_0) { - this.this$sortedWith_0 = this$sortedWith_0; - this.closure$comparator_0 = closure$comparator_0; - }, {iterator:function() { - var sortedList = _.kotlin.sequences.toMutableList_uya9q7$(this.this$sortedWith_0); - _.kotlin.collections.sortWith_lcufbu$(sortedList, this.closure$comparator_0); - return sortedList.iterator(); - }}, {}), sortedWith_pwgv1i$:function($receiver, comparator) { - return new _.kotlin.sequences.sortedWith$f($receiver, comparator); - }, associate_212ozr$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.associate_212ozr$", function($receiver, transform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), associateBy_mzhnvn$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.associateBy_mzhnvn$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateBy_mq2phn$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.associateBy_mq2phn$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateByTo_7yy56l$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.associateByTo_7yy56l$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), element); - } - return destination; - }), associateByTo_z626hh$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.associateByTo_z626hh$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - destination.put_wn2jw4$(keySelector(element), valueTransform(element)); - } - return destination; - }), associateTo_y82m8p$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.associateTo_y82m8p$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - _.kotlin.collections.plusAssign_fda80b$(destination, transform(element)); - } - return destination; - }), toCollection_9pj6f6$:function($receiver, destination) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(item); - } - return destination; - }, toHashSet_uya9q7$:function($receiver) { - return _.kotlin.sequences.toCollection_9pj6f6$($receiver, new Kotlin.ComplexHashSet); - }, toList_uya9q7$:function($receiver) { - return _.kotlin.collections.optimizeReadOnlyList(_.kotlin.sequences.toMutableList_uya9q7$($receiver)); - }, toMutableList_uya9q7$:function($receiver) { - return _.kotlin.sequences.toCollection_9pj6f6$($receiver, new Kotlin.ArrayList); - }, toSet_uya9q7$:function($receiver) { - return _.kotlin.collections.optimizeReadOnlySet(_.kotlin.sequences.toCollection_9pj6f6$($receiver, new Kotlin.LinkedHashSet)); - }, flatMap_f7251y$f:function(it) { - return it.iterator(); - }, flatMap_f7251y$:function($receiver, transform) { - return new _.kotlin.sequences.FlatteningSequence($receiver, transform, _.kotlin.sequences.flatMap_f7251y$f); - }, flatMapTo_mxza43$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.flatMapTo_mxza43$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var list = transform(element); - _.kotlin.collections.addAll_h3qeu8$(destination, list); - } - return destination; - }), groupBy_mzhnvn$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.groupBy_mzhnvn$", function($receiver, keySelector) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupBy_mq2phn$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.groupBy_mq2phn$", function($receiver, keySelector, valueTransform) { - var destination = new Kotlin.LinkedHashMap; - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), groupByTo_ngq3c4$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.groupByTo_ngq3c4$", function($receiver, destination, keySelector) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(element); - } - return destination; - }), groupByTo_315m50$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.groupByTo_315m50$", function($receiver, destination, keySelector, valueTransform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var key = keySelector(element); - var tmp$1; - var value = destination.get_za3rmp$(key); - if (value == null) { - var answer = new Kotlin.ArrayList; - destination.put_wn2jw4$(key, answer); - tmp$1 = answer; - } else { - tmp$1 = value; - } - var list = tmp$1; - list.add_za3rmp$(valueTransform(element)); - } - return destination; - }), map_mzhnvn$:function($receiver, transform) { - return new _.kotlin.sequences.TransformingSequence($receiver, transform); - }, mapIndexed_68ttmg$:function($receiver, transform) { - return new _.kotlin.sequences.TransformingIndexedSequence($receiver, transform); - }, mapIndexedNotNull_68ttmg$:function($receiver, transform) { - return _.kotlin.sequences.filterNotNull_uya9q7$(new _.kotlin.sequences.TransformingIndexedSequence($receiver, transform)); - }, mapIndexedNotNullTo_1k8h0x$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.mapIndexedNotNullTo_1k8h0x$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(index++, item)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapIndexedTo_1k8h0x$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.mapIndexedTo_1k8h0x$", function($receiver, destination, transform) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(index++, item)); - } - return destination; - }), mapNotNull_mzhnvn$:function($receiver, transform) { - return _.kotlin.sequences.filterNotNull_uya9q7$(new _.kotlin.sequences.TransformingSequence($receiver, transform)); - }, mapNotNullTo_qkxpve$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.mapNotNullTo_qkxpve$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - var tmp$1; - (tmp$1 = transform(element)) != null ? destination.add_za3rmp$(tmp$1) : null; - } - return destination; - }), mapTo_qkxpve$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.mapTo_qkxpve$", function($receiver, destination, transform) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - destination.add_za3rmp$(transform(item)); - } - return destination; - }), withIndex_uya9q7$:function($receiver) { - return new _.kotlin.sequences.IndexingSequence($receiver); - }, distinct_uya9q7$f:function(it) { - return it; - }, distinct_uya9q7$:function($receiver) { - return _.kotlin.sequences.distinctBy_mzhnvn$($receiver, _.kotlin.sequences.distinct_uya9q7$f); - }, distinctBy_mzhnvn$:function($receiver, selector) { - return new _.kotlin.sequences.DistinctSequence($receiver, selector); - }, toMutableSet_uya9q7$:function($receiver) { - var tmp$0; - var set = new Kotlin.LinkedHashSet; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - set.add_za3rmp$(item); - } - return set; - }, all_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.all_6bub1b$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (!predicate(element)) { - return false; - } - } - return true; - }), any_uya9q7$:function($receiver) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return true; - } - return false; - }, any_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.any_6bub1b$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return true; - } - } - return false; - }), count_uya9q7$:function($receiver) { - var tmp$0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - count++; - } - return count; - }, count_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.count_6bub1b$", function($receiver, predicate) { - var tmp$0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - count++; - } - } - return count; - }), fold_vmk5me$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.fold_vmk5me$", function($receiver, initial, operation) { - var tmp$0; - var accumulator = initial; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(accumulator, element); - } - return accumulator; - }), foldIndexed_xn82zj$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.foldIndexed_xn82zj$", function($receiver, initial, operation) { - var tmp$0; - var index = 0; - var accumulator = initial; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - accumulator = operation(index++, accumulator, element); - } - return accumulator; - }), forEach_1y3f5d$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.forEach_1y3f5d$", function($receiver, action) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - action(element); - } - }), forEachIndexed_jsn8xw$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.forEachIndexed_jsn8xw$", function($receiver, action) { - var tmp$0; - var index = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var item = tmp$0.next(); - action(index++, item); - } - }), max_f9rmbp$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var max = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (Kotlin.compareTo(max, e) < 0) { - max = e; - } - } - return max; - }, maxBy_5y3tfr$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.maxBy_5y3tfr$", function($receiver, selector) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var maxElem = iterator.next(); - var maxValue = selector(maxElem); - while (iterator.hasNext()) { - var e = iterator.next(); - var v = selector(e); - if (Kotlin.compareTo(maxValue, v) < 0) { - maxElem = e; - maxValue = v; - } - } - return maxElem; - }), maxWith_pwgv1i$:function($receiver, comparator) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var max = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (comparator.compare(max, e) < 0) { - max = e; - } - } - return max; - }, min_f9rmbp$:function($receiver) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var min = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (Kotlin.compareTo(min, e) > 0) { - min = e; - } - } - return min; - }, minBy_5y3tfr$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.minBy_5y3tfr$", function($receiver, selector) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var minElem = iterator.next(); - var minValue = selector(minElem); - while (iterator.hasNext()) { - var e = iterator.next(); - var v = selector(e); - if (Kotlin.compareTo(minValue, v) > 0) { - minElem = e; - minValue = v; - } - } - return minElem; - }), minWith_pwgv1i$:function($receiver, comparator) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - return null; - } - var min = iterator.next(); - while (iterator.hasNext()) { - var e = iterator.next(); - if (comparator.compare(min, e) > 0) { - min = e; - } - } - return min; - }, none_uya9q7$:function($receiver) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - return false; - } - return true; - }, none_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.none_6bub1b$", function($receiver, predicate) { - var tmp$0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - return false; - } - } - return true; - }), reduce_u0tld7$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.reduce_u0tld7$", function($receiver, operation) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.UnsupportedOperationException("Empty sequence can't be reduced."); - } - var accumulator = iterator.next(); - while (iterator.hasNext()) { - accumulator = operation(accumulator, iterator.next()); - } - return accumulator; - }), reduceIndexed_t3v3h2$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.reduceIndexed_t3v3h2$", function($receiver, operation) { - var iterator = $receiver.iterator(); - if (!iterator.hasNext()) { - throw new Kotlin.UnsupportedOperationException("Empty sequence can't be reduced."); - } - var index = 1; - var accumulator = iterator.next(); - while (iterator.hasNext()) { - accumulator = operation(index++, accumulator, iterator.next()); - } - return accumulator; - }), sumBy_mzck3q$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.sumBy_mzck3q$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), sumByDouble_awo3oi$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.sumByDouble_awo3oi$", function($receiver, selector) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += selector(element); - } - return sum; - }), requireNoNulls_uya9q7$f:function(this$requireNoNulls) { - return function(it) { - if (it == null) { - throw new Kotlin.IllegalArgumentException("null element found in " + this$requireNoNulls + "."); - } - return it; - }; - }, requireNoNulls_uya9q7$:function($receiver) { - return _.kotlin.sequences.map_mzhnvn$($receiver, _.kotlin.sequences.requireNoNulls_uya9q7$f($receiver)); - }, minus$f:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(this$minus_0, closure$element_0) { - this.this$minus_0 = this$minus_0; - this.closure$element_0 = closure$element_0; - }, {iterator:function() { - var removed = {v:false}; - return _.kotlin.sequences.filter_6bub1b$(this.this$minus_0, _.kotlin.sequences.minus$f.iterator$f(removed, this.closure$element_0)).iterator(); - }}, {iterator$f:function(closure$removed, closure$element) { - return function(it) { - if (!closure$removed.v && Kotlin.equals(it, closure$element)) { - closure$removed.v = true; - return false; - } else { - return true; - } - }; - }}), minus_8xuhcw$:function($receiver, element) { - return new _.kotlin.sequences.minus$f($receiver, element); - }, minus$f_0:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(closure$elements_0, this$minus_0) { - this.closure$elements_0 = closure$elements_0; - this.this$minus_0 = this$minus_0; - }, {iterator:function() { - var other = _.kotlin.collections.toHashSet_eg9ybj$(this.closure$elements_0); - return _.kotlin.sequences.filterNot_6bub1b$(this.this$minus_0, _.kotlin.sequences.minus$f_0.iterator$f(other)).iterator(); - }}, {iterator$f:function(closure$other) { - return function(it) { - return closure$other.contains_za3rmp$(it); - }; - }}), minus_l2r1yo$:function($receiver, elements) { - if (elements.length === 0) { - return $receiver; - } - return new _.kotlin.sequences.minus$f_0(elements, $receiver); - }, minus$f_1:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(closure$elements_0, this$minus_0) { - this.closure$elements_0 = closure$elements_0; - this.this$minus_0 = this$minus_0; - }, {iterator:function() { - var other = _.kotlin.collections.convertToSetForSetOperation(this.closure$elements_0); - if (other.isEmpty()) { - return this.this$minus_0.iterator(); - } else { - return _.kotlin.sequences.filterNot_6bub1b$(this.this$minus_0, _.kotlin.sequences.minus$f_1.iterator$f(other)).iterator(); - } - }}, {iterator$f:function(closure$other) { - return function(it) { - return closure$other.contains_za3rmp$(it); - }; - }}), minus_yslupy$:function($receiver, elements) { - return new _.kotlin.sequences.minus$f_1(elements, $receiver); - }, minus$f_2:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(closure$elements_0, this$minus_0) { - this.closure$elements_0 = closure$elements_0; - this.this$minus_0 = this$minus_0; - }, {iterator:function() { - var other = _.kotlin.sequences.toHashSet_uya9q7$(this.closure$elements_0); - if (other.isEmpty()) { - return this.this$minus_0.iterator(); - } else { - return _.kotlin.sequences.filterNot_6bub1b$(this.this$minus_0, _.kotlin.sequences.minus$f_2.iterator$f(other)).iterator(); - } - }}, {iterator$f:function(closure$other) { - return function(it) { - return closure$other.contains_za3rmp$(it); - }; - }}), minus_j4v1m4$:function($receiver, elements) { - return new _.kotlin.sequences.minus$f_2(elements, $receiver); - }, minusElement_8xuhcw$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.minusElement_8xuhcw$", function($receiver, element) { - return _.kotlin.sequences.minus_8xuhcw$($receiver, element); - }), partition_6bub1b$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.partition_6bub1b$", function($receiver, predicate) { - var tmp$0; - var first = new Kotlin.ArrayList; - var second = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (predicate(element)) { - first.add_za3rmp$(element); - } else { - second.add_za3rmp$(element); - } - } - return new _.kotlin.Pair(first, second); - }), plus_8xuhcw$:function($receiver, element) { - return _.kotlin.sequences.flatten_skdoy0$(_.kotlin.sequences.sequenceOf_9mqe4v$([$receiver, _.kotlin.sequences.sequenceOf_9mqe4v$([element])])); - }, plus_l2r1yo$:function($receiver, elements) { - return _.kotlin.sequences.plus_yslupy$($receiver, _.kotlin.collections.asList_eg9ybj$(elements)); - }, plus_yslupy$:function($receiver, elements) { - return _.kotlin.sequences.flatten_skdoy0$(_.kotlin.sequences.sequenceOf_9mqe4v$([$receiver, _.kotlin.collections.asSequence_q5oq31$(elements)])); - }, plus_j4v1m4$:function($receiver, elements) { - return _.kotlin.sequences.flatten_skdoy0$(_.kotlin.sequences.sequenceOf_9mqe4v$([$receiver, elements])); - }, plusElement_8xuhcw$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.plusElement_8xuhcw$", function($receiver, element) { - return _.kotlin.sequences.plus_8xuhcw$($receiver, element); - }), zip_j4v1m4$f:function(t1, t2) { - return _.kotlin.to_l1ob02$(t1, t2); - }, zip_j4v1m4$:function($receiver, other) { - return new _.kotlin.sequences.MergingSequence($receiver, other, _.kotlin.sequences.zip_j4v1m4$f); - }, zip_houmqe$:function($receiver, other, transform) { - return new _.kotlin.sequences.MergingSequence($receiver, other, transform); - }, joinTo_mrn40q$:function($receiver, buffer, separator, prefix, postfix, limit, truncated, transform) { - var tmp$0; - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - buffer.append(prefix); - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - if (++count > 1) { - buffer.append(separator); - } - if (limit < 0 || count <= limit) { - if (transform != null) { - buffer.append(transform(element)); - } else { - buffer.append(element == null ? "null" : element.toString()); - } - } else { - break; - } - } - if (limit >= 0 && count > limit) { - buffer.append(truncated); - } - buffer.append(postfix); - return buffer; - }, joinToString_mbzd5w$:function($receiver, separator, prefix, postfix, limit, truncated, transform) { - if (separator === void 0) { - separator = ", "; - } - if (prefix === void 0) { - prefix = ""; - } - if (postfix === void 0) { - postfix = ""; - } - if (limit === void 0) { - limit = -1; - } - if (truncated === void 0) { - truncated = "..."; - } - if (transform === void 0) { - transform = null; - } - return _.kotlin.sequences.joinTo_mrn40q$($receiver, new Kotlin.StringBuilder, separator, prefix, postfix, limit, truncated, transform).toString(); - }, asIterable_uya9q7$f:function(this$asIterable) { - return function() { - return this$asIterable.iterator(); - }; - }, asIterable_uya9q7$:function($receiver) { - return new _.kotlin.collections.Iterable$f(_.kotlin.sequences.asIterable_uya9q7$f($receiver)); - }, asSequence_uya9q7$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.asSequence_uya9q7$", function($receiver) { - return $receiver; - }), average_zhcojx$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_662s1b$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_utw0os$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_uwi6zd$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_hzzbsh$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, average_l0u5c4$:function($receiver) { - var tmp$0; - var sum = 0; - var count = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - count += 1; - } - return count === 0 ? 0 : sum / count; - }, sum_zhcojx$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_662s1b$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_utw0os$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_uwi6zd$:function($receiver) { - var tmp$0; - var sum = Kotlin.Long.ZERO; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum = sum.add(element); - } - return sum; - }, sum_hzzbsh$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, sum_l0u5c4$:function($receiver) { - var tmp$0; - var sum = 0; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var element = tmp$0.next(); - sum += element; - } - return sum; - }, Sequence:Kotlin.createTrait(null), Sequence$f:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(closure$iterator_0) { - this.closure$iterator_0 = closure$iterator_0; - }, {iterator:function() { - return this.closure$iterator_0(); - }}, {}), Sequence_kxhynv$:Kotlin.defineInlineFunction("stdlib.kotlin.sequences.Sequence_kxhynv$", function(iterator) { - return new _.kotlin.sequences.Sequence$f(iterator); - }), asSequence_123wqf$f:function(this$asSequence) { - return function() { - return this$asSequence; - }; - }, asSequence_123wqf$:function($receiver) { - return _.kotlin.sequences.constrainOnce_uya9q7$(new _.kotlin.sequences.Sequence$f(_.kotlin.sequences.asSequence_123wqf$f($receiver))); - }, sequenceOf_9mqe4v$:function(elements) { - return elements.length === 0 ? _.kotlin.sequences.emptySequence() : _.kotlin.collections.asSequence_eg9ybj$(elements); - }, emptySequence:function() { - return _.kotlin.sequences.EmptySequence; - }, EmptySequence:Kotlin.createObject(function() { - return[_.kotlin.sequences.DropTakeSequence, _.kotlin.sequences.Sequence]; - }, null, {iterator:function() { - return _.kotlin.collections.EmptyIterator; - }, drop_za3lpa$:function(n) { - return _.kotlin.sequences.EmptySequence; - }, take_za3lpa$:function(n) { - return _.kotlin.sequences.EmptySequence; - }}), flatten_skdoy0$f:function(it) { - return it.iterator(); - }, flatten_skdoy0$:function($receiver) { - return _.kotlin.sequences.flatten_2($receiver, _.kotlin.sequences.flatten_skdoy0$f); - }, flatten_9q41nu$f:function(it) { - return it.iterator(); - }, flatten_9q41nu$:function($receiver) { - return _.kotlin.sequences.flatten_2($receiver, _.kotlin.sequences.flatten_9q41nu$f); - }, flatten_2$f:function(it) { - return it; - }, flatten_2:function($receiver, iterator) { - var tmp$0; - if (Kotlin.isType($receiver, _.kotlin.sequences.TransformingSequence)) { - return(Kotlin.isType(tmp$0 = $receiver, _.kotlin.sequences.TransformingSequence) ? tmp$0 : Kotlin.throwCCE()).flatten(iterator); - } - return new _.kotlin.sequences.FlatteningSequence($receiver, _.kotlin.sequences.flatten_2$f, iterator); - }, unzip_t83shn$:function($receiver) { - var tmp$0; - var listT = new Kotlin.ArrayList; - var listR = new Kotlin.ArrayList; - tmp$0 = $receiver.iterator(); - while (tmp$0.hasNext()) { - var pair = tmp$0.next(); - listT.add_za3rmp$(pair.first); - listR.add_za3rmp$(pair.second); - } - return _.kotlin.to_l1ob02$(listT, listR); - }, FilteringSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence, sendWhen, predicate) { - if (sendWhen === void 0) { - sendWhen = true; - } - this.sequence_z4pg1f$ = sequence; - this.sendWhen_y7o6ge$ = sendWhen; - this.predicate_rgqu8l$ = predicate; - }, {iterator:function() { - return new _.kotlin.sequences.FilteringSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$FilteringSequence) { - this.this$FilteringSequence_0 = this$FilteringSequence; - this.iterator = this$FilteringSequence.sequence_z4pg1f$.iterator(); - this.nextState = -1; - this.nextItem = null; - }, {calcNext:function() { - while (this.iterator.hasNext()) { - var item = this.iterator.next(); - if (Kotlin.equals(this.this$FilteringSequence_0.predicate_rgqu8l$(item), this.this$FilteringSequence_0.sendWhen_y7o6ge$)) { - this.nextItem = item; - this.nextState = 1; - return; - } - } - this.nextState = 0; - }, next:function() { - var tmp$0; - if (this.nextState === -1) { - this.calcNext(); - } - if (this.nextState === 0) { - throw new Kotlin.NoSuchElementException; - } - var result = this.nextItem; - this.nextItem = null; - this.nextState = -1; - return(tmp$0 = result) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - }, hasNext:function() { - if (this.nextState === -1) { - this.calcNext(); - } - return this.nextState === 1; - }}, {})}), TransformingSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence, transformer) { - this.sequence_n6gmof$ = sequence; - this.transformer_t8sv9n$ = transformer; - }, {iterator:function() { - return new _.kotlin.sequences.TransformingSequence.iterator$f(this); - }, flatten:function(iterator) { - return new _.kotlin.sequences.FlatteningSequence(this.sequence_n6gmof$, this.transformer_t8sv9n$, iterator); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$TransformingSequence) { - this.this$TransformingSequence_0 = this$TransformingSequence; - this.iterator = this$TransformingSequence.sequence_n6gmof$.iterator(); - }, {next:function() { - return this.this$TransformingSequence_0.transformer_t8sv9n$(this.iterator.next()); - }, hasNext:function() { - return this.iterator.hasNext(); - }}, {})}), TransformingIndexedSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence, transformer) { - this.sequence_wt2qws$ = sequence; - this.transformer_vk8fya$ = transformer; - }, {iterator:function() { - return new _.kotlin.sequences.TransformingIndexedSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$TransformingIndexedSequence) { - this.this$TransformingIndexedSequence_0 = this$TransformingIndexedSequence; - this.iterator = this$TransformingIndexedSequence.sequence_wt2qws$.iterator(); - this.index = 0; - }, {next:function() { - return this.this$TransformingIndexedSequence_0.transformer_vk8fya$(this.index++, this.iterator.next()); - }, hasNext:function() { - return this.iterator.hasNext(); - }}, {})}), IndexingSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence) { - this.sequence_4mu851$ = sequence; - }, {iterator:function() { - return new _.kotlin.sequences.IndexingSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$IndexingSequence) { - this.iterator = this$IndexingSequence.sequence_4mu851$.iterator(); - this.index = 0; - }, {next:function() { - return new _.kotlin.collections.IndexedValue(this.index++, this.iterator.next()); - }, hasNext:function() { - return this.iterator.hasNext(); - }}, {})}), MergingSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence1, sequence2, transform) { - this.sequence1_gsgqfj$ = sequence1; - this.sequence2_gsgqfk$ = sequence2; - this.transform_ieuv6d$ = transform; - }, {iterator:function() { - return new _.kotlin.sequences.MergingSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$MergingSequence) { - this.this$MergingSequence_0 = this$MergingSequence; - this.iterator1 = this$MergingSequence.sequence1_gsgqfj$.iterator(); - this.iterator2 = this$MergingSequence.sequence2_gsgqfk$.iterator(); - }, {next:function() { - return this.this$MergingSequence_0.transform_ieuv6d$(this.iterator1.next(), this.iterator2.next()); - }, hasNext:function() { - return this.iterator1.hasNext() && this.iterator2.hasNext(); - }}, {})}), FlatteningSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence, transformer, iterator) { - this.sequence_cjvkmf$ = sequence; - this.transformer_eche5v$ = transformer; - this.iterator_9sfvmc$ = iterator; - }, {iterator:function() { - return new _.kotlin.sequences.FlatteningSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$FlatteningSequence) { - this.this$FlatteningSequence_0 = this$FlatteningSequence; - this.iterator = this$FlatteningSequence.sequence_cjvkmf$.iterator(); - this.itemIterator = null; - }, {next:function() { - var tmp$0; - if (!this.ensureItemIterator()) { - throw new Kotlin.NoSuchElementException; - } - return((tmp$0 = this.itemIterator) != null ? tmp$0 : Kotlin.throwNPE()).next(); - }, hasNext:function() { - return this.ensureItemIterator(); - }, ensureItemIterator:function() { - var tmp$0; - if (Kotlin.equals((tmp$0 = this.itemIterator) != null ? tmp$0.hasNext() : null, false)) { - this.itemIterator = null; - } - while (this.itemIterator == null) { - if (!this.iterator.hasNext()) { - return false; - } else { - var element = this.iterator.next(); - var nextItemIterator = this.this$FlatteningSequence_0.iterator_9sfvmc$(this.this$FlatteningSequence_0.transformer_eche5v$(element)); - if (nextItemIterator.hasNext()) { - this.itemIterator = nextItemIterator; - return true; - } - } - } - return true; - }}, {})}), DropTakeSequence:Kotlin.createTrait(function() { - return[_.kotlin.sequences.Sequence]; - }), SubSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.DropTakeSequence, _.kotlin.sequences.Sequence]; - }, function(sequence, startIndex, endIndex) { - this.sequence_oyhgp5$ = sequence; - this.startIndex_90rd2$ = startIndex; - this.endIndex_j2ttcj$ = endIndex; - if (!(this.startIndex_90rd2$ >= 0)) { - var message = "startIndex should be non-negative, but is " + this.startIndex_90rd2$; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - if (!(this.endIndex_j2ttcj$ >= 0)) { - var message_0 = "endIndex should be non-negative, but is " + this.endIndex_j2ttcj$; - throw new Kotlin.IllegalArgumentException(message_0.toString()); - } - if (!(this.endIndex_j2ttcj$ >= this.startIndex_90rd2$)) { - var message_1 = "endIndex should be not less than startIndex, but was " + this.endIndex_j2ttcj$ + " \x3c " + this.startIndex_90rd2$; - throw new Kotlin.IllegalArgumentException(message_1.toString()); - } - }, {count_9mr353$:{get:function() { - return this.endIndex_j2ttcj$ - this.startIndex_90rd2$; - }}, drop_za3lpa$:function(n) { - return n >= this.count_9mr353$ ? _.kotlin.sequences.emptySequence() : new _.kotlin.sequences.SubSequence(this.sequence_oyhgp5$, this.startIndex_90rd2$ + n, this.endIndex_j2ttcj$); - }, take_za3lpa$:function(n) { - return n >= this.count_9mr353$ ? this : new _.kotlin.sequences.SubSequence(this.sequence_oyhgp5$, this.startIndex_90rd2$, this.startIndex_90rd2$ + n); - }, iterator:function() { - return new _.kotlin.sequences.SubSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$SubSequence) { - this.this$SubSequence_0 = this$SubSequence; - this.iterator = this$SubSequence.sequence_oyhgp5$.iterator(); - this.position = 0; - }, {drop:function() { - while (this.position < this.this$SubSequence_0.startIndex_90rd2$ && this.iterator.hasNext()) { - this.iterator.next(); - this.position++; - } - }, hasNext:function() { - this.drop(); - return this.position < this.this$SubSequence_0.endIndex_j2ttcj$ && this.iterator.hasNext(); - }, next:function() { - this.drop(); - if (this.position >= this.this$SubSequence_0.endIndex_j2ttcj$) { - throw new Kotlin.NoSuchElementException; - } - this.position++; - return this.iterator.next(); - }}, {})}), TakeSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.DropTakeSequence, _.kotlin.sequences.Sequence]; - }, function(sequence, count) { - this.sequence_4b84m6$ = sequence; - this.count_rcgz8u$ = count; - if (!(this.count_rcgz8u$ >= 0)) { - var message = "count must be non-negative, but was " + this.count_rcgz8u$ + "."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - }, {drop_za3lpa$:function(n) { - return n >= this.count_rcgz8u$ ? _.kotlin.sequences.emptySequence() : new _.kotlin.sequences.SubSequence(this.sequence_4b84m6$, n, this.count_rcgz8u$); - }, take_za3lpa$:function(n) { - return n >= this.count_rcgz8u$ ? this : new _.kotlin.sequences.TakeSequence(this.sequence_4b84m6$, n); - }, iterator:function() { - return new _.kotlin.sequences.TakeSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$TakeSequence) { - this.left = this$TakeSequence.count_rcgz8u$; - this.iterator = this$TakeSequence.sequence_4b84m6$.iterator(); - }, {next:function() { - if (this.left === 0) { - throw new Kotlin.NoSuchElementException; - } - this.left--; - return this.iterator.next(); - }, hasNext:function() { - return this.left > 0 && this.iterator.hasNext(); - }}, {})}), TakeWhileSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence, predicate) { - this.sequence_augs99$ = sequence; - this.predicate_msmsk5$ = predicate; - }, {iterator:function() { - return new _.kotlin.sequences.TakeWhileSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$TakeWhileSequence) { - this.this$TakeWhileSequence_0 = this$TakeWhileSequence; - this.iterator = this$TakeWhileSequence.sequence_augs99$.iterator(); - this.nextState = -1; - this.nextItem = null; - }, {calcNext:function() { - if (this.iterator.hasNext()) { - var item = this.iterator.next(); - if (this.this$TakeWhileSequence_0.predicate_msmsk5$(item)) { - this.nextState = 1; - this.nextItem = item; - return; - } - } - this.nextState = 0; - }, next:function() { - var tmp$0; - if (this.nextState === -1) { - this.calcNext(); - } - if (this.nextState === 0) { - throw new Kotlin.NoSuchElementException; - } - var result = (tmp$0 = this.nextItem) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - this.nextItem = null; - this.nextState = -1; - return result; - }, hasNext:function() { - if (this.nextState === -1) { - this.calcNext(); - } - return this.nextState === 1; - }}, {})}), DropSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.DropTakeSequence, _.kotlin.sequences.Sequence]; - }, function(sequence, count) { - this.sequence_mdo2d2$ = sequence; - this.count_52wnp6$ = count; - if (!(this.count_52wnp6$ >= 0)) { - var message = "count must be non-negative, but was " + this.count_52wnp6$ + "."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - }, {drop_za3lpa$:function(n) { - return new _.kotlin.sequences.DropSequence(this.sequence_mdo2d2$, this.count_52wnp6$ + n); - }, take_za3lpa$:function(n) { - return new _.kotlin.sequences.SubSequence(this.sequence_mdo2d2$, this.count_52wnp6$, this.count_52wnp6$ + n); - }, iterator:function() { - return new _.kotlin.sequences.DropSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$DropSequence) { - this.iterator = this$DropSequence.sequence_mdo2d2$.iterator(); - this.left = this$DropSequence.count_52wnp6$; - }, {drop:function() { - while (this.left > 0 && this.iterator.hasNext()) { - this.iterator.next(); - this.left--; - } - }, next:function() { - this.drop(); - return this.iterator.next(); - }, hasNext:function() { - this.drop(); - return this.iterator.hasNext(); - }}, {})}), DropWhileSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(sequence, predicate) { - this.sequence_474bkb$ = sequence; - this.predicate_81zatf$ = predicate; - }, {iterator:function() { - return new _.kotlin.sequences.DropWhileSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$DropWhileSequence) { - this.this$DropWhileSequence_0 = this$DropWhileSequence; - this.iterator = this$DropWhileSequence.sequence_474bkb$.iterator(); - this.dropState = -1; - this.nextItem = null; - }, {drop:function() { - while (this.iterator.hasNext()) { - var item = this.iterator.next(); - if (!this.this$DropWhileSequence_0.predicate_81zatf$(item)) { - this.nextItem = item; - this.dropState = 1; - return; - } - } - this.dropState = 0; - }, next:function() { - var tmp$0; - if (this.dropState === -1) { - this.drop(); - } - if (this.dropState === 1) { - var result = (tmp$0 = this.nextItem) == null || tmp$0 != null ? tmp$0 : Kotlin.throwCCE(); - this.nextItem = null; - this.dropState = 0; - return result; - } - return this.iterator.next(); - }, hasNext:function() { - if (this.dropState === -1) { - this.drop(); - } - return this.dropState === 1 || this.iterator.hasNext(); - }}, {})}), DistinctSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(source, keySelector) { - this.source_2sma8z$ = source; - this.keySelector_x7nm6u$ = keySelector; - }, {iterator:function() { - return new _.kotlin.sequences.DistinctIterator(this.source_2sma8z$.iterator(), this.keySelector_x7nm6u$); - }}), DistinctIterator:Kotlin.createClass(function() { - return[_.kotlin.collections.AbstractIterator]; - }, function $fun(source, keySelector) { - $fun.baseInitializer.call(this); - this.source_8cb0nq$ = source; - this.keySelector_t0csl9$ = keySelector; - this.observed_x3rjst$ = new Kotlin.ComplexHashSet; - }, {computeNext:function() { - while (this.source_8cb0nq$.hasNext()) { - var next = this.source_8cb0nq$.next(); - var key = this.keySelector_t0csl9$(next); - if (this.observed_x3rjst$.add_za3rmp$(key)) { - this.setNext_za3rmp$(next); - return; - } - } - this.done(); - }}), GeneratorSequence:Kotlin.createClass(function() { - return[_.kotlin.sequences.Sequence]; - }, function(getInitialValue, getNextValue) { - this.getInitialValue_of3t40$ = getInitialValue; - this.getNextValue_wqyet1$ = getNextValue; - }, {iterator:function() { - return new _.kotlin.sequences.GeneratorSequence.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterator]; - }, function(this$GeneratorSequence_0) { - this.this$GeneratorSequence_0 = this$GeneratorSequence_0; - this.nextItem = null; - this.nextState = -2; - }, {calcNext:function() { - var tmp$0; - this.nextItem = this.nextState === -2 ? this.this$GeneratorSequence_0.getInitialValue_of3t40$() : this.this$GeneratorSequence_0.getNextValue_wqyet1$((tmp$0 = this.nextItem) != null ? tmp$0 : Kotlin.throwNPE()); - this.nextState = this.nextItem == null ? 0 : 1; - }, next:function() { - var tmp$0; - if (this.nextState < 0) { - this.calcNext(); - } - if (this.nextState === 0) { - throw new Kotlin.NoSuchElementException; - } - var result = (tmp$0 = this.nextItem) != null ? tmp$0 : Kotlin.throwCCE(); - this.nextState = -1; - return result; - }, hasNext:function() { - if (this.nextState < 0) { - this.calcNext(); - } - return this.nextState === 1; - }}, {})}), constrainOnce_uya9q7$:function($receiver) { - return Kotlin.isType($receiver, _.kotlin.sequences.ConstrainedOnceSequence) ? $receiver : new _.kotlin.sequences.ConstrainedOnceSequence($receiver); - }, generateSequence_un3fny$f:function(closure$nextFunction) { - return function(it) { - return closure$nextFunction(); - }; - }, generateSequence_un3fny$:function(nextFunction) { - return _.kotlin.sequences.constrainOnce_uya9q7$(new _.kotlin.sequences.GeneratorSequence(nextFunction, _.kotlin.sequences.generateSequence_un3fny$f(nextFunction))); - }, generateSequence_hiyix$f:function(closure$seed) { - return function() { - return closure$seed; - }; - }, generateSequence_hiyix$:function(seed, nextFunction) { - return seed == null ? _.kotlin.sequences.EmptySequence : new _.kotlin.sequences.GeneratorSequence(_.kotlin.sequences.generateSequence_hiyix$f(seed), nextFunction); - }, generateSequence_x7nywq$:function(seedFunction, nextFunction) { - return new _.kotlin.sequences.GeneratorSequence(seedFunction, nextFunction); - }}), dom:Kotlin.definePackage(null, {build:Kotlin.definePackage(null, {createElement_juqb3g$:function($receiver, name, init) { - var elem = $receiver.createElement(name); - init.call(elem); - return elem; - }, createElement_hart3b$:function($receiver, name, doc, init) { - if (doc === void 0) { - doc = null; - } - var elem = _.kotlin.dom.ownerDocument_pmnl5l$($receiver, doc).createElement(name); - init.call(elem); - return elem; - }, addElement_juqb3g$:function($receiver, name, init) { - var child = _.kotlin.dom.build.createElement_juqb3g$($receiver, name, init); - $receiver.appendChild(child); - return child; - }, addElement_hart3b$:function($receiver, name, doc, init) { - if (doc === void 0) { - doc = null; - } - var child = _.kotlin.dom.build.createElement_hart3b$($receiver, name, doc, init); - $receiver.appendChild(child); - return child; - }}), hasClass_cjmw3z$:function($receiver, cssClass) { - var tmp$1 = $receiver.className; - return _.kotlin.text.Regex_61zpoe$("(^|.*" + "\\" + "s+)" + cssClass + "(" + "$" + "|" + "\\" + "s+.*)").matches_6bul2c$(tmp$1); - }, addClass_fwdim7$:function($receiver, cssClasses) { - var destination = new Kotlin.ArrayList; - var tmp$0, tmp$1, tmp$2; - tmp$0 = cssClasses, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (!_.kotlin.dom.hasClass_cjmw3z$($receiver, element)) { - destination.add_za3rmp$(element); - } - } - var missingClasses = destination; - if (!missingClasses.isEmpty()) { - var tmp$4; - var presentClasses = _.kotlin.text.trim_gw00vq$($receiver.className).toString(); - var $receiver_3 = new Kotlin.StringBuilder; - $receiver_3.append(presentClasses); - if (!(presentClasses.length === 0)) { - $receiver_3.append(" "); - } - _.kotlin.collections.joinTo_euycuk$(missingClasses, $receiver_3, " "); - $receiver.className = $receiver_3.toString(); - return true; - } - return false; - }, removeClass_fwdim7$:function($receiver, cssClasses) { - var any_dgtl0h$result; - any_dgtl0h$break: { - var tmp$0, tmp$1, tmp$2; - tmp$0 = cssClasses, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var element = tmp$0[tmp$2]; - if (_.kotlin.dom.hasClass_cjmw3z$($receiver, element)) { - any_dgtl0h$result = true; - break any_dgtl0h$break; - } - } - any_dgtl0h$result = false; - } - if (any_dgtl0h$result) { - var toBeRemoved = _.kotlin.collections.toSet_eg9ybj$(cssClasses); - var tmp$8; - var $receiver_3 = _.kotlin.text.trim_gw00vq$($receiver.className).toString(); - var regex = _.kotlin.text.Regex_61zpoe$("\\s+"); - var limit; - limit = 0; - var $receiver_4 = regex.split_905azu$($receiver_3, limit); - var destination = new Kotlin.ArrayList; - var tmp$9; - tmp$9 = $receiver_4.iterator(); - while (tmp$9.hasNext()) { - var element_0 = tmp$9.next(); - if (!toBeRemoved.contains_za3rmp$(element_0)) { - destination.add_za3rmp$(element_0); - } - } - $receiver.className = _.kotlin.collections.joinToString_ld60a2$(destination, " "); - return true; - } - return false; - }, children_ejp6nl$:function($receiver) { - var tmp$0, tmp$1; - return(tmp$1 = (tmp$0 = $receiver != null ? $receiver.childNodes : null) != null ? _.kotlin.dom.asList_d3eamn$(tmp$0) : null) != null ? tmp$1 : _.kotlin.collections.emptyList(); - }, childElements_ejp6nl$:function($receiver) { - var tmp$0, tmp$1; - return(tmp$1 = (tmp$0 = $receiver != null ? $receiver.childNodes : null) != null ? _.kotlin.dom.filterElements_d3eamn$(tmp$0) : null) != null ? tmp$1 : _.kotlin.collections.emptyList(); - }, childElements_cjmw3z$:function($receiver, name) { - var tmp$0, tmp$1, tmp$2; - var tmp$3; - if ((tmp$1 = (tmp$0 = $receiver != null ? $receiver.childNodes : null) != null ? _.kotlin.dom.filterElements_d3eamn$(tmp$0) : null) != null) { - var destination = new Kotlin.ArrayList; - var tmp$4; - tmp$4 = tmp$1.iterator(); - while (tmp$4.hasNext()) { - var element = tmp$4.next(); - if (Kotlin.equals(element.nodeName, name)) { - destination.add_za3rmp$(element); - } - } - tmp$3 = destination; - } else { - tmp$3 = null; - } - return(tmp$2 = tmp$3) != null ? tmp$2 : _.kotlin.collections.emptyList(); - }, get_elements_4wc2mi$:{value:function($receiver) { - return _.kotlin.dom.elements_nnvvt4$($receiver); - }}, get_elements_ejp6nl$:{value:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.elements_cjmw3z$($receiver) : null) != null ? tmp$0 : _.kotlin.collections.emptyList(); - }}, elements_cjmw3z$_0:function($receiver, localName) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.elements_cjmw3z$($receiver, localName) : null) != null ? tmp$0 : _.kotlin.collections.emptyList(); - }, elements_cjmw3z$:function($receiver, localName) { - if (localName === void 0) { - localName = "*"; - } - return _.kotlin.dom.asElementList_1($receiver.getElementsByTagName(localName)); - }, elements_nnvvt4$:function($receiver, localName) { - var tmp$0, tmp$1; - if (localName === void 0) { - localName = "*"; - } - return(tmp$1 = (tmp$0 = $receiver != null ? $receiver.getElementsByTagName(localName) : null) != null ? _.kotlin.dom.asElementList_1(tmp$0) : null) != null ? tmp$1 : _.kotlin.collections.emptyList(); - }, elements_achogv$:function($receiver, namespaceUri, localName) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.elements_achogv$_0($receiver, namespaceUri, localName) : null) != null ? tmp$0 : _.kotlin.collections.emptyList(); - }, elements_achogv$_0:function($receiver, namespaceUri, localName) { - return _.kotlin.dom.asElementList_1($receiver.getElementsByTagNameNS(namespaceUri, localName)); - }, elements_awnjmu$:function($receiver, namespaceUri, localName) { - var tmp$0, tmp$1; - return(tmp$1 = (tmp$0 = $receiver != null ? $receiver.getElementsByTagNameNS(namespaceUri, localName) : null) != null ? _.kotlin.dom.asElementList_1(tmp$0) : null) != null ? tmp$1 : _.kotlin.collections.emptyList(); - }, asList_d3eamn$_0:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.asList_d3eamn$($receiver) : null) != null ? tmp$0 : _.kotlin.collections.emptyList(); - }, asList_d3eamn$:function($receiver) { - return new _.kotlin.dom.NodeListAsList($receiver); - }, toElementList_d3eamn$:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.asElementList_d3eamn$($receiver) : null) != null ? tmp$0 : _.kotlin.collections.emptyList(); - }, asElementList_d3eamn$:function($receiver) { - return $receiver.length === 0 ? _.kotlin.collections.emptyList() : new _.kotlin.dom.ElementListAsList($receiver); - }, filterElements_24irbb$:function($receiver) { - var tmp$0; - var tmp$1 = Kotlin.isInstanceOf(Kotlin.modules["builtins"].kotlin.collections.List); - var destination = new Kotlin.ArrayList; - var tmp$2; - tmp$2 = $receiver.iterator(); - while (tmp$2.hasNext()) { - var element = tmp$2.next(); - if (_.kotlin.dom.get_isElement_asww5t$(element)) { - destination.add_za3rmp$(element); - } - } - return tmp$1(tmp$0 = destination) ? tmp$0 : Kotlin.throwCCE(); - }, filterElements_d3eamn$:function($receiver) { - return _.kotlin.dom.filterElements_24irbb$(_.kotlin.dom.asList_d3eamn$($receiver)); - }, NodeListAsList:Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function $fun(delegate) { - $fun.baseInitializer.call(this); - this.delegate_jo5qae$ = delegate; - }, {size:{get:function() { - return this.delegate_jo5qae$.length; - }}, get_za3lpa$:function(index) { - var tmp$0; - if ((new Kotlin.NumberRange(0, this.size - 1)).contains_htax2k$(index)) { - return(tmp$0 = this.delegate_jo5qae$.item(index)) != null ? tmp$0 : Kotlin.throwNPE(); - } else { - throw new Kotlin.IndexOutOfBoundsException("index " + index + " is not in range [0 .. " + (this.size - 1) + ")"); - } - }}), ElementListAsList:Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function $fun(nodeList) { - $fun.baseInitializer.call(this); - this.nodeList_yjzc8t$ = nodeList; - }, {get_za3lpa$:function(index) { - var tmp$0; - var node = this.nodeList_yjzc8t$.item(index); - if (node == null) { - throw new Kotlin.IndexOutOfBoundsException("NodeList does not contain a node at index: " + index); - } else { - if (node.nodeType === Node.ELEMENT_NODE) { - return Kotlin.isType(tmp$0 = node, Element) ? tmp$0 : Kotlin.throwCCE(); - } else { - throw new Kotlin.IllegalArgumentException("Node is not an Element as expected but is " + Kotlin.toString(node)); - } - } - }, size:{get:function() { - return this.nodeList_yjzc8t$.length; - }}}), nextSiblings_asww5t$:function($receiver) { - return new _.kotlin.dom.NextSiblings($receiver); - }, NextSiblings:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(node) { - this.node_9zprnx$ = node; - }, {iterator:function() { - return new _.kotlin.dom.NextSiblings.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[_.kotlin.collections.AbstractIterator]; - }, function $fun(this$NextSiblings_0) { - this.this$NextSiblings_0 = this$NextSiblings_0; - $fun.baseInitializer.call(this); - }, {computeNext:function() { - var nextValue = this.this$NextSiblings_0.node_9zprnx$.nextSibling; - if (nextValue != null) { - this.setNext_za3rmp$(nextValue); - this.this$NextSiblings_0.node_9zprnx$ = nextValue; - } else { - this.done(); - } - }}, {})}), previousSiblings_asww5t$:function($receiver) { - return new _.kotlin.dom.PreviousSiblings($receiver); - }, PreviousSiblings:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.collections.Iterable]; - }, function(node) { - this.node_ugyp4f$ = node; - }, {iterator:function() { - return new _.kotlin.dom.PreviousSiblings.iterator$f(this); - }}, {iterator$f:Kotlin.createClass(function() { - return[_.kotlin.collections.AbstractIterator]; - }, function $fun(this$PreviousSiblings_0) { - this.this$PreviousSiblings_0 = this$PreviousSiblings_0; - $fun.baseInitializer.call(this); - }, {computeNext:function() { - var nextValue = this.this$PreviousSiblings_0.node_ugyp4f$.previousSibling; - if (nextValue != null) { - this.setNext_za3rmp$(nextValue); - this.this$PreviousSiblings_0.node_ugyp4f$ = nextValue; - } else { - this.done(); - } - }}, {})}), get_isText_asww5t$:{value:function($receiver) { - return $receiver.nodeType === Node.TEXT_NODE || $receiver.nodeType === Node.CDATA_SECTION_NODE; - }}, get_isElement_asww5t$:{value:function($receiver) { - return $receiver.nodeType === Node.ELEMENT_NODE; - }}, attribute_cjmw3z$:function($receiver, name) { - var tmp$0; - return(tmp$0 = $receiver.getAttribute(name)) != null ? tmp$0 : ""; - }, get_head_d3eamn$:{value:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.asList_d3eamn$($receiver) : null) != null ? _.kotlin.collections.firstOrNull_a7ptmv$(tmp$0) : null; - }}, get_first_d3eamn$:{value:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.asList_d3eamn$($receiver) : null) != null ? _.kotlin.collections.firstOrNull_a7ptmv$(tmp$0) : null; - }}, get_last_d3eamn$:{value:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.asList_d3eamn$($receiver) : null) != null ? _.kotlin.collections.lastOrNull_a7ptmv$(tmp$0) : null; - }}, get_tail_d3eamn$:{value:function($receiver) { - var tmp$0; - return(tmp$0 = $receiver != null ? _.kotlin.dom.asList_d3eamn$($receiver) : null) != null ? _.kotlin.collections.lastOrNull_a7ptmv$(tmp$0) : null; - }}, eventHandler_kcwmyb$:function(handler) { - return new _.kotlin.dom.EventListenerHandler(handler); - }, EventListenerHandler:Kotlin.createClass(null, function(handler) { - this.handler_nfhy41$ = handler; - }, {handleEvent:function(e) { - this.handler_nfhy41$(e); - }, toString:function() { - return "EventListenerHandler(" + this.handler_nfhy41$ + ")"; - }}), mouseEventHandler_3m19zy$f:function(closure$handler) { - return function(e) { - if (Kotlin.isType(e, MouseEvent)) { - closure$handler(e); - } - }; - }, mouseEventHandler_3m19zy$:function(handler) { - return _.kotlin.dom.eventHandler_kcwmyb$(_.kotlin.dom.mouseEventHandler_3m19zy$f(handler)); - }, on_9k7t35$:function($receiver, name, capture, handler) { - return _.kotlin.dom.on_edii0a$($receiver, name, capture, _.kotlin.dom.eventHandler_kcwmyb$(handler)); - }, on_edii0a$:function($receiver, name, capture, listener) { - var tmp$0; - if (Kotlin.isType($receiver, EventTarget)) { - $receiver.addEventListener(name, listener, capture); - tmp$0 = new _.kotlin.dom.CloseableEventListener($receiver, listener, name, capture); - } else { - tmp$0 = null; - } - return tmp$0; - }, CloseableEventListener:Kotlin.createClass(function() { - return[Kotlin.Closeable]; - }, function(target, listener, name, capture) { - this.target_isfv2i$ = target; - this.listener_q3o4k3$ = listener; - this.name_a3xzng$ = name; - this.capture_m7iaz7$ = capture; - }, {close:function() { - this.target_isfv2i$.removeEventListener(this.name_a3xzng$, this.listener_q3o4k3$, this.capture_m7iaz7$); - }, toString:function() { - return "CloseableEventListener(" + this.target_isfv2i$ + ", " + this.name_a3xzng$ + ")"; - }}), onClick_g2lu80$:function($receiver, capture, handler) { - if (capture === void 0) { - capture = false; - } - return _.kotlin.dom.on_edii0a$($receiver, "click", capture, _.kotlin.dom.mouseEventHandler_3m19zy$(handler)); - }, onDoubleClick_g2lu80$:function($receiver, capture, handler) { - if (capture === void 0) { - capture = false; - } - return _.kotlin.dom.on_edii0a$($receiver, "dblclick", capture, _.kotlin.dom.mouseEventHandler_3m19zy$(handler)); - }, get_nnvvt4$:function($receiver, selector) { - var tmp$0, tmp$1, tmp$2; - return(tmp$2 = (tmp$1 = (tmp$0 = $receiver != null ? $receiver.querySelectorAll(selector) : null) != null ? _.kotlin.dom.asList_d3eamn$(tmp$0) : null) != null ? _.kotlin.dom.filterElements_24irbb$(tmp$1) : null) != null ? tmp$2 : _.kotlin.collections.emptyList(); - }, get_cjmw3z$:function($receiver, selector) { - return _.kotlin.dom.filterElements_24irbb$(_.kotlin.dom.asList_d3eamn$($receiver.querySelectorAll(selector))); - }, HTMLCollectionListView:Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function $fun(collection) { - $fun.baseInitializer.call(this); - this.collection = collection; - }, {size:{get:function() { - return this.collection.length; - }}, get_za3lpa$:function(index) { - var tmp$0; - if ((new Kotlin.NumberRange(0, this.size - 1)).contains_htax2k$(index)) { - return Kotlin.isType(tmp$0 = this.collection.item(index), HTMLElement) ? tmp$0 : Kotlin.throwCCE(); - } else { - throw new Kotlin.IndexOutOfBoundsException("index " + index + " is not in range [0 .. " + (this.size - 1) + ")"); - } - }}), asList_sg7yuw$:function($receiver) { - return new _.kotlin.dom.HTMLCollectionListView($receiver); - }, DOMTokenListView:Kotlin.createClass(function() { - return[Kotlin.AbstractList]; - }, function $fun(delegate) { - $fun.baseInitializer.call(this); - this.delegate = delegate; - }, {size:{get:function() { - return this.delegate.length; - }}, get_za3lpa$:function(index) { - var tmp$0; - if ((new Kotlin.NumberRange(0, this.size - 1)).contains_htax2k$(index)) { - return(tmp$0 = this.delegate.item(index)) != null ? tmp$0 : Kotlin.throwNPE(); - } else { - throw new Kotlin.IndexOutOfBoundsException("index " + index + " is not in range [0 .. " + (this.size - 1) + ")"); - } - }}), asList_u75qis$:function($receiver) { - return new _.kotlin.dom.DOMTokenListView($receiver); - }, asElementList_1:function($receiver) { - return _.kotlin.dom.asList_sg7yuw$($receiver); - }, clear_asww5t$:function($receiver) { - var tmp$0; - while ($receiver.hasChildNodes()) { - $receiver.removeChild((tmp$0 = $receiver.firstChild) != null ? tmp$0 : Kotlin.throwNPE()); - } - }, removeFromParent_asww5t$:function($receiver) { - var tmp$0; - (tmp$0 = $receiver.parentNode) != null ? tmp$0.removeChild($receiver) : null; - }, plus_6xfunm$:function($receiver, child) { - $receiver.appendChild(child); - return $receiver; - }, plus_cjmw3z$:function($receiver, text) { - return _.kotlin.dom.appendText_esmrqt$($receiver, text); - }, plusAssign_cjmw3z$:function($receiver, text) { - _.kotlin.dom.appendText_esmrqt$($receiver, text); - }, ownerDocument_pmnl5l$:function($receiver, doc) { - var tmp$0, tmp$1; - if (doc === void 0) { - doc = null; - } - if ($receiver.nodeType === Node.DOCUMENT_NODE) { - return Kotlin.isType(tmp$0 = $receiver, Document) ? tmp$0 : Kotlin.throwCCE(); - } else { - tmp$1 = doc != null ? doc : $receiver.ownerDocument; - if (tmp$1 == null) { - throw new Kotlin.IllegalArgumentException("Neither node contains nor parameter doc provides an owner document for " + $receiver); - } - return tmp$1; - } - }, addText_esmrqt$:function($receiver, text, doc) { - if (doc === void 0) { - doc = null; - } - return _.kotlin.dom.appendText_esmrqt$($receiver, text, doc); - }, addText_cjmw3z$:function($receiver, text) { - return _.kotlin.dom.appendText_esmrqt$($receiver, text); - }, appendText_esmrqt$:function($receiver, text, doc) { - if (doc === void 0) { - doc = null; - } - $receiver.appendChild(_.kotlin.dom.ownerDocument_pmnl5l$($receiver, doc).createTextNode(text)); - return $receiver; - }, appendTo_5kzm9c$:function($receiver, parent) { - parent.appendChild($receiver); - }, createDocument:function() { - return new Document; - }, toXmlString_asww5t$:function($receiver) { - return $receiver.outerHTML; - }, toXmlString_rq0l4m$:function($receiver, xmlDeclaration) { - return $receiver.outerHTML; - }}), test:Kotlin.definePackage(function() { - this.asserter = new _.kotlin.test.QUnitAsserter; - }, {todo_un3fny$:function(block) { - Kotlin.println("TODO at " + block); - }, assertFailsWith_ayzjzk$:Kotlin.defineInlineFunction("stdlib.kotlin.test.assertFailsWith_ayzjzk$", function(isT, message, block) { - var tmp$0, tmp$1; - if (message === void 0) { - message = null; - } - var exception = _.kotlin.test.assertFails_qshda6$(block); - _.kotlin.test.assertTrue_8kj6y5$(isT(exception), ((tmp$0 = message != null ? message + ". " : null) != null ? tmp$0 : "") + ("An exception thrown is not of the expected type: " + exception)); - return isT(tmp$1 = exception) ? tmp$1 : Kotlin.throwCCE(); - }), QUnitAsserter:Kotlin.createClass(function() { - return[_.kotlin.test.Asserter]; - }, null, {assertTrue_tup0fe$:function(lazyMessage, actual) { - _.kotlin.test.assertTrue_8kj6y5$(actual, lazyMessage()); - }, assertTrue_ivxn3r$:function(message, actual) { - ok(actual, message); - if (!actual) { - this.failWithMessage(message); - } - }, fail_61zpoe$:function(message) { - ok(false, message); - this.failWithMessage(message); - }, failWithMessage:function(message) { - if (message == null) { - throw new Kotlin.AssertionError; - } else { - throw new Kotlin.AssertionError(message); - } - }}), assertTrue_c0mt8g$:function(message, block) { - if (message === void 0) { - message = null; - } - _.kotlin.test.assertTrue_8kj6y5$(block(), message); - }, assertTrue_8kj6y5$:function(actual, message) { - if (message === void 0) { - message = null; - } - return _.kotlin.test.asserter.assertTrue_ivxn3r$(message != null ? message : "Expected value to be true.", actual); - }, assertFalse_c0mt8g$:function(message, block) { - if (message === void 0) { - message = null; - } - _.kotlin.test.assertFalse_8kj6y5$(block(), message); - }, assertFalse_8kj6y5$:function(actual, message) { - if (message === void 0) { - message = null; - } - return _.kotlin.test.asserter.assertTrue_ivxn3r$(message != null ? message : "Expected value to be false.", !actual); - }, assertEquals_8vv676$:function(expected, actual, message) { - if (message === void 0) { - message = null; - } - _.kotlin.test.asserter.assertEquals_a59ba6$(message, expected, actual); - }, assertNotEquals_8vv676$:function(illegal, actual, message) { - if (message === void 0) { - message = null; - } - _.kotlin.test.asserter.assertNotEquals_a59ba6$(message, illegal, actual); - }, assertNotNull_hwpqgh$:function(actual, message) { - if (message === void 0) { - message = null; - } - _.kotlin.test.asserter.assertNotNull_bm4g0d$(message, actual); - return actual != null ? actual : Kotlin.throwNPE(); - }, assertNotNull_nbs6dl$:function(actual, message, block) { - if (message === void 0) { - message = null; - } - _.kotlin.test.asserter.assertNotNull_bm4g0d$(message, actual); - if (actual != null) { - block(actual); - } - }, assertNull_hwpqgh$:function(actual, message) { - if (message === void 0) { - message = null; - } - _.kotlin.test.asserter.assertNull_bm4g0d$(message, actual); - }, fail_61zpoe$:function(message) { - if (message === void 0) { - message = null; - } - _.kotlin.test.asserter.fail_61zpoe$(message); - }, expect_pzucw5$:function(expected, block) { - _.kotlin.test.assertEquals_8vv676$(expected, block()); - }, expect_s8u0d3$:function(expected, message, block) { - _.kotlin.test.assertEquals_8vv676$(expected, block(), message); - }, assertFails_qshda6$:function(block) { - try { - block(); - } catch (e) { - return e; - } - _.kotlin.test.asserter.fail_61zpoe$("Expected an exception to be thrown"); - }, Asserter:Kotlin.createTrait(null, {assertTrue_tup0fe$:function(lazyMessage, actual) { - if (!actual) { - this.fail_61zpoe$(lazyMessage()); - } - }, assertTrue_ivxn3r$:function(message, actual) { - this.assertTrue_tup0fe$(_.kotlin.test.Asserter.assertTrue_ivxn3r$f(message), actual); - }, assertEquals_a59ba6$:function(message, expected, actual) { - this.assertTrue_tup0fe$(_.kotlin.test.Asserter.assertEquals_a59ba6$f(message, expected, actual), Kotlin.equals(actual, expected)); - }, assertNotEquals_a59ba6$:function(message, illegal, actual) { - this.assertTrue_tup0fe$(_.kotlin.test.Asserter.assertNotEquals_a59ba6$f(message, actual), !Kotlin.equals(actual, illegal)); - }, assertNull_bm4g0d$:function(message, actual) { - this.assertTrue_tup0fe$(_.kotlin.test.Asserter.assertNull_bm4g0d$f(message, actual), actual == null); - }, assertNotNull_bm4g0d$:function(message, actual) { - this.assertTrue_tup0fe$(_.kotlin.test.Asserter.assertNotNull_bm4g0d$f(message), actual != null); - }}, {assertTrue_ivxn3r$f:function(closure$message) { - return function() { - return closure$message; - }; - }, assertEquals_a59ba6$f:function(closure$message, closure$expected, closure$actual) { - return function() { - var tmp$0; - return((tmp$0 = closure$message != null ? closure$message + ". " : null) != null ? tmp$0 : "") + ("Expected \x3c" + Kotlin.toString(closure$expected) + "\x3e, actual \x3c" + Kotlin.toString(closure$actual) + "\x3e."); - }; - }, assertNotEquals_a59ba6$f:function(closure$message, closure$actual) { - return function() { - var tmp$0; - return((tmp$0 = closure$message != null ? closure$message + ". " : null) != null ? tmp$0 : "") + ("Illegal value: \x3c" + Kotlin.toString(closure$actual) + "\x3e."); - }; - }, assertNull_bm4g0d$f:function(closure$message, closure$actual) { - return function() { - var tmp$0; - return((tmp$0 = closure$message != null ? closure$message + ". " : null) != null ? tmp$0 : "") + ("Expected value to be null, but was: \x3c" + Kotlin.toString(closure$actual) + "\x3e."); - }; - }, assertNotNull_bm4g0d$f:function(closure$message) { - return function() { - var tmp$0; - return((tmp$0 = closure$message != null ? closure$message + ". " : null) != null ? tmp$0 : "") + "Expected value to be not null."; - }; - }}), AsserterContributor:Kotlin.createTrait(null)}), annotation:Kotlin.definePackage(null, {AnnotationTarget:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{CLASS:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, ANNOTATION_CLASS:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, TYPE_PARAMETER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, PROPERTY:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, FIELD:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, LOCAL_VARIABLE:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, VALUE_PARAMETER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, CONSTRUCTOR:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, FUNCTION:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, PROPERTY_GETTER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, PROPERTY_SETTER:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, TYPE:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, EXPRESSION:function() { - return new _.kotlin.annotation.AnnotationTarget; - }, FILE:function() { - return new _.kotlin.annotation.AnnotationTarget; - }}; - }), AnnotationRetention:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{SOURCE:function() { - return new _.kotlin.annotation.AnnotationRetention; - }, BINARY:function() { - return new _.kotlin.annotation.AnnotationRetention; - }, RUNTIME:function() { - return new _.kotlin.annotation.AnnotationRetention; - }}; - }), Target:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, function(allowedTargets) { - this.allowedTargets = allowedTargets; - }), Retention:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, function(value) { - if (value === void 0) { - value = _.kotlin.annotation.AnnotationRetention.RUNTIME; - } - this.value = value; - }), Repeatable:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), MustBeDocumented:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null)}), reflect:Kotlin.definePackage(null, {KAnnotatedElement:Kotlin.createTrait(null), KCallable:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KAnnotatedElement]; - }), KClass:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KAnnotatedElement, _.kotlin.reflect.KDeclarationContainer]; - }), KDeclarationContainer:Kotlin.createTrait(null), KFunction:Kotlin.createTrait(function() { - return[Kotlin.modules["builtins"].kotlin.Function, _.kotlin.reflect.KCallable]; - }), KParameter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KAnnotatedElement]; - }, null, {Kind:Kotlin.createEnumClass(function() { - return[Kotlin.Enum]; - }, function $fun() { - $fun.baseInitializer.call(this); - }, function() { - return{INSTANCE:function() { - return new _.kotlin.reflect.KParameter.Kind; - }, EXTENSION_RECEIVER:function() { - return new _.kotlin.reflect.KParameter.Kind; - }, VALUE:function() { - return new _.kotlin.reflect.KParameter.Kind; - }}; - })}), KProperty:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KCallable]; - }, null, {Accessor:Kotlin.createTrait(null), Getter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KFunction, _.kotlin.reflect.KProperty.Accessor]; - })}), KMutableProperty:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty]; - }, null, {Setter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KFunction, _.kotlin.reflect.KProperty.Accessor]; - })}), KProperty0:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty]; - }, null, {Getter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty.Getter]; - })}), KMutableProperty0:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KMutableProperty, _.kotlin.reflect.KProperty0]; - }, null, {Setter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KMutableProperty.Setter]; - })}), KProperty1:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty]; - }, null, {Getter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty.Getter]; - })}), KMutableProperty1:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KMutableProperty, _.kotlin.reflect.KProperty1]; - }, null, {Setter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KMutableProperty.Setter]; - })}), KProperty2:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty]; - }, null, {Getter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KProperty.Getter]; - })}), KMutableProperty2:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KMutableProperty, _.kotlin.reflect.KProperty2]; - }, null, {Setter:Kotlin.createTrait(function() { - return[_.kotlin.reflect.KMutableProperty.Setter]; - })}), KType:Kotlin.createTrait(null)}), ranges:Kotlin.definePackage(null, {contains_axyzkj$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_noyhde$:function($receiver, value) { - return $receiver.start.compareTo_za3rmp$(Kotlin.Long.fromInt(value)) <= 0 && Kotlin.Long.fromInt(value).compareTo_za3rmp$($receiver.endInclusive) <= 0; - }, contains_7vxq2o$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_qod4al$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_tzsk0w$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_3hpgcq$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_uw1xdx$:function($receiver, value) { - return $receiver.start.toNumber() <= value && value <= $receiver.endInclusive.toNumber(); - }, contains_o0k7u7$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_jz6vw7$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_d9tryv$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_fyef13$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_o8j6lu$:function($receiver, value) { - return $receiver.start.toNumber() <= value && value <= $receiver.endInclusive.toNumber(); - }, contains_sas5oe$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_vgo278$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_pc36rd$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_8efj5n$:function($receiver, value) { - return $receiver.start.compareTo_za3rmp$(Kotlin.Long.fromInt(value)) <= 0 && Kotlin.Long.fromInt(value).compareTo_za3rmp$($receiver.endInclusive) <= 0; - }, contains_ro5ap$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_8wsbwp$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_8aysva$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_ll81hz$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_axst9b$:function($receiver, value) { - return Kotlin.Long.fromInt($receiver.start).compareTo_za3rmp$(value) <= 0 && value.compareTo_za3rmp$(Kotlin.Long.fromInt($receiver.endInclusive)) <= 0; - }, contains_ntuhui$:function($receiver, value) { - return Kotlin.Long.fromInt($receiver.start).compareTo_za3rmp$(value) <= 0 && value.compareTo_za3rmp$(Kotlin.Long.fromInt($receiver.endInclusive)) <= 0; - }, contains_7w3wdw$:function($receiver, value) { - return Kotlin.Long.fromInt($receiver.start).compareTo_za3rmp$(value) <= 0 && value.compareTo_za3rmp$(Kotlin.Long.fromInt($receiver.endInclusive)) <= 0; - }, contains_qojalt$:function($receiver, value) { - return $receiver.start <= value.toNumber() && value.toNumber() <= $receiver.endInclusive; - }, contains_tzyqc4$:function($receiver, value) { - return $receiver.start <= value.toNumber() && value.toNumber() <= $receiver.endInclusive; - }, contains_g5h77b$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_oflys2$:function($receiver, value) { - return $receiver.start.compareTo_za3rmp$(Kotlin.Long.fromInt(value)) <= 0 && Kotlin.Long.fromInt(value).compareTo_za3rmp$($receiver.endInclusive) <= 0; - }, contains_shuxum$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_p50el5$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, contains_6o6338$:function($receiver, value) { - return $receiver.start <= value && value <= $receiver.endInclusive; - }, downTo_2jcion$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_jzdo0$:function($receiver, to) { - return new Kotlin.LongProgression($receiver, Kotlin.Long.fromInt(to), Kotlin.Long.NEG_ONE); - }, downTo_9q324c$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_9r634a$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_sd97h4$:function($receiver, to) { - return new Kotlin.CharProgression($receiver, to, -1); - }, downTo_rksjo2$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_mw85q1$:function($receiver, to) { - return new Kotlin.LongProgression($receiver, Kotlin.Long.fromInt(to), Kotlin.Long.NEG_ONE); - }, downTo_y20kcl$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_rt69vj$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_2j6cdf$:function($receiver, to) { - return new Kotlin.LongProgression(Kotlin.Long.fromInt($receiver), to, Kotlin.Long.NEG_ONE); - }, downTo_k5jz8$:function($receiver, to) { - return new Kotlin.LongProgression($receiver, to, Kotlin.Long.NEG_ONE); - }, downTo_9q98fk$:function($receiver, to) { - return new Kotlin.LongProgression(Kotlin.Long.fromInt($receiver), to, Kotlin.Long.NEG_ONE); - }, downTo_9qzwt2$:function($receiver, to) { - return new Kotlin.LongProgression(Kotlin.Long.fromInt($receiver), to, Kotlin.Long.NEG_ONE); - }, downTo_7dmh8l$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_hgibo4$:function($receiver, to) { - return new Kotlin.LongProgression($receiver, Kotlin.Long.fromInt(to), Kotlin.Long.NEG_ONE); - }, downTo_hl85u0$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, downTo_i0qws2$:function($receiver, to) { - return new Kotlin.NumberProgression($receiver, to, -1); - }, reversed_zf1xzd$:function($receiver) { - return new Kotlin.NumberProgression($receiver.last, $receiver.first, -$receiver.step); - }, reversed_3080ca$:function($receiver) { - return new Kotlin.LongProgression($receiver.last, $receiver.first, $receiver.step.unaryMinus()); - }, reversed_uthk7o$:function($receiver) { - return new Kotlin.CharProgression($receiver.last, $receiver.first, -$receiver.step); - }, step_7isp7r$:function($receiver, step) { - _.kotlin.ranges.checkStepIsPositive(step > 0, step); - return new Kotlin.NumberProgression($receiver.first, $receiver.last, $receiver.step > 0 ? step : -step); - }, step_bwrvkh$:function($receiver, step) { - _.kotlin.ranges.checkStepIsPositive(step.compareTo_za3rmp$(Kotlin.Long.fromInt(0)) > 0, step); - return new Kotlin.LongProgression($receiver.first, $receiver.last, $receiver.step.compareTo_za3rmp$(Kotlin.Long.fromInt(0)) > 0 ? step : step.unaryMinus()); - }, step_kw37re$:function($receiver, step) { - _.kotlin.ranges.checkStepIsPositive(step > 0, step); - return new Kotlin.CharProgression($receiver.first, $receiver.last, $receiver.step > 0 ? step : -step); - }, until_2jcion$:function($receiver, to) { - return new Kotlin.NumberRange($receiver, to - 1); - }, until_jzdo0$:function($receiver, to) { - return $receiver.rangeTo(Kotlin.Long.fromInt(to).subtract(Kotlin.Long.fromInt(1))); - }, until_9q324c$:function($receiver, to) { - return new Kotlin.NumberRange($receiver, to - 1); - }, until_9r634a$:function($receiver, to) { - return new Kotlin.NumberRange($receiver, to - 1); - }, until_sd97h4$:function($receiver, to) { - var to_ = Kotlin.toChar(to.charCodeAt(0) - 1); - if (to_ > to) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return new Kotlin.CharRange($receiver, to_); - }, until_rksjo2$:function($receiver, to) { - var to_ = Kotlin.Long.fromInt(to).subtract(Kotlin.Long.fromInt(1)).toInt(); - if (to_ > to) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return new Kotlin.NumberRange($receiver, to_); - }, until_mw85q1$:function($receiver, to) { - return $receiver.rangeTo(Kotlin.Long.fromInt(to).subtract(Kotlin.Long.fromInt(1))); - }, until_y20kcl$:function($receiver, to) { - var to_ = Kotlin.Long.fromInt(to).subtract(Kotlin.Long.fromInt(1)).toInt(); - if (to_ > to) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return new Kotlin.NumberRange($receiver, to_); - }, until_rt69vj$:function($receiver, to) { - var to_ = Kotlin.Long.fromInt(to).subtract(Kotlin.Long.fromInt(1)).toInt(); - if (to_ > to) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return new Kotlin.NumberRange($receiver, to_); - }, until_2j6cdf$:function($receiver, to) { - var to_ = to.subtract(Kotlin.Long.fromInt(1)); - if (to_.compareTo_za3rmp$(to) > 0) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return Kotlin.Long.fromInt($receiver).rangeTo(to_); - }, until_k5jz8$:function($receiver, to) { - var to_ = to.subtract(Kotlin.Long.fromInt(1)); - if (to_.compareTo_za3rmp$(to) > 0) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return $receiver.rangeTo(to_); - }, until_9q98fk$:function($receiver, to) { - var to_ = to.subtract(Kotlin.Long.fromInt(1)); - if (to_.compareTo_za3rmp$(to) > 0) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return Kotlin.Long.fromInt($receiver).rangeTo(to_); - }, until_9qzwt2$:function($receiver, to) { - var to_ = to.subtract(Kotlin.Long.fromInt(1)); - if (to_.compareTo_za3rmp$(to) > 0) { - throw new Kotlin.IllegalArgumentException("The to argument value '" + to + "' was too small."); - } - return Kotlin.Long.fromInt($receiver).rangeTo(to_); - }, until_7dmh8l$:function($receiver, to) { - return new Kotlin.NumberRange($receiver, to - 1); - }, until_hgibo4$:function($receiver, to) { - return $receiver.rangeTo(Kotlin.Long.fromInt(to).subtract(Kotlin.Long.fromInt(1))); - }, until_hl85u0$:function($receiver, to) { - return new Kotlin.NumberRange($receiver, to - 1); - }, until_i0qws2$:function($receiver, to) { - return new Kotlin.NumberRange($receiver, to - 1); - }, coerceAtLeast_n1zt5e$:function($receiver, minimumValue) { - return Kotlin.compareTo($receiver, minimumValue) < 0 ? minimumValue : $receiver; - }, coerceAtLeast_9q324c$:function($receiver, minimumValue) { - return $receiver < minimumValue ? minimumValue : $receiver; - }, coerceAtLeast_i0qws2$:function($receiver, minimumValue) { - return $receiver < minimumValue ? minimumValue : $receiver; - }, coerceAtLeast_rksjo2$:function($receiver, minimumValue) { - return $receiver < minimumValue ? minimumValue : $receiver; - }, coerceAtLeast_k5jz8$:function($receiver, minimumValue) { - return $receiver.compareTo_za3rmp$(minimumValue) < 0 ? minimumValue : $receiver; - }, coerceAtLeast_3w14zy$:function($receiver, minimumValue) { - return $receiver < minimumValue ? minimumValue : $receiver; - }, coerceAtLeast_541hxq$:function($receiver, minimumValue) { - return $receiver < minimumValue ? minimumValue : $receiver; - }, coerceAtMost_n1zt5e$:function($receiver, maximumValue) { - return Kotlin.compareTo($receiver, maximumValue) > 0 ? maximumValue : $receiver; - }, coerceAtMost_9q324c$:function($receiver, maximumValue) { - return $receiver > maximumValue ? maximumValue : $receiver; - }, coerceAtMost_i0qws2$:function($receiver, maximumValue) { - return $receiver > maximumValue ? maximumValue : $receiver; - }, coerceAtMost_rksjo2$:function($receiver, maximumValue) { - return $receiver > maximumValue ? maximumValue : $receiver; - }, coerceAtMost_k5jz8$:function($receiver, maximumValue) { - return $receiver.compareTo_za3rmp$(maximumValue) > 0 ? maximumValue : $receiver; - }, coerceAtMost_3w14zy$:function($receiver, maximumValue) { - return $receiver > maximumValue ? maximumValue : $receiver; - }, coerceAtMost_541hxq$:function($receiver, maximumValue) { - return $receiver > maximumValue ? maximumValue : $receiver; - }, coerceIn_bgp82y$:function($receiver, minimumValue, maximumValue) { - if (minimumValue !== null && maximumValue !== null) { - if (Kotlin.compareTo(minimumValue, maximumValue) > 0) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + Kotlin.toString(maximumValue) + " is less than minimum " + Kotlin.toString(minimumValue) + "."); - } - if (Kotlin.compareTo($receiver, minimumValue) < 0) { - return minimumValue; - } - if (Kotlin.compareTo($receiver, maximumValue) > 0) { - return maximumValue; - } - } else { - if (minimumValue !== null && Kotlin.compareTo($receiver, minimumValue) < 0) { - return minimumValue; - } - if (maximumValue !== null && Kotlin.compareTo($receiver, maximumValue) > 0) { - return maximumValue; - } - } - return $receiver; - }, coerceIn_fhjj23$:function($receiver, minimumValue, maximumValue) { - if (minimumValue > maximumValue) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + maximumValue + " is less than minimum " + minimumValue + "."); - } - if ($receiver < minimumValue) { - return minimumValue; - } - if ($receiver > maximumValue) { - return maximumValue; - } - return $receiver; - }, coerceIn_j4lnkd$:function($receiver, minimumValue, maximumValue) { - if (minimumValue > maximumValue) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + maximumValue + " is less than minimum " + minimumValue + "."); - } - if ($receiver < minimumValue) { - return minimumValue; - } - if ($receiver > maximumValue) { - return maximumValue; - } - return $receiver; - }, coerceIn_n6qkdc$:function($receiver, minimumValue, maximumValue) { - if (minimumValue > maximumValue) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + maximumValue + " is less than minimum " + minimumValue + "."); - } - if ($receiver < minimumValue) { - return minimumValue; - } - if ($receiver > maximumValue) { - return maximumValue; - } - return $receiver; - }, coerceIn_dh3qhr$:function($receiver, minimumValue, maximumValue) { - if (minimumValue.compareTo_za3rmp$(maximumValue) > 0) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + maximumValue + " is less than minimum " + minimumValue + "."); - } - if ($receiver.compareTo_za3rmp$(minimumValue) < 0) { - return minimumValue; - } - if ($receiver.compareTo_za3rmp$(maximumValue) > 0) { - return maximumValue; - } - return $receiver; - }, coerceIn_x1n98z$:function($receiver, minimumValue, maximumValue) { - if (minimumValue > maximumValue) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + maximumValue + " is less than minimum " + minimumValue + "."); - } - if ($receiver < minimumValue) { - return minimumValue; - } - if ($receiver > maximumValue) { - return maximumValue; - } - return $receiver; - }, coerceIn_rq40gw$:function($receiver, minimumValue, maximumValue) { - if (minimumValue > maximumValue) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: maximum " + maximumValue + " is less than minimum " + minimumValue + "."); - } - if ($receiver < minimumValue) { - return minimumValue; - } - if ($receiver > maximumValue) { - return maximumValue; - } - return $receiver; - }, coerceIn_4yefu9$:function($receiver, range) { - if (range.isEmpty()) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: " + range + "."); - } - return Kotlin.compareTo($receiver, range.start) < 0 ? range.start : Kotlin.compareTo($receiver, range.endInclusive) > 0 ? range.endInclusive : $receiver; - }, coerceIn_3p661y$:function($receiver, range) { - if (range.isEmpty()) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: " + range + "."); - } - return $receiver < range.start ? range.start : $receiver > range.endInclusive ? range.endInclusive : $receiver; - }, coerceIn_zhas5s$:function($receiver, range) { - if (range.isEmpty()) { - throw new Kotlin.IllegalArgumentException("Cannot coerce value to an empty range: " + range + "."); - } - return $receiver.compareTo_za3rmp$(range.start) < 0 ? range.start : $receiver.compareTo_za3rmp$(range.endInclusive) > 0 ? range.endInclusive : $receiver; - }, ComparableRange:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.ranges.ClosedRange]; - }, function(start, endInclusive) { - this.$start_v9qu5w$ = start; - this.$endInclusive_edlu3r$ = endInclusive; - }, {start:{get:function() { - return this.$start_v9qu5w$; - }}, endInclusive:{get:function() { - return this.$endInclusive_edlu3r$; - }}, equals_za3rmp$:function(other) { - return Kotlin.isType(other, _.kotlin.ranges.ComparableRange) && (this.isEmpty() && other.isEmpty() || Kotlin.equals(this.start, other.start) && Kotlin.equals(this.endInclusive, other.endInclusive)); - }, hashCode:function() { - return this.isEmpty() ? -1 : 31 * Kotlin.hashCode(this.start) + Kotlin.hashCode(this.endInclusive); - }, toString:function() { - return this.start + ".." + this.endInclusive; - }}), rangeTo_n1zt5e$:function($receiver, that) { - return new _.kotlin.ranges.ComparableRange($receiver, that); - }, checkStepIsPositive:function(isPositive, step) { - if (!isPositive) { - throw new Kotlin.IllegalArgumentException("Step must be positive, was: " + step + "."); - } - }}), comparisons:Kotlin.definePackage(null, {compareValuesBy_hhbmn6$:function(a, b, selectors) { - var tmp$0, tmp$1, tmp$2; - if (!(selectors.length > 0)) { - var message = "Failed requirement."; - throw new Kotlin.IllegalArgumentException(message.toString()); - } - tmp$0 = selectors, tmp$1 = tmp$0.length; - for (var tmp$2 = 0;tmp$2 !== tmp$1;++tmp$2) { - var fn = tmp$0[tmp$2]; - var v1 = fn(a); - var v2 = fn(b); - var diff = _.kotlin.comparisons.compareValues_cj5vqg$(v1, v2); - if (diff !== 0) { - return diff; - } - } - return 0; - }, compareValuesBy_mpbrga$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.compareValuesBy_mpbrga$", function(a, b, selector) { - return _.kotlin.comparisons.compareValues_cj5vqg$(selector(a), selector(b)); - }), compareValuesBy_hfyz69$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.compareValuesBy_hfyz69$", function(a, b, comparator, selector) { - return comparator.compare(selector(a), selector(b)); - }), compareValues_cj5vqg$:function(a, b) { - var tmp$0; - if (a === b) { - return 0; - } - if (a == null) { - return-1; - } - if (b == null) { - return 1; - } - return Kotlin.compareTo(Kotlin.isComparable(tmp$0 = a) ? tmp$0 : Kotlin.throwCCE(), b); - }, compareBy$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$selectors_0) { - this.closure$selectors_0 = closure$selectors_0; - }, {compare:function(a, b) { - return _.kotlin.comparisons.compareValuesBy_hhbmn6$(a, b, this.closure$selectors_0); - }}, {}), compareBy_so0gvy$:function(selectors) { - return new _.kotlin.comparisons.compareBy$f(selectors); - }, compareBy$f_0:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$selector_0) { - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var selector = this.closure$selector_0; - return _.kotlin.comparisons.compareValues_cj5vqg$(selector(a), selector(b)); - }}, {}), compareBy_lw40be$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.compareBy_lw40be$", function(selector) { - return new _.kotlin.comparisons.compareBy$f_0(selector); - }), compareBy$f_1:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$comparator_0, closure$selector_0) { - this.closure$comparator_0 = closure$comparator_0; - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var comparator = this.closure$comparator_0; - var selector = this.closure$selector_0; - return comparator.compare(selector(a), selector(b)); - }}, {}), compareBy_ej7qdr$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.compareBy_ej7qdr$", function(comparator, selector) { - return new _.kotlin.comparisons.compareBy$f_1(comparator, selector); - }), compareByDescending$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$selector_0) { - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var selector = this.closure$selector_0; - return _.kotlin.comparisons.compareValues_cj5vqg$(selector(b), selector(a)); - }}, {}), compareByDescending_lw40be$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.compareByDescending_lw40be$", function(selector) { - return new _.kotlin.comparisons.compareByDescending$f(selector); - }), compareByDescending$f_0:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$comparator_0, closure$selector_0) { - this.closure$comparator_0 = closure$comparator_0; - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var comparator = this.closure$comparator_0; - var selector = this.closure$selector_0; - return comparator.compare(selector(b), selector(a)); - }}, {}), compareByDescending_ej7qdr$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.compareByDescending_ej7qdr$", function(comparator, selector) { - return new _.kotlin.comparisons.compareByDescending$f_0(comparator, selector); - }), thenBy$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$thenBy_0, closure$selector_0) { - this.this$thenBy_0 = this$thenBy_0; - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var previousCompare = this.this$thenBy_0.compare(a, b); - if (previousCompare !== 0) { - return previousCompare; - } else { - var selector = this.closure$selector_0; - return _.kotlin.comparisons.compareValues_cj5vqg$(selector(a), selector(b)); - } - }}, {}), thenBy_602gcl$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.thenBy_602gcl$", function($receiver, selector) { - return new _.kotlin.comparisons.thenBy$f($receiver, selector); - }), thenBy$f_0:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$thenBy_0, closure$comparator_0, closure$selector_0) { - this.this$thenBy_0 = this$thenBy_0; - this.closure$comparator_0 = closure$comparator_0; - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var previousCompare = this.this$thenBy_0.compare(a, b); - if (previousCompare !== 0) { - return previousCompare; - } else { - var comparator = this.closure$comparator_0; - var selector = this.closure$selector_0; - return comparator.compare(selector(a), selector(b)); - } - }}, {}), thenBy_njrgee$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.thenBy_njrgee$", function($receiver, comparator, selector) { - return new _.kotlin.comparisons.thenBy$f_0($receiver, comparator, selector); - }), thenByDescending$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$thenByDescending_0, closure$selector_0) { - this.this$thenByDescending_0 = this$thenByDescending_0; - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var previousCompare = this.this$thenByDescending_0.compare(a, b); - if (previousCompare !== 0) { - return previousCompare; - } else { - var selector = this.closure$selector_0; - return _.kotlin.comparisons.compareValues_cj5vqg$(selector(b), selector(a)); - } - }}, {}), thenByDescending_602gcl$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.thenByDescending_602gcl$", function($receiver, selector) { - return new _.kotlin.comparisons.thenByDescending$f($receiver, selector); - }), thenByDescending$f_0:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$thenByDescending_0, closure$comparator_0, closure$selector_0) { - this.this$thenByDescending_0 = this$thenByDescending_0; - this.closure$comparator_0 = closure$comparator_0; - this.closure$selector_0 = closure$selector_0; - }, {compare:function(a, b) { - var previousCompare = this.this$thenByDescending_0.compare(a, b); - if (previousCompare !== 0) { - return previousCompare; - } else { - var comparator = this.closure$comparator_0; - var selector = this.closure$selector_0; - return comparator.compare(selector(b), selector(a)); - } - }}, {}), thenByDescending_njrgee$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.thenByDescending_njrgee$", function($receiver, comparator, selector) { - return new _.kotlin.comparisons.thenByDescending$f_0($receiver, comparator, selector); - }), thenComparator$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$thenComparator_0, closure$comparison_0) { - this.this$thenComparator_0 = this$thenComparator_0; - this.closure$comparison_0 = closure$comparison_0; - }, {compare:function(a, b) { - var previousCompare = this.this$thenComparator_0.compare(a, b); - return previousCompare !== 0 ? previousCompare : this.closure$comparison_0(a, b); - }}, {}), thenComparator_y0jjk4$:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.thenComparator_y0jjk4$", function($receiver, comparison) { - return new _.kotlin.comparisons.thenComparator$f($receiver, comparison); - }), then$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$then_0, closure$comparator_0) { - this.this$then_0 = this$then_0; - this.closure$comparator_0 = closure$comparator_0; - }, {compare:function(a, b) { - var previousCompare = this.this$then_0.compare(a, b); - return previousCompare !== 0 ? previousCompare : this.closure$comparator_0.compare(a, b); - }}, {}), then_zdlmq6$:function($receiver, comparator) { - return new _.kotlin.comparisons.then$f($receiver, comparator); - }, thenDescending$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(this$thenDescending_0, closure$comparator_0) { - this.this$thenDescending_0 = this$thenDescending_0; - this.closure$comparator_0 = closure$comparator_0; - }, {compare:function(a, b) { - var previousCompare = this.this$thenDescending_0.compare(a, b); - return previousCompare !== 0 ? previousCompare : this.closure$comparator_0.compare(b, a); - }}, {}), thenDescending_zdlmq6$:function($receiver, comparator) { - return new _.kotlin.comparisons.thenDescending$f($receiver, comparator); - }, nullsFirst$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$comparator_0) { - this.closure$comparator_0 = closure$comparator_0; - }, {compare:function(a, b) { - if (a === b) { - return 0; - } - if (a == null) { - return-1; - } - if (b == null) { - return 1; - } - return this.closure$comparator_0.compare(a, b); - }}, {}), nullsFirst_9wwew7$:function(comparator) { - return new _.kotlin.comparisons.nullsFirst$f(comparator); - }, nullsFirst:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.nullsFirst", function() { - return _.kotlin.comparisons.nullsFirst_9wwew7$(_.kotlin.comparisons.naturalOrder()); - }), nullsLast$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$comparator_0) { - this.closure$comparator_0 = closure$comparator_0; - }, {compare:function(a, b) { - if (a === b) { - return 0; - } - if (a == null) { - return 1; - } - if (b == null) { - return-1; - } - return this.closure$comparator_0.compare(a, b); - }}, {}), nullsLast_9wwew7$:function(comparator) { - return new _.kotlin.comparisons.nullsLast$f(comparator); - }, nullsLast:Kotlin.defineInlineFunction("stdlib.kotlin.comparisons.nullsLast", function() { - return _.kotlin.comparisons.nullsLast_9wwew7$(_.kotlin.comparisons.naturalOrder()); - }), naturalOrder:function() { - var tmp$0; - return Kotlin.isType(tmp$0 = _.kotlin.comparisons.NaturalOrderComparator, Kotlin.Comparator) ? tmp$0 : Kotlin.throwCCE(); - }, reverseOrder:function() { - var tmp$0; - return Kotlin.isType(tmp$0 = _.kotlin.comparisons.ReverseOrderComparator, Kotlin.Comparator) ? tmp$0 : Kotlin.throwCCE(); - }, reversed_n7glsb$:function($receiver) { - var tmp$0, tmp$1; - if (Kotlin.isType($receiver, _.kotlin.comparisons.ReversedComparator)) { - return $receiver.comparator; - } else { - if (Kotlin.equals($receiver, _.kotlin.comparisons.NaturalOrderComparator)) { - return Kotlin.isType(tmp$0 = _.kotlin.comparisons.ReverseOrderComparator, Kotlin.Comparator) ? tmp$0 : Kotlin.throwCCE(); - } else { - if (Kotlin.equals($receiver, _.kotlin.comparisons.ReverseOrderComparator)) { - return Kotlin.isType(tmp$1 = _.kotlin.comparisons.NaturalOrderComparator, Kotlin.Comparator) ? tmp$1 : Kotlin.throwCCE(); - } else { - return new _.kotlin.comparisons.ReversedComparator($receiver); - } - } - } - }, ReversedComparator:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(comparator) { - this.comparator = comparator; - }, {compare:function(a, b) { - return this.comparator.compare(b, a); - }, reversed:function() { - return this.comparator; - }}), NaturalOrderComparator:Kotlin.createObject(function() { - return[Kotlin.Comparator]; - }, null, {compare:function(c1, c2) { - return Kotlin.compareTo(c1, c2); - }, reversed:function() { - return _.kotlin.comparisons.ReverseOrderComparator; - }}), ReverseOrderComparator:Kotlin.createObject(function() { - return[Kotlin.Comparator]; - }, null, {compare:function(c1, c2) { - return Kotlin.compareTo(c2, c1); - }, reversed:function() { - return _.kotlin.comparisons.NaturalOrderComparator; - }})}), internal:Kotlin.definePackage(null, {NoInfer:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), Exact:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), LowPriorityInOverloadResolution:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), HidesMembers:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), OnlyInputTypes:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), InlineOnly:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null), InlineExposed:Kotlin.createClass(function() { - return[Kotlin.modules["builtins"].kotlin.Annotation]; - }, null)}), properties:Kotlin.definePackage(null, {Delegates:Kotlin.createObject(null, null, {notNull:function() { - return new _.kotlin.properties.NotNullVar; - }, observable_toa4sq$:Kotlin.defineInlineFunction("stdlib.kotlin.properties.Delegates.observable_toa4sq$", function(initialValue, onChange) { - return new _.kotlin.properties.Delegates.observable$f(onChange, initialValue); - }), vetoable_jyribq$:Kotlin.defineInlineFunction("stdlib.kotlin.properties.Delegates.vetoable_jyribq$", function(initialValue, onChange) { - return new _.kotlin.properties.Delegates.vetoable$f(onChange, initialValue); - })}, {observable$f:Kotlin.createClass(function() { - return[_.kotlin.properties.ObservableProperty]; - }, function $fun(closure$onChange_0, initialValue) { - this.closure$onChange_0 = closure$onChange_0; - $fun.baseInitializer.call(this, initialValue); - }, {afterChange_lle7lx$:function(property, oldValue, newValue) { - this.closure$onChange_0(property, oldValue, newValue); - }}, {}), vetoable$f:Kotlin.createClass(function() { - return[_.kotlin.properties.ObservableProperty]; - }, function $fun(closure$onChange_0, initialValue) { - this.closure$onChange_0 = closure$onChange_0; - $fun.baseInitializer.call(this, initialValue); - }, {beforeChange_lle7lx$:function(property, oldValue, newValue) { - return this.closure$onChange_0(property, oldValue, newValue); - }}, {})}), NotNullVar:Kotlin.createClass(function() { - return[_.kotlin.properties.ReadWriteProperty]; - }, function() { - this.value_s2ygim$ = null; - }, {getValue_dsk1ci$:function(thisRef, property) { - var tmp$0; - tmp$0 = this.value_s2ygim$; - if (tmp$0 == null) { - throw new Kotlin.IllegalStateException("Property " + property.name + " should be initialized before get."); - } - return tmp$0; - }, setValue_w32e13$:function(thisRef, property, value) { - this.value_s2ygim$ = value; - }}), ReadOnlyProperty:Kotlin.createTrait(null), ReadWriteProperty:Kotlin.createTrait(null), ObservableProperty:Kotlin.createClass(function() { - return[_.kotlin.properties.ReadWriteProperty]; - }, function(initialValue) { - this.value_gpmoc7$ = initialValue; - }, {beforeChange_lle7lx$:function(property, oldValue, newValue) { - return true; - }, afterChange_lle7lx$:function(property, oldValue, newValue) { - }, getValue_dsk1ci$:function(thisRef, property) { - return this.value_gpmoc7$; - }, setValue_w32e13$:function(thisRef, property, value) { - var oldValue = this.value_gpmoc7$; - if (!this.beforeChange_lle7lx$(property, oldValue, value)) { - return; - } - this.value_gpmoc7$ = value; - this.afterChange_lle7lx$(property, oldValue, value); - }})})}), java:Kotlin.definePackage(null, {io:Kotlin.definePackage(null, {Serializable:Kotlin.createTrait(null)}), lang:Kotlin.definePackage(null, {Runnable$f:Kotlin.createClass(function() { - return[Kotlin.Runnable]; - }, function(closure$action_0) { - this.closure$action_0 = closure$action_0; - }, {run:function() { - this.closure$action_0(); - }}, {}), Runnable_qshda6$:function(action) { - return new _.java.lang.Runnable$f(action); - }, StringBuilder_za3lpa$:Kotlin.defineInlineFunction("stdlib.java.lang.StringBuilder_za3lpa$", function(capacity) { - return new Kotlin.StringBuilder; - }), StringBuilder_6bul2c$:Kotlin.defineInlineFunction("stdlib.java.lang.StringBuilder_6bul2c$", function(content) { - return new Kotlin.StringBuilder(content.toString()); - })}), util:Kotlin.definePackage(null, {Comparator$f:Kotlin.createClass(function() { - return[Kotlin.Comparator]; - }, function(closure$comparison_0) { - this.closure$comparison_0 = closure$comparison_0; - }, {compare:function(obj1, obj2) { - return this.closure$comparison_0(obj1, obj2); - }}, {}), Comparator_67l1x5$:Kotlin.defineInlineFunction("stdlib.java.util.Comparator_67l1x5$", function(comparison) { - return new _.java.util.Comparator$f(comparison); - }), HashSet_wtfk93$:function(c) { - var $receiver = new Kotlin.ComplexHashSet(c.size); - $receiver.addAll_wtfk93$(c); - return $receiver; - }, LinkedHashSet_wtfk93$:function(c) { - var $receiver = new Kotlin.LinkedHashSet(c.size); - $receiver.addAll_wtfk93$(c); - return $receiver; - }, HashMap_r12sna$:function(m) { - var $receiver = new Kotlin.ComplexHashMap(m.size); - $receiver.putAll_r12sna$(m); - return $receiver; - }, LinkedHashMap_r12sna$:function(m) { - var $receiver = new Kotlin.LinkedHashMap(m.size); - $receiver.putAll_r12sna$(m); - return $receiver; - }, ArrayList_wtfk93$:function(c) { - var $receiver = new Kotlin.ArrayList; - $receiver.array = Kotlin.copyToArray(c); - return $receiver; - }, Collections:Kotlin.createObject(null, null, {max_kqnpsu$:function(col, comp) { - return Kotlin.collectionsMax(col, comp); - }, sort_pr3zit$:function(list) { - Kotlin.collectionsSort(list, _.kotlin.comparisons.naturalOrder()); - }, sort_k5qxi4$:function(list, comparator) { - Kotlin.collectionsSort(list, comparator); - }, reverse_heioe9$:function(list) { - var tmp$0; - var size = list.size; - tmp$0 = (size / 2 | 0) - 1; - for (var i = 0;i <= tmp$0;i++) { - var i2 = size - i - 1; - var tmp = list.get_za3lpa$(i); - list.set_vux3hl$(i, list.get_za3lpa$(i2)); - list.set_vux3hl$(i2, tmp); - } - }})})}), org:Kotlin.definePackage(null, {khronos:Kotlin.definePackage(null, {webgl:Kotlin.definePackage(null, {WebGLContextAttributes_aby97w$:Kotlin.defineInlineFunction("stdlib.org.khronos.webgl.WebGLContextAttributes_aby97w$", function(alpha, depth, stencil, antialias, premultipliedAlpha, preserveDrawingBuffer, preferLowPowerToHighPerformance, failIfMajorPerformanceCaveat) { - if (alpha === void 0) { - alpha = true; - } - if (depth === void 0) { - depth = true; - } - if (stencil === void 0) { - stencil = false; - } - if (antialias === void 0) { - antialias = true; - } - if (premultipliedAlpha === void 0) { - premultipliedAlpha = true; - } - if (preserveDrawingBuffer === void 0) { - preserveDrawingBuffer = false; - } - if (preferLowPowerToHighPerformance === void 0) { - preferLowPowerToHighPerformance = false; - } - if (failIfMajorPerformanceCaveat === void 0) { - failIfMajorPerformanceCaveat = false; - } - var o = {}; - o["alpha"] = alpha; - o["depth"] = depth; - o["stencil"] = stencil; - o["antialias"] = antialias; - o["premultipliedAlpha"] = premultipliedAlpha; - o["preserveDrawingBuffer"] = preserveDrawingBuffer; - o["preferLowPowerToHighPerformance"] = preferLowPowerToHighPerformance; - o["failIfMajorPerformanceCaveat"] = failIfMajorPerformanceCaveat; - return o; - }), WebGLContextEventInit_o0ij6q$:Kotlin.defineInlineFunction("stdlib.org.khronos.webgl.WebGLContextEventInit_o0ij6q$", function(statusMessage, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["statusMessage"] = statusMessage; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - })})}), w3c:Kotlin.definePackage(null, {dom:Kotlin.definePackage(null, {events:Kotlin.definePackage(null, {UIEventInit_vz9i9r$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.UIEventInit_vz9i9r$", function(view, detail, bubbles, cancelable) { - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), FocusEventInit_n9ip3s$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.FocusEventInit_n9ip3s$", function(relatedTarget, view, detail, bubbles, cancelable) { - if (relatedTarget === void 0) { - relatedTarget = null; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["relatedTarget"] = relatedTarget; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), MouseEventInit_h05so9$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.MouseEventInit_h05so9$", function(screenX, screenY, clientX, clientY, button, buttons, relatedTarget, ctrlKey, shiftKey, altKey, metaKey, modifierAltGraph, modifierCapsLock, modifierFn, modifierFnLock, modifierHyper, modifierNumLock, modifierOS, modifierScrollLock, modifierSuper, modifierSymbol, modifierSymbolLock, view, detail, bubbles, cancelable) { - if (screenX === void 0) { - screenX = 0; - } - if (screenY === void 0) { - screenY = 0; - } - if (clientX === void 0) { - clientX = 0; - } - if (clientY === void 0) { - clientY = 0; - } - if (button === void 0) { - button = 0; - } - if (buttons === void 0) { - buttons = 0; - } - if (relatedTarget === void 0) { - relatedTarget = null; - } - if (ctrlKey === void 0) { - ctrlKey = false; - } - if (shiftKey === void 0) { - shiftKey = false; - } - if (altKey === void 0) { - altKey = false; - } - if (metaKey === void 0) { - metaKey = false; - } - if (modifierAltGraph === void 0) { - modifierAltGraph = false; - } - if (modifierCapsLock === void 0) { - modifierCapsLock = false; - } - if (modifierFn === void 0) { - modifierFn = false; - } - if (modifierFnLock === void 0) { - modifierFnLock = false; - } - if (modifierHyper === void 0) { - modifierHyper = false; - } - if (modifierNumLock === void 0) { - modifierNumLock = false; - } - if (modifierOS === void 0) { - modifierOS = false; - } - if (modifierScrollLock === void 0) { - modifierScrollLock = false; - } - if (modifierSuper === void 0) { - modifierSuper = false; - } - if (modifierSymbol === void 0) { - modifierSymbol = false; - } - if (modifierSymbolLock === void 0) { - modifierSymbolLock = false; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["screenX"] = screenX; - o["screenY"] = screenY; - o["clientX"] = clientX; - o["clientY"] = clientY; - o["button"] = button; - o["buttons"] = buttons; - o["relatedTarget"] = relatedTarget; - o["ctrlKey"] = ctrlKey; - o["shiftKey"] = shiftKey; - o["altKey"] = altKey; - o["metaKey"] = metaKey; - o["modifierAltGraph"] = modifierAltGraph; - o["modifierCapsLock"] = modifierCapsLock; - o["modifierFn"] = modifierFn; - o["modifierFnLock"] = modifierFnLock; - o["modifierHyper"] = modifierHyper; - o["modifierNumLock"] = modifierNumLock; - o["modifierOS"] = modifierOS; - o["modifierScrollLock"] = modifierScrollLock; - o["modifierSuper"] = modifierSuper; - o["modifierSymbol"] = modifierSymbol; - o["modifierSymbolLock"] = modifierSymbolLock; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), EventModifierInit_wnf6pc$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.EventModifierInit_wnf6pc$", function(ctrlKey, shiftKey, altKey, metaKey, modifierAltGraph, modifierCapsLock, modifierFn, modifierFnLock, modifierHyper, modifierNumLock, modifierOS, modifierScrollLock, modifierSuper, modifierSymbol, modifierSymbolLock, view, detail, bubbles, cancelable) { - if (ctrlKey === void 0) { - ctrlKey = false; - } - if (shiftKey === void 0) { - shiftKey = false; - } - if (altKey === void 0) { - altKey = false; - } - if (metaKey === void 0) { - metaKey = false; - } - if (modifierAltGraph === void 0) { - modifierAltGraph = false; - } - if (modifierCapsLock === void 0) { - modifierCapsLock = false; - } - if (modifierFn === void 0) { - modifierFn = false; - } - if (modifierFnLock === void 0) { - modifierFnLock = false; - } - if (modifierHyper === void 0) { - modifierHyper = false; - } - if (modifierNumLock === void 0) { - modifierNumLock = false; - } - if (modifierOS === void 0) { - modifierOS = false; - } - if (modifierScrollLock === void 0) { - modifierScrollLock = false; - } - if (modifierSuper === void 0) { - modifierSuper = false; - } - if (modifierSymbol === void 0) { - modifierSymbol = false; - } - if (modifierSymbolLock === void 0) { - modifierSymbolLock = false; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["ctrlKey"] = ctrlKey; - o["shiftKey"] = shiftKey; - o["altKey"] = altKey; - o["metaKey"] = metaKey; - o["modifierAltGraph"] = modifierAltGraph; - o["modifierCapsLock"] = modifierCapsLock; - o["modifierFn"] = modifierFn; - o["modifierFnLock"] = modifierFnLock; - o["modifierHyper"] = modifierHyper; - o["modifierNumLock"] = modifierNumLock; - o["modifierOS"] = modifierOS; - o["modifierScrollLock"] = modifierScrollLock; - o["modifierSuper"] = modifierSuper; - o["modifierSymbol"] = modifierSymbol; - o["modifierSymbolLock"] = modifierSymbolLock; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), WheelEventInit_2knbe1$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.WheelEventInit_2knbe1$", function(deltaX, deltaY, deltaZ, deltaMode, screenX, screenY, clientX, clientY, button, buttons, relatedTarget, ctrlKey, shiftKey, altKey, metaKey, modifierAltGraph, modifierCapsLock, modifierFn, modifierFnLock, modifierHyper, modifierNumLock, modifierOS, modifierScrollLock, modifierSuper, modifierSymbol, modifierSymbolLock, view, detail, bubbles, cancelable) { - if (deltaX === void 0) { - deltaX = 0; - } - if (deltaY === void 0) { - deltaY = 0; - } - if (deltaZ === void 0) { - deltaZ = 0; - } - if (deltaMode === void 0) { - deltaMode = 0; - } - if (screenX === void 0) { - screenX = 0; - } - if (screenY === void 0) { - screenY = 0; - } - if (clientX === void 0) { - clientX = 0; - } - if (clientY === void 0) { - clientY = 0; - } - if (button === void 0) { - button = 0; - } - if (buttons === void 0) { - buttons = 0; - } - if (relatedTarget === void 0) { - relatedTarget = null; - } - if (ctrlKey === void 0) { - ctrlKey = false; - } - if (shiftKey === void 0) { - shiftKey = false; - } - if (altKey === void 0) { - altKey = false; - } - if (metaKey === void 0) { - metaKey = false; - } - if (modifierAltGraph === void 0) { - modifierAltGraph = false; - } - if (modifierCapsLock === void 0) { - modifierCapsLock = false; - } - if (modifierFn === void 0) { - modifierFn = false; - } - if (modifierFnLock === void 0) { - modifierFnLock = false; - } - if (modifierHyper === void 0) { - modifierHyper = false; - } - if (modifierNumLock === void 0) { - modifierNumLock = false; - } - if (modifierOS === void 0) { - modifierOS = false; - } - if (modifierScrollLock === void 0) { - modifierScrollLock = false; - } - if (modifierSuper === void 0) { - modifierSuper = false; - } - if (modifierSymbol === void 0) { - modifierSymbol = false; - } - if (modifierSymbolLock === void 0) { - modifierSymbolLock = false; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["deltaX"] = deltaX; - o["deltaY"] = deltaY; - o["deltaZ"] = deltaZ; - o["deltaMode"] = deltaMode; - o["screenX"] = screenX; - o["screenY"] = screenY; - o["clientX"] = clientX; - o["clientY"] = clientY; - o["button"] = button; - o["buttons"] = buttons; - o["relatedTarget"] = relatedTarget; - o["ctrlKey"] = ctrlKey; - o["shiftKey"] = shiftKey; - o["altKey"] = altKey; - o["metaKey"] = metaKey; - o["modifierAltGraph"] = modifierAltGraph; - o["modifierCapsLock"] = modifierCapsLock; - o["modifierFn"] = modifierFn; - o["modifierFnLock"] = modifierFnLock; - o["modifierHyper"] = modifierHyper; - o["modifierNumLock"] = modifierNumLock; - o["modifierOS"] = modifierOS; - o["modifierScrollLock"] = modifierScrollLock; - o["modifierSuper"] = modifierSuper; - o["modifierSymbol"] = modifierSymbol; - o["modifierSymbolLock"] = modifierSymbolLock; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), KeyboardEventInit_f73pgi$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.KeyboardEventInit_f73pgi$", function(key, code, location, repeat, isComposing, ctrlKey, shiftKey, altKey, metaKey, modifierAltGraph, modifierCapsLock, modifierFn, modifierFnLock, modifierHyper, modifierNumLock, modifierOS, modifierScrollLock, modifierSuper, modifierSymbol, modifierSymbolLock, view, detail, bubbles, cancelable) { - if (key === void 0) { - key = ""; - } - if (code === void 0) { - code = ""; - } - if (location === void 0) { - location = 0; - } - if (repeat === void 0) { - repeat = false; - } - if (isComposing === void 0) { - isComposing = false; - } - if (ctrlKey === void 0) { - ctrlKey = false; - } - if (shiftKey === void 0) { - shiftKey = false; - } - if (altKey === void 0) { - altKey = false; - } - if (metaKey === void 0) { - metaKey = false; - } - if (modifierAltGraph === void 0) { - modifierAltGraph = false; - } - if (modifierCapsLock === void 0) { - modifierCapsLock = false; - } - if (modifierFn === void 0) { - modifierFn = false; - } - if (modifierFnLock === void 0) { - modifierFnLock = false; - } - if (modifierHyper === void 0) { - modifierHyper = false; - } - if (modifierNumLock === void 0) { - modifierNumLock = false; - } - if (modifierOS === void 0) { - modifierOS = false; - } - if (modifierScrollLock === void 0) { - modifierScrollLock = false; - } - if (modifierSuper === void 0) { - modifierSuper = false; - } - if (modifierSymbol === void 0) { - modifierSymbol = false; - } - if (modifierSymbolLock === void 0) { - modifierSymbolLock = false; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["key"] = key; - o["code"] = code; - o["location"] = location; - o["repeat"] = repeat; - o["isComposing"] = isComposing; - o["ctrlKey"] = ctrlKey; - o["shiftKey"] = shiftKey; - o["altKey"] = altKey; - o["metaKey"] = metaKey; - o["modifierAltGraph"] = modifierAltGraph; - o["modifierCapsLock"] = modifierCapsLock; - o["modifierFn"] = modifierFn; - o["modifierFnLock"] = modifierFnLock; - o["modifierHyper"] = modifierHyper; - o["modifierNumLock"] = modifierNumLock; - o["modifierOS"] = modifierOS; - o["modifierScrollLock"] = modifierScrollLock; - o["modifierSuper"] = modifierSuper; - o["modifierSymbol"] = modifierSymbol; - o["modifierSymbolLock"] = modifierSymbolLock; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), CompositionEventInit_v3o02b$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.events.CompositionEventInit_v3o02b$", function(data, view, detail, bubbles, cancelable) { - if (data === void 0) { - data = ""; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["data"] = data; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - })}), TrackEventInit_u7e3y1$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.TrackEventInit_u7e3y1$", function(track, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["track"] = track; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), AutocompleteErrorEventInit_o0ij6q$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.AutocompleteErrorEventInit_o0ij6q$", function(reason, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["reason"] = reason; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), RelatedEventInit_w30gy5$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.RelatedEventInit_w30gy5$", function(relatedTarget, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["relatedTarget"] = relatedTarget; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), CanvasRenderingContext2DSettings_6taknv$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.CanvasRenderingContext2DSettings_6taknv$", function(alpha) { - if (alpha === void 0) { - alpha = true; - } - var o = {}; - o["alpha"] = alpha; - return o; - }), HitRegionOptions_7peykz$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.HitRegionOptions_7peykz$", function(path, fillRule, id, parentID, cursor, control, label, role) { - if (path === void 0) { - path = null; - } - if (fillRule === void 0) { - fillRule = "nonzero"; - } - if (id === void 0) { - id = ""; - } - if (parentID === void 0) { - parentID = null; - } - if (cursor === void 0) { - cursor = "inherit"; - } - if (control === void 0) { - control = null; - } - if (label === void 0) { - label = null; - } - if (role === void 0) { - role = null; - } - var o = {}; - o["path"] = path; - o["fillRule"] = fillRule; - o["id"] = id; - o["parentID"] = parentID; - o["cursor"] = cursor; - o["control"] = control; - o["label"] = label; - o["role"] = role; - return o; - }), DragEventInit_mm3m7l$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.DragEventInit_mm3m7l$", function(dataTransfer, screenX, screenY, clientX, clientY, button, buttons, relatedTarget, ctrlKey, shiftKey, altKey, metaKey, modifierAltGraph, modifierCapsLock, modifierFn, modifierFnLock, modifierHyper, modifierNumLock, modifierOS, modifierScrollLock, modifierSuper, modifierSymbol, modifierSymbolLock, view, detail, bubbles, cancelable) { - if (screenX === void 0) { - screenX = 0; - } - if (screenY === void 0) { - screenY = 0; - } - if (clientX === void 0) { - clientX = 0; - } - if (clientY === void 0) { - clientY = 0; - } - if (button === void 0) { - button = 0; - } - if (buttons === void 0) { - buttons = 0; - } - if (relatedTarget === void 0) { - relatedTarget = null; - } - if (ctrlKey === void 0) { - ctrlKey = false; - } - if (shiftKey === void 0) { - shiftKey = false; - } - if (altKey === void 0) { - altKey = false; - } - if (metaKey === void 0) { - metaKey = false; - } - if (modifierAltGraph === void 0) { - modifierAltGraph = false; - } - if (modifierCapsLock === void 0) { - modifierCapsLock = false; - } - if (modifierFn === void 0) { - modifierFn = false; - } - if (modifierFnLock === void 0) { - modifierFnLock = false; - } - if (modifierHyper === void 0) { - modifierHyper = false; - } - if (modifierNumLock === void 0) { - modifierNumLock = false; - } - if (modifierOS === void 0) { - modifierOS = false; - } - if (modifierScrollLock === void 0) { - modifierScrollLock = false; - } - if (modifierSuper === void 0) { - modifierSuper = false; - } - if (modifierSymbol === void 0) { - modifierSymbol = false; - } - if (modifierSymbolLock === void 0) { - modifierSymbolLock = false; - } - if (view === void 0) { - view = null; - } - if (detail === void 0) { - detail = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["dataTransfer"] = dataTransfer; - o["screenX"] = screenX; - o["screenY"] = screenY; - o["clientX"] = clientX; - o["clientY"] = clientY; - o["button"] = button; - o["buttons"] = buttons; - o["relatedTarget"] = relatedTarget; - o["ctrlKey"] = ctrlKey; - o["shiftKey"] = shiftKey; - o["altKey"] = altKey; - o["metaKey"] = metaKey; - o["modifierAltGraph"] = modifierAltGraph; - o["modifierCapsLock"] = modifierCapsLock; - o["modifierFn"] = modifierFn; - o["modifierFnLock"] = modifierFnLock; - o["modifierHyper"] = modifierHyper; - o["modifierNumLock"] = modifierNumLock; - o["modifierOS"] = modifierOS; - o["modifierScrollLock"] = modifierScrollLock; - o["modifierSuper"] = modifierSuper; - o["modifierSymbol"] = modifierSymbol; - o["modifierSymbolLock"] = modifierSymbolLock; - o["view"] = view; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), PopStateEventInit_xro667$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.PopStateEventInit_xro667$", function(state, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["state"] = state; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), HashChangeEventInit_9djc0g$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.HashChangeEventInit_9djc0g$", function(oldURL, newURL, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["oldURL"] = oldURL; - o["newURL"] = newURL; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), PageTransitionEventInit_ws0pad$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.PageTransitionEventInit_ws0pad$", function(persisted, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["persisted"] = persisted; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), ErrorEventInit_os3ye3$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.ErrorEventInit_os3ye3$", function(message, filename, lineno, colno, error, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["message"] = message; - o["filename"] = filename; - o["lineno"] = lineno; - o["colno"] = colno; - o["error"] = error; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), MessageEventInit_b4x2sp$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.MessageEventInit_b4x2sp$", function(data, origin, lastEventId, source, ports, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["data"] = data; - o["origin"] = origin; - o["lastEventId"] = lastEventId; - o["source"] = source; - o["ports"] = ports; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), EventSourceInit_6taknv$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.EventSourceInit_6taknv$", function(withCredentials) { - if (withCredentials === void 0) { - withCredentials = false; - } - var o = {}; - o["withCredentials"] = withCredentials; - return o; - }), CloseEventInit_kz92y6$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.CloseEventInit_kz92y6$", function(wasClean, code, reason, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["wasClean"] = wasClean; - o["code"] = code; - o["reason"] = reason; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), StorageEventInit_hhd9ie$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.StorageEventInit_hhd9ie$", function(key, oldValue, newValue, url, storageArea, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["key"] = key; - o["oldValue"] = oldValue; - o["newValue"] = newValue; - o["url"] = url; - o["storageArea"] = storageArea; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), EventInit_dqye30$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.EventInit_dqye30$", function(bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), CustomEventInit_xro667$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.CustomEventInit_xro667$", function(detail, bubbles, cancelable) { - if (detail === void 0) { - detail = null; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["detail"] = detail; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), MutationObserverInit_aj2h80$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.MutationObserverInit_aj2h80$", function(childList, attributes, characterData, subtree, attributeOldValue, characterDataOldValue, attributeFilter) { - if (childList === void 0) { - childList = false; - } - if (subtree === void 0) { - subtree = false; - } - var o = {}; - o["childList"] = childList; - o["attributes"] = attributes; - o["characterData"] = characterData; - o["subtree"] = subtree; - o["attributeOldValue"] = attributeOldValue; - o["characterDataOldValue"] = characterDataOldValue; - o["attributeFilter"] = attributeFilter; - return o; - }), EditingBeforeInputEventInit_9djc0g$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.EditingBeforeInputEventInit_9djc0g$", function(command, value, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["command"] = command; - o["value"] = value; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), EditingInputEventInit_9djc0g$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.EditingInputEventInit_9djc0g$", function(command, value, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["command"] = command; - o["value"] = value; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), DOMPointInit_6y0v78$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.DOMPointInit_6y0v78$", function(x, y, z, w) { - if (x === void 0) { - x = 0; - } - if (y === void 0) { - y = 0; - } - if (z === void 0) { - z = 0; - } - if (w === void 0) { - w = 1; - } - var o = {}; - o["x"] = x; - o["y"] = y; - o["z"] = z; - o["w"] = w; - return o; - }), DOMRectInit_6y0v78$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.DOMRectInit_6y0v78$", function(x, y, width, height) { - if (x === void 0) { - x = 0; - } - if (y === void 0) { - y = 0; - } - if (width === void 0) { - width = 0; - } - if (height === void 0) { - height = 0; - } - var o = {}; - o["x"] = x; - o["y"] = y; - o["width"] = width; - o["height"] = height; - return o; - }), ScrollOptions_61zpoe$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.ScrollOptions_61zpoe$", function(behavior) { - if (behavior === void 0) { - behavior = "auto"; - } - var o = {}; - o["behavior"] = behavior; - return o; - }), ScrollOptionsHorizontal_t0es5s$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.ScrollOptionsHorizontal_t0es5s$", function(x, behavior) { - if (behavior === void 0) { - behavior = "auto"; - } - var o = {}; - o["x"] = x; - o["behavior"] = behavior; - return o; - }), ScrollOptionsVertical_t0es5s$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.ScrollOptionsVertical_t0es5s$", function(y, behavior) { - if (behavior === void 0) { - behavior = "auto"; - } - var o = {}; - o["y"] = y; - o["behavior"] = behavior; - return o; - }), BoxQuadOptions_axdi75$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.BoxQuadOptions_axdi75$", function(box, relativeTo) { - if (box === void 0) { - box = "border"; - } - var o = {}; - o["box"] = box; - o["relativeTo"] = relativeTo; - return o; - }), ConvertCoordinateOptions_puj7f4$:Kotlin.defineInlineFunction("stdlib.org.w3c.dom.ConvertCoordinateOptions_puj7f4$", function(fromBox, toBox) { - if (fromBox === void 0) { - fromBox = "border"; - } - if (toBox === void 0) { - toBox = "border"; - } - var o = {}; - o["fromBox"] = fromBox; - o["toBox"] = toBox; - return o; - })}), fetch:Kotlin.definePackage(null, {RequestInit_rz7b8m$:Kotlin.defineInlineFunction("stdlib.org.w3c.fetch.RequestInit_rz7b8m$", function(method, headers, body, mode, credentials, cache, redirect) { - var o = {}; - o["method"] = method; - o["headers"] = headers; - o["body"] = body; - o["mode"] = mode; - o["credentials"] = credentials; - o["cache"] = cache; - o["redirect"] = redirect; - return o; - }), ResponseInit_v2gkk6$:Kotlin.defineInlineFunction("stdlib.org.w3c.fetch.ResponseInit_v2gkk6$", function(status, statusText, headers) { - if (status === void 0) { - status = 200; - } - if (statusText === void 0) { - statusText = "OK"; - } - var o = {}; - o["status"] = status; - o["statusText"] = statusText; - o["headers"] = headers; - return o; - })}), files:Kotlin.definePackage(null, {BlobPropertyBag_61zpoe$:Kotlin.defineInlineFunction("stdlib.org.w3c.files.BlobPropertyBag_61zpoe$", function(type) { - if (type === void 0) { - type = ""; - } - var o = {}; - o["type"] = type; - return o; - }), FilePropertyBag_bm4lxs$:Kotlin.defineInlineFunction("stdlib.org.w3c.files.FilePropertyBag_bm4lxs$", function(type, lastModified) { - if (type === void 0) { - type = ""; - } - var o = {}; - o["type"] = type; - o["lastModified"] = lastModified; - return o; - })}), notifications:Kotlin.definePackage(null, {NotificationOptions_kav9qg$:Kotlin.defineInlineFunction("stdlib.org.w3c.notifications.NotificationOptions_kav9qg$", function(dir, lang, body, tag, icon, sound, vibrate, renotify, silent, noscreen, sticky, data) { - if (dir === void 0) { - dir = "auto"; - } - if (lang === void 0) { - lang = ""; - } - if (body === void 0) { - body = ""; - } - if (tag === void 0) { - tag = ""; - } - if (renotify === void 0) { - renotify = false; - } - if (silent === void 0) { - silent = false; - } - if (noscreen === void 0) { - noscreen = false; - } - if (sticky === void 0) { - sticky = false; - } - if (data === void 0) { - data = null; - } - var o = {}; - o["dir"] = dir; - o["lang"] = lang; - o["body"] = body; - o["tag"] = tag; - o["icon"] = icon; - o["sound"] = sound; - o["vibrate"] = vibrate; - o["renotify"] = renotify; - o["silent"] = silent; - o["noscreen"] = noscreen; - o["sticky"] = sticky; - o["data"] = data; - return o; - }), GetNotificationOptions_61zpoe$:Kotlin.defineInlineFunction("stdlib.org.w3c.notifications.GetNotificationOptions_61zpoe$", function(tag) { - if (tag === void 0) { - tag = ""; - } - var o = {}; - o["tag"] = tag; - return o; - }), NotificationEventInit_feq8qm$:Kotlin.defineInlineFunction("stdlib.org.w3c.notifications.NotificationEventInit_feq8qm$", function(notification, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["notification"] = notification; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - })}), workers:Kotlin.definePackage(null, {RegistrationOptions_61zpoe$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.RegistrationOptions_61zpoe$", function(scope) { - var o = {}; - o["scope"] = scope; - return o; - }), ServiceWorkerMessageEventInit_sy6pe0$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.ServiceWorkerMessageEventInit_sy6pe0$", function(data, origin, lastEventId, source, ports, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["data"] = data; - o["origin"] = origin; - o["lastEventId"] = lastEventId; - o["source"] = source; - o["ports"] = ports; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), ClientQueryOptions_8kj6y5$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.ClientQueryOptions_8kj6y5$", function(includeUncontrolled, type) { - if (includeUncontrolled === void 0) { - includeUncontrolled = false; - } - if (type === void 0) { - type = "window"; - } - var o = {}; - o["includeUncontrolled"] = includeUncontrolled; - o["type"] = type; - return o; - }), ExtendableEventInit_dqye30$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.ExtendableEventInit_dqye30$", function(bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), FetchEventInit_b3bcq8$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.FetchEventInit_b3bcq8$", function(request, client, isReload, bubbles, cancelable) { - if (isReload === void 0) { - isReload = false; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["request"] = request; - o["client"] = client; - o["isReload"] = isReload; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), ExtendableMessageEventInit_9wcmnd$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.ExtendableMessageEventInit_9wcmnd$", function(data, origin, lastEventId, source, ports, bubbles, cancelable) { - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["data"] = data; - o["origin"] = origin; - o["lastEventId"] = lastEventId; - o["source"] = source; - o["ports"] = ports; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - }), CacheQueryOptions_qfoyx9$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.CacheQueryOptions_qfoyx9$", function(ignoreSearch, ignoreMethod, ignoreVary, cacheName) { - if (ignoreSearch === void 0) { - ignoreSearch = false; - } - if (ignoreMethod === void 0) { - ignoreMethod = false; - } - if (ignoreVary === void 0) { - ignoreVary = false; - } - var o = {}; - o["ignoreSearch"] = ignoreSearch; - o["ignoreMethod"] = ignoreMethod; - o["ignoreVary"] = ignoreVary; - o["cacheName"] = cacheName; - return o; - }), CacheBatchOperation_2un2y0$:Kotlin.defineInlineFunction("stdlib.org.w3c.workers.CacheBatchOperation_2un2y0$", function(type, request, response, options) { - var o = {}; - o["type"] = type; - o["request"] = request; - o["response"] = response; - o["options"] = options; - return o; - })}), xhr:Kotlin.definePackage(null, {ProgressEventInit_vo5a85$:Kotlin.defineInlineFunction("stdlib.org.w3c.xhr.ProgressEventInit_vo5a85$", function(lengthComputable, loaded, total, bubbles, cancelable) { - if (lengthComputable === void 0) { - lengthComputable = false; - } - if (loaded === void 0) { - loaded = 0; - } - if (total === void 0) { - total = 0; - } - if (bubbles === void 0) { - bubbles = false; - } - if (cancelable === void 0) { - cancelable = false; - } - var o = {}; - o["lengthComputable"] = lengthComputable; - o["loaded"] = loaded; - o["total"] = total; - o["bubbles"] = bubbles; - o["cancelable"] = cancelable; - return o; - })})})})}); - Kotlin.defineModule("stdlib", _); -})(Kotlin); -if (typeof module !== "undefined" && module.exports) { - module.exports = Kotlin; -} -; \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/helpers/package.json b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/helpers/package.json deleted file mode 100644 index 233ec30ffad..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/helpers/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "js_tests", - "version": "1.0.0", - "description": "", - "main": "js_tests.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "protobufjs": "^5.0.1", - "seedrandom": "^2.4.2" - } -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/helpers/prefix.js b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/helpers/prefix.js deleted file mode 100644 index 041c9d5a945..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/helpers/prefix.js +++ /dev/null @@ -1 +0,0 @@ -var Kotlin = require("./kotlin"); diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/BaseExtendedTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/BaseExtendedTest.kt deleted file mode 100644 index 20e2c68d708..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/BaseExtendedTest.kt +++ /dev/null @@ -1,123 +0,0 @@ -package tests - -import Base -import CodedInputStream -import Extended - - -object BaseExtendedTest { - fun generateKtBaseMessage(): Base { - val arrSize = Util.nextInt(1000) - val arr = LongArray(arrSize) - for (i in 0..(arrSize - 1)) { - arr[i] = Util.nextLong() - } - - val flag = if (Util.nextInt() % 2 == 0) false else true - - val int = Util.nextInt() - - return Base.BuilderBase(arr, flag, int).build() - } - - fun generateKtExtendedMessage(): Extended { - val arrSize = Util.nextInt(1000) - val arr = LongArray(arrSize) - for (i in 0..(arrSize - 1)) { - arr[i] = Util.nextLong() - } - - val flag = if (Util.nextInt() % 2 == 0) false else true - - val int = Util.nextInt() - - val long = Util.nextLong() - - val longsSize = Util.nextInt(1000) - val longs = LongArray(longsSize) - for (i in 0..(longsSize - 1)) { - longs[i] = Util.nextLong() - } - - return Extended.BuilderExtended(arr, longs, flag, long, int).build() - } - - fun compareBases(kt: Base, jv: Base): Boolean { - return kt.flag == jv.flag && - kt.int == jv.int && - Util.compareArrays(kt.arr.asIterable(), jv.arr.asIterable()) - } - - fun compareExtended(kt: Extended, jv: Extended): Boolean { - return kt.flag == jv.flag && - kt.int == jv.int && - Util.compareArrays(kt.arr.asIterable(), jv.arr.asIterable()) && - Util.compareArrays(kt.arr_longs.asIterable(), jv.arr_longs.asIterable()) && - kt.long == jv.long - } - - fun compareBaseExtended(kt1: Base, kt2: Extended): Boolean { - return kt1.flag == kt2.flag && - kt1.int == kt2.int && - Util.compareArrays(kt1.arr.asIterable(), kt2.arr.asIterable()) - } - - fun baseToBaseOnce() { - val msg = generateKtBaseMessage() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = Base.BuilderBase(LongArray(0), false, 0).parseFrom(ins).build() - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareBases(msg, readMsg)) - } - - fun extendedToExtendedOnce() { - val msg = generateKtExtendedMessage() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = Extended.BuilderExtended(LongArray(0), LongArray(0), false, 0L, 0).parseFrom(ins).build() - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareExtended(msg, readMsg)) - } - - fun baseToExtendedOnce() { - val msg = generateKtBaseMessage() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = Extended.BuilderExtended(LongArray(0), LongArray(0), false, 0L, 0).parseFrom(ins).build() - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareBaseExtended(msg, readMsg)) - } - - fun extendedToBaseOnce() { - val msg = generateKtExtendedMessage() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = Base.BuilderBase(LongArray(0), false, 0).parseFrom(ins).build() - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareBaseExtended(readMsg, msg)) - } - - val testRuns = 1000 - fun runTests() { - for (i in 0..testRuns) { - baseToBaseOnce() - extendedToExtendedOnce() - - baseToExtendedOnce() -// extendedToBaseOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/ConnectTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/ConnectTest.kt deleted file mode 100644 index 22d374fab62..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/ConnectTest.kt +++ /dev/null @@ -1,37 +0,0 @@ -package tests - -import CodedInputStream -import ConnectionRequest - -object ConnectTest { - fun generateKotlinConnectionRequestMessage(): ConnectionRequest { - val arr = Util.generateIntArray() - val port = Util.nextInt() - return ConnectionRequest.BuilderConnectionRequest(arr, port).build() - } - - fun compareConnectionRequests(kt1: ConnectionRequest, kt2: ConnectionRequest): Boolean { - return Util.compareArrays(kt1.ip.asIterable(), kt2.ip.asIterable()) && - kt1.port == kt2.port - } - - fun ktToKtOnce() { - val msg = generateKotlinConnectionRequestMessage() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = ConnectionRequest.BuilderConnectionRequest(IntArray(0), 0).parseFrom(ins).build() - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareConnectionRequests(msg, readMsg)) - } - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - ktToKtOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/CrossBranchTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/CrossBranchTest.kt deleted file mode 100644 index a7fd3883c09..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/CrossBranchTest.kt +++ /dev/null @@ -1,66 +0,0 @@ -package tests - -import CodedInputStream -import CrossBranch - -object CrossBranchTest { - fun generateKtGrandFather(): CrossBranch.Grandfather { - fun generateKtRightFather(): CrossBranch.Grandfather.RightFather { - fun generateKtRightLeftSon(): CrossBranch.Grandfather.RightFather.RightLeftSon { - fun generateKtLeftLeftSon(): CrossBranch.Grandfather.LeftFather.LeftLeftSon { - return CrossBranch.Grandfather.LeftFather.LeftLeftSon.BuilderLeftLeftSon(Util.nextInt()).build() - } - - val msg = CrossBranch.Grandfather.RightFather.RightLeftSon.BuilderRightLeftSon( - generateKtLeftLeftSon() - ).build() - return msg - } - - fun generateKtRightRightSon(): CrossBranch.Grandfather.RightFather.RightRightSon { - fun generateKtLeftRightSon(): CrossBranch.Grandfather.LeftFather.LeftRightSon { - return CrossBranch.Grandfather.LeftFather.LeftRightSon.BuilderLeftRightSon(Util.nextInt()).build() - } - - return CrossBranch.Grandfather.RightFather.RightRightSon.BuilderRightRightSon( - generateKtLeftRightSon() - ).build() - } - - val msg = CrossBranch.Grandfather.RightFather.BuilderRightFather( - generateKtRightLeftSon(), - generateKtRightRightSon() - ).build() - - return msg - } - - return CrossBranch.Grandfather.BuilderGrandfather(generateKtRightFather()).build() - } - - fun compareGrandFathers(kt1: CrossBranch.Grandfather, kt2: CrossBranch.Grandfather): Boolean { - return kt1.rf.rls.son_field.son_field == kt2.rf.rls.son_field.son_field && - kt1.rf.rrs.son_field.son_field == kt2.rf.rrs.son_field.son_field - } - - val testRuns = 1000 - - fun ktToKtOnce() { - val msg = generateKtGrandFather() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = generateKtGrandFather() - readMsg.mergeFrom(ins) // caution: not correct in presence of repeated fields. In this particular case it's ok - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareGrandFathers(msg, readMsg)) - } - - fun runTests() { - for (i in 0..testRuns) { - ktToKtOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/LocationTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/LocationTest.kt deleted file mode 100644 index dec5577f8d5..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/LocationTest.kt +++ /dev/null @@ -1,51 +0,0 @@ -package tests - -import CodedInputStream -import LocationResponse - -object LocationTest { - fun generateKtLocationResponse(): LocationResponse { - fun generateKtLocationData(): LocationResponse.LocationData { - return LocationResponse.LocationData.BuilderLocationData( - Util.nextInt(), - Util.nextInt(), - Util.nextInt() - ).build() - } - - return LocationResponse.BuilderLocationResponse( - generateKtLocationData(), - Util.nextInt(), - Util.nextInt() - ).build() - } - - fun compareLocationResponses(kt1: LocationResponse, kt2: LocationResponse): Boolean { - fun compareLocationDatas(kt1: LocationResponse.LocationData, kt2: LocationResponse.LocationData): Boolean { - return kt1.x == kt2.x && kt1.y == kt2.y && kt1.angle == kt2.angle - } - - return kt1.code == kt2.code && compareLocationDatas(kt1.locationResponseData, kt2.locationResponseData) - } - - fun ktToKtOnce() { - val msg = generateKtLocationResponse() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = LocationResponse.BuilderLocationResponse(LocationResponse.LocationData.BuilderLocationData(0, 0, 0).build(), 0, 0).build() - readMsg.mergeFrom(ins) - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareLocationResponses(msg, readMsg)) - } - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - ktToKtOnce() - } - } -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/MultipleMessagesTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/MultipleMessagesTest.kt deleted file mode 100644 index f2ef0d1d259..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/MultipleMessagesTest.kt +++ /dev/null @@ -1,46 +0,0 @@ -package tests - -import CodedInputStream -import FirstMessage -import SecondMessage -import ThirdMessage - -object MultipleMessagesTest { - fun generateKtFirstMessage(): FirstMessage { - return FirstMessage.BuilderFirstMessage(Util.nextInt()).build() - } - - fun generateKtSecondMessage(): SecondMessage { - return SecondMessage.BuilderSecondMessage(generateKtFirstMessage()).build() - } - - fun generateKtThirdMessage(): ThirdMessage { - return ThirdMessage.BuilderThirdMessage(generateKtSecondMessage()).build() - } - - fun compareThirdMessages(kt1: ThirdMessage, kt2: ThirdMessage): Boolean { - return kt1.second_msg.first_msg.int_field == kt2.second_msg.first_msg.int_field - } - - fun ktToKtOnce() { - val msg = generateKtThirdMessage() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = ThirdMessage.BuilderThirdMessage(SecondMessage.BuilderSecondMessage(FirstMessage.BuilderFirstMessage(0).build()).build()).build() - readMsg.mergeFrom(ins) - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareThirdMessages(msg, readMsg)) - } - - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - ktToKtOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/RepeatedVarintsTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/RepeatedVarintsTest.kt deleted file mode 100644 index e15d00ff69d..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/RepeatedVarintsTest.kt +++ /dev/null @@ -1,52 +0,0 @@ -package tests - -import CodedInputStream -import MessageRepeatedVarints - -object RepeatedVarintsTest { - fun generateKtRepeatedVarints(): MessageRepeatedVarints { - val int = Util.generateIntArray() - val long = Util.generateLongArray() - val sint = Util.generateIntArray() - val slong = Util.generateLongArray() - val bool = Util.generateBoolArray() - val uint = Util.generateIntArray() - val ulong = Util.generateLongArray() - - return MessageRepeatedVarints.BuilderMessageRepeatedVarints( - int, long, sint, slong, bool, uint, ulong - ).build() - } - - fun compareRepeatedVarints(kt1: MessageRepeatedVarints, kt2: MessageRepeatedVarints): Boolean { - return Util.compareArrays(kt1.int.asIterable(), kt2.int.asIterable()) && - Util.compareArrays(kt1.long.asIterable(), kt2.long.asIterable()) && - Util.compareArrays(kt1.sint.asIterable(), kt2.sint.asIterable()) && - Util.compareArrays(kt1.slong.asIterable(), kt2.slong.asIterable()) && - Util.compareArrays(kt1.bl.asIterable(), kt2.bl.asIterable()) && - Util.compareArrays(kt1.uint.asIterable(), kt2.uint.asIterable()) && - Util.compareArrays(kt1.ulong.asIterable(), kt2.ulong.asIterable()) - } - - fun ktToKtOnce() { - val msg = generateKtRepeatedVarints() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = MessageRepeatedVarints.BuilderMessageRepeatedVarints( - IntArray(0), LongArray(0), IntArray(0), LongArray(0), BooleanArray(0), IntArray(0), LongArray(0) - ).parseFrom(ins).build() - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareRepeatedVarints(msg, readMsg)) - } - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - ktToKtOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/RepeatedZigZagTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/RepeatedZigZagTest.kt deleted file mode 100644 index c7d559a6fd2..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/RepeatedZigZagTest.kt +++ /dev/null @@ -1,36 +0,0 @@ -package tests -import CodedInputStream -import MessageRepeatedZigZag - -object RepeatedZigZagTest { - fun generateKtRepeatedZigZag(): MessageRepeatedZigZag { - val int = Util.generateIntArray() - val long = Util.generateLongArray() - return MessageRepeatedZigZag.BuilderMessageRepeatedZigZag(int, long).build() - } - - fun compareRepeatedZigZags(kt1: MessageRepeatedZigZag, kt2: MessageRepeatedZigZag): Boolean { - return Util.compareArrays(kt1.int.asIterable(), kt2.int.asIterable()) && - Util.compareArrays(kt1.long.asIterable(), kt2.long.asIterable()) - } - - fun ktToKtOnce() { - val msg = generateKtRepeatedZigZag() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = MessageRepeatedZigZag.BuilderMessageRepeatedZigZag(IntArray(0), LongArray(0)).parseFrom(ins).build() - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareRepeatedZigZags(msg, readMsg)) - } - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - ktToKtOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/TagOrderTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/TagOrderTest.kt deleted file mode 100644 index 479432c9408..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/TagOrderTest.kt +++ /dev/null @@ -1,65 +0,0 @@ -package tests - -import CodedInputStream -import TagOrder -import TagOrderShuffled - -object TagOrderTest { - fun generateKtTag(): TagOrder { - val int = Util.nextInt() - val slong_array = Util.generateLongArray() - val sint = Util.nextInt() - val enum = TagOrder.Enum.fromIntToEnum(Util.nextInt(2)) - return TagOrder.BuilderTagOrder(int, sint, slong_array, enum).build() - } - - fun generateKtTagShuffled(): TagOrderShuffled { - val int = Util.nextInt() - val slong_array = Util.generateLongArray() - val sint = Util.nextInt() - val enum = TagOrderShuffled.Enum.fromIntToEnum(Util.nextInt(2)) - - return TagOrderShuffled.BuilderTagOrderShuffled(int, sint, slong_array, enum).build() - } - - fun compareTagAndShuffledTag(kt1: TagOrder, kt2: TagOrderShuffled): Boolean { - return kt1.enum_field.id == kt2.enum_field.id && - kt1.int == kt2.int && - kt1.sint == kt2.sint && - Util.compareArrays(kt1.slong_array.asIterable(), kt2.slong_array.asIterable()) - } - - fun tagToShuffledOnce() { - val msg = generateKtTag() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = TagOrderShuffled.BuilderTagOrderShuffled(0, 0, LongArray(0), TagOrderShuffled.Enum.first_val) - .parseFrom(ins).build() - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareTagAndShuffledTag(msg, readMsg)) - } - - fun shuffledToTagOnce() { - val msg = generateKtTagShuffled() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = TagOrder.BuilderTagOrder(0, 0, LongArray(0), TagOrder.Enum.first_val) - .parseFrom(ins).build() - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareTagAndShuffledTag(readMsg, msg)) - } - - val testRuns = 1000 - fun runTests() { - for (i in 0..testRuns) { - tagToShuffledOnce() - shuffledToTagOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/Util.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/Util.kt deleted file mode 100644 index 7950c314460..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/Util.kt +++ /dev/null @@ -1,85 +0,0 @@ -package tests -import CodedOutputStream - -@native -fun require(value: String): dynamic { return null } - -val protoBuf = require("protobufjs") - -object Util { - var seedrandom = require("seedrandom") - var rng = seedrandom("42") - val ARRAY_MAX_SIZE = 1000 - - fun nextInt(min_val: Int, max_val: Int): Int { - return Math.floor(rng()*(max_val - min_val + 1) + min_val) - } - - fun nextInt(max_val: Int): Int { - return nextInt(0, max_val) - } - - fun nextInt(): Int { - return nextInt(Int.MIN_VALUE, Int.MAX_VALUE) - } - - fun nextLong(min_val: Long, max_val: Long): Long { - return nextInt().toLong() - } - - fun nextLong(max_val: Long): Long { - return nextLong(0L, max_val) - } - - fun nextLong(): Long { - return nextLong(Long.MIN_VALUE, Long.MAX_VALUE) - } - - fun nextBoolean(): Boolean { - return if (nextInt() % 2 == 0) false else true - } - - fun getKtOutputStream(size: Int): CodedOutputStream { - val ba = ByteArray(size) - val outs = CodedOutputStream(ba) - return outs - } - - fun assert(condition: Boolean) { - if (!condition) { - println("Assertion failed") - js("process.exit(1)") - } - } - - fun generateIntArray(): IntArray { - val size = nextInt(ARRAY_MAX_SIZE) - val arr = IntArray(size) - for (i in 0..(size - 1)) { - arr[i] = nextInt() - } - return arr - } - - fun compareArrays (lhs: Iterable, rhs: Iterable): Boolean { - return lhs.count() == rhs.count() && lhs.filter { !rhs.contains(it) }.isEmpty() - } - - fun generateLongArray(): LongArray { - val size = nextInt(ARRAY_MAX_SIZE) - val arr = LongArray(size) - for (i in 0..(size - 1)) { - arr[i] = nextLong() - } - return arr - } - - fun generateBoolArray(): BooleanArray { - val size = nextInt(ARRAY_MAX_SIZE) - val arr = BooleanArray(size) - for (i in 0..(size - 1)) { - arr[i] = nextBoolean() - } - return arr - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/VarintsTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/VarintsTest.kt deleted file mode 100644 index 290f0597513..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/VarintsTest.kt +++ /dev/null @@ -1,52 +0,0 @@ -package tests -import MessageVarints -import CodedInputStream - -object VarintsTest { - fun generateKtVarint(): MessageVarints { - val int = Util.nextInt() - val long = Util.nextLong() - val sint = Util.nextInt() - val slong = Util.nextLong() - val bl = Util.nextBoolean() - val uint = Util.nextInt(0, Int.MAX_VALUE) - val ulong = Util.nextLong(0, Long.MAX_VALUE) - val enum = MessageVarints.TestEnum.firstVal - - return MessageVarints.BuilderMessageVarints( - int, long, sint, slong, bl, enum, uint, ulong - ).build() - } - - fun compareVarints(kt1: MessageVarints, kt2: MessageVarints): Boolean { - return kt1.int == kt2.int && - kt1.long.toString() == kt2.long.toString() && - kt1.sint == kt2.sint && - kt1.slong.toString() == kt2.slong.toString() && - kt1.bl == kt2.bl && - kt1.uint == kt2.uint && - kt1.ulong.toString() == kt2.ulong.toString() && - kt1.enumField.id == kt2.enumField.id - } - - fun ktToKtOnce() { - val msg = generateKtVarint() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = MessageVarints.BuilderMessageVarints(0, 0L, 0, 0L, false, MessageVarints.TestEnum.firstVal, 0, 0L) - .parseFrom(ins).build() - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareVarints(msg, readMsg)) - } - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - ktToKtOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/ZigZagTest.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/ZigZagTest.kt deleted file mode 100644 index 6217e9cfadc..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/ZigZagTest.kt +++ /dev/null @@ -1,37 +0,0 @@ -package tests -import MessageZigZag -import CodedInputStream - -object ZigZagTest { - fun generateKtZigZag(): MessageZigZag { - val int = Util.nextInt() - val long = Util.nextLong() - - return MessageZigZag.BuilderMessageZigZag(int, long.toLong()).build() - } - - fun compareZigZags(kt1: MessageZigZag, kt2: MessageZigZag): Boolean { - return kt1.int == kt2.int && - kt1.long == kt2.long - } - - fun ktToKtOnce() { - val msg = generateKtZigZag() - val outs = Util.getKtOutputStream(msg.getSizeNoTag()) - msg.writeTo(outs) - - val ins = CodedInputStream(outs.buffer) - val readMsg = MessageZigZag.BuilderMessageZigZag(0, 0L).parseFrom(ins).build() - - Util.assert(readMsg.errorCode == 0) - Util.assert(compareZigZags(msg, readMsg)) - } - - val testRuns = 1000 - - fun runTests() { - for (i in 0..testRuns) { - ktToKtOnce() - } - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/main.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/main.kt deleted file mode 100644 index 4691afce092..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/kt_js_tests/src/tests/main.kt +++ /dev/null @@ -1,39 +0,0 @@ -package tests - -fun main(args: Array) { - print("Varints test... ") - VarintsTest.runTests() - println ("OK!") - - print("Zigzag test... ") - ZigZagTest.runTests() - println("OK!") - - print("Repeated VarInts test... ") - RepeatedVarintsTest.runTests() - println("OK!") - - print("Repeated ZigZags test... ") - RepeatedZigZagTest.runTests() - println("OK!") - - print("Tag order test... ") - TagOrderTest.runTests() - println("OK!") - - print("Cross-branch access test... ") - CrossBranchTest.runTests() - println("OK!") - - print("Location.proto test... ") - LocationTest.runTests() - println("OK!") - - print("Connect.proto test... ") - ConnectTest.runTests() - println("OK!") - - print("Base & Extended test... ") - BaseExtendedTest.runTests() - println("OK!") -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/run_tests.sh b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/run_tests.sh deleted file mode 100755 index 918d422cb65..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc-tests/run_tests.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -red='\033[0;31m' -nc='\033[0m' -JAVA_TESTS_DIR='kt_java_tests' -JS_TESTS_DIR='kt_js_tests' - -echo -e "${red} Running Java Tests${nc}" -cd ${JAVA_TESTS_DIR} -gradle runTests -q -cd .. - -if [ $? -ne 0 ]; then - echo -e "${red}Kotlin <-> Java testing failed! ${nc}" - exit 1 -fi - -echo - -echo -e "${red} Running JS Tests${nc}" -cd ${JS_TESTS_DIR} -gradle runTests -q -cd .. -if [ $? -ne 0 ]; then - echo -e "${red}Kotlin <-> JS testing failed! ${nc}" - exit 1 -fi - -echo diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/UnreachableStateException.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/UnreachableStateException.cc deleted file mode 100644 index 058c13efd4e..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/UnreachableStateException.cc +++ /dev/null @@ -1,19 +0,0 @@ -// -// Created by user on 7/20/16. -// - -#include "UnreachableStateException.h" -namespace google { -namespace protobuf { -namespace compiler { -namespace kotlin { - -UnreachableStateException::UnreachableStateException(std::string const & what) - : std::logic_error(what) -{ } - -} // namespace kotlin -} // namespace compiler -} // namespace protobuf -} // namespace google - diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/UnreachableStateException.h b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/UnreachableStateException.h deleted file mode 100644 index a247fa9a1c8..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/UnreachableStateException.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// Created by user on 7/20/16. -// - -#ifndef GOOGLE_UNREACHABLESTATEEXCEPTION_H -#define GOOGLE_UNREACHABLESTATEEXCEPTION_H - - -#include -#include - -namespace google { -namespace protobuf { -namespace compiler { -namespace kotlin { - -class UnreachableStateException : public std::logic_error { -public: - UnreachableStateException(std::string const & what); -}; - -} // namespace kotlin -} // namespace compiler -} // namespace protobuf -} // namespace google - - -#endif //GOOGLE_UNREACHABLESTATEEXCEPTION_H diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc deleted file mode 100644 index 5bdcff84375..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc +++ /dev/null @@ -1,446 +0,0 @@ -// -// Created by user on 7/11/16. -// - -#include "kotlin_class_generator.h" -#include -#include "kotlin_enum_generator.h" -#include "kotlin_field_generator.h" -#include "kotlin_name_resolver.h" -#include "UnreachableStateException.h" -#include - -namespace google { -namespace protobuf { -namespace compiler { -namespace kotlin { - -class FieldGenerator; // declared in "kotlin_file_generator.h" -class NameResolver; // declared in "kotlin_name_resolver.h" - -void ClassGenerator::generateCode(io::Printer *printer, bool isBuilder) const { - generateHeader(printer, isBuilder); - printer->Indent(); - - // Generate code for property declaration - printer->Print("//========== Properties ===========\n"); - for (FieldGenerator *gen: properties) { - gen->generateCode(printer, isBuilder); - printer->Print("\n"); - } - - // Generate field for errors code - printer->Print("var errorCode: Int = 0\n\n"); - - // enum declarations and nested classes declarations only for fair classes - if (!isBuilder) { - if (enumsDeclaraions.size() > 0) { - printer->Print("//========== Nested enums declarations ===========\n"); - } - for (EnumGenerator *gen: enumsDeclaraions) { - gen->generateCode(printer); - printer->Print("\n"); - } - - if (classesDeclarations.size() > 0) { - printer->Print("//========== Nested classes declarations ===========\n"); - } - for (ClassGenerator *gen: classesDeclarations) { - gen->generateCode(printer); - printer->Print("\n"); - } - } - - // write serialization methods only for fair classes, read methods only for Builders) - printer->Print("//========== Serialization methods ===========\n"); - generateWriteToMethod(printer); - printer->Print("\n"); - - // builder, mergeFrom and only for fair classes - if (!isBuilder) { - - generateMergeMethods(printer); - printer->Print("\n"); - } - - // build() and setters are only for builders - if (isBuilder) { - printer->Print("//========== Mutating methods ===========\n"); - generateBuildMethod(printer); - printer->Print("\n"); - - generateParseMethods(printer); - printer->Print("\n"); - } - - // getSize() - printer->Print("//========== Size-related methods ===========\n"); - generateGetSizeMethod(printer); - printer->Print("\n"); - - if (!isBuilder) { - printer->Print("//========== Builder ===========\n"); - generateBuilder(printer); - printer->Print("\n"); - } - printer->Outdent(); - printer->Print("}\n"); -} - -ClassGenerator::ClassGenerator(Descriptor const *descriptor, NameResolver * nameResolver) - : descriptor(descriptor) - , nameResolver(nameResolver) -{ - int field_count = descriptor->field_count(); - for (int i = 0; i < field_count; ++i) { - FieldDescriptor const * fieldDescriptor = descriptor->field(i); - properties.push_back(new FieldGenerator(fieldDescriptor, /* enclosingClass = */ this, nameResolver)); - } - - int nested_types_count = descriptor->nested_type_count(); - for (int i = 0; i < nested_types_count; ++i) { - Descriptor const * nestedClassDescriptor = descriptor->nested_type(i); - nameResolver->addClass(nestedClassDescriptor->name(), getFullType()); - classesDeclarations.push_back(new ClassGenerator(nestedClassDescriptor, nameResolver)); - nameResolver->addGeneratorForClass(nestedClassDescriptor->name(), classesDeclarations.back()); - } - - int enums_declarations_count = descriptor->enum_type_count(); - for (int i = 0; i < enums_declarations_count; ++i) { - EnumDescriptor const * nestedEnumDescriptor = descriptor->enum_type(i); - nameResolver->addClass(nestedEnumDescriptor->name(), getFullType()); - enumsDeclaraions.push_back(new EnumGenerator(nestedEnumDescriptor, nameResolver)); - } - - /** - * Sort properties in ascending order on their tag numbers. This order - * affects order of serialization and deserialization, thus fields will be - * serialized in order of their tags, as demanded by Google - */ - std::sort(properties.begin(), properties.end(), - [](FieldGenerator const * first, FieldGenerator const * second) { - return first->getFieldNumber() < second->getFieldNumber(); - }); -} - -ClassGenerator::~ClassGenerator() { - for (int i = 0; i < properties.size(); ++i) { - delete properties[i]; - } - - for (int i = 0; i < classesDeclarations.size(); ++i) { - delete classesDeclarations[i]; - } - - for (int i = 0; i < enumsDeclaraions.size(); ++i) { - delete enumsDeclaraions[i]; - } -} - -void ClassGenerator::generateBuilder(io::Printer * printer) const { - //XXX: just reuse generateCode with flag isBuilder set - generateCode(printer, /* isBuilder = */ true); -} - -void ClassGenerator::generateMergeMethods(io::Printer *printer) const { - map vars; - - // mergeWith(other: Message) - vars["className"] = getFullType(); - printer->Print(vars, "fun mergeWith (other: $className$) {\n"); - printer->Indent(); - - for (int i = 0; i < properties.size(); ++i) { - vars["fieldName"] = properties[i]->simpleName; - - // concatenate repeated fields - if (properties[i]->getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { - printer->Print(vars, "$fieldName$ = $fieldName$.plus((other.$fieldName$))\n"); - } - - // Bytes type is handled separately - else if (properties[i]->getProtoType() == FieldDescriptor::TYPE_BYTES) { - vars["initValue"] = properties[i]->getInitValue(); - printer->Print(vars, "$fieldName$.plus(other.$fieldName$)\n"); - } - - // for all other cases just take other's field - else { - printer->Print(vars, "$fieldName$ = other.$fieldName$\n"); - } - } - - printer->Print("this.errorCode = other.errorCode\n"); - printer->Outdent(); - printer->Print("}\n"); - - - // mergeFromWithSize(input: CodedInputStream, expectedSize: Int) - printer->Print("\n"); - printer->Print(vars, "fun mergeFromWithSize (input: CodedInputStream, expectedSize: Int) {\n"); - printer->Indent(); - - vars["builderName"] = getBuilderFullType(); - vars["initValue"] = getBuilderInitValue(); - printer->Print(vars, "val builder = $initValue$\n"); - printer->Print("mergeWith(builder.parseFromWithSize(input, expectedSize).build())\n"); - - printer->Outdent(); - printer->Print("}\n"); - - // mergeFrom(input: CodedInputStream) - printer->Print("\n"); - printer->Print(vars, "fun mergeFrom (input: CodedInputStream) {\n"); - printer->Indent(); - - vars["builderName"] = getBuilderFullType(); - printer->Print(vars, "val builder = $initValue$\n"); - printer->Print("mergeWith(builder.parseFrom(input).build())\n"); - - printer->Outdent(); - printer->Print("}\n"); -} - - -void ClassGenerator::generateWriteToMethod(io::Printer *printer) const { - // generate function header - printer->Print("fun writeTo (output: CodedOutputStream) {" - "\n"); - printer->Indent(); - - // generate code for serialization/deserialization of fields - for (int i = 0; i < properties.size(); ++i) { - properties[i]->generateSerializationCode(printer, /* isRead = */ false, /* noTag = */ false); - printer->Print("\n"); - } - - printer->Outdent(); - printer->Print("}\n"); -} - -void ClassGenerator::generateHeader(io::Printer * printer, bool isBuilder) const { - // build list of arguments like 'field1: Type1, field2: Type2, ... ' - string argumentList = ""; - for (int i = 0; i < properties.size(); ++i) { - argumentList += "var " + properties[i]->simpleName + ": " + properties[i]->getFullType(); - if (i + 1 != properties.size()) { - argumentList += ", "; - } - } - - map vars; - vars["name"] = isBuilder? getBuidlerSimpleType() : getSimpleType(); - vars["maybePrivate"] = isBuilder? "" : " private"; - vars["args"] = argumentList; - printer->Print(vars, - "class $name$$maybePrivate$ constructor ($args$) {" - "\n" - ); -} - -void ClassGenerator::generateBuildMethod(io::Printer * printer) const { - map vars; - vars["returnType"] = getFullType(); - printer->Print(vars, - "fun build(): $returnType$ {\n"); - printer->Indent(); - - // pass all fields to constructor of enclosing class - printer->Print(vars, - "val res = $returnType$("); - for (int i = 0; i < properties.size(); ++i) { - printer->Print(properties[i]->simpleName.c_str()); - if (i + 1 != properties.size()) { - printer->Print(", "); - } - } - - printer->Print(")\n"); - printer->Print("res.errorCode = errorCode\n"); - printer->Print("return res\n"); - - printer->Outdent(); - printer->Print("}\n"); -} - -void ClassGenerator::generateInitSection(io::Printer * printer) const { - printer->Print("init {\n"); - printer->Indent(); - - for (int i = 0; i < properties.size(); ++i) { - map vars; - vars["name"] = properties[i]->simpleName; - vars["initVal"] = properties[i]->getInitValue(); - printer->Print(vars, - "this.$name$ = $name$" - "\n" - ); - } - - printer->Outdent(); - printer->Print("}\n"); -} - -void ClassGenerator::generateParseMethods(io::Printer *printer) const { - // ====== parseFieldFrom(input: CodedInputStream): Boolean ========= - map vars; - vars["builderName"] = getBuilderFullType(); - - printer->Print("fun parseFieldFrom(input: CodedInputStream): Boolean {\n"); - printer->Indent(); - - // messages are not required to end with 0-tag, therefore parsing method should check for EOF - printer->Print("if (input.isAtEnd()) { return false }\n"); - - // read tag and check if some field will follow (0-tag indicates end of message) - printer->Print("val tag = input.readInt32NoTag()\n"); - printer->Print("if (tag == 0) { return false } \n"); - - // parse tag into field number and wire type - printer->Print("val fieldNumber = WireFormat.getTagFieldNumber(tag)\n"); - printer->Print("val wireType = WireFormat.getTagWireType(tag)\n"); - - // 'when' to map fieldNumber into fieldName - printer->Print("when(fieldNumber) {\n"); - printer->Indent(); - - for (int i = 0; i < properties.size(); ++i) { - vars["fieldNumber"] = std::to_string(properties[i]->getFieldNumber()); - vars["kotlinFunSuffix"] = properties[i]->getKotlinFunctionSuffix(); - vars["kotlinWireType"] = properties[i]->getWireType(); - vars["dl"] = "$"; - printer->Print(vars, "$fieldNumber$ -> "); - - printer->Print("{\n"); - printer->Indent(); - - // check that wire type of that field is equal to expected - printer->Print(vars, "if (wireType.id != $kotlinWireType$.id) {\n"); - printer->Indent(); - printer->Print("errorCode = 1\n" - "return false\n"); - printer->Outdent(); - printer->Print("}\n"); - - properties[i]->generateSerializationCode(printer, /* isRead = */ true, /* noTag = */ true, /* isField = */ false); - - printer->Outdent(); - printer->Print("}\n"); - } - - printer->Print(vars, "else -> errorCode = 4\n"); - - printer->Outdent(); - printer->Print("}\n"); // when-clause - - printer->Print("return true\n"); - printer->Outdent(); - printer->Print("}\n"); // parseFieldFrom body - printer->Print("\n"); - - // ====== parseFromWithSize(input: CodedInputStream, expectedSize: Int) ========= - printer->Print(vars, - "fun parseFromWithSize(input: CodedInputStream, expectedSize: Int): $builderName$ {\n"); - printer->Indent(); - - // read while we won't exceed expected amount of bytes - printer->Print("while(getSizeNoTag() < expectedSize) {\n"); - printer->Indent(); - - printer->Print("parseFieldFrom(input)\n"); - - printer->Outdent(); // while-loop; - printer->Print("}\n"); - - // check if we have read more than expected - vars["dollar"] = "$"; - printer->Print(vars, - "if (getSizeNoTag() > expectedSize) { " - "errorCode = 2 " - "}\n"); - - printer->Print("return this\n"); - - printer->Outdent(); // function body - printer->Print("}\n"); - printer->Print("\n"); - - // ======== parseFrom(input: CodedInputStream) ========= - printer->Print(vars, - "fun parseFrom(input: CodedInputStream): $builderName$ {\n"); - printer->Indent(); - printer->Print("while(parseFieldFrom(input)) {"); - printer->Print("}\n"); - - printer->Print("return this\n"); - - printer->Outdent(); // function body - printer->Print("}\n"); -} - -void ClassGenerator::generateGetSizeMethod(io::Printer *printer) const { - // getSize(): Int - printer->Print("fun getSize(fieldNumber: Int): Int {\n"); - printer->Indent(); - - printer->Print("var size = 0\n"); - for (int i = 0; i < properties.size(); ++i) { - properties[i]->generateSizeEstimationCode(printer, "size", /* noTag = */ false); - } - - printer->Print("size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED)\n"); - printer->Print("return size\n"); - printer->Outdent(); - printer->Print("}\n"); - printer->Print("\n"); - - // getSizeNoTag(): Int - printer->Print("fun getSizeNoTag(): Int {\n"); - printer->Indent(); - - printer->Print("var size = 0\n"); - for (int i = 0; i < properties.size(); ++i) { - properties[i]->generateSizeEstimationCode(printer, "size", /* noTag = */ false); - } - - printer->Print("return size\n"); - printer->Outdent(); - printer->Print("}\n"); -} - -string ClassGenerator::getSimpleType() const { - return descriptor->name(); -} - -string ClassGenerator::getFullType() const { - return nameResolver->getClassName(getSimpleType()); -} - -string ClassGenerator::getBuilderFullType() const { - return nameResolver->getBuilderName(getSimpleType()); -} - -string ClassGenerator::getBuidlerSimpleType() const { - return "Builder" + getSimpleType(); -} - -string ClassGenerator::getBuilderInitValue() const { - // build list of arguments like 'field1: Type1, field2: Type2, ... ' - string argumentList = ""; - for (int i = 0; i < properties.size(); ++i) { - argumentList += properties[i]->getInitValue(); - if (i + 1 != properties.size()) { - argumentList += ", "; - } - } - - return getBuilderFullType() + "(" + argumentList + ")"; -} - - -} // namespace kotlin -} // namespace compiler -} // namespace protobuf -} // namespace google - - diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.h b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.h deleted file mode 100644 index 8f4253d60f3..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.h +++ /dev/null @@ -1,63 +0,0 @@ -// -// Created by user on 7/11/16. -// - -#ifndef SRC_KOTLIN_CLASS_GENERATOR_H -#define SRC_KOTLIN_CLASS_GENERATOR_H - -#include -#include -#include -#include "kotlin_field_generator.h" -#include "kotlin_enum_generator.h" -#include "kotlin_name_resolver.h" - -namespace google { -namespace protobuf { -namespace compiler { -namespace kotlin { - -class FieldGenerator; // declared in "kotlin_file_generator.h" -class NameResolver; // declared in "kotlin_name_resolver.h" -class EnumGenerator; // declared in "kotlin_enum_generator.h" - -class ClassGenerator { // TODO ProtoClass -public: - string getSimpleType() const; - string getFullType() const; - string getBuidlerSimpleType() const; - string getBuilderFullType() const; - string getBuilderInitValue() const; - - vector properties; - vector classesDeclarations; // TODO nestedClasses - vector enumsDeclaraions; // TODO ProtoEnum - ClassGenerator (Descriptor const * descriptor, NameResolver * nameResolver); - ~ClassGenerator (); - - // KtClassGenerator(ProtoClass)::generate() - void generateCode (io::Printer * printer, bool isBuilder = false) const; -private: - /** - * Flag isBuilder used for reducing code repeating, as code for class itself - * and for its inner builder are structurally very alike and can be generated - * with very little differences (like changing 'val's to 'var's and etc.) - */ - Descriptor const * descriptor; - NameResolver * nameResolver; - - void generateHeader (io::Printer * printer, bool isBuilder = false) const; - void generateBuilder (io::Printer * printer) const; - void generateBuildMethod (io::Printer * printer) const; - void generateInitSection (io::Printer * printer) const; - void generateWriteToMethod (io::Printer * printer) const; - void generateMergeMethods (io::Printer * printer) const; - void generateParseMethods (io::Printer * printer) const; - void generateGetSizeMethod (io::Printer * printer) const; -}; - -} // namespace kotlin -} // namespace compiler -} // namespace protobuf -} // namespace google -#endif //SRC_KOTLIN_CLASS_GENERATOR_H diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.cc deleted file mode 100644 index 1545deb2d5a..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.cc +++ /dev/null @@ -1,124 +0,0 @@ -// -// Created by user on 7/12/16. -// - -#include "kotlin_enum_generator.h" -#include - -namespace google { -namespace protobuf { -namespace compiler { -namespace kotlin { - - -EnumValueGenerator::EnumValueGenerator(EnumValueDescriptor const *descriptor) { - simpleName = descriptor->name(); - ordinal = descriptor->number(); -} - -void EnumValueGenerator::generateCode(io::Printer * printer) const { - map vars; - vars["name"] = simpleName; - vars["ordinal"] = std::to_string(ordinal); - printer->Print(vars, - "$name$ ($ordinal$)" - ); -} - -void EnumGenerator::generateCode(io::Printer * printer) const { - /** - * Generate enum class header. - * Note that according to protobuf encoding, wire stores enum fields as ints, - * and client is responsible for proper casting those ints to actual enum values. - * Therefore, we have to add int-constructor in generated Kotlin-enum, and assign - * ordinals for each enum-value properly. - */ - map vars; - vars["name"] = simpleName; - printer->Print(vars, - "enum class $name$(val id: Int) {" - "\n" - ); - printer->Indent(); - - // Generate enum values. - for (int i = 0; i < enumValues.size(); ++i) { - enumValues[i]->generateCode(printer); - printer->Print(","); - printer->Print("\n"); - } - - // Generate additional value that will indicate errors in parsing this enum from int - vars["size"] = std::to_string(enumValues.size()); - printer->Print(vars, "Unexpected($size$);\n"); - - printer->Print("\n"); - generateEnumConverter(printer); - - printer->Outdent(); - printer->Print("}"); -} - -void EnumGenerator::generateEnumConverter(io::Printer *printer) const { - // note that full-qualification is not necessary as this code resides in enum namespace - map vars; - vars["dollar"] = "$"; - vars["type"] = simpleName; - - printer->Print("companion object {\n"); - printer->Indent(); - - printer->Print(vars, "fun fromIntTo$type$ (ord: Int): $type$ {\n"); - printer->Indent(); - - printer->Print("return when (ord) {\n"); - printer->Indent(); - - // map ints to enum values - for (int j = 0; j < enumValues.size(); ++j) { - vars["ordinal"] = std::to_string(enumValues[j]->ordinal); - vars["value"] = enumValues[j]->simpleName; - - printer->Print(vars, - "$ordinal$ -> $type$.$value$\n"); - } - - // catch cast errors in else-clause - printer->Print(vars, - "else -> Unexpected\n"); - - printer->Outdent(); // when-clause - printer->Print("}\n"); - - printer->Outdent(); // function body - printer->Print("}\n"); - - printer->Outdent(); // companion object body - printer->Print("}\n"); -} - -EnumGenerator::~EnumGenerator() { - for (int i = 0; i < enumValues.size(); ++i) { - delete enumValues[i]; - } -} - -EnumGenerator::EnumGenerator(EnumDescriptor const *descriptor, NameResolver * nameResolver) - : simpleName(descriptor->name()) - , nameResolver(nameResolver) -{ - int values_count = descriptor->value_count(); - for (int i = 0; i < values_count; ++i) { - enumValues.push_back(new EnumValueGenerator(descriptor->value(i))); - } -} - -string EnumGenerator::getFullType() const { - return nameResolver->getClassName(simpleName); -} - - -} // namespace kotlin -} // namespace compiler -} // namespace protobuf -} // namespace google diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.h b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.h deleted file mode 100644 index 8a82731b7a4..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.h +++ /dev/null @@ -1,52 +0,0 @@ -// -// Created by user on 7/12/16. -// - -#ifndef PROTOBUF_KOTLIN_ENUM_GENERATOR_H -#define PROTOBUF_KOTLIN_ENUM_GENERATOR_H - -#include -#include -#include "kotlin_name_resolver.h" - -class NameResolver; // declared in "kotlin_name_resolver.h" - -namespace google { -namespace protobuf { -namespace compiler { -namespace kotlin { - -class EnumValueGenerator { -public: - EnumValueGenerator(EnumValueDescriptor const * descriptor); - string simpleName; - int ordinal; - - void generateCode(io::Printer *) const; -}; - -class EnumGenerator { -public: - EnumGenerator(EnumDescriptor const * descriptor, NameResolver * nameResolver); - ~EnumGenerator(); - string simpleName; - vector enumValues; - - /* Return full-qualified name of enum */ - string getFullType() const; - - void generateCode(io::Printer *) const; - -private: - void generateEnumConverter(io::Printer *printer) const; - NameResolver * nameResolver; -}; - -} // namespace kotlin -} // namespace compiler -} // namespace protobuf -} // namespace google - - -#endif //PROTOBUF_KOTLIN_ENUM_GENERATOR_H - diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc deleted file mode 100644 index 07a8c27a5cf..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc +++ /dev/null @@ -1,642 +0,0 @@ -// -// Created by user on 7/12/16. -// - -#include "kotlin_field_generator.h" -#include -#include -#include -#include "kotlin_name_resolver.h" -#include "UnreachableStateException.h" -#include - -namespace google { -namespace protobuf { -namespace compiler { -namespace kotlin { - -string FieldGenerator::getInitValue() const { - if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { - return getFullType() + "(0)"; - } - - if (getProtoType() == FieldDescriptor::TYPE_MESSAGE) { - ClassGenerator * cg = nameResolver->getClassGenerator(getSimpleType()); - // build list of arguments like 'field1: Type1, field2: Type2, ... ' - string argumentList = ""; - for (int i = 0; i < cg->properties.size(); ++i) { - argumentList += cg->properties[i]->getInitValue(); - if (i + 1 != cg->properties.size()) { - argumentList += ", "; - } - } - - return getBuilderFullType() + "(" + argumentList + ").build()"; - } - - if (getProtoType() == FieldDescriptor::TYPE_ENUM) { - return getEnumFromIntConverter() + "(0)"; - } - return name_resolving::protobufTypeToInitValue(getProtoType()); -} - - - -void FieldGenerator::generateCode(io::Printer *printer, bool isBuilder) const { - map vars; - vars["name"] = simpleName; - vars["field"] = getFullType(); - vars["protoType"] = getProtoType(); - - generateComment(printer); - -// printer->Print(vars, "var $name$ : $field$\n"); - - // generate setter for builder - if (isBuilder) { - generateSetter(printer); - } - - // generate additional methods for repeated fields - if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { - generateRepeatedMethods(printer, isBuilder); - } -} - -FieldGenerator::FieldGenerator(FieldDescriptor const * descriptor, ClassGenerator const * enclosingClass, NameResolver * nameResolver) - : descriptor(descriptor) - , enclosingClass(enclosingClass) - , nameResolver(nameResolver) - , simpleName(descriptor->name()) - , protoLabel(descriptor->label()) -{ } - -void FieldGenerator::generateSerializationForPacked(io::Printer *printer, bool isRead, bool noTag, bool isField) const { - map vars; - vars["fieldNumber"] = std::to_string(getFieldNumber()); - vars["underlyingType"] = getUnderlyingTypeGenerator().getFullType(); - vars["initValue"] = getUnderlyingTypeGenerator().getInitValue(); - vars["fieldName"] = simpleName; - vars["arrayType"] = getFullType(); - - bool isPrimitive = descriptor->type() != FieldDescriptor::TYPE_BYTES && - descriptor->type() != FieldDescriptor::TYPE_MESSAGE && - descriptor->type() != FieldDescriptor::TYPE_STRING && - descriptor->type() != FieldDescriptor::TYPE_ENUM; - if (isRead) { - if (!noTag) { - printer->Print(vars, "val tag = input.readTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); - } - printer->Print(vars, "val expectedByteSize = input.readInt32NoTag()\n"); - - /* hack: copy current FieldGenerator and change label to OPTIONAL. Also change name to - name of iterator in for-loop. - This will allow to re-use this function for generating serialization code for elements of array. - More importantly, this will care about nested types too. - Efficiently, it inlines serialization code for all underlying types. - This hack isn't necessary from the architectural point of view and could be safely - removed as soon as target code will support inheritance and interfaces. - (then writing CodedOutputStream.writeMessage will be possible). - */ - FieldGenerator singleFieldGen = getUnderlyingTypeGenerator(); - - /* Because we use arrays of static size as backend for repeated fields, - we would have to make excessive allocations in one-pass read, resulting - in O(n^2) memory usage for parsing n-element array. - Therefore, we use two-pass algorithms: - 1. Mark beginning of array in stream - 2. Read array, discarding all elements, just counting them - 3. Reset stream to beginning of array - 4. Allocate array of counted size - 5. Read all elements again, now storing them in that array - */ - - // ================ First pass: Counting Size ===================== - // Declare needed variables - printer->Print("var readSize = 0\n"); - printer->Print("var arraySize = 0\n"); - - // Mark stream - printer->Print("input.mark()\n"); - - // place declarations of tmp variables in anonymous scope for hygiene - printer->Print("do {\n"); - printer->Indent(); - printer->Print("var i = 0\n"); - printer->Print(vars, "while(readSize < expectedByteSize) {\n"); - printer->Indent(); - - // read single element - printer->Print(vars, "var tmp = $initValue$\n"); - singleFieldGen.simpleName = "tmp"; - singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; - - singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ true, /* isField = */ false); - - // increment arraySize - printer->Print("arraySize += 1\n"); - - // add size of read element to readSize - singleFieldGen.generateSizeEstimationCode(printer, "readSize", /* noTag = */ true, /* isField = */ false); - printer->Outdent(); // while-loop - printer->Print("}\n"); - - printer->Outdent(); // anonymous scope - printer->Print("} while (false)\n"); - - - // ================ Second pass: Reading array ===================== - // Allocate array of caluclated size - printer->Print(vars, "var newArray = $arrayType$(arraySize)\n"); - - // Reset stream - printer->Print("input.reset()\n"); - // Read elements - printer->Print("do {\n"); - printer->Indent(); - printer->Print("var i = 0\n"); - printer->Print(vars, "while(i < arraySize) {\n"); - printer->Indent(); - -// printer->Print(vars, "var tmp = $initValue$\n"); - singleFieldGen.simpleName = "newArray[i]"; - singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; - - singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ true, /* isField = */ false); - - // increment iterator - printer->Print("i += 1\n"); - - printer->Outdent(); // while-loop - printer->Print("}\n"); - - // finaly, assign new array to our field - printer->Print(vars, "$fieldName$ = newArray\n"); - - printer->Outdent(); // anonymous scope - printer->Print("} while (false)\n"); - } - else { - /** - * Protobuf format: - * - Check if size of array is > 0, because empty repeated fields shouldn't appear in message - * - Write tag explicitly - * - Write length as int32 (note that tag shouldn't be added) - * - Write all repeated elements via recursive call (for primitive types without tags) - */ - // tag - printer->Print(vars, "output.writeTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); - - // length - printer->Print(vars, "var arrayByteSize = 0\n"); - - printer->Print("\n"); - generateSizeEstimationCode(printer, "arrayByteSize", /* noTag = */ true, /* isField = */ false); - printer->Print(vars, "output.writeInt32NoTag(arrayByteSize)\n"); - printer->Print("\n"); - - // all elements - // place declaration of new variable in anonymous scope for hygiene - printer->Print("do {\n"); - printer->Indent(); - - printer->Print("var i = 0\n"); - printer->Print(vars, "while (i < $fieldName$.size) {\n"); - printer->Indent(); - - // hack: similar to one above - FieldGenerator singleFieldGen = FieldGenerator(descriptor, enclosingClass, nameResolver); - singleFieldGen.simpleName = simpleName + "[i]"; - singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; - - singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ isPrimitive, /* isField = */ false); - - printer->Print(vars, "i += 1\n"); - - printer->Outdent(); // while-loop - printer->Print("}\n"); - - printer->Outdent(); // anonymous scope - printer->Print("} while(false)\n"); - } -} - -void FieldGenerator::generateSerializationForEnums(io::Printer * printer, bool isRead, bool noTag, bool isField) const { - map vars; - vars["converter"] = getEnumFromIntConverter(); - vars["fieldName"] = simpleName; - vars["suffix"] = getKotlinFunctionSuffix(); - vars["fieldNumber"] = std::to_string(getFieldNumber()); - vars["initValue"] = getInitValue(); - - if (isRead) { - if (noTag) { - printer->Print(vars, "$fieldName$ = $converter$(input.read$suffix$NoTag())\n"); - } - else { - printer->Print(vars, "$fieldName$ = $converter$(input.read$suffix$($fieldNumber$))\n"); - } - } - else { - if (noTag) { - printer->Print(vars, "output.write$suffix$NoTag ()\n"); - } - else { - printer->Print(vars, "output.write$suffix$ ($fieldNumber$, $fieldName$.id)\n"); - } - } -} - -void FieldGenerator::generateSerializationForMessages(io::Printer * printer, bool isRead, bool noTag, bool isField) const { - map vars; - vars["fieldNumber"] = std::to_string(getFieldNumber()); - vars["dollar"] = "$"; - vars["fieldName"] = simpleName; - - if (isRead) { - // We will create some temporary variables - // So we place following code into separate block for the sake of hygiene - printer->Print("do {\n"); - printer->Indent(); - - // read tag - if (!noTag) { - printer->Print(vars, "input.readTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); - } - - // read expected size - printer->Print(vars, "val expectedSize = input.readInt32NoTag()\n"); - - // TODO: think about it, as it's not good approach - if some error occurs, we will read more bytes - // than expectedSize from CodedInputStream. That could potentially lead to some lingering problems in wire. - - // read message itself without tag, but limiting its size to expectedSize - printer->Print(vars, - "$fieldName$.mergeFromWithSize(input, expectedSize)\n"); - - // check that actual size equal to expected size - printer->Print(vars, "if (expectedSize != $fieldName$.getSizeNoTag()) { errorCode = 3; return false }\n"); - - printer->Outdent(); - printer->Print("} while(false) \n"); - } - else { - // write tag - printer->Print(vars, "output.writeTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); - - // write message length - printer->Print(vars, "output.writeInt32NoTag($fieldName$.getSizeNoTag())\n"); - - // write message itself without tag - printer->Print(vars, - "$fieldName$.writeTo(output)\n"); - } -} - -void FieldGenerator::generateSerializationForPrimitives(io::Printer * printer, bool isRead, bool noTag, bool isField) const { - map vars; - vars["fieldName"] = simpleName; - vars["suffix"] = getKotlinFunctionSuffix(); - vars["fieldNumber"] = std::to_string(getFieldNumber()); - if (isRead) { - if (noTag) { - printer->Print(vars, "$fieldName$ = input.read$suffix$NoTag()\n"); - } - else { - printer->Print(vars, "$fieldName$ = input.read$suffix$ ($fieldNumber$)"); - } - } - else { - if (noTag) { - printer->Print(vars, "output.write$suffix$NoTag ($fieldName$)\n"); - } - else { - printer->Print(vars, "output.write$suffix$ ($fieldNumber$, $fieldName$)\n"); - } - } -} - -void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead, bool noTag, bool isField) const { - map vars; - vars["fieldName"] = simpleName; - vars["initValue"] = getInitValue(); - - if (isField) { - generateComment(printer); - } - - /* Try to generate syntax for serialization of repeated fields. - * Note that it should be first check because of Google's FieldDescriptor structure */ - if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { - // we shouldn't write fields with default values when writing - if (!isRead && isField) { - printer->Print(vars, "if ($fieldName$.size > 0) {\n"); - printer->Indent(); - } - - bool isPrimitive = descriptor->type() != FieldDescriptor::TYPE_BYTES && - descriptor->type() != FieldDescriptor::TYPE_MESSAGE && - descriptor->type() != FieldDescriptor::TYPE_STRING; - if (isPrimitive) { - generateSerializationForPacked(printer, isRead, noTag, isField); - } - else { - throw UnreachableStateException("Arrays of non-primitive types are not supported"); - } - if (!isRead && isField) { - printer->Outdent(); - printer->Print("}\n"); - } - } - - else { - /* Then check is current field is enum. We have to handle it separately too, because - * we have to pass enums as Int's to CodedStreams as per protobuf-format */ - if (descriptor->type() == FieldDescriptor::TYPE_ENUM) { - // we shouldn't write fair fields with default values - // compare enums as their ids - if (!isRead && isField) { - printer->Print(vars, "if ($fieldName$.id != $initValue$.id) {\n"); - printer->Indent(); - } - generateSerializationForEnums(printer, isRead, noTag, isField); - if (!isRead && isField) { - printer->Outdent(); - printer->Print("}\n"); - } - } - - /* Then check for nested messages. Here we re-use writeTo method, that should be defined in - * that message. - * Note that readFrom/writeTo methods write message as it's top-level message, i.e. without - * any tags. Therefore, we have to prepend tags and size manually. */ - else if (descriptor->type() == FieldDescriptor::TYPE_MESSAGE) { - // note that we don't check message-type fields for default values - generateSerializationForMessages(printer, isRead, noTag, isField); - } - - /* Finally, serialize trivial cases */ - else { - // we shouldn't write fair fields with default values - // compare enums as their ids - if (!isRead && isField) { - printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); - printer->Indent(); - } - generateSerializationForPrimitives(printer, isRead, noTag, isField); - if (!isRead && isField) { - printer->Outdent(); - printer->Print("}\n"); - } - } - } - - -} - - -void FieldGenerator::generateSetter(io::Printer *printer) const { - map vars; - vars["camelCaseName"] = name_resolving::makeFirstLetterUpper(simpleName); - vars["fieldName"] = simpleName; - vars["builderName"] = enclosingClass->getBuilderFullType(); - vars["type"] = getFullType(); - printer->Print(vars, - "fun set$camelCaseName$(value: $type$): $builderName$ {\n"); - printer->Indent(); - printer->Print(vars, - "$fieldName$ = value\n" - "return this\n"); - printer->Outdent(); - printer->Print("}\n"); -} - -void FieldGenerator::generateRepeatedMethods(io::Printer * printer, bool isBuilder) const { - map vars; - vars["elementType"] = getUnderlyingTypeGenerator().getSimpleType(); - vars["arg"] = "value"; - vars["fieldName"] = simpleName; - vars["builderName"] = enclosingClass->getBuilderFullType(); - - // generate indexed setter for builders - if (isBuilder) { - printer->Print(vars, "fun set$fieldName$ByIndex(index: Int, $arg$: $elementType$): $builderName$ {\n"); - printer->Indent(); - printer->Print(vars, "$fieldName$[index] = $arg$\n"); - printer->Print(vars, "return this\n"); - printer->Outdent(); - printer->Print("}\n"); - } -} - -string FieldGenerator::getKotlinFunctionSuffix() const { - return name_resolving::protobufTypeToKotlinFunctionSuffix(descriptor->type()); -} - - -void FieldGenerator::generateSizeForPacked(io::Printer * printer, string varName, bool noTag, bool isField) const { - map vars; - vars["varName"] = varName; - vars["fieldName"] = simpleName; - vars["fieldNumber"] = std::to_string(getFieldNumber()); - printer->Print(vars, "if ($fieldName$.size != 0) {\n"); - printer->Indent(); - - // We will need total byte size of array, because that size is itself a part of the message and - // adds to total message size. - // For the sake of hygiene, temporary variables are created in anonymous scope - printer->Print("do {\n"); - printer->Indent(); - - // Create a temporary variable that will collect array byte size - printer->Print("var arraySize = 0\n"); - - // Add tag size, if necessary - if (!noTag) { - printer->Print(vars, "$varName$ += WireFormat.getTagSize($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); - } - - // iterate over all elements of array - printer->Print("var i = 0\n"); - printer->Print(vars, "while (i < $fieldName$.size) {\n"); - printer->Indent(); - - // hack: reuse generateSizeEstimationCode in the same manner as in generateSerializationCode - FieldGenerator singleFieldGen = FieldGenerator(descriptor, enclosingClass, nameResolver); - singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; - singleFieldGen.simpleName = simpleName + "[i]"; - singleFieldGen.generateSizeEstimationCode(printer, "arraySize", /* noTag = */ true, /* isField = */ false); - - printer->Print(vars, "i += 1\n"); - - printer->Outdent(); // for-loop - printer->Print("} \n"); - - // now add size of array to total message size: - printer->Print(vars, - "$varName$ += arraySize\n"); // actual array size - - // add size of size annotation: - if (!noTag) { - printer->Print(vars, "$varName$ += WireFormat.getInt32SizeNoTag(arraySize)\n"); - } - - printer->Outdent(); // anonymous scope - printer->Print("} while(false)\n"); - - printer->Outdent(); // if-clause - printer->Print("}\n"); -} - -void FieldGenerator::generateSizeForEnums(io::Printer *printer, string varName, bool noTag, bool isField) const { - map vars; - vars["varName"] = varName; - vars["fieldName"] = simpleName; - vars["fieldNumber"] = std::to_string(getFieldNumber()); - printer->Print(vars, "$varName$ += WireFormat.getEnumSize($fieldNumber$, $fieldName$.id)\n"); -} - -void FieldGenerator::generateSizeForMessages(io::Printer * printer, string varName, bool noTag, bool isField) const { - map vars; - vars["varName"] = varName; - vars["fieldName"] = simpleName; - vars["maybeNoTag"] = noTag ? "NoTag" : ""; - vars["maybeFieldNumber"] = noTag ? "" : std::to_string(getFieldNumber()); - printer->Print(vars, "$varName$ += $fieldName$.getSize$maybeNoTag$($maybeFieldNumber$)" - "\n"); -} - -void FieldGenerator::generateSizeForPrimitives(io::Printer * printer, string varName, bool noTag, bool isField) const { - map vars; - vars["varName"] = varName; - vars["fieldName"] = simpleName; - vars["kotlinSuffix"] = getKotlinFunctionSuffix(); - vars["noTag"] = noTag ? "NoTag" : ""; - vars["fn"] = noTag ? "" : std::to_string(getFieldNumber()) + ", "; - printer->Print(vars, "$varName$ += WireFormat.get$kotlinSuffix$Size$noTag$($fn$$fieldName$)\n"); -} - -void FieldGenerator::generateSizeEstimationCode(io::Printer *printer, string varName, bool noTag, bool isField) const { - map vars; - vars["fieldName"] = simpleName; - vars["initValue"] = getInitValue(); - - // First of all, generate code for repeated fields - if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { - generateSizeForPacked(printer, varName, noTag, isField); - return; - } - - // If we are generating code for fair field (not for dummy), then we should check for default value - // Note that we can't lift that check up, because repeated fields should be treated separately - if (isField) { - printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); - printer->Indent(); - } - - // Then, call getSize recursively for nested messages - if (getProtoType() == FieldDescriptor::TYPE_MESSAGE) { - generateSizeForMessages(printer, varName, noTag, isField); - } - // Next, process enums as they should be casted to ints manually - else if (getProtoType() == FieldDescriptor::TYPE_ENUM) { - generateSizeForEnums(printer, varName, noTag, isField); - } - // Finally, get size of all primitive types trivially via call to WireFormat in runtime - else { - generateSizeForPrimitives(printer, varName, noTag, isField); - } - - if (isField) { - printer->Outdent(); // if-clause - printer->Print("}\n"); - } -} - -FieldDescriptor::Label FieldGenerator::getProtoLabel() const { - return protoLabel; -} - - -FieldDescriptor::Type FieldGenerator::getProtoType() const { - return descriptor->type(); -} - -int FieldGenerator::getFieldNumber() const { - return descriptor->number(); -} - -string FieldGenerator::getSimpleType() const { - if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { - return "MutableList <" + getUnderlyingTypeGenerator().getSimpleType() + ">"; - } - if (getProtoType() == FieldDescriptor::TYPE_MESSAGE) { - return descriptor->message_type()->name(); - } - if (getProtoType() == FieldDescriptor::TYPE_ENUM) { - return descriptor->enum_type()->name(); - } - return name_resolving::protobufToKotlinType(descriptor->type()); -} - -string FieldGenerator::getFullType() const { - if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { - return getUnderlyingTypeGenerator().getFullType() + "Array"; - } - if (getProtoType() == FieldDescriptor::TYPE_MESSAGE || - getProtoType() == FieldDescriptor::TYPE_ENUM) { - return nameResolver->getClassName(getSimpleType()); - } - return name_resolving::protobufToKotlinType(getProtoType()); -} - -string FieldGenerator::getBuilderFullType() const { - if (getProtoType() != FieldDescriptor::TYPE_MESSAGE) { - throw UnreachableStateException("Error: trying to get builder name for non-message field " + simpleName); - } - return nameResolver->getBuilderName(getSimpleType()); -} - -string FieldGenerator::getBuilderSimpleType() const { - if (getProtoType() != FieldDescriptor::TYPE_MESSAGE) { - throw UnreachableStateException("Error: trying to get builder name for non-message field " + simpleName); - } - return "Builder" + getSimpleType(); -} - -string FieldGenerator::getEnumFromIntConverter() const { - return getFullType() + ".fromIntTo" + getSimpleType(); -} - -FieldGenerator FieldGenerator::getUnderlyingTypeGenerator() const { - if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { - FieldGenerator singleFieldGen = FieldGenerator(descriptor, enclosingClass, nameResolver); - singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; - return singleFieldGen; - } - return *this; -} - -string FieldGenerator::getWireType() const { - if (descriptor->label() == FieldDescriptor::LABEL_REPEATED) { - return "WireType.LENGTH_DELIMITED"; - } - return name_resolving::protobufTypeToKotlinWireType(descriptor->type()); -} - -void FieldGenerator::generateComment(io::Printer *printer) const { - map vars; - - vars["repeated"] = descriptor->is_repeated() ? "repeated " : ""; - vars["declared_type"] = descriptor->type_name(); - vars["name"] = descriptor->name(); - vars["number"] = std::to_string(descriptor->number()); - - printer->Print(vars, "//$repeated$$declared_type$ $name$ = $number$\n"); -} - - -} // namespace kotlin -} // namespace compiler -} // namespace protobuf -} // namespace google \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.h b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.h deleted file mode 100644 index 799239ecef2..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.h +++ /dev/null @@ -1,102 +0,0 @@ -// -// Created by user on 7/12/16. -// - -#ifndef PROTOBUF_KOTLIN_FIELD_GENERATOR_H -#define PROTOBUF_KOTLIN_FIELD_GENERATOR_H - -#include -#include -#include -#include "kotlin_class_generator.h" -#include "kotlin_name_resolver.h" - -namespace google { -namespace protobuf { -namespace compiler { -namespace kotlin { - -class ClassGenerator; // declared in kotlin_class_generator.h -class NameResolver; // declared in kotlin_name_resolver.h - -class FieldGenerator { -private: - FieldDescriptor const * descriptor; - - void generateSetter(io::Printer * printer) const; - void generateComment(io::Printer * printer) const; - void generateRepeatedMethods(io::Printer * printer, bool isBuilder) const; - - void generateSerializationForPacked (io::Printer * printer, bool isRead, bool noTag, bool isField) const; - void generateSerializationForEnums (io::Printer * printer, bool isRead, bool noTag, bool isField) const; - void generateSerializationForMessages (io::Printer * printer, bool isRead, bool noTag, bool isField) const; - void generateSerializationForPrimitives (io::Printer * printer, bool isRead, bool noTag, bool isField) const; - - void generateSizeForPacked (io::Printer * printer, string varName, bool noTag, bool isField) const; - void generateSizeForEnums (io::Printer * printer, string varName, bool noTag, bool isField) const; - void generateSizeForMessages (io::Printer * printer, string varName, bool noTag, bool isField) const; - void generateSizeForPrimitives (io::Printer * printer, string varName, bool noTag, bool isField) const; -public: - ClassGenerator const * enclosingClass; // class, in which that field is defined - NameResolver * nameResolver; - string simpleName; - - FieldDescriptor::Label protoLabel; // TODO: hack here - this field is used for some dark magic that allows us to drop generics from the generated code - - FieldDescriptor::Label getProtoLabel() const; - FieldDescriptor::Type getProtoType() const; - - /* Return declared tag number */ - int getFieldNumber() const; - - /* Returns instance of FieldGenerator, that generated underlying type for repeated fields. - * For non-repeated fields, returns `this` */ - FieldGenerator getUnderlyingTypeGenerator() const; - - /* For repeated fields, returns simple name of single element. - * For all other cases, returns simple name of field, which is the same as getType() - */ - - /* For repeated fields, return simple name of single element, wrapped into corresponding Kotlin array type - * Example: Array - * For other types, return simple name (without full-qualification for non-primitive types) of field's type - */ - string getSimpleType() const; - - string getBuilderSimpleType() const; - - /* Returns full=qualified name of builder if field type is user-defined message */ - string getBuilderFullType() const; - - /* Returns the same as getType(), but with full-qualification for non-primitive types if necessary. - * Example: Array - */ - string getFullType() const; - - /* Returns initial value of this field's type. - * Note that full qualification for non-primitive types will always used here. - */ - string getInitValue() const; - - - /* Return string, that is suitable as suffix for corresponding IO methods in ProtoKot runtime. - * Example: int64-field -> Int64 (readInt64() and writeInt64() methods exist in ProtoKot runtime) - */ - string getKotlinFunctionSuffix() const; - - /* Return function name in enum namespace that converts from enum to Int */ - string getEnumFromIntConverter() const; - - string getWireType() const; - void generateCode(io::Printer * printer, bool isBuilder) const; - void generateSerializationCode (io::Printer * printer, bool isRead = false, bool noTag = false, bool isField = true) const; - void generateSizeEstimationCode(io::Printer * printer, string varName, bool noTag = false, bool isField = true) const; - FieldGenerator(FieldDescriptor const * descriptor, ClassGenerator const * enclosingClass, NameResolver * nameResolver); -}; - -} // namespace kotlin -} // namespace compiler -} // namespace protobuf -} // namespace google - -#endif //PROTOBUF_KOTLIN_FIELD_GENERATOR_H diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_file_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_file_generator.cc deleted file mode 100644 index 91ad3f5d58e..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_file_generator.cc +++ /dev/null @@ -1,67 +0,0 @@ -// -// Created by user on 7/11/16. -// - -#include -#include -#include -#ifndef _SHARED_PTR_H -#include -#endif -#include "kotlin_file_generator.h" -#include -#include "kotlin_name_resolver.h" - -namespace google { -namespace protobuf { -namespace compiler { -namespace kotlin { - -void FileGenerator::generateCode(io::Printer *printer, std::vector & classes) { - for (int i = 0; i < classes.size(); ++i) { - classes[i]->generateCode(printer); - printer->Print("\n\n"); - } -} - -// Extract more methods or inline generateCode() to have common style in this method -bool FileGenerator::Generate(const FileDescriptor *file, const string ¶meter, GeneratorContext *context, - string *error) const { - std::vector classes; - string const file_name = name_resolving::getKotlinOutputByProtoName(file->name()); - google::protobuf::scoped_ptr output(context->Open(file_name)); - io::Printer printer(output.get(), '$', /* annotation_collector = */ NULL); - NameResolver * nameResolver = new NameResolver(); - - // Create Generators for all top-level messages - int topLevelMessagesCount = file->message_type_count(); - for (int i = 0; i < topLevelMessagesCount; ++i) { - Descriptor const * descriptor = file->message_type(i); - // TODO: think about order of initialization and cross-branches calls. If we don't allow such things, everythign is ok atm - nameResolver->addClass(descriptor->name(), /* parentName = */ ""); - ClassGenerator * cgen = new ClassGenerator(descriptor, nameResolver); - nameResolver->addGeneratorForClass(descriptor->name(), cgen); - classes.push_back(cgen); - } - - // Generate code and clean up - generateCode(&printer, classes); - - for (int i = 0; i < classes.size(); ++i) { - delete classes[i]; - } - delete nameResolver; - - return true; -} - -FileGenerator::FileGenerator() { } - -FileGenerator::~FileGenerator() { -} - - -} // namespace kotlin -} // namespace compiler -} // namespace protobuf -} // namespace google diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_file_generator.h b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_file_generator.h deleted file mode 100644 index e2cc1f039d8..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_file_generator.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// Created by user on 7/11/16. -// - -#ifndef SRC_KOTLIN_FILE_GENERATOR_H -#define SRC_KOTLIN_FILE_GENERATOR_H - -#include "kotlin_class_generator.h" -#include -#include -#include - -namespace google { -namespace protobuf { -namespace compiler { -namespace kotlin { - - -class FileGenerator : public CodeGenerator { -public: - FileGenerator(); - ~FileGenerator(); - - // implements CodeGenerator ---------------------------------------- - bool Generate(const FileDescriptor* file, - const string& parameter, - GeneratorContext* context, - string* error) const; -private: - // TODO check code style - static void generateCode(io::Printer *, std::vector &); -}; - -} // namespace kotlin -} // namespace compiler -} // namespace protobuf -} // namespace google -#endif //SRC_KOTLIN_FILE_GENERATOR_H diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.cc deleted file mode 100644 index e05be1af93d..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.cc +++ /dev/null @@ -1,235 +0,0 @@ -// -// Created by user on 7/14/16. -// - -#include "kotlin_name_resolver.h" -#include "kotlin_field_generator.h" -#include -#include "UnreachableStateException.h" -#include -namespace google { -namespace protobuf { -namespace compiler { -namespace kotlin { - -namespace name_resolving { - -using namespace std; - -string makeFirstLetterUpper(std::string s) { - s[0] = std::toupper(s[0]); - return s; -} - -string getFileNameWithoutExtension(string fullName) { - size_t file_extension_index = fullName.find_last_of("."); - return fullName.substr(0, file_extension_index); -} - -string getKotlinOutputByProtoName(string protoName) { - string fileWithoutPath = protoName.substr(protoName.find_last_of("/") + 1, protoName.length()); - string justName = getFileNameWithoutExtension(fileWithoutPath); - return justName + ".kt"; -} - -string protobufToKotlinType(FieldDescriptor::Type type) { - switch(type) { - case FieldDescriptor::TYPE_BOOL: - return "Boolean"; - case FieldDescriptor::TYPE_BYTES: - return "ByteArray"; - case FieldDescriptor::TYPE_DOUBLE: - return "Double"; - case FieldDescriptor::TYPE_ENUM: - throw UnreachableStateException - ("Error: mapping protobuf enum types to kotlin types should be resolved by field generator, not by protobufToKotlinType function"); - case FieldDescriptor::TYPE_FIXED32: - // we map uint32 into Int, storing top bit in sign bit - return "Int"; - case FieldDescriptor::TYPE_FIXED64: - // we map uint64 into Long, storing top bit in sign bit - return "Long"; - case FieldDescriptor::TYPE_FLOAT: - return "Float"; - case FieldDescriptor::TYPE_INT32: - return "Int"; - case FieldDescriptor::TYPE_INT64: - return "Long"; - case FieldDescriptor::TYPE_MESSAGE: - throw UnreachableStateException - ("Error: mapping protobuf message types to kotlin types should be resolved by field generator, not by protobufToKotlinType function"); - case FieldDescriptor::TYPE_SFIXED32: - return "Int"; - case FieldDescriptor::TYPE_SFIXED64: - return "Long"; - case FieldDescriptor::TYPE_SINT32: - return "Int"; - case FieldDescriptor::TYPE_SINT64: - return "Long"; - case FieldDescriptor::TYPE_STRING: - return "String"; - case FieldDescriptor::TYPE_UINT32: - return "Int"; // see notes for TYPE_FIXED32 - case FieldDescriptor::TYPE_UINT64: - return "Long"; // see notes for TYPE_FIXED64 - } -} - - -// TODO: think about nested arrays -string protobufTypeToInitValue(FieldDescriptor::Type type) { - switch(type) { - case FieldDescriptor::TYPE_BOOL: - return "false"; - case FieldDescriptor::TYPE_BYTES: - return "ByteArray(0)"; - case FieldDescriptor::TYPE_DOUBLE: - return "0.0"; - case FieldDescriptor::TYPE_ENUM: - throw UnreachableStateException("Error: getting init values of enums should be handled by FieldGenerator, not by protobufToInitValue"); - case FieldDescriptor::TYPE_FIXED32: - return "0"; - case FieldDescriptor::TYPE_FIXED64: - return "0L"; - case FieldDescriptor::TYPE_FLOAT: - return "0f"; - case FieldDescriptor::TYPE_INT32: - return "0"; - case FieldDescriptor::TYPE_INT64: - return "0L"; - case FieldDescriptor::TYPE_MESSAGE: - throw UnreachableStateException("Error: getting init values of enums should be handled by FieldGenerator, not by protobufToInitValue"); - case FieldDescriptor::TYPE_SFIXED32: - return "0"; - case FieldDescriptor::TYPE_SFIXED64: - return "0L"; - case FieldDescriptor::TYPE_SINT32: - return "0"; - case FieldDescriptor::TYPE_SINT64: - return "0L"; - case FieldDescriptor::TYPE_STRING: - return "\"\""; - case FieldDescriptor::TYPE_UINT32: - return "0"; // see notes for TYPE_FIXED32 - case FieldDescriptor::TYPE_UINT64: - return "0L"; // see notes for TYPE_FIXED64 - } -} - -string protobufTypeToKotlinFunctionSuffix(FieldDescriptor::Type type) { - switch (type) { - case FieldDescriptor::TYPE_DOUBLE: - return "Double"; - case FieldDescriptor::TYPE_FLOAT: - return "Float"; - case FieldDescriptor::TYPE_INT64: - return "Int64"; - case FieldDescriptor::TYPE_UINT64: - return "UInt64"; - case FieldDescriptor::TYPE_INT32: - return "Int32"; - case FieldDescriptor::TYPE_FIXED64: - return "Fixed64"; - case FieldDescriptor::TYPE_FIXED32: - return "Fixed32"; - case FieldDescriptor::TYPE_BOOL: - return "Bool"; - case FieldDescriptor::TYPE_STRING: - return "String"; - case FieldDescriptor::TYPE_MESSAGE: - return "Message"; - case FieldDescriptor::TYPE_BYTES: - return "Bytes"; - case FieldDescriptor::TYPE_UINT32: - return "UInt32"; - case FieldDescriptor::TYPE_ENUM: - return "Enum"; - case FieldDescriptor::TYPE_SFIXED32: - return "SFixed32"; - case FieldDescriptor::TYPE_SFIXED64: - return "SFixed64"; - case FieldDescriptor::TYPE_SINT32: - return "SInt32"; - case FieldDescriptor::TYPE_SINT64: - return "SInt64"; - } -} - -string protobufTypeToKotlinWireType(FieldDescriptor::Type type) { - switch (type) { - case FieldDescriptor::TYPE_DOUBLE: - return "WireType.FIX_64"; - case FieldDescriptor::TYPE_FLOAT: - return "WireType.FIX_32"; - case FieldDescriptor::TYPE_INT64: - return "WireType.VARINT"; - case FieldDescriptor::TYPE_UINT64: - return "WireType.VARINT"; - case FieldDescriptor::TYPE_INT32: - return "WireType.VARINT"; - case FieldDescriptor::TYPE_FIXED64: - return "WireType.FIX_64"; - case FieldDescriptor::TYPE_FIXED32: - return "WireType.FIX_32"; - case FieldDescriptor::TYPE_BOOL: - return "WireType.VARINT"; - case FieldDescriptor::TYPE_STRING: - return "WireType.LENGTH_DELIMITED"; - case FieldDescriptor::TYPE_MESSAGE: - return "WireType.LENGTH_DELIMITED"; - case FieldDescriptor::TYPE_BYTES: - return "WireType.LENGTH_DELIMITED"; - case FieldDescriptor::TYPE_UINT32: - return "WireType.VARINT"; - case FieldDescriptor::TYPE_ENUM: - return "WireType.VARINT"; - case FieldDescriptor::TYPE_SFIXED32: - return "WireType.FIX_32"; - case FieldDescriptor::TYPE_SFIXED64: - return "WireType.FIX_64"; - case FieldDescriptor::TYPE_SINT32: - return "WireType.VARINT"; - case FieldDescriptor::TYPE_SINT64: - return "WireType.VARINT"; - } -} -} // namespace name_resolving - -NameResolver::NameResolver() { - names = map(); - builders = map(); - generators = map(); -} - -void NameResolver::addClass(string simpleName, string parentName) { - if (parentName == "") { - names[simpleName] = simpleName; - builders[simpleName] = simpleName + ".Builder" + simpleName; - } - else - { - names[simpleName] = parentName + "." + simpleName; - builders[simpleName] = parentName + "." + simpleName + ".Builder" + simpleName; - } -} - -void NameResolver::addGeneratorForClass(string simpleName, ClassGenerator *classGenerator) { - generators[simpleName] = classGenerator; -} -string NameResolver::getClassName(string simpleName) { - return names[simpleName]; -} - -string NameResolver::getBuilderName(string classSimpleName) { - return builders[classSimpleName]; -} - -ClassGenerator * NameResolver::getClassGenerator(string simpleName) { - return generators[simpleName]; -} - -} // namespace kotlin -} // namespace compiler -} // namespace protobuf -} // namespace google - diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.h b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.h deleted file mode 100644 index f3c6b91260b..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.h +++ /dev/null @@ -1,67 +0,0 @@ -// -// Created by user on 7/14/16. -// - -#ifndef GOOGLE_KOTLIN_NAME_RESOLVER_H -#define GOOGLE_KOTLIN_NAME_RESOLVER_H - -#include -#include -#include -#include "kotlin_field_generator.h" -#include "kotlin_class_generator.h" - -namespace google { -namespace protobuf { -namespace compiler { -namespace kotlin { - -class FieldGenerator; // declared in kotlin_field_generator.h -class ClassGenerator; // declared in kotlin_class_generator.h - -class NameResolver { -public: - NameResolver(); - - void addClass (string simpleName, string parentName); - void addGeneratorForClass (string simpleName, ClassGenerator * classGenerator); - string getClassName (string simpleName); - string getBuilderName (string classSimpleName); - ClassGenerator * getClassGenerator (string simpleName); -private: - std::map names; - std::map builders; - std::map generators; -}; -namespace name_resolving { - -std::string makeFirstLetterUpper(std::string s); - -std::string getFileNameWithoutExtension(std::string fullName); - -std::string getKotlinOutputByProtoName(std::string protoName); - -std::string protobufTypeToInitValue(FieldDescriptor::Type type); - -std::string protobufToKotlinType(FieldDescriptor::Type type); - -std::string protobufTypeToKotlinWireType(FieldDescriptor::Type type); - -/** -* Converts one of protobuf wire types to corresponding Kotlin type with proper -* naming, so it could be used as suffix after read/write, resulting in function -* in CodedInputStream/CodedOutputStream. -* Example: protobufToKotlinFunctionSuffix(TYPE_SFIXED32) returns "SFixed32", and -* in Kotlin runtime exists method -* CodedInputStream.readSFixed32(fieldNumber: Int) -*/ -std::string protobufTypeToKotlinFunctionSuffix(FieldDescriptor::Type type); - -} // namespace name_resolving -} // namespace kotlin -} // namespace compiler -} // namespace protobuf -} // namespace google - - -#endif //GOOGLE_KOTLIN_NAME_RESOLVER_H diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/main.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/main.cc deleted file mode 100644 index b78d9771bc6..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/main.cc +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "kotlin_file_generator.h" -#include - -// TODO attacch Kotlin generator to protoc as plugin. -// Don't rewrite protoc main. -int main(int argc, const char* const * argv) { - google::protobuf::compiler::CommandLineInterface cli; - cli.AllowPlugins("protoc-"); - - // Proto2 C++ - google::protobuf::compiler::cpp::CppGenerator cpp_generator; - cli.RegisterGenerator("--cpp_out", "--cpp_opt", &cpp_generator, - "Generate C++ header and source."); - - // Proto2 Java - google::protobuf::compiler::java::JavaGenerator java_generator; - cli.RegisterGenerator("--java_out", &java_generator, - "Generate Java source file."); - - - // Proto2 Python - google::protobuf::compiler::python::Generator py_generator; - cli.RegisterGenerator("--python_out", &py_generator, - "Generate Python source file."); - - // Java Nano - google::protobuf::compiler::javanano::JavaNanoGenerator javanano_generator; - cli.RegisterGenerator("--javanano_out", &javanano_generator, - "Generate Java Nano source file."); - - // TODO(teboring): Add it back when php implementation is ready - // PHP - // google::protobuf::compiler::php::Generator php_generator; - // cli.RegisterGenerator("--php_out", &php_generator, - // "Generate PHP source file."); - - // Ruby - google::protobuf::compiler::ruby::Generator rb_generator; - cli.RegisterGenerator("--ruby_out", &rb_generator, - "Generate Ruby source file."); - - // CSharp - google::protobuf::compiler::csharp::Generator csharp_generator; - cli.RegisterGenerator("--csharp_out", "--csharp_opt", &csharp_generator, - "Generate C# source file."); - - // Objective C - google::protobuf::compiler::objectivec::ObjectiveCGenerator objc_generator; - cli.RegisterGenerator("--objc_out", "--objc_opt", &objc_generator, - "Generate Objective C header and source."); - - // JavaScript - google::protobuf::compiler::js::Generator js_generator; - cli.RegisterGenerator("--js_out", &js_generator, - "Generate JavaScript source."); - - // Kotlin - google::protobuf::compiler::kotlin::FileGenerator kotlinGenerator; - cli.RegisterGenerator("--kotlin_out", &kotlinGenerator, - "Generate Kotlin source file."); - - return cli.Run(argc, argv); - -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/base_message.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/base_message.proto deleted file mode 100644 index bc664b1e9c5..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/base_message.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message Base { - repeated int64 arr = 1; - bool flag = 5; - int32 int = 7; - -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/connect.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/connect.proto deleted file mode 100644 index 54d70e3c15c..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/connect.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message ConnectionRequest { - repeated int32 ip = 1; - int32 port = 2; -} - -message ConnectionResponse { - int32 uid = 1; - int32 code = 2; - int32 errorMsg = 3; -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/cross_branch.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/cross_branch.proto deleted file mode 100644 index b6fcb03c7d0..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/cross_branch.proto +++ /dev/null @@ -1,32 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message CrossBranch { - message Grandfather { - message LeftFather { - message LeftLeftSon { - int32 son_field = 1; - } - - message LeftRightSon { - int32 son_field = 1; - } - } - - message RightFather { - message RightLeftSon { - Grandfather.LeftFather.LeftLeftSon son_field = 1; - } - - message RightRightSon { - Grandfather.LeftFather.LeftRightSon son_field = 1; - } - - RightLeftSon rls = 1; - RightRightSon rrs = 2; - } - - RightFather rf = 1; - } -} \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/direction.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/direction.proto deleted file mode 100644 index 3aadd316156..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/direction.proto +++ /dev/null @@ -1,19 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message DirectionRequest { - enum Command { - stop = 0; - forward = 1; - backward = 2; - left = 3; - right = 4; - } - Command command = 1; -} - -message DirectionResponse { - int32 code = 1; - int32 errorMsg = 2; -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/extended_message.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/extended_message.proto deleted file mode 100644 index c9a6bc88b4a..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/extended_message.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message Extended { - repeated int64 arr = 1; - int64 long = 6; - bool flag = 5; - repeated int64 arr_longs = 2; - int32 int = 7; -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/location.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/location.proto deleted file mode 100644 index 1cddfcc4a71..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/location.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message LocationResponse { - - LocationData locationResponseData = 1; - int32 code = 2; - int32 errorMsg = 3; - - message LocationData { - int32 x = 1; - int32 y = 2; - int32 angle = 3; - } -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/multiple_messages.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/multiple_messages.proto deleted file mode 100644 index a4b24c97ed8..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/multiple_messages.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message FirstMessage { - int32 int_field = 1; -} - -message SecondMessage { - FirstMessage first_msg = 1; -} - -message ThirdMessage { - SecondMessage second_msg = 1; -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/repeated_varints.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/repeated_varints.proto deleted file mode 100644 index f5854c50857..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/repeated_varints.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message MessageRepeatedVarints { - repeated int32 int = 1; - repeated int64 long = 2; - repeated sint32 sint = 3; - repeated sint64 slong = 4; - repeated bool bl = 5; - repeated uint32 uint = 7; - repeated uint64 ulong = 8; -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/repeated_zigzag.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/repeated_zigzag.proto deleted file mode 100644 index 8cd34991d49..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/repeated_zigzag.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message MessageRepeatedZigZag { - repeated sint32 int = 1; - repeated sint64 long = 2; -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/tag_order.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/tag_order.proto deleted file mode 100644 index 469183718a7..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/tag_order.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message TagOrder { - int32 int = 3423; - repeated sint64 slong_array = 12321; - sint32 sint = 8; - - enum Enum { - first_val = 0; - second_val = 1; - } - - Enum enum_field = 938423; -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/tag_order_shuffled.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/tag_order_shuffled.proto deleted file mode 100644 index 1239b1ea126..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/tag_order_shuffled.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message TagOrderShuffled { - sint32 sint = 8; - Enum enum_field = 938423; - - repeated sint64 slong_array = 12321; - int32 int = 3423; - enum Enum { - first_val = 0; - second_val = 1; - } - -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/varints.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/varints.proto deleted file mode 100644 index 6f4626936a3..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/varints.proto +++ /dev/null @@ -1,21 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message MessageVarints { - int32 int = 1; - int64 long = 2; - sint32 sint = 3; - sint64 slong = 4; - bool bl = 5; - uint32 uint = 7; - uint64 ulong = 8; - - enum TestEnum { - firstVal = 0; - secondVal = 1; - thirdVal = 2; - } - - TestEnum enumField = 6; -} diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/zigzag.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/zigzag.proto deleted file mode 100644 index 38e6b7afc9c..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/zigzag.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -option java_package = "java_msg"; - -message MessageZigZag { - sint32 int = 1; - sint64 long = 2; -} diff --git a/proto/compiler/pre-build.sh b/proto/compiler/pre-build.sh deleted file mode 100755 index 02454c3b078..00000000000 --- a/proto/compiler/pre-build.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -lprotoc="/usr/local/lib/libprotoc.so" -lprotobuf="/usr/local/lib/libprotobuf.so" -srcdir='google_protobuf' -ok=1 -missing="" -red='\033[0;31m' -nc='\033[0m' - -if [ ! -e "$lprotoc" ]; then - ok=0 - missing="$missing $lprotoc" -fi - -if [ ! -e "$lprotobuf" ]; then - ok=0 - missing="$missing $lprotobuf" -fi - -if [ "$ok" == 1 ]; then - echo "Prerequisites met, you can build library now via Makefile" - exit 0 -fi - -echo "$missing, required for building, is not found" -echo "You have to build and install latest Protobuf version from https://github.com/google/protobuf" -echo "Do you want to do it automatically? [y/n]" -echo "(Caution: this will take decent amount of time and internet traffic)" -response="n" -read response -if [ $response = "n" ]; then - exit 1 -fi - -echo -e "${red}Creating directory for Protobuf sources${nc}" -mkdir $srcdir -if [ $? -ne 0 ]; then - echo -e "${red}Error creating directory protobuf_sources/ for cloning repository${nc}" - exit 1 -fi -cd $srcdir - -echo -e "${red}Cloning repository${nc}" -git clone https://github.com/google/protobuf -if [ $? -ne 0 ]; then - echo -e "${red}Error cloning https://github.com/google/protobuf${nc}" - exit 1 -fi - -cd protobuf - -echo -e "${red}Resolving prerequisites to build Google Protobuf${nc}" -sudo apt-get install autoconf automake libtool curl make g++ unzip -if [ $? -ne 0 ]; then - echo -e "${red}Error installing tools for building${nc}" - exit 1 -fi - -echo -e "${red}Generating Makefiles and etc.${nc}" -./autogen.sh -./configure -if [ $? -ne 0 ]; then - echo -e "${red}Error generating makefiles${nc}" - exit 1 -fi - -echo -e "${red}Building${nc}" -make -if [ $? -ne 0 ]; then - echo -e "${red}Error building protobuf via Make${nc}" - exit 1 -fi - -echo -e "${red}Installing${nc}" -sudo make install -if [ $? -ne 0 ]; then - echo -e "${red}Error installing protobuf${nc}" - exit 1 -fi - -echo -e "${red}Refreshing dynamic libraries bindings${nc}" -sudo ldconfig -if [ $? -ne 0 ]; then - echo -e "${red}Error refreshing dynamic libraries${nc}" - exit 1 -fi - -echo -e "${red}Installation finished succesfully. You can now build library using Makefile.${nc}" -exit 0 diff --git a/proto/compiler/runtime/build.gradle b/proto/compiler/runtime/build.gradle deleted file mode 100644 index 02ec943605d..00000000000 --- a/proto/compiler/runtime/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -group 'protokot-runtime' -version '1.0-SNAPSHOT' - -buildscript { - ext.kotlin_version = '1.0.3' - - repositories { - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.2" - } -} - -apply plugin: 'java' -apply plugin: 'kotlin' - -repositories { - mavenCentral() -} - -dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib:1.0.1" -} - -jar { - archiveName = "protokot-runtime.jar" - from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } -} \ No newline at end of file diff --git a/proto/compiler/runtime/src/main/kotlin/CodedInputStream.kt b/proto/compiler/runtime/src/main/kotlin/CodedInputStream.kt deleted file mode 100644 index bb5b6e47cae..00000000000 --- a/proto/compiler/runtime/src/main/kotlin/CodedInputStream.kt +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Created by Dmitry Savvinov on 7/6/16. - * - * Hides details of work with Protobuf encoding - * - * Note that CodedInputStream reads protobuf-defined types from stream (such as int32, sint32, etc), - * while CodedOutputStream has methods for writing Kotlin-types (such as Boolean, Int, Long, Short, etc) - * - */ - -// TODO: refactor correctness checks into readTag -class CodedInputStream(val buffer: ByteArray) { - val inputStream: KotlinInputStream - init { - inputStream = KotlinInputStream(buffer) - } - - fun mark() { - inputStream.mark() - } - - fun reset() { - inputStream.reset() - } - - fun readInt32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.VARINT, actualWireType) - return readInt32NoTag() - } - - // Note that unsigned integer types are stored as their signed counterparts with top bit - // simply stored in the sign bit - similar to Java's protobuf implementation. Hence, all - // methods reading unsigned ints simply redirect call to corresponding signed-reading method - fun readUInt32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readUInt32NoTag() - } - - fun readUInt32NoTag(): Int { - return readInt32NoTag() - } - - fun readInt64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readInt64NoTag() - } - - // See note on unsigned integers implementations above - fun readUInt64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readUInt64NoTag() - } - - fun readUInt64NoTag(): Long { - return readInt64NoTag() - } - - fun readBool(expectedFieldNumber: Int): Boolean { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readBoolNoTag() - } - - fun readBoolNoTag(): Boolean { - val readValue = readInt32NoTag() - val boolValue = when (readValue) { - 0 -> false - 1 -> true - else -> false - } - return boolValue - } - - // Reading enums is like reading one int32 number. Caller is responsible for converting this ordinal to enum-object - fun readEnum(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readEnumNoTag() - } - - fun readEnumNoTag(): Int { - return readUInt32NoTag() - } - - fun readSInt32(expectedFieldNumber: Int): Int { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readSInt32NoTag() - } - - fun readSInt32NoTag(): Int { - return readZigZag32NoTag() - } - - fun readSInt64(expectedFieldNumber: Int): Long { - val tag = readTag(expectedFieldNumber, WireType.VARINT) - return readSInt64NoTag() - } - - fun readSInt64NoTag(): Long { - return readZigZag64NoTag() - } - fun readBytes(expectedFieldNumber: Int): ByteArray { - val tag = readTag(expectedFieldNumber, WireType.LENGTH_DELIMITED) - return readBytesNoTag() - } - - fun readBytesNoTag(): ByteArray { - val length = readInt32NoTag() - return readRawBytes(length) - } - - /** ============ Utility methods ================== - * They are left non-private for cases when one wants to implement her/his own protocol format. - * Then she/he can re-use low-level methods for operating with raw values, that are not annotated with Protobuf tags. - */ - - fun checkFieldCorrectness( - expectedFieldNumber: Int, - actualFieldNumber: Int, - expectedWireType: WireType, - actualWireType: WireType) { - if (expectedFieldNumber != actualFieldNumber) { - return - } - - if (expectedWireType.id != actualWireType.id) { - return - } - } - - fun readRawBytes(count: Int): ByteArray { - val ba = ByteArray(count) - var i = 0 - while (i < count) { - ba[i] = inputStream.read().toByte() - i++ - } - return ba - } - - // reads tag. Note that it returns 0 for the end of message! - fun readTag(expectedFieldNumber: Int, expectedWireType: WireType): Int { - if (isAtEnd()) { - return 0 // we can safely return 0 as sign of end of message, because 0-tags are illegal - } - val tag = readInt32NoTag() - if (tag == 0) { // if we somehow had read 0-tag, then message is corrupted - return 0 - } - - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, expectedWireType, actualWireType) - return tag - } - - // reads varint not larger than 32-bit integer according to protobuf varint-encoding - fun readInt32NoTag(): Int { - var done: Boolean = false - var result: Long = 0 - var step: Int = 0 - while (!done) { - val byte: Int = inputStream.read().toInt() - result = result or - ( - (byte and WireFormat.VARINT_INFO_BITS_MASK).toLong() - shl - (WireFormat.VARINT_INFO_BITS_COUNT * step) - ).toLong() - step++ - if ((byte and WireFormat.VARINT_UTIL_BIT_MASK) == 0) { - done = true - } - } - return result.toInt() - } - - // reads varint not larger than 64-bit integer according to protobuf varint-encoding - fun readInt64NoTag(): Long { - var done: Boolean = false - var result: Long = 0 - var step: Int = 0 - while (!done) { - val byte: Int = inputStream.read().toInt() - result = result or - ( - (byte and WireFormat.VARINT_INFO_BITS_MASK).toLong() - shl - (WireFormat.VARINT_INFO_BITS_COUNT * step) - ) - step++ - if ((byte and WireFormat.VARINT_UTIL_BIT_MASK) == 0 /* || byte == -1 ???? */) { - done = true - } - } - return result - } - - // reads zig-zag encoded integer not larger than 32-bit long - fun readZigZag32NoTag(): Int { - val value = readInt32NoTag() - return (value ushr 1) xor (-(value and 1)) // bit magic for decoding zig-zag number - } - - // reads zig-zag encoded integer not larger than 64-bit long - fun readZigZag64NoTag(): Long { - val value = readInt64NoTag() - return (value ushr 1) xor (-(value and 1L)) // bit magic for decoding zig-zag number - } - - // checks if at least one more byte can be read from underlying input stream - fun isAtEnd(): Boolean { - return inputStream.isAtEnd() - } -} diff --git a/proto/compiler/runtime/src/main/kotlin/CodedOutputStream.kt b/proto/compiler/runtime/src/main/kotlin/CodedOutputStream.kt deleted file mode 100644 index 9c40747b99c..00000000000 --- a/proto/compiler/runtime/src/main/kotlin/CodedOutputStream.kt +++ /dev/null @@ -1,167 +0,0 @@ -/** - * Created by user on 7/6/16. - */ - -class CodedOutputStream(val buffer: ByteArray) { - val output = KotlinOutputStream(buffer) - - fun toByteArray(): ByteArray { - return buffer - } - - fun writeTag(fieldNumber: Int, type: WireType) { - val tag = (fieldNumber shl 3) or type.id - writeRawVarint32(tag) - } - - fun writeInt32(fieldNumber: Int, value: Int) { - writeTag(fieldNumber, WireType.VARINT) - writeInt32NoTag(value) - } - - fun writeInt32NoTag(value: Int) { - if (value < 0) { // sign-extend negative values - writeRawVarint64(value.toLong()) - return - } - writeRawVarint32(value) - } - - // Note that unsigned integer types are stored as their signed counterparts with top bit - // simply stored in the sign bit - similar to Java's protobuf implementation. Hence, all - // methods, writing unsigned ints simply redirect call to corresponding signed-writing method - fun writeUInt32(fieldNumber: Int, value: Int) { - writeTag(fieldNumber, WireType.VARINT) - writeUInt32NoTag(value) - } - - fun writeUInt32NoTag(value: Int) { - writeRawVarint32(value) - } - - fun writeInt64(fieldNumber: Int, value: Long) { - writeTag(fieldNumber, WireType.VARINT) - writeInt64NoTag(value) - } - - fun writeInt64NoTag(value: Long) { - writeRawVarint64(value) - } - - // See notes on unsigned integers implementation above - fun writeUInt64(fieldNumber: Int, value: Long) { - writeTag(fieldNumber, WireType.VARINT) - writeUInt64NoTag(value) - } - - fun writeUInt64NoTag(value: Long) { - writeRawVarint64(value) - } - - fun writeBool(fieldNumber: Int, value: Boolean) { - writeTag(fieldNumber, WireType.VARINT) - writeBoolNoTag(value) - } - - fun writeBoolNoTag(value: Boolean) { - writeRawVarint32(if (value) 1 else 0) - } - - // Writing enums is like writing one int32 number. Caller is responsible for converting enum-object to ordinal - fun writeEnum(fieldNumber: Int, value: Int) { - writeTag(fieldNumber, WireType.VARINT) - writeEnumNoTag(value) - } - - fun writeEnumNoTag(value: Int) { - writeRawVarint32(value) - } - - fun writeSInt32(fieldNumber: Int, value: Int) { - writeTag(fieldNumber, WireType.VARINT) - writeSInt32NoTag(value) - } - - fun writeSInt32NoTag(value: Int) { - writeUInt32NoTag((value shl 1) xor (value shr 31)) - } - - fun writeSInt64(fieldNumber: Int, value: Long) { - writeTag(fieldNumber, WireType.VARINT) - writeSInt64NoTag(value) - } - - fun writeSInt64NoTag(value: Long) { - writeUInt64NoTag((value shl 1) xor (value shr 63)) - } - - fun writeBytes(fieldNumber: Int, value: ByteArray) { - if (value.size == 0) { - return - } - writeTag(fieldNumber, WireType.LENGTH_DELIMITED) - writeBytesNoTag(value) - } - - fun writeBytesNoTag(value: ByteArray) { - writeRawVarint32(value.size) - output.write(value) - } - - /** ============ Utility methods ================== - * They are left non-private for cases when one wants to implement her/his own protocol format. - * Then she/he can re-use low-level methods for operating with raw values, that are not annotated with Protobuf tags. - */ - - fun writeRawVarint32(value: Int) { - var curValue: Int = value - - // we have at most 32 information bits. With overhead of 1 bit per 7 bits we need at most 5 bytes for encoding - val res = ByteArray(5) - - var resSize = 0 - do { - // encode current 7 bits - var curByte = (curValue and WireFormat.VARINT_INFO_BITS_MASK) - - // discard encoded bits. Note that unsigned shift is needed for cases with negative numbers - curValue = curValue ushr WireFormat.VARINT_INFO_BITS_COUNT - - // check if there will be next byte in encoding and set util bit if needed - if (curValue != 0) { - curByte = curByte or WireFormat.VARINT_UTIL_BIT_MASK - } - - res[resSize] = curByte.toByte() - resSize++ - } while (curValue != 0) - output.write(res, 0, resSize) - } - - fun writeRawVarint64(value: Long) { - var curValue: Long = value - - // we have at most 64 information bits. With overhead of 1 bit per 7 bits we need at most 10 bytes for encoding - val res = ByteArray(10) - - var resSize = 0 - do { - // encode current 7 bits - var curByte = (curValue and WireFormat.VARINT_INFO_BITS_MASK.toLong()) - - // discard encoded bits. Note that unsigned shift is needed for cases with negative numbers - curValue = curValue ushr WireFormat.VARINT_INFO_BITS_COUNT - - // check if there will be next byte and set util bit if needed - if (curValue != 0L) { - curByte = curByte or WireFormat.VARINT_UTIL_BIT_MASK.toLong() - } - - res[resSize] = curByte.toByte() - resSize++ - } while(curValue != 0L) - output.write(res, 0, resSize) - } - - -} diff --git a/proto/compiler/runtime/src/main/kotlin/KotlinInputStream.kt b/proto/compiler/runtime/src/main/kotlin/KotlinInputStream.kt deleted file mode 100644 index ee2c40aa387..00000000000 --- a/proto/compiler/runtime/src/main/kotlin/KotlinInputStream.kt +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Created by user on 8/8/16. - */ - -class KotlinInputStream(val buffer: ByteArray) { - var pos = 0 - var mark_ = 0 - - fun read(): Byte { - pos += 1 - return buffer[pos - 1] - } - - fun isAtEnd(): Boolean { - return pos >= buffer.size - } - - fun mark() { - mark_ = pos - } - - fun reset() { - pos = mark_ - } -} diff --git a/proto/compiler/runtime/src/main/kotlin/KotlinOutputStream.kt b/proto/compiler/runtime/src/main/kotlin/KotlinOutputStream.kt deleted file mode 100644 index 51f80aaf766..00000000000 --- a/proto/compiler/runtime/src/main/kotlin/KotlinOutputStream.kt +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Created by user on 8/8/16. - */ - -class KotlinOutputStream(val buffer: ByteArray) { - var pos = 0 - - fun write (data: ByteArray) { - write(data, 0, data.size) - } - - fun write (data: ByteArray, begin: Int, size: Int) { - var i = begin - while (i < begin + size) { - buffer[pos] = data[i] - pos += 1 - i++ - } - } -} diff --git a/proto/compiler/runtime/src/main/kotlin/WireFormat.kt b/proto/compiler/runtime/src/main/kotlin/WireFormat.kt deleted file mode 100644 index d43c6e37003..00000000000 --- a/proto/compiler/runtime/src/main/kotlin/WireFormat.kt +++ /dev/null @@ -1,164 +0,0 @@ - -object WireFormat { - // couple of constants for magic numbers - val TAG_TYPE_BITS: Int = 3 - val TAG_TYPE_MASK: Int = (1 shl TAG_TYPE_BITS) - 1 - val VARINT_INFO_BITS_COUNT: Int = 7 - val VARINT_INFO_BITS_MASK: Int = 0b01111111 // mask for separating lowest 7 bits, where actual information stored - val VARINT_UTIL_BIT_MASK: Int = 0b10000000 // mask for separating highest bit, that indicates next byte presence - val FIXED_32_BYTE_SIZE: Int = 4 - val FIXED_64_BYTE_SIZE: Int = 8 - - fun getTagWireType(tag: Int): WireType { - return WireType.from((tag and TAG_TYPE_MASK).toByte()) - } - - fun getTagFieldNumber(tag: Int): Int { - return tag ushr TAG_TYPE_BITS - } - - // TODO: refactor casts into function overloading as soon as translator will support it - fun getTagSize(fieldNumber: Int, wireType: WireType): Int { - return getVarint32Size((fieldNumber shl 3) or wireType.id) - } - - fun getVarint32Size(value: Int): Int { - var curValue = value - var size = 0 - do { - size += 1 - curValue = curValue ushr VARINT_INFO_BITS_COUNT - } while (curValue != 0) - return size - } - - fun getVarint64Size(value: Long): Int { - var curValue = value - var size = 0 - do { - size += 1 - curValue = curValue ushr VARINT_INFO_BITS_COUNT - }while (curValue != 0L) - return size - } - - fun getZigZag32Size(value: Int): Int { - return getVarint32Size((value shl 1) xor (value shr 31)) - } - - fun getZigZag64Size(value: Long): Int { - return getVarint64Size((value shl 1) xor (value shr 63)) - } - - fun getInt32Size(fieldNumber: Int, value: Int): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getInt32SizeNoTag(value) - } - - fun getInt32SizeNoTag(value: Int): Int { - if (value < 0) { - return getVarint64Size(value.toLong()) - } - return getVarint32Size(value) - } - - fun getUInt32Size(fieldNumber: Int, value: Int): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getUInt32SizeNoTag(value) - } - - fun getUInt32SizeNoTag(value: Int): Int { - return getVarint32Size(value) - } - - fun getInt64Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getUInt64SizeNoTag(value) - } - - fun getInt64SizeNoTag(value: Long): Int { - return getVarint64Size(value) - } - - fun getUInt64Size(fieldNumber: Int, value: Long): Int { - return getInt64Size(fieldNumber, value) - } - - fun getUInt64SizeNoTag(value: Long): Int { - return getVarint64Size(value) - } - - fun getBoolSize(fieldNumber: Int, value: Boolean): Int { - val intValue = if (value) 1 else 0 - return getInt32Size(fieldNumber, intValue) - } - - fun getBoolSizeNoTag(value: Boolean): Int { - val intValue = if (value) 1 else 0 - return getInt32SizeNoTag(intValue) - } - - fun getEnumSize(fieldNumber: Int, value: Int): Int { - return getInt32Size(fieldNumber, value) - } - - fun getEnumSizeNoTag(value: Int): Int { - return getInt32SizeNoTag(value) - } - - fun getSInt32Size(fieldNumber: Int, value: Int): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getZigZag32Size(value) - } - - fun getSInt32SizeNoTag(value: Int): Int { - return getZigZag32Size(value) - } - - fun getSInt64Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.VARINT) + getZigZag64Size(value) - } - - fun getSInt64SizeNoTag(value: Long): Int { - return getZigZag64Size(value) - } - - fun getFixed32Size(fieldNumber: Int, value: Int): Int { - return getTagSize(fieldNumber, WireType.FIX_32) + FIXED_32_BYTE_SIZE - } - - fun getFixed32SizeNoTag(value: Int): Int { - return FIXED_32_BYTE_SIZE - } - - fun getFixed64Size(fieldNumber: Int, value: Long): Int { - return getTagSize(fieldNumber, WireType.FIX_64) + FIXED_64_BYTE_SIZE - } - - fun getFixed64SizeNoTag(value: Long): Int { - return FIXED_64_BYTE_SIZE - } - - fun getDoubleSize(fieldNumber: Int, value: Double): Int { - return getTagSize(fieldNumber, WireType.FIX_64) + FIXED_64_BYTE_SIZE - } - - fun getDoubleSizeNoTag(value: Double): Int { - return FIXED_64_BYTE_SIZE - } - - fun getFloatSize(fieldNumber: Int, value: Float): Int { - return getTagSize(fieldNumber, WireType.FIX_32) + FIXED_32_BYTE_SIZE - } - - fun getFloatSizeNoTag(value: Float): Int { - return FIXED_32_BYTE_SIZE - } - - fun getBytesSize(fieldNumber: Int, value: ByteArray): Int { - if (value.size == 0) - return 0 - var size = 0 - return value.size + getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) + getVarint32Size(value.size) - } - - fun getBytesSizeNoTag(value: ByteArray): Int { - return value.size + getVarint32Size(value.size) - } -} diff --git a/proto/compiler/runtime/src/main/kotlin/WireType.kt b/proto/compiler/runtime/src/main/kotlin/WireType.kt deleted file mode 100644 index 4ffc150fa68..00000000000 --- a/proto/compiler/runtime/src/main/kotlin/WireType.kt +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Created by Dmitry Savvinov on 7/6/16. - * Enum for possible WireTypes. - * See details at [official Google reference](https://developers.google.com/protocol-buffers/docs/encoding#structure) - */ - -enum class WireType(val id: Int) { - VARINT(0), // int32, int64, uint32, uint64, sint32, sint64, bool, enum - FIX_64(1), // fixed64, sfixed64, double - LENGTH_DELIMITED(2), // string, bytes, embedded messages, packed repeated fields - START_GROUP(3), // groups (deprecated) - END_GROUP(4), // groups (deprecated) - FIX_32(5), // fixed32, sfixed32, float - UNDEFINED(6); // indicates error when parsing from Int - - companion object { - fun from (value: Byte): WireType { - return when (value) { - 0.toByte() -> VARINT - 1.toByte() -> FIX_64 - 2.toByte() -> LENGTH_DELIMITED - 3.toByte() -> START_GROUP - 4.toByte() -> END_GROUP - 5.toByte() -> FIX_32 - else -> UNDEFINED - } - } - } -} diff --git a/proto/protofiles_sources/compile_proto.sh b/proto/protofiles_sources/compile_proto.sh deleted file mode 100755 index d6fa2ceb41c..00000000000 --- a/proto/protofiles_sources/compile_proto.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -PROTOC="../compiler/build/protoc" -cd "$(dirname "${BASH_SOURCE}")" -mkdir out -p -${PROTOC} --kotlin_out="./out/" --proto_path="./server_car" ./server_car/*.proto -${PROTOC} --kotlin_out="./out/" --proto_path="./server_client" ./server_client/*.proto diff --git a/proto/protofiles_sources/server_car/carkot.proto b/proto/protofiles_sources/server_car/carkot.proto deleted file mode 100644 index 16a11b1485d..00000000000 --- a/proto/protofiles_sources/server_car/carkot.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; -package carkot; - -message Upload { - // Firmware data. - bytes data = 1; -} - -message UploadResult { - int32 resultCode = 3; -} - -message LogMessage { -// string source = 1; - bytes message = 2; -} diff --git a/proto/protofiles_sources/server_car/connect.proto b/proto/protofiles_sources/server_car/connect.proto deleted file mode 100644 index 20296059ba5..00000000000 --- a/proto/protofiles_sources/server_car/connect.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; -package carkot; - -message ConnectionRequest { - repeated int32 ipValues = 1; - int32 port = 2; -} - -message ConnectionResponse { - int32 uid = 1; - int32 code = 2; -} diff --git a/proto/protofiles_sources/server_car/debug.proto b/proto/protofiles_sources/server_car/debug.proto deleted file mode 100644 index 1b2aa564825..00000000000 --- a/proto/protofiles_sources/server_car/debug.proto +++ /dev/null @@ -1,25 +0,0 @@ -syntax = "proto3"; -package carkot; - -message DebugRequest { - Type type = 1; - - enum Type { - MEMORY_STATS = 0; - SONAR_STATS = 1; - } -} - -message DebugResponseMemoryStats { - int32 heapDynamicTail = 1; - int32 heapStaticTail = 2; - int32 heapDynamicMaxBytes = 3; - int32 heapDynamicTotalBytes = 4; -} - -message DebugResponseSonarStats { - int32 measurementCount = 1; - int32 measurementFailedChecksum = 2; - int32 measurementFailedDistance = 3; - int32 measurementFailedCommand = 4; -} diff --git a/proto/protofiles_sources/server_car/direction.proto b/proto/protofiles_sources/server_car/direction.proto deleted file mode 100644 index 0debe83e1e6..00000000000 --- a/proto/protofiles_sources/server_car/direction.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; -package carkot; - -message DirectionRequest { - enum Command { - STOP = 0; - FORWARD = 1; - BACKWARD = 2; - LEFT = 3; - RIGHT = 4; - } - Command command = 1; - int32 sid = 2; - bool stop = 3; -} \ No newline at end of file diff --git a/proto/protofiles_sources/server_car/location.proto b/proto/protofiles_sources/server_car/location.proto deleted file mode 100644 index 069d17f4838..00000000000 --- a/proto/protofiles_sources/server_car/location.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; -package carkot; - -message LocationResponse { - LocationData locationResponseData = 1; - int32 code = 2; - - message LocationData { - int32 x = 1; - int32 y = 2; - int32 angle = 3; - } -} diff --git a/proto/protofiles_sources/server_car/route.proto b/proto/protofiles_sources/server_car/route.proto deleted file mode 100644 index 5f3782f8cc9..00000000000 --- a/proto/protofiles_sources/server_car/route.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; -package carkot; - -message RouteRequest { - repeated int32 times = 1; - repeated int32 directions = 2; -} - -message RouteMetricRequest { - repeated int32 distances = 1; - repeated int32 directions = 2; -} - -message RouteResponse { - int32 code = 1; -} diff --git a/proto/protofiles_sources/server_car/route_done.proto b/proto/protofiles_sources/server_car/route_done.proto deleted file mode 100644 index efad77bb7be..00000000000 --- a/proto/protofiles_sources/server_car/route_done.proto +++ /dev/null @@ -1,10 +0,0 @@ -syntax = "proto3"; -package carkot; - -message RouteDoneRequest { - int32 uid = 1; -} - -message RouteDoneResponse { - int32 code = 1; -} diff --git a/proto/protofiles_sources/server_car/sonar.proto b/proto/protofiles_sources/server_car/sonar.proto deleted file mode 100644 index 47f5e59c8e0..00000000000 --- a/proto/protofiles_sources/server_car/sonar.proto +++ /dev/null @@ -1,27 +0,0 @@ -syntax = "proto3"; - -message SonarRequest { - repeated int32 angles = 1; - repeated int32 attempts = 2; - int32 windowSize = 3; - Smoothing smoothing = 4; - - enum Smoothing { - NONE = 0; - MEDIAN = 1; - MEAN = 2; - } -} - -message SonarResponse { - repeated int32 distances = 1; -} - -message SonarExploreAngleRequest { - int32 angle = 1; - int32 windowSize = 2; -} - -message SonarExploreAngleResponse { - repeated int32 distances = 1; -} diff --git a/proto/protofiles_sources/server_car/task.proto b/proto/protofiles_sources/server_car/task.proto deleted file mode 100644 index a96ab2347f5..00000000000 --- a/proto/protofiles_sources/server_car/task.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; -package carkot; - -message TaskRequest { - - Type type = 1; - - enum Type { - DEBUG = 0; - ROUTE = 1; - SONAR = 2; - ROUTE_METRIC = 3; - SONAR_EXPLORE = 4; - } -} diff --git a/proto/protofiles_sources/server_client/client_debug.proto b/proto/protofiles_sources/server_client/client_debug.proto deleted file mode 100644 index fa44401bde4..00000000000 --- a/proto/protofiles_sources/server_client/client_debug.proto +++ /dev/null @@ -1,19 +0,0 @@ -syntax = "proto3"; - -message DebugResponse { - - repeated int32 begin_x = 1 [packed = true]; - repeated int32 begin_y = 2 [packed = true]; - repeated int32 end_x = 3 [packed = true]; - repeated int32 end_y = 4 [packed = true]; - - int32 carX = 5; - int32 carY = 6; - int32 carAngle = 7; - - repeated int32 x = 8 [packed = true]; - repeated int32 y = 9 [packed = true]; - repeated int32 wall_distances = 10 [packed = true]; - -} - diff --git a/proto/protofiles_sources/server_client/direction.proto b/proto/protofiles_sources/server_client/direction.proto deleted file mode 100644 index 0debe83e1e6..00000000000 --- a/proto/protofiles_sources/server_client/direction.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; -package carkot; - -message DirectionRequest { - enum Command { - STOP = 0; - FORWARD = 1; - BACKWARD = 2; - LEFT = 3; - RIGHT = 4; - } - Command command = 1; - int32 sid = 2; - bool stop = 3; -} \ No newline at end of file diff --git a/proto/protofiles_sources/server_client/generic_response.proto b/proto/protofiles_sources/server_client/generic_response.proto deleted file mode 100644 index 803b82d619c..00000000000 --- a/proto/protofiles_sources/server_client/generic_response.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -message Result { - int32 error = 1; -} - -message GenericResponse { - Result result = 1; -} \ No newline at end of file diff --git a/proto/protofiles_sources/server_client/mode_change.proto b/proto/protofiles_sources/server_client/mode_change.proto deleted file mode 100644 index 6851284c06f..00000000000 --- a/proto/protofiles_sources/server_client/mode_change.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -message ModeChange { - enum Mode { - Idle = 0; - PerimeterBuilding = 1; - PerimeterDebug = 2; - ManualControl = 3; - } - - Mode newMode = 1; -} \ No newline at end of file diff --git a/proto/protofiles_sources/server_client/waypoints.proto b/proto/protofiles_sources/server_client/waypoints.proto deleted file mode 100644 index 3ebdb6eff6e..00000000000 --- a/proto/protofiles_sources/server_client/waypoints.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -message Waypoints { - repeated int32 begin_x = 1; - repeated int32 begin_y = 2; - repeated int32 end_x = 3; - repeated int32 end_y = 4; - bool stop = 5; -} \ No newline at end of file diff --git a/server/.gitignore b/server/.gitignore deleted file mode 100644 index 04581cd4b4b..00000000000 --- a/server/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.idea/workspace.xml -.gradle -build -out -*.log diff --git a/server/.idea/compiler.xml b/server/.idea/compiler.xml deleted file mode 100644 index 4dfdaaf6193..00000000000 --- a/server/.idea/compiler.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/server/.idea/copyright/profiles_settings.xml b/server/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3377d..00000000000 --- a/server/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/server/.idea/gradle.xml b/server/.idea/gradle.xml deleted file mode 100644 index a5c3ae14628..00000000000 --- a/server/.idea/gradle.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/server/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_3.xml b/server/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_3.xml deleted file mode 100644 index 0eb057374b0..00000000000 --- a/server/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_3.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/server/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_3.xml b/server/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_3.xml deleted file mode 100644 index ae3ca477567..00000000000 --- a/server/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_3.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/server/.idea/misc.xml b/server/.idea/misc.xml deleted file mode 100644 index b7544bd1ff4..00000000000 --- a/server/.idea/misc.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/server/.idea/modules.xml b/server/.idea/modules.xml deleted file mode 100644 index 7737f17b242..00000000000 --- a/server/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/server/.idea/modules/server.iml b/server/.idea/modules/server.iml deleted file mode 100644 index ae202140953..00000000000 --- a/server/.idea/modules/server.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/server/README.md b/server/README.md deleted file mode 100644 index a7f81bca8bf..00000000000 --- a/server/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Main server - -## Building - -move to this directory - - $ ./gradlew build - -This command build all project. Executable .jar file placed on ./build/libs - -## Run server - -for run server you can use script - - $ ./run.sh - -after start you will see available commands. You can input their from command line diff --git a/server/build.gradle b/server/build.gradle deleted file mode 100644 index 4caea80f077..00000000000 --- a/server/build.gradle +++ /dev/null @@ -1,60 +0,0 @@ -group 'server' -version '1.0' - -buildscript { - ext.kotlin_version = '1.0.3' - - repositories { - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -apply plugin: 'java' -apply plugin: 'kotlin' - -sourceCompatibility = 1.5 - -repositories { - mavenCentral() -} - -sourceSets { - main.kotlin.srcDirs += 'src/main/java' - main.kotlin.srcDirs += '../proto/protofiles_sources/out' -} - -task getDeps(type: Copy) { - from sourceSets.main.compileClasspath - into 'build/libs' -} -task compileProto() { - exec { - executable './../proto/protofiles_sources/compile_proto.sh' - } -} - -build.dependsOn getDeps -build.dependsOn compileProto - -jar { - manifest { - attributes("Implementation-Title": "Gradle", - "Implementation-Version": version, - "Main-Class": "ServerMainKt") - } - - from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } - -} - -dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" - compile group: 'org.asynchttpclient', name: 'async-http-client', version: '2.0.0-RC9' - compile group: "com.martiansoftware", name: "jsap", version: "2.1" - - compile files ("../proto/compiler/build/protokot-runtime.jar") -} diff --git a/server/gradle/wrapper/gradle-wrapper.jar b/server/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 941144813d241db74e1bf25b6804c679fbe7f0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53636 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 DXC5Z7 diff --git a/server/gradle/wrapper/gradle-wrapper.properties b/server/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9cb57388875..00000000000 --- a/server/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Tue Jul 26 11:24:10 MSK 2016 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-all.zip diff --git a/server/gradlew b/server/gradlew deleted file mode 100755 index 9d82f789151..00000000000 --- a/server/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# 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 -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# 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 - -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" ] ; 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 - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/server/gradlew.bat b/server/gradlew.bat deleted file mode 100644 index aec99730b4e..00000000000 --- a/server/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@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 - -@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= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@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 Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_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=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -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/server/room_config_example.xml b/server/room_config_example.xml deleted file mode 100644 index badaf03b020..00000000000 --- a/server/room_config_example.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/server/run.sh b/server/run.sh deleted file mode 100755 index 4e407b7c54a..00000000000 --- a/server/run.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -java -jar ./build/libs/server-1.0.jar $* diff --git a/server/settings.gradle b/server/settings.gradle deleted file mode 100644 index c9d3ca4d3b9..00000000000 --- a/server/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = 'server' - diff --git a/server/src/main/java/ClUtils.kt b/server/src/main/java/ClUtils.kt deleted file mode 100644 index e9c8bb583a7..00000000000 --- a/server/src/main/java/ClUtils.kt +++ /dev/null @@ -1,33 +0,0 @@ -import com.martiansoftware.jsap.FlaggedOption -import com.martiansoftware.jsap.JSAP -import com.martiansoftware.jsap.StringParser -import com.martiansoftware.jsap.Switch - -fun setClOptions(clParser: JSAP) { - val optEmulator = Switch("emulator", 'e', "emulator") - val optUseRandom = Switch("random", 'r', "random") - val optSeedForRandom = getOption("seed", JSAP.LONG_PARSER, "1111", 's', "seed") - val optTestRoom = getOption("test room", JSAP.STRING_PARSER, "", null, "room") - val optHelp = getOption("help", JSAP.BOOLEAN_PARSER, "false", null, "help") - - clParser.registerParameter(optEmulator) - clParser.registerParameter(optUseRandom) - clParser.registerParameter(optSeedForRandom) - clParser.registerParameter(optTestRoom) - clParser.registerParameter(optHelp) -} - -fun getOption(name: String, parser: StringParser, default: String, shortFlag: Char?, longFlag: String, required: Boolean = false): FlaggedOption { - val result = FlaggedOption(name) - .setStringParser(parser) - .setDefault(default) - .setRequired(required) - if (shortFlag != null) { - result.setShortFlag(shortFlag) - } - if (!longFlag.equals("")) { - result.setLongFlag(longFlag) - } - - return result -} diff --git a/server/src/main/java/Logger.kt b/server/src/main/java/Logger.kt deleted file mode 100644 index e524e2df200..00000000000 --- a/server/src/main/java/Logger.kt +++ /dev/null @@ -1,27 +0,0 @@ -import java.io.BufferedWriter -import java.io.File -import java.io.FileWriter - -object Logger { - val file = File("debug.log") - val fileWriter = FileWriter(file.absoluteFile) - val bufferedWriter = BufferedWriter(fileWriter) - var padding = "" - var paddingStep = " " - - fun indent() { - padding += paddingStep - } - - fun outDent() { - if (padding.length == 0) { - throw IllegalArgumentException("Called out dent without corresponding indent") - } - padding = padding.removeSuffix(paddingStep) - } - - fun log(msg: String) { - bufferedWriter.write(padding + msg + "\n") - bufferedWriter.flush() - } -} \ No newline at end of file diff --git a/server/src/main/java/ServerMain.kt b/server/src/main/java/ServerMain.kt deleted file mode 100644 index 0d18bfbfe76..00000000000 --- a/server/src/main/java/ServerMain.kt +++ /dev/null @@ -1,60 +0,0 @@ -import clInterface.DebugClInterface -import com.martiansoftware.jsap.JSAP -import net.car.Dropper -import net.car.client.Client -import objects.CarReal -import objects.Environment -import objects.emulator.CarEmulator -import objects.emulator.EmulatedRoom -import objects.emulator.Rng -import roomScanner.CarController -import roomScanner.RoomScanner - -fun main(args: Array) { - - val clParser = JSAP() - setClOptions(clParser) - val argsConfig = clParser.parse(args) - if (!argsConfig.success() || argsConfig.getBoolean("help")) { - println(clParser.getHelp()) - return - } - if (argsConfig.getBoolean("emulator")) { - val pathToRoomConfig = argsConfig.getString("test room") - val randomSeed = argsConfig.getLong("seed") - val useRandom = argsConfig.getBoolean("random") - val carUid = 1 - val emulatedRoom = EmulatedRoom.EmulatedRoomFromFile(pathToRoomConfig) - if (emulatedRoom == null) { - println("error parsin room from file $pathToRoomConfig") - return - } - Environment.map.put(carUid, CarEmulator(carUid, emulatedRoom, useRandom, Rng(randomSeed))) - } - var roomScanner: RoomScanner? = null - val carServer = net.car.server.Server.createCarServerThread() - val webServer = net.web.server.Server.createWebServerThread() - val carsDestroy = Dropper.createCarsDestroyThread() - carServer.start() - carsDestroy.start() - webServer.start() - - if (args.contains("--scan")) { - Environment.onCarConnect { car -> - if (car is CarReal) { - roomScanner = RoomScanner(CarController(car)) - roomScanner!!.start() - } - } - } - - DebugClInterface.run() - - carsDestroy.interrupt() - carServer.interrupt() - webServer.interrupt() - Client.shutDownClient() - - roomScanner?.interrupt() - -} diff --git a/server/src/main/java/algorithm/AbstractAlgorithm.kt b/server/src/main/java/algorithm/AbstractAlgorithm.kt deleted file mode 100644 index 616f728b429..00000000000 --- a/server/src/main/java/algorithm/AbstractAlgorithm.kt +++ /dev/null @@ -1,176 +0,0 @@ -package algorithm - -import CodedInputStream -import Logger -import SonarRequest -import SonarResponse -import algorithm.geometry.Angle -import algorithm.geometry.AngleData -import objects.Car -import objects.CarReal -import roomScanner.CarController.Direction.* -import java.util.* -import java.util.concurrent.TimeUnit -import java.util.concurrent.TimeoutException - -abstract class AbstractAlgorithm(val thisCar: Car) { - - open val ATTEMPTS = 1 - open val SMOOTHING = SonarRequest.Smoothing.NONE - open val WINDOW_SIZE = 0 - - private val historySize = 10 - private val history = Stack() - - private var prevState: CarState? = null - private var prevSonarDistances = mapOf() - private val defaultAngles = arrayOf(Angle(0), Angle(70), Angle(75), Angle(80), Angle(85), Angle(90), Angle(95), Angle(100), Angle(105), Angle(110), Angle(180)) - - protected var requiredAngles = defaultAngles - - protected enum class CarState { - WALL, - INNER, - OUTER - - } - - private var iterationCounter = 0 - - fun iterate() { - Logger.log("============= STARTING ITERATION $iterationCounter ============") - Logger.indent() - iterationCounter++ - if (RoomModel.finished) { - return - } - val angles = getAngles() - val future = thisCar.scan(angles.map { it.degs() }.toIntArray(), ATTEMPTS, WINDOW_SIZE, SMOOTHING) - val bytes: ByteArray - try { - bytes = future.get(300, TimeUnit.SECONDS).responseBodyAsBytes - } catch (e: TimeoutException) { - println("time out") - return - } - val sonarResponse = SonarResponse.BuilderSonarResponse(IntArray(0)).build() - sonarResponse.mergeFrom(CodedInputStream(bytes)) - val distances = sonarResponse.distances - - if (distances.size != angles.size) { - throw RuntimeException("error! angles and distances have various sizes") - } - val anglesDistances = mutableMapOf() - for (i in 0..angles.size - 1) { - anglesDistances.put(angles[i], AngleData(angles[i], distances[i])) - } - - this.requiredAngles = defaultAngles - - val state = getCarState(anglesDistances) - - if (state == null) { - addCancelIterationToLog() - return - } - val command = getCommand(anglesDistances, state) - if (command == null) { - addCancelIterationToLog() - return - } - - addToHistory(command) - - afterGetCommand(command) - Logger.log("Sending command:") - Logger.indent() - Logger.log("Directions = ${Arrays.toString(command.directions)}") - Logger.log("Distanced = ${Arrays.toString(command.distances)}") - Logger.outDent() - println(Arrays.toString(command.directions)) - println(Arrays.toString(command.distances)) - - this.prevSonarDistances = anglesDistances - this.prevState = state - - command.distances.forEachIndexed { idx, distance -> - thisCar.moveCar(distance, command.directions[idx]).get() - } - - Logger.outDent() - Logger.log("============= FINISHING ITERATION $iterationCounter ============") - Logger.log("") - } - - private fun addCancelIterationToLog() { - Logger.log("iteration cancelled. need more data from sonar") - Logger.outDent() - Logger.log("============= FINISHING ITERATION $iterationCounter ============") - Logger.log("") - } - - - private fun getAngles(): Array { - return requiredAngles - } - - private fun addToHistory(command: RouteData) { - history.push(command) - while (history.size > historySize) { - history.removeAt(0) - } - } - - private fun popFromHistory(): RouteData { - return history.pop() - } - - private fun inverseCommand(command: RouteData): RouteData { - val res = RouteData(command.distances, command.directions) - res.distances.reverse() - res.directions.reverse() - - for ((index, dir) in res.directions.withIndex()) { - res.directions[index] = when (dir) { - FORWARD -> BACKWARD - BACKWARD -> FORWARD - LEFT -> RIGHT - RIGHT -> LEFT - else -> throw IllegalArgumentException("Unexpected direction = $dir found during command inversion") - } - } - return res - } - - protected fun rollback() { - val lastCommand = popFromHistory() - val invertedCommand = inverseCommand(lastCommand) - Logger.log("Rollback:") - Logger.indent() - Logger.log("Last command: ${lastCommand.toString()}") - Logger.log("Inverted cmd: ${invertedCommand.toString()}") - Logger.outDent() - invertedCommand.distances.forEachIndexed { idx, distance -> - thisCar.moveCar(distance, invertedCommand.directions[idx]).get() - } - } - - protected fun rollback(steps: Int) { - Logger.log("=== Starting rollback for $steps steps ===") - Logger.indent() - var stepsRemaining = steps - while (stepsRemaining > 0 && history.size > 0) { - Logger.log("Step: ${steps - stepsRemaining + 1}") - rollback() - stepsRemaining-- - } - Logger.outDent() - Logger.log("=== Finished rollback ===") - } - - protected abstract fun getCarState(anglesDistances: Map): CarState? - protected abstract fun getCommand(anglesDistances: Map, state: CarState): RouteData? - protected abstract fun afterGetCommand(route: RouteData) - abstract fun isCompleted(): Boolean - -} \ No newline at end of file diff --git a/server/src/main/java/algorithm/AlgorithmThread.kt b/server/src/main/java/algorithm/AlgorithmThread.kt deleted file mode 100644 index 4433a35a268..00000000000 --- a/server/src/main/java/algorithm/AlgorithmThread.kt +++ /dev/null @@ -1,29 +0,0 @@ -package algorithm - -class AlgorithmThread() : Thread() { - - var algorithmImpl: AbstractAlgorithm? = null - private var count = 0 - - override fun run() { - val currentAlgorithm = algorithmImpl ?: return - while (!currentAlgorithm.isCompleted()) { - try { - if (count > 0) { - currentAlgorithm.iterate() - count-- - } else { - Thread.sleep(1000) - } - } catch (e: InterruptedException) { - println("algorithm thread is interrupted") - break - } - } - println("algorithm is completed") - } - - fun setCount(count: Int) { - this.count = count - } -} diff --git a/server/src/main/java/algorithm/PrettyPrinting.kt b/server/src/main/java/algorithm/PrettyPrinting.kt deleted file mode 100644 index cf8850da177..00000000000 --- a/server/src/main/java/algorithm/PrettyPrinting.kt +++ /dev/null @@ -1,25 +0,0 @@ -package algorithm - -import RouteMetricRequest - -fun fromIntToDirection(value: Int): String { - return when (value) { - 0 -> "FORWARD" - 1 -> "BACKWARD" - 2 -> "LEFT" - 3 -> "RIGHT" - else -> throw IllegalArgumentException("Error parsing Direction from Int: got value = $value") - } -} - -fun RouteMetricRequest.toString(): String { - var res = emptyArray() - - for (i in distances.indices) { - val dist = distances[i].toString() - val dir = fromIntToDirection(directions[i]) - res += "(" + dist + ", " + dir + ")" - } - - return res.joinToString("; ") -} \ No newline at end of file diff --git a/server/src/main/java/algorithm/RoomBypassingAlgorithm.kt b/server/src/main/java/algorithm/RoomBypassingAlgorithm.kt deleted file mode 100644 index aea042f5793..00000000000 --- a/server/src/main/java/algorithm/RoomBypassingAlgorithm.kt +++ /dev/null @@ -1,305 +0,0 @@ -package algorithm - -import Logger -import Logger.log -import SonarRequest -import algorithm.geometry.* -import objects.Car -import roomScanner.CarController.Direction.* - -class RoomBypassingAlgorithm(thisCar: Car) : AbstractAlgorithm(thisCar) { - - override val ATTEMPTS: Int = 5 - override val SMOOTHING = SonarRequest.Smoothing.MEDIAN - override val WINDOW_SIZE = 3 - - private val MAX_DISTANCE_TO_WALL_AHEAD = 55 // reached the corner and should turn left - private val OUTER_CORNER_DISTANCE_THRESHOLD = 90 // reached outer corner - private val ISOSCALENESS_MIN_DIFF = 5 // have to correct alignment to the wall - private val ISOSCALENESS_MAX_DIFF = 50 // almost reached outer corner but not yet, and 120 meas. founds far wall - private val DISTANCE_TO_WALL_UPPER_BOUND = 60 // have to move closer to the parallel wall - private val DISTANCE_TO_WALL_LOWER_BOUND = 40 // have to move farther to the parallel wall - private val ECHO_REFLECTION_DIFF = 70 // we're approaching corner and get spurious reflection from two walls on 60 meas. ! Should be before outer corner case ! - private val RANGE_FROM_ZERO_POINT_TO_FINISH_ALG = 50 - - private var calibrateAfterRotate = false - - private var isCompleted = false - private var circleFound = false - - override fun getCarState(anglesDistances: Map): CarState? { - return CarState.WALL - } - - private fun noOrthogonalMeasurementFound(anglesDistances: Map, state: CarState): RouteData { - val wallAngle = calculateAngle(anglesDistances, state) - Logger.indent() - thisCar.angle = (RoomModel.walls.last().wallAngleOX.degs() - wallAngle.degs()).toDouble() - addWall(-wallAngle) - Logger.outDent() - calibrateAfterRotate = true - return RouteData( - getIntArray(20, wallAngle.degs(), 75), - arrayOf(FORWARD, RIGHT, FORWARD)) - } - - private fun wallAheadFound(anglesDistances: Map, state: CarState): RouteData { - val wallAngle = calculateAngle(anglesDistances, state) - thisCar.angle = (RoomModel.walls.last().wallAngleOX.degs() + wallAngle.degs()).toDouble() - addWall(wallAngle) - calibrateAfterRotate = true - return RouteData(getIntArray(wallAngle.degs(), 15), arrayOf(LEFT, FORWARD)) - } - - private fun tryAlignParallelToWall(anglesDistances: Map, state: CarState, average: Double): RouteData? { - for (i in 0..15 step 5) { - val distRightForward = anglesDistances[Angle(70 + i)]!! - val distRightBackward = anglesDistances[Angle(110 - i)]!! - if (distRightBackward.distance == -1 || distRightForward.distance == -1) { - log("Found -1 in angle distances, passing") - continue - } - if (distRightBackward.distance > (average * 1.5) || distRightForward.distance > (average * 1.5) || - distRightBackward.distance < (average / 2) || distRightForward.distance < (average / 2)) { - continue - } - if (Math.abs(distRightForward.distance - distRightBackward.distance) <= ISOSCALENESS_MIN_DIFF) { - return null - } - log("Flaw in align found, correcting") - val rotationDirection = if (distRightBackward.distance > distRightForward.distance) LEFT else RIGHT - return RouteData( - getIntArray(Math.min(Math.abs(distRightBackward.distance - distRightForward.distance), 20)), - arrayOf(rotationDirection)) - } - - return null // TODO: everything is broken, what to do? - } - - private fun correctDistanceToParallelWall(anglesDistances: Map, state: CarState): RouteData { - val distToWall = anglesDistances[Angle(90)]!!.distance - val rotationDirection = if (distToWall > DISTANCE_TO_WALL_UPPER_BOUND) RIGHT else LEFT - val backRotationDirection = if (rotationDirection == RIGHT) LEFT else RIGHT - val rangeToCorridor = if (distToWall > DISTANCE_TO_WALL_UPPER_BOUND) { - distToWall - DISTANCE_TO_WALL_UPPER_BOUND - } else { - DISTANCE_TO_WALL_LOWER_BOUND - distToWall - } - return RouteData(getIntArray(2 * rangeToCorridor + 5, 20, (1.5 * rangeToCorridor).toInt()), - arrayOf(rotationDirection, FORWARD, backRotationDirection)) - } - - private fun moveForward(distToWall: Int): RouteData { - return RouteData(getIntArray(Math.max(distToWall / 4, 20)), arrayOf(FORWARD)) - } - - private fun addWall(angleWithPrevWall: Angle) { - log("Adding wall") - Logger.indent() - updateWalls() - Logger.outDent() - val firstWall = RoomModel.walls.first() - val lastWall = RoomModel.walls.last() - if (circleFound) { - log("Found circle, finishing algorithm") - isCompleted = true - RoomModel.finished = true - val intersectionPoint = firstWall.rawPoints.last() - intersectionPoint.y = lastWall.rawPoints.first().y - lastWall.pushBackPoint(intersectionPoint) - lastWall.markAsFinished() - RoomModel.walls.removeAt(0) - } else { - RoomModel.walls.add(Wall(lastWall.wallAngleOX + angleWithPrevWall)) - } - } - - private fun updateWalls() { - synchronized(RoomModel) { - val walls = RoomModel.walls - if (walls.size < 2) { - // no walls to intersect - return - } - val line1 = walls.last().line - val line2 = walls[RoomModel.walls.size - 2].line - - val intersection: Point = line1.intersect(line2) - - - val lastWall = walls[RoomModel.walls.size - 1] - lastWall.pushFrontPoint(intersection) - if (lastWall.isHorizontal()) { - lastWall.line = Line(0.0, 1.0, -intersection.y) - } else if (lastWall.isVertical()) { - lastWall.line = Line(1.0, 0.0, -intersection.x) - } - - walls[walls.size - 2].pushBackPoint(intersection) - walls[walls.size - 2].markAsFinished() - } - } - - override fun getCommand(anglesDistances: Map, state: CarState): RouteData? { - val dist0 = anglesDistances[Angle(0)]!! - val dist70 = anglesDistances[Angle(70)]!! - val dist80 = anglesDistances[Angle(80)]!! - val dist90 = anglesDistances[Angle(90)]!! - val dist100 = anglesDistances[Angle(100)]!! - val sonarAngle = (thisCar.angle - 90).toInt() - - if (anglesDistances.filter { - it.value.angle.degs() >= 60 - && it.value.angle.degs() <= 120 - && it.value.distance == -1 - }.size > anglesDistances.size / 2) { - log("Found to many -1 in angle distances, falling back") - rollback() - //todo ТеоретичеÑки Ñ‚Ð°ÐºÐ°Ñ ÑÐ¸Ñ‚ÑƒÐ°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть валидной, еÑли Ñразу поÑле внутреннего угла идёт внешний - return null - } - - val average = (anglesDistances.values - .filter { it.angle.degs() >= 60 && it.angle.degs() <= 120 } - .filter { it.distance != -1 } - .sumByDouble { it.distance.toDouble() }) / anglesDistances.values.size - log("Estimated average = $average") - - log("1. Checking if we just rotated and should re-calibrate") - if (calibrateAfterRotate) { - log("Calibrating after rotate") - Logger.indent() - val maybeAlignment = tryAlignParallelToWall(anglesDistances, state, average) - Logger.outDent() - if (maybeAlignment != null) { - log("Realigning") - return maybeAlignment - } - log("No need to realign") - calibrateAfterRotate = false - } - log("") - - // Check most basic measurements: 60/90/120 - log("2. Check if we have measurement on 90") - if (dist90.distance == -1 || dist90.distance > OUTER_CORNER_DISTANCE_THRESHOLD) { - log("No orthogonal measurement found") - return noOrthogonalMeasurementFound(anglesDistances, state) - } - log("") - - // Add point to room map - val point = Point( - x = thisCar.x + dist90.distance * Math.cos(Angle(sonarAngle).rads()), - y = thisCar.y + dist90.distance * Math.sin(Angle(sonarAngle).rads()) - ) - log("Adding middle point ${point.toString()} to wall ${RoomModel.walls.last()}") - RoomModel.walls.last().pushBackPoint(point) - log("") - - // Check if corner reached - log("3. Check if we reached corner, dist0 = ${dist0.distance}") - if (dist0.distance != -1 && dist0.distance < MAX_DISTANCE_TO_WALL_AHEAD) { - log("Wall ahead found") - return wallAheadFound(anglesDistances, state) - } - log("") - - log("Adding other points") - for (i in 70..110 step 10) { - if (i == 90) { - continue // point on 90 was already added - } - - val curDist = anglesDistances[Angle(i)]!!.distance - if (curDist > (average * 1.5) || curDist < (average / 2)) { - log("For point on ${i} dist = ${curDist}, while window is from ${average * 1.5} till ${average * 2}. Dropping it as outlier") - continue - } - val point = Point( - x = thisCar.x + curDist * Math.cos(Angle((thisCar.angle - i).toInt()).rads()), - y = thisCar.y + curDist * Math.sin(Angle((thisCar.angle - i).toInt()).rads()) - ) - log("Adding ${point.toString()} to wall ${RoomModel.walls.last()}") - RoomModel.walls.last().pushBackPoint(point) - } - log("") - - // Try align parallel to wall - log("4. Check if we have to align parallel to the wall") - Logger.indent() - val maybeAlignment = tryAlignParallelToWall(anglesDistances, state, average) - Logger.outDent() - if (maybeAlignment != null) { - log("Realigning") - return maybeAlignment - } - log("") - - // Check if wall is too close or too far - log("5. Check if we have to move closer or farther to the wall") - if (dist90.distance > DISTANCE_TO_WALL_UPPER_BOUND || dist90.distance < DISTANCE_TO_WALL_LOWER_BOUND) { - log("Flaw in distance to the parallel wall found, correcting") - return correctDistanceToParallelWall(anglesDistances, state) - } - log("") - - // Approaching inner corner and getting spurious reflection from 2 walls on 60; - // Just move forward to get closer to the corner; - log("6. Check if we are detecting echo reflections approaching inner corner") - if (dist70.distance - dist0.distance > ECHO_REFLECTION_DIFF) { - log("Echo reflection detected, moving forward") - return moveForward(dist0.distance) - } - log("") - - // Approaching outer corner (parallel wall is ending soon, but not yet); - // Just move forward to get to the end of the wall - log("7. Check if we are detecting far wall approaching outer corner") - if (dist80.distance == -1 || Math.abs(dist100.distance - dist80.distance) > ISOSCALENESS_MAX_DIFF) { - log("Approaching outer corner, moving forward") - return moveForward(dist0.distance) - } - log("") - - // default case: everything is ok, just move forward - log("8. Default case: moving forward") - return moveForward(dist0.distance) - } - - private fun calculateAngle(anglesDistances: Map, state: CarState): Angle { - // TODO: stub here, make proper angle calculation - return Angle(90) - } - - private fun getIntArray(vararg args: Int): IntArray { - return args - } - - override fun isCompleted(): Boolean { - return isCompleted - } - - override fun afterGetCommand(route: RouteData) { - val carAngle = thisCar.angle.toInt() - route.distances.forEachIndexed { idx, value -> - when (route.directions[idx]) { - FORWARD -> { - thisCar.x += (Math.cos(Angle(carAngle).rads()) * route.distances[idx]).toInt() - thisCar.y += (Math.sin(Angle(carAngle).rads()) * route.distances[idx]).toInt() - } - BACKWARD -> { - thisCar.x -= (Math.cos(Angle(carAngle).rads()) * route.distances[idx]).toInt() - thisCar.y -= (Math.sin(Angle(carAngle).rads()) * route.distances[idx]).toInt() - } - else -> { - } - } - } - if (Math.round(Math.cos(Angle(thisCar.angle.toInt()).rads())).toInt() == 1 && thisCar.angle.toInt() != 0 - && Vector(thisCar.x.toDouble(), thisCar.y.toDouble()).length() < RANGE_FROM_ZERO_POINT_TO_FINISH_ALG) { - log("Found circle!") - circleFound = true - } - } -} \ No newline at end of file diff --git a/server/src/main/java/algorithm/RoomModel.kt b/server/src/main/java/algorithm/RoomModel.kt deleted file mode 100644 index d5a7a893ac0..00000000000 --- a/server/src/main/java/algorithm/RoomModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package algorithm - -import algorithm.geometry.Angle -import algorithm.geometry.Wall - -object RoomModel { - val walls = arrayListOf(Wall(Angle(0))) - var finished = false -} \ No newline at end of file diff --git a/server/src/main/java/algorithm/RouteData.kt b/server/src/main/java/algorithm/RouteData.kt deleted file mode 100644 index 8f3a058ca6c..00000000000 --- a/server/src/main/java/algorithm/RouteData.kt +++ /dev/null @@ -1,7 +0,0 @@ -package algorithm - -import roomScanner.CarController - -data class RouteData (val distances:IntArray, val directions:Array){ - -} \ No newline at end of file diff --git a/server/src/main/java/algorithm/geometry/Angle.kt b/server/src/main/java/algorithm/geometry/Angle.kt deleted file mode 100644 index 72083c1862e..00000000000 --- a/server/src/main/java/algorithm/geometry/Angle.kt +++ /dev/null @@ -1,26 +0,0 @@ -package algorithm.geometry - -data class Angle(private val degrees: Int) { - - constructor(radians: Double) : this((180.0 * radians / Math.PI).toInt()) - - fun rads(): Double { - return Math.PI * degrees / 180.0 - } - - fun degs(): Int { - return degrees - } - - operator fun minus(other: Angle): Angle { - return Angle(degrees - other.degrees) - } - - operator fun unaryMinus(): Angle { - return Angle(-degrees) - } - - operator fun plus(other: Angle): Angle { - return Angle(degrees + other.degrees) - } -} \ No newline at end of file diff --git a/server/src/main/java/algorithm/geometry/AngleData.kt b/server/src/main/java/algorithm/geometry/AngleData.kt deleted file mode 100644 index c640a243877..00000000000 --- a/server/src/main/java/algorithm/geometry/AngleData.kt +++ /dev/null @@ -1,18 +0,0 @@ -package algorithm.geometry - - -class AngleData(val angle: Angle, val distance: Int) { - - fun toPoint(carAngleOX: Angle): Point { - - //convert to global coordinate system - val angle = carAngleOX - angle - val radianAngle = angle.rads() - - return Point( - x = Math.cos(radianAngle) * distance, - y = Math.sin(radianAngle) * distance - ) - } - -} \ No newline at end of file diff --git a/server/src/main/java/algorithm/geometry/DoubleComparison.kt b/server/src/main/java/algorithm/geometry/DoubleComparison.kt deleted file mode 100644 index d0194139ade..00000000000 --- a/server/src/main/java/algorithm/geometry/DoubleComparison.kt +++ /dev/null @@ -1,15 +0,0 @@ -package algorithm.geometry - -private val eps = 0.1 - -fun Double.lt(other: Double): Boolean { - return this - other < -eps -} - -fun Double.gt(other: Double): Boolean { - return this - other > eps -} - -fun Double.eq(other: Double): Boolean { - return Math.abs(this - other) < eps -} \ No newline at end of file diff --git a/server/src/main/java/algorithm/geometry/Line.kt b/server/src/main/java/algorithm/geometry/Line.kt deleted file mode 100644 index 17656e0afc5..00000000000 --- a/server/src/main/java/algorithm/geometry/Line.kt +++ /dev/null @@ -1,48 +0,0 @@ -package algorithm.geometry - -class Line(var A: Double, var B: Double, var C: Double) { - - init { - normalize() - } - - fun intersect(lineTwo: Line): Point { - val slope = this.A * lineTwo.B - this.B * lineTwo.A - if (Math.abs(slope) < 0.001) { - throw ArithmeticException("lines is parallel") - } - val xIntersection = (this.B * lineTwo.C - lineTwo.B * this.C) / slope - val yIntersection = (this.C * lineTwo.A - lineTwo.C * this.A) / slope - return Point(xIntersection, yIntersection) - } - - override fun toString(): String { - return "Line(A=$A, B=$B, C=$C)" - } - - fun normalize() { - val div = Math.sqrt(A * A + B * B) - A /= div - B /= div - C /= div - - if (A.eq(0.0)) { - if (B.lt(0.0)) { - A *= -1 - B *= -1 - C *= -1 - } - } else { - if (A.lt(0.0)) { - A *= -1 - B *= -1 - C *= -1 - } - } - } - - fun getDirectionVector(): Vector { - return Vector(A, -B) - } - -} \ No newline at end of file diff --git a/server/src/main/java/algorithm/geometry/Point.kt b/server/src/main/java/algorithm/geometry/Point.kt deleted file mode 100644 index 24181e9de37..00000000000 --- a/server/src/main/java/algorithm/geometry/Point.kt +++ /dev/null @@ -1,7 +0,0 @@ -package algorithm.geometry - -data class Point(var x: Double, var y: Double) { - operator fun plus(other: Vector): Point { - return Point(x + other.x, y + other.y) - } -} \ No newline at end of file diff --git a/server/src/main/java/algorithm/geometry/Vector.kt b/server/src/main/java/algorithm/geometry/Vector.kt deleted file mode 100644 index 62510b9a9c5..00000000000 --- a/server/src/main/java/algorithm/geometry/Vector.kt +++ /dev/null @@ -1,34 +0,0 @@ -package algorithm.geometry - -class Vector constructor(var x: Double, var y: Double) { - - constructor(x1: Double, y1: Double, x2: Double, y2: Double) : this(x2 - x1, y2 - y1) - - constructor(begin: Point, end: Point) : this(begin.x, begin.y, end.x, end.y) - - fun scalarProduct(vector: Vector): Double { - return this.x * vector.x + this.y * vector.y - } - - fun length(): Double { - return Math.sqrt(x * x + y * y) - } - - fun angleTo(other: Vector): Angle { - val sp = scalarProduct(other) - val cosinus = sp / length() / other.length() - return Angle(Math.acos(cosinus)) - } - - fun inverse() { - x *= -1 - y *= -1 - } - - fun normalize() { - val div = Math.sqrt(x * x + y * y) - - x /= div - y /= div - } -} diff --git a/server/src/main/java/algorithm/geometry/Wall.kt b/server/src/main/java/algorithm/geometry/Wall.kt deleted file mode 100644 index d77b3069cf8..00000000000 --- a/server/src/main/java/algorithm/geometry/Wall.kt +++ /dev/null @@ -1,112 +0,0 @@ -package algorithm.geometry - -import Logger -import java.util.* - -data class Wall(val wallAngleOX: Angle, - val rawPoints: ArrayList = arrayListOf(), - var line: Line = Line(0.0, 0.0, 0.0) -) { - val id: Int - - companion object { - var idCounter = 0 - } - - init { - id = idCounter - idCounter++ - } - - var isFinished = false - private val MAX_SLOPE = 0.2 - - fun pushBackPoint(point: Point) { - Logger.log("Adding ${point.toString()}") - rawPoints.add(point) - Logger.log("Line before approximation ${line.toString()}") - line = approximatePointsByLine() - Logger.log("Line after approximation ${line.toString()}") - } - - fun pushFrontPoint(point: Point) { - Logger.log("Adding ${point.toString()}") - rawPoints.add(0, point) - Logger.log("Line before approximation ${line.toString()}") - line = approximatePointsByLine() - Logger.log("Line after approximation ${line.toString()}") - } - - var points: ArrayList = arrayListOf() - - fun markAsFinished() { - Logger.log("Marking wall with id = ${this.id} as finished") - isFinished = true - points = generatePoints() - } - - private fun generatePoints(): ArrayList { - val direction = Vector(rawPoints.first(), rawPoints.last()) - val res: ArrayList = arrayListOf() - - val pointsCount = direction.length().toInt() - - direction.normalize() - - var curPoint = rawPoints.first() - res.add(curPoint) - val endPoint = rawPoints.last() - for (i in 0..pointsCount - 1) { - curPoint += direction - res.add(curPoint) - } - res.add(endPoint) - - return res - } - - private fun approximatePointsByLine(): Line { - var n = 0 - - var sumX = 0.0 - var sumY = 0.0 - var sumX2 = 0.0 - for ((x2, y2) in rawPoints) { - sumX += x2 - sumX2 += x2 * x2 - sumY += y2 - n++ - } - val xBar = sumX / n - val yBar = sumY / n - - // second pass: compute summary statistics - var xxbar = 0.0 - var yybar = 0.0 - var xybar = 0.0 - for ((x1, y1) in rawPoints) { - xxbar += (x1 - xBar) * (x1 - xBar) - yybar += (y1 - yBar) * (y1 - yBar) - xybar += (x1 - xBar) * (y1 - yBar) - } - - var beta1 = xybar / xxbar - var beta0 = yBar - beta1 * xBar - - if (Math.abs(beta1) > MAX_SLOPE) { - beta1 = xybar / yybar - beta0 = xBar - beta1 * yBar - return Line(1.0, -beta1, -beta0) - } - - return Line(-beta1, 1.0, -beta0) - } - - fun isVertical(): Boolean { - return Math.abs(wallAngleOX.degs()) % 180 == 90 - } - - fun isHorizontal(): Boolean { - return Math.abs(wallAngleOX.degs()) % 180 == 0 - } -} \ No newline at end of file diff --git a/server/src/main/java/clInterface/DebugClInterface.kt b/server/src/main/java/clInterface/DebugClInterface.kt deleted file mode 100644 index 972f109195a..00000000000 --- a/server/src/main/java/clInterface/DebugClInterface.kt +++ /dev/null @@ -1,62 +0,0 @@ -package clInterface - -import clInterface.executor.* - -object DebugClInterface { - - private val HELP_STRING = "available handlers:\n" + - "cars - get list of connected cars\n" + - "route [car_id] - setting a route for net.car with net.car id.\n" + - "sonar [car_id] - get sonar data\n" + - "dbinfo [car_id] [type] - refresh all net.car locations\n" + - "type is int value from: MEMORY_STATS - 0, SONAR_STATS - 1\n" + - "alg [count] - run algorithm. Make [count] iteration\n" + - "stop - exit from this interface and stop all threads\n" - - private val algorithmExecutor = Algorithm() - private val executors = mapOf( - Pair("cars", CarsInformation()), - Pair("route", RouteMetric()), - Pair("sonar", Sonar()), - Pair("dbinfo", DebugInformation()), - Pair("alg", algorithmExecutor), - Pair("explore", Explore()) - ) - - fun run() { - println(HELP_STRING) - while (true) { - val readString = readLine() - if (readString == null || readString.equals("stop")) { - algorithmExecutor.interruptAlgorithmThread() - break - } - if (readString.equals("")) { - continue - } - try { - executeCommand(readString) - } catch (exception: Exception) { - exception.printStackTrace() - println("Fail to execute command[$readString]: $exception") - println(HELP_STRING) - } - } - - } - - private fun printNotSupportedCommand(command: String) { - println("Incorrect command: $command") - println(HELP_STRING) - } - - private fun executeCommand(readString: String) { - val command = readString.split(" ")[0].toLowerCase() - val executor = executors[command] - if (executor == null) { - printNotSupportedCommand(command) - return - } - executor.execute(readString) - } -} diff --git a/server/src/main/java/clInterface/executor/Algorithm.kt b/server/src/main/java/clInterface/executor/Algorithm.kt deleted file mode 100644 index 3fa39cf4d09..00000000000 --- a/server/src/main/java/clInterface/executor/Algorithm.kt +++ /dev/null @@ -1,30 +0,0 @@ -package clInterface.executor - -import algorithm.AlgorithmThread -import algorithm.RoomBypassingAlgorithm -import objects.Environment - -class Algorithm : CommandExecutor { - - private val algorithmThread = AlgorithmThread() - - override fun execute(command: String) { - val params = command.split(" ") - val count = - if (params.size == 2) try { - params[1].toInt() - } catch (e: Exception) { - 1 - } else 1 - if (algorithmThread.algorithmImpl == null) { - algorithmThread.algorithmImpl = RoomBypassingAlgorithm(Environment.map.values.last()) - algorithmThread.start() - } - algorithmThread.setCount(count) - } - - fun interruptAlgorithmThread() { - algorithmThread.setCount(0) - algorithmThread.interrupt() - } -} diff --git a/server/src/main/java/clInterface/executor/CarsInformation.kt b/server/src/main/java/clInterface/executor/CarsInformation.kt deleted file mode 100644 index a30880b2a0e..00000000000 --- a/server/src/main/java/clInterface/executor/CarsInformation.kt +++ /dev/null @@ -1,12 +0,0 @@ -package clInterface.executor - -import objects.Environment - -class CarsInformation : CommandExecutor { - - override fun execute(command: String) { - synchronized(Environment, { - println(Environment.map.values) - }) - } -} diff --git a/server/src/main/java/clInterface/executor/CommandExecutor.kt b/server/src/main/java/clInterface/executor/CommandExecutor.kt deleted file mode 100644 index cba954721f6..00000000000 --- a/server/src/main/java/clInterface/executor/CommandExecutor.kt +++ /dev/null @@ -1,7 +0,0 @@ -package clInterface.executor - -interface CommandExecutor { - - fun execute(command:String) - -} \ No newline at end of file diff --git a/server/src/main/java/clInterface/executor/DebugInformation.kt b/server/src/main/java/clInterface/executor/DebugInformation.kt deleted file mode 100644 index 8257689c390..00000000000 --- a/server/src/main/java/clInterface/executor/DebugInformation.kt +++ /dev/null @@ -1,53 +0,0 @@ -package clInterface.executor - -import CodedInputStream -import DebugRequest -import DebugResponseMemoryStats -import DebugResponseSonarStats -import roomScanner.serialize -import net.car.client.Client -import objects.CarReal -import objects.Environment -import java.rmi.UnexpectedException - -class DebugInformation : CommandExecutor { - - override fun execute(command: String) { - val params = command.split(" ") - val car = Environment.map[params[1].toInt()]!! - if (!(car is CarReal)) { - return - } - val type = DebugRequest.Type.fromIntToType(params[2].toInt()) - - val request = DebugRequest.BuilderDebugRequest(type).build() - val requestType = when (type) { - DebugRequest.Type.MEMORY_STATS -> Client.Request.DEBUG_MEMORY - DebugRequest.Type.SONAR_STATS -> Client.Request.DEBUG_SONAR - else -> throw UnexpectedException(type.toString()) - } - - val responseData = car.carConnection.sendRequest( - requestType, - serialize(request.getSizeNoTag(), { request.writeTo(it) }) - ).get().responseBodyAsBytes - - when (type) { - DebugRequest.Type.MEMORY_STATS -> { - val data = DebugResponseMemoryStats.BuilderDebugResponseMemoryStats(0, 0, 0, 0).parseFrom(CodedInputStream(responseData)).build() - println("Heap static tail: ${data.heapStaticTail}") - println("Heap dynamic tail: ${data.heapDynamicTail}") - println("Heap dynamic max size: ${data.heapDynamicMaxBytes}") - println("Heap dynamic total size: ${data.heapDynamicTotalBytes}") - } - DebugRequest.Type.SONAR_STATS -> { - val data = DebugResponseSonarStats.BuilderDebugResponseSonarStats(0, 0, 0, 0).parseFrom(CodedInputStream(responseData)).build() - println("Sonar measurement total: ${data.measurementCount}") - println("Failed check sums: ${data.measurementFailedChecksum}") - println("Failed command: ${data.measurementFailedCommand}") - println("Failed distance: ${data.measurementFailedDistance}") - } - else -> throw UnexpectedException(type.toString()) - } - } -} \ No newline at end of file diff --git a/server/src/main/java/clInterface/executor/Explore.kt b/server/src/main/java/clInterface/executor/Explore.kt deleted file mode 100644 index ccc129f223f..00000000000 --- a/server/src/main/java/clInterface/executor/Explore.kt +++ /dev/null @@ -1,32 +0,0 @@ -package clInterface.executor - -import CodedInputStream -import roomScanner.serialize -import SonarExploreAngleRequest -import SonarExploreAngleResponse -import net.car.client.Client -import objects.CarReal -import objects.Environment - -class Explore : CommandExecutor { - - override fun execute(command: String) { - val params = command.split(" ") - val car = Environment.map[params[1].toInt()]!! - if (!(car is CarReal)) { - return - } - val angle = params[2].toInt() - val window = params[3].toInt() - - val request = SonarExploreAngleRequest.BuilderSonarExploreAngleRequest(angle, window).build() - val responseData = car.carConnection.sendRequest( - Client.Request.EXPLORE_ANGLE, - serialize(request.getSizeNoTag(), { request.writeTo(it) }) - ).get().responseBodyAsBytes - - val distances = SonarExploreAngleResponse.BuilderSonarExploreAngleResponse(IntArray(0)).parseFrom(CodedInputStream(responseData)).build().distances - - println("Received distances: [${distances.joinToString()}]") - } -} \ No newline at end of file diff --git a/server/src/main/java/clInterface/executor/RouteMetric.kt b/server/src/main/java/clInterface/executor/RouteMetric.kt deleted file mode 100644 index 007be46c0a7..00000000000 --- a/server/src/main/java/clInterface/executor/RouteMetric.kt +++ /dev/null @@ -1,91 +0,0 @@ -package clInterface.executor - -import CodedOutputStream -import RouteMetricRequest -import net.car.client.Client -import objects.Car -import objects.CarReal -import objects.Environment -import java.net.ConnectException - -class RouteMetric : CommandExecutor { - - private val ROUTE_REGEX = Regex("route [0-9]{1,10}") - private val HELP_STRING = "print way points als [distance/degrees] [direction] in sm and degrees." + - "after enter all points print \"done\". for reset route print \"reset\". available directions:" + - "0 - FORWARD, 1 - BACKWARD, 2 - LEFT, 3 - RIGHT" - - override fun execute(command: String) { - if (!ROUTE_REGEX.matches(command)) { - println("incorrect args of route command") - return - } - val id: Int - try { - id = command.split(" ")[1].toInt() - } catch (e: NumberFormatException) { - e.printStackTrace() - println("error in converting id to int type") - return - } - val car: Car? = - synchronized(Environment, { - Environment.map[id] - }) - if (car == null) { - println("car with id=$id not found") - return - } - val routeMessage = getRouteMessage() ?: return - val requestBytes = ByteArray(routeMessage.getSizeNoTag()) - routeMessage.writeTo(CodedOutputStream(requestBytes)) - try { - routeMessage.distances.forEachIndexed { idx, distance -> - val direction = roomScanner.CarController.Direction.values() - .filter { it.id == routeMessage.directions[idx] }.first() - car.moveCar(distance, direction).get() - } - } catch (e: ConnectException) { - synchronized(Environment, { - Environment.map.remove(id) - }) - } - } - - private fun getRouteMessage(): RouteMetricRequest? { - println(HELP_STRING) - val distances = arrayListOf() - val directions = arrayListOf() - while (true) { - val readLine = readLine()!!.toLowerCase() - when (readLine) { - "reset" -> return null - "done" -> { - val routeBuilder = RouteMetricRequest.BuilderRouteMetricRequest(distances.toIntArray(), directions.toIntArray()) - return routeBuilder.build() - } - } - val wayPointData = readLine.split(" ") - val distance: Int - val direction: Int - try { - distance = wayPointData[0].toInt() - direction = wayPointData[1].toInt() - } catch (e: NumberFormatException) { - println("error in converting distance or direction to int. try again") - continue - } catch (e: IndexOutOfBoundsException) { - println("format error, you must print two number separated by spaces. Try again") - continue - } - if (direction != 0 && direction != 1 && direction != 2 && direction != 3) { - println("direction $direction don't supported!") - println(HELP_STRING) - } - distances.add(distance) - directions.add(direction) - } - } - - -} \ No newline at end of file diff --git a/server/src/main/java/clInterface/executor/Sonar.kt b/server/src/main/java/clInterface/executor/Sonar.kt deleted file mode 100644 index 240257b9fca..00000000000 --- a/server/src/main/java/clInterface/executor/Sonar.kt +++ /dev/null @@ -1,71 +0,0 @@ -package clInterface.executor - -import CodedOutputStream -import SonarRequest -import objects.Car -import objects.Environment -import java.net.ConnectException - -class Sonar : CommandExecutor { - - private val SONAR_REGEX = Regex("sonar [0-9]{1,10}") - - override fun execute(command: String) { - if (!SONAR_REGEX.matches(command)) { - println("incorrect args of command sonar.") - return - } - val id: Int - try { - id = command.split(" ")[1].toInt() - } catch (e: NumberFormatException) { - e.printStackTrace() - println("error in converting id to int type") - return - } - val car: Car? = synchronized(Environment, { - Environment.map[id] - }) - if (car == null) { - println("car with id=$id not found") - return - } - val requestMessage = getSonarRequest() ?: return - val requestBytes = ByteArray(requestMessage.getSizeNoTag()) - requestMessage.writeTo(CodedOutputStream(requestBytes)) - try { - car.scan(requestMessage.angles, requestMessage.attempts.first(), requestMessage.windowSize, requestMessage.smoothing) - } catch (e: ConnectException) { - synchronized(Environment, { - Environment.map.remove(id) - }) - } - } - - private fun getSonarRequest(): SonarRequest? { - println("print angles, after printing all angles print done") - val angles = arrayListOf() - while (true) { - val command = readLine()!!.toLowerCase() - when (command) { - "reset" -> return null - "done" -> { - val sonarBuilder = SonarRequest.BuilderSonarRequest(angles.toIntArray(), IntArray(angles.size, { 5 }), 3, SonarRequest.Smoothing.MEDIAN) - return sonarBuilder.build() - } - else -> { - try { - val angle = command.toInt() - if (angle < 0 || angle > 180) { - println("incorrect angle $angle. angle must be in [0,180] and div on 4") - } else { - angles.add(angle) - } - } catch (e: NumberFormatException) { - println("error in converting angle to int. try again") - } - } - } - } - } -} \ No newline at end of file diff --git a/server/src/main/java/net/Handler.kt b/server/src/main/java/net/Handler.kt deleted file mode 100644 index 5bedf73120c..00000000000 --- a/server/src/main/java/net/Handler.kt +++ /dev/null @@ -1,8 +0,0 @@ -package net - - -interface Handler { - - fun execute(bytesFromClient: ByteArray): ByteArray - -} \ No newline at end of file diff --git a/server/src/main/java/net/Routes.kt b/server/src/main/java/net/Routes.kt deleted file mode 100644 index 7d2350a3798..00000000000 --- a/server/src/main/java/net/Routes.kt +++ /dev/null @@ -1,9 +0,0 @@ -package net - -object Routes { - val CHANGE_MODE_PATH = "/change-mode" - val GET_WAY_POINTS_PATH = "/get-waypoints" - val DIRECTION_ORDER_PATH = "/direction-order" - val GET_DEBUG_PATH = "/get-debug" - val CAR_CONNECT = "/connect" -} \ No newline at end of file diff --git a/server/src/main/java/net/ServerHandler.kt b/server/src/main/java/net/ServerHandler.kt deleted file mode 100644 index 4f343e030cf..00000000000 --- a/server/src/main/java/net/ServerHandler.kt +++ /dev/null @@ -1,58 +0,0 @@ -package net - -import io.netty.buffer.Unpooled -import io.netty.channel.ChannelHandlerContext -import io.netty.channel.SimpleChannelInboundHandler -import io.netty.handler.codec.http.* -import io.netty.util.CharsetUtil -import java.util.* - -class ServerHandler(val handlers: Map) : SimpleChannelInboundHandler() { - - var contentBytes: ByteArray = ByteArray(0) - var path: String = "" - var method: HttpMethod? = null - - override fun channelReadComplete(ctx: ChannelHandlerContext) { - val handler = handlers[path] - if (handler == null) { - ctx.close() - return - } - val responseBytes = handler.execute(contentBytes) - val response = encodeProtoInHttpResponse(responseBytes) - ctx.writeAndFlush(response).addListener(io.netty.channel.ChannelFutureListener.CLOSE) - } - - private fun encodeProtoInHttpResponse(responseBytes: ByteArray): DefaultHttpResponse { - val response = DefaultFullHttpResponse( - HttpVersion.HTTP_1_1, - HttpResponseStatus.OK, - Unpooled.copiedBuffer(Base64.getEncoder().encodeToString(responseBytes), CharsetUtil.UTF_8) - ) - response.headers().add("Content-Length", response.content().readableBytes()) - response.headers().add("Access-Control-Allow-Origin", "*") - response.headers().add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS") - response.headers().add("Access-Control-Allow-Headers", "X-Requested-With, Content-Direction, Content-Length") - response.headers().add("Content-Length", response.content().readableBytes()) - return response - } - - override fun channelRead0(ctx: ChannelHandlerContext, msg: Any) { - if (msg is HttpRequest) { - path = msg.getUri() - method = msg.getMethod() - } - - if (msg is DefaultHttpContent) { - val contentBuffer = msg.content() - contentBytes = ByteArray(contentBuffer.capacity()) - contentBuffer.readBytes(contentBytes) - } - } - - override fun exceptionCaught(ctx: ChannelHandlerContext?, cause: Throwable?) { - cause?.printStackTrace() - ctx?.close() - } -} \ No newline at end of file diff --git a/server/src/main/java/net/car/Dropper.kt b/server/src/main/java/net/car/Dropper.kt deleted file mode 100644 index d0e71a2fa88..00000000000 --- a/server/src/main/java/net/car/Dropper.kt +++ /dev/null @@ -1,47 +0,0 @@ -package net.car - -import net.car.client.Client -import objects.CarReal -import objects.Environment -import java.net.ConnectException -import kotlin.concurrent.thread - -object Dropper { - - private val WAIT_TIMEOUT = 2L * 60 * 1000 - - fun createCarsDestroyThread(): Thread { - return thread(false, false, null, "dropCar", -1, getThreadCode()) - } - - private fun getThreadCode(): () -> Unit { - return { - var stopped = false - while (!stopped) { - synchronized(Environment, { - dropInactiveCar(Environment) - }) - try { - Thread.sleep(WAIT_TIMEOUT) - } catch (e: InterruptedException) { - println("thread for destroy cars stopped") - stopped = true - } - } - } - } - - private fun dropInactiveCar(environment: Environment) { - for (key in environment.map.keys) { - try { - val carValue = environment.map[key] ?: continue - if (!(carValue is CarReal)) { - continue - } - carValue.carConnection.sendRequest(Client.Request.PING, ByteArray(0)) - } catch (e: ConnectException) { - environment.map.remove(key) - } - } - } -} \ No newline at end of file diff --git a/server/src/main/java/net/car/client/Client.kt b/server/src/main/java/net/car/client/Client.kt deleted file mode 100644 index 25de21fed28..00000000000 --- a/server/src/main/java/net/car/client/Client.kt +++ /dev/null @@ -1,32 +0,0 @@ -package net.car.client - -import org.asynchttpclient.DefaultAsyncHttpClient -import org.asynchttpclient.ListenableFuture -import org.asynchttpclient.Response -import java.rmi.UnexpectedException - -object Client { - - private val client = DefaultAsyncHttpClient() - private val TIMEOUT = 5 * 60 * 60 * 1000 - - enum class Request(val url: String) { - CONNECT("connect"), - GET_LOCATION("getLocation"), - ROUTE("route"), - ROUTE_METRIC("routeMetric"), - SONAR("sonar"), - DEBUG_MEMORY("debug/memory"), - DEBUG_SONAR("debug/sonar"), - PING("ping"), - EXPLORE_ANGLE("sonarExplore"); - } - - fun shutDownClient() { - client.close() - } - - fun makeRequest(request: String, data: ByteArray): ListenableFuture = - client.preparePost(request).setBody(data).setRequestTimeout(TIMEOUT).execute() ?: throw UnexpectedException(request) - -} diff --git a/server/src/main/java/net/car/server/Initializer.kt b/server/src/main/java/net/car/server/Initializer.kt deleted file mode 100644 index 4cfaabff309..00000000000 --- a/server/src/main/java/net/car/server/Initializer.kt +++ /dev/null @@ -1,27 +0,0 @@ -package net.car.server - -import io.netty.channel.ChannelInitializer -import io.netty.channel.ChannelPipeline -import io.netty.channel.socket.SocketChannel -import io.netty.handler.codec.http.HttpServerCodec -import io.netty.util.concurrent.DefaultEventExecutorGroup -import io.netty.util.concurrent.EventExecutorGroup -import net.Routes -import net.ServerHandler -import net.car.server.handlers.CarConnection - -class Initializer : ChannelInitializer { - - val group: EventExecutorGroup - - constructor(handlerThreadCount: Int) { - this.group = DefaultEventExecutorGroup(handlerThreadCount) - } - - override fun initChannel(channel: SocketChannel) { - val p: ChannelPipeline = channel.pipeline() - - p.addLast(HttpServerCodec()) - p.addLast(group, ServerHandler(mapOf(Pair(Routes.CAR_CONNECT, CarConnection())))) - } -} \ No newline at end of file diff --git a/server/src/main/java/net/car/server/Server.kt b/server/src/main/java/net/car/server/Server.kt deleted file mode 100644 index ce1ef9c6a26..00000000000 --- a/server/src/main/java/net/car/server/Server.kt +++ /dev/null @@ -1,38 +0,0 @@ -package net.car.server - -import io.netty.bootstrap.ServerBootstrap -import io.netty.channel.nio.NioEventLoopGroup -import io.netty.channel.socket.nio.NioServerSocketChannel -import kotlin.concurrent.thread - - -object Server { - - private val DEFAULT_PORT = 7925 - private val handlerThreadsCount: Int = 100 - - fun createCarServerThread(carServerPort: Int = DEFAULT_PORT): Thread { - return thread(false, false, null, "carServer", -1, { - println("net.car server started") - val bossGroup = NioEventLoopGroup(1) - val workerGroup = NioEventLoopGroup() - val b = ServerBootstrap() - val initializer = Initializer(handlerThreadsCount) - b.group(bossGroup, workerGroup) - .channel(NioServerSocketChannel().javaClass) - .childHandler(initializer) - - try { - val channel = b.bind(carServerPort).sync().channel() - channel.closeFuture().sync() - } catch (e: InterruptedException) { - println("net.car server stopped") - } finally { - bossGroup.shutdownGracefully() - workerGroup.shutdownGracefully() - initializer.group.shutdownGracefully() - } - }) - } - -} \ No newline at end of file diff --git a/server/src/main/java/net/car/server/handlers/CarConnection.kt b/server/src/main/java/net/car/server/handlers/CarConnection.kt deleted file mode 100644 index 50f04257d90..00000000000 --- a/server/src/main/java/net/car/server/handlers/CarConnection.kt +++ /dev/null @@ -1,22 +0,0 @@ -package net.car.server.handlers - -import CodedInputStream -import CodedOutputStream -import ConnectionRequest -import ConnectionResponse -import net.Handler -import objects.Environment - -class CarConnection : Handler { - - override fun execute(bytesFromClient: ByteArray): ByteArray { - val data = ConnectionRequest.BuilderConnectionRequest(IntArray(0), 0).build() - data.mergeFrom(CodedInputStream(bytesFromClient)) - val ipStr = data.ipValues.map { elem -> elem.toString() }.reduce { elem1, elem2 -> elem1 + "." + elem2 } - val uid = Environment.connectCar(ipStr, data.port) - val responseObject = ConnectionResponse.BuilderConnectionResponse(uid, 0).build() - val result = ByteArray(responseObject.getSizeNoTag()) - responseObject.writeTo(CodedOutputStream(result)) - return result - } -} \ No newline at end of file diff --git a/server/src/main/java/net/web/server/Initializer.kt b/server/src/main/java/net/web/server/Initializer.kt deleted file mode 100644 index b600621a00c..00000000000 --- a/server/src/main/java/net/web/server/Initializer.kt +++ /dev/null @@ -1,31 +0,0 @@ -package net.web.server - -import io.netty.channel.ChannelInitializer -import io.netty.channel.ChannelPipeline -import io.netty.channel.socket.SocketChannel -import io.netty.handler.codec.http.HttpServerCodec -import io.netty.util.concurrent.DefaultEventExecutorGroup -import io.netty.util.concurrent.EventExecutorGroup -import net.Routes -import net.ServerHandler -import net.web.server.handlers.ChangeMode -import net.web.server.handlers.DirectionOrder -import net.web.server.handlers.GetRoomModel - -class Initializer : ChannelInitializer { - - val group: EventExecutorGroup - - constructor(handlerThreadCount: Int) { - this.group = DefaultEventExecutorGroup(handlerThreadCount) - } - - override fun initChannel(channel: SocketChannel) { - val p: ChannelPipeline = channel.pipeline() - p.addLast(HttpServerCodec()) - p.addLast(group, ServerHandler(mapOf( - Pair(Routes.CHANGE_MODE_PATH, ChangeMode()), - Pair(Routes.GET_DEBUG_PATH, GetRoomModel()), - Pair(Routes.DIRECTION_ORDER_PATH, DirectionOrder())))) - } -} \ No newline at end of file diff --git a/server/src/main/java/net/web/server/Server.kt b/server/src/main/java/net/web/server/Server.kt deleted file mode 100644 index 74331de6aca..00000000000 --- a/server/src/main/java/net/web/server/Server.kt +++ /dev/null @@ -1,63 +0,0 @@ -package net.web.server - -import ModeChange -import io.netty.bootstrap.ServerBootstrap -import io.netty.channel.nio.NioEventLoopGroup -import io.netty.channel.socket.nio.NioServerSocketChannel -import kotlin.concurrent.thread - -object Server { - - private val DEFAULT_PORT = 7926 - - enum class ServerMode { - IDLE, - MANUAL_MODE, - PERIMETER_BUILDING, - PERIMETER_DEBUG; - - companion object { - fun fromProtoMode(mode: ModeChange.Mode): ServerMode { - return when (mode) { - ModeChange.Mode.ManualControl -> MANUAL_MODE - ModeChange.Mode.PerimeterBuilding -> PERIMETER_BUILDING - ModeChange.Mode.PerimeterDebug -> PERIMETER_DEBUG - ModeChange.Mode.Idle -> IDLE - else -> throw IllegalArgumentException("Illegal argument when parsing ServerMode from proto buf Mode") - } - } - } - } - - private val handlerThreadsCount: Int = 10 - var serverMode = ServerMode.IDLE - - fun changeMode(newMode: ServerMode) { - println("Changing mode from ${serverMode.toString()} to ${newMode.toString()}") - serverMode = newMode - } - - fun createWebServerThread(webServerPort: Int = DEFAULT_PORT): Thread { - return thread(false, false, null, "webServer", -1, { - println("web server started") - val bossGroup = NioEventLoopGroup(1) - val workerGroup = NioEventLoopGroup() - val b = ServerBootstrap() - val initializer = Initializer(handlerThreadsCount) - b.group(bossGroup, workerGroup) - .channel(NioServerSocketChannel().javaClass) - .childHandler(initializer) - - try { - val channel = b.bind(webServerPort).sync().channel() - channel.closeFuture().sync() - } catch (e: InterruptedException) { - println("web server stopped") - } finally { - bossGroup.shutdownGracefully() - workerGroup.shutdownGracefully() - initializer.group.shutdownGracefully() - } - }) - } -} \ No newline at end of file diff --git a/server/src/main/java/net/web/server/handlers/ChangeMode.kt b/server/src/main/java/net/web/server/handlers/ChangeMode.kt deleted file mode 100644 index 968e82a7f78..00000000000 --- a/server/src/main/java/net/web/server/handlers/ChangeMode.kt +++ /dev/null @@ -1,38 +0,0 @@ -package net.web.server.handlers - -import CodedInputStream -import CodedOutputStream -import GenericResponse -import ModeChange -import Result -import net.Handler -import net.web.server.Server -import java.util.* - -class ChangeMode : Handler { - - override fun execute(bytesFromClient: ByteArray): ByteArray { - val ins = CodedInputStream(Base64.getDecoder().decode(bytesFromClient)) - val request = ModeChange.BuilderModeChange(ModeChange.Mode.fromIntToMode(0)).parseFrom(ins) - val requestedMode = Server.ServerMode.fromProtoMode(request.newMode) - - if (Server.serverMode != Server.ServerMode.IDLE && requestedMode != Server.ServerMode.IDLE) { - println("Can't change server mode from ${Server.serverMode.toString()} to ${requestedMode.toString()}") - val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(1).build()).build() - return protoBufToBytes(protoResponse) - } - - // Change server mode - Server.changeMode(requestedMode) - - // Respond with "OK"-protoBuf - val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(0).build()).build() - return protoBufToBytes(protoResponse) - } - - private fun protoBufToBytes(protoMessage: GenericResponse): ByteArray { - val result = ByteArray(protoMessage.getSizeNoTag()) - protoMessage.writeTo(CodedOutputStream(result)) - return result - } -} \ No newline at end of file diff --git a/server/src/main/java/net/web/server/handlers/DirectionOrder.kt b/server/src/main/java/net/web/server/handlers/DirectionOrder.kt deleted file mode 100644 index 077eab56391..00000000000 --- a/server/src/main/java/net/web/server/handlers/DirectionOrder.kt +++ /dev/null @@ -1,45 +0,0 @@ -package net.web.server.handlers - -import CodedInputStream -import CodedOutputStream -import DirectionRequest -import GenericResponse -import Result -import net.Handler -import net.web.server.Server - -class DirectionOrder : Handler { - - override fun execute(bytesFromClient: ByteArray): ByteArray { - if (Server.serverMode != Server.ServerMode.MANUAL_MODE) { - println("Can't execute move order when not in manual mode") - val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(1).build()).build() - return protoBufToBytes(protoResponse) - } - - val ins = CodedInputStream(bytesFromClient) - val order = DirectionRequest.BuilderDirectionRequest(DirectionRequest.Command.FORWARD, 0, false).parseFrom(ins) - if (order.stop) { - net.web.server.Server.changeMode(Server.ServerMode.IDLE) - val protoResponse = GenericResponse.BuilderGenericResponse(Result.BuilderResult(1).build()).build() - return protoBufToBytes(protoResponse) - } - - sendCarOrder(order.command) - - // TODO: should be done as callback after sending net.car order - // Send update back - return ByteArray(0) - } - - private fun protoBufToBytes(protoMessage: GenericResponse): ByteArray { - val result = ByteArray(protoMessage.getSizeNoTag()) - protoMessage.writeTo(CodedOutputStream(result)) - return result - } - - // TODO: stub!! - private fun sendCarOrder(cmd: DirectionRequest.Command) { - println("Sent order ${cmd.toString()}") - } -} \ No newline at end of file diff --git a/server/src/main/java/net/web/server/handlers/GetRoomModel.kt b/server/src/main/java/net/web/server/handlers/GetRoomModel.kt deleted file mode 100644 index cd4ab1c1aff..00000000000 --- a/server/src/main/java/net/web/server/handlers/GetRoomModel.kt +++ /dev/null @@ -1,57 +0,0 @@ -package net.web.server.handlers - -import CodedOutputStream -import DebugResponse -import algorithm.RoomModel -import net.Handler -import objects.Environment - - -class GetRoomModel : Handler { - - override fun execute(bytesFromClient: ByteArray): ByteArray { - val protoMessage = getDebugInfo() - val result = ByteArray(protoMessage.getSizeNoTag()) - protoMessage.writeTo(CodedOutputStream(result)) - return result - } - - private fun getDebugInfo(): DebugResponse { - - val points = RoomModel.walls.flatMap({ it.points }).toTypedArray() - - val begin_x = IntArray(points.size) - val begin_y = IntArray(points.size) - val end_x = IntArray(points.size) - val end_y = IntArray(points.size) - - val rawPoints = RoomModel.walls.flatMap({ it.rawPoints }).toTypedArray() - val pointsX = rawPoints.map { it.x.toInt() }.toIntArray() - val pointsY = rawPoints.map { it.y.toInt() }.toIntArray() - - for (i in 0..points.size - 2) { - val curPoint = points[i] - val nextPoint = points[i + 1] - begin_x[i] = (curPoint.x + 0.5).toInt() - begin_y[i] = (curPoint.y + 0.5).toInt() - - end_x[i] = (nextPoint.x + 0.5).toInt() - end_y[i] = (nextPoint.y + 0.5).toInt() - } - - val wallDistances = RoomModel.walls.filter { it.isFinished }.map { - val firstPoint = it.points.first() - val lastPoint = it.points.last() - val vector = algorithm.geometry.Vector(firstPoint, lastPoint) - vector.length().toInt() - }.toIntArray() - - if (Environment.map.size == 0) { - return DebugResponse.BuilderDebugResponse(begin_x, begin_y, end_x, end_y, 0, 0, - 0, pointsX, pointsY, wallDistances).build() - } - val car = Environment.map.values.last() - return DebugResponse.BuilderDebugResponse(begin_x, begin_y, end_x, end_y, car.x.toInt(), car.y.toInt(), - car.angle.toInt(), pointsX, pointsY, wallDistances).build() - } -} diff --git a/server/src/main/java/objects/Car.kt b/server/src/main/java/objects/Car.kt deleted file mode 100644 index e29b186af79..00000000000 --- a/server/src/main/java/objects/Car.kt +++ /dev/null @@ -1,17 +0,0 @@ -package objects - -import SonarRequest -import org.asynchttpclient.ListenableFuture -import org.asynchttpclient.Response -import roomScanner.CarController - -abstract class Car(val uid: Int) { - - var x = 0.0 - var y = 0.0 - var angle = 0.0 - - abstract fun moveCar(distance: Int, direction: CarController.Direction): ListenableFuture - - abstract fun scan(angles: IntArray, attempts: Int, windowSize: Int, smoothing: SonarRequest.Smoothing): ListenableFuture -} \ No newline at end of file diff --git a/server/src/main/java/objects/CarConnection.kt b/server/src/main/java/objects/CarConnection.kt deleted file mode 100644 index 7183b81ab83..00000000000 --- a/server/src/main/java/objects/CarConnection.kt +++ /dev/null @@ -1,11 +0,0 @@ -package objects - -import net.car.client.Client -import org.asynchttpclient.ListenableFuture -import org.asynchttpclient.Response - -class CarConnection(val host: String, val port: Int) { - fun sendRequest(request: Client.Request, data: ByteArray): ListenableFuture { - return Client.makeRequest("http://$host:$port/${request.url}", data) - } -} \ No newline at end of file diff --git a/server/src/main/java/objects/CarReal.kt b/server/src/main/java/objects/CarReal.kt deleted file mode 100644 index 68e7f705e3a..00000000000 --- a/server/src/main/java/objects/CarReal.kt +++ /dev/null @@ -1,40 +0,0 @@ -package objects - -import CodedOutputStream -import RouteMetricRequest -import SonarRequest -import net.car.client.Client -import org.asynchttpclient.ListenableFuture -import org.asynchttpclient.Response -import roomScanner.CarController.Direction -import roomScanner.serialize - -class CarReal(uid: Int, host: String, port: Int) : Car(uid) { - - private val CHARGE_CORRECTION = 1.0//on full charge ok is 0.83 - 0.86 - val carConnection = CarConnection(host, port) - - override fun moveCar(distance: Int, direction: Direction): ListenableFuture { - - val route = RouteMetricRequest.BuilderRouteMetricRequest( - IntArray(1, { (distance * CHARGE_CORRECTION).toInt() }), IntArray(1, { direction.id })) - val bytesRoute = ByteArray(route.getSizeNoTag()) - route.writeTo(CodedOutputStream(bytesRoute)) - return carConnection.sendRequest(Client.Request.ROUTE_METRIC, bytesRoute) - } - - override fun scan(angles: IntArray, attempts: Int, windowSize: Int, smoothing: SonarRequest.Smoothing): ListenableFuture { - val message = SonarRequest.BuilderSonarRequest( - angles = angles, - attempts = IntArray(angles.size, { attempts }), - smoothing = smoothing, - windowSize = windowSize) - .build() - val data = serialize(message.getSizeNoTag(), { message.writeTo(it) }) - return carConnection.sendRequest(Client.Request.SONAR, data) - } - - override fun toString(): String { - return "$uid ; x:$x; y:$y; target:$angle" - } -} \ No newline at end of file diff --git a/server/src/main/java/objects/Environment.kt b/server/src/main/java/objects/Environment.kt deleted file mode 100644 index 537484f0a03..00000000000 --- a/server/src/main/java/objects/Environment.kt +++ /dev/null @@ -1,21 +0,0 @@ -package objects - -object Environment { - private var uid = 0 - private val onConnect = mutableListOf<(Car) -> Unit>() - val map = mutableMapOf() - - @Synchronized - fun connectCar(host: String, port: Int): Int { - uid++ - val car = CarReal(uid, host, port) - onConnect.forEach { it(car) } - map.put(uid, car) - return uid - } - - @Synchronized - fun onCarConnect(callback: (Car) -> Unit) { - onConnect.add(callback) - } -} diff --git a/server/src/main/java/objects/emulator/CarEmulator.kt b/server/src/main/java/objects/emulator/CarEmulator.kt deleted file mode 100644 index de7cd393515..00000000000 --- a/server/src/main/java/objects/emulator/CarEmulator.kt +++ /dev/null @@ -1,130 +0,0 @@ -package objects.emulator - -import SonarRequest -import SonarResponse -import algorithm.geometry.Angle -import algorithm.geometry.Line -import algorithm.geometry.Vector -import objects.Car -import org.asynchttpclient.ListenableFuture -import org.asynchttpclient.Response -import roomScanner.CarController -import roomScanner.CarController.Direction.* -import roomScanner.serialize - -class CarEmulator(uid: Int, val testRoom: EmulatedRoom, val useRandom: Boolean, val randomGenerator: Rng) : Car(uid) { - - private var xReal = 0 - private var yReal = 0 - private var angleReal = Angle(0) - - override fun moveCar(distance: Int, direction: CarController.Direction): ListenableFuture { - val coef = if (useRandom) randomGenerator.nextInt(900, 1100).toDouble() / 1000.0 else 1.0 - val distanceWithRandom = (coef * distance).toInt() - when (direction) { - FORWARD -> { - xReal += (Math.cos(angleReal.rads()) * distanceWithRandom).toInt() - yReal += (Math.sin(angleReal.rads()) * distanceWithRandom).toInt() - } - BACKWARD -> { - xReal -= (Math.cos(angleReal.rads()) * distanceWithRandom).toInt() - yReal -= (Math.sin(angleReal.rads()) * distanceWithRandom).toInt() - } - LEFT -> angleReal += Angle(distanceWithRandom) - RIGHT -> angleReal -= Angle(distanceWithRandom) - } - println("x=$xReal y=$yReal angle=${angleReal.degs()}") - return ListenableFutureImpl(ByteArray(0)) - } - - override fun scan(angles: IntArray, attempts: Int, windowSize: Int, smoothing: SonarRequest.Smoothing): ListenableFuture { - - - val xSensor0 = xReal.toInt() - val ySensor0 = yReal.toInt() - val carAngle = angleReal - - val distances = arrayListOf() - angles.forEach { angle -> - val angleFinal = getSensorAngle(angle, carAngle.degs()) - val xSensor1: Int - val ySensor1: Double - //tg can be equal to inf if angle = 90 or 270. it vertical line. x1 = x0, y1 = y0+-[any number. eg 1] - when (angleFinal) { - 90 -> { - xSensor1 = xSensor0 - ySensor1 = (ySensor0 + 1).toDouble() - } - 270 -> { - xSensor1 = xSensor0 - ySensor1 = (ySensor0 - 1).toDouble() - } - in (90..270) -> { - xSensor1 = xSensor0 - 1 - ySensor1 = ySensor0 + (xSensor1 - xSensor0) * Math.tan(angleFinal * Math.PI / 180) - } - else -> { - xSensor1 = xSensor0 + 1 - ySensor1 = ySensor0 + (xSensor1 - xSensor0) * Math.tan(angleFinal * Math.PI / 180) - } - } - val sensorLine = Line(ySensor0 - ySensor1, xSensor1.toDouble() - xSensor0, - xSensor0 * ySensor1 - ySensor0 * xSensor1) - - val sensorVector = Vector(xSensor0.toDouble(), ySensor0.toDouble(), xSensor1.toDouble(), ySensor1) - val distance = getDistance(xSensor0, ySensor0, sensorLine, sensorVector) - if (distance == -1) { - distances.add(distance) - } else { - val delta = if (useRandom) randomGenerator.nextInt(-2, 2) else 0//return one of -2 -1 0 1 or 2 - distances.add(distance + delta) - } - } - - val responseMessage = SonarResponse.BuilderSonarResponse(distances.toIntArray()).build() - val bytes = serialize(responseMessage.getSizeNoTag(), { responseMessage.writeTo(it) }) - - return ListenableFutureImpl(bytes) - } - - private fun getDistance(xSensor0: Int, ySensor0: Int, sensorLine: Line, sensorVector: Vector): Int { - var result = Long.MAX_VALUE - for (wall in testRoom.emulatedWalls) { - val wallLine = wall.line - val slope = sensorLine.A * wallLine.B - sensorLine.B * wallLine.A - if (Math.abs(slope) < 0.01) { - //line is parallel. - continue - } - val xIntersection = (sensorLine.B * wallLine.C - wallLine.B * sensorLine.C) / slope - val yIntersection = (sensorLine.C * wallLine.A - wallLine.C * sensorLine.A) / slope - - //filters by direction and intersection position - val intersectionVector = Vector(xSensor0.toDouble(), ySensor0.toDouble(), xIntersection, yIntersection) - if (intersectionVector.scalarProduct(sensorVector) < 0) { - continue - } - val wallVector1 = Vector(xIntersection, yIntersection, wall.xTo.toDouble(), wall.yTo.toDouble()) - val wallVector2 = Vector(xIntersection, yIntersection, wall.xFrom.toDouble(), wall.yFrom.toDouble()) - if (wallVector1.scalarProduct(wallVector2) > 0) { - continue - } - val currentDistance = Math.round(Math.sqrt(Math.pow(xIntersection - xSensor0, 2.0) - + Math.pow(yIntersection - ySensor0, 2.0))) - if (currentDistance < result) { - result = currentDistance - } - } - return result.toInt() - } - - - private fun getSensorAngle(requestAngle: Int, carAngle: Int): Int { - var angleTmp = carAngle - requestAngle - while (angleTmp < 0) { - angleTmp += 360 - } - return angleTmp % 360 - } -} - diff --git a/server/src/main/java/objects/emulator/EmulatedRoom.kt b/server/src/main/java/objects/emulator/EmulatedRoom.kt deleted file mode 100644 index 486f7b96ef0..00000000000 --- a/server/src/main/java/objects/emulator/EmulatedRoom.kt +++ /dev/null @@ -1,44 +0,0 @@ -package objects.emulator - -import org.w3c.dom.Node -import java.io.File -import javax.xml.parsers.DocumentBuilderFactory - -class EmulatedRoom() { - val emulatedWalls = arrayListOf() - - constructor(EmulatedWalls: Collection) : this() { - this.emulatedWalls.addAll(EmulatedWalls) - } - - companion object { - fun EmulatedRoomFromFile(pathToFile: String): EmulatedRoom? { - - val factory = DocumentBuilderFactory.newInstance() - val builder = factory.newDocumentBuilder() - val doc = builder.parse(File(pathToFile)) - val root = doc.getDocumentElement() - val rootChild = root.childNodes - var walls: Node? = null - for (i in 0..rootChild.length - 1) { - val node = rootChild.item(i) - if (node.nodeType == Node.ELEMENT_NODE) { - walls = node - break - } - } - walls ?: return null - val wallsChild = walls.childNodes - val result = EmulatedRoom() - for (i in 0..wallsChild.length - 1) { - val wall = wallsChild.item(i) - if (wall.nodeType != Node.ELEMENT_NODE) { - continue - } - val EmulatedWall = EmulatedWall.wallFromXml(wall) ?: return null - result.emulatedWalls.add(EmulatedWall) - } - return result - } - } -} diff --git a/server/src/main/java/objects/emulator/EmulatedWall.kt b/server/src/main/java/objects/emulator/EmulatedWall.kt deleted file mode 100644 index 95c90609ffb..00000000000 --- a/server/src/main/java/objects/emulator/EmulatedWall.kt +++ /dev/null @@ -1,27 +0,0 @@ -package objects.emulator - -import algorithm.geometry.Line -import org.w3c.dom.Node - -class EmulatedWall constructor(val line: Line, val xFrom: Int, val xTo: Int, val yFrom: Int, val yTo: Int) { - - companion object { - fun wallFromXml(wall: Node): EmulatedWall? { - val points = wall.attributes - val startX: Int - val endX: Int - val endY: Int - val startY: Int - try { - startX = points.getNamedItem("startX").nodeValue.toInt() - startY = points.getNamedItem("startY").nodeValue.toInt() - endX = points.getNamedItem("endX").nodeValue.toInt() - endY = points.getNamedItem("endY").nodeValue.toInt() - } catch (e: NumberFormatException) { - return null - } - val line = Line((startY - endY).toDouble(), (endX - startX).toDouble(), (startX * endY - startY * endX).toDouble()) - return EmulatedWall(line, startX, endX, startY, endY) - } - } -} \ No newline at end of file diff --git a/server/src/main/java/objects/emulator/ListenableFutureImpl.kt b/server/src/main/java/objects/emulator/ListenableFutureImpl.kt deleted file mode 100644 index e75bba54a45..00000000000 --- a/server/src/main/java/objects/emulator/ListenableFutureImpl.kt +++ /dev/null @@ -1,54 +0,0 @@ -package objects.emulator - -import io.netty.buffer.ByteBuf -import io.netty.buffer.Unpooled -import org.asynchttpclient.ListenableFuture -import org.asynchttpclient.Response -import org.asynchttpclient.netty.EagerResponseBodyPart -import org.asynchttpclient.netty.NettyResponse -import java.util.concurrent.CompletableFuture -import java.util.concurrent.Executor -import java.util.concurrent.TimeUnit - -class ListenableFutureImpl(bytes: ByteArray) : ListenableFuture { - - val response = NettyResponse(null, null, listOf(EagerResponseBodyPart(Unpooled.copiedBuffer(bytes), true))) - - override fun done() { - - } - - override fun cancel(p0: Boolean): Boolean { - return false - } - - override fun touch() { - } - - override fun get(): Response { - return response - } - - override fun get(p0: Long, p1: TimeUnit): Response { - return response - } - - override fun addListener(listener: Runnable?, exec: Executor?): ListenableFuture { - return this - } - - override fun abort(t: Throwable?) { - } - - override fun isDone(): Boolean { - return true - } - - override fun toCompletableFuture(): CompletableFuture { - throw UnsupportedOperationException("not implemented") - } - - override fun isCancelled(): Boolean { - return false - } -} \ No newline at end of file diff --git a/server/src/main/java/objects/emulator/Rng.kt b/server/src/main/java/objects/emulator/Rng.kt deleted file mode 100644 index ab181a17381..00000000000 --- a/server/src/main/java/objects/emulator/Rng.kt +++ /dev/null @@ -1,28 +0,0 @@ -package objects.emulator - -class Rng(seed: Long) { - var curState = seed - val a = 1664525L - val c = 1013904223L - val mod = 2147483648L - - fun abs(value: Long): Long { - if (value < 0) - return -value - return value - } - - fun nextInt(): Int { - val res = curState - curState = abs(a * curState + c) % mod - return (res % mod).toInt() - } - - fun nextInt(min_val: Int, max_val: Int): Int { - val rand = nextInt() - val size = max_val - min_val + 1 - val randInRange = rand % size - val res = randInRange + min_val - return res - } -} \ No newline at end of file diff --git a/server/src/main/java/roomScanner/CarController.kt b/server/src/main/java/roomScanner/CarController.kt deleted file mode 100644 index acedf355022..00000000000 --- a/server/src/main/java/roomScanner/CarController.kt +++ /dev/null @@ -1,96 +0,0 @@ -package roomScanner - -import CodedInputStream -import RouteMetricRequest -import SonarRequest -import SonarResponse -import net.car.client.Client -import objects.CarReal - -class CarController(var car: CarReal) { - enum class Direction(val id: Int) { - FORWARD(0), - BACKWARD(1), - LEFT(2), - RIGHT(3); - } - - //todo use x,y,angle from car object. x,y in sm, angle in degrees - var position = Pair(0.0, 0.0) - private set - private var angle = 0.0 - - private val CHARGE_CORRECTION = 0.97 - private val MAX_ANGLE = 360.0 - private val SCAN_STEP = 5.0 - private val MIN_ROTATION = 10 - private val MAX_VALID_DISTANCE = 100.0 - - fun moveTo(to: Pair, distance: Double) { - val driveAngle = (Math.toDegrees(Math.atan2(to.second, to.first)) + MAX_ANGLE) % MAX_ANGLE - rotateOn(driveAngle) - drive(Direction.FORWARD, distance.toInt()) - - position = Pair(position.first + distance * Math.cos(Math.toRadians(driveAngle)), - position.second + distance * Math.sin(Math.toRadians(driveAngle))) - } - - fun rotateOn(target: Double) { - val rotateAngle = angleDistance(angle, target) - val direction = if (rotateAngle > 0) Direction.LEFT else Direction.RIGHT - drive(direction, Math.abs(rotateAngle.toInt())) - - angle = target - } - - fun rotateLeftWithCorrection(angle: Double) { - val horizon = horizon() - val before = scan(horizon) - drive(Direction.LEFT, angle.toInt()) - var after = scan(horizon) - - val distance = fun(first: Double, second: Double): Double = Math.max(when { - first == second -> 0.0 - first == -1.0 -> second - second == -1.0 -> first - else -> Math.max(Math.abs(first - second).toDouble(), 100.0) - }, MAX_VALID_DISTANCE) - - var realAngle = (maxSuffix(before, after, distance) + 1) * SCAN_STEP - while (realAngle != angle) { - val direction = if (realAngle > angle) Direction.RIGHT else Direction.LEFT - drive(direction, Math.min(MIN_ROTATION, Math.abs(realAngle - angle).toInt())) - - after = scan(horizon) - realAngle = maxSuffix(before, after, distance) * SCAN_STEP - } - - this.angle = realAngle - } - - fun scan(angles: IntArray): List { - val request = SonarRequest.BuilderSonarRequest(angles, IntArray(angles.size, { 1 }), 1, SonarRequest.Smoothing.NONE).build() - - val data = serialize(request.getSizeNoTag(), { request.writeTo(it) }) - - val response = car.carConnection.sendRequest(Client.Request.SONAR, data).get().responseBodyAsBytes - - val result = SonarResponse.BuilderSonarResponse(IntArray(0)).parseFrom(CodedInputStream(response)).build().distances.map { it.toDouble() } - return result - } - - fun convertToPoint(angle: Double, distance: Double): Pair { - if (distance <= 0) { - return Pair(0.0, 0.0) - } - - val realAngle = Math.toRadians(angle + this.angle) - return Pair(Math.cos(realAngle) * distance + position.first, Math.sin(realAngle) * distance + position.second) - } - - fun drive(direction: Direction, distance: Int) { - val request = RouteMetricRequest.BuilderRouteMetricRequest(intArrayOf((distance * CHARGE_CORRECTION).toInt()), intArrayOf(direction.id)).build() - val data = serialize(request.getSizeNoTag(), { i -> request.writeTo(i) }) - car.carConnection.sendRequest(Client.Request.ROUTE_METRIC, data).get() - } -} diff --git a/server/src/main/java/roomScanner/RoomScanner.kt b/server/src/main/java/roomScanner/RoomScanner.kt deleted file mode 100644 index 13f5910c258..00000000000 --- a/server/src/main/java/roomScanner/RoomScanner.kt +++ /dev/null @@ -1,43 +0,0 @@ -package roomScanner - -class RoomScanner(val controller: CarController) : Thread() { - private val points = mutableListOf>() - private val VALID_MEASURE = 150 - private val GHOST_LEVEL = 50 - - override fun run() { - println("CarReal connected ${controller.car.carConnection.host}") - for (i in 1..100) { - step() - println(plot(points)) - } - - } - - private fun step() { - val iterationPoints = scan().filter { it.first > 0 || it.second > 0 } - points.addAll(iterationPoints.filter { distance(controller.position, it) <= VALID_MEASURE }) - - val target = iterationPoints.sortedBy { distance(controller.position, it) }.takeLast(GHOST_LEVEL)[(Math.random() * GHOST_LEVEL).toInt()] - controller.moveTo(target, Math.min(distance(controller.position, target), 100.0)) - controller.rotateOn(0.0) - } - - private fun scan(): MutableList> { - val horizon = horizon() - - val dots = mutableListOf>() - for (i in arrayOf(0.0, 90.0, 180.0, 270.0)) { - dots.addAll(controller.scan(horizon).mapIndexed { i: Int, d: Double -> controller.convertToPoint((i * 5 - 180).toDouble(), d) }) - controller.drive(CarController.Direction.FORWARD, 10) - controller.drive(CarController.Direction.BACKWARD, 10) - - controller.rotateLeftWithCorrection(90.0) - } - - return dots - } - - private fun plot(points: MutableList>) = - "x <- c(${points.joinToString { it.first.toInt().toString() }}) \ny <- c(${points.joinToString { it.second.toInt().toString() }})" -} diff --git a/server/src/main/java/roomScanner/utils.kt b/server/src/main/java/roomScanner/utils.kt deleted file mode 100644 index 18b62da44a3..00000000000 --- a/server/src/main/java/roomScanner/utils.kt +++ /dev/null @@ -1,65 +0,0 @@ -package roomScanner - -import CodedOutputStream - -fun horizon(): IntArray { - val horizon = IntArray(180 / 5, { it * 5 }) - horizon.reverse() - - return horizon -} - -fun distance(first: Pair, second: Pair): Double { - val xDistance = first.first - second.first - val yDistance = first.second - second.second - - return Math.sqrt(xDistance * xDistance + yDistance * yDistance) -} - -fun angleDistance(from: Double, to: Double): Double { - val distance = Math.min(Math.abs(from - to), Math.abs(360 - (from - to))) - val direction = if (distance == Math.abs(from - to)) Math.signum(to - from) else -Math.signum(to - from) - - return distance * direction -} - -inline fun serialize(size: Int, writeTo: (CodedOutputStream) -> Unit): ByteArray { - val bytes = ByteArray(size) - writeTo(CodedOutputStream(bytes)) - - return bytes -} - -fun maxSuffix(first: List, second: List, distance: (T, T) -> Double): Int { - val distances = first.mapIndexed { i: Int, t: T -> - var score = 0.0 - var size = Math.min(second.size - 1, first.size - i - 1) - for (j in 0..size) { - score += distance(first[i + j], second[j]) - } - - score / (size + 1) - }.toList() - - return distances.indexOf(distances.min()) -} - -fun merge(lists: List>, distance: (T, T) -> Double): List { - val indexes = mutableListOf() - for (i in 0..(lists.size - 2)) { - indexes.add(maxSuffix(lists[i], lists[i + 1], distance)) - } - - val result = mutableListOf() - for (i in 0..(indexes.size - 1)) { - for (j in 0..indexes[i]) { - result.add(lists[i][j]) - } - } - - for (i in (indexes.last() + 1)..(lists.last().size - 1)) { - result.add(lists.last()[i]) - } - - return result -} diff --git a/translator/.idea/copyright/profiles_settings.xml b/translator/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3377d..00000000000 --- a/translator/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/translator/gradle/wrapper/gradle-wrapper.jar b/translator/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 941144813d241db74e1bf25b6804c679fbe7f0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53636 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 DXC5Z7 diff --git a/translator/gradlew.bat b/translator/gradlew.bat deleted file mode 100644 index aec99730b4e..00000000000 --- a/translator/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@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 - -@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= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@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 Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_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=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -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/ui/index.html b/ui/index.html deleted file mode 100644 index 596e2a93139..00000000000 --- a/ui/index.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - CarKot - - - - - - - - - - - - - -

    - - -
    -
    - -
    - -
    HEY
    -
    - - -
    - - - - - - -
    - -
    -
    - -
    - -
    - -
    - -
    - - - - -
    - - -
    -
    -
    - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ui/scripts/algorithms/perimeter.js b/ui/scripts/algorithms/perimeter.js deleted file mode 100644 index d7d242d56b3..00000000000 --- a/ui/scripts/algorithms/perimeter.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; - -var stopBuildPerimeter = function() {} - -function buildPerimeter(debug) { - console.log("Perimeter building started"); - // perimeterRequest(); - var time = 1000; - - if (debug) { - // var interval = setInterval(perimeterDebugRequest, time); - return - } else { - var interval = setInterval(perimeterRequest, time); - } - - stopBuildPerimeter = function() { - clearInterval(interval); - } -} - -function perimeterDebugRequest() { - console.log("Sending request for debug info"); - var url = "/get-debug"; - $.get(serverAddress + url, {}, function(data) { - console.log("Got debug response"); - var debugInfo = DebugResponse.decode64(data); - console.log("Drawing"); - drawDebug(debugInfo, 1); - }); -} - -function perimeterRequest(debug) { - console.log("Sending request for waypoints"); - var url = "/get-waypoints"; - $.get(serverAddress + url, {}, function(data) { - console.log("Got waypoints response"); - var waypoints = Waypoints.decode64(data); - if (waypoints.stop) { - console.log("Stopping"); - stopBuildPerimeter(); - } else { - console.log("Drawing"); - drawPath(waypoints); - } - }); -} - - -function waypointsToString(waypoints) { - var string = ""; - var x = waypoints.x; - var y = waypoints.y; - for (var i = 0; i < x.length; i++) { - string += x[i].toString() + ", " + y[i].toString() + "\n"; - } - return string; -}; diff --git a/ui/scripts/index.js b/ui/scripts/index.js deleted file mode 100644 index 98b8b414f39..00000000000 --- a/ui/scripts/index.js +++ /dev/null @@ -1,192 +0,0 @@ -"use strict"; - -var ProtoBuf = dcodeIO.ProtoBuf, - // Protobuf Builders - waypointsBuilder = ProtoBuf.loadProtoFile("scripts/proto/waypoints.proto"), - directionBuilder = ProtoBuf.loadProtoFile("scripts/proto/direction.proto"), - modeChangeBuilder = ProtoBuf.loadProtoFile("scripts/proto/mode_change.proto"), - genericResponseBuilder = ProtoBuf.loadProtoFile("scripts/proto/generic_response.proto"), - debugBuilder = ProtoBuf.loadProtoFile("scripts/proto/client_debug.proto"), - - // Protobuf messages - Waypoints = waypointsBuilder.build("Waypoints"), - Direction = directionBuilder.build("carkot.DirectionRequest"), - ModeChange = modeChangeBuilder.build("ModeChange"), - GenericResponse = genericResponseBuilder.build("GenericResponse"), - Result = genericResponseBuilder.build("Result"), - DebugResponse = debugBuilder.build("DebugResponse"), - - // serverAddress = "http://localhost:8000"; - serverAddress = "http://localhost:7926", - remoteController = null, - - // drawing-related objects - canvas = $( "#pathCanvas" )[0], - ctx = canvas.getContext('2d'), - tooltip = $( "#coords-tooltip"); - -var currentActiveButton = null; - -var Commands = { - UP: 0, - DOWN: 1, - LEFT: 2, - RIGHT: 3, - properties: { - 0: {name: "UP", value: 0}, - 1: {name: "DOWN", value: 1}, - 2: {name: "LEFTT", value: 2}, - 3: {name: "RIGHT", value: 3} - } -}; - -function sendMoveCommand(cmd) { - if (mode !== "MANUAL") { - console.log("Wont send the order when not in manual mode!") - return - } - var msg = new Direction(cmd, 0); - var buffer = msg.toBase64(); - console.log("Sending POST request:" + buffer); - $.post( serverAddress + "/direction-order", buffer, function(response) { - drawPath(Waypoints.decode64(response)); - }, - "text"); -} - -function sendProtobuf(msg, address, callback) { - var buffer = msg.toBase64(); - $.post( address, buffer, callback); -} - -function handleControlKeydown(event) { - switch (event.which) { - case 37: // left - event.preventDefault(); - $( "#left-control-btn" ).addClass("active"); - sendMoveCommand(Commands.LEFT) - break; - case 38: // up - event.preventDefault(); - $( "#up-control-btn" ).addClass("active"); - sendMoveCommand(Commands.UP) - break; - case 39: // right - event.preventDefault(); - $( "#right-control-btn" ).addClass("active"); - sendMoveCommand(Commands.RIGHT) - break; - case 40: // down - event.preventDefault(); - $( "#down-control-btn" ).addClass("active"); - sendMoveCommand(Commands.DOWN) - break; - } -} - -function handleControlKeyup(event) { - switch (event.which) { - case 37: // left - event.preventDefault(); - $( "#left-control-btn" ).removeClass("active"); - break; - case 38: // up - event.preventDefault(); - $( "#up-control-btn" ).removeClass("active"); - break; - case 39: // right - event.preventDefault(); - $( "#right-control-btn" ).removeClass("active"); - break; - case 40: // down - event.preventDefault(); - $( "#down-control-btn" ).removeClass("active"); - break; - } -}; - -// Unfocus buttons after press -$( ".btn" ).mouseup(function(){ - $(this).blur(); -}); - - -$(document).keydown(function(event) { - if (! $( "#controls" ).hasClass("active")) { - return null - } - return handleControlKeydown(event) -}); - -$(document).keyup(function(event) { - if (! $( "#controls" ).hasClass("active")) { - return null - } - return handleControlKeyup(event) -}); - -$(document).ready(init) - -function init() { - $("#perimeter-mode-tab").hide() - $("#perimeter-debug-tab").hide() - $("#manual-mode-tab").hide() - $("#exit-btn").hide() - - canvas.addEventListener('mousemove', function(evt) { - var mousePos = getMousePos(evt); - var message = "(" + mousePos.x + "," + mousePos.y + ")"; - tooltip[0].textContent = message; - tooltip.offset( {top: (evt.pageY + 20), left: (evt.pageX + 20) } ); - }, - false -); - -} - -function hideTabs() { - $("#perimeter-mode-tab").fadeOut() - $("#perimeter-debug-tab").fadeOut() - $("#manual-mode-tab").fadeOut() - $("#exit-btn").fadeOut() -} - - -function changeMode(modeId, button, associatedTab) { - console.log("Changing mode to mode #" + modeId) - - // check for pressing wrong buttons - if (($(button).hasClass("disabled"))) { - alert("Exit current mode first!"); - return; - } - - if ($(button) == currentActiveButton) { - alert("Already in this mode!"); - } - - // if exit pressed - if (modeId == 0) { - currentActiveButton.siblings().removeClass("disabled") - currentActiveButton = null - hideTabs(); - } - else { // entering mode - $(button).siblings().addClass("disabled"); - currentActiveButton = $(button); - $("#exit-btn").fadeIn(); - $("#" + associatedTab).fadeIn(); - } - - console.log("Sending request to change mode to" + modeId.toString()); - var msg = new ModeChange(modeId); - sendProtobuf(msg, serverAddress + "/change-mode", function(response) { - var response = GenericResponse.decode64(response); - if (response.result.error != 0) { - alert("Something went wrong!"); - return; - } - - console.log("Got OK for changing request") - }); -} diff --git a/ui/scripts/proto/client_debug.proto b/ui/scripts/proto/client_debug.proto deleted file mode 100644 index 60da09b2b52..00000000000 --- a/ui/scripts/proto/client_debug.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -message DebugResponse { - repeated int32 begin_x = 1 [packed = true]; - repeated int32 begin_y = 2 [packed = true]; - repeated int32 end_x = 3 [packed = true]; - repeated int32 end_y = 4 [packed = true]; - - int32 carX = 5; - int32 carY = 6; - int32 carAngle = 7; - - repeated int32 x = 8 [packed = true]; - repeated int32 y = 9 [packed = true]; - -} \ No newline at end of file diff --git a/ui/scripts/proto/direction.proto b/ui/scripts/proto/direction.proto deleted file mode 100644 index 0debe83e1e6..00000000000 --- a/ui/scripts/proto/direction.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; -package carkot; - -message DirectionRequest { - enum Command { - STOP = 0; - FORWARD = 1; - BACKWARD = 2; - LEFT = 3; - RIGHT = 4; - } - Command command = 1; - int32 sid = 2; - bool stop = 3; -} \ No newline at end of file diff --git a/ui/scripts/proto/generic_response.proto b/ui/scripts/proto/generic_response.proto deleted file mode 100644 index 803b82d619c..00000000000 --- a/ui/scripts/proto/generic_response.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -message Result { - int32 error = 1; -} - -message GenericResponse { - Result result = 1; -} \ No newline at end of file diff --git a/ui/scripts/proto/mode_change.proto b/ui/scripts/proto/mode_change.proto deleted file mode 100644 index 6851284c06f..00000000000 --- a/ui/scripts/proto/mode_change.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; - -message ModeChange { - enum Mode { - Idle = 0; - PerimeterBuilding = 1; - PerimeterDebug = 2; - ManualControl = 3; - } - - Mode newMode = 1; -} \ No newline at end of file diff --git a/ui/scripts/proto/waypoints.proto b/ui/scripts/proto/waypoints.proto deleted file mode 100644 index a3573e1ae93..00000000000 --- a/ui/scripts/proto/waypoints.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -message Waypoints { - repeated int32 begin_x = 1 [packed = true]; - repeated int32 begin_y = 2 [packed = true]; - repeated int32 end_x = 3 [packed = true]; - repeated int32 end_y = 4 [packed = true]; - bool stop = 5; -} \ No newline at end of file diff --git a/ui/scripts/protobufjs/bytebuffer.js b/ui/scripts/protobufjs/bytebuffer.js deleted file mode 100644 index b6ade9fb0de..00000000000 --- a/ui/scripts/protobufjs/bytebuffer.js +++ /dev/null @@ -1,3746 +0,0 @@ -/* - Copyright 2013-2014 Daniel Wirtz - - 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. - */ - -/** - * @license bytebuffer.js (c) 2015 Daniel Wirtz - * Backing buffer: ArrayBuffer, Accessor: Uint8Array - * Released under the Apache License, Version 2.0 - * see: https://github.com/dcodeIO/bytebuffer.js for details - */ -(function(global, factory) { - - /* AMD */ if (typeof define === 'function' && define["amd"]) - define(["long"], factory); - /* CommonJS */ else if (typeof require === 'function' && typeof module === "object" && module && module["exports"]) - module['exports'] = (function() { - var Long; try { Long = require("long"); } catch (e) {} - return factory(Long); - })(); - /* Global */ else - (global["dcodeIO"] = global["dcodeIO"] || {})["ByteBuffer"] = factory(global["dcodeIO"]["Long"]); - -})(this, function(Long) { - "use strict"; - - /** - * Constructs a new ByteBuffer. - * @class The swiss army knife for binary data in JavaScript. - * @exports ByteBuffer - * @constructor - * @param {number=} capacity Initial capacity. Defaults to {@link ByteBuffer.DEFAULT_CAPACITY}. - * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to - * {@link ByteBuffer.DEFAULT_ENDIAN}. - * @param {boolean=} noAssert Whether to skip assertions of offsets and values. Defaults to - * {@link ByteBuffer.DEFAULT_NOASSERT}. - * @expose - */ - var ByteBuffer = function(capacity, littleEndian, noAssert) { - if (typeof capacity === 'undefined') - capacity = ByteBuffer.DEFAULT_CAPACITY; - if (typeof littleEndian === 'undefined') - littleEndian = ByteBuffer.DEFAULT_ENDIAN; - if (typeof noAssert === 'undefined') - noAssert = ByteBuffer.DEFAULT_NOASSERT; - if (!noAssert) { - capacity = capacity | 0; - if (capacity < 0) - throw RangeError("Illegal capacity"); - littleEndian = !!littleEndian; - noAssert = !!noAssert; - } - - /** - * Backing ArrayBuffer. - * @type {!ArrayBuffer} - * @expose - */ - this.buffer = capacity === 0 ? EMPTY_BUFFER : new ArrayBuffer(capacity); - - /** - * Uint8Array utilized to manipulate the backing buffer. Becomes `null` if the backing buffer has a capacity of `0`. - * @type {?Uint8Array} - * @expose - */ - this.view = capacity === 0 ? null : new Uint8Array(this.buffer); - - /** - * Absolute read/write offset. - * @type {number} - * @expose - * @see ByteBuffer#flip - * @see ByteBuffer#clear - */ - this.offset = 0; - - /** - * Marked offset. - * @type {number} - * @expose - * @see ByteBuffer#mark - * @see ByteBuffer#reset - */ - this.markedOffset = -1; - - /** - * Absolute limit of the contained data. Set to the backing buffer's capacity upon allocation. - * @type {number} - * @expose - * @see ByteBuffer#flip - * @see ByteBuffer#clear - */ - this.limit = capacity; - - /** - * Whether to use little endian byte order, defaults to `false` for big endian. - * @type {boolean} - * @expose - */ - this.littleEndian = littleEndian; - - /** - * Whether to skip assertions of offsets and values, defaults to `false`. - * @type {boolean} - * @expose - */ - this.noAssert = noAssert; - }; - - /** - * ByteBuffer version. - * @type {string} - * @const - * @expose - */ - ByteBuffer.VERSION = "5.0.1"; - - /** - * Little endian constant that can be used instead of its boolean value. Evaluates to `true`. - * @type {boolean} - * @const - * @expose - */ - ByteBuffer.LITTLE_ENDIAN = true; - - /** - * Big endian constant that can be used instead of its boolean value. Evaluates to `false`. - * @type {boolean} - * @const - * @expose - */ - ByteBuffer.BIG_ENDIAN = false; - - /** - * Default initial capacity of `16`. - * @type {number} - * @expose - */ - ByteBuffer.DEFAULT_CAPACITY = 16; - - /** - * Default endianess of `false` for big endian. - * @type {boolean} - * @expose - */ - ByteBuffer.DEFAULT_ENDIAN = ByteBuffer.BIG_ENDIAN; - - /** - * Default no assertions flag of `false`. - * @type {boolean} - * @expose - */ - ByteBuffer.DEFAULT_NOASSERT = false; - - /** - * A `Long` class for representing a 64-bit two's-complement integer value. May be `null` if Long.js has not been loaded - * and int64 support is not available. - * @type {?Long} - * @const - * @see https://github.com/dcodeIO/long.js - * @expose - */ - ByteBuffer.Long = Long || null; - - /** - * @alias ByteBuffer.prototype - * @inner - */ - var ByteBufferPrototype = ByteBuffer.prototype; - - /** - * An indicator used to reliably determine if an object is a ByteBuffer or not. - * @type {boolean} - * @const - * @expose - * @private - */ - ByteBufferPrototype.__isByteBuffer__; - - Object.defineProperty(ByteBufferPrototype, "__isByteBuffer__", { - value: true, - enumerable: false, - configurable: false - }); - - // helpers - - /** - * @type {!ArrayBuffer} - * @inner - */ - var EMPTY_BUFFER = new ArrayBuffer(0); - - /** - * String.fromCharCode reference for compile-time renaming. - * @type {function(...number):string} - * @inner - */ - var stringFromCharCode = String.fromCharCode; - - /** - * Creates a source function for a string. - * @param {string} s String to read from - * @returns {function():number|null} Source function returning the next char code respectively `null` if there are - * no more characters left. - * @throws {TypeError} If the argument is invalid - * @inner - */ - function stringSource(s) { - var i=0; return function() { - return i < s.length ? s.charCodeAt(i++) : null; - }; - } - - /** - * Creates a destination function for a string. - * @returns {function(number=):undefined|string} Destination function successively called with the next char code. - * Returns the final string when called without arguments. - * @inner - */ - function stringDestination() { - var cs = [], ps = []; return function() { - if (arguments.length === 0) - return ps.join('')+stringFromCharCode.apply(String, cs); - if (cs.length + arguments.length > 1024) - ps.push(stringFromCharCode.apply(String, cs)), - cs.length = 0; - Array.prototype.push.apply(cs, arguments); - }; - } - - /** - * Gets the accessor type. - * @returns {Function} `Buffer` under node.js, `Uint8Array` respectively `DataView` in the browser (classes) - * @expose - */ - ByteBuffer.accessor = function() { - return Uint8Array; - }; - /** - * Allocates a new ByteBuffer backed by a buffer of the specified capacity. - * @param {number=} capacity Initial capacity. Defaults to {@link ByteBuffer.DEFAULT_CAPACITY}. - * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to - * {@link ByteBuffer.DEFAULT_ENDIAN}. - * @param {boolean=} noAssert Whether to skip assertions of offsets and values. Defaults to - * {@link ByteBuffer.DEFAULT_NOASSERT}. - * @returns {!ByteBuffer} - * @expose - */ - ByteBuffer.allocate = function(capacity, littleEndian, noAssert) { - return new ByteBuffer(capacity, littleEndian, noAssert); - }; - - /** - * Concatenates multiple ByteBuffers into one. - * @param {!Array.} buffers Buffers to concatenate - * @param {(string|boolean)=} encoding String encoding if `buffers` contains a string ("base64", "hex", "binary", - * defaults to "utf8") - * @param {boolean=} littleEndian Whether to use little or big endian byte order for the resulting ByteBuffer. Defaults - * to {@link ByteBuffer.DEFAULT_ENDIAN}. - * @param {boolean=} noAssert Whether to skip assertions of offsets and values for the resulting ByteBuffer. Defaults to - * {@link ByteBuffer.DEFAULT_NOASSERT}. - * @returns {!ByteBuffer} Concatenated ByteBuffer - * @expose - */ - ByteBuffer.concat = function(buffers, encoding, littleEndian, noAssert) { - if (typeof encoding === 'boolean' || typeof encoding !== 'string') { - noAssert = littleEndian; - littleEndian = encoding; - encoding = undefined; - } - var capacity = 0; - for (var i=0, k=buffers.length, length; i 0) capacity += length; - } - if (capacity === 0) - return new ByteBuffer(0, littleEndian, noAssert); - var bb = new ByteBuffer(capacity, littleEndian, noAssert), - bi; - i=0; while (i} buffer Anything that can be wrapped - * @param {(string|boolean)=} encoding String encoding if `buffer` is a string ("base64", "hex", "binary", defaults to - * "utf8") - * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to - * {@link ByteBuffer.DEFAULT_ENDIAN}. - * @param {boolean=} noAssert Whether to skip assertions of offsets and values. Defaults to - * {@link ByteBuffer.DEFAULT_NOASSERT}. - * @returns {!ByteBuffer} A ByteBuffer wrapping `buffer` - * @expose - */ - ByteBuffer.wrap = function(buffer, encoding, littleEndian, noAssert) { - if (typeof encoding !== 'string') { - noAssert = littleEndian; - littleEndian = encoding; - encoding = undefined; - } - if (typeof buffer === 'string') { - if (typeof encoding === 'undefined') - encoding = "utf8"; - switch (encoding) { - case "base64": - return ByteBuffer.fromBase64(buffer, littleEndian); - case "hex": - return ByteBuffer.fromHex(buffer, littleEndian); - case "binary": - return ByteBuffer.fromBinary(buffer, littleEndian); - case "utf8": - return ByteBuffer.fromUTF8(buffer, littleEndian); - case "debug": - return ByteBuffer.fromDebug(buffer, littleEndian); - default: - throw Error("Unsupported encoding: "+encoding); - } - } - if (buffer === null || typeof buffer !== 'object') - throw TypeError("Illegal buffer"); - var bb; - if (ByteBuffer.isByteBuffer(buffer)) { - bb = ByteBufferPrototype.clone.call(buffer); - bb.markedOffset = -1; - return bb; - } - if (buffer instanceof Uint8Array) { // Extract ArrayBuffer from Uint8Array - bb = new ByteBuffer(0, littleEndian, noAssert); - if (buffer.length > 0) { // Avoid references to more than one EMPTY_BUFFER - bb.buffer = buffer.buffer; - bb.offset = buffer.byteOffset; - bb.limit = buffer.byteOffset + buffer.byteLength; - bb.view = new Uint8Array(buffer.buffer); - } - } else if (buffer instanceof ArrayBuffer) { // Reuse ArrayBuffer - bb = new ByteBuffer(0, littleEndian, noAssert); - if (buffer.byteLength > 0) { - bb.buffer = buffer; - bb.offset = 0; - bb.limit = buffer.byteLength; - bb.view = buffer.byteLength > 0 ? new Uint8Array(buffer) : null; - } - } else if (Object.prototype.toString.call(buffer) === "[object Array]") { // Create from octets - bb = new ByteBuffer(buffer.length, littleEndian, noAssert); - bb.limit = buffer.length; - for (var i=0; i} value Array of booleans to write - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `length` if omitted. - * @returns {!ByteBuffer} - * @expose - */ - ByteBufferPrototype.writeBitSet = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (!(value instanceof Array)) - throw TypeError("Illegal BitSet: Not an array"); - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - - var start = offset, - bits = value.length, - bytes = (bits >> 3), - bit = 0, - k; - - offset += this.writeVarint32(bits,offset); - - while(bytes--) { - k = (!!value[bit++] & 1) | - ((!!value[bit++] & 1) << 1) | - ((!!value[bit++] & 1) << 2) | - ((!!value[bit++] & 1) << 3) | - ((!!value[bit++] & 1) << 4) | - ((!!value[bit++] & 1) << 5) | - ((!!value[bit++] & 1) << 6) | - ((!!value[bit++] & 1) << 7); - this.writeByte(k,offset++); - } - - if(bit < bits) { - var m = 0; k = 0; - while(bit < bits) k = k | ((!!value[bit++] & 1) << (m++)); - this.writeByte(k,offset++); - } - - if (relative) { - this.offset = offset; - return this; - } - return offset - start; - } - - /** - * Reads a BitSet as an array of booleans. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `length` if omitted. - * @returns {Array - * @expose - */ - ByteBufferPrototype.readBitSet = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - - var ret = this.readVarint32(offset), - bits = ret.value, - bytes = (bits >> 3), - bit = 0, - value = [], - k; - - offset += ret.length; - - while(bytes--) { - k = this.readByte(offset++); - value[bit++] = !!(k & 0x01); - value[bit++] = !!(k & 0x02); - value[bit++] = !!(k & 0x04); - value[bit++] = !!(k & 0x08); - value[bit++] = !!(k & 0x10); - value[bit++] = !!(k & 0x20); - value[bit++] = !!(k & 0x40); - value[bit++] = !!(k & 0x80); - } - - if(bit < bits) { - var m = 0; - k = this.readByte(offset++); - while(bit < bits) value[bit++] = !!((k >> (m++)) & 1); - } - - if (relative) { - this.offset = offset; - } - return value; - } - /** - * Reads the specified number of bytes. - * @param {number} length Number of bytes to read - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `length` if omitted. - * @returns {!ByteBuffer} - * @expose - */ - ByteBufferPrototype.readBytes = function(length, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + length > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+length+") <= "+this.buffer.byteLength); - } - var slice = this.slice(offset, offset + length); - if (relative) this.offset += length; - return slice; - }; - - /** - * Writes a payload of bytes. This is an alias of {@link ByteBuffer#append}. - * @function - * @param {!ByteBuffer|!ArrayBuffer|!Uint8Array|string} source Data to write. If `source` is a ByteBuffer, its offsets - * will be modified according to the performed read operation. - * @param {(string|number)=} encoding Encoding if `data` is a string ("base64", "hex", "binary", defaults to "utf8") - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * written if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeBytes = ByteBufferPrototype.append; - - // types/ints/int8 - - /** - * Writes an 8bit signed integer. - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeInt8 = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof value !== 'number' || value % 1 !== 0) - throw TypeError("Illegal value: "+value+" (not an integer)"); - value |= 0; - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - offset += 1; - var capacity0 = this.buffer.byteLength; - if (offset > capacity0) - this.resize((capacity0 *= 2) > offset ? capacity0 : offset); - offset -= 1; - this.view[offset] = value; - if (relative) this.offset += 1; - return this; - }; - - /** - * Writes an 8bit signed integer. This is an alias of {@link ByteBuffer#writeInt8}. - * @function - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeByte = ByteBufferPrototype.writeInt8; - - /** - * Reads an 8bit signed integer. - * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. - * @returns {number} Value read - * @expose - */ - ByteBufferPrototype.readInt8 = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 1 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength); - } - var value = this.view[offset]; - if ((value & 0x80) === 0x80) value = -(0xFF - value + 1); // Cast to signed - if (relative) this.offset += 1; - return value; - }; - - /** - * Reads an 8bit signed integer. This is an alias of {@link ByteBuffer#readInt8}. - * @function - * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. - * @returns {number} Value read - * @expose - */ - ByteBufferPrototype.readByte = ByteBufferPrototype.readInt8; - - /** - * Writes an 8bit unsigned integer. - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeUint8 = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof value !== 'number' || value % 1 !== 0) - throw TypeError("Illegal value: "+value+" (not an integer)"); - value >>>= 0; - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - offset += 1; - var capacity1 = this.buffer.byteLength; - if (offset > capacity1) - this.resize((capacity1 *= 2) > offset ? capacity1 : offset); - offset -= 1; - this.view[offset] = value; - if (relative) this.offset += 1; - return this; - }; - - /** - * Writes an 8bit unsigned integer. This is an alias of {@link ByteBuffer#writeUint8}. - * @function - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeUInt8 = ByteBufferPrototype.writeUint8; - - /** - * Reads an 8bit unsigned integer. - * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. - * @returns {number} Value read - * @expose - */ - ByteBufferPrototype.readUint8 = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 1 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength); - } - var value = this.view[offset]; - if (relative) this.offset += 1; - return value; - }; - - /** - * Reads an 8bit unsigned integer. This is an alias of {@link ByteBuffer#readUint8}. - * @function - * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `1` if omitted. - * @returns {number} Value read - * @expose - */ - ByteBufferPrototype.readUInt8 = ByteBufferPrototype.readUint8; - - // types/ints/int16 - - /** - * Writes a 16bit signed integer. - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. - * @throws {TypeError} If `offset` or `value` is not a valid number - * @throws {RangeError} If `offset` is out of bounds - * @expose - */ - ByteBufferPrototype.writeInt16 = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof value !== 'number' || value % 1 !== 0) - throw TypeError("Illegal value: "+value+" (not an integer)"); - value |= 0; - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - offset += 2; - var capacity2 = this.buffer.byteLength; - if (offset > capacity2) - this.resize((capacity2 *= 2) > offset ? capacity2 : offset); - offset -= 2; - if (this.littleEndian) { - this.view[offset+1] = (value & 0xFF00) >>> 8; - this.view[offset ] = value & 0x00FF; - } else { - this.view[offset] = (value & 0xFF00) >>> 8; - this.view[offset+1] = value & 0x00FF; - } - if (relative) this.offset += 2; - return this; - }; - - /** - * Writes a 16bit signed integer. This is an alias of {@link ByteBuffer#writeInt16}. - * @function - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. - * @throws {TypeError} If `offset` or `value` is not a valid number - * @throws {RangeError} If `offset` is out of bounds - * @expose - */ - ByteBufferPrototype.writeShort = ByteBufferPrototype.writeInt16; - - /** - * Reads a 16bit signed integer. - * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. - * @returns {number} Value read - * @throws {TypeError} If `offset` is not a valid number - * @throws {RangeError} If `offset` is out of bounds - * @expose - */ - ByteBufferPrototype.readInt16 = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 2 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+2+") <= "+this.buffer.byteLength); - } - var value = 0; - if (this.littleEndian) { - value = this.view[offset ]; - value |= this.view[offset+1] << 8; - } else { - value = this.view[offset ] << 8; - value |= this.view[offset+1]; - } - if ((value & 0x8000) === 0x8000) value = -(0xFFFF - value + 1); // Cast to signed - if (relative) this.offset += 2; - return value; - }; - - /** - * Reads a 16bit signed integer. This is an alias of {@link ByteBuffer#readInt16}. - * @function - * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. - * @returns {number} Value read - * @throws {TypeError} If `offset` is not a valid number - * @throws {RangeError} If `offset` is out of bounds - * @expose - */ - ByteBufferPrototype.readShort = ByteBufferPrototype.readInt16; - - /** - * Writes a 16bit unsigned integer. - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. - * @throws {TypeError} If `offset` or `value` is not a valid number - * @throws {RangeError} If `offset` is out of bounds - * @expose - */ - ByteBufferPrototype.writeUint16 = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof value !== 'number' || value % 1 !== 0) - throw TypeError("Illegal value: "+value+" (not an integer)"); - value >>>= 0; - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - offset += 2; - var capacity3 = this.buffer.byteLength; - if (offset > capacity3) - this.resize((capacity3 *= 2) > offset ? capacity3 : offset); - offset -= 2; - if (this.littleEndian) { - this.view[offset+1] = (value & 0xFF00) >>> 8; - this.view[offset ] = value & 0x00FF; - } else { - this.view[offset] = (value & 0xFF00) >>> 8; - this.view[offset+1] = value & 0x00FF; - } - if (relative) this.offset += 2; - return this; - }; - - /** - * Writes a 16bit unsigned integer. This is an alias of {@link ByteBuffer#writeUint16}. - * @function - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. - * @throws {TypeError} If `offset` or `value` is not a valid number - * @throws {RangeError} If `offset` is out of bounds - * @expose - */ - ByteBufferPrototype.writeUInt16 = ByteBufferPrototype.writeUint16; - - /** - * Reads a 16bit unsigned integer. - * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. - * @returns {number} Value read - * @throws {TypeError} If `offset` is not a valid number - * @throws {RangeError} If `offset` is out of bounds - * @expose - */ - ByteBufferPrototype.readUint16 = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 2 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+2+") <= "+this.buffer.byteLength); - } - var value = 0; - if (this.littleEndian) { - value = this.view[offset ]; - value |= this.view[offset+1] << 8; - } else { - value = this.view[offset ] << 8; - value |= this.view[offset+1]; - } - if (relative) this.offset += 2; - return value; - }; - - /** - * Reads a 16bit unsigned integer. This is an alias of {@link ByteBuffer#readUint16}. - * @function - * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `2` if omitted. - * @returns {number} Value read - * @throws {TypeError} If `offset` is not a valid number - * @throws {RangeError} If `offset` is out of bounds - * @expose - */ - ByteBufferPrototype.readUInt16 = ByteBufferPrototype.readUint16; - - // types/ints/int32 - - /** - * Writes a 32bit signed integer. - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. - * @expose - */ - ByteBufferPrototype.writeInt32 = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof value !== 'number' || value % 1 !== 0) - throw TypeError("Illegal value: "+value+" (not an integer)"); - value |= 0; - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - offset += 4; - var capacity4 = this.buffer.byteLength; - if (offset > capacity4) - this.resize((capacity4 *= 2) > offset ? capacity4 : offset); - offset -= 4; - if (this.littleEndian) { - this.view[offset+3] = (value >>> 24) & 0xFF; - this.view[offset+2] = (value >>> 16) & 0xFF; - this.view[offset+1] = (value >>> 8) & 0xFF; - this.view[offset ] = value & 0xFF; - } else { - this.view[offset ] = (value >>> 24) & 0xFF; - this.view[offset+1] = (value >>> 16) & 0xFF; - this.view[offset+2] = (value >>> 8) & 0xFF; - this.view[offset+3] = value & 0xFF; - } - if (relative) this.offset += 4; - return this; - }; - - /** - * Writes a 32bit signed integer. This is an alias of {@link ByteBuffer#writeInt32}. - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. - * @expose - */ - ByteBufferPrototype.writeInt = ByteBufferPrototype.writeInt32; - - /** - * Reads a 32bit signed integer. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. - * @returns {number} Value read - * @expose - */ - ByteBufferPrototype.readInt32 = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 4 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+4+") <= "+this.buffer.byteLength); - } - var value = 0; - if (this.littleEndian) { - value = this.view[offset+2] << 16; - value |= this.view[offset+1] << 8; - value |= this.view[offset ]; - value += this.view[offset+3] << 24 >>> 0; - } else { - value = this.view[offset+1] << 16; - value |= this.view[offset+2] << 8; - value |= this.view[offset+3]; - value += this.view[offset ] << 24 >>> 0; - } - value |= 0; // Cast to signed - if (relative) this.offset += 4; - return value; - }; - - /** - * Reads a 32bit signed integer. This is an alias of {@link ByteBuffer#readInt32}. - * @param {number=} offset Offset to read from. Will use and advance {@link ByteBuffer#offset} by `4` if omitted. - * @returns {number} Value read - * @expose - */ - ByteBufferPrototype.readInt = ByteBufferPrototype.readInt32; - - /** - * Writes a 32bit unsigned integer. - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. - * @expose - */ - ByteBufferPrototype.writeUint32 = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof value !== 'number' || value % 1 !== 0) - throw TypeError("Illegal value: "+value+" (not an integer)"); - value >>>= 0; - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - offset += 4; - var capacity5 = this.buffer.byteLength; - if (offset > capacity5) - this.resize((capacity5 *= 2) > offset ? capacity5 : offset); - offset -= 4; - if (this.littleEndian) { - this.view[offset+3] = (value >>> 24) & 0xFF; - this.view[offset+2] = (value >>> 16) & 0xFF; - this.view[offset+1] = (value >>> 8) & 0xFF; - this.view[offset ] = value & 0xFF; - } else { - this.view[offset ] = (value >>> 24) & 0xFF; - this.view[offset+1] = (value >>> 16) & 0xFF; - this.view[offset+2] = (value >>> 8) & 0xFF; - this.view[offset+3] = value & 0xFF; - } - if (relative) this.offset += 4; - return this; - }; - - /** - * Writes a 32bit unsigned integer. This is an alias of {@link ByteBuffer#writeUint32}. - * @function - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. - * @expose - */ - ByteBufferPrototype.writeUInt32 = ByteBufferPrototype.writeUint32; - - /** - * Reads a 32bit unsigned integer. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. - * @returns {number} Value read - * @expose - */ - ByteBufferPrototype.readUint32 = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 4 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+4+") <= "+this.buffer.byteLength); - } - var value = 0; - if (this.littleEndian) { - value = this.view[offset+2] << 16; - value |= this.view[offset+1] << 8; - value |= this.view[offset ]; - value += this.view[offset+3] << 24 >>> 0; - } else { - value = this.view[offset+1] << 16; - value |= this.view[offset+2] << 8; - value |= this.view[offset+3]; - value += this.view[offset ] << 24 >>> 0; - } - if (relative) this.offset += 4; - return value; - }; - - /** - * Reads a 32bit unsigned integer. This is an alias of {@link ByteBuffer#readUint32}. - * @function - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. - * @returns {number} Value read - * @expose - */ - ByteBufferPrototype.readUInt32 = ByteBufferPrototype.readUint32; - - // types/ints/int64 - - if (Long) { - - /** - * Writes a 64bit signed integer. - * @param {number|!Long} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeInt64 = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof value === 'number') - value = Long.fromNumber(value); - else if (typeof value === 'string') - value = Long.fromString(value); - else if (!(value && value instanceof Long)) - throw TypeError("Illegal value: "+value+" (not an integer or Long)"); - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - if (typeof value === 'number') - value = Long.fromNumber(value); - else if (typeof value === 'string') - value = Long.fromString(value); - offset += 8; - var capacity6 = this.buffer.byteLength; - if (offset > capacity6) - this.resize((capacity6 *= 2) > offset ? capacity6 : offset); - offset -= 8; - var lo = value.low, - hi = value.high; - if (this.littleEndian) { - this.view[offset+3] = (lo >>> 24) & 0xFF; - this.view[offset+2] = (lo >>> 16) & 0xFF; - this.view[offset+1] = (lo >>> 8) & 0xFF; - this.view[offset ] = lo & 0xFF; - offset += 4; - this.view[offset+3] = (hi >>> 24) & 0xFF; - this.view[offset+2] = (hi >>> 16) & 0xFF; - this.view[offset+1] = (hi >>> 8) & 0xFF; - this.view[offset ] = hi & 0xFF; - } else { - this.view[offset ] = (hi >>> 24) & 0xFF; - this.view[offset+1] = (hi >>> 16) & 0xFF; - this.view[offset+2] = (hi >>> 8) & 0xFF; - this.view[offset+3] = hi & 0xFF; - offset += 4; - this.view[offset ] = (lo >>> 24) & 0xFF; - this.view[offset+1] = (lo >>> 16) & 0xFF; - this.view[offset+2] = (lo >>> 8) & 0xFF; - this.view[offset+3] = lo & 0xFF; - } - if (relative) this.offset += 8; - return this; - }; - - /** - * Writes a 64bit signed integer. This is an alias of {@link ByteBuffer#writeInt64}. - * @param {number|!Long} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeLong = ByteBufferPrototype.writeInt64; - - /** - * Reads a 64bit signed integer. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. - * @returns {!Long} - * @expose - */ - ByteBufferPrototype.readInt64 = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 8 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+8+") <= "+this.buffer.byteLength); - } - var lo = 0, - hi = 0; - if (this.littleEndian) { - lo = this.view[offset+2] << 16; - lo |= this.view[offset+1] << 8; - lo |= this.view[offset ]; - lo += this.view[offset+3] << 24 >>> 0; - offset += 4; - hi = this.view[offset+2] << 16; - hi |= this.view[offset+1] << 8; - hi |= this.view[offset ]; - hi += this.view[offset+3] << 24 >>> 0; - } else { - hi = this.view[offset+1] << 16; - hi |= this.view[offset+2] << 8; - hi |= this.view[offset+3]; - hi += this.view[offset ] << 24 >>> 0; - offset += 4; - lo = this.view[offset+1] << 16; - lo |= this.view[offset+2] << 8; - lo |= this.view[offset+3]; - lo += this.view[offset ] << 24 >>> 0; - } - var value = new Long(lo, hi, false); - if (relative) this.offset += 8; - return value; - }; - - /** - * Reads a 64bit signed integer. This is an alias of {@link ByteBuffer#readInt64}. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. - * @returns {!Long} - * @expose - */ - ByteBufferPrototype.readLong = ByteBufferPrototype.readInt64; - - /** - * Writes a 64bit unsigned integer. - * @param {number|!Long} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeUint64 = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof value === 'number') - value = Long.fromNumber(value); - else if (typeof value === 'string') - value = Long.fromString(value); - else if (!(value && value instanceof Long)) - throw TypeError("Illegal value: "+value+" (not an integer or Long)"); - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - if (typeof value === 'number') - value = Long.fromNumber(value); - else if (typeof value === 'string') - value = Long.fromString(value); - offset += 8; - var capacity7 = this.buffer.byteLength; - if (offset > capacity7) - this.resize((capacity7 *= 2) > offset ? capacity7 : offset); - offset -= 8; - var lo = value.low, - hi = value.high; - if (this.littleEndian) { - this.view[offset+3] = (lo >>> 24) & 0xFF; - this.view[offset+2] = (lo >>> 16) & 0xFF; - this.view[offset+1] = (lo >>> 8) & 0xFF; - this.view[offset ] = lo & 0xFF; - offset += 4; - this.view[offset+3] = (hi >>> 24) & 0xFF; - this.view[offset+2] = (hi >>> 16) & 0xFF; - this.view[offset+1] = (hi >>> 8) & 0xFF; - this.view[offset ] = hi & 0xFF; - } else { - this.view[offset ] = (hi >>> 24) & 0xFF; - this.view[offset+1] = (hi >>> 16) & 0xFF; - this.view[offset+2] = (hi >>> 8) & 0xFF; - this.view[offset+3] = hi & 0xFF; - offset += 4; - this.view[offset ] = (lo >>> 24) & 0xFF; - this.view[offset+1] = (lo >>> 16) & 0xFF; - this.view[offset+2] = (lo >>> 8) & 0xFF; - this.view[offset+3] = lo & 0xFF; - } - if (relative) this.offset += 8; - return this; - }; - - /** - * Writes a 64bit unsigned integer. This is an alias of {@link ByteBuffer#writeUint64}. - * @function - * @param {number|!Long} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeUInt64 = ByteBufferPrototype.writeUint64; - - /** - * Reads a 64bit unsigned integer. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. - * @returns {!Long} - * @expose - */ - ByteBufferPrototype.readUint64 = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 8 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+8+") <= "+this.buffer.byteLength); - } - var lo = 0, - hi = 0; - if (this.littleEndian) { - lo = this.view[offset+2] << 16; - lo |= this.view[offset+1] << 8; - lo |= this.view[offset ]; - lo += this.view[offset+3] << 24 >>> 0; - offset += 4; - hi = this.view[offset+2] << 16; - hi |= this.view[offset+1] << 8; - hi |= this.view[offset ]; - hi += this.view[offset+3] << 24 >>> 0; - } else { - hi = this.view[offset+1] << 16; - hi |= this.view[offset+2] << 8; - hi |= this.view[offset+3]; - hi += this.view[offset ] << 24 >>> 0; - offset += 4; - lo = this.view[offset+1] << 16; - lo |= this.view[offset+2] << 8; - lo |= this.view[offset+3]; - lo += this.view[offset ] << 24 >>> 0; - } - var value = new Long(lo, hi, true); - if (relative) this.offset += 8; - return value; - }; - - /** - * Reads a 64bit unsigned integer. This is an alias of {@link ByteBuffer#readUint64}. - * @function - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. - * @returns {!Long} - * @expose - */ - ByteBufferPrototype.readUInt64 = ByteBufferPrototype.readUint64; - - } // Long - - - // types/floats/float32 - - /* - ieee754 - https://github.com/feross/ieee754 - - The MIT License (MIT) - - Copyright (c) Feross Aboukhadijeh - - 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. - */ - - /** - * Reads an IEEE754 float from a byte array. - * @param {!Array} buffer - * @param {number} offset - * @param {boolean} isLE - * @param {number} mLen - * @param {number} nBytes - * @returns {number} - * @inner - */ - function ieee754_read(buffer, offset, isLE, mLen, nBytes) { - var e, m, - eLen = nBytes * 8 - mLen - 1, - eMax = (1 << eLen) - 1, - eBias = eMax >> 1, - nBits = -7, - i = isLE ? (nBytes - 1) : 0, - d = isLE ? -1 : 1, - s = buffer[offset + i]; - - i += d; - - e = s & ((1 << (-nBits)) - 1); - s >>= (-nBits); - nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1); - e >>= (-nBits); - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity); - } else { - m = m + Math.pow(2, mLen); - e = e - eBias; - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen); - } - - /** - * Writes an IEEE754 float to a byte array. - * @param {!Array} buffer - * @param {number} value - * @param {number} offset - * @param {boolean} isLE - * @param {number} mLen - * @param {number} nBytes - * @inner - */ - function ieee754_write(buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c, - eLen = nBytes * 8 - mLen - 1, - eMax = (1 << eLen) - 1, - eBias = eMax >> 1, - rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0), - i = isLE ? 0 : (nBytes - 1), - d = isLE ? 1 : -1, - s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; - - value = Math.abs(value); - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; - } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e + eBias >= 1) { - value += rt / c; - } else { - value += rt * Math.pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } - - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m; - eLen += mLen; - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128; - } - - /** - * Writes a 32bit float. - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeFloat32 = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof value !== 'number') - throw TypeError("Illegal value: "+value+" (not a number)"); - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - offset += 4; - var capacity8 = this.buffer.byteLength; - if (offset > capacity8) - this.resize((capacity8 *= 2) > offset ? capacity8 : offset); - offset -= 4; - ieee754_write(this.view, value, offset, this.littleEndian, 23, 4); - if (relative) this.offset += 4; - return this; - }; - - /** - * Writes a 32bit float. This is an alias of {@link ByteBuffer#writeFloat32}. - * @function - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeFloat = ByteBufferPrototype.writeFloat32; - - /** - * Reads a 32bit float. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. - * @returns {number} - * @expose - */ - ByteBufferPrototype.readFloat32 = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 4 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+4+") <= "+this.buffer.byteLength); - } - var value = ieee754_read(this.view, offset, this.littleEndian, 23, 4); - if (relative) this.offset += 4; - return value; - }; - - /** - * Reads a 32bit float. This is an alias of {@link ByteBuffer#readFloat32}. - * @function - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `4` if omitted. - * @returns {number} - * @expose - */ - ByteBufferPrototype.readFloat = ByteBufferPrototype.readFloat32; - - // types/floats/float64 - - /** - * Writes a 64bit float. - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeFloat64 = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof value !== 'number') - throw TypeError("Illegal value: "+value+" (not a number)"); - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - offset += 8; - var capacity9 = this.buffer.byteLength; - if (offset > capacity9) - this.resize((capacity9 *= 2) > offset ? capacity9 : offset); - offset -= 8; - ieee754_write(this.view, value, offset, this.littleEndian, 52, 8); - if (relative) this.offset += 8; - return this; - }; - - /** - * Writes a 64bit float. This is an alias of {@link ByteBuffer#writeFloat64}. - * @function - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.writeDouble = ByteBufferPrototype.writeFloat64; - - /** - * Reads a 64bit float. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. - * @returns {number} - * @expose - */ - ByteBufferPrototype.readFloat64 = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 8 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+8+") <= "+this.buffer.byteLength); - } - var value = ieee754_read(this.view, offset, this.littleEndian, 52, 8); - if (relative) this.offset += 8; - return value; - }; - - /** - * Reads a 64bit float. This is an alias of {@link ByteBuffer#readFloat64}. - * @function - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by `8` if omitted. - * @returns {number} - * @expose - */ - ByteBufferPrototype.readDouble = ByteBufferPrototype.readFloat64; - - - // types/varints/varint32 - - /** - * Maximum number of bytes required to store a 32bit base 128 variable-length integer. - * @type {number} - * @const - * @expose - */ - ByteBuffer.MAX_VARINT32_BYTES = 5; - - /** - * Calculates the actual number of bytes required to store a 32bit base 128 variable-length integer. - * @param {number} value Value to encode - * @returns {number} Number of bytes required. Capped to {@link ByteBuffer.MAX_VARINT32_BYTES} - * @expose - */ - ByteBuffer.calculateVarint32 = function(value) { - // ref: src/google/protobuf/io/coded_stream.cc - value = value >>> 0; - if (value < 1 << 7 ) return 1; - else if (value < 1 << 14) return 2; - else if (value < 1 << 21) return 3; - else if (value < 1 << 28) return 4; - else return 5; - }; - - /** - * Zigzag encodes a signed 32bit integer so that it can be effectively used with varint encoding. - * @param {number} n Signed 32bit integer - * @returns {number} Unsigned zigzag encoded 32bit integer - * @expose - */ - ByteBuffer.zigZagEncode32 = function(n) { - return (((n |= 0) << 1) ^ (n >> 31)) >>> 0; // ref: src/google/protobuf/wire_format_lite.h - }; - - /** - * Decodes a zigzag encoded signed 32bit integer. - * @param {number} n Unsigned zigzag encoded 32bit integer - * @returns {number} Signed 32bit integer - * @expose - */ - ByteBuffer.zigZagDecode32 = function(n) { - return ((n >>> 1) ^ -(n & 1)) | 0; // // ref: src/google/protobuf/wire_format_lite.h - }; - - /** - * Writes a 32bit base 128 variable-length integer. - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * written if omitted. - * @returns {!ByteBuffer|number} this if `offset` is omitted, else the actual number of bytes written - * @expose - */ - ByteBufferPrototype.writeVarint32 = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof value !== 'number' || value % 1 !== 0) - throw TypeError("Illegal value: "+value+" (not an integer)"); - value |= 0; - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - var size = ByteBuffer.calculateVarint32(value), - b; - offset += size; - var capacity10 = this.buffer.byteLength; - if (offset > capacity10) - this.resize((capacity10 *= 2) > offset ? capacity10 : offset); - offset -= size; - value >>>= 0; - while (value >= 0x80) { - b = (value & 0x7f) | 0x80; - this.view[offset++] = b; - value >>>= 7; - } - this.view[offset++] = value; - if (relative) { - this.offset = offset; - return this; - } - return size; - }; - - /** - * Writes a zig-zag encoded (signed) 32bit base 128 variable-length integer. - * @param {number} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * written if omitted. - * @returns {!ByteBuffer|number} this if `offset` is omitted, else the actual number of bytes written - * @expose - */ - ByteBufferPrototype.writeVarint32ZigZag = function(value, offset) { - return this.writeVarint32(ByteBuffer.zigZagEncode32(value), offset); - }; - - /** - * Reads a 32bit base 128 variable-length integer. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * written if omitted. - * @returns {number|!{value: number, length: number}} The value read if offset is omitted, else the value read - * and the actual number of bytes read. - * @throws {Error} If it's not a valid varint. Has a property `truncated = true` if there is not enough data available - * to fully decode the varint. - * @expose - */ - ByteBufferPrototype.readVarint32 = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 1 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength); - } - var c = 0, - value = 0 >>> 0, - b; - do { - if (!this.noAssert && offset > this.limit) { - var err = Error("Truncated"); - err['truncated'] = true; - throw err; - } - b = this.view[offset++]; - if (c < 5) - value |= (b & 0x7f) << (7*c); - ++c; - } while ((b & 0x80) !== 0); - value |= 0; - if (relative) { - this.offset = offset; - return value; - } - return { - "value": value, - "length": c - }; - }; - - /** - * Reads a zig-zag encoded (signed) 32bit base 128 variable-length integer. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * written if omitted. - * @returns {number|!{value: number, length: number}} The value read if offset is omitted, else the value read - * and the actual number of bytes read. - * @throws {Error} If it's not a valid varint - * @expose - */ - ByteBufferPrototype.readVarint32ZigZag = function(offset) { - var val = this.readVarint32(offset); - if (typeof val === 'object') - val["value"] = ByteBuffer.zigZagDecode32(val["value"]); - else - val = ByteBuffer.zigZagDecode32(val); - return val; - }; - - // types/varints/varint64 - - if (Long) { - - /** - * Maximum number of bytes required to store a 64bit base 128 variable-length integer. - * @type {number} - * @const - * @expose - */ - ByteBuffer.MAX_VARINT64_BYTES = 10; - - /** - * Calculates the actual number of bytes required to store a 64bit base 128 variable-length integer. - * @param {number|!Long} value Value to encode - * @returns {number} Number of bytes required. Capped to {@link ByteBuffer.MAX_VARINT64_BYTES} - * @expose - */ - ByteBuffer.calculateVarint64 = function(value) { - if (typeof value === 'number') - value = Long.fromNumber(value); - else if (typeof value === 'string') - value = Long.fromString(value); - // ref: src/google/protobuf/io/coded_stream.cc - var part0 = value.toInt() >>> 0, - part1 = value.shiftRightUnsigned(28).toInt() >>> 0, - part2 = value.shiftRightUnsigned(56).toInt() >>> 0; - if (part2 == 0) { - if (part1 == 0) { - if (part0 < 1 << 14) - return part0 < 1 << 7 ? 1 : 2; - else - return part0 < 1 << 21 ? 3 : 4; - } else { - if (part1 < 1 << 14) - return part1 < 1 << 7 ? 5 : 6; - else - return part1 < 1 << 21 ? 7 : 8; - } - } else - return part2 < 1 << 7 ? 9 : 10; - }; - - /** - * Zigzag encodes a signed 64bit integer so that it can be effectively used with varint encoding. - * @param {number|!Long} value Signed long - * @returns {!Long} Unsigned zigzag encoded long - * @expose - */ - ByteBuffer.zigZagEncode64 = function(value) { - if (typeof value === 'number') - value = Long.fromNumber(value, false); - else if (typeof value === 'string') - value = Long.fromString(value, false); - else if (value.unsigned !== false) value = value.toSigned(); - // ref: src/google/protobuf/wire_format_lite.h - return value.shiftLeft(1).xor(value.shiftRight(63)).toUnsigned(); - }; - - /** - * Decodes a zigzag encoded signed 64bit integer. - * @param {!Long|number} value Unsigned zigzag encoded long or JavaScript number - * @returns {!Long} Signed long - * @expose - */ - ByteBuffer.zigZagDecode64 = function(value) { - if (typeof value === 'number') - value = Long.fromNumber(value, false); - else if (typeof value === 'string') - value = Long.fromString(value, false); - else if (value.unsigned !== false) value = value.toSigned(); - // ref: src/google/protobuf/wire_format_lite.h - return value.shiftRightUnsigned(1).xor(value.and(Long.ONE).toSigned().negate()).toSigned(); - }; - - /** - * Writes a 64bit base 128 variable-length integer. - * @param {number|Long} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * written if omitted. - * @returns {!ByteBuffer|number} `this` if offset is omitted, else the actual number of bytes written. - * @expose - */ - ByteBufferPrototype.writeVarint64 = function(value, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof value === 'number') - value = Long.fromNumber(value); - else if (typeof value === 'string') - value = Long.fromString(value); - else if (!(value && value instanceof Long)) - throw TypeError("Illegal value: "+value+" (not an integer or Long)"); - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - if (typeof value === 'number') - value = Long.fromNumber(value, false); - else if (typeof value === 'string') - value = Long.fromString(value, false); - else if (value.unsigned !== false) value = value.toSigned(); - var size = ByteBuffer.calculateVarint64(value), - part0 = value.toInt() >>> 0, - part1 = value.shiftRightUnsigned(28).toInt() >>> 0, - part2 = value.shiftRightUnsigned(56).toInt() >>> 0; - offset += size; - var capacity11 = this.buffer.byteLength; - if (offset > capacity11) - this.resize((capacity11 *= 2) > offset ? capacity11 : offset); - offset -= size; - switch (size) { - case 10: this.view[offset+9] = (part2 >>> 7) & 0x01; - case 9 : this.view[offset+8] = size !== 9 ? (part2 ) | 0x80 : (part2 ) & 0x7F; - case 8 : this.view[offset+7] = size !== 8 ? (part1 >>> 21) | 0x80 : (part1 >>> 21) & 0x7F; - case 7 : this.view[offset+6] = size !== 7 ? (part1 >>> 14) | 0x80 : (part1 >>> 14) & 0x7F; - case 6 : this.view[offset+5] = size !== 6 ? (part1 >>> 7) | 0x80 : (part1 >>> 7) & 0x7F; - case 5 : this.view[offset+4] = size !== 5 ? (part1 ) | 0x80 : (part1 ) & 0x7F; - case 4 : this.view[offset+3] = size !== 4 ? (part0 >>> 21) | 0x80 : (part0 >>> 21) & 0x7F; - case 3 : this.view[offset+2] = size !== 3 ? (part0 >>> 14) | 0x80 : (part0 >>> 14) & 0x7F; - case 2 : this.view[offset+1] = size !== 2 ? (part0 >>> 7) | 0x80 : (part0 >>> 7) & 0x7F; - case 1 : this.view[offset ] = size !== 1 ? (part0 ) | 0x80 : (part0 ) & 0x7F; - } - if (relative) { - this.offset += size; - return this; - } else { - return size; - } - }; - - /** - * Writes a zig-zag encoded 64bit base 128 variable-length integer. - * @param {number|Long} value Value to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * written if omitted. - * @returns {!ByteBuffer|number} `this` if offset is omitted, else the actual number of bytes written. - * @expose - */ - ByteBufferPrototype.writeVarint64ZigZag = function(value, offset) { - return this.writeVarint64(ByteBuffer.zigZagEncode64(value), offset); - }; - - /** - * Reads a 64bit base 128 variable-length integer. Requires Long.js. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * read if omitted. - * @returns {!Long|!{value: Long, length: number}} The value read if offset is omitted, else the value read and - * the actual number of bytes read. - * @throws {Error} If it's not a valid varint - * @expose - */ - ByteBufferPrototype.readVarint64 = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 1 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength); - } - // ref: src/google/protobuf/io/coded_stream.cc - var start = offset, - part0 = 0, - part1 = 0, - part2 = 0, - b = 0; - b = this.view[offset++]; part0 = (b & 0x7F) ; if ( b & 0x80 ) { - b = this.view[offset++]; part0 |= (b & 0x7F) << 7; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { - b = this.view[offset++]; part0 |= (b & 0x7F) << 14; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { - b = this.view[offset++]; part0 |= (b & 0x7F) << 21; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { - b = this.view[offset++]; part1 = (b & 0x7F) ; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { - b = this.view[offset++]; part1 |= (b & 0x7F) << 7; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { - b = this.view[offset++]; part1 |= (b & 0x7F) << 14; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { - b = this.view[offset++]; part1 |= (b & 0x7F) << 21; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { - b = this.view[offset++]; part2 = (b & 0x7F) ; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { - b = this.view[offset++]; part2 |= (b & 0x7F) << 7; if ((b & 0x80) || (this.noAssert && typeof b === 'undefined')) { - throw Error("Buffer overrun"); }}}}}}}}}} - var value = Long.fromBits(part0 | (part1 << 28), (part1 >>> 4) | (part2) << 24, false); - if (relative) { - this.offset = offset; - return value; - } else { - return { - 'value': value, - 'length': offset-start - }; - } - }; - - /** - * Reads a zig-zag encoded 64bit base 128 variable-length integer. Requires Long.js. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * read if omitted. - * @returns {!Long|!{value: Long, length: number}} The value read if offset is omitted, else the value read and - * the actual number of bytes read. - * @throws {Error} If it's not a valid varint - * @expose - */ - ByteBufferPrototype.readVarint64ZigZag = function(offset) { - var val = this.readVarint64(offset); - if (val && val['value'] instanceof Long) - val["value"] = ByteBuffer.zigZagDecode64(val["value"]); - else - val = ByteBuffer.zigZagDecode64(val); - return val; - }; - - } // Long - - - // types/strings/cstring - - /** - * Writes a NULL-terminated UTF8 encoded string. For this to work the specified string must not contain any NULL - * characters itself. - * @param {string} str String to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * contained in `str` + 1 if omitted. - * @returns {!ByteBuffer|number} this if offset is omitted, else the actual number of bytes written - * @expose - */ - ByteBufferPrototype.writeCString = function(str, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - var i, - k = str.length; - if (!this.noAssert) { - if (typeof str !== 'string') - throw TypeError("Illegal str: Not a string"); - for (i=0; i>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - // UTF8 strings do not contain zero bytes in between except for the zero character, so: - k = utfx.calculateUTF16asUTF8(stringSource(str))[1]; - offset += k+1; - var capacity12 = this.buffer.byteLength; - if (offset > capacity12) - this.resize((capacity12 *= 2) > offset ? capacity12 : offset); - offset -= k+1; - utfx.encodeUTF16toUTF8(stringSource(str), function(b) { - this.view[offset++] = b; - }.bind(this)); - this.view[offset++] = 0; - if (relative) { - this.offset = offset; - return this; - } - return k; - }; - - /** - * Reads a NULL-terminated UTF8 encoded string. For this to work the string read must not contain any NULL characters - * itself. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * read if omitted. - * @returns {string|!{string: string, length: number}} The string read if offset is omitted, else the string - * read and the actual number of bytes read. - * @expose - */ - ByteBufferPrototype.readCString = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 1 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength); - } - var start = offset, - temp; - // UTF8 strings do not contain zero bytes in between except for the zero character itself, so: - var sd, b = -1; - utfx.decodeUTF8toUTF16(function() { - if (b === 0) return null; - if (offset >= this.limit) - throw RangeError("Illegal range: Truncated data, "+offset+" < "+this.limit); - b = this.view[offset++]; - return b === 0 ? null : b; - }.bind(this), sd = stringDestination(), true); - if (relative) { - this.offset = offset; - return sd(); - } else { - return { - "string": sd(), - "length": offset - start - }; - } - }; - - // types/strings/istring - - /** - * Writes a length as uint32 prefixed UTF8 encoded string. - * @param {string} str String to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * written if omitted. - * @returns {!ByteBuffer|number} `this` if `offset` is omitted, else the actual number of bytes written - * @expose - * @see ByteBuffer#writeVarint32 - */ - ByteBufferPrototype.writeIString = function(str, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof str !== 'string') - throw TypeError("Illegal str: Not a string"); - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - var start = offset, - k; - k = utfx.calculateUTF16asUTF8(stringSource(str), this.noAssert)[1]; - offset += 4+k; - var capacity13 = this.buffer.byteLength; - if (offset > capacity13) - this.resize((capacity13 *= 2) > offset ? capacity13 : offset); - offset -= 4+k; - if (this.littleEndian) { - this.view[offset+3] = (k >>> 24) & 0xFF; - this.view[offset+2] = (k >>> 16) & 0xFF; - this.view[offset+1] = (k >>> 8) & 0xFF; - this.view[offset ] = k & 0xFF; - } else { - this.view[offset ] = (k >>> 24) & 0xFF; - this.view[offset+1] = (k >>> 16) & 0xFF; - this.view[offset+2] = (k >>> 8) & 0xFF; - this.view[offset+3] = k & 0xFF; - } - offset += 4; - utfx.encodeUTF16toUTF8(stringSource(str), function(b) { - this.view[offset++] = b; - }.bind(this)); - if (offset !== start + 4 + k) - throw RangeError("Illegal range: Truncated data, "+offset+" == "+(offset+4+k)); - if (relative) { - this.offset = offset; - return this; - } - return offset - start; - }; - - /** - * Reads a length as uint32 prefixed UTF8 encoded string. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * read if omitted. - * @returns {string|!{string: string, length: number}} The string read if offset is omitted, else the string - * read and the actual number of bytes read. - * @expose - * @see ByteBuffer#readVarint32 - */ - ByteBufferPrototype.readIString = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 4 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+4+") <= "+this.buffer.byteLength); - } - var start = offset; - var len = this.readUint32(offset); - var str = this.readUTF8String(len, ByteBuffer.METRICS_BYTES, offset += 4); - offset += str['length']; - if (relative) { - this.offset = offset; - return str['string']; - } else { - return { - 'string': str['string'], - 'length': offset - start - }; - } - }; - - // types/strings/utf8string - - /** - * Metrics representing number of UTF8 characters. Evaluates to `c`. - * @type {string} - * @const - * @expose - */ - ByteBuffer.METRICS_CHARS = 'c'; - - /** - * Metrics representing number of bytes. Evaluates to `b`. - * @type {string} - * @const - * @expose - */ - ByteBuffer.METRICS_BYTES = 'b'; - - /** - * Writes an UTF8 encoded string. - * @param {string} str String to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} if omitted. - * @returns {!ByteBuffer|number} this if offset is omitted, else the actual number of bytes written. - * @expose - */ - ByteBufferPrototype.writeUTF8String = function(str, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - var k; - var start = offset; - k = utfx.calculateUTF16asUTF8(stringSource(str))[1]; - offset += k; - var capacity14 = this.buffer.byteLength; - if (offset > capacity14) - this.resize((capacity14 *= 2) > offset ? capacity14 : offset); - offset -= k; - utfx.encodeUTF16toUTF8(stringSource(str), function(b) { - this.view[offset++] = b; - }.bind(this)); - if (relative) { - this.offset = offset; - return this; - } - return offset - start; - }; - - /** - * Writes an UTF8 encoded string. This is an alias of {@link ByteBuffer#writeUTF8String}. - * @function - * @param {string} str String to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} if omitted. - * @returns {!ByteBuffer|number} this if offset is omitted, else the actual number of bytes written. - * @expose - */ - ByteBufferPrototype.writeString = ByteBufferPrototype.writeUTF8String; - - /** - * Calculates the number of UTF8 characters of a string. JavaScript itself uses UTF-16, so that a string's - * `length` property does not reflect its actual UTF8 size if it contains code points larger than 0xFFFF. - * @param {string} str String to calculate - * @returns {number} Number of UTF8 characters - * @expose - */ - ByteBuffer.calculateUTF8Chars = function(str) { - return utfx.calculateUTF16asUTF8(stringSource(str))[0]; - }; - - /** - * Calculates the number of UTF8 bytes of a string. - * @param {string} str String to calculate - * @returns {number} Number of UTF8 bytes - * @expose - */ - ByteBuffer.calculateUTF8Bytes = function(str) { - return utfx.calculateUTF16asUTF8(stringSource(str))[1]; - }; - - /** - * Calculates the number of UTF8 bytes of a string. This is an alias of {@link ByteBuffer.calculateUTF8Bytes}. - * @function - * @param {string} str String to calculate - * @returns {number} Number of UTF8 bytes - * @expose - */ - ByteBuffer.calculateString = ByteBuffer.calculateUTF8Bytes; - - /** - * Reads an UTF8 encoded string. - * @param {number} length Number of characters or bytes to read. - * @param {string=} metrics Metrics specifying what `length` is meant to count. Defaults to - * {@link ByteBuffer.METRICS_CHARS}. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * read if omitted. - * @returns {string|!{string: string, length: number}} The string read if offset is omitted, else the string - * read and the actual number of bytes read. - * @expose - */ - ByteBufferPrototype.readUTF8String = function(length, metrics, offset) { - if (typeof metrics === 'number') { - offset = metrics; - metrics = undefined; - } - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (typeof metrics === 'undefined') metrics = ByteBuffer.METRICS_CHARS; - if (!this.noAssert) { - if (typeof length !== 'number' || length % 1 !== 0) - throw TypeError("Illegal length: "+length+" (not an integer)"); - length |= 0; - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - var i = 0, - start = offset, - sd; - if (metrics === ByteBuffer.METRICS_CHARS) { // The same for node and the browser - sd = stringDestination(); - utfx.decodeUTF8(function() { - return i < length && offset < this.limit ? this.view[offset++] : null; - }.bind(this), function(cp) { - ++i; utfx.UTF8toUTF16(cp, sd); - }); - if (i !== length) - throw RangeError("Illegal range: Truncated data, "+i+" == "+length); - if (relative) { - this.offset = offset; - return sd(); - } else { - return { - "string": sd(), - "length": offset - start - }; - } - } else if (metrics === ByteBuffer.METRICS_BYTES) { - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + length > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+length+") <= "+this.buffer.byteLength); - } - var k = offset + length; - utfx.decodeUTF8toUTF16(function() { - return offset < k ? this.view[offset++] : null; - }.bind(this), sd = stringDestination(), this.noAssert); - if (offset !== k) - throw RangeError("Illegal range: Truncated data, "+offset+" == "+k); - if (relative) { - this.offset = offset; - return sd(); - } else { - return { - 'string': sd(), - 'length': offset - start - }; - } - } else - throw TypeError("Unsupported metrics: "+metrics); - }; - - /** - * Reads an UTF8 encoded string. This is an alias of {@link ByteBuffer#readUTF8String}. - * @function - * @param {number} length Number of characters or bytes to read - * @param {number=} metrics Metrics specifying what `n` is meant to count. Defaults to - * {@link ByteBuffer.METRICS_CHARS}. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * read if omitted. - * @returns {string|!{string: string, length: number}} The string read if offset is omitted, else the string - * read and the actual number of bytes read. - * @expose - */ - ByteBufferPrototype.readString = ByteBufferPrototype.readUTF8String; - - // types/strings/vstring - - /** - * Writes a length as varint32 prefixed UTF8 encoded string. - * @param {string} str String to write - * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * written if omitted. - * @returns {!ByteBuffer|number} `this` if `offset` is omitted, else the actual number of bytes written - * @expose - * @see ByteBuffer#writeVarint32 - */ - ByteBufferPrototype.writeVString = function(str, offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof str !== 'string') - throw TypeError("Illegal str: Not a string"); - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - var start = offset, - k, l; - k = utfx.calculateUTF16asUTF8(stringSource(str), this.noAssert)[1]; - l = ByteBuffer.calculateVarint32(k); - offset += l+k; - var capacity15 = this.buffer.byteLength; - if (offset > capacity15) - this.resize((capacity15 *= 2) > offset ? capacity15 : offset); - offset -= l+k; - offset += this.writeVarint32(k, offset); - utfx.encodeUTF16toUTF8(stringSource(str), function(b) { - this.view[offset++] = b; - }.bind(this)); - if (offset !== start+k+l) - throw RangeError("Illegal range: Truncated data, "+offset+" == "+(offset+k+l)); - if (relative) { - this.offset = offset; - return this; - } - return offset - start; - }; - - /** - * Reads a length as varint32 prefixed UTF8 encoded string. - * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * read if omitted. - * @returns {string|!{string: string, length: number}} The string read if offset is omitted, else the string - * read and the actual number of bytes read. - * @expose - * @see ByteBuffer#readVarint32 - */ - ByteBufferPrototype.readVString = function(offset) { - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 1 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength); - } - var start = offset; - var len = this.readVarint32(offset); - var str = this.readUTF8String(len['value'], ByteBuffer.METRICS_BYTES, offset += len['length']); - offset += str['length']; - if (relative) { - this.offset = offset; - return str['string']; - } else { - return { - 'string': str['string'], - 'length': offset - start - }; - } - }; - - - /** - * Appends some data to this ByteBuffer. This will overwrite any contents behind the specified offset up to the appended - * data's length. - * @param {!ByteBuffer|!ArrayBuffer|!Uint8Array|string} source Data to append. If `source` is a ByteBuffer, its offsets - * will be modified according to the performed read operation. - * @param {(string|number)=} encoding Encoding if `data` is a string ("base64", "hex", "binary", defaults to "utf8") - * @param {number=} offset Offset to append at. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * written if omitted. - * @returns {!ByteBuffer} this - * @expose - * @example A relative `<01 02>03.append(<04 05>)` will result in `<01 02 04 05>, 04 05|` - * @example An absolute `<01 02>03.append(04 05>, 1)` will result in `<01 04>05, 04 05|` - */ - ByteBufferPrototype.append = function(source, encoding, offset) { - if (typeof encoding === 'number' || typeof encoding !== 'string') { - offset = encoding; - encoding = undefined; - } - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - if (!(source instanceof ByteBuffer)) - source = ByteBuffer.wrap(source, encoding); - var length = source.limit - source.offset; - if (length <= 0) return this; // Nothing to append - offset += length; - var capacity16 = this.buffer.byteLength; - if (offset > capacity16) - this.resize((capacity16 *= 2) > offset ? capacity16 : offset); - offset -= length; - this.view.set(source.view.subarray(source.offset, source.limit), offset); - source.offset += length; - if (relative) this.offset += length; - return this; - }; - - /** - * Appends this ByteBuffer's contents to another ByteBuffer. This will overwrite any contents at and after the - specified offset up to the length of this ByteBuffer's data. - * @param {!ByteBuffer} target Target ByteBuffer - * @param {number=} offset Offset to append to. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * read if omitted. - * @returns {!ByteBuffer} this - * @expose - * @see ByteBuffer#append - */ - ByteBufferPrototype.appendTo = function(target, offset) { - target.append(this, offset); - return this; - }; - - /** - * Enables or disables assertions of argument types and offsets. Assertions are enabled by default but you can opt to - * disable them if your code already makes sure that everything is valid. - * @param {boolean} assert `true` to enable assertions, otherwise `false` - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.assert = function(assert) { - this.noAssert = !assert; - return this; - }; - - /** - * Gets the capacity of this ByteBuffer's backing buffer. - * @returns {number} Capacity of the backing buffer - * @expose - */ - ByteBufferPrototype.capacity = function() { - return this.buffer.byteLength; - }; - /** - * Clears this ByteBuffer's offsets by setting {@link ByteBuffer#offset} to `0` and {@link ByteBuffer#limit} to the - * backing buffer's capacity. Discards {@link ByteBuffer#markedOffset}. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.clear = function() { - this.offset = 0; - this.limit = this.buffer.byteLength; - this.markedOffset = -1; - return this; - }; - - /** - * Creates a cloned instance of this ByteBuffer, preset with this ByteBuffer's values for {@link ByteBuffer#offset}, - * {@link ByteBuffer#markedOffset} and {@link ByteBuffer#limit}. - * @param {boolean=} copy Whether to copy the backing buffer or to return another view on the same, defaults to `false` - * @returns {!ByteBuffer} Cloned instance - * @expose - */ - ByteBufferPrototype.clone = function(copy) { - var bb = new ByteBuffer(0, this.littleEndian, this.noAssert); - if (copy) { - bb.buffer = new ArrayBuffer(this.buffer.byteLength); - bb.view = new Uint8Array(bb.buffer); - } else { - bb.buffer = this.buffer; - bb.view = this.view; - } - bb.offset = this.offset; - bb.markedOffset = this.markedOffset; - bb.limit = this.limit; - return bb; - }; - - /** - * Compacts this ByteBuffer to be backed by a {@link ByteBuffer#buffer} of its contents' length. Contents are the bytes - * between {@link ByteBuffer#offset} and {@link ByteBuffer#limit}. Will set `offset = 0` and `limit = capacity` and - * adapt {@link ByteBuffer#markedOffset} to the same relative position if set. - * @param {number=} begin Offset to start at, defaults to {@link ByteBuffer#offset} - * @param {number=} end Offset to end at, defaults to {@link ByteBuffer#limit} - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.compact = function(begin, end) { - if (typeof begin === 'undefined') begin = this.offset; - if (typeof end === 'undefined') end = this.limit; - if (!this.noAssert) { - if (typeof begin !== 'number' || begin % 1 !== 0) - throw TypeError("Illegal begin: Not an integer"); - begin >>>= 0; - if (typeof end !== 'number' || end % 1 !== 0) - throw TypeError("Illegal end: Not an integer"); - end >>>= 0; - if (begin < 0 || begin > end || end > this.buffer.byteLength) - throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); - } - if (begin === 0 && end === this.buffer.byteLength) - return this; // Already compacted - var len = end - begin; - if (len === 0) { - this.buffer = EMPTY_BUFFER; - this.view = null; - if (this.markedOffset >= 0) this.markedOffset -= begin; - this.offset = 0; - this.limit = 0; - return this; - } - var buffer = new ArrayBuffer(len); - var view = new Uint8Array(buffer); - view.set(this.view.subarray(begin, end)); - this.buffer = buffer; - this.view = view; - if (this.markedOffset >= 0) this.markedOffset -= begin; - this.offset = 0; - this.limit = len; - return this; - }; - - /** - * Creates a copy of this ByteBuffer's contents. Contents are the bytes between {@link ByteBuffer#offset} and - * {@link ByteBuffer#limit}. - * @param {number=} begin Begin offset, defaults to {@link ByteBuffer#offset}. - * @param {number=} end End offset, defaults to {@link ByteBuffer#limit}. - * @returns {!ByteBuffer} Copy - * @expose - */ - ByteBufferPrototype.copy = function(begin, end) { - if (typeof begin === 'undefined') begin = this.offset; - if (typeof end === 'undefined') end = this.limit; - if (!this.noAssert) { - if (typeof begin !== 'number' || begin % 1 !== 0) - throw TypeError("Illegal begin: Not an integer"); - begin >>>= 0; - if (typeof end !== 'number' || end % 1 !== 0) - throw TypeError("Illegal end: Not an integer"); - end >>>= 0; - if (begin < 0 || begin > end || end > this.buffer.byteLength) - throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); - } - if (begin === end) - return new ByteBuffer(0, this.littleEndian, this.noAssert); - var capacity = end - begin, - bb = new ByteBuffer(capacity, this.littleEndian, this.noAssert); - bb.offset = 0; - bb.limit = capacity; - if (bb.markedOffset >= 0) bb.markedOffset -= begin; - this.copyTo(bb, 0, begin, end); - return bb; - }; - - /** - * Copies this ByteBuffer's contents to another ByteBuffer. Contents are the bytes between {@link ByteBuffer#offset} and - * {@link ByteBuffer#limit}. - * @param {!ByteBuffer} target Target ByteBuffer - * @param {number=} targetOffset Offset to copy to. Will use and increase the target's {@link ByteBuffer#offset} - * by the number of bytes copied if omitted. - * @param {number=} sourceOffset Offset to start copying from. Will use and increase {@link ByteBuffer#offset} by the - * number of bytes copied if omitted. - * @param {number=} sourceLimit Offset to end copying from, defaults to {@link ByteBuffer#limit} - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.copyTo = function(target, targetOffset, sourceOffset, sourceLimit) { - var relative, - targetRelative; - if (!this.noAssert) { - if (!ByteBuffer.isByteBuffer(target)) - throw TypeError("Illegal target: Not a ByteBuffer"); - } - targetOffset = (targetRelative = typeof targetOffset === 'undefined') ? target.offset : targetOffset | 0; - sourceOffset = (relative = typeof sourceOffset === 'undefined') ? this.offset : sourceOffset | 0; - sourceLimit = typeof sourceLimit === 'undefined' ? this.limit : sourceLimit | 0; - - if (targetOffset < 0 || targetOffset > target.buffer.byteLength) - throw RangeError("Illegal target range: 0 <= "+targetOffset+" <= "+target.buffer.byteLength); - if (sourceOffset < 0 || sourceLimit > this.buffer.byteLength) - throw RangeError("Illegal source range: 0 <= "+sourceOffset+" <= "+this.buffer.byteLength); - - var len = sourceLimit - sourceOffset; - if (len === 0) - return target; // Nothing to copy - - target.ensureCapacity(targetOffset + len); - - target.view.set(this.view.subarray(sourceOffset, sourceLimit), targetOffset); - - if (relative) this.offset += len; - if (targetRelative) target.offset += len; - - return this; - }; - - /** - * Makes sure that this ByteBuffer is backed by a {@link ByteBuffer#buffer} of at least the specified capacity. If the - * current capacity is exceeded, it will be doubled. If double the current capacity is less than the required capacity, - * the required capacity will be used instead. - * @param {number} capacity Required capacity - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.ensureCapacity = function(capacity) { - var current = this.buffer.byteLength; - if (current < capacity) - return this.resize((current *= 2) > capacity ? current : capacity); - return this; - }; - - /** - * Overwrites this ByteBuffer's contents with the specified value. Contents are the bytes between - * {@link ByteBuffer#offset} and {@link ByteBuffer#limit}. - * @param {number|string} value Byte value to fill with. If given as a string, the first character is used. - * @param {number=} begin Begin offset. Will use and increase {@link ByteBuffer#offset} by the number of bytes - * written if omitted. defaults to {@link ByteBuffer#offset}. - * @param {number=} end End offset, defaults to {@link ByteBuffer#limit}. - * @returns {!ByteBuffer} this - * @expose - * @example `someByteBuffer.clear().fill(0)` fills the entire backing buffer with zeroes - */ - ByteBufferPrototype.fill = function(value, begin, end) { - var relative = typeof begin === 'undefined'; - if (relative) begin = this.offset; - if (typeof value === 'string' && value.length > 0) - value = value.charCodeAt(0); - if (typeof begin === 'undefined') begin = this.offset; - if (typeof end === 'undefined') end = this.limit; - if (!this.noAssert) { - if (typeof value !== 'number' || value % 1 !== 0) - throw TypeError("Illegal value: "+value+" (not an integer)"); - value |= 0; - if (typeof begin !== 'number' || begin % 1 !== 0) - throw TypeError("Illegal begin: Not an integer"); - begin >>>= 0; - if (typeof end !== 'number' || end % 1 !== 0) - throw TypeError("Illegal end: Not an integer"); - end >>>= 0; - if (begin < 0 || begin > end || end > this.buffer.byteLength) - throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); - } - if (begin >= end) - return this; // Nothing to fill - while (begin < end) this.view[begin++] = value; - if (relative) this.offset = begin; - return this; - }; - - /** - * Makes this ByteBuffer ready for a new sequence of write or relative read operations. Sets `limit = offset` and - * `offset = 0`. Make sure always to flip a ByteBuffer when all relative read or write operations are complete. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.flip = function() { - this.limit = this.offset; - this.offset = 0; - return this; - }; - /** - * Marks an offset on this ByteBuffer to be used later. - * @param {number=} offset Offset to mark. Defaults to {@link ByteBuffer#offset}. - * @returns {!ByteBuffer} this - * @throws {TypeError} If `offset` is not a valid number - * @throws {RangeError} If `offset` is out of bounds - * @see ByteBuffer#reset - * @expose - */ - ByteBufferPrototype.mark = function(offset) { - offset = typeof offset === 'undefined' ? this.offset : offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - this.markedOffset = offset; - return this; - }; - /** - * Sets the byte order. - * @param {boolean} littleEndian `true` for little endian byte order, `false` for big endian - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.order = function(littleEndian) { - if (!this.noAssert) { - if (typeof littleEndian !== 'boolean') - throw TypeError("Illegal littleEndian: Not a boolean"); - } - this.littleEndian = !!littleEndian; - return this; - }; - - /** - * Switches (to) little endian byte order. - * @param {boolean=} littleEndian Defaults to `true`, otherwise uses big endian - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.LE = function(littleEndian) { - this.littleEndian = typeof littleEndian !== 'undefined' ? !!littleEndian : true; - return this; - }; - - /** - * Switches (to) big endian byte order. - * @param {boolean=} bigEndian Defaults to `true`, otherwise uses little endian - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.BE = function(bigEndian) { - this.littleEndian = typeof bigEndian !== 'undefined' ? !bigEndian : false; - return this; - }; - /** - * Prepends some data to this ByteBuffer. This will overwrite any contents before the specified offset up to the - * prepended data's length. If there is not enough space available before the specified `offset`, the backing buffer - * will be resized and its contents moved accordingly. - * @param {!ByteBuffer|string|!ArrayBuffer} source Data to prepend. If `source` is a ByteBuffer, its offset will be - * modified according to the performed read operation. - * @param {(string|number)=} encoding Encoding if `data` is a string ("base64", "hex", "binary", defaults to "utf8") - * @param {number=} offset Offset to prepend at. Will use and decrease {@link ByteBuffer#offset} by the number of bytes - * prepended if omitted. - * @returns {!ByteBuffer} this - * @expose - * @example A relative `00<01 02 03>.prepend(<04 05>)` results in `<04 05 01 02 03>, 04 05|` - * @example An absolute `00<01 02 03>.prepend(<04 05>, 2)` results in `04<05 02 03>, 04 05|` - */ - ByteBufferPrototype.prepend = function(source, encoding, offset) { - if (typeof encoding === 'number' || typeof encoding !== 'string') { - offset = encoding; - encoding = undefined; - } - var relative = typeof offset === 'undefined'; - if (relative) offset = this.offset; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: "+offset+" (not an integer)"); - offset >>>= 0; - if (offset < 0 || offset + 0 > this.buffer.byteLength) - throw RangeError("Illegal offset: 0 <= "+offset+" (+"+0+") <= "+this.buffer.byteLength); - } - if (!(source instanceof ByteBuffer)) - source = ByteBuffer.wrap(source, encoding); - var len = source.limit - source.offset; - if (len <= 0) return this; // Nothing to prepend - var diff = len - offset; - if (diff > 0) { // Not enough space before offset, so resize + move - var buffer = new ArrayBuffer(this.buffer.byteLength + diff); - var view = new Uint8Array(buffer); - view.set(this.view.subarray(offset, this.buffer.byteLength), len); - this.buffer = buffer; - this.view = view; - this.offset += diff; - if (this.markedOffset >= 0) this.markedOffset += diff; - this.limit += diff; - offset += diff; - } else { - var arrayView = new Uint8Array(this.buffer); - } - this.view.set(source.view.subarray(source.offset, source.limit), offset - len); - - source.offset = source.limit; - if (relative) - this.offset -= len; - return this; - }; - - /** - * Prepends this ByteBuffer to another ByteBuffer. This will overwrite any contents before the specified offset up to the - * prepended data's length. If there is not enough space available before the specified `offset`, the backing buffer - * will be resized and its contents moved accordingly. - * @param {!ByteBuffer} target Target ByteBuffer - * @param {number=} offset Offset to prepend at. Will use and decrease {@link ByteBuffer#offset} by the number of bytes - * prepended if omitted. - * @returns {!ByteBuffer} this - * @expose - * @see ByteBuffer#prepend - */ - ByteBufferPrototype.prependTo = function(target, offset) { - target.prepend(this, offset); - return this; - }; - /** - * Prints debug information about this ByteBuffer's contents. - * @param {function(string)=} out Output function to call, defaults to console.log - * @expose - */ - ByteBufferPrototype.printDebug = function(out) { - if (typeof out !== 'function') out = console.log.bind(console); - out( - this.toString()+"\n"+ - "-------------------------------------------------------------------\n"+ - this.toDebug(/* columns */ true) - ); - }; - - /** - * Gets the number of remaining readable bytes. Contents are the bytes between {@link ByteBuffer#offset} and - * {@link ByteBuffer#limit}, so this returns `limit - offset`. - * @returns {number} Remaining readable bytes. May be negative if `offset > limit`. - * @expose - */ - ByteBufferPrototype.remaining = function() { - return this.limit - this.offset; - }; - /** - * Resets this ByteBuffer's {@link ByteBuffer#offset}. If an offset has been marked through {@link ByteBuffer#mark} - * before, `offset` will be set to {@link ByteBuffer#markedOffset}, which will then be discarded. If no offset has been - * marked, sets `offset = 0`. - * @returns {!ByteBuffer} this - * @see ByteBuffer#mark - * @expose - */ - ByteBufferPrototype.reset = function() { - if (this.markedOffset >= 0) { - this.offset = this.markedOffset; - this.markedOffset = -1; - } else { - this.offset = 0; - } - return this; - }; - /** - * Resizes this ByteBuffer to be backed by a buffer of at least the given capacity. Will do nothing if already that - * large or larger. - * @param {number} capacity Capacity required - * @returns {!ByteBuffer} this - * @throws {TypeError} If `capacity` is not a number - * @throws {RangeError} If `capacity < 0` - * @expose - */ - ByteBufferPrototype.resize = function(capacity) { - if (!this.noAssert) { - if (typeof capacity !== 'number' || capacity % 1 !== 0) - throw TypeError("Illegal capacity: "+capacity+" (not an integer)"); - capacity |= 0; - if (capacity < 0) - throw RangeError("Illegal capacity: 0 <= "+capacity); - } - if (this.buffer.byteLength < capacity) { - var buffer = new ArrayBuffer(capacity); - var view = new Uint8Array(buffer); - view.set(this.view); - this.buffer = buffer; - this.view = view; - } - return this; - }; - /** - * Reverses this ByteBuffer's contents. - * @param {number=} begin Offset to start at, defaults to {@link ByteBuffer#offset} - * @param {number=} end Offset to end at, defaults to {@link ByteBuffer#limit} - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.reverse = function(begin, end) { - if (typeof begin === 'undefined') begin = this.offset; - if (typeof end === 'undefined') end = this.limit; - if (!this.noAssert) { - if (typeof begin !== 'number' || begin % 1 !== 0) - throw TypeError("Illegal begin: Not an integer"); - begin >>>= 0; - if (typeof end !== 'number' || end % 1 !== 0) - throw TypeError("Illegal end: Not an integer"); - end >>>= 0; - if (begin < 0 || begin > end || end > this.buffer.byteLength) - throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); - } - if (begin === end) - return this; // Nothing to reverse - Array.prototype.reverse.call(this.view.subarray(begin, end)); - return this; - }; - /** - * Skips the next `length` bytes. This will just advance - * @param {number} length Number of bytes to skip. May also be negative to move the offset back. - * @returns {!ByteBuffer} this - * @expose - */ - ByteBufferPrototype.skip = function(length) { - if (!this.noAssert) { - if (typeof length !== 'number' || length % 1 !== 0) - throw TypeError("Illegal length: "+length+" (not an integer)"); - length |= 0; - } - var offset = this.offset + length; - if (!this.noAssert) { - if (offset < 0 || offset > this.buffer.byteLength) - throw RangeError("Illegal length: 0 <= "+this.offset+" + "+length+" <= "+this.buffer.byteLength); - } - this.offset = offset; - return this; - }; - - /** - * Slices this ByteBuffer by creating a cloned instance with `offset = begin` and `limit = end`. - * @param {number=} begin Begin offset, defaults to {@link ByteBuffer#offset}. - * @param {number=} end End offset, defaults to {@link ByteBuffer#limit}. - * @returns {!ByteBuffer} Clone of this ByteBuffer with slicing applied, backed by the same {@link ByteBuffer#buffer} - * @expose - */ - ByteBufferPrototype.slice = function(begin, end) { - if (typeof begin === 'undefined') begin = this.offset; - if (typeof end === 'undefined') end = this.limit; - if (!this.noAssert) { - if (typeof begin !== 'number' || begin % 1 !== 0) - throw TypeError("Illegal begin: Not an integer"); - begin >>>= 0; - if (typeof end !== 'number' || end % 1 !== 0) - throw TypeError("Illegal end: Not an integer"); - end >>>= 0; - if (begin < 0 || begin > end || end > this.buffer.byteLength) - throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); - } - var bb = this.clone(); - bb.offset = begin; - bb.limit = end; - return bb; - }; - /** - * Returns a copy of the backing buffer that contains this ByteBuffer's contents. Contents are the bytes between - * {@link ByteBuffer#offset} and {@link ByteBuffer#limit}. - * @param {boolean=} forceCopy If `true` returns a copy, otherwise returns a view referencing the same memory if - * possible. Defaults to `false` - * @returns {!ArrayBuffer} Contents as an ArrayBuffer - * @expose - */ - ByteBufferPrototype.toBuffer = function(forceCopy) { - var offset = this.offset, - limit = this.limit; - if (!this.noAssert) { - if (typeof offset !== 'number' || offset % 1 !== 0) - throw TypeError("Illegal offset: Not an integer"); - offset >>>= 0; - if (typeof limit !== 'number' || limit % 1 !== 0) - throw TypeError("Illegal limit: Not an integer"); - limit >>>= 0; - if (offset < 0 || offset > limit || limit > this.buffer.byteLength) - throw RangeError("Illegal range: 0 <= "+offset+" <= "+limit+" <= "+this.buffer.byteLength); - } - // NOTE: It's not possible to have another ArrayBuffer reference the same memory as the backing buffer. This is - // possible with Uint8Array#subarray only, but we have to return an ArrayBuffer by contract. So: - if (!forceCopy && offset === 0 && limit === this.buffer.byteLength) - return this.buffer; - if (offset === limit) - return EMPTY_BUFFER; - var buffer = new ArrayBuffer(limit - offset); - new Uint8Array(buffer).set(new Uint8Array(this.buffer).subarray(offset, limit), 0); - return buffer; - }; - - /** - * Returns a raw buffer compacted to contain this ByteBuffer's contents. Contents are the bytes between - * {@link ByteBuffer#offset} and {@link ByteBuffer#limit}. This is an alias of {@link ByteBuffer#toBuffer}. - * @function - * @param {boolean=} forceCopy If `true` returns a copy, otherwise returns a view referencing the same memory. - * Defaults to `false` - * @returns {!ArrayBuffer} Contents as an ArrayBuffer - * @expose - */ - ByteBufferPrototype.toArrayBuffer = ByteBufferPrototype.toBuffer; - - /** - * Converts the ByteBuffer's contents to a string. - * @param {string=} encoding Output encoding. Returns an informative string representation if omitted but also allows - * direct conversion to "utf8", "hex", "base64" and "binary" encoding. "debug" returns a hex representation with - * highlighted offsets. - * @param {number=} begin Offset to begin at, defaults to {@link ByteBuffer#offset} - * @param {number=} end Offset to end at, defaults to {@link ByteBuffer#limit} - * @returns {string} String representation - * @throws {Error} If `encoding` is invalid - * @expose - */ - ByteBufferPrototype.toString = function(encoding, begin, end) { - if (typeof encoding === 'undefined') - return "ByteBufferAB(offset="+this.offset+",markedOffset="+this.markedOffset+",limit="+this.limit+",capacity="+this.capacity()+")"; - if (typeof encoding === 'number') - encoding = "utf8", - begin = encoding, - end = begin; - switch (encoding) { - case "utf8": - return this.toUTF8(begin, end); - case "base64": - return this.toBase64(begin, end); - case "hex": - return this.toHex(begin, end); - case "binary": - return this.toBinary(begin, end); - case "debug": - return this.toDebug(); - case "columns": - return this.toColumns(); - default: - throw Error("Unsupported encoding: "+encoding); - } - }; - - // lxiv-embeddable - - /** - * lxiv-embeddable (c) 2014 Daniel Wirtz - * Released under the Apache License, Version 2.0 - * see: https://github.com/dcodeIO/lxiv for details - */ - var lxiv = function() { - "use strict"; - - /** - * lxiv namespace. - * @type {!Object.} - * @exports lxiv - */ - var lxiv = {}; - - /** - * Character codes for output. - * @type {!Array.} - * @inner - */ - var aout = [ - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47 - ]; - - /** - * Character codes for input. - * @type {!Array.} - * @inner - */ - var ain = []; - for (var i=0, k=aout.length; i>2)&0x3f]); - t = (b&0x3)<<4; - if ((b = src()) !== null) { - t |= (b>>4)&0xf; - dst(aout[(t|((b>>4)&0xf))&0x3f]); - t = (b&0xf)<<2; - if ((b = src()) !== null) - dst(aout[(t|((b>>6)&0x3))&0x3f]), - dst(aout[b&0x3f]); - else - dst(aout[t&0x3f]), - dst(61); - } else - dst(aout[t&0x3f]), - dst(61), - dst(61); - } - }; - - /** - * Decodes base64 char codes to bytes. - * @param {!function():number|null} src Characters source as a function returning the next char code respectively - * `null` if there are no more characters left. - * @param {!function(number)} dst Bytes destination as a function successively called with the next byte. - * @throws {Error} If a character code is invalid - */ - lxiv.decode = function(src, dst) { - var c, t1, t2; - function fail(c) { - throw Error("Illegal character code: "+c); - } - while ((c = src()) !== null) { - t1 = ain[c]; - if (typeof t1 === 'undefined') fail(c); - if ((c = src()) !== null) { - t2 = ain[c]; - if (typeof t2 === 'undefined') fail(c); - dst((t1<<2)>>>0|(t2&0x30)>>4); - if ((c = src()) !== null) { - t1 = ain[c]; - if (typeof t1 === 'undefined') - if (c === 61) break; else fail(c); - dst(((t2&0xf)<<4)>>>0|(t1&0x3c)>>2); - if ((c = src()) !== null) { - t2 = ain[c]; - if (typeof t2 === 'undefined') - if (c === 61) break; else fail(c); - dst(((t1&0x3)<<6)>>>0|t2); - } - } - } - } - }; - - /** - * Tests if a string is valid base64. - * @param {string} str String to test - * @returns {boolean} `true` if valid, otherwise `false` - */ - lxiv.test = function(str) { - return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(str); - }; - - return lxiv; - }(); - - // encodings/base64 - - /** - * Encodes this ByteBuffer's contents to a base64 encoded string. - * @param {number=} begin Offset to begin at, defaults to {@link ByteBuffer#offset}. - * @param {number=} end Offset to end at, defaults to {@link ByteBuffer#limit}. - * @returns {string} Base64 encoded string - * @throws {RangeError} If `begin` or `end` is out of bounds - * @expose - */ - ByteBufferPrototype.toBase64 = function(begin, end) { - if (typeof begin === 'undefined') - begin = this.offset; - if (typeof end === 'undefined') - end = this.limit; - begin = begin | 0; end = end | 0; - if (begin < 0 || end > this.capacity || begin > end) - throw RangeError("begin, end"); - var sd; lxiv.encode(function() { - return begin < end ? this.view[begin++] : null; - }.bind(this), sd = stringDestination()); - return sd(); - }; - - /** - * Decodes a base64 encoded string to a ByteBuffer. - * @param {string} str String to decode - * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to - * {@link ByteBuffer.DEFAULT_ENDIAN}. - * @returns {!ByteBuffer} ByteBuffer - * @expose - */ - ByteBuffer.fromBase64 = function(str, littleEndian) { - if (typeof str !== 'string') - throw TypeError("str"); - var bb = new ByteBuffer(str.length/4*3, littleEndian), - i = 0; - lxiv.decode(stringSource(str), function(b) { - bb.view[i++] = b; - }); - bb.limit = i; - return bb; - }; - - /** - * Encodes a binary string to base64 like `window.btoa` does. - * @param {string} str Binary string - * @returns {string} Base64 encoded string - * @see https://developer.mozilla.org/en-US/docs/Web/API/Window.btoa - * @expose - */ - ByteBuffer.btoa = function(str) { - return ByteBuffer.fromBinary(str).toBase64(); - }; - - /** - * Decodes a base64 encoded string to binary like `window.atob` does. - * @param {string} b64 Base64 encoded string - * @returns {string} Binary string - * @see https://developer.mozilla.org/en-US/docs/Web/API/Window.atob - * @expose - */ - ByteBuffer.atob = function(b64) { - return ByteBuffer.fromBase64(b64).toBinary(); - }; - - // encodings/binary - - /** - * Encodes this ByteBuffer to a binary encoded string, that is using only characters 0x00-0xFF as bytes. - * @param {number=} begin Offset to begin at. Defaults to {@link ByteBuffer#offset}. - * @param {number=} end Offset to end at. Defaults to {@link ByteBuffer#limit}. - * @returns {string} Binary encoded string - * @throws {RangeError} If `offset > limit` - * @expose - */ - ByteBufferPrototype.toBinary = function(begin, end) { - if (typeof begin === 'undefined') - begin = this.offset; - if (typeof end === 'undefined') - end = this.limit; - begin |= 0; end |= 0; - if (begin < 0 || end > this.capacity() || begin > end) - throw RangeError("begin, end"); - if (begin === end) - return ""; - var chars = [], - parts = []; - while (begin < end) { - chars.push(this.view[begin++]); - if (chars.length >= 1024) - parts.push(String.fromCharCode.apply(String, chars)), - chars = []; - } - return parts.join('') + String.fromCharCode.apply(String, chars); - }; - - /** - * Decodes a binary encoded string, that is using only characters 0x00-0xFF as bytes, to a ByteBuffer. - * @param {string} str String to decode - * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to - * {@link ByteBuffer.DEFAULT_ENDIAN}. - * @returns {!ByteBuffer} ByteBuffer - * @expose - */ - ByteBuffer.fromBinary = function(str, littleEndian) { - if (typeof str !== 'string') - throw TypeError("str"); - var i = 0, - k = str.length, - charCode, - bb = new ByteBuffer(k, littleEndian); - while (i 0xff) - throw RangeError("illegal char code: "+charCode); - bb.view[i++] = charCode; - } - bb.limit = k; - return bb; - }; - - // encodings/debug - - /** - * Encodes this ByteBuffer to a hex encoded string with marked offsets. Offset symbols are: - * * `<` : offset, - * * `'` : markedOffset, - * * `>` : limit, - * * `|` : offset and limit, - * * `[` : offset and markedOffset, - * * `]` : markedOffset and limit, - * * `!` : offset, markedOffset and limit - * @param {boolean=} columns If `true` returns two columns hex + ascii, defaults to `false` - * @returns {string|!Array.} Debug string or array of lines if `asArray = true` - * @expose - * @example `>00'01 02<03` contains four bytes with `limit=0, markedOffset=1, offset=3` - * @example `00[01 02 03>` contains four bytes with `offset=markedOffset=1, limit=4` - * @example `00|01 02 03` contains four bytes with `offset=limit=1, markedOffset=-1` - * @example `|` contains zero bytes with `offset=limit=0, markedOffset=-1` - */ - ByteBufferPrototype.toDebug = function(columns) { - var i = -1, - k = this.buffer.byteLength, - b, - hex = "", - asc = "", - out = ""; - while (i 32 && b < 127 ? String.fromCharCode(b) : '.'; - } - ++i; - if (columns) { - if (i > 0 && i % 16 === 0 && i !== k) { - while (hex.length < 3*16+3) hex += " "; - out += hex+asc+"\n"; - hex = asc = ""; - } - } - if (i === this.offset && i === this.limit) - hex += i === this.markedOffset ? "!" : "|"; - else if (i === this.offset) - hex += i === this.markedOffset ? "[" : "<"; - else if (i === this.limit) - hex += i === this.markedOffset ? "]" : ">"; - else - hex += i === this.markedOffset ? "'" : (columns || (i !== 0 && i !== k) ? " " : ""); - } - if (columns && hex !== " ") { - while (hex.length < 3*16+3) - hex += " "; - out += hex + asc + "\n"; - } - return columns ? out : hex; - }; - - /** - * Decodes a hex encoded string with marked offsets to a ByteBuffer. - * @param {string} str Debug string to decode (not be generated with `columns = true`) - * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to - * {@link ByteBuffer.DEFAULT_ENDIAN}. - * @param {boolean=} noAssert Whether to skip assertions of offsets and values. Defaults to - * {@link ByteBuffer.DEFAULT_NOASSERT}. - * @returns {!ByteBuffer} ByteBuffer - * @expose - * @see ByteBuffer#toDebug - */ - ByteBuffer.fromDebug = function(str, littleEndian, noAssert) { - var k = str.length, - bb = new ByteBuffer(((k+1)/3)|0, littleEndian, noAssert); - var i = 0, j = 0, ch, b, - rs = false, // Require symbol next - ho = false, hm = false, hl = false, // Already has offset (ho), markedOffset (hm), limit (hl)? - fail = false; - while (i': - if (!noAssert) { - if (hl) { - fail = true; - break; - } - hl = true; - } - bb.limit = j; - rs = false; - break; - case "'": - if (!noAssert) { - if (hm) { - fail = true; - break; - } - hm = true; - } - bb.markedOffset = j; - rs = false; - break; - case ' ': - rs = false; - break; - default: - if (!noAssert) { - if (rs) { - fail = true; - break; - } - } - b = parseInt(ch+str.charAt(i++), 16); - if (!noAssert) { - if (isNaN(b) || b < 0 || b > 255) - throw TypeError("Illegal str: Not a debug encoded string"); - } - bb.view[j++] = b; - rs = true; - } - if (fail) - throw TypeError("Illegal str: Invalid symbol at "+i); - } - if (!noAssert) { - if (!ho || !hl) - throw TypeError("Illegal str: Missing offset or limit"); - if (j>>= 0; - if (typeof end !== 'number' || end % 1 !== 0) - throw TypeError("Illegal end: Not an integer"); - end >>>= 0; - if (begin < 0 || begin > end || end > this.buffer.byteLength) - throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); - } - var out = new Array(end - begin), - b; - while (begin < end) { - b = this.view[begin++]; - if (b < 0x10) - out.push("0", b.toString(16)); - else out.push(b.toString(16)); - } - return out.join(''); - }; - - /** - * Decodes a hex encoded string to a ByteBuffer. - * @param {string} str String to decode - * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to - * {@link ByteBuffer.DEFAULT_ENDIAN}. - * @param {boolean=} noAssert Whether to skip assertions of offsets and values. Defaults to - * {@link ByteBuffer.DEFAULT_NOASSERT}. - * @returns {!ByteBuffer} ByteBuffer - * @expose - */ - ByteBuffer.fromHex = function(str, littleEndian, noAssert) { - if (!noAssert) { - if (typeof str !== 'string') - throw TypeError("Illegal str: Not a string"); - if (str.length % 2 !== 0) - throw TypeError("Illegal str: Length not a multiple of 2"); - } - var k = str.length, - bb = new ByteBuffer((k / 2) | 0, littleEndian), - b; - for (var i=0, j=0; i 255) - throw TypeError("Illegal str: Contains non-hex characters"); - bb.view[j++] = b; - } - bb.limit = j; - return bb; - }; - - // utfx-embeddable - - /** - * utfx-embeddable (c) 2014 Daniel Wirtz - * Released under the Apache License, Version 2.0 - * see: https://github.com/dcodeIO/utfx for details - */ - var utfx = function() { - "use strict"; - - /** - * utfx namespace. - * @inner - * @type {!Object.} - */ - var utfx = {}; - - /** - * Maximum valid code point. - * @type {number} - * @const - */ - utfx.MAX_CODEPOINT = 0x10FFFF; - - /** - * Encodes UTF8 code points to UTF8 bytes. - * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point - * respectively `null` if there are no more code points left or a single numeric code point. - * @param {!function(number)} dst Bytes destination as a function successively called with the next byte - */ - utfx.encodeUTF8 = function(src, dst) { - var cp = null; - if (typeof src === 'number') - cp = src, - src = function() { return null; }; - while (cp !== null || (cp = src()) !== null) { - if (cp < 0x80) - dst(cp&0x7F); - else if (cp < 0x800) - dst(((cp>>6)&0x1F)|0xC0), - dst((cp&0x3F)|0x80); - else if (cp < 0x10000) - dst(((cp>>12)&0x0F)|0xE0), - dst(((cp>>6)&0x3F)|0x80), - dst((cp&0x3F)|0x80); - else - dst(((cp>>18)&0x07)|0xF0), - dst(((cp>>12)&0x3F)|0x80), - dst(((cp>>6)&0x3F)|0x80), - dst((cp&0x3F)|0x80); - cp = null; - } - }; - - /** - * Decodes UTF8 bytes to UTF8 code points. - * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there - * are no more bytes left. - * @param {!function(number)} dst Code points destination as a function successively called with each decoded code point. - * @throws {RangeError} If a starting byte is invalid in UTF8 - * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the - * remaining bytes. - */ - utfx.decodeUTF8 = function(src, dst) { - var a, b, c, d, fail = function(b) { - b = b.slice(0, b.indexOf(null)); - var err = Error(b.toString()); - err.name = "TruncatedError"; - err['bytes'] = b; - throw err; - }; - while ((a = src()) !== null) { - if ((a&0x80) === 0) - dst(a); - else if ((a&0xE0) === 0xC0) - ((b = src()) === null) && fail([a, b]), - dst(((a&0x1F)<<6) | (b&0x3F)); - else if ((a&0xF0) === 0xE0) - ((b=src()) === null || (c=src()) === null) && fail([a, b, c]), - dst(((a&0x0F)<<12) | ((b&0x3F)<<6) | (c&0x3F)); - else if ((a&0xF8) === 0xF0) - ((b=src()) === null || (c=src()) === null || (d=src()) === null) && fail([a, b, c ,d]), - dst(((a&0x07)<<18) | ((b&0x3F)<<12) | ((c&0x3F)<<6) | (d&0x3F)); - else throw RangeError("Illegal starting byte: "+a); - } - }; - - /** - * Converts UTF16 characters to UTF8 code points. - * @param {!function():number|null} src Characters source as a function returning the next char code respectively - * `null` if there are no more characters left. - * @param {!function(number)} dst Code points destination as a function successively called with each converted code - * point. - */ - utfx.UTF16toUTF8 = function(src, dst) { - var c1, c2 = null; - while (true) { - if ((c1 = c2 !== null ? c2 : src()) === null) - break; - if (c1 >= 0xD800 && c1 <= 0xDFFF) { - if ((c2 = src()) !== null) { - if (c2 >= 0xDC00 && c2 <= 0xDFFF) { - dst((c1-0xD800)*0x400+c2-0xDC00+0x10000); - c2 = null; continue; - } - } - } - dst(c1); - } - if (c2 !== null) dst(c2); - }; - - /** - * Converts UTF8 code points to UTF16 characters. - * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point - * respectively `null` if there are no more code points left or a single numeric code point. - * @param {!function(number)} dst Characters destination as a function successively called with each converted char code. - * @throws {RangeError} If a code point is out of range - */ - utfx.UTF8toUTF16 = function(src, dst) { - var cp = null; - if (typeof src === 'number') - cp = src, src = function() { return null; }; - while (cp !== null || (cp = src()) !== null) { - if (cp <= 0xFFFF) - dst(cp); - else - cp -= 0x10000, - dst((cp>>10)+0xD800), - dst((cp%0x400)+0xDC00); - cp = null; - } - }; - - /** - * Converts and encodes UTF16 characters to UTF8 bytes. - * @param {!function():number|null} src Characters source as a function returning the next char code respectively `null` - * if there are no more characters left. - * @param {!function(number)} dst Bytes destination as a function successively called with the next byte. - */ - utfx.encodeUTF16toUTF8 = function(src, dst) { - utfx.UTF16toUTF8(src, function(cp) { - utfx.encodeUTF8(cp, dst); - }); - }; - - /** - * Decodes and converts UTF8 bytes to UTF16 characters. - * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there - * are no more bytes left. - * @param {!function(number)} dst Characters destination as a function successively called with each converted char code. - * @throws {RangeError} If a starting byte is invalid in UTF8 - * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the remaining bytes. - */ - utfx.decodeUTF8toUTF16 = function(src, dst) { - utfx.decodeUTF8(src, function(cp) { - utfx.UTF8toUTF16(cp, dst); - }); - }; - - /** - * Calculates the byte length of an UTF8 code point. - * @param {number} cp UTF8 code point - * @returns {number} Byte length - */ - utfx.calculateCodePoint = function(cp) { - return (cp < 0x80) ? 1 : (cp < 0x800) ? 2 : (cp < 0x10000) ? 3 : 4; - }; - - /** - * Calculates the number of UTF8 bytes required to store UTF8 code points. - * @param {(!function():number|null)} src Code points source as a function returning the next code point respectively - * `null` if there are no more code points left. - * @returns {number} The number of UTF8 bytes required - */ - utfx.calculateUTF8 = function(src) { - var cp, l=0; - while ((cp = src()) !== null) - l += (cp < 0x80) ? 1 : (cp < 0x800) ? 2 : (cp < 0x10000) ? 3 : 4; - return l; - }; - - /** - * Calculates the number of UTF8 code points respectively UTF8 bytes required to store UTF16 char codes. - * @param {(!function():number|null)} src Characters source as a function returning the next char code respectively - * `null` if there are no more characters left. - * @returns {!Array.} The number of UTF8 code points at index 0 and the number of UTF8 bytes required at index 1. - */ - utfx.calculateUTF16asUTF8 = function(src) { - var n=0, l=0; - utfx.UTF16toUTF8(src, function(cp) { - ++n; l += (cp < 0x80) ? 1 : (cp < 0x800) ? 2 : (cp < 0x10000) ? 3 : 4; - }); - return [n,l]; - }; - - return utfx; - }(); - - // encodings/utf8 - - /** - * Encodes this ByteBuffer's contents between {@link ByteBuffer#offset} and {@link ByteBuffer#limit} to an UTF8 encoded - * string. - * @returns {string} Hex encoded string - * @throws {RangeError} If `offset > limit` - * @expose - */ - ByteBufferPrototype.toUTF8 = function(begin, end) { - if (typeof begin === 'undefined') begin = this.offset; - if (typeof end === 'undefined') end = this.limit; - if (!this.noAssert) { - if (typeof begin !== 'number' || begin % 1 !== 0) - throw TypeError("Illegal begin: Not an integer"); - begin >>>= 0; - if (typeof end !== 'number' || end % 1 !== 0) - throw TypeError("Illegal end: Not an integer"); - end >>>= 0; - if (begin < 0 || begin > end || end > this.buffer.byteLength) - throw RangeError("Illegal range: 0 <= "+begin+" <= "+end+" <= "+this.buffer.byteLength); - } - var sd; try { - utfx.decodeUTF8toUTF16(function() { - return begin < end ? this.view[begin++] : null; - }.bind(this), sd = stringDestination()); - } catch (e) { - if (begin !== end) - throw RangeError("Illegal range: Truncated data, "+begin+" != "+end); - } - return sd(); - }; - - /** - * Decodes an UTF8 encoded string to a ByteBuffer. - * @param {string} str String to decode - * @param {boolean=} littleEndian Whether to use little or big endian byte order. Defaults to - * {@link ByteBuffer.DEFAULT_ENDIAN}. - * @param {boolean=} noAssert Whether to skip assertions of offsets and values. Defaults to - * {@link ByteBuffer.DEFAULT_NOASSERT}. - * @returns {!ByteBuffer} ByteBuffer - * @expose - */ - ByteBuffer.fromUTF8 = function(str, littleEndian, noAssert) { - if (!noAssert) - if (typeof str !== 'string') - throw TypeError("Illegal str: Not a string"); - var bb = new ByteBuffer(utfx.calculateUTF16asUTF8(stringSource(str), true)[1], littleEndian, noAssert), - i = 0; - utfx.encodeUTF16toUTF8(stringSource(str), function(b) { - bb.view[i++] = b; - }); - bb.limit = i; - return bb; - }; - - return ByteBuffer; -}); \ No newline at end of file diff --git a/ui/scripts/protobufjs/long.js b/ui/scripts/protobufjs/long.js deleted file mode 100644 index 555485a7edd..00000000000 --- a/ui/scripts/protobufjs/long.js +++ /dev/null @@ -1,1209 +0,0 @@ -/* - Copyright 2013 Daniel Wirtz - Copyright 2009 The Closure Library Authors. All Rights Reserved. - - 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. - */ - -/** - * @license long.js (c) 2013 Daniel Wirtz - * Released under the Apache License, Version 2.0 - * see: https://github.com/dcodeIO/long.js for details - */ -(function(global, factory) { - - /* AMD */ if (typeof define === 'function' && define["amd"]) - define([], factory); - /* CommonJS */ else if (typeof require === 'function' && typeof module === "object" && module && module["exports"]) - module["exports"] = factory(); - /* Global */ else - (global["dcodeIO"] = global["dcodeIO"] || {})["Long"] = factory(); - -})(this, function() { - "use strict"; - - /** - * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers. - * See the from* functions below for more convenient ways of constructing Longs. - * @exports Long - * @class A Long class for representing a 64 bit two's-complement integer value. - * @param {number} low The low (signed) 32 bits of the long - * @param {number} high The high (signed) 32 bits of the long - * @param {boolean=} unsigned Whether unsigned or not, defaults to `false` for signed - * @constructor - */ - function Long(low, high, unsigned) { - - /** - * The low 32 bits as a signed value. - * @type {number} - */ - this.low = low | 0; - - /** - * The high 32 bits as a signed value. - * @type {number} - */ - this.high = high | 0; - - /** - * Whether unsigned or not. - * @type {boolean} - */ - this.unsigned = !!unsigned; - } - - // The internal representation of a long is the two given signed, 32-bit values. - // We use 32-bit pieces because these are the size of integers on which - // Javascript performs bit-operations. For operations like addition and - // multiplication, we split each number into 16 bit pieces, which can easily be - // multiplied within Javascript's floating-point representation without overflow - // or change in sign. - // - // In the algorithms below, we frequently reduce the negative case to the - // positive case by negating the input(s) and then post-processing the result. - // Note that we must ALWAYS check specially whether those values are MIN_VALUE - // (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as - // a positive number, it overflows back into a negative). Not handling this - // case would often result in infinite recursion. - // - // Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from* - // methods on which they depend. - - /** - * An indicator used to reliably determine if an object is a Long or not. - * @type {boolean} - * @const - * @private - */ - Long.prototype.__isLong__; - - Object.defineProperty(Long.prototype, "__isLong__", { - value: true, - enumerable: false, - configurable: false - }); - - /** - * @function - * @param {*} obj Object - * @returns {boolean} - * @inner - */ - function isLong(obj) { - return (obj && obj["__isLong__"]) === true; - } - - /** - * Tests if the specified object is a Long. - * @function - * @param {*} obj Object - * @returns {boolean} - */ - Long.isLong = isLong; - - /** - * A cache of the Long representations of small integer values. - * @type {!Object} - * @inner - */ - var INT_CACHE = {}; - - /** - * A cache of the Long representations of small unsigned integer values. - * @type {!Object} - * @inner - */ - var UINT_CACHE = {}; - - /** - * @param {number} value - * @param {boolean=} unsigned - * @returns {!Long} - * @inner - */ - function fromInt(value, unsigned) { - var obj, cachedObj, cache; - if (unsigned) { - value >>>= 0; - if (cache = (0 <= value && value < 256)) { - cachedObj = UINT_CACHE[value]; - if (cachedObj) - return cachedObj; - } - obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true); - if (cache) - UINT_CACHE[value] = obj; - return obj; - } else { - value |= 0; - if (cache = (-128 <= value && value < 128)) { - cachedObj = INT_CACHE[value]; - if (cachedObj) - return cachedObj; - } - obj = fromBits(value, value < 0 ? -1 : 0, false); - if (cache) - INT_CACHE[value] = obj; - return obj; - } - } - - /** - * Returns a Long representing the given 32 bit integer value. - * @function - * @param {number} value The 32 bit integer in question - * @param {boolean=} unsigned Whether unsigned or not, defaults to `false` for signed - * @returns {!Long} The corresponding Long value - */ - Long.fromInt = fromInt; - - /** - * @param {number} value - * @param {boolean=} unsigned - * @returns {!Long} - * @inner - */ - function fromNumber(value, unsigned) { - if (isNaN(value) || !isFinite(value)) - return unsigned ? UZERO : ZERO; - if (unsigned) { - if (value < 0) - return UZERO; - if (value >= TWO_PWR_64_DBL) - return MAX_UNSIGNED_VALUE; - } else { - if (value <= -TWO_PWR_63_DBL) - return MIN_VALUE; - if (value + 1 >= TWO_PWR_63_DBL) - return MAX_VALUE; - } - if (value < 0) - return fromNumber(-value, unsigned).neg(); - return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned); - } - - /** - * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned. - * @function - * @param {number} value The number in question - * @param {boolean=} unsigned Whether unsigned or not, defaults to `false` for signed - * @returns {!Long} The corresponding Long value - */ - Long.fromNumber = fromNumber; - - /** - * @param {number} lowBits - * @param {number} highBits - * @param {boolean=} unsigned - * @returns {!Long} - * @inner - */ - function fromBits(lowBits, highBits, unsigned) { - return new Long(lowBits, highBits, unsigned); - } - - /** - * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is - * assumed to use 32 bits. - * @function - * @param {number} lowBits The low 32 bits - * @param {number} highBits The high 32 bits - * @param {boolean=} unsigned Whether unsigned or not, defaults to `false` for signed - * @returns {!Long} The corresponding Long value - */ - Long.fromBits = fromBits; - - /** - * @function - * @param {number} base - * @param {number} exponent - * @returns {number} - * @inner - */ - var pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4) - - /** - * @param {string} str - * @param {(boolean|number)=} unsigned - * @param {number=} radix - * @returns {!Long} - * @inner - */ - function fromString(str, unsigned, radix) { - if (str.length === 0) - throw Error('empty string'); - if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity") - return ZERO; - if (typeof unsigned === 'number') { - // For goog.math.long compatibility - radix = unsigned, - unsigned = false; - } else { - unsigned = !! unsigned; - } - radix = radix || 10; - if (radix < 2 || 36 < radix) - throw RangeError('radix'); - - var p; - if ((p = str.indexOf('-')) > 0) - throw Error('interior hyphen'); - else if (p === 0) { - return fromString(str.substring(1), unsigned, radix).neg(); - } - - // Do several (8) digits each time through the loop, so as to - // minimize the calls to the very expensive emulated div. - var radixToPower = fromNumber(pow_dbl(radix, 8)); - - var result = ZERO; - for (var i = 0; i < str.length; i += 8) { - var size = Math.min(8, str.length - i), - value = parseInt(str.substring(i, i + size), radix); - if (size < 8) { - var power = fromNumber(pow_dbl(radix, size)); - result = result.mul(power).add(fromNumber(value)); - } else { - result = result.mul(radixToPower); - result = result.add(fromNumber(value)); - } - } - result.unsigned = unsigned; - return result; - } - - /** - * Returns a Long representation of the given string, written using the specified radix. - * @function - * @param {string} str The textual representation of the Long - * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to `false` for signed - * @param {number=} radix The radix in which the text is written (2-36), defaults to 10 - * @returns {!Long} The corresponding Long value - */ - Long.fromString = fromString; - - /** - * @function - * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val - * @returns {!Long} - * @inner - */ - function fromValue(val) { - if (val /* is compatible */ instanceof Long) - return val; - if (typeof val === 'number') - return fromNumber(val); - if (typeof val === 'string') - return fromString(val); - // Throws for non-objects, converts non-instanceof Long: - return fromBits(val.low, val.high, val.unsigned); - } - - /** - * Converts the specified value to a Long. - * @function - * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value - * @returns {!Long} - */ - Long.fromValue = fromValue; - - // NOTE: the compiler should inline these constant values below and then remove these variables, so there should be - // no runtime penalty for these. - - /** - * @type {number} - * @const - * @inner - */ - var TWO_PWR_16_DBL = 1 << 16; - - /** - * @type {number} - * @const - * @inner - */ - var TWO_PWR_24_DBL = 1 << 24; - - /** - * @type {number} - * @const - * @inner - */ - var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; - - /** - * @type {number} - * @const - * @inner - */ - var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; - - /** - * @type {number} - * @const - * @inner - */ - var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; - - /** - * @type {!Long} - * @const - * @inner - */ - var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL); - - /** - * @type {!Long} - * @inner - */ - var ZERO = fromInt(0); - - /** - * Signed zero. - * @type {!Long} - */ - Long.ZERO = ZERO; - - /** - * @type {!Long} - * @inner - */ - var UZERO = fromInt(0, true); - - /** - * Unsigned zero. - * @type {!Long} - */ - Long.UZERO = UZERO; - - /** - * @type {!Long} - * @inner - */ - var ONE = fromInt(1); - - /** - * Signed one. - * @type {!Long} - */ - Long.ONE = ONE; - - /** - * @type {!Long} - * @inner - */ - var UONE = fromInt(1, true); - - /** - * Unsigned one. - * @type {!Long} - */ - Long.UONE = UONE; - - /** - * @type {!Long} - * @inner - */ - var NEG_ONE = fromInt(-1); - - /** - * Signed negative one. - * @type {!Long} - */ - Long.NEG_ONE = NEG_ONE; - - /** - * @type {!Long} - * @inner - */ - var MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false); - - /** - * Maximum signed value. - * @type {!Long} - */ - Long.MAX_VALUE = MAX_VALUE; - - /** - * @type {!Long} - * @inner - */ - var MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true); - - /** - * Maximum unsigned value. - * @type {!Long} - */ - Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE; - - /** - * @type {!Long} - * @inner - */ - var MIN_VALUE = fromBits(0, 0x80000000|0, false); - - /** - * Minimum signed value. - * @type {!Long} - */ - Long.MIN_VALUE = MIN_VALUE; - - /** - * @alias Long.prototype - * @inner - */ - var LongPrototype = Long.prototype; - - /** - * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer. - * @returns {number} - */ - LongPrototype.toInt = function toInt() { - return this.unsigned ? this.low >>> 0 : this.low; - }; - - /** - * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa). - * @returns {number} - */ - LongPrototype.toNumber = function toNumber() { - if (this.unsigned) - return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0); - return this.high * TWO_PWR_32_DBL + (this.low >>> 0); - }; - - /** - * Converts the Long to a string written in the specified radix. - * @param {number=} radix Radix (2-36), defaults to 10 - * @returns {string} - * @override - * @throws {RangeError} If `radix` is out of range - */ - LongPrototype.toString = function toString(radix) { - radix = radix || 10; - if (radix < 2 || 36 < radix) - throw RangeError('radix'); - if (this.isZero()) - return '0'; - if (this.isNegative()) { // Unsigned Longs are never negative - if (this.eq(MIN_VALUE)) { - // We need to change the Long value before it can be negated, so we remove - // the bottom-most digit in this base and then recurse to do the rest. - var radixLong = fromNumber(radix), - div = this.div(radixLong), - rem1 = div.mul(radixLong).sub(this); - return div.toString(radix) + rem1.toInt().toString(radix); - } else - return '-' + this.neg().toString(radix); - } - - // Do several (6) digits each time through the loop, so as to - // minimize the calls to the very expensive emulated div. - var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned), - rem = this; - var result = ''; - while (true) { - var remDiv = rem.div(radixToPower), - intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0, - digits = intval.toString(radix); - rem = remDiv; - if (rem.isZero()) - return digits + result; - else { - while (digits.length < 6) - digits = '0' + digits; - result = '' + digits + result; - } - } - }; - - /** - * Gets the high 32 bits as a signed integer. - * @returns {number} Signed high bits - */ - LongPrototype.getHighBits = function getHighBits() { - return this.high; - }; - - /** - * Gets the high 32 bits as an unsigned integer. - * @returns {number} Unsigned high bits - */ - LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() { - return this.high >>> 0; - }; - - /** - * Gets the low 32 bits as a signed integer. - * @returns {number} Signed low bits - */ - LongPrototype.getLowBits = function getLowBits() { - return this.low; - }; - - /** - * Gets the low 32 bits as an unsigned integer. - * @returns {number} Unsigned low bits - */ - LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() { - return this.low >>> 0; - }; - - /** - * Gets the number of bits needed to represent the absolute value of this Long. - * @returns {number} - */ - LongPrototype.getNumBitsAbs = function getNumBitsAbs() { - if (this.isNegative()) // Unsigned Longs are never negative - return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); - var val = this.high != 0 ? this.high : this.low; - for (var bit = 31; bit > 0; bit--) - if ((val & (1 << bit)) != 0) - break; - return this.high != 0 ? bit + 33 : bit + 1; - }; - - /** - * Tests if this Long's value equals zero. - * @returns {boolean} - */ - LongPrototype.isZero = function isZero() { - return this.high === 0 && this.low === 0; - }; - - /** - * Tests if this Long's value is negative. - * @returns {boolean} - */ - LongPrototype.isNegative = function isNegative() { - return !this.unsigned && this.high < 0; - }; - - /** - * Tests if this Long's value is positive. - * @returns {boolean} - */ - LongPrototype.isPositive = function isPositive() { - return this.unsigned || this.high >= 0; - }; - - /** - * Tests if this Long's value is odd. - * @returns {boolean} - */ - LongPrototype.isOdd = function isOdd() { - return (this.low & 1) === 1; - }; - - /** - * Tests if this Long's value is even. - * @returns {boolean} - */ - LongPrototype.isEven = function isEven() { - return (this.low & 1) === 0; - }; - - /** - * Tests if this Long's value equals the specified's. - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ - LongPrototype.equals = function equals(other) { - if (!isLong(other)) - other = fromValue(other); - if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1) - return false; - return this.high === other.high && this.low === other.low; - }; - - /** - * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ - LongPrototype.eq = LongPrototype.equals; - - /** - * Tests if this Long's value differs from the specified's. - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ - LongPrototype.notEquals = function notEquals(other) { - return !this.eq(/* validates */ other); - }; - - /** - * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ - LongPrototype.neq = LongPrototype.notEquals; - - /** - * Tests if this Long's value is less than the specified's. - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ - LongPrototype.lessThan = function lessThan(other) { - return this.comp(/* validates */ other) < 0; - }; - - /** - * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ - LongPrototype.lt = LongPrototype.lessThan; - - /** - * Tests if this Long's value is less than or equal the specified's. - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ - LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) { - return this.comp(/* validates */ other) <= 0; - }; - - /** - * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ - LongPrototype.lte = LongPrototype.lessThanOrEqual; - - /** - * Tests if this Long's value is greater than the specified's. - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ - LongPrototype.greaterThan = function greaterThan(other) { - return this.comp(/* validates */ other) > 0; - }; - - /** - * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ - LongPrototype.gt = LongPrototype.greaterThan; - - /** - * Tests if this Long's value is greater than or equal the specified's. - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ - LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) { - return this.comp(/* validates */ other) >= 0; - }; - - /** - * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}. - * @function - * @param {!Long|number|string} other Other value - * @returns {boolean} - */ - LongPrototype.gte = LongPrototype.greaterThanOrEqual; - - /** - * Compares this Long's value with the specified's. - * @param {!Long|number|string} other Other value - * @returns {number} 0 if they are the same, 1 if the this is greater and -1 - * if the given one is greater - */ - LongPrototype.compare = function compare(other) { - if (!isLong(other)) - other = fromValue(other); - if (this.eq(other)) - return 0; - var thisNeg = this.isNegative(), - otherNeg = other.isNegative(); - if (thisNeg && !otherNeg) - return -1; - if (!thisNeg && otherNeg) - return 1; - // At this point the sign bits are the same - if (!this.unsigned) - return this.sub(other).isNegative() ? -1 : 1; - // Both are positive if at least one is unsigned - return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1; - }; - - /** - * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}. - * @function - * @param {!Long|number|string} other Other value - * @returns {number} 0 if they are the same, 1 if the this is greater and -1 - * if the given one is greater - */ - LongPrototype.comp = LongPrototype.compare; - - /** - * Negates this Long's value. - * @returns {!Long} Negated Long - */ - LongPrototype.negate = function negate() { - if (!this.unsigned && this.eq(MIN_VALUE)) - return MIN_VALUE; - return this.not().add(ONE); - }; - - /** - * Negates this Long's value. This is an alias of {@link Long#negate}. - * @function - * @returns {!Long} Negated Long - */ - LongPrototype.neg = LongPrototype.negate; - - /** - * Returns the sum of this and the specified Long. - * @param {!Long|number|string} addend Addend - * @returns {!Long} Sum - */ - LongPrototype.add = function add(addend) { - if (!isLong(addend)) - addend = fromValue(addend); - - // Divide each number into 4 chunks of 16 bits, and then sum the chunks. - - var a48 = this.high >>> 16; - var a32 = this.high & 0xFFFF; - var a16 = this.low >>> 16; - var a00 = this.low & 0xFFFF; - - var b48 = addend.high >>> 16; - var b32 = addend.high & 0xFFFF; - var b16 = addend.low >>> 16; - var b00 = addend.low & 0xFFFF; - - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 + b00; - c16 += c00 >>> 16; - c00 &= 0xFFFF; - c16 += a16 + b16; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c32 += a32 + b32; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c48 += a48 + b48; - c48 &= 0xFFFF; - return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); - }; - - /** - * Returns the difference of this and the specified Long. - * @param {!Long|number|string} subtrahend Subtrahend - * @returns {!Long} Difference - */ - LongPrototype.subtract = function subtract(subtrahend) { - if (!isLong(subtrahend)) - subtrahend = fromValue(subtrahend); - return this.add(subtrahend.neg()); - }; - - /** - * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}. - * @function - * @param {!Long|number|string} subtrahend Subtrahend - * @returns {!Long} Difference - */ - LongPrototype.sub = LongPrototype.subtract; - - /** - * Returns the product of this and the specified Long. - * @param {!Long|number|string} multiplier Multiplier - * @returns {!Long} Product - */ - LongPrototype.multiply = function multiply(multiplier) { - if (this.isZero()) - return ZERO; - if (!isLong(multiplier)) - multiplier = fromValue(multiplier); - if (multiplier.isZero()) - return ZERO; - if (this.eq(MIN_VALUE)) - return multiplier.isOdd() ? MIN_VALUE : ZERO; - if (multiplier.eq(MIN_VALUE)) - return this.isOdd() ? MIN_VALUE : ZERO; - - if (this.isNegative()) { - if (multiplier.isNegative()) - return this.neg().mul(multiplier.neg()); - else - return this.neg().mul(multiplier).neg(); - } else if (multiplier.isNegative()) - return this.mul(multiplier.neg()).neg(); - - // If both longs are small, use float multiplication - if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24)) - return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); - - // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products. - // We can skip products that would overflow. - - var a48 = this.high >>> 16; - var a32 = this.high & 0xFFFF; - var a16 = this.low >>> 16; - var a00 = this.low & 0xFFFF; - - var b48 = multiplier.high >>> 16; - var b32 = multiplier.high & 0xFFFF; - var b16 = multiplier.low >>> 16; - var b00 = multiplier.low & 0xFFFF; - - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 * b00; - c16 += c00 >>> 16; - c00 &= 0xFFFF; - c16 += a16 * b00; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c16 += a00 * b16; - c32 += c16 >>> 16; - c16 &= 0xFFFF; - c32 += a32 * b00; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c32 += a16 * b16; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c32 += a00 * b32; - c48 += c32 >>> 16; - c32 &= 0xFFFF; - c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; - c48 &= 0xFFFF; - return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned); - }; - - /** - * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}. - * @function - * @param {!Long|number|string} multiplier Multiplier - * @returns {!Long} Product - */ - LongPrototype.mul = LongPrototype.multiply; - - /** - * Returns this Long divided by the specified. The result is signed if this Long is signed or - * unsigned if this Long is unsigned. - * @param {!Long|number|string} divisor Divisor - * @returns {!Long} Quotient - */ - LongPrototype.divide = function divide(divisor) { - if (!isLong(divisor)) - divisor = fromValue(divisor); - if (divisor.isZero()) - throw Error('division by zero'); - if (this.isZero()) - return this.unsigned ? UZERO : ZERO; - var approx, rem, res; - if (!this.unsigned) { - // This section is only relevant for signed longs and is derived from the - // closure library as a whole. - if (this.eq(MIN_VALUE)) { - if (divisor.eq(ONE) || divisor.eq(NEG_ONE)) - return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE - else if (divisor.eq(MIN_VALUE)) - return ONE; - else { - // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|. - var halfThis = this.shr(1); - approx = halfThis.div(divisor).shl(1); - if (approx.eq(ZERO)) { - return divisor.isNegative() ? ONE : NEG_ONE; - } else { - rem = this.sub(divisor.mul(approx)); - res = approx.add(rem.div(divisor)); - return res; - } - } - } else if (divisor.eq(MIN_VALUE)) - return this.unsigned ? UZERO : ZERO; - if (this.isNegative()) { - if (divisor.isNegative()) - return this.neg().div(divisor.neg()); - return this.neg().div(divisor).neg(); - } else if (divisor.isNegative()) - return this.div(divisor.neg()).neg(); - res = ZERO; - } else { - // The algorithm below has not been made for unsigned longs. It's therefore - // required to take special care of the MSB prior to running it. - if (!divisor.unsigned) - divisor = divisor.toUnsigned(); - if (divisor.gt(this)) - return UZERO; - if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true - return UONE; - res = UZERO; - } - - // Repeat the following until the remainder is less than other: find a - // floating-point that approximates remainder / other *from below*, add this - // into the result, and subtract it from the remainder. It is critical that - // the approximate value is less than or equal to the real value so that the - // remainder never becomes negative. - rem = this; - while (rem.gte(divisor)) { - // Approximate the result of division. This may be a little greater or - // smaller than the actual value. - approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); - - // We will tweak the approximate result by changing it in the 48-th digit or - // the smallest non-fractional digit, whichever is larger. - var log2 = Math.ceil(Math.log(approx) / Math.LN2), - delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48), - - // Decrease the approximation until it is smaller than the remainder. Note - // that if it is too large, the product overflows and is negative. - approxRes = fromNumber(approx), - approxRem = approxRes.mul(divisor); - while (approxRem.isNegative() || approxRem.gt(rem)) { - approx -= delta; - approxRes = fromNumber(approx, this.unsigned); - approxRem = approxRes.mul(divisor); - } - - // We know the answer can't be zero... and actually, zero would cause - // infinite recursion since we would make no progress. - if (approxRes.isZero()) - approxRes = ONE; - - res = res.add(approxRes); - rem = rem.sub(approxRem); - } - return res; - }; - - /** - * Returns this Long divided by the specified. This is an alias of {@link Long#divide}. - * @function - * @param {!Long|number|string} divisor Divisor - * @returns {!Long} Quotient - */ - LongPrototype.div = LongPrototype.divide; - - /** - * Returns this Long modulo the specified. - * @param {!Long|number|string} divisor Divisor - * @returns {!Long} Remainder - */ - LongPrototype.modulo = function modulo(divisor) { - if (!isLong(divisor)) - divisor = fromValue(divisor); - return this.sub(this.div(divisor).mul(divisor)); - }; - - /** - * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}. - * @function - * @param {!Long|number|string} divisor Divisor - * @returns {!Long} Remainder - */ - LongPrototype.mod = LongPrototype.modulo; - - /** - * Returns the bitwise NOT of this Long. - * @returns {!Long} - */ - LongPrototype.not = function not() { - return fromBits(~this.low, ~this.high, this.unsigned); - }; - - /** - * Returns the bitwise AND of this Long and the specified. - * @param {!Long|number|string} other Other Long - * @returns {!Long} - */ - LongPrototype.and = function and(other) { - if (!isLong(other)) - other = fromValue(other); - return fromBits(this.low & other.low, this.high & other.high, this.unsigned); - }; - - /** - * Returns the bitwise OR of this Long and the specified. - * @param {!Long|number|string} other Other Long - * @returns {!Long} - */ - LongPrototype.or = function or(other) { - if (!isLong(other)) - other = fromValue(other); - return fromBits(this.low | other.low, this.high | other.high, this.unsigned); - }; - - /** - * Returns the bitwise XOR of this Long and the given one. - * @param {!Long|number|string} other Other Long - * @returns {!Long} - */ - LongPrototype.xor = function xor(other) { - if (!isLong(other)) - other = fromValue(other); - return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); - }; - - /** - * Returns this Long with bits shifted to the left by the given amount. - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ - LongPrototype.shiftLeft = function shiftLeft(numBits) { - if (isLong(numBits)) - numBits = numBits.toInt(); - if ((numBits &= 63) === 0) - return this; - else if (numBits < 32) - return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned); - else - return fromBits(0, this.low << (numBits - 32), this.unsigned); - }; - - /** - * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}. - * @function - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ - LongPrototype.shl = LongPrototype.shiftLeft; - - /** - * Returns this Long with bits arithmetically shifted to the right by the given amount. - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ - LongPrototype.shiftRight = function shiftRight(numBits) { - if (isLong(numBits)) - numBits = numBits.toInt(); - if ((numBits &= 63) === 0) - return this; - else if (numBits < 32) - return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned); - else - return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned); - }; - - /** - * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}. - * @function - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ - LongPrototype.shr = LongPrototype.shiftRight; - - /** - * Returns this Long with bits logically shifted to the right by the given amount. - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ - LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) { - if (isLong(numBits)) - numBits = numBits.toInt(); - numBits &= 63; - if (numBits === 0) - return this; - else { - var high = this.high; - if (numBits < 32) { - var low = this.low; - return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned); - } else if (numBits === 32) - return fromBits(high, 0, this.unsigned); - else - return fromBits(high >>> (numBits - 32), 0, this.unsigned); - } - }; - - /** - * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}. - * @function - * @param {number|!Long} numBits Number of bits - * @returns {!Long} Shifted Long - */ - LongPrototype.shru = LongPrototype.shiftRightUnsigned; - - /** - * Converts this Long to signed. - * @returns {!Long} Signed long - */ - LongPrototype.toSigned = function toSigned() { - if (!this.unsigned) - return this; - return fromBits(this.low, this.high, false); - }; - - /** - * Converts this Long to unsigned. - * @returns {!Long} Unsigned long - */ - LongPrototype.toUnsigned = function toUnsigned() { - if (this.unsigned) - return this; - return fromBits(this.low, this.high, true); - }; - - /** - * Converts this Long to its byte representation. - * @param {boolean=} le Whether little or big endian, defaults to big endian - * @returns {!Array.} Byte representation - */ - LongPrototype.toBytes = function(le) { - return le ? this.toBytesLE() : this.toBytesBE(); - } - - /** - * Converts this Long to its little endian byte representation. - * @returns {!Array.} Little endian byte representation - */ - LongPrototype.toBytesLE = function() { - var hi = this.high, - lo = this.low; - return [ - lo & 0xff, - (lo >>> 8) & 0xff, - (lo >>> 16) & 0xff, - (lo >>> 24) & 0xff, - hi & 0xff, - (hi >>> 8) & 0xff, - (hi >>> 16) & 0xff, - (hi >>> 24) & 0xff - ]; - } - - /** - * Converts this Long to its big endian byte representation. - * @returns {!Array.} Big endian byte representation - */ - LongPrototype.toBytesBE = function() { - var hi = this.high, - lo = this.low; - return [ - (hi >>> 24) & 0xff, - (hi >>> 16) & 0xff, - (hi >>> 8) & 0xff, - hi & 0xff, - (lo >>> 24) & 0xff, - (lo >>> 16) & 0xff, - (lo >>> 8) & 0xff, - lo & 0xff - ]; - } - - return Long; -}); diff --git a/ui/scripts/protobufjs/protobuf.js b/ui/scripts/protobufjs/protobuf.js deleted file mode 100644 index c1f5fd07c58..00000000000 --- a/ui/scripts/protobufjs/protobuf.js +++ /dev/null @@ -1,5242 +0,0 @@ -/* - Copyright 2013 Daniel Wirtz - - 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. - */ - -/** - * @license protobuf.js (c) 2013 Daniel Wirtz - * Released under the Apache License, Version 2.0 - * see: https://github.com/dcodeIO/protobuf.js for details - */ -(function(global, factory) { - - /* AMD */ if (typeof define === 'function' && define["amd"]) - define(["bytebuffer"], factory); - /* CommonJS */ else if (typeof require === "function" && typeof module === "object" && module && module["exports"]) - module["exports"] = factory(require("bytebuffer"), true); - /* Global */ else - (global["dcodeIO"] = global["dcodeIO"] || {})["ProtoBuf"] = factory(global["dcodeIO"]["ByteBuffer"]); - -})(this, function(ByteBuffer, isCommonJS) { - "use strict"; - - /** - * The ProtoBuf namespace. - * @exports ProtoBuf - * @namespace - * @expose - */ - var ProtoBuf = {}; - - /** - * @type {!function(new: ByteBuffer, ...[*])} - * @expose - */ - ProtoBuf.ByteBuffer = ByteBuffer; - - /** - * @type {?function(new: Long, ...[*])} - * @expose - */ - ProtoBuf.Long = ByteBuffer.Long || null; - - /** - * ProtoBuf.js version. - * @type {string} - * @const - * @expose - */ - ProtoBuf.VERSION = "5.0.1"; - - /** - * Wire types. - * @type {Object.} - * @const - * @expose - */ - ProtoBuf.WIRE_TYPES = {}; - - /** - * Varint wire type. - * @type {number} - * @expose - */ - ProtoBuf.WIRE_TYPES.VARINT = 0; - - /** - * Fixed 64 bits wire type. - * @type {number} - * @const - * @expose - */ - ProtoBuf.WIRE_TYPES.BITS64 = 1; - - /** - * Length delimited wire type. - * @type {number} - * @const - * @expose - */ - ProtoBuf.WIRE_TYPES.LDELIM = 2; - - /** - * Start group wire type. - * @type {number} - * @const - * @expose - */ - ProtoBuf.WIRE_TYPES.STARTGROUP = 3; - - /** - * End group wire type. - * @type {number} - * @const - * @expose - */ - ProtoBuf.WIRE_TYPES.ENDGROUP = 4; - - /** - * Fixed 32 bits wire type. - * @type {number} - * @const - * @expose - */ - ProtoBuf.WIRE_TYPES.BITS32 = 5; - - /** - * Packable wire types. - * @type {!Array.} - * @const - * @expose - */ - ProtoBuf.PACKABLE_WIRE_TYPES = [ - ProtoBuf.WIRE_TYPES.VARINT, - ProtoBuf.WIRE_TYPES.BITS64, - ProtoBuf.WIRE_TYPES.BITS32 - ]; - - /** - * Types. - * @dict - * @type {!Object.} - * @const - * @expose - */ - ProtoBuf.TYPES = { - // According to the protobuf spec. - "int32": { - name: "int32", - wireType: ProtoBuf.WIRE_TYPES.VARINT, - defaultValue: 0 - }, - "uint32": { - name: "uint32", - wireType: ProtoBuf.WIRE_TYPES.VARINT, - defaultValue: 0 - }, - "sint32": { - name: "sint32", - wireType: ProtoBuf.WIRE_TYPES.VARINT, - defaultValue: 0 - }, - "int64": { - name: "int64", - wireType: ProtoBuf.WIRE_TYPES.VARINT, - defaultValue: ProtoBuf.Long ? ProtoBuf.Long.ZERO : undefined - }, - "uint64": { - name: "uint64", - wireType: ProtoBuf.WIRE_TYPES.VARINT, - defaultValue: ProtoBuf.Long ? ProtoBuf.Long.UZERO : undefined - }, - "sint64": { - name: "sint64", - wireType: ProtoBuf.WIRE_TYPES.VARINT, - defaultValue: ProtoBuf.Long ? ProtoBuf.Long.ZERO : undefined - }, - "bool": { - name: "bool", - wireType: ProtoBuf.WIRE_TYPES.VARINT, - defaultValue: false - }, - "double": { - name: "double", - wireType: ProtoBuf.WIRE_TYPES.BITS64, - defaultValue: 0 - }, - "string": { - name: "string", - wireType: ProtoBuf.WIRE_TYPES.LDELIM, - defaultValue: "" - }, - "bytes": { - name: "bytes", - wireType: ProtoBuf.WIRE_TYPES.LDELIM, - defaultValue: null // overridden in the code, must be a unique instance - }, - "fixed32": { - name: "fixed32", - wireType: ProtoBuf.WIRE_TYPES.BITS32, - defaultValue: 0 - }, - "sfixed32": { - name: "sfixed32", - wireType: ProtoBuf.WIRE_TYPES.BITS32, - defaultValue: 0 - }, - "fixed64": { - name: "fixed64", - wireType: ProtoBuf.WIRE_TYPES.BITS64, - defaultValue: ProtoBuf.Long ? ProtoBuf.Long.UZERO : undefined - }, - "sfixed64": { - name: "sfixed64", - wireType: ProtoBuf.WIRE_TYPES.BITS64, - defaultValue: ProtoBuf.Long ? ProtoBuf.Long.ZERO : undefined - }, - "float": { - name: "float", - wireType: ProtoBuf.WIRE_TYPES.BITS32, - defaultValue: 0 - }, - "enum": { - name: "enum", - wireType: ProtoBuf.WIRE_TYPES.VARINT, - defaultValue: 0 - }, - "message": { - name: "message", - wireType: ProtoBuf.WIRE_TYPES.LDELIM, - defaultValue: null - }, - "group": { - name: "group", - wireType: ProtoBuf.WIRE_TYPES.STARTGROUP, - defaultValue: null - } - }; - - /** - * Valid map key types. - * @type {!Array.>} - * @const - * @expose - */ - ProtoBuf.MAP_KEY_TYPES = [ - ProtoBuf.TYPES["int32"], - ProtoBuf.TYPES["sint32"], - ProtoBuf.TYPES["sfixed32"], - ProtoBuf.TYPES["uint32"], - ProtoBuf.TYPES["fixed32"], - ProtoBuf.TYPES["int64"], - ProtoBuf.TYPES["sint64"], - ProtoBuf.TYPES["sfixed64"], - ProtoBuf.TYPES["uint64"], - ProtoBuf.TYPES["fixed64"], - ProtoBuf.TYPES["bool"], - ProtoBuf.TYPES["string"], - ProtoBuf.TYPES["bytes"] - ]; - - /** - * Minimum field id. - * @type {number} - * @const - * @expose - */ - ProtoBuf.ID_MIN = 1; - - /** - * Maximum field id. - * @type {number} - * @const - * @expose - */ - ProtoBuf.ID_MAX = 0x1FFFFFFF; - - /** - * If set to `true`, field names will be converted from underscore notation to camel case. Defaults to `false`. - * Must be set prior to parsing. - * @type {boolean} - * @expose - */ - ProtoBuf.convertFieldsToCamelCase = false; - - /** - * By default, messages are populated with (setX, set_x) accessors for each field. This can be disabled by - * setting this to `false` prior to building messages. - * @type {boolean} - * @expose - */ - ProtoBuf.populateAccessors = true; - - /** - * By default, messages are populated with default values if a field is not present on the wire. To disable - * this behavior, set this setting to `false`. - * @type {boolean} - * @expose - */ - ProtoBuf.populateDefaults = true; - - /** - * @alias ProtoBuf.Util - * @expose - */ - ProtoBuf.Util = (function() { - "use strict"; - - /** - * ProtoBuf utilities. - * @exports ProtoBuf.Util - * @namespace - */ - var Util = {}; - - /** - * Flag if running in node or not. - * @type {boolean} - * @const - * @expose - */ - Util.IS_NODE = !!( - typeof process === 'object' && process+'' === '[object process]' && !process['browser'] - ); - - /** - * Constructs a XMLHttpRequest object. - * @return {XMLHttpRequest} - * @throws {Error} If XMLHttpRequest is not supported - * @expose - */ - Util.XHR = function() { - // No dependencies please, ref: http://www.quirksmode.org/js/xmlhttp.html - var XMLHttpFactories = [ - function () {return new XMLHttpRequest()}, - function () {return new ActiveXObject("Msxml2.XMLHTTP")}, - function () {return new ActiveXObject("Msxml3.XMLHTTP")}, - function () {return new ActiveXObject("Microsoft.XMLHTTP")} - ]; - /** @type {?XMLHttpRequest} */ - var xhr = null; - for (var i=0;i} - * @expose - */ - ProtoBuf.Lang = { - - // Characters always ending a statement - DELIM: /[\s\{\}=;:\[\],'"\(\)<>]/g, - - // Field rules - RULE: /^(?:required|optional|repeated|map)$/, - - // Field types - TYPE: /^(?:double|float|int32|uint32|sint32|int64|uint64|sint64|fixed32|sfixed32|fixed64|sfixed64|bool|string|bytes)$/, - - // Names - NAME: /^[a-zA-Z_][a-zA-Z_0-9]*$/, - - // Type definitions - TYPEDEF: /^[a-zA-Z][a-zA-Z_0-9]*$/, - - // Type references - TYPEREF: /^(?:\.?[a-zA-Z_][a-zA-Z_0-9]*)+$/, - - // Fully qualified type references - FQTYPEREF: /^(?:\.[a-zA-Z][a-zA-Z_0-9]*)+$/, - - // All numbers - NUMBER: /^-?(?:[1-9][0-9]*|0|0[xX][0-9a-fA-F]+|0[0-7]+|([0-9]*(\.[0-9]*)?([Ee][+-]?[0-9]+)?)|inf|nan)$/, - - // Decimal numbers - NUMBER_DEC: /^(?:[1-9][0-9]*|0)$/, - - // Hexadecimal numbers - NUMBER_HEX: /^0[xX][0-9a-fA-F]+$/, - - // Octal numbers - NUMBER_OCT: /^0[0-7]+$/, - - // Floating point numbers - NUMBER_FLT: /^([0-9]*(\.[0-9]*)?([Ee][+-]?[0-9]+)?|inf|nan)$/, - - // Booleans - BOOL: /^(?:true|false)$/i, - - // Id numbers - ID: /^(?:[1-9][0-9]*|0|0[xX][0-9a-fA-F]+|0[0-7]+)$/, - - // Negative id numbers (enum values) - NEGID: /^\-?(?:[1-9][0-9]*|0|0[xX][0-9a-fA-F]+|0[0-7]+)$/, - - // Whitespaces - WHITESPACE: /\s/, - - // All strings - STRING: /(?:"([^"\\]*(?:\\.[^"\\]*)*)")|(?:'([^'\\]*(?:\\.[^'\\]*)*)')/g, - - // Double quoted strings - STRING_DQ: /(?:"([^"\\]*(?:\\.[^"\\]*)*)")/g, - - // Single quoted strings - STRING_SQ: /(?:'([^'\\]*(?:\\.[^'\\]*)*)')/g - }; - - /** - * @alias ProtoBuf.DotProto - * @expose - */ - ProtoBuf.DotProto = (function(ProtoBuf, Lang) { - "use strict"; - - /** - * Utilities to parse .proto files. - * @exports ProtoBuf.DotProto - * @namespace - */ - var DotProto = {}; - - /** - * Constructs a new Tokenizer. - * @exports ProtoBuf.DotProto.Tokenizer - * @class prototype tokenizer - * @param {string} proto Proto to tokenize - * @constructor - */ - var Tokenizer = function(proto) { - - /** - * Source to parse. - * @type {string} - * @expose - */ - this.source = proto+""; - - /** - * Current index. - * @type {number} - * @expose - */ - this.index = 0; - - /** - * Current line. - * @type {number} - * @expose - */ - this.line = 1; - - /** - * Token stack. - * @type {!Array.} - * @expose - */ - this.stack = []; - - /** - * Opening character of the current string read, if any. - * @type {?string} - * @private - */ - this._stringOpen = null; - }; - - /** - * @alias ProtoBuf.DotProto.Tokenizer.prototype - * @inner - */ - var TokenizerPrototype = Tokenizer.prototype; - - /** - * Reads a string beginning at the current index. - * @return {string} - * @private - */ - TokenizerPrototype._readString = function() { - var re = this._stringOpen === '"' - ? Lang.STRING_DQ - : Lang.STRING_SQ; - re.lastIndex = this.index - 1; // Include the open quote - var match = re.exec(this.source); - if (!match) - throw Error("unterminated string"); - this.index = re.lastIndex; - this.stack.push(this._stringOpen); - this._stringOpen = null; - return match[1]; - }; - - /** - * Gets the next token and advances by one. - * @return {?string} Token or `null` on EOF - * @expose - */ - TokenizerPrototype.next = function() { - if (this.stack.length > 0) - return this.stack.shift(); - if (this.index >= this.source.length) - return null; - if (this._stringOpen !== null) - return this._readString(); - - var repeat, - prev, - next; - do { - repeat = false; - - // Strip white spaces - while (Lang.WHITESPACE.test(next = this.source.charAt(this.index))) { - if (next === '\n') - ++this.line; - if (++this.index === this.source.length) - return null; - } - - // Strip comments - if (this.source.charAt(this.index) === '/') { - ++this.index; - if (this.source.charAt(this.index) === '/') { // Line - while (this.source.charAt(++this.index) !== '\n') - if (this.index == this.source.length) - return null; - ++this.index; - ++this.line; - repeat = true; - } else if ((next = this.source.charAt(this.index)) === '*') { /* Block */ - do { - if (next === '\n') - ++this.line; - if (++this.index === this.source.length) - return null; - prev = next; - next = this.source.charAt(this.index); - } while (prev !== '*' || next !== '/'); - ++this.index; - repeat = true; - } else - return '/'; - } - } while (repeat); - - if (this.index === this.source.length) - return null; - - // Read the next token - var end = this.index; - Lang.DELIM.lastIndex = 0; - var delim = Lang.DELIM.test(this.source.charAt(end++)); - if (!delim) - while(end < this.source.length && !Lang.DELIM.test(this.source.charAt(end))) - ++end; - var token = this.source.substring(this.index, this.index = end); - if (token === '"' || token === "'") - this._stringOpen = token; - return token; - }; - - /** - * Peeks for the next token. - * @return {?string} Token or `null` on EOF - * @expose - */ - TokenizerPrototype.peek = function() { - if (this.stack.length === 0) { - var token = this.next(); - if (token === null) - return null; - this.stack.push(token); - } - return this.stack[0]; - }; - - /** - * Skips a specific token and throws if it differs. - * @param {string} expected Expected token - * @throws {Error} If the actual token differs - */ - TokenizerPrototype.skip = function(expected) { - var actual = this.next(); - if (actual !== expected) - throw Error("illegal '"+actual+"', '"+expected+"' expected"); - }; - - /** - * Omits an optional token. - * @param {string} expected Expected optional token - * @returns {boolean} `true` if the token exists - */ - TokenizerPrototype.omit = function(expected) { - if (this.peek() === expected) { - this.next(); - return true; - } - return false; - }; - - /** - * Returns a string representation of this object. - * @return {string} String representation as of "Tokenizer(index/length)" - * @expose - */ - TokenizerPrototype.toString = function() { - return "Tokenizer ("+this.index+"/"+this.source.length+" at line "+this.line+")"; - }; - - /** - * @alias ProtoBuf.DotProto.Tokenizer - * @expose - */ - DotProto.Tokenizer = Tokenizer; - - /** - * Constructs a new Parser. - * @exports ProtoBuf.DotProto.Parser - * @class prototype parser - * @param {string} source Source - * @constructor - */ - var Parser = function(source) { - - /** - * Tokenizer. - * @type {!ProtoBuf.DotProto.Tokenizer} - * @expose - */ - this.tn = new Tokenizer(source); - - /** - * Whether parsing proto3 or not. - * @type {boolean} - */ - this.proto3 = false; - }; - - /** - * @alias ProtoBuf.DotProto.Parser.prototype - * @inner - */ - var ParserPrototype = Parser.prototype; - - /** - * Parses the source. - * @returns {!Object} - * @throws {Error} If the source cannot be parsed - * @expose - */ - ParserPrototype.parse = function() { - var topLevel = { - "name": "[ROOT]", // temporary - "package": null, - "messages": [], - "enums": [], - "imports": [], - "options": {}, - "services": [] - // "syntax": undefined - }; - var token, - head = true, - weak; - try { - while (token = this.tn.next()) { - switch (token) { - case 'package': - if (!head || topLevel["package"] !== null) - throw Error("unexpected 'package'"); - token = this.tn.next(); - if (!Lang.TYPEREF.test(token)) - throw Error("illegal package name: " + token); - this.tn.skip(";"); - topLevel["package"] = token; - break; - case 'import': - if (!head) - throw Error("unexpected 'import'"); - token = this.tn.peek(); - if (token === "public" || (weak = token === "weak")) // token ignored - this.tn.next(); - token = this._readString(); - this.tn.skip(";"); - if (!weak) // import ignored - topLevel["imports"].push(token); - break; - case 'syntax': - if (!head) - throw Error("unexpected 'syntax'"); - this.tn.skip("="); - if ((topLevel["syntax"] = this._readString()) === "proto3") - this.proto3 = true; - this.tn.skip(";"); - break; - case 'message': - this._parseMessage(topLevel, null); - head = false; - break; - case 'enum': - this._parseEnum(topLevel); - head = false; - break; - case 'option': - this._parseOption(topLevel); - break; - case 'service': - this._parseService(topLevel); - break; - case 'extend': - this._parseExtend(topLevel); - break; - default: - throw Error("unexpected '" + token + "'"); - } - } - } catch (e) { - e.message = "Parse error at line "+this.tn.line+": " + e.message; - throw e; - } - delete topLevel["name"]; - return topLevel; - }; - - /** - * Parses the specified source. - * @returns {!Object} - * @throws {Error} If the source cannot be parsed - * @expose - */ - Parser.parse = function(source) { - return new Parser(source).parse(); - }; - - // ----- Conversion ------ - - /** - * Converts a numerical string to an id. - * @param {string} value - * @param {boolean=} mayBeNegative - * @returns {number} - * @inner - */ - function mkId(value, mayBeNegative) { - var id = -1, - sign = 1; - if (value.charAt(0) == '-') { - sign = -1; - value = value.substring(1); - } - if (Lang.NUMBER_DEC.test(value)) - id = parseInt(value); - else if (Lang.NUMBER_HEX.test(value)) - id = parseInt(value.substring(2), 16); - else if (Lang.NUMBER_OCT.test(value)) - id = parseInt(value.substring(1), 8); - else - throw Error("illegal id value: " + (sign < 0 ? '-' : '') + value); - id = (sign*id)|0; // Force to 32bit - if (!mayBeNegative && id < 0) - throw Error("illegal id value: " + (sign < 0 ? '-' : '') + value); - return id; - } - - /** - * Converts a numerical string to a number. - * @param {string} val - * @returns {number} - * @inner - */ - function mkNumber(val) { - var sign = 1; - if (val.charAt(0) == '-') { - sign = -1; - val = val.substring(1); - } - if (Lang.NUMBER_DEC.test(val)) - return sign * parseInt(val, 10); - else if (Lang.NUMBER_HEX.test(val)) - return sign * parseInt(val.substring(2), 16); - else if (Lang.NUMBER_OCT.test(val)) - return sign * parseInt(val.substring(1), 8); - else if (val === 'inf') - return sign * Infinity; - else if (val === 'nan') - return NaN; - else if (Lang.NUMBER_FLT.test(val)) - return sign * parseFloat(val); - throw Error("illegal number value: " + (sign < 0 ? '-' : '') + val); - } - - // ----- Reading ------ - - /** - * Reads a string. - * @returns {string} - * @private - */ - ParserPrototype._readString = function() { - var value = "", - token, - delim; - do { - delim = this.tn.next(); - if (delim !== "'" && delim !== '"') - throw Error("illegal string delimiter: "+delim); - value += this.tn.next(); - this.tn.skip(delim); - token = this.tn.peek(); - } while (token === '"' || token === '"'); // multi line? - return value; - }; - - /** - * Reads a value. - * @param {boolean=} mayBeTypeRef - * @returns {number|boolean|string} - * @private - */ - ParserPrototype._readValue = function(mayBeTypeRef) { - var token = this.tn.peek(), - value; - if (token === '"' || token === "'") - return this._readString(); - this.tn.next(); - if (Lang.NUMBER.test(token)) - return mkNumber(token); - if (Lang.BOOL.test(token)) - return (token.toLowerCase() === 'true'); - if (mayBeTypeRef && Lang.TYPEREF.test(token)) - return token; - throw Error("illegal value: "+token); - - }; - - // ----- Parsing constructs ----- - - /** - * Parses a namespace option. - * @param {!Object} parent Parent definition - * @param {boolean=} isList - * @private - */ - ParserPrototype._parseOption = function(parent, isList) { - var token = this.tn.next(), - custom = false; - if (token === '(') { - custom = true; - token = this.tn.next(); - } - if (!Lang.TYPEREF.test(token)) - // we can allow options of the form google.protobuf.* since they will just get ignored anyways - // if (!/google\.protobuf\./.test(token)) // FIXME: Why should that not be a valid typeref? - throw Error("illegal option name: "+token); - var name = token; - if (custom) { // (my_method_option).foo, (my_method_option), some_method_option, (foo.my_option).bar - this.tn.skip(')'); - name = '('+name+')'; - token = this.tn.peek(); - if (Lang.FQTYPEREF.test(token)) { - name += token; - this.tn.next(); - } - } - this.tn.skip('='); - this._parseOptionValue(parent, name); - if (!isList) - this.tn.skip(";"); - }; - - /** - * Sets an option on the specified options object. - * @param {!Object.} options - * @param {string} name - * @param {string|number|boolean} value - * @inner - */ - function setOption(options, name, value) { - if (typeof options[name] === 'undefined') - options[name] = value; - else { - if (!Array.isArray(options[name])) - options[name] = [ options[name] ]; - options[name].push(value); - } - } - - /** - * Parses an option value. - * @param {!Object} parent - * @param {string} name - * @private - */ - ParserPrototype._parseOptionValue = function(parent, name) { - var token = this.tn.peek(); - if (token !== '{') { // Plain value - setOption(parent["options"], name, this._readValue(true)); - } else { // Aggregate options - this.tn.skip("{"); - while ((token = this.tn.next()) !== '}') { - if (!Lang.NAME.test(token)) - throw Error("illegal option name: " + name + "." + token); - if (this.tn.omit(":")) - setOption(parent["options"], name + "." + token, this._readValue(true)); - else - this._parseOptionValue(parent, name + "." + token); - } - } - }; - - /** - * Parses a service definition. - * @param {!Object} parent Parent definition - * @private - */ - ParserPrototype._parseService = function(parent) { - var token = this.tn.next(); - if (!Lang.NAME.test(token)) - throw Error("illegal service name at line "+this.tn.line+": "+token); - var name = token; - var svc = { - "name": name, - "rpc": {}, - "options": {} - }; - this.tn.skip("{"); - while ((token = this.tn.next()) !== '}') { - if (token === "option") - this._parseOption(svc); - else if (token === 'rpc') - this._parseServiceRPC(svc); - else - throw Error("illegal service token: "+token); - } - this.tn.omit(";"); - parent["services"].push(svc); - }; - - /** - * Parses a RPC service definition of the form ['rpc', name, (request), 'returns', (response)]. - * @param {!Object} svc Service definition - * @private - */ - ParserPrototype._parseServiceRPC = function(svc) { - var type = "rpc", - token = this.tn.next(); - if (!Lang.NAME.test(token)) - throw Error("illegal rpc service method name: "+token); - var name = token; - var method = { - "request": null, - "response": null, - "request_stream": false, - "response_stream": false, - "options": {} - }; - this.tn.skip("("); - token = this.tn.next(); - if (token.toLowerCase() === "stream") { - method["request_stream"] = true; - token = this.tn.next(); - } - if (!Lang.TYPEREF.test(token)) - throw Error("illegal rpc service request type: "+token); - method["request"] = token; - this.tn.skip(")"); - token = this.tn.next(); - if (token.toLowerCase() !== "returns") - throw Error("illegal rpc service request type delimiter: "+token); - this.tn.skip("("); - token = this.tn.next(); - if (token.toLowerCase() === "stream") { - method["response_stream"] = true; - token = this.tn.next(); - } - method["response"] = token; - this.tn.skip(")"); - token = this.tn.peek(); - if (token === '{') { - this.tn.next(); - while ((token = this.tn.next()) !== '}') { - if (token === 'option') - this._parseOption(method); - else - throw Error("illegal rpc service token: " + token); - } - this.tn.omit(";"); - } else - this.tn.skip(";"); - if (typeof svc[type] === 'undefined') - svc[type] = {}; - svc[type][name] = method; - }; - - /** - * Parses a message definition. - * @param {!Object} parent Parent definition - * @param {!Object=} fld Field definition if this is a group - * @returns {!Object} - * @private - */ - ParserPrototype._parseMessage = function(parent, fld) { - var isGroup = !!fld, - token = this.tn.next(); - var msg = { - "name": "", - "fields": [], - "enums": [], - "messages": [], - "options": {}, - "services": [], - "oneofs": {} - // "extensions": undefined - }; - if (!Lang.NAME.test(token)) - throw Error("illegal "+(isGroup ? "group" : "message")+" name: "+token); - msg["name"] = token; - if (isGroup) { - this.tn.skip("="); - fld["id"] = mkId(this.tn.next()); - msg["isGroup"] = true; - } - token = this.tn.peek(); - if (token === '[' && fld) - this._parseFieldOptions(fld); - this.tn.skip("{"); - while ((token = this.tn.next()) !== '}') { - if (Lang.RULE.test(token)) - this._parseMessageField(msg, token); - else if (token === "oneof") - this._parseMessageOneOf(msg); - else if (token === "enum") - this._parseEnum(msg); - else if (token === "message") - this._parseMessage(msg); - else if (token === "option") - this._parseOption(msg); - else if (token === "service") - this._parseService(msg); - else if (token === "extensions") - if (msg.hasOwnProperty("extensions")) { - msg["extensions"] = msg["extensions"].concat(this._parseExtensionRanges()) - } else { - msg["extensions"] = this._parseExtensionRanges(); - } - else if (token === "reserved") - this._parseIgnored(); // TODO - else if (token === "extend") - this._parseExtend(msg); - else if (Lang.TYPEREF.test(token)) { - if (!this.proto3) - throw Error("illegal field rule: "+token); - this._parseMessageField(msg, "optional", token); - } else - throw Error("illegal message token: "+token); - } - this.tn.omit(";"); - parent["messages"].push(msg); - return msg; - }; - - /** - * Parses an ignored statement. - * @private - */ - ParserPrototype._parseIgnored = function() { - while (this.tn.peek() !== ';') - this.tn.next(); - this.tn.skip(";"); - }; - - /** - * Parses a message field. - * @param {!Object} msg Message definition - * @param {string} rule Field rule - * @param {string=} type Field type if already known (never known for maps) - * @returns {!Object} Field descriptor - * @private - */ - ParserPrototype._parseMessageField = function(msg, rule, type) { - if (!Lang.RULE.test(rule)) - throw Error("illegal message field rule: "+rule); - var fld = { - "rule": rule, - "type": "", - "name": "", - "options": {}, - "id": 0 - }; - var token; - if (rule === "map") { - - if (type) - throw Error("illegal type: " + type); - this.tn.skip('<'); - token = this.tn.next(); - if (!Lang.TYPE.test(token) && !Lang.TYPEREF.test(token)) - throw Error("illegal message field type: " + token); - fld["keytype"] = token; - this.tn.skip(','); - token = this.tn.next(); - if (!Lang.TYPE.test(token) && !Lang.TYPEREF.test(token)) - throw Error("illegal message field: " + token); - fld["type"] = token; - this.tn.skip('>'); - token = this.tn.next(); - if (!Lang.NAME.test(token)) - throw Error("illegal message field name: " + token); - fld["name"] = token; - this.tn.skip("="); - fld["id"] = mkId(this.tn.next()); - token = this.tn.peek(); - if (token === '[') - this._parseFieldOptions(fld); - this.tn.skip(";"); - - } else { - - type = typeof type !== 'undefined' ? type : this.tn.next(); - - if (type === "group") { - - // "A [legacy] group simply combines a nested message type and a field into a single declaration. In your - // code, you can treat this message just as if it had a Result type field called result (the latter name is - // converted to lower-case so that it does not conflict with the former)." - var grp = this._parseMessage(msg, fld); - if (!/^[A-Z]/.test(grp["name"])) - throw Error('illegal group name: '+grp["name"]); - fld["type"] = grp["name"]; - fld["name"] = grp["name"].toLowerCase(); - this.tn.omit(";"); - - } else { - - if (!Lang.TYPE.test(type) && !Lang.TYPEREF.test(type)) - throw Error("illegal message field type: " + type); - fld["type"] = type; - token = this.tn.next(); - if (!Lang.NAME.test(token)) - throw Error("illegal message field name: " + token); - fld["name"] = token; - this.tn.skip("="); - fld["id"] = mkId(this.tn.next()); - token = this.tn.peek(); - if (token === "[") - this._parseFieldOptions(fld); - this.tn.skip(";"); - - } - } - msg["fields"].push(fld); - return fld; - }; - - /** - * Parses a message oneof. - * @param {!Object} msg Message definition - * @private - */ - ParserPrototype._parseMessageOneOf = function(msg) { - var token = this.tn.next(); - if (!Lang.NAME.test(token)) - throw Error("illegal oneof name: "+token); - var name = token, - fld; - var fields = []; - this.tn.skip("{"); - while ((token = this.tn.next()) !== "}") { - fld = this._parseMessageField(msg, "optional", token); - fld["oneof"] = name; - fields.push(fld["id"]); - } - this.tn.omit(";"); - msg["oneofs"][name] = fields; - }; - - /** - * Parses a set of field option definitions. - * @param {!Object} fld Field definition - * @private - */ - ParserPrototype._parseFieldOptions = function(fld) { - this.tn.skip("["); - var token, - first = true; - while ((token = this.tn.peek()) !== ']') { - if (!first) - this.tn.skip(","); - this._parseOption(fld, true); - first = false; - } - this.tn.next(); - }; - - /** - * Parses an enum. - * @param {!Object} msg Message definition - * @private - */ - ParserPrototype._parseEnum = function(msg) { - var enm = { - "name": "", - "values": [], - "options": {} - }; - var token = this.tn.next(); - if (!Lang.NAME.test(token)) - throw Error("illegal name: "+token); - enm["name"] = token; - this.tn.skip("{"); - while ((token = this.tn.next()) !== '}') { - if (token === "option") - this._parseOption(enm); - else { - if (!Lang.NAME.test(token)) - throw Error("illegal name: "+token); - this.tn.skip("="); - var val = { - "name": token, - "id": mkId(this.tn.next(), true) - }; - token = this.tn.peek(); - if (token === "[") - this._parseFieldOptions({ "options": {} }); - this.tn.skip(";"); - enm["values"].push(val); - } - } - this.tn.omit(";"); - msg["enums"].push(enm); - }; - - /** - * Parses extension / reserved ranges. - * @returns {!Array.>} - * @private - */ - ParserPrototype._parseExtensionRanges = function() { - var ranges = []; - var token, - range, - value; - do { - range = []; - while (true) { - token = this.tn.next(); - switch (token) { - case "min": - value = ProtoBuf.ID_MIN; - break; - case "max": - value = ProtoBuf.ID_MAX; - break; - default: - value = mkNumber(token); - break; - } - range.push(value); - if (range.length === 2) - break; - if (this.tn.peek() !== "to") { - range.push(value); - break; - } - this.tn.next(); - } - ranges.push(range); - } while (this.tn.omit(",")); - this.tn.skip(";"); - return ranges; - }; - - /** - * Parses an extend block. - * @param {!Object} parent Parent object - * @private - */ - ParserPrototype._parseExtend = function(parent) { - var token = this.tn.next(); - if (!Lang.TYPEREF.test(token)) - throw Error("illegal extend reference: "+token); - var ext = { - "ref": token, - "fields": [] - }; - this.tn.skip("{"); - while ((token = this.tn.next()) !== '}') { - if (Lang.RULE.test(token)) - this._parseMessageField(ext, token); - else if (Lang.TYPEREF.test(token)) { - if (!this.proto3) - throw Error("illegal field rule: "+token); - this._parseMessageField(ext, "optional", token); - } else - throw Error("illegal extend token: "+token); - } - this.tn.omit(";"); - parent["messages"].push(ext); - return ext; - }; - - // ----- General ----- - - /** - * Returns a string representation of this parser. - * @returns {string} - */ - ParserPrototype.toString = function() { - return "Parser at line "+this.tn.line; - }; - - /** - * @alias ProtoBuf.DotProto.Parser - * @expose - */ - DotProto.Parser = Parser; - - return DotProto; - - })(ProtoBuf, ProtoBuf.Lang); - - /** - * @alias ProtoBuf.Reflect - * @expose - */ - ProtoBuf.Reflect = (function(ProtoBuf) { - "use strict"; - - /** - * Reflection types. - * @exports ProtoBuf.Reflect - * @namespace - */ - var Reflect = {}; - - /** - * Constructs a Reflect base class. - * @exports ProtoBuf.Reflect.T - * @constructor - * @abstract - * @param {!ProtoBuf.Builder} builder Builder reference - * @param {?ProtoBuf.Reflect.T} parent Parent object - * @param {string} name Object name - */ - var T = function(builder, parent, name) { - - /** - * Builder reference. - * @type {!ProtoBuf.Builder} - * @expose - */ - this.builder = builder; - - /** - * Parent object. - * @type {?ProtoBuf.Reflect.T} - * @expose - */ - this.parent = parent; - - /** - * Object name in namespace. - * @type {string} - * @expose - */ - this.name = name; - - /** - * Fully qualified class name - * @type {string} - * @expose - */ - this.className; - }; - - /** - * @alias ProtoBuf.Reflect.T.prototype - * @inner - */ - var TPrototype = T.prototype; - - /** - * Returns the fully qualified name of this object. - * @returns {string} Fully qualified name as of ".PATH.TO.THIS" - * @expose - */ - TPrototype.fqn = function() { - var name = this.name, - ptr = this; - do { - ptr = ptr.parent; - if (ptr == null) - break; - name = ptr.name+"."+name; - } while (true); - return name; - }; - - /** - * Returns a string representation of this Reflect object (its fully qualified name). - * @param {boolean=} includeClass Set to true to include the class name. Defaults to false. - * @return String representation - * @expose - */ - TPrototype.toString = function(includeClass) { - return (includeClass ? this.className + " " : "") + this.fqn(); - }; - - /** - * Builds this type. - * @throws {Error} If this type cannot be built directly - * @expose - */ - TPrototype.build = function() { - throw Error(this.toString(true)+" cannot be built directly"); - }; - - /** - * @alias ProtoBuf.Reflect.T - * @expose - */ - Reflect.T = T; - - /** - * Constructs a new Namespace. - * @exports ProtoBuf.Reflect.Namespace - * @param {!ProtoBuf.Builder} builder Builder reference - * @param {?ProtoBuf.Reflect.Namespace} parent Namespace parent - * @param {string} name Namespace name - * @param {Object.=} options Namespace options - * @param {string?} syntax The syntax level of this definition (e.g., proto3) - * @constructor - * @extends ProtoBuf.Reflect.T - */ - var Namespace = function(builder, parent, name, options, syntax) { - T.call(this, builder, parent, name); - - /** - * @override - */ - this.className = "Namespace"; - - /** - * Children inside the namespace. - * @type {!Array.} - */ - this.children = []; - - /** - * Options. - * @type {!Object.} - */ - this.options = options || {}; - - /** - * Syntax level (e.g., proto2 or proto3). - * @type {!string} - */ - this.syntax = syntax || "proto2"; - }; - - /** - * @alias ProtoBuf.Reflect.Namespace.prototype - * @inner - */ - var NamespacePrototype = Namespace.prototype = Object.create(T.prototype); - - /** - * Returns an array of the namespace's children. - * @param {ProtoBuf.Reflect.T=} type Filter type (returns instances of this type only). Defaults to null (all children). - * @return {Array.} - * @expose - */ - NamespacePrototype.getChildren = function(type) { - type = type || null; - if (type == null) - return this.children.slice(); - var children = []; - for (var i=0, k=this.children.length; i} qn Qualified name to resolve - * @param {boolean=} excludeNonNamespace Excludes non-namespace types, defaults to `false` - * @return {?ProtoBuf.Reflect.Namespace} The resolved type or null if not found - * @expose - */ - NamespacePrototype.resolve = function(qn, excludeNonNamespace) { - var part = typeof qn === 'string' ? qn.split(".") : qn, - ptr = this, - i = 0; - if (part[i] === "") { // Fully qualified name, e.g. ".My.Message' - while (ptr.parent !== null) - ptr = ptr.parent; - i++; - } - var child; - do { - do { - if (!(ptr instanceof Reflect.Namespace)) { - ptr = null; - break; - } - child = ptr.getChild(part[i]); - if (!child || !(child instanceof Reflect.T) || (excludeNonNamespace && !(child instanceof Reflect.Namespace))) { - ptr = null; - break; - } - ptr = child; i++; - } while (i < part.length); - if (ptr != null) - break; // Found - // Else search the parent - if (this.parent !== null) - return this.parent.resolve(qn, excludeNonNamespace); - } while (ptr != null); - return ptr; - }; - - /** - * Determines the shortest qualified name of the specified type, if any, relative to this namespace. - * @param {!ProtoBuf.Reflect.T} t Reflection type - * @returns {string} The shortest qualified name or, if there is none, the fqn - * @expose - */ - NamespacePrototype.qn = function(t) { - var part = [], ptr = t; - do { - part.unshift(ptr.name); - ptr = ptr.parent; - } while (ptr !== null); - for (var len=1; len <= part.length; len++) { - var qn = part.slice(part.length-len); - if (t === this.resolve(qn, t instanceof Reflect.Namespace)) - return qn.join("."); - } - return t.fqn(); - }; - - /** - * Builds the namespace and returns the runtime counterpart. - * @return {Object.} Runtime namespace - * @expose - */ - NamespacePrototype.build = function() { - /** @dict */ - var ns = {}; - var children = this.children; - for (var i=0, k=children.length, child; i} - */ - NamespacePrototype.buildOpt = function() { - var opt = {}, - keys = Object.keys(this.options); - for (var i=0, k=keys.length; i}null} Option value or NULL if there is no such option - */ - NamespacePrototype.getOption = function(name) { - if (typeof name === 'undefined') - return this.options; - return typeof this.options[name] !== 'undefined' ? this.options[name] : null; - }; - - /** - * @alias ProtoBuf.Reflect.Namespace - * @expose - */ - Reflect.Namespace = Namespace; - - /** - * Constructs a new Element implementation that checks and converts values for a - * particular field type, as appropriate. - * - * An Element represents a single value: either the value of a singular field, - * or a value contained in one entry of a repeated field or map field. This - * class does not implement these higher-level concepts; it only encapsulates - * the low-level typechecking and conversion. - * - * @exports ProtoBuf.Reflect.Element - * @param {{name: string, wireType: number}} type Resolved data type - * @param {ProtoBuf.Reflect.T|null} resolvedType Resolved type, if relevant - * (e.g. submessage field). - * @param {boolean} isMapKey Is this element a Map key? The value will be - * converted to string form if so. - * @param {string} syntax Syntax level of defining message type, e.g., - * proto2 or proto3. - * @param {string} name Name of the field containing this element (for error - * messages) - * @constructor - */ - var Element = function(type, resolvedType, isMapKey, syntax, name) { - - /** - * Element type, as a string (e.g., int32). - * @type {{name: string, wireType: number}} - */ - this.type = type; - - /** - * Element type reference to submessage or enum definition, if needed. - * @type {ProtoBuf.Reflect.T|null} - */ - this.resolvedType = resolvedType; - - /** - * Element is a map key. - * @type {boolean} - */ - this.isMapKey = isMapKey; - - /** - * Syntax level of defining message type, e.g., proto2 or proto3. - * @type {string} - */ - this.syntax = syntax; - - /** - * Name of the field containing this element (for error messages) - * @type {string} - */ - this.name = name; - - if (isMapKey && ProtoBuf.MAP_KEY_TYPES.indexOf(type) < 0) - throw Error("Invalid map key type: " + type.name); - }; - - var ElementPrototype = Element.prototype; - - /** - * Obtains a (new) default value for the specified type. - * @param type {string|{name: string, wireType: number}} Field type - * @returns {*} Default value - * @inner - */ - function mkDefault(type) { - if (typeof type === 'string') - type = ProtoBuf.TYPES[type]; - if (typeof type.defaultValue === 'undefined') - throw Error("default value for type "+type.name+" is not supported"); - if (type == ProtoBuf.TYPES["bytes"]) - return new ByteBuffer(0); - return type.defaultValue; - } - - /** - * Returns the default value for this field in proto3. - * @function - * @param type {string|{name: string, wireType: number}} the field type - * @returns {*} Default value - */ - Element.defaultFieldValue = mkDefault; - - /** - * Makes a Long from a value. - * @param {{low: number, high: number, unsigned: boolean}|string|number} value Value - * @param {boolean=} unsigned Whether unsigned or not, defaults to reuse it from Long-like objects or to signed for - * strings and numbers - * @returns {!Long} - * @throws {Error} If the value cannot be converted to a Long - * @inner - */ - function mkLong(value, unsigned) { - if (value && typeof value.low === 'number' && typeof value.high === 'number' && typeof value.unsigned === 'boolean' - && value.low === value.low && value.high === value.high) - return new ProtoBuf.Long(value.low, value.high, typeof unsigned === 'undefined' ? value.unsigned : unsigned); - if (typeof value === 'string') - return ProtoBuf.Long.fromString(value, unsigned || false, 10); - if (typeof value === 'number') - return ProtoBuf.Long.fromNumber(value, unsigned || false); - throw Error("not convertible to Long"); - } - - ElementPrototype.toString = function() { - return (this.name || '') + (this.isMapKey ? 'map' : 'value') + ' element'; - } - - /** - * Checks if the given value can be set for an element of this type (singular - * field or one element of a repeated field or map). - * @param {*} value Value to check - * @return {*} Verified, maybe adjusted, value - * @throws {Error} If the value cannot be verified for this element slot - * @expose - */ - ElementPrototype.verifyValue = function(value) { - var self = this; - function fail(val, msg) { - throw Error("Illegal value for "+self.toString(true)+" of type "+self.type.name+": "+val+" ("+msg+")"); - } - switch (this.type) { - // Signed 32bit - case ProtoBuf.TYPES["int32"]: - case ProtoBuf.TYPES["sint32"]: - case ProtoBuf.TYPES["sfixed32"]: - // Account for !NaN: value === value - if (typeof value !== 'number' || (value === value && value % 1 !== 0)) - fail(typeof value, "not an integer"); - return value > 4294967295 ? value | 0 : value; - - // Unsigned 32bit - case ProtoBuf.TYPES["uint32"]: - case ProtoBuf.TYPES["fixed32"]: - if (typeof value !== 'number' || (value === value && value % 1 !== 0)) - fail(typeof value, "not an integer"); - return value < 0 ? value >>> 0 : value; - - // Signed 64bit - case ProtoBuf.TYPES["int64"]: - case ProtoBuf.TYPES["sint64"]: - case ProtoBuf.TYPES["sfixed64"]: { - if (ProtoBuf.Long) - try { - return mkLong(value, false); - } catch (e) { - fail(typeof value, e.message); - } - else - fail(typeof value, "requires Long.js"); - } - - // Unsigned 64bit - case ProtoBuf.TYPES["uint64"]: - case ProtoBuf.TYPES["fixed64"]: { - if (ProtoBuf.Long) - try { - return mkLong(value, true); - } catch (e) { - fail(typeof value, e.message); - } - else - fail(typeof value, "requires Long.js"); - } - - // Bool - case ProtoBuf.TYPES["bool"]: - if (typeof value !== 'boolean') - fail(typeof value, "not a boolean"); - return value; - - // Float - case ProtoBuf.TYPES["float"]: - case ProtoBuf.TYPES["double"]: - if (typeof value !== 'number') - fail(typeof value, "not a number"); - return value; - - // Length-delimited string - case ProtoBuf.TYPES["string"]: - if (typeof value !== 'string' && !(value && value instanceof String)) - fail(typeof value, "not a string"); - return ""+value; // Convert String object to string - - // Length-delimited bytes - case ProtoBuf.TYPES["bytes"]: - if (ByteBuffer.isByteBuffer(value)) - return value; - return ByteBuffer.wrap(value, "base64"); - - // Constant enum value - case ProtoBuf.TYPES["enum"]: { - var values = this.resolvedType.getChildren(ProtoBuf.Reflect.Enum.Value); - for (i=0; i 4294967295 || value < 0) - fail(typeof value, "not in range for uint32") - return value; - } else { - // proto2 requires enum values to be valid. - fail(value, "not a valid enum value"); - } - } - // Embedded message - case ProtoBuf.TYPES["group"]: - case ProtoBuf.TYPES["message"]: { - if (!value || typeof value !== 'object') - fail(typeof value, "object expected"); - if (value instanceof this.resolvedType.clazz) - return value; - if (value instanceof ProtoBuf.Builder.Message) { - // Mismatched type: Convert to object (see: https://github.com/dcodeIO/ProtoBuf.js/issues/180) - var obj = {}; - for (var i in value) - if (value.hasOwnProperty(i)) - obj[i] = value[i]; - value = obj; - } - // Else let's try to construct one from a key-value object - return new (this.resolvedType.clazz)(value); // May throw for a hundred of reasons - } - } - - // We should never end here - throw Error("[INTERNAL] Illegal value for "+this.toString(true)+": "+value+" (undefined type "+this.type+")"); - }; - - /** - * Calculates the byte length of an element on the wire. - * @param {number} id Field number - * @param {*} value Field value - * @returns {number} Byte length - * @throws {Error} If the value cannot be calculated - * @expose - */ - ElementPrototype.calculateLength = function(id, value) { - if (value === null) return 0; // Nothing to encode - // Tag has already been written - var n; - switch (this.type) { - case ProtoBuf.TYPES["int32"]: - return value < 0 ? ByteBuffer.calculateVarint64(value) : ByteBuffer.calculateVarint32(value); - case ProtoBuf.TYPES["uint32"]: - return ByteBuffer.calculateVarint32(value); - case ProtoBuf.TYPES["sint32"]: - return ByteBuffer.calculateVarint32(ByteBuffer.zigZagEncode32(value)); - case ProtoBuf.TYPES["fixed32"]: - case ProtoBuf.TYPES["sfixed32"]: - case ProtoBuf.TYPES["float"]: - return 4; - case ProtoBuf.TYPES["int64"]: - case ProtoBuf.TYPES["uint64"]: - return ByteBuffer.calculateVarint64(value); - case ProtoBuf.TYPES["sint64"]: - return ByteBuffer.calculateVarint64(ByteBuffer.zigZagEncode64(value)); - case ProtoBuf.TYPES["fixed64"]: - case ProtoBuf.TYPES["sfixed64"]: - return 8; - case ProtoBuf.TYPES["bool"]: - return 1; - case ProtoBuf.TYPES["enum"]: - return ByteBuffer.calculateVarint32(value); - case ProtoBuf.TYPES["double"]: - return 8; - case ProtoBuf.TYPES["string"]: - n = ByteBuffer.calculateUTF8Bytes(value); - return ByteBuffer.calculateVarint32(n) + n; - case ProtoBuf.TYPES["bytes"]: - if (value.remaining() < 0) - throw Error("Illegal value for "+this.toString(true)+": "+value.remaining()+" bytes remaining"); - return ByteBuffer.calculateVarint32(value.remaining()) + value.remaining(); - case ProtoBuf.TYPES["message"]: - n = this.resolvedType.calculate(value); - return ByteBuffer.calculateVarint32(n) + n; - case ProtoBuf.TYPES["group"]: - n = this.resolvedType.calculate(value); - return n + ByteBuffer.calculateVarint32((id << 3) | ProtoBuf.WIRE_TYPES.ENDGROUP); - } - // We should never end here - throw Error("[INTERNAL] Illegal value to encode in "+this.toString(true)+": "+value+" (unknown type)"); - }; - - /** - * Encodes a value to the specified buffer. Does not encode the key. - * @param {number} id Field number - * @param {*} value Field value - * @param {ByteBuffer} buffer ByteBuffer to encode to - * @return {ByteBuffer} The ByteBuffer for chaining - * @throws {Error} If the value cannot be encoded - * @expose - */ - ElementPrototype.encodeValue = function(id, value, buffer) { - if (value === null) return buffer; // Nothing to encode - // Tag has already been written - - switch (this.type) { - // 32bit signed varint - case ProtoBuf.TYPES["int32"]: - // "If you use int32 or int64 as the type for a negative number, the resulting varint is always ten bytes - // long – it is, effectively, treated like a very large unsigned integer." (see #122) - if (value < 0) - buffer.writeVarint64(value); - else - buffer.writeVarint32(value); - break; - - // 32bit unsigned varint - case ProtoBuf.TYPES["uint32"]: - buffer.writeVarint32(value); - break; - - // 32bit varint zig-zag - case ProtoBuf.TYPES["sint32"]: - buffer.writeVarint32ZigZag(value); - break; - - // Fixed unsigned 32bit - case ProtoBuf.TYPES["fixed32"]: - buffer.writeUint32(value); - break; - - // Fixed signed 32bit - case ProtoBuf.TYPES["sfixed32"]: - buffer.writeInt32(value); - break; - - // 64bit varint as-is - case ProtoBuf.TYPES["int64"]: - case ProtoBuf.TYPES["uint64"]: - buffer.writeVarint64(value); // throws - break; - - // 64bit varint zig-zag - case ProtoBuf.TYPES["sint64"]: - buffer.writeVarint64ZigZag(value); // throws - break; - - // Fixed unsigned 64bit - case ProtoBuf.TYPES["fixed64"]: - buffer.writeUint64(value); // throws - break; - - // Fixed signed 64bit - case ProtoBuf.TYPES["sfixed64"]: - buffer.writeInt64(value); // throws - break; - - // Bool - case ProtoBuf.TYPES["bool"]: - if (typeof value === 'string') - buffer.writeVarint32(value.toLowerCase() === 'false' ? 0 : !!value); - else - buffer.writeVarint32(value ? 1 : 0); - break; - - // Constant enum value - case ProtoBuf.TYPES["enum"]: - buffer.writeVarint32(value); - break; - - // 32bit float - case ProtoBuf.TYPES["float"]: - buffer.writeFloat32(value); - break; - - // 64bit float - case ProtoBuf.TYPES["double"]: - buffer.writeFloat64(value); - break; - - // Length-delimited string - case ProtoBuf.TYPES["string"]: - buffer.writeVString(value); - break; - - // Length-delimited bytes - case ProtoBuf.TYPES["bytes"]: - if (value.remaining() < 0) - throw Error("Illegal value for "+this.toString(true)+": "+value.remaining()+" bytes remaining"); - var prevOffset = value.offset; - buffer.writeVarint32(value.remaining()); - buffer.append(value); - value.offset = prevOffset; - break; - - // Embedded message - case ProtoBuf.TYPES["message"]: - var bb = new ByteBuffer().LE(); - this.resolvedType.encode(value, bb); - buffer.writeVarint32(bb.offset); - buffer.append(bb.flip()); - break; - - // Legacy group - case ProtoBuf.TYPES["group"]: - this.resolvedType.encode(value, buffer); - buffer.writeVarint32((id << 3) | ProtoBuf.WIRE_TYPES.ENDGROUP); - break; - - default: - // We should never end here - throw Error("[INTERNAL] Illegal value to encode in "+this.toString(true)+": "+value+" (unknown type)"); - } - return buffer; - }; - - /** - * Decode one element value from the specified buffer. - * @param {ByteBuffer} buffer ByteBuffer to decode from - * @param {number} wireType The field wire type - * @param {number} id The field number - * @return {*} Decoded value - * @throws {Error} If the field cannot be decoded - * @expose - */ - ElementPrototype.decode = function(buffer, wireType, id) { - if (wireType != this.type.wireType) - throw Error("Unexpected wire type for element"); - - var value, nBytes; - switch (this.type) { - // 32bit signed varint - case ProtoBuf.TYPES["int32"]: - return buffer.readVarint32() | 0; - - // 32bit unsigned varint - case ProtoBuf.TYPES["uint32"]: - return buffer.readVarint32() >>> 0; - - // 32bit signed varint zig-zag - case ProtoBuf.TYPES["sint32"]: - return buffer.readVarint32ZigZag() | 0; - - // Fixed 32bit unsigned - case ProtoBuf.TYPES["fixed32"]: - return buffer.readUint32() >>> 0; - - case ProtoBuf.TYPES["sfixed32"]: - return buffer.readInt32() | 0; - - // 64bit signed varint - case ProtoBuf.TYPES["int64"]: - return buffer.readVarint64(); - - // 64bit unsigned varint - case ProtoBuf.TYPES["uint64"]: - return buffer.readVarint64().toUnsigned(); - - // 64bit signed varint zig-zag - case ProtoBuf.TYPES["sint64"]: - return buffer.readVarint64ZigZag(); - - // Fixed 64bit unsigned - case ProtoBuf.TYPES["fixed64"]: - return buffer.readUint64(); - - // Fixed 64bit signed - case ProtoBuf.TYPES["sfixed64"]: - return buffer.readInt64(); - - // Bool varint - case ProtoBuf.TYPES["bool"]: - return !!buffer.readVarint32(); - - // Constant enum value (varint) - case ProtoBuf.TYPES["enum"]: - // The following Builder.Message#set will already throw - return buffer.readVarint32(); - - // 32bit float - case ProtoBuf.TYPES["float"]: - return buffer.readFloat(); - - // 64bit float - case ProtoBuf.TYPES["double"]: - return buffer.readDouble(); - - // Length-delimited string - case ProtoBuf.TYPES["string"]: - return buffer.readVString(); - - // Length-delimited bytes - case ProtoBuf.TYPES["bytes"]: { - nBytes = buffer.readVarint32(); - if (buffer.remaining() < nBytes) - throw Error("Illegal number of bytes for "+this.toString(true)+": "+nBytes+" required but got only "+buffer.remaining()); - value = buffer.clone(); // Offset already set - value.limit = value.offset+nBytes; - buffer.offset += nBytes; - return value; - } - - // Length-delimited embedded message - case ProtoBuf.TYPES["message"]: { - nBytes = buffer.readVarint32(); - return this.resolvedType.decode(buffer, nBytes); - } - - // Legacy group - case ProtoBuf.TYPES["group"]: - return this.resolvedType.decode(buffer, -1, id); - } - - // We should never end here - throw Error("[INTERNAL] Illegal decode type"); - }; - - /** - * Converts a value from a string to the canonical element type. - * - * Legal only when isMapKey is true. - * - * @param {string} str The string value - * @returns {*} The value - */ - ElementPrototype.valueFromString = function(str) { - if (!this.isMapKey) { - throw Error("valueFromString() called on non-map-key element"); - } - - switch (this.type) { - case ProtoBuf.TYPES["int32"]: - case ProtoBuf.TYPES["sint32"]: - case ProtoBuf.TYPES["sfixed32"]: - case ProtoBuf.TYPES["uint32"]: - case ProtoBuf.TYPES["fixed32"]: - return this.verifyValue(parseInt(str)); - - case ProtoBuf.TYPES["int64"]: - case ProtoBuf.TYPES["sint64"]: - case ProtoBuf.TYPES["sfixed64"]: - case ProtoBuf.TYPES["uint64"]: - case ProtoBuf.TYPES["fixed64"]: - // Long-based fields support conversions from string already. - return this.verifyValue(str); - - case ProtoBuf.TYPES["bool"]: - return str === "true"; - - case ProtoBuf.TYPES["string"]: - return this.verifyValue(str); - - case ProtoBuf.TYPES["bytes"]: - return ByteBuffer.fromBinary(str); - } - }; - - /** - * Converts a value from the canonical element type to a string. - * - * It should be the case that `valueFromString(valueToString(val))` returns - * a value equivalent to `verifyValue(val)` for every legal value of `val` - * according to this element type. - * - * This may be used when the element must be stored or used as a string, - * e.g., as a map key on an Object. - * - * Legal only when isMapKey is true. - * - * @param {*} val The value - * @returns {string} The string form of the value. - */ - ElementPrototype.valueToString = function(value) { - if (!this.isMapKey) { - throw Error("valueToString() called on non-map-key element"); - } - - if (this.type === ProtoBuf.TYPES["bytes"]) { - return value.toString("binary"); - } else { - return value.toString(); - } - }; - - /** - * @alias ProtoBuf.Reflect.Element - * @expose - */ - Reflect.Element = Element; - - /** - * Constructs a new Message. - * @exports ProtoBuf.Reflect.Message - * @param {!ProtoBuf.Builder} builder Builder reference - * @param {!ProtoBuf.Reflect.Namespace} parent Parent message or namespace - * @param {string} name Message name - * @param {Object.=} options Message options - * @param {boolean=} isGroup `true` if this is a legacy group - * @param {string?} syntax The syntax level of this definition (e.g., proto3) - * @constructor - * @extends ProtoBuf.Reflect.Namespace - */ - var Message = function(builder, parent, name, options, isGroup, syntax) { - Namespace.call(this, builder, parent, name, options, syntax); - - /** - * @override - */ - this.className = "Message"; - - /** - * Extensions range. - * @type {!Array.|undefined} - * @expose - */ - this.extensions = undefined; - - /** - * Runtime message class. - * @type {?function(new:ProtoBuf.Builder.Message)} - * @expose - */ - this.clazz = null; - - /** - * Whether this is a legacy group or not. - * @type {boolean} - * @expose - */ - this.isGroup = !!isGroup; - - // The following cached collections are used to efficiently iterate over or look up fields when decoding. - - /** - * Cached fields. - * @type {?Array.} - * @private - */ - this._fields = null; - - /** - * Cached fields by id. - * @type {?Object.} - * @private - */ - this._fieldsById = null; - - /** - * Cached fields by name. - * @type {?Object.} - * @private - */ - this._fieldsByName = null; - }; - - /** - * @alias ProtoBuf.Reflect.Message.prototype - * @inner - */ - var MessagePrototype = Message.prototype = Object.create(Namespace.prototype); - - /** - * Builds the message and returns the runtime counterpart, which is a fully functional class. - * @see ProtoBuf.Builder.Message - * @param {boolean=} rebuild Whether to rebuild or not, defaults to false - * @return {ProtoBuf.Reflect.Message} Message class - * @throws {Error} If the message cannot be built - * @expose - */ - MessagePrototype.build = function(rebuild) { - if (this.clazz && !rebuild) - return this.clazz; - - // Create the runtime Message class in its own scope - var clazz = (function(ProtoBuf, T) { - - var fields = T.getChildren(ProtoBuf.Reflect.Message.Field), - oneofs = T.getChildren(ProtoBuf.Reflect.Message.OneOf); - - /** - * Constructs a new runtime Message. - * @name ProtoBuf.Builder.Message - * @class Barebone of all runtime messages. - * @param {!Object.|string} values Preset values - * @param {...string} var_args - * @constructor - * @throws {Error} If the message cannot be created - */ - var Message = function(values, var_args) { - ProtoBuf.Builder.Message.call(this); - - // Create virtual oneof properties - for (var i=0, k=oneofs.length; i 0) { - var value; - // Set field values from a values object - if (arguments.length === 1 && values !== null && typeof values === 'object' && - /* not _another_ Message */ (typeof values.encode !== 'function' || values instanceof Message) && - /* not a repeated field */ !Array.isArray(values) && - /* not a Map */ !(values instanceof ProtoBuf.Map) && - /* not a ByteBuffer */ !ByteBuffer.isByteBuffer(values) && - /* not an ArrayBuffer */ !(values instanceof ArrayBuffer) && - /* not a Long */ !(ProtoBuf.Long && values instanceof ProtoBuf.Long)) { - this.$set(values); - } else // Set field values from arguments, in declaration order - for (i=0, k=arguments.length; i} keyOrObj String key or plain object holding multiple values - * @param {(*|boolean)=} value Value to set if key is a string, otherwise omitted - * @param {boolean=} noAssert Whether to not assert for an actual field / proper value type, defaults to `false` - * @returns {!ProtoBuf.Builder.Message} this - * @throws {Error} If the value cannot be set - * @expose - */ - MessagePrototype.set = function(keyOrObj, value, noAssert) { - if (keyOrObj && typeof keyOrObj === 'object') { - noAssert = value; - for (var ikey in keyOrObj) - if (keyOrObj.hasOwnProperty(ikey) && typeof (value = keyOrObj[ikey]) !== 'undefined') - this.$set(ikey, value, noAssert); - return this; - } - var field = T._fieldsByName[keyOrObj]; - if (!noAssert) { - if (!field) - throw Error(this+"#"+keyOrObj+" is not a field: undefined"); - if (!(field instanceof ProtoBuf.Reflect.Message.Field)) - throw Error(this+"#"+keyOrObj+" is not a field: "+field.toString(true)); - this[field.name] = (value = field.verifyValue(value)); // May throw - } else - this[keyOrObj] = value; - if (field && field.oneof) { // Field is part of an OneOf (not a virtual OneOf field) - var currentField = this[field.oneof.name]; // Virtual field references currently set field - if (value !== null) { - if (currentField !== null && currentField !== field.name) - this[currentField] = null; // Clear currently set field - this[field.oneof.name] = field.name; // Point virtual field at this field - } else if (/* value === null && */currentField === keyOrObj) - this[field.oneof.name] = null; // Clear virtual field (current field explicitly cleared) - } - return this; - }; - - /** - * Sets a field's value. This is an alias for [@link ProtoBuf.Builder.Message#set}. - * @name ProtoBuf.Builder.Message#$set - * @function - * @param {string|!Object.} keyOrObj String key or plain object holding multiple values - * @param {(*|boolean)=} value Value to set if key is a string, otherwise omitted - * @param {boolean=} noAssert Whether to not assert the value, defaults to `false` - * @throws {Error} If the value cannot be set - * @expose - */ - MessagePrototype.$set = MessagePrototype.set; - - /** - * Gets a field's value. - * @name ProtoBuf.Builder.Message#get - * @function - * @param {string} key Key - * @param {boolean=} noAssert Whether to not assert for an actual field, defaults to `false` - * @return {*} Value - * @throws {Error} If there is no such field - * @expose - */ - MessagePrototype.get = function(key, noAssert) { - if (noAssert) - return this[key]; - var field = T._fieldsByName[key]; - if (!field || !(field instanceof ProtoBuf.Reflect.Message.Field)) - throw Error(this+"#"+key+" is not a field: undefined"); - if (!(field instanceof ProtoBuf.Reflect.Message.Field)) - throw Error(this+"#"+key+" is not a field: "+field.toString(true)); - return this[field.name]; - }; - - /** - * Gets a field's value. This is an alias for {@link ProtoBuf.Builder.Message#$get}. - * @name ProtoBuf.Builder.Message#$get - * @function - * @param {string} key Key - * @return {*} Value - * @throws {Error} If there is no such field - * @expose - */ - MessagePrototype.$get = MessagePrototype.get; - - // Getters and setters - - for (var i=0; i} data Data payload - * @param {(!ByteBuffer|boolean)=} buffer ByteBuffer to encode to. Will create a new one and flip it if omitted. - * @param {boolean=} noVerify Whether to not verify field values, defaults to `false` - * @return {!ByteBuffer} Encoded message as a ByteBuffer - * @expose - */ - Message.encode = function(data, buffer, noVerify) { - return new Message(data).encode(buffer, noVerify); - }; - - /** - * Calculates the byte length of the message. - * @name ProtoBuf.Builder.Message#calculate - * @function - * @returns {number} Byte length - * @throws {Error} If the message cannot be calculated or if required fields are missing. - * @expose - */ - MessagePrototype.calculate = function() { - return T.calculate(this); - }; - - /** - * Encodes the varint32 length-delimited message. - * @name ProtoBuf.Builder.Message#encodeDelimited - * @function - * @param {(!ByteBuffer|boolean)=} buffer ByteBuffer to encode to. Will create a new one and flip it if omitted. - * @param {boolean=} noVerify Whether to not verify field values, defaults to `false` - * @return {!ByteBuffer} Encoded message as a ByteBuffer - * @throws {Error} If the message cannot be encoded or if required fields are missing. The later still - * returns the encoded ByteBuffer in the `encoded` property on the error. - * @expose - */ - MessagePrototype.encodeDelimited = function(buffer, noVerify) { - var isNew = false; - if (!buffer) - buffer = new ByteBuffer(), - isNew = true; - var enc = new ByteBuffer().LE(); - T.encode(this, enc, noVerify).flip(); - buffer.writeVarint32(enc.remaining()); - buffer.append(enc); - return isNew ? buffer.flip() : buffer; - }; - - /** - * Directly encodes the message to an ArrayBuffer. - * @name ProtoBuf.Builder.Message#encodeAB - * @function - * @return {ArrayBuffer} Encoded message as ArrayBuffer - * @throws {Error} If the message cannot be encoded or if required fields are missing. The later still - * returns the encoded ArrayBuffer in the `encoded` property on the error. - * @expose - */ - MessagePrototype.encodeAB = function() { - try { - return this.encode().toArrayBuffer(); - } catch (e) { - if (e["encoded"]) e["encoded"] = e["encoded"].toArrayBuffer(); - throw(e); - } - }; - - /** - * Returns the message as an ArrayBuffer. This is an alias for {@link ProtoBuf.Builder.Message#encodeAB}. - * @name ProtoBuf.Builder.Message#toArrayBuffer - * @function - * @return {ArrayBuffer} Encoded message as ArrayBuffer - * @throws {Error} If the message cannot be encoded or if required fields are missing. The later still - * returns the encoded ArrayBuffer in the `encoded` property on the error. - * @expose - */ - MessagePrototype.toArrayBuffer = MessagePrototype.encodeAB; - - /** - * Directly encodes the message to a node Buffer. - * @name ProtoBuf.Builder.Message#encodeNB - * @function - * @return {!Buffer} - * @throws {Error} If the message cannot be encoded, not running under node.js or if required fields are - * missing. The later still returns the encoded node Buffer in the `encoded` property on the error. - * @expose - */ - MessagePrototype.encodeNB = function() { - try { - return this.encode().toBuffer(); - } catch (e) { - if (e["encoded"]) e["encoded"] = e["encoded"].toBuffer(); - throw(e); - } - }; - - /** - * Returns the message as a node Buffer. This is an alias for {@link ProtoBuf.Builder.Message#encodeNB}. - * @name ProtoBuf.Builder.Message#toBuffer - * @function - * @return {!Buffer} - * @throws {Error} If the message cannot be encoded or if required fields are missing. The later still - * returns the encoded node Buffer in the `encoded` property on the error. - * @expose - */ - MessagePrototype.toBuffer = MessagePrototype.encodeNB; - - /** - * Directly encodes the message to a base64 encoded string. - * @name ProtoBuf.Builder.Message#encode64 - * @function - * @return {string} Base64 encoded string - * @throws {Error} If the underlying buffer cannot be encoded or if required fields are missing. The later - * still returns the encoded base64 string in the `encoded` property on the error. - * @expose - */ - MessagePrototype.encode64 = function() { - try { - return this.encode().toBase64(); - } catch (e) { - if (e["encoded"]) e["encoded"] = e["encoded"].toBase64(); - throw(e); - } - }; - - /** - * Returns the message as a base64 encoded string. This is an alias for {@link ProtoBuf.Builder.Message#encode64}. - * @name ProtoBuf.Builder.Message#toBase64 - * @function - * @return {string} Base64 encoded string - * @throws {Error} If the message cannot be encoded or if required fields are missing. The later still - * returns the encoded base64 string in the `encoded` property on the error. - * @expose - */ - MessagePrototype.toBase64 = MessagePrototype.encode64; - - /** - * Directly encodes the message to a hex encoded string. - * @name ProtoBuf.Builder.Message#encodeHex - * @function - * @return {string} Hex encoded string - * @throws {Error} If the underlying buffer cannot be encoded or if required fields are missing. The later - * still returns the encoded hex string in the `encoded` property on the error. - * @expose - */ - MessagePrototype.encodeHex = function() { - try { - return this.encode().toHex(); - } catch (e) { - if (e["encoded"]) e["encoded"] = e["encoded"].toHex(); - throw(e); - } - }; - - /** - * Returns the message as a hex encoded string. This is an alias for {@link ProtoBuf.Builder.Message#encodeHex}. - * @name ProtoBuf.Builder.Message#toHex - * @function - * @return {string} Hex encoded string - * @throws {Error} If the message cannot be encoded or if required fields are missing. The later still - * returns the encoded hex string in the `encoded` property on the error. - * @expose - */ - MessagePrototype.toHex = MessagePrototype.encodeHex; - - /** - * Clones a message object or field value to a raw object. - * @param {*} obj Object to clone - * @param {boolean} binaryAsBase64 Whether to include binary data as base64 strings or as a buffer otherwise - * @param {boolean} longsAsStrings Whether to encode longs as strings - * @param {!ProtoBuf.Reflect.T=} resolvedType The resolved field type if a field - * @returns {*} Cloned object - * @inner - */ - function cloneRaw(obj, binaryAsBase64, longsAsStrings, resolvedType) { - if (obj === null || typeof obj !== 'object') { - // Convert enum values to their respective names - if (resolvedType && resolvedType instanceof ProtoBuf.Reflect.Enum) { - var name = ProtoBuf.Reflect.Enum.getName(resolvedType.object, obj); - if (name !== null) - return name; - } - // Pass-through string, number, boolean, null... - return obj; - } - // Convert ByteBuffers to raw buffer or strings - if (ByteBuffer.isByteBuffer(obj)) - return binaryAsBase64 ? obj.toBase64() : obj.toBuffer(); - // Convert Longs to proper objects or strings - if (ProtoBuf.Long.isLong(obj)) - return longsAsStrings ? obj.toString() : ProtoBuf.Long.fromValue(obj); - var clone; - // Clone arrays - if (Array.isArray(obj)) { - clone = []; - obj.forEach(function(v, k) { - clone[k] = cloneRaw(v, binaryAsBase64, longsAsStrings, resolvedType); - }); - return clone; - } - clone = {}; - // Convert maps to objects - if (obj instanceof ProtoBuf.Map) { - var it = obj.entries(); - for (var e = it.next(); !e.done; e = it.next()) - clone[obj.keyElem.valueToString(e.value[0])] = cloneRaw(e.value[1], binaryAsBase64, longsAsStrings, obj.valueElem.resolvedType); - return clone; - } - // Everything else is a non-null object - var type = obj.$type, - field = undefined; - for (var i in obj) - if (obj.hasOwnProperty(i)) { - if (type && (field = type.getChild(i))) - clone[i] = cloneRaw(obj[i], binaryAsBase64, longsAsStrings, field.resolvedType); - else - clone[i] = cloneRaw(obj[i], binaryAsBase64, longsAsStrings); - } - return clone; - } - - /** - * Returns the message's raw payload. - * @param {boolean=} binaryAsBase64 Whether to include binary data as base64 strings instead of Buffers, defaults to `false` - * @param {boolean} longsAsStrings Whether to encode longs as strings - * @returns {Object.} Raw payload - * @expose - */ - MessagePrototype.toRaw = function(binaryAsBase64, longsAsStrings) { - return cloneRaw(this, !!binaryAsBase64, !!longsAsStrings, this.$type); - }; - - /** - * Encodes a message to JSON. - * @returns {string} JSON string - * @expose - */ - MessagePrototype.encodeJSON = function() { - return JSON.stringify( - cloneRaw(this, - /* binary-as-base64 */ true, - /* longs-as-strings */ true, - this.$type - ) - ); - }; - - /** - * Decodes a message from the specified buffer or string. - * @name ProtoBuf.Builder.Message.decode - * @function - * @param {!ByteBuffer|!ArrayBuffer|!Buffer|string} buffer Buffer to decode from - * @param {(number|string)=} length Message length. Defaults to decode all the remainig data. - * @param {string=} enc Encoding if buffer is a string: hex, utf8 (not recommended), defaults to base64 - * @return {!ProtoBuf.Builder.Message} Decoded message - * @throws {Error} If the message cannot be decoded or if required fields are missing. The later still - * returns the decoded message with missing fields in the `decoded` property on the error. - * @expose - * @see ProtoBuf.Builder.Message.decode64 - * @see ProtoBuf.Builder.Message.decodeHex - */ - Message.decode = function(buffer, length, enc) { - if (typeof length === 'string') - enc = length, - length = -1; - if (typeof buffer === 'string') - buffer = ByteBuffer.wrap(buffer, enc ? enc : "base64"); - else if (!ByteBuffer.isByteBuffer(buffer)) - buffer = ByteBuffer.wrap(buffer); // May throw - var le = buffer.littleEndian; - try { - var msg = T.decode(buffer.LE(), length); - buffer.LE(le); - return msg; - } catch (e) { - buffer.LE(le); - throw(e); - } - }; - - /** - * Decodes a varint32 length-delimited message from the specified buffer or string. - * @name ProtoBuf.Builder.Message.decodeDelimited - * @function - * @param {!ByteBuffer|!ArrayBuffer|!Buffer|string} buffer Buffer to decode from - * @param {string=} enc Encoding if buffer is a string: hex, utf8 (not recommended), defaults to base64 - * @return {ProtoBuf.Builder.Message} Decoded message or `null` if not enough bytes are available yet - * @throws {Error} If the message cannot be decoded or if required fields are missing. The later still - * returns the decoded message with missing fields in the `decoded` property on the error. - * @expose - */ - Message.decodeDelimited = function(buffer, enc) { - if (typeof buffer === 'string') - buffer = ByteBuffer.wrap(buffer, enc ? enc : "base64"); - else if (!ByteBuffer.isByteBuffer(buffer)) - buffer = ByteBuffer.wrap(buffer); // May throw - if (buffer.remaining() < 1) - return null; - var off = buffer.offset, - len = buffer.readVarint32(); - if (buffer.remaining() < len) { - buffer.offset = off; - return null; - } - try { - var msg = T.decode(buffer.slice(buffer.offset, buffer.offset + len).LE()); - buffer.offset += len; - return msg; - } catch (err) { - buffer.offset += len; - throw err; - } - }; - - /** - * Decodes the message from the specified base64 encoded string. - * @name ProtoBuf.Builder.Message.decode64 - * @function - * @param {string} str String to decode from - * @return {!ProtoBuf.Builder.Message} Decoded message - * @throws {Error} If the message cannot be decoded or if required fields are missing. The later still - * returns the decoded message with missing fields in the `decoded` property on the error. - * @expose - */ - Message.decode64 = function(str) { - return Message.decode(str, "base64"); - }; - - /** - * Decodes the message from the specified hex encoded string. - * @name ProtoBuf.Builder.Message.decodeHex - * @function - * @param {string} str String to decode from - * @return {!ProtoBuf.Builder.Message} Decoded message - * @throws {Error} If the message cannot be decoded or if required fields are missing. The later still - * returns the decoded message with missing fields in the `decoded` property on the error. - * @expose - */ - Message.decodeHex = function(str) { - return Message.decode(str, "hex"); - }; - - /** - * Decodes the message from a JSON string. - * @name ProtoBuf.Builder.Message.decodeJSON - * @function - * @param {string} str String to decode from - * @return {!ProtoBuf.Builder.Message} Decoded message - * @throws {Error} If the message cannot be decoded or if required fields are - * missing. - * @expose - */ - Message.decodeJSON = function(str) { - return new Message(JSON.parse(str)); - }; - - // Utility - - /** - * Returns a string representation of this Message. - * @name ProtoBuf.Builder.Message#toString - * @function - * @return {string} String representation as of ".Fully.Qualified.MessageName" - * @expose - */ - MessagePrototype.toString = function() { - return T.toString(); - }; - - // Properties - - /** - * Message options. - * @name ProtoBuf.Builder.Message.$options - * @type {Object.} - * @expose - */ - var $optionsS; // cc needs this - - /** - * Message options. - * @name ProtoBuf.Builder.Message#$options - * @type {Object.} - * @expose - */ - var $options; - - /** - * Reflection type. - * @name ProtoBuf.Builder.Message.$type - * @type {!ProtoBuf.Reflect.Message} - * @expose - */ - var $typeS; - - /** - * Reflection type. - * @name ProtoBuf.Builder.Message#$type - * @type {!ProtoBuf.Reflect.Message} - * @expose - */ - var $type; - - if (Object.defineProperty) - Object.defineProperty(Message, '$options', { "value": T.buildOpt() }), - Object.defineProperty(MessagePrototype, "$options", { "value": Message["$options"] }), - Object.defineProperty(Message, "$type", { "value": T }), - Object.defineProperty(MessagePrototype, "$type", { "value": T }); - - return Message; - - })(ProtoBuf, this); - - // Static enums and prototyped sub-messages / cached collections - this._fields = []; - this._fieldsById = {}; - this._fieldsByName = {}; - for (var i=0, k=this.children.length, child; i>> 3; - switch (wireType) { - case ProtoBuf.WIRE_TYPES.VARINT: - do tag = buf.readUint8(); - while ((tag & 0x80) === 0x80); - break; - case ProtoBuf.WIRE_TYPES.BITS64: - buf.offset += 8; - break; - case ProtoBuf.WIRE_TYPES.LDELIM: - tag = buf.readVarint32(); // reads the varint - buf.offset += tag; // skips n bytes - break; - case ProtoBuf.WIRE_TYPES.STARTGROUP: - skipTillGroupEnd(id, buf); - break; - case ProtoBuf.WIRE_TYPES.ENDGROUP: - if (id === expectedId) - return false; - else - throw Error("Illegal GROUPEND after unknown group: "+id+" ("+expectedId+" expected)"); - case ProtoBuf.WIRE_TYPES.BITS32: - buf.offset += 4; - break; - default: - throw Error("Illegal wire type in unknown group "+expectedId+": "+wireType); - } - return true; - } - - /** - * Decodes an encoded message and returns the decoded message. - * @param {ByteBuffer} buffer ByteBuffer to decode from - * @param {number=} length Message length. Defaults to decode all remaining data. - * @param {number=} expectedGroupEndId Expected GROUPEND id if this is a legacy group - * @return {ProtoBuf.Builder.Message} Decoded message - * @throws {Error} If the message cannot be decoded - * @expose - */ - MessagePrototype.decode = function(buffer, length, expectedGroupEndId) { - if (typeof length !== 'number') - length = -1; - var start = buffer.offset, - msg = new (this.clazz)(), - tag, wireType, id, field; - while (buffer.offset < start+length || (length === -1 && buffer.remaining() > 0)) { - tag = buffer.readVarint32(); - wireType = tag & 0x07; - id = tag >>> 3; - if (wireType === ProtoBuf.WIRE_TYPES.ENDGROUP) { - if (id !== expectedGroupEndId) - throw Error("Illegal group end indicator for "+this.toString(true)+": "+id+" ("+(expectedGroupEndId ? expectedGroupEndId+" expected" : "not a group")+")"); - break; - } - if (!(field = this._fieldsById[id])) { - // "messages created by your new code can be parsed by your old code: old binaries simply ignore the new field when parsing." - switch (wireType) { - case ProtoBuf.WIRE_TYPES.VARINT: - buffer.readVarint32(); - break; - case ProtoBuf.WIRE_TYPES.BITS32: - buffer.offset += 4; - break; - case ProtoBuf.WIRE_TYPES.BITS64: - buffer.offset += 8; - break; - case ProtoBuf.WIRE_TYPES.LDELIM: - var len = buffer.readVarint32(); - buffer.offset += len; - break; - case ProtoBuf.WIRE_TYPES.STARTGROUP: - while (skipTillGroupEnd(id, buffer)) {} - break; - default: - throw Error("Illegal wire type for unknown field "+id+" in "+this.toString(true)+"#decode: "+wireType); - } - continue; - } - if (field.repeated && !field.options["packed"]) { - msg[field.name].push(field.decode(wireType, buffer)); - } else if (field.map) { - var keyval = field.decode(wireType, buffer); - msg[field.name].set(keyval[0], keyval[1]); - } else { - msg[field.name] = field.decode(wireType, buffer); - if (field.oneof) { // Field is part of an OneOf (not a virtual OneOf field) - var currentField = msg[field.oneof.name]; // Virtual field references currently set field - if (currentField !== null && currentField !== field.name) - msg[currentField] = null; // Clear currently set field - msg[field.oneof.name] = field.name; // Point virtual field at this field - } - } - } - - // Check if all required fields are present and set default values for optional fields that are not - for (var i=0, k=this._fields.length; i=} options Options - * @param {!ProtoBuf.Reflect.Message.OneOf=} oneof Enclosing OneOf - * @param {string?} syntax The syntax level of this definition (e.g., proto3) - * @constructor - * @extends ProtoBuf.Reflect.T - */ - var Field = function(builder, message, rule, keytype, type, name, id, options, oneof, syntax) { - T.call(this, builder, message, name); - - /** - * @override - */ - this.className = "Message.Field"; - - /** - * Message field required flag. - * @type {boolean} - * @expose - */ - this.required = rule === "required"; - - /** - * Message field repeated flag. - * @type {boolean} - * @expose - */ - this.repeated = rule === "repeated"; - - /** - * Message field map flag. - * @type {boolean} - * @expose - */ - this.map = rule === "map"; - - /** - * Message field key type. Type reference string if unresolved, protobuf - * type if resolved. Valid only if this.map === true, null otherwise. - * @type {string|{name: string, wireType: number}|null} - * @expose - */ - this.keyType = keytype || null; - - /** - * Message field type. Type reference string if unresolved, protobuf type if - * resolved. In a map field, this is the value type. - * @type {string|{name: string, wireType: number}} - * @expose - */ - this.type = type; - - /** - * Resolved type reference inside the global namespace. - * @type {ProtoBuf.Reflect.T|null} - * @expose - */ - this.resolvedType = null; - - /** - * Unique message field id. - * @type {number} - * @expose - */ - this.id = id; - - /** - * Message field options. - * @type {!Object.} - * @dict - * @expose - */ - this.options = options || {}; - - /** - * Default value. - * @type {*} - * @expose - */ - this.defaultValue = null; - - /** - * Enclosing OneOf. - * @type {?ProtoBuf.Reflect.Message.OneOf} - * @expose - */ - this.oneof = oneof || null; - - /** - * Syntax level of this definition (e.g., proto3). - * @type {string} - * @expose - */ - this.syntax = syntax || 'proto2'; - - /** - * Original field name. - * @type {string} - * @expose - */ - this.originalName = this.name; // Used to revert camelcase transformation on naming collisions - - /** - * Element implementation. Created in build() after types are resolved. - * @type {ProtoBuf.Element} - * @expose - */ - this.element = null; - - /** - * Key element implementation, for map fields. Created in build() after - * types are resolved. - * @type {ProtoBuf.Element} - * @expose - */ - this.keyElement = null; - - // Convert field names to camel case notation if the override is set - if (this.builder.options['convertFieldsToCamelCase'] && !(this instanceof Message.ExtensionField)) - this.name = ProtoBuf.Util.toCamelCase(this.name); - }; - - /** - * @alias ProtoBuf.Reflect.Message.Field.prototype - * @inner - */ - var FieldPrototype = Field.prototype = Object.create(T.prototype); - - /** - * Builds the field. - * @override - * @expose - */ - FieldPrototype.build = function() { - this.element = new Element(this.type, this.resolvedType, false, this.syntax, this.name); - if (this.map) - this.keyElement = new Element(this.keyType, undefined, true, this.syntax, this.name); - - // In proto3, fields do not have field presence, and every field is set to - // its type's default value ("", 0, 0.0, or false). - if (this.syntax === 'proto3' && !this.repeated && !this.map) - this.defaultValue = Element.defaultFieldValue(this.type); - - // Otherwise, default values are present when explicitly specified - else if (typeof this.options['default'] !== 'undefined') - this.defaultValue = this.verifyValue(this.options['default']); - }; - - /** - * Checks if the given value can be set for this field. - * @param {*} value Value to check - * @param {boolean=} skipRepeated Whether to skip the repeated value check or not. Defaults to false. - * @return {*} Verified, maybe adjusted, value - * @throws {Error} If the value cannot be set for this field - * @expose - */ - FieldPrototype.verifyValue = function(value, skipRepeated) { - skipRepeated = skipRepeated || false; - var self = this; - function fail(val, msg) { - throw Error("Illegal value for "+self.toString(true)+" of type "+self.type.name+": "+val+" ("+msg+")"); - } - if (value === null) { // NULL values for optional fields - if (this.required) - fail(typeof value, "required"); - if (this.syntax === 'proto3' && this.type !== ProtoBuf.TYPES["message"]) - fail(typeof value, "proto3 field without field presence cannot be null"); - return null; - } - var i; - if (this.repeated && !skipRepeated) { // Repeated values as arrays - if (!Array.isArray(value)) - value = [value]; - var res = []; - for (i=0; i 0; - - case ProtoBuf.TYPES["bytes"]: - return value.remaining() > 0; - - case ProtoBuf.TYPES["enum"]: - return value !== 0; - - case ProtoBuf.TYPES["message"]: - return value !== null; - default: - return true; - } - }; - - /** - * Encodes the specified field value to the specified buffer. - * @param {*} value Verified field value - * @param {ByteBuffer} buffer ByteBuffer to encode to - * @param {!ProtoBuf.Builder.Message} message Runtime message - * @return {ByteBuffer} The ByteBuffer for chaining - * @throws {Error} If the field cannot be encoded - * @expose - */ - FieldPrototype.encode = function(value, buffer, message) { - if (this.type === null || typeof this.type !== 'object') - throw Error("[INTERNAL] Unresolved type in "+this.toString(true)+": "+this.type); - if (value === null || (this.repeated && value.length == 0)) - return buffer; // Optional omitted - try { - if (this.repeated) { - var i; - // "Only repeated fields of primitive numeric types (types which use the varint, 32-bit, or 64-bit wire - // types) can be declared 'packed'." - if (this.options["packed"] && ProtoBuf.PACKABLE_WIRE_TYPES.indexOf(this.type.wireType) >= 0) { - // "All of the elements of the field are packed into a single key-value pair with wire type 2 - // (length-delimited). Each element is encoded the same way it would be normally, except without a - // tag preceding it." - buffer.writeVarint32((this.id << 3) | ProtoBuf.WIRE_TYPES.LDELIM); - buffer.ensureCapacity(buffer.offset += 1); // We do not know the length yet, so let's assume a varint of length 1 - var start = buffer.offset; // Remember where the contents begin - for (i=0; i 1) { // We need to move the contents - var contents = buffer.slice(start, buffer.offset); - start += varintLen-1; - buffer.offset = start; - buffer.append(contents); - } - buffer.writeVarint32(len, start-varintLen); - } else { - // "If your message definition has repeated elements (without the [packed=true] option), the encoded - // message has zero or more key-value pairs with the same tag number" - for (i=0; i= 0) { - n += ByteBuffer.calculateVarint32((this.id << 3) | ProtoBuf.WIRE_TYPES.LDELIM); - ni = 0; - for (i=0; i= 0) { - if (!skipRepeated) { - nBytes = buffer.readVarint32(); - nBytes = buffer.offset + nBytes; // Limit - var values = []; - while (buffer.offset < nBytes) - values.push(this.decode(this.type.wireType, buffer, true)); - return values; - } - // Read the next value otherwise... - } - - // Handle maps. - if (this.map) { - // Read one (key, value) submessage, and return [key, value] - var key = Element.defaultFieldValue(this.keyType); - value = Element.defaultFieldValue(this.type); - - // Read the length - nBytes = buffer.readVarint32(); - if (buffer.remaining() < nBytes) - throw Error("Illegal number of bytes for "+this.toString(true)+": "+nBytes+" required but got only "+buffer.remaining()); - - // Get a sub-buffer of this key/value submessage - var msgbuf = buffer.clone(); - msgbuf.limit = msgbuf.offset + nBytes; - buffer.offset += nBytes; - - while (msgbuf.remaining() > 0) { - var tag = msgbuf.readVarint32(); - wireType = tag & 0x07; - var id = tag >>> 3; - if (id === 1) { - key = this.keyElement.decode(msgbuf, wireType, id); - } else if (id === 2) { - value = this.element.decode(msgbuf, wireType, id); - } else { - throw Error("Unexpected tag in map field key/value submessage"); - } - } - - return [key, value]; - } - - // Handle singular and non-packed repeated field values. - return this.element.decode(buffer, wireType, this.id); - }; - - /** - * @alias ProtoBuf.Reflect.Message.Field - * @expose - */ - Reflect.Message.Field = Field; - - /** - * Constructs a new Message ExtensionField. - * @exports ProtoBuf.Reflect.Message.ExtensionField - * @param {!ProtoBuf.Builder} builder Builder reference - * @param {!ProtoBuf.Reflect.Message} message Message reference - * @param {string} rule Rule, one of requried, optional, repeated - * @param {string} type Data type, e.g. int32 - * @param {string} name Field name - * @param {number} id Unique field id - * @param {!Object.=} options Options - * @constructor - * @extends ProtoBuf.Reflect.Message.Field - */ - var ExtensionField = function(builder, message, rule, type, name, id, options) { - Field.call(this, builder, message, rule, /* keytype = */ null, type, name, id, options); - - /** - * Extension reference. - * @type {!ProtoBuf.Reflect.Extension} - * @expose - */ - this.extension; - }; - - // Extends Field - ExtensionField.prototype = Object.create(Field.prototype); - - /** - * @alias ProtoBuf.Reflect.Message.ExtensionField - * @expose - */ - Reflect.Message.ExtensionField = ExtensionField; - - /** - * Constructs a new Message OneOf. - * @exports ProtoBuf.Reflect.Message.OneOf - * @param {!ProtoBuf.Builder} builder Builder reference - * @param {!ProtoBuf.Reflect.Message} message Message reference - * @param {string} name OneOf name - * @constructor - * @extends ProtoBuf.Reflect.T - */ - var OneOf = function(builder, message, name) { - T.call(this, builder, message, name); - - /** - * Enclosed fields. - * @type {!Array.} - * @expose - */ - this.fields = []; - }; - - /** - * @alias ProtoBuf.Reflect.Message.OneOf - * @expose - */ - Reflect.Message.OneOf = OneOf; - - /** - * Constructs a new Enum. - * @exports ProtoBuf.Reflect.Enum - * @param {!ProtoBuf.Builder} builder Builder reference - * @param {!ProtoBuf.Reflect.T} parent Parent Reflect object - * @param {string} name Enum name - * @param {Object.=} options Enum options - * @param {string?} syntax The syntax level (e.g., proto3) - * @constructor - * @extends ProtoBuf.Reflect.Namespace - */ - var Enum = function(builder, parent, name, options, syntax) { - Namespace.call(this, builder, parent, name, options, syntax); - - /** - * @override - */ - this.className = "Enum"; - - /** - * Runtime enum object. - * @type {Object.|null} - * @expose - */ - this.object = null; - }; - - /** - * Gets the string name of an enum value. - * @param {!ProtoBuf.Builder.Enum} enm Runtime enum - * @param {number} value Enum value - * @returns {?string} Name or `null` if not present - * @expose - */ - Enum.getName = function(enm, value) { - var keys = Object.keys(enm); - for (var i=0, key; i} - * @expose - */ - EnumPrototype.build = function(rebuild) { - if (this.object && !rebuild) - return this.object; - var enm = new ProtoBuf.Builder.Enum(), - values = this.getChildren(Enum.Value); - for (var i=0, k=values.length; i=} options Options - * @constructor - * @extends ProtoBuf.Reflect.Namespace - */ - var Service = function(builder, root, name, options) { - Namespace.call(this, builder, root, name, options); - - /** - * @override - */ - this.className = "Service"; - - /** - * Built runtime service class. - * @type {?function(new:ProtoBuf.Builder.Service)} - */ - this.clazz = null; - }; - - /** - * @alias ProtoBuf.Reflect.Service.prototype - * @inner - */ - var ServicePrototype = Service.prototype = Object.create(Namespace.prototype); - - /** - * Builds the service and returns the runtime counterpart, which is a fully functional class. - * @see ProtoBuf.Builder.Service - * @param {boolean=} rebuild Whether to rebuild or not - * @return {Function} Service class - * @throws {Error} If the message cannot be built - * @expose - */ - ServicePrototype.build = function(rebuild) { - if (this.clazz && !rebuild) - return this.clazz; - - // Create the runtime Service class in its own scope - return this.clazz = (function(ProtoBuf, T) { - - /** - * Constructs a new runtime Service. - * @name ProtoBuf.Builder.Service - * @param {function(string, ProtoBuf.Builder.Message, function(Error, ProtoBuf.Builder.Message=))=} rpcImpl RPC implementation receiving the method name and the message - * @class Barebone of all runtime services. - * @constructor - * @throws {Error} If the service cannot be created - */ - var Service = function(rpcImpl) { - ProtoBuf.Builder.Service.call(this); - - /** - * Service implementation. - * @name ProtoBuf.Builder.Service#rpcImpl - * @type {!function(string, ProtoBuf.Builder.Message, function(Error, ProtoBuf.Builder.Message=))} - * @expose - */ - this.rpcImpl = rpcImpl || function(name, msg, callback) { - // This is what a user has to implement: A function receiving the method name, the actual message to - // send (type checked) and the callback that's either provided with the error as its first - // argument or null and the actual response message. - setTimeout(callback.bind(this, Error("Not implemented, see: https://github.com/dcodeIO/ProtoBuf.js/wiki/Services")), 0); // Must be async! - }; - }; - - /** - * @alias ProtoBuf.Builder.Service.prototype - * @inner - */ - var ServicePrototype = Service.prototype = Object.create(ProtoBuf.Builder.Service.prototype); - - /** - * Asynchronously performs an RPC call using the given RPC implementation. - * @name ProtoBuf.Builder.Service.[Method] - * @function - * @param {!function(string, ProtoBuf.Builder.Message, function(Error, ProtoBuf.Builder.Message=))} rpcImpl RPC implementation - * @param {ProtoBuf.Builder.Message} req Request - * @param {function(Error, (ProtoBuf.Builder.Message|ByteBuffer|Buffer|string)=)} callback Callback receiving - * the error if any and the response either as a pre-parsed message or as its raw bytes - * @abstract - */ - - /** - * Asynchronously performs an RPC call using the instance's RPC implementation. - * @name ProtoBuf.Builder.Service#[Method] - * @function - * @param {ProtoBuf.Builder.Message} req Request - * @param {function(Error, (ProtoBuf.Builder.Message|ByteBuffer|Buffer|string)=)} callback Callback receiving - * the error if any and the response either as a pre-parsed message or as its raw bytes - * @abstract - */ - - var rpc = T.getChildren(ProtoBuf.Reflect.Service.RPCMethod); - for (var i=0; i} - * @expose - */ - var $optionsS; // cc needs this - - /** - * Service options. - * @name ProtoBuf.Builder.Service#$options - * @type {Object.} - * @expose - */ - var $options; - - /** - * Reflection type. - * @name ProtoBuf.Builder.Service.$type - * @type {!ProtoBuf.Reflect.Service} - * @expose - */ - var $typeS; - - /** - * Reflection type. - * @name ProtoBuf.Builder.Service#$type - * @type {!ProtoBuf.Reflect.Service} - * @expose - */ - var $type; - - if (Object.defineProperty) - Object.defineProperty(Service, "$options", { "value": T.buildOpt() }), - Object.defineProperty(ServicePrototype, "$options", { "value": Service["$options"] }), - Object.defineProperty(Service, "$type", { "value": T }), - Object.defineProperty(ServicePrototype, "$type", { "value": T }); - - return Service; - - })(ProtoBuf, this); - }; - - /** - * @alias ProtoBuf.Reflect.Service - * @expose - */ - Reflect.Service = Service; - - /** - * Abstract service method. - * @exports ProtoBuf.Reflect.Service.Method - * @param {!ProtoBuf.Builder} builder Builder reference - * @param {!ProtoBuf.Reflect.Service} svc Service - * @param {string} name Method name - * @param {Object.=} options Options - * @constructor - * @extends ProtoBuf.Reflect.T - */ - var Method = function(builder, svc, name, options) { - T.call(this, builder, svc, name); - - /** - * @override - */ - this.className = "Service.Method"; - - /** - * Options. - * @type {Object.} - * @expose - */ - this.options = options || {}; - }; - - /** - * @alias ProtoBuf.Reflect.Service.Method.prototype - * @inner - */ - var MethodPrototype = Method.prototype = Object.create(T.prototype); - - /** - * Builds the method's '$options' property. - * @name ProtoBuf.Reflect.Service.Method#buildOpt - * @function - * @return {Object.} - */ - MethodPrototype.buildOpt = NamespacePrototype.buildOpt; - - /** - * @alias ProtoBuf.Reflect.Service.Method - * @expose - */ - Reflect.Service.Method = Method; - - /** - * RPC service method. - * @exports ProtoBuf.Reflect.Service.RPCMethod - * @param {!ProtoBuf.Builder} builder Builder reference - * @param {!ProtoBuf.Reflect.Service} svc Service - * @param {string} name Method name - * @param {string} request Request message name - * @param {string} response Response message name - * @param {boolean} request_stream Whether requests are streamed - * @param {boolean} response_stream Whether responses are streamed - * @param {Object.=} options Options - * @constructor - * @extends ProtoBuf.Reflect.Service.Method - */ - var RPCMethod = function(builder, svc, name, request, response, request_stream, response_stream, options) { - Method.call(this, builder, svc, name, options); - - /** - * @override - */ - this.className = "Service.RPCMethod"; - - /** - * Request message name. - * @type {string} - * @expose - */ - this.requestName = request; - - /** - * Response message name. - * @type {string} - * @expose - */ - this.responseName = response; - - /** - * Whether requests are streamed - * @type {bool} - * @expose - */ - this.requestStream = request_stream; - - /** - * Whether responses are streamed - * @type {bool} - * @expose - */ - this.responseStream = response_stream; - - /** - * Resolved request message type. - * @type {ProtoBuf.Reflect.Message} - * @expose - */ - this.resolvedRequestType = null; - - /** - * Resolved response message type. - * @type {ProtoBuf.Reflect.Message} - * @expose - */ - this.resolvedResponseType = null; - }; - - // Extends Method - RPCMethod.prototype = Object.create(Method.prototype); - - /** - * @alias ProtoBuf.Reflect.Service.RPCMethod - * @expose - */ - Reflect.Service.RPCMethod = RPCMethod; - - return Reflect; - - })(ProtoBuf); - - /** - * @alias ProtoBuf.Builder - * @expose - */ - ProtoBuf.Builder = (function(ProtoBuf, Lang, Reflect) { - "use strict"; - - /** - * Constructs a new Builder. - * @exports ProtoBuf.Builder - * @class Provides the functionality to build protocol messages. - * @param {Object.=} options Options - * @constructor - */ - var Builder = function(options) { - - /** - * Namespace. - * @type {ProtoBuf.Reflect.Namespace} - * @expose - */ - this.ns = new Reflect.Namespace(this, null, ""); // Global namespace - - /** - * Namespace pointer. - * @type {ProtoBuf.Reflect.T} - * @expose - */ - this.ptr = this.ns; - - /** - * Resolved flag. - * @type {boolean} - * @expose - */ - this.resolved = false; - - /** - * The current building result. - * @type {Object.|null} - * @expose - */ - this.result = null; - - /** - * Imported files. - * @type {Array.} - * @expose - */ - this.files = {}; - - /** - * Import root override. - * @type {?string} - * @expose - */ - this.importRoot = null; - - /** - * Options. - * @type {!Object.} - * @expose - */ - this.options = options || {}; - }; - - /** - * @alias ProtoBuf.Builder.prototype - * @inner - */ - var BuilderPrototype = Builder.prototype; - - // ----- Definition tests ----- - - /** - * Tests if a definition most likely describes a message. - * @param {!Object} def - * @returns {boolean} - * @expose - */ - Builder.isMessage = function(def) { - // Messages require a string name - if (typeof def["name"] !== 'string') - return false; - // Messages do not contain values (enum) or rpc methods (service) - if (typeof def["values"] !== 'undefined' || typeof def["rpc"] !== 'undefined') - return false; - return true; - }; - - /** - * Tests if a definition most likely describes a message field. - * @param {!Object} def - * @returns {boolean} - * @expose - */ - Builder.isMessageField = function(def) { - // Message fields require a string rule, name and type and an id - if (typeof def["rule"] !== 'string' || typeof def["name"] !== 'string' || typeof def["type"] !== 'string' || typeof def["id"] === 'undefined') - return false; - return true; - }; - - /** - * Tests if a definition most likely describes an enum. - * @param {!Object} def - * @returns {boolean} - * @expose - */ - Builder.isEnum = function(def) { - // Enums require a string name - if (typeof def["name"] !== 'string') - return false; - // Enums require at least one value - if (typeof def["values"] === 'undefined' || !Array.isArray(def["values"]) || def["values"].length === 0) - return false; - return true; - }; - - /** - * Tests if a definition most likely describes a service. - * @param {!Object} def - * @returns {boolean} - * @expose - */ - Builder.isService = function(def) { - // Services require a string name and an rpc object - if (typeof def["name"] !== 'string' || typeof def["rpc"] !== 'object' || !def["rpc"]) - return false; - return true; - }; - - /** - * Tests if a definition most likely describes an extended message - * @param {!Object} def - * @returns {boolean} - * @expose - */ - Builder.isExtend = function(def) { - // Extends rquire a string ref - if (typeof def["ref"] !== 'string') - return false; - return true; - }; - - // ----- Building ----- - - /** - * Resets the pointer to the root namespace. - * @returns {!ProtoBuf.Builder} this - * @expose - */ - BuilderPrototype.reset = function() { - this.ptr = this.ns; - return this; - }; - - /** - * Defines a namespace on top of the current pointer position and places the pointer on it. - * @param {string} namespace - * @return {!ProtoBuf.Builder} this - * @expose - */ - BuilderPrototype.define = function(namespace) { - if (typeof namespace !== 'string' || !Lang.TYPEREF.test(namespace)) - throw Error("illegal namespace: "+namespace); - namespace.split(".").forEach(function(part) { - var ns = this.ptr.getChild(part); - if (ns === null) // Keep existing - this.ptr.addChild(ns = new Reflect.Namespace(this, this.ptr, part)); - this.ptr = ns; - }, this); - return this; - }; - - /** - * Creates the specified definitions at the current pointer position. - * @param {!Array.} defs Messages, enums or services to create - * @returns {!ProtoBuf.Builder} this - * @throws {Error} If a message definition is invalid - * @expose - */ - BuilderPrototype.create = function(defs) { - if (!defs) - return this; // Nothing to create - if (!Array.isArray(defs)) - defs = [defs]; - else { - if (defs.length === 0) - return this; - defs = defs.slice(); - } - - // It's quite hard to keep track of scopes and memory here, so let's do this iteratively. - var stack = [defs]; - while (stack.length > 0) { - defs = stack.pop(); - - if (!Array.isArray(defs)) // Stack always contains entire namespaces - throw Error("not a valid namespace: "+JSON.stringify(defs)); - - while (defs.length > 0) { - var def = defs.shift(); // Namespaces always contain an array of messages, enums and services - - if (Builder.isMessage(def)) { - var obj = new Reflect.Message(this, this.ptr, def["name"], def["options"], def["isGroup"], def["syntax"]); - - // Create OneOfs - var oneofs = {}; - if (def["oneofs"]) - Object.keys(def["oneofs"]).forEach(function(name) { - obj.addChild(oneofs[name] = new Reflect.Message.OneOf(this, obj, name)); - }, this); - - // Create fields - if (def["fields"]) - def["fields"].forEach(function(fld) { - if (obj.getChild(fld["id"]|0) !== null) - throw Error("duplicate or invalid field id in "+obj.name+": "+fld['id']); - if (fld["options"] && typeof fld["options"] !== 'object') - throw Error("illegal field options in "+obj.name+"#"+fld["name"]); - var oneof = null; - if (typeof fld["oneof"] === 'string' && !(oneof = oneofs[fld["oneof"]])) - throw Error("illegal oneof in "+obj.name+"#"+fld["name"]+": "+fld["oneof"]); - fld = new Reflect.Message.Field(this, obj, fld["rule"], fld["keytype"], fld["type"], fld["name"], fld["id"], fld["options"], oneof, def["syntax"]); - if (oneof) - oneof.fields.push(fld); - obj.addChild(fld); - }, this); - - // Push children to stack - var subObj = []; - if (def["enums"]) - def["enums"].forEach(function(enm) { - subObj.push(enm); - }); - if (def["messages"]) - def["messages"].forEach(function(msg) { - subObj.push(msg); - }); - if (def["services"]) - def["services"].forEach(function(svc) { - subObj.push(svc); - }); - - // Set extension ranges - if (def["extensions"]) { - if (typeof def["extensions"][0] === 'number') // pre 5.0.1 - obj.extensions = [ def["extensions"] ]; - else - obj.extensions = def["extensions"]; - } - - // Create on top of current namespace - this.ptr.addChild(obj); - if (subObj.length > 0) { - stack.push(defs); // Push the current level back - defs = subObj; // Continue processing sub level - subObj = null; - this.ptr = obj; // And move the pointer to this namespace - obj = null; - continue; - } - subObj = null; - - } else if (Builder.isEnum(def)) { - - obj = new Reflect.Enum(this, this.ptr, def["name"], def["options"], def["syntax"]); - def["values"].forEach(function(val) { - obj.addChild(new Reflect.Enum.Value(this, obj, val["name"], val["id"])); - }, this); - this.ptr.addChild(obj); - - } else if (Builder.isService(def)) { - - obj = new Reflect.Service(this, this.ptr, def["name"], def["options"]); - Object.keys(def["rpc"]).forEach(function(name) { - var mtd = def["rpc"][name]; - obj.addChild(new Reflect.Service.RPCMethod(this, obj, name, mtd["request"], mtd["response"], !!mtd["request_stream"], !!mtd["response_stream"], mtd["options"])); - }, this); - this.ptr.addChild(obj); - - } else if (Builder.isExtend(def)) { - - obj = this.ptr.resolve(def["ref"], true); - if (obj) { - def["fields"].forEach(function(fld) { - if (obj.getChild(fld['id']|0) !== null) - throw Error("duplicate extended field id in "+obj.name+": "+fld['id']); - // Check if field id is allowed to be extended - if (obj.extensions) { - var valid = false; - obj.extensions.forEach(function(range) { - if (fld["id"] >= range[0] && fld["id"] <= range[1]) - valid = true; - }); - if (!valid) - throw Error("illegal extended field id in "+obj.name+": "+fld['id']+" (not within valid ranges)"); - } - // Convert extension field names to camel case notation if the override is set - var name = fld["name"]; - if (this.options['convertFieldsToCamelCase']) - name = ProtoBuf.Util.toCamelCase(name); - // see #161: Extensions use their fully qualified name as their runtime key and... - var field = new Reflect.Message.ExtensionField(this, obj, fld["rule"], fld["type"], this.ptr.fqn()+'.'+name, fld["id"], fld["options"]); - // ...are added on top of the current namespace as an extension which is used for - // resolving their type later on (the extension always keeps the original name to - // prevent naming collisions) - var ext = new Reflect.Extension(this, this.ptr, fld["name"], field); - field.extension = ext; - this.ptr.addChild(ext); - obj.addChild(field); - }, this); - - } else if (!/\.?google\.protobuf\./.test(def["ref"])) // Silently skip internal extensions - throw Error("extended message "+def["ref"]+" is not defined"); - - } else - throw Error("not a valid definition: "+JSON.stringify(def)); - - def = null; - obj = null; - } - // Break goes here - defs = null; - this.ptr = this.ptr.parent; // Namespace done, continue at parent - } - this.resolved = false; // Require re-resolve - this.result = null; // Require re-build - return this; - }; - - /** - * Propagates syntax to all children. - * @param {!Object} parent - * @inner - */ - function propagateSyntax(parent) { - if (parent['messages']) { - parent['messages'].forEach(function(child) { - child["syntax"] = parent["syntax"]; - propagateSyntax(child); - }); - } - if (parent['enums']) { - parent['enums'].forEach(function(child) { - child["syntax"] = parent["syntax"]; - }); - } - } - - /** - * Imports another definition into this builder. - * @param {Object.} json Parsed import - * @param {(string|{root: string, file: string})=} filename Imported file name - * @returns {!ProtoBuf.Builder} this - * @throws {Error} If the definition or file cannot be imported - * @expose - */ - BuilderPrototype["import"] = function(json, filename) { - var delim = '/'; - - // Make sure to skip duplicate imports - - if (typeof filename === 'string') { - - if (ProtoBuf.Util.IS_NODE) - filename = require("path")['resolve'](filename); - if (this.files[filename] === true) - return this.reset(); - this.files[filename] = true; - - } else if (typeof filename === 'object') { // Object with root, file. - - var root = filename.root; - if (ProtoBuf.Util.IS_NODE) - root = require("path")['resolve'](root); - if (root.indexOf("\\") >= 0 || filename.file.indexOf("\\") >= 0) - delim = '\\'; - var fname = root + delim + filename.file; - if (this.files[fname] === true) - return this.reset(); - this.files[fname] = true; - } - - // Import imports - - if (json['imports'] && json['imports'].length > 0) { - var importRoot, - resetRoot = false; - - if (typeof filename === 'object') { // If an import root is specified, override - - this.importRoot = filename["root"]; resetRoot = true; // ... and reset afterwards - importRoot = this.importRoot; - filename = filename["file"]; - if (importRoot.indexOf("\\") >= 0 || filename.indexOf("\\") >= 0) - delim = '\\'; - - } else if (typeof filename === 'string') { - - if (this.importRoot) // If import root is overridden, use it - importRoot = this.importRoot; - else { // Otherwise compute from filename - if (filename.indexOf("/") >= 0) { // Unix - importRoot = filename.replace(/\/[^\/]*$/, ""); - if (/* /file.proto */ importRoot === "") - importRoot = "/"; - } else if (filename.indexOf("\\") >= 0) { // Windows - importRoot = filename.replace(/\\[^\\]*$/, ""); - delim = '\\'; - } else - importRoot = "."; - } - - } else - importRoot = null; - - for (var i=0; i)=} path Specifies what to return. If omitted, the entire namespace will be returned. - * @returns {!ProtoBuf.Builder.Message|!Object.} - * @throws {Error} If a type could not be resolved - * @expose - */ - BuilderPrototype.build = function(path) { - this.reset(); - if (!this.resolved) - this.resolveAll(), - this.resolved = true, - this.result = null; // Require re-build - if (this.result === null) // (Re-)Build - this.result = this.ns.build(); - if (!path) - return this.result; - var part = typeof path === 'string' ? path.split(".") : path, - ptr = this.result; // Build namespace pointer (no hasChild etc.) - for (var i=0; i=} contents Initial contents - * @constructor - */ - var Map = function(field, contents) { - if (!field.map) - throw Error("field is not a map"); - - /** - * The field corresponding to this map. - * @type {!ProtoBuf.Reflect.Field} - */ - this.field = field; - - /** - * Element instance corresponding to key type. - * @type {!ProtoBuf.Reflect.Element} - */ - this.keyElem = new Reflect.Element(field.keyType, null, true, field.syntax); - - /** - * Element instance corresponding to value type. - * @type {!ProtoBuf.Reflect.Element} - */ - this.valueElem = new Reflect.Element(field.type, field.resolvedType, false, field.syntax); - - /** - * Internal map: stores mapping of (string form of key) -> (key, value) - * pair. - * - * We provide map semantics for arbitrary key types, but we build on top - * of an Object, which has only string keys. In order to avoid the need - * to convert a string key back to its native type in many situations, - * we store the native key value alongside the value. Thus, we only need - * a one-way mapping from a key type to its string form that guarantees - * uniqueness and equality (i.e., str(K1) === str(K2) if and only if K1 - * === K2). - * - * @type {!Object} - */ - this.map = {}; - - /** - * Returns the number of elements in the map. - */ - Object.defineProperty(this, "size", { - get: function() { return Object.keys(this.map).length; } - }); - - // Fill initial contents from a raw object. - if (contents) { - var keys = Object.keys(contents); - for (var i = 0; i < keys.length; i++) { - var key = this.keyElem.valueFromString(keys[i]); - var val = this.valueElem.verifyValue(contents[keys[i]]); - this.map[this.keyElem.valueToString(key)] = - { key: key, value: val }; - } - } - }; - - var MapPrototype = Map.prototype; - - /** - * Helper: return an iterator over an array. - * @param {!Array<*>} arr the array - * @returns {!Object} an iterator - * @inner - */ - function arrayIterator(arr) { - var idx = 0; - return { - next: function() { - if (idx < arr.length) - return { done: false, value: arr[idx++] }; - return { done: true }; - } - } - } - - /** - * Clears the map. - */ - MapPrototype.clear = function() { - this.map = {}; - }; - - /** - * Deletes a particular key from the map. - * @returns {boolean} Whether any entry with this key was deleted. - */ - MapPrototype["delete"] = function(key) { - var keyValue = this.keyElem.valueToString(this.keyElem.verifyValue(key)); - var hadKey = keyValue in this.map; - delete this.map[keyValue]; - return hadKey; - }; - - /** - * Returns an iterator over [key, value] pairs in the map. - * @returns {Object} The iterator - */ - MapPrototype.entries = function() { - var entries = []; - var strKeys = Object.keys(this.map); - for (var i = 0, entry; i < strKeys.length; i++) - entries.push([(entry=this.map[strKeys[i]]).key, entry.value]); - return arrayIterator(entries); - }; - - /** - * Returns an iterator over keys in the map. - * @returns {Object} The iterator - */ - MapPrototype.keys = function() { - var keys = []; - var strKeys = Object.keys(this.map); - for (var i = 0; i < strKeys.length; i++) - keys.push(this.map[strKeys[i]].key); - return arrayIterator(keys); - }; - - /** - * Returns an iterator over values in the map. - * @returns {!Object} The iterator - */ - MapPrototype.values = function() { - var values = []; - var strKeys = Object.keys(this.map); - for (var i = 0; i < strKeys.length; i++) - values.push(this.map[strKeys[i]].value); - return arrayIterator(values); - }; - - /** - * Iterates over entries in the map, calling a function on each. - * @param {function(this:*, *, *, *)} cb The callback to invoke with value, key, and map arguments. - * @param {Object=} thisArg The `this` value for the callback - */ - MapPrototype.forEach = function(cb, thisArg) { - var strKeys = Object.keys(this.map); - for (var i = 0, entry; i < strKeys.length; i++) - cb.call(thisArg, (entry=this.map[strKeys[i]]).value, entry.key, this); - }; - - /** - * Sets a key in the map to the given value. - * @param {*} key The key - * @param {*} value The value - * @returns {!ProtoBuf.Map} The map instance - */ - MapPrototype.set = function(key, value) { - var keyValue = this.keyElem.verifyValue(key); - var valValue = this.valueElem.verifyValue(value); - this.map[this.keyElem.valueToString(keyValue)] = - { key: keyValue, value: valValue }; - return this; - }; - - /** - * Gets the value corresponding to a key in the map. - * @param {*} key The key - * @returns {*|undefined} The value, or `undefined` if key not present - */ - MapPrototype.get = function(key) { - var keyValue = this.keyElem.valueToString(this.keyElem.verifyValue(key)); - if (!(keyValue in this.map)) - return undefined; - return this.map[keyValue].value; - }; - - /** - * Determines whether the given key is present in the map. - * @param {*} key The key - * @returns {boolean} `true` if the key is present - */ - MapPrototype.has = function(key) { - var keyValue = this.keyElem.valueToString(this.keyElem.verifyValue(key)); - return (keyValue in this.map); - }; - - return Map; - })(ProtoBuf, ProtoBuf.Reflect); - - - /** - * Loads a .proto string and returns the Builder. - * @param {string} proto .proto file contents - * @param {(ProtoBuf.Builder|string|{root: string, file: string})=} builder Builder to append to. Will create a new one if omitted. - * @param {(string|{root: string, file: string})=} filename The corresponding file name if known. Must be specified for imports. - * @return {ProtoBuf.Builder} Builder to create new messages - * @throws {Error} If the definition cannot be parsed or built - * @expose - */ - ProtoBuf.loadProto = function(proto, builder, filename) { - if (typeof builder === 'string' || (builder && typeof builder["file"] === 'string' && typeof builder["root"] === 'string')) - filename = builder, - builder = undefined; - return ProtoBuf.loadJson(ProtoBuf.DotProto.Parser.parse(proto), builder, filename); - }; - - /** - * Loads a .proto string and returns the Builder. This is an alias of {@link ProtoBuf.loadProto}. - * @function - * @param {string} proto .proto file contents - * @param {(ProtoBuf.Builder|string)=} builder Builder to append to. Will create a new one if omitted. - * @param {(string|{root: string, file: string})=} filename The corresponding file name if known. Must be specified for imports. - * @return {ProtoBuf.Builder} Builder to create new messages - * @throws {Error} If the definition cannot be parsed or built - * @expose - */ - ProtoBuf.protoFromString = ProtoBuf.loadProto; // Legacy - - /** - * Loads a .proto file and returns the Builder. - * @param {string|{root: string, file: string}} filename Path to proto file or an object specifying 'file' with - * an overridden 'root' path for all imported files. - * @param {function(?Error, !ProtoBuf.Builder=)=} callback Callback that will receive `null` as the first and - * the Builder as its second argument on success, otherwise the error as its first argument. If omitted, the - * file will be read synchronously and this function will return the Builder. - * @param {ProtoBuf.Builder=} builder Builder to append to. Will create a new one if omitted. - * @return {?ProtoBuf.Builder|undefined} The Builder if synchronous (no callback specified, will be NULL if the - * request has failed), else undefined - * @expose - */ - ProtoBuf.loadProtoFile = function(filename, callback, builder) { - if (callback && typeof callback === 'object') - builder = callback, - callback = null; - else if (!callback || typeof callback !== 'function') - callback = null; - if (callback) - return ProtoBuf.Util.fetch(typeof filename === 'string' ? filename : filename["root"]+"/"+filename["file"], function(contents) { - if (contents === null) { - callback(Error("Failed to fetch file")); - return; - } - try { - callback(null, ProtoBuf.loadProto(contents, builder, filename)); - } catch (e) { - callback(e); - } - }); - var contents = ProtoBuf.Util.fetch(typeof filename === 'object' ? filename["root"]+"/"+filename["file"] : filename); - return contents === null ? null : ProtoBuf.loadProto(contents, builder, filename); - }; - - /** - * Loads a .proto file and returns the Builder. This is an alias of {@link ProtoBuf.loadProtoFile}. - * @function - * @param {string|{root: string, file: string}} filename Path to proto file or an object specifying 'file' with - * an overridden 'root' path for all imported files. - * @param {function(?Error, !ProtoBuf.Builder=)=} callback Callback that will receive `null` as the first and - * the Builder as its second argument on success, otherwise the error as its first argument. If omitted, the - * file will be read synchronously and this function will return the Builder. - * @param {ProtoBuf.Builder=} builder Builder to append to. Will create a new one if omitted. - * @return {!ProtoBuf.Builder|undefined} The Builder if synchronous (no callback specified, will be NULL if the - * request has failed), else undefined - * @expose - */ - ProtoBuf.protoFromFile = ProtoBuf.loadProtoFile; // Legacy - - - /** - * Constructs a new empty Builder. - * @param {Object.=} options Builder options, defaults to global options set on ProtoBuf - * @return {!ProtoBuf.Builder} Builder - * @expose - */ - ProtoBuf.newBuilder = function(options) { - options = options || {}; - if (typeof options['convertFieldsToCamelCase'] === 'undefined') - options['convertFieldsToCamelCase'] = ProtoBuf.convertFieldsToCamelCase; - if (typeof options['populateAccessors'] === 'undefined') - options['populateAccessors'] = ProtoBuf.populateAccessors; - return new ProtoBuf.Builder(options); - }; - - /** - * Loads a .json definition and returns the Builder. - * @param {!*|string} json JSON definition - * @param {(ProtoBuf.Builder|string|{root: string, file: string})=} builder Builder to append to. Will create a new one if omitted. - * @param {(string|{root: string, file: string})=} filename The corresponding file name if known. Must be specified for imports. - * @return {ProtoBuf.Builder} Builder to create new messages - * @throws {Error} If the definition cannot be parsed or built - * @expose - */ - ProtoBuf.loadJson = function(json, builder, filename) { - if (typeof builder === 'string' || (builder && typeof builder["file"] === 'string' && typeof builder["root"] === 'string')) - filename = builder, - builder = null; - if (!builder || typeof builder !== 'object') - builder = ProtoBuf.newBuilder(); - if (typeof json === 'string') - json = JSON.parse(json); - builder["import"](json, filename); - builder.resolveAll(); - return builder; - }; - - /** - * Loads a .json file and returns the Builder. - * @param {string|!{root: string, file: string}} filename Path to json file or an object specifying 'file' with - * an overridden 'root' path for all imported files. - * @param {function(?Error, !ProtoBuf.Builder=)=} callback Callback that will receive `null` as the first and - * the Builder as its second argument on success, otherwise the error as its first argument. If omitted, the - * file will be read synchronously and this function will return the Builder. - * @param {ProtoBuf.Builder=} builder Builder to append to. Will create a new one if omitted. - * @return {?ProtoBuf.Builder|undefined} The Builder if synchronous (no callback specified, will be NULL if the - * request has failed), else undefined - * @expose - */ - ProtoBuf.loadJsonFile = function(filename, callback, builder) { - if (callback && typeof callback === 'object') - builder = callback, - callback = null; - else if (!callback || typeof callback !== 'function') - callback = null; - if (callback) - return ProtoBuf.Util.fetch(typeof filename === 'string' ? filename : filename["root"]+"/"+filename["file"], function(contents) { - if (contents === null) { - callback(Error("Failed to fetch file")); - return; - } - try { - callback(null, ProtoBuf.loadJson(JSON.parse(contents), builder, filename)); - } catch (e) { - callback(e); - } - }); - var contents = ProtoBuf.Util.fetch(typeof filename === 'object' ? filename["root"]+"/"+filename["file"] : filename); - return contents === null ? null : ProtoBuf.loadJson(JSON.parse(contents), builder, filename); - }; - - return ProtoBuf; -}); \ No newline at end of file diff --git a/ui/scripts/util/drawing.js b/ui/scripts/util/drawing.js deleted file mode 100644 index 3c2ebfbb90b..00000000000 --- a/ui/scripts/util/drawing.js +++ /dev/null @@ -1,255 +0,0 @@ -"use strict"; - -var aspectRatio = 4.0/3.0; - -var leftmostPoint = createPoint(0, 0); -var rightmostPoint = createPoint(0, 0); -var topPoint = createPoint(0, 0); -var bottomPoint = createPoint(0, 0); -var eps = 1e-5, - zero = { - x: canvas.width / 2, - y: canvas.height / 2 - }, - carColour = "red", - referenceColour = "blue", - foundColour = "blue", - multiplier = 100; - -canvas.style = "border:5px solid #000000;"; - -var stepX = canvas.width / 20 -var stepY = canvas.height / 20 - -function drawPath(waypoints) { - ctx.beginPath(); - ctx.moveTo(canvas.width / 2, canvas.height / 2); - for (var i = 0; i < waypoints.begin_x.length; i++) { - ctx.moveTo(waypoints.begin_x[i] + canvas.width / 2, waypoints.begin_y[i] + canvas.height / 2); - ctx.lineTo(waypoints.end_x[i] + canvas.width / 2, waypoints.end_y[i] + canvas.height / 2); - - }; - ctx.closePath(); - ctx.stroke(); -} - -function drawCar(carPosition) { - drawPoint(carPosition, carColour, 10); -} - -function drawLine(line, colour, lineWidth) { - var begin_x = 0; - var begin_y = - (line.A * (0 - zero.x) + line.C) / line.B + zero.y; - - var end_x = canvas.width; - var end_y = - (line.A * (canvas.width - zero.x) + line.C) / line.B + zero.y; - - // check if evaluated y-coordinates are in the canvas. If not, re-evaluate x-coordinates from y, to prevent issues with lines that are close to vertical - if (gt(begin_y, canvas.height) || gt(end_y, canvas.height)) { - begin_x = - (line.B * (0 - zero.y) + line.C) / line.A + zero.x; - begin_y = 0; - - end_x = - (line.B * (canvas.height - zero.y) + line.C) / line.A + zero.x; - end_y = canvas.height; - } - - console.log("Drawing line from (" + begin_x + ", " + begin_y + ") to (" + end_x + ", " + end_y + ")"); - ctx.beginPath(); - ctx.moveTo(begin_x, begin_y); - ctx.lineTo(end_x, end_y); - if (lineWidth != null) { - ctx.lineWidth = lineWidth - } - ctx.strokeStyle = colour; - ctx.closePath(); - ctx.stroke(); -} - -function drawSegment(segment, colour) { - updateCorners(segment.begin); - updateCorners(segment.end); - console.log("Drawing segment from (" + segment.begin.x + ", " + segment.begin.y + ") to (" + segment.end.x + ", " + segment.end.y + ")") - ctx.beginPath(); - ctx.moveTo(segment.begin.x + zero.x, segment.begin.y + zero.y); - ctx.lineTo(segment.end.x + zero.x, segment.end.y + zero.y); - ctx.strokeStyle = colour; - ctx.closePath(); - ctx.stroke(); -} - -function eq(lhs, rhs) { - return Math.abs(lhs - rhs) < eps; -} - -function lt(lhs, rhs) { - return lhs - rhs < -eps; -} - -function gt(lhs, rhs) { - return lhs - rhs > eps; -} - -function intersectLines(l1, l2) { - // Kramer's dets - var delta1 = l1.A * l2.B - l1.B * l2.A; - var delta2 = l1.C * l2.B - l1.B * l2.C; - var delta3 = l1.A * l2.C - l1.C * l2.A; - - if (eq(delta1, 0)) { - alert("Lines are parallel, can't intersect!"); - return null - } - - var x = delta2 / delta1; - var y = delta3 / delta1; - var point = { - x: x, - y: y - }; - - return point; -} - -function createSegment(begin_, end_) { - var segment = { - begin: begin_, - end: end_ - } - return segment -} - -function createLine(A, B, C) { - var line = { - A: A, - B: B, - C: C - } - return line -} - -function createPoint(x_, y_) { - var point = { - x: x_, - y: y_ - }; - return point; -} - -function updateCorners(point) { - if (point.x < leftmostPoint.x) { - leftmostPoint = point; - } - if (point.x > rightmostPoint.x) { - rightmostPoint = point; - } - if (point.y < bottomPoint.y) { - bottomPoint = point; - } - if (point.y > topPoint.y) { - topPoint = point; - } - resizeCanvas(); -} - -function drawPoint(point, colour, radius) { - updateCorners(point); - ctx.beginPath(); - ctx.arc(point.x + zero.x, point.y + zero.y, radius, 0, 2 * Math.PI, false); - ctx.fillStyle = colour; - ctx.closePath(); - ctx.fill(); -} - -function resizeCanvas() { - while (canvas.width < rightmostPoint.x + zero.x || 0 > leftmostPoint + zero.x) { - canvas.width *= 2.0; - canvas.height = canvas.width / 4.0 * 3.0; - } - - while (canvas.height < topPoint.y + zero.y || 0 > bottomPoint + zero.y) { - canvas.height *= 2.0; - canvas.width = canvas.height / 3.0 * 4.0 - } - - var contentMid = createPoint( (rightmostPoint.x + leftmostPoint.x) / 2, (topPoint.y + bottomPoint.y) / 2); - var canvasMid = createPoint(canvas.width / 2, canvas.height / 2); - - zero.x = canvasMid.x - contentMid.x - zero.y = canvasMid.y - contentMid.y - - stepX = canvas.width / 20; - stepY = canvas.height / 20; -} - -function getMousePos(evt) { - var rect = canvas.getBoundingClientRect(); - var pt = { - x: Math.floor((evt.clientX-rect.left) / (rect.right-rect.left) * canvas.width) - zero.x, - y: Math.floor((evt.clientY-rect.top) / (rect.bottom-rect.top) * canvas.height - zero.y) - }; - return pt; -} - - -function drawAxis() { - for (var i = zero.x + stepX; i < canvas.width; i += stepX) { - drawLine(createLine(1, 0, -(i - zero.x)), "black", 0.1); - } - - for (var i = zero.x - stepX; i > 0; i -= stepX) { - drawLine(createLine(1, 0, -(i - zero.x)), "black", 0.1); - } - - drawLine(createLine(1, 0, 0), "black", 2); - - for (var i = zero.y + stepY; i < canvas.height; i += stepY) { - drawLine(createLine(0, 1, -(i - zero.y)), "black", 0.1); - } - - for (var i = zero.y - stepY; i > 0; i -= stepY) { - drawLine(createLine(0, 1, -(i - zero.y)), "black", 0.1); - } - - drawLine(createLine(0, 1, 0), "black", 2) -} - -function drawDebug(data, attempt) { - ctx.clearRect(0, 0, canvas.width, canvas.height); - - var segments = []; - for (var i = 0; i < data.begin_x.length; i++) { - var begin = createPoint(data.begin_x[i], data.begin_y[i]); - var end = createPoint(data.end_x[i], data.end_y[i]); - var seg = createSegment(begin, end); - segments.push(seg); - } - - var points = []; - for (var i = 0; i < data.x.length; i++) { - var pt = createPoint(data.x[i], data.y[i]) - points.push(pt); - } - - var carPosition = createPoint(data.carX, data.carY); - - // draw everything - console.log("Drawing car position"); - drawCar(carPosition); - - console.log("Drawing segments") - for (var i = 0; i < segments.length; ++i) { - drawSegment(segments[i], referenceColour); - } - - console.log("Drawing points") - for (var i = 0; i < points.length; i++) { - drawPoint(points[i], "green", 2); - } - - drawAxis() - - // re-draw everything to be sure that all resizing and centering will take their place - if (attempt == 1) { - drawDebug(data, 0) - } -} diff --git a/ui/server.py b/ui/server.py deleted file mode 100644 index feac4d59f73..00000000000 --- a/ui/server.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env python -try: - # Python 3 - from http.server import HTTPServer, SimpleHTTPRequestHandler, test as test_orig - import sys - def test (*args): - test_orig(*args, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8080) -except ImportError: # Python 2 - from BaseHTTPServer import HTTPServer, test - from SimpleHTTPServer import SimpleHTTPRequestHandler - -class CORSRequestHandler (SimpleHTTPRequestHandler): - def end_headers (self): - self.send_header('Access-Control-Allow-Origin', '*') - SimpleHTTPRequestHandler.end_headers(self) - -if __name__ == '__main__': - test(CORSRequestHandler, HTTPServer) \ No newline at end of file diff --git a/ui/styles/style.css b/ui/styles/style.css deleted file mode 100644 index dc1cf703d4b..00000000000 --- a/ui/styles/style.css +++ /dev/null @@ -1,49 +0,0 @@ -#pathCanvas { - width: 100%; - height: 36em; -} - -#control-tabs { - display: block; -} - -.btn { - white-space: normal; -} - -#coords-tooltip { - display: none; -} - -#pathCanvas:hover + #coords-tooltip { - display: block; - position: fixed; - overflow: hidden; -} - -/*#algos { - padding: 1em; -} -*/ -/*#controls { - padding: 1em; -} -*/ -/* Cells of manual controls grid */ -/*#controls .col-md-4 { - height: 4em; - padding-left: 0.5em; - padding-right: 0.5em; -} -*/ -/*#controls .row { - margin: 1em; -} -*/ -/* Manual control buttons */ -/*.control-btn { - height: inherit; - margin: 0; - width: 100%; -} -*/

    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 z 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ȿS_rfGt~Emw_*1){BL?Ym*h0GQPcB_I zq&Kvmo+Y*0;2#SXua?@!Dw*Ln%J`qm@sHF6+aLYx5h4uUy$<&p#}+7udte??tYLpi z-Eac5Jli0S%itf-H8suqyp7CQ8$HCRYqD-`(lvRvA!}%xti8w^`fdkp>%4<3@$760 z>Fl3IIxWj&*=p=h+3nh7sG6^gO?T@Q7Mxdu`sokvhiputH#r;ESwivN~6^VX|&NG&H)B#0v~aKk2HmkxIx>^ zl#lE(NUJ>tX^m*J*C1`-;htNQNxKax4egesvurmzlXa`{nKL_e%~-Kec^l7+S*=DU zw=pcl`B6i11wqDN^Nc@pZU2eeQs4A$Uf&G_lqYazS(qlHjL%)C0f#mv+xT24umy7}02ncN0t z$ljoHxjvaTUS5ikfFT zhhqqHF!R`q_i$_pLa?6BA;J;NbzUOgBj^h}e&X{cy*F~9-l;#bVmoIYy#7kO#X4^D z0l~WZU-a7~O(eCGBn>2KAV~vB8c5PWk_M7Akfebm4J2tGNdx~Q8c@GcA2BxRH|jBl zPttV~gCq?kX&^}hNg7DfK#~TMG?1i$Bn>2KAV~vB8u+i%K=S0twN$B6=`nlu?1XLG zwk2%dyg4Cl+O%5Alqt0oDN_8~uL<94pqGW^sadn878n?)m($zZ`%Bq*4gZN_^Qu*= zYE7FqP1v<-S6oa?OzejbA7T)1Ug9qzBI4Dvh=_L&?%s_(eDGj=JqL$`+PJ=d$8{9Q zpI>X)tXabKt5-kYxqbTs%J%yC^XD($y?gii&6_vxQRa_Wetz}pRlJ**=I#ZM^Ah5H^JK4`d@l2g$fqb`uFagFm%9x_zkO9 z$6h&i?)8l;SMJ`vb?fxQhY#08Mn+D1{rdH+_wV0tK>07B{4enO9r(v?-MTe?(xgcV zqeqWU$eA-1Y0%KSV`EJ%o-|fweOt{oA*1 zQ-E_a2Cl*8PI!2Uv&WCOIdS;#^b;W=dya>OUOpNY_VjRYaP+#>t7BHKSP?sQ>eRSm z#fl{qELbohfByUoEnmKTdQey23bhTF+^=xq!U?ujtHv)`y!i8q<;y>A-n8jW(7t`o zLiX>!7P@cWfzbW?XP*oU^Ma;JzKD#pL6b|yz%`@*^Nd)!pxi5=kvsSA-+y!F%$eBW z;NbX;8#gBOMt!jy^d56A|IF8g3KdGAH-JaNs#UAv0s;a)!GEK{ITU5{2G7*sE6{>~ zxu6Z|%NV?W`|6e4zj{?dw{A_pW8=nBf$P^d^({@*b$wWkIzXL%oI7{!CsV{?84K_KG-u8n#z%gReLk#Nv*xX@ukXvXYu83# z|9kM=%g|$3fWQArzcp({2CQD~w$0D4Oz`H->F->;C@-Hqlh@JF0$u2V@(b7sm6>f8NZ(!a@UM&CAOxVbrKm3Dc)f zj~h91ln=FTm!VE+8t^XAQSU$}5#AH?J(OO`BMwrrUnUT?wro#43_5ro$v3~)Zkby)7i z`>oi1!=gotmZ40O=g*(t7oRo5aqG;RGp7L0u^Q(JT(H10Wa(0Qcii-6@h!^p8Rv_~^^>(mHvcRwvpu$K*^+H0 ze)#a=pZoUh`wqT*ckkZ4^U;swpdQQ_qs<9*t;!sYGQY-kyaDHT4)2Dhszw!dy z(KdDFCe{M)$N}G&jd~1+Prm{0*eO${#QXU8B$O{-{-44*M~)l`jT$vd=-9DiJo>%3 z7A;!5@7J&2<1JgZ%zpg%adt2^DBbGX1!Hno?T___vJBo zEFP1`Ug_>Gn_9J!``fn3^9vW`X?VCizIRU^K6oGx5a{$2sox@8ACoyyG+KHlBW6qC|;*$U`z@$e`7&TQ{L~>(=qzyLbQW?(Y5` z%lj)=uJlD&(o?V0t~p<7K(VDR7)m2iC_9ood3pD)yn=s3;<|%cwv@GH%E*?k`0dQ8 zQ)TVkxw3r00$DhJzM$O;d_izc0yVRc!ulRf_|?Y^lJDTW0s3$q9z!s ztYoiq2kR(khHdxNv11a2>p$MKscg=dPxiRD$S&x0GqmWpc(JTrvP690r|@1`yl9au zTDVZ)k9zPm*YPuM!)>___vJBotj&4z$`LHlvC7j!hvX6Zz6Ut({jV@4-z!(H$dMyQ zCe!2yrZMzU(z%@IiX&?dem~9 zhlj^U@O}YrK6>H8g&N>xLH{LZ20eo941Kd)zI<7bOAB%#eaW(4g@(e>R@pvT2h{Zo zvc7p!XZ>=`8oAk_gM{SHEyrwa<(QY31W%YCd!W;8%a%#t%9Y~3YL#qUy;}TC!Pi{J z&$tb@viNveNnFl zYk9+o% z3((-D0tMtIba-{(Kskf{D-6dv1pNjfPdTt+g&us(b^MIma9i%feR+(B-MUF6>f$N- zy~n8ghwuW7mGpD-{E0bJ$1EGKi9G2Y$Kf-`H{~Yuz`m0F8PJPi`}Xa9(EncQ)~(ws zaE={-F%ZX(88c@5L;hiDX{nViT{^+u-afv0^X74A4Cz>>Ns}fC$&w}eUDoXTsDEc?=Q!;15u798KOyj}TGTRg33>(Vci+B!I%CvIF^=ra7Quo6M94C?i&wK&DdAWVNL?d5_Lf;hu z&yGx$N}{oRU#*(NI6BIwMve5~Yp&yG+~ygU+~*bdMf-V%9QiTo@*$3^@``V9MlK;3 ziwMg^-=i;6574ac|7?e>3&on8scE!<8pw4HfbTQp9WjVFj+Ot&_?%-_J3BjS`LnI9 z?OQBw!}rIaE>kEi(>GWyj0tu9c7~qXv}vRBMV~2ck+1PRnPU!2xUPNs_JU*SyfKE* z>*z4_b`3e+bF{_hVEr7LiM(`4UZAbNMBf$-ZNF~VP-pozd2)OyT?&Z>QwCpi-D~jG zx52jDCkp#Ug4I)Sc?4amoJ}!SeF)D>cE}<0AXkhx0K5 zXKEY!r@$E02b#VPZM}v^f5vsj*QrzIyFUHH4?k#?Dpg{>9EW_4T7Eis@ZjBOBl(ys zsBs7TIOKM^|B@f|tGJSJGvvfv@-r1=O^qWr6!?%}?5wk9du93ceun;s@;`$&KEpX8 z_wSdNIL~YN{M&y0{XJ4gda^|ry))#sO>QCpZ7*o5-H##7HAX^pGJldDE!gvA4 z7rw_>R%d+*ZJZiW{S3Y2DYO`YcCWKT+lkt;MWS&1FVX)o_?qh?@fo+_w%jM`x4b~- ztaMDa)G)7sbxMtrHO3x#ZlPF{D}9+B!tKeQ+p<2mvbj`EBWPcunw$4223up8-`dAp6dxR68LxLqJBuEa2 z9v0+uU)lg!v(JR*6#eCwU)JOLpCCv3fOZ?l+~cR8e)>C2>vM^=w(S2tSFT+74cd1& z=Dm8LOjayAIWxb&9GyPaW#2{}(;wKs(G#d)#h9Nn&rrel%st4S-hq5vZx3vzWPR@3 zxi4cIoiR1dfX?+Gb8vf#Ytw_TxlVnKZJ7&@BbVl$!8)XNRlDbVGTaZZVLm}`Hs{P- znt9&Vpsg|^bcPH%Hb}ffyrs*&E;4)XY&jHmNM}uNH`SvRG~E^RK37~_U8BL|6TJid z+~4?g>eQ(diWe`Q01d~%n?J%ko`FXw`rh1ZV`?l-9dL|`HuA*}=mYc$GNuwx;h{I6iXRPRU0#Jn!ZndRj=ZcnW#f2QxUKVVKluRso^YbFG9hdeK@je6&pd*#8E z((yX-riX3CG2BtAT&^PJ&z6_cM@vh_T^Ys3-$q>hTqWd0h`tXwqm5W%Og0ABeihgD z8f;?G55?0b$eH63_((#za^>P292`DXsZu2hbrOdD!5-x`s5v2)o$XEeGTD+7m&%u^ zW%>m5OP-k56Xf3dk~$uW+>7-<-)M+@jrD|_NcRoqs?;4BQ>$E>Gh`n`zVuoK+ZEfl z`8MX9c?`u^X^!5?wnGiW6Lo)9pYhy0UeMtn=@QyS8iqHN8dqybrHhrM!r2N^?nF5$ z9a>s)?aC#|)+dv!E3?X^?UQt$H`S2={%42l35It(hgLtrqvOCcf#YkAU2^5h6;IA! z{~mgNi1Fkcct#eMTh0GaAG}tM_m~IM2k6aQDqmKdsbzST&X^v9IRHU^sE-lpkPnMH1N6JXa;F6MOS01rmXDv3%Y{Y4~lbk$v@=M(#N63O4Zw5T$ z4)Wr+VEq}nbUep?V4Z+DqqwqV%YMp}Cr>o`rwgcWPn6S=UPsO>Kg-E>N>8I6RsToM ziSw%35^H=HXlXfk{Gi^>+1A0w661=t(A^o#TSP%ipRkN$zKnSf-nWdy zy~P;JgGRsy_CO~ES$1+}D9$V=$AR=)YMP!weVTJ7W9A;zG(Ce_M*pDuFzW;U6O$lKmy&NGhp66wt)OP2hcHEY(l7-!#t{^r8ht(b$7G5ZykpY4#G z**7!qg$D`7KVSMlvS}ThGmtU$8yS#M}8EWARDpVW+@ha7Gkl)LhKjX%c=9HbiQO`YA;sM z)hy`gTA4CsUc)z-Co}J$u0LV#El-DYD$_vzz>$wfL zr9QYX-}7_!eaC_}$cvNX<a!=wlq-d*b~Nj#X4{tB$WY@tn#-$$_7%`cQouy@uOxTQXLh>6u5u zLgdcA{_^Rlx5VtXmzX^@S2l^s zoH=vmci?^temWc1@T2k!rDwjUrdfV6<}o?vLO&o|=ECGnp3EgwkS9N5Zb7~bZpZqe zpYR?4=SevpBxiaq$MtM~)S}|cw$FCNxd`UF48Gkh0F+fBBTGBl+myO2zh zodf6n){F1!1*=88rj{&Xzh_*Tt*LxkD-@>0i=gyt`(~m#?7>$1M z406&=C~IwEqK3K^^0Uk-7=RTTLwLX!S$>M=G+59F@ymGQOOR^=evmaNS=hlT8u=Nk&khaF|X*H&Wo z)--B*dntLhF^fd6Od%J1t4sK`i~2cPUu4a?4m%kpi+3%S9y`#t?`kLgxAvF7pg_4E zeqHw{`UGVr8ZSyO{}ogDX)IzeM6OO+}Wg`Anb{1NwRBcZ_q$k`lNM)Fl-ZT5rY zuKa_n$$-Zu7mjB+cSj#)Uq_Dg3VMmsHNBY{W_{rK3Y{^>8LIzd4#PPe2HEi%6<;!E z8zN_(oA+`Ue9djCb6zjE;kMjQ`8ez8RO>YCTbx?ov&e70eZhnfG+2!1#QgZp^4xJyhtiqhNdQIMJJFHWl zkJ=?ymV@n)Wmme!^9RM@scVsI+$&nN=sV1jz5(-a=y3+hnSuU5#)&yA4^jR>*1R6& z)y&K2nVhR&zs4Mw<76(GPtc3$6YTdm*5USKOwS-=vgZ6K%gO6deK#5M9Be;I=hPNo zo9l<$a9jE%c~E!k7s=@CX|(BWqvh`EG7_<=l04Y#D3=x&m*b0U<?YrbY#aV?oJj+lu#x$E%e=rn24ysBQk`gzRf3`Myt=?|PY zQuED$eZh^Po-hL zR+>@$40XidXFMlabE(=Z*ON6hKz3Y`)ul@pNp&N(E@g39U#>G&*jnZeh zoq3QsgRGT~S+}ZeESI@wkTI`=yjdn_+!8tNaLj?8Mcy2RKJXd(#lz5<3%OCZWUM%o zxzcxHO()K6sUOxk&(HHIo$~xF2j8nu_bj*_KPO|ZqfV5D)pf94^14jr*V`#y^KXW%S^41weoeoSNl@etS587U|mwnJQvHs^Ya>%|M5N7 z!z~E zOkJ8Y=6in5y5M?sP3k(xlh>wn#5Sw^k(yVUR7*1BYnG236<_jJ!E0ggGu8pOrKZW5 zUZ&cT(g4e(G{yGG;PtR9&~7Dg-h-UuKAyL|gM4cP*5@EQ>X(e!r*ru|&h%)dX_m`8 zSVmqG+Z@{)+cH^E3k)(+nqWB@T*uGUHL$EKGur^SWt*jj80xjT|ETLDYi`f;nlmP6 za%0)33znVQQhh6ze9!etH>?ltXRc?KlVwyoP-Ud|ss4u7gZrqtz&QYU-7U;*TtmOO z1PszE&gwZBE)#S9nn#=0Kd-?&SWaH6YJ0qP>RkC8c~G-lvL3i(`N>%6gk`5rSXbOv zwG;NE%;8mkN^L9FJO=BG=OrhlWtN8wsS$Ezzplmy=6$@nCdJuYFG>rFvnnU+oMmBI z*~ZWpWx)LC3e1IG0qYBx^Z5m3PsQ_*E5`!n&wz5>*L;IzWqDX`bGBc5&GIs+Cv)y( zM}4q8a;ZGeTqEo^$&>vogSiU(QwIL;NdHXrt%^0iTz_C*aVy?&3e+D7#)%0uWG%9p7R=7k*7aDJN4lXEVG^VqyEz~I=O^MQQs zoMRw92hDqatQTsUZJCf^aBuZx_`%S&C*JJ?o;_%WI@jl%*$;lpH@;TqinC(NGW}k#9jbDxoRmy>|BBCs zs4*qSk>oE2Ba`Fl%VFBww<)E?(RcrSo+)_nFx z1?QyxXsCVElE-3@IemrtqQA0SiZy+j+9hulU+V`Gb7o(ta*o8D$(a2!d4shjJgy-) z?_@wr^-%^3YLoTJ+=8shS&awD*}R`%8L11U=Rd=l?U>_m-gn_V9)tG@IM2u6{GNGm z?(chHzAay?w=Osp-yxjvpj z+Kw^d4)itku)hV*O@7ogS(`IvU%@&zZ&#`u+)wG3TK!hAtQ^a+@8Z1{vg4dI?+5Un z7K3xx4Bj7LaNgQHIJeC(U#GU^Qthvf$7AyxJQuajXW_|+Wnr1gntEYd=Cw2U+PvT4 zcINqpc|WN1%>07=ALr5NgIq$}7P#M97mT;!|8%!wPPi`iwIClJpDYz?>R9#1rS1vvo|d|=g?q%pK#s2mp5GDNhxlsnGqs)CkN0iV z@p!L6)eGx^{CN+ad82v0r+D+a80MT={=}SBUZ*(IpUpX&G;M)%Ibhy-3!XjSiM**U z@+u3Sm)zKH$dr5)V{^|)T;KEzmW3MmTJX5cyV#D^Jr=T1EXfMb{0YXWg841MvpRzL zM8UJcf_s>PXL2m)x90wGv@e>WmDSb zwX=;f$X)4&pL08v8+|R;=dtL?=hr#q(Uypmp zf_oPFKIqp4{bu8ic;SEqpVX$}?H7)GS%kLm0|05^I^|P+DeL&4XhyKEpu`Da|Uj z)ShBXE|}BOx#F1}AxD(W3K~d>=S$Mzxv3x0rAwCukrj~*k=?Z9`=9WC2pO<#YRo+* z=e|4!x$~G9Bk0U|F2$T$rw`F@m>;swB5S2>UXQviUJuusj|Ej9$oVSvH{{H*HggT? zn9t#pHI~-shg;*`;9gwAVQ}aHe@RZyQDY~z9r`f&GE^UI?#rxumWMhv=gV@@|M*N2 zHOy<`wNY2(%XW@&s8D-&21>xi0?$JwM|slWK3Z;k_e5#@e?fITW9fi!#&<9@!!wty z5nhOPi1r9?L|a4){4cu;wsW+yvZ{sqL*;Qz1#r(Z6OYMbvu&`Au)WZW@T~n8eUmkx zKOrZwq;6S$^XuU{)`J>zn{(#4lldvz1?!7CCTGqS;J#6EcvV+CgA|1ODaUZ#!;xdB z~$Tka}Ju3q~ z4ZxEO`y<97W+QwN_?0)oFX!pM8*~uMU<7|h=nw+G=BEE<5Pv&pHG;n*HVH8V$LfS< zG#i6?d7L9Fyd@c)J=W`&tXU?OjT&HEV-8Q&^iDEW%(-N6z4DB&^?|%*<`~p5pBE%+ zvs}=je`S>7AkPJUG84bxlo^Gt0@KU-NlDmY+-&Z}r+-%jR>pY`4tm zI2L3dNFC!Itj-zV9g-ULI}vU41nT?>t`}eDvLZXj>Fl?tY1S$AYTgHbtsge`FY1Ae zl~+(R^az{+54*A$`cjzHg=z$3xWb8MNOW zxb|7_tQOEfc5-Gvt@3Q<*nA$1^G{^U+<;-unEuM^Ro+Z}F{fi6NWQ$^Oy5BJC5$WL~`N9I5W zwV{o);A>FhCypICZ%Dnd&r?Ca;5u?PpAV%slQa83ayI#f0e;j1|Hrl)*MARXc!s|H zB*ulK@OfILX&#I9NtV<#d8_=5e$4g!ob|%_V2*D&zN0p9e0m`J{H|y(_@z?8uM!K- z^%C(BLGAu&UjOJmXtxP?mM|9m;#*wrL-b4Mpz8qi%LAe7g180)$LI{si*OD`-Pcu& zsdKJV_b#b1dNXqk)d!L@o?S_c9McDF_?V52O$5sR3R=5{dR~gT^iuS6vgUDkY_g=T z=?{u8J%xJbcATpqW7E8X0qxHQ8g_+te8KYwj(;1=7vLR(^ZZ-*s`^1WG?YWjk|hhj zS1bm(^-JV@;TQ`Y#rp-wI~{N>Hk^y1run=)S<@e=U$%1wUvnL=UwJe8KzaokGtjyJ8)i_;`#{AR+uNXTYLh&9@?Bv30O#XxEb{jjqoB1j(DY2qXXRxb z@fa%qpogfo!knDv~ZKSOiHRXgQafcGNl4eDMA8IiG?J5u8l`ZMOc^Md7c`Z2Db zT4O)YzKFck;@n83QxYRasus8(1av}vacmrD51q}^F?v#i59{rm4hWUR>^b(9i z^x%8mLxAS3@hnU&?6(R`IM#{;6ZZS$LCujje}|Q0g_AhvT+C(F#{K)`JO+=)KexD|9GE3nSYl(t|tMS`Hbr! z4{GlsUhjaXjE1k)#5gw_#=Vx*9mX_Pc*cRxcX2LjDYoVK_95a8_W6XR(lXDhv&NF^ zIbP+w!a3|0h7&fmkn ziJ<;AK(kZ8r5EOI+amw&i2Usrtmk|ee^2}Yf^8u&W5wB=HIE&IxQC!GaDT=%1jov+ z!Io|7zs`qIesh-Jd#!k|-LwBv^CfrinmS{94n-VATtIL==d+kom^0>a5}zmWvAGZD zAJ|8d`)e@fc!O=~f0?o3qIht8MQwAAi@eE#b5!&cj`hfg>s9_{?iK1-iI+Tf;^Xri z44&_g93$~D|C`?{7QAj=KlM$$GN^L~*>F8SSN#6yHLLBvw)~^V_+Q%2oCBGghxup! zOV|AGycTn&=CA*qWlB2t-}iw@Op=%+X&^}hNg7DfK#~TMG?1i$Bn>2K;CD2jexrVx zSfs#MQsNe*<1&d`5`!cSBxxW?14$Z4(m;|1k~Hu?sDWfwmI+Q(id<+_-*#r7Hce;t zYVEqXqg%rr1#{=zUocP31BDQU^X3XJnm^CU!ufKa#{1I+^W->FAa{<7`21G>oY`;Z z&5`wXp6prfA|4^4a%KDJWzH-=yv*@a=2tng{1B5qO=`}W|9`C?a(1j(V1C;Mw$jnP zkugHR6~tvqqIV zH)~j>t4G5s-CH!a?bX`Fp`TZ?rhUEK-3NGkxDRaK++$dmHtoB#aOu<7p+?^(2$#Aw z2f8<~`?;Bu{hX$bwdZ2p+{Sj*7dqQj_itF+cDG}V%6sbCR@mcEwfsScsuj-LRVf!< zvqI@x)ytJY6n|Kwe8~@KQ>FZ`t22W^w7gj}tn#q0VA--kZ7H7XCn=LRizGKH}$tS@Vq zDPmgc>kN2rjj*vRSIow-QYjm!s%29)saYvq(>hf%qJA^BY)~s>n}+t8+qpPq>Ez~= zy<2nV>^)n%X7B6io^w$9mic^~n0Hj(TO?Rzn@z7R@VF z8Ab9)l_I&NGU~okp<-!^Iw04o|MRJK<$^2qprjRtMTteJyl$DltmBiDry0mLpOFA~T zlg=&<(#5r|bZJ^wI=edP?>k{#$Hw;30iU;LIM;_>;h@)TQPgb_siW5~+8f&+LbXlSDeJRJ;XHc%RVa`{%H_{4 zj#bL0aHv*k5uR=N%bc@iPJ5tUg#uXzdb>*<=(u5p!s2RMO200z1~sIstG)DX*+>R^ zH5H$ZEo4;J)-tAhTN&HKQ;#v-J@xmayS0%~41CTQ*`<|?=-g69bZQ~P8Q6DthvqU2 zF|>U%8Pbm7E`z<@WRRDe48-vn1KPSGT%>;+7wOl!iS%vVSo*eVEPYx!>(RSKBk9$= zq4e}{(xZE`2EypptiE)0bJU}A(|Xbg(UJ9!=+MMoum5(?fOn%h;sp(OHmogeooXR! zN^8`AE7U#f+`V=sy&l<)YoSe5D40|1$`_a6UD}S#m@X}!Ogvt>#XR=0fq+~jOm zBCj;AR7_gbE-zltTRZ5I`twGaI=j}Bp3NKKx|_%V&!#fS8=TsEAi%9d3mFEMKI96% zBfF3@LT66?ZDlk6{42ID#g;ra)7x=Jt9Bin3i zFmG6;r0!$%yCEH0cF&w49iLnJtDH}Rb77vxzGOaWQl+@Gv9By$n%GJ27Ea;@PwUx# zxbz-0N_q_%DZK`cke&m4q>D;}abnMz&I&|(K?K^do4jsEAxa^AWGwvkb zULC}%Eq;frbzAXlh2LdCc(=jt7~+53+hOV5x}|uxY$4t)JjAQHyLfrHiFb21Y2U(K zI<#ztaF>pz=+w$xI=5;jUE6p_x3(VA)2oGa!|U#N&FJabTzYvmm)_njq&Jp*yqinE zb}eK;hn6y^V{7T(zLgAUkKcAN#lZIX3_2NvC1YT_=F%4$>JB}%bGDO~VBNTCDRC@c zL}1NaO)}eWzsy>< zS7xq7tiyLho5d`={$A+&aKE*CWQM-ni{&2uSTok_mg%c^$*-$+%Cwa`WUB90nc}-e zU+S-yZN~WnW%afo3D|pBX077;jWTV8KVIYc_*pAt?Cg~?W~Q%|_}-<`+GNVmV^`6qz|^z6>AO zU)OajhbrJ)RQk1TS_ydw|2Ow9an71C&25Kr`6~5pbWAy>`2-+ka9PZ3)(S&s@JxW|(p2d&Vr(#mx18AG5HIpM5(H;4{X4nY-bD%-tBI zzn+bC^ZXA=;9-29=Iuvv<-s%AcKnJg+;Uh}?LQ@pw}r_Z|3fl2AQ%y%$GlA;GB5D3 z%-B`|*E-;g4k3p8a}%&;j1*RI!-! zZta5MSEjpvopb6Z_T}=`?B;?09Yr4ILe34Uqwi~|_h+4&)|VO3&Zfg>W#{pWvi86U zl=TpM=P!)O+dS4EFnbT48_1DCw#L`ocM13%zj9ZOUcRIA<>$+H9+h3E zuF0|M_vGB2$Fl9%Wm&%am~1|FMb;iXD~rKsj(;%9LDr@vSkEL|OidFysUp5~0> zHG%hgq3`R9{+)S6H;;xgXN8{x1fP~Iq4>R*Lnon&V3`Nj3%4CcIYYqh|B?6BVOeGC z`}hrZj$;>Kp`?U#hp2#b2nd1*C?Ji17}#TXcQ;~pHyGI6-8FX2_kK1oqjTn*GiOfx zKG*g8@NeMYut|{q$O#GGWgP25KC#^0@C$Bk($!iZ` z+J<~gS$CMn2QiH{DZN`~`cnbuAU-{P`|cfmr~Or)E0inq#k6^S|4=s@_}ZDEy_qh; z*nUXt;HLOUsq|@Q%$bXQr!SK0LaaM<3QKn$#f)|Pu;s`(EZ=n$)7I?4m}T2AMz|I& z3xC4nKY^5W(d!CobnU^@ICP$SeqFhZQ?w7O_MPB!b`?EGY%h6UvWxqfFdz1vzKU&y z7qMdR3Gzx?!F(7;+cBOTkI&urD~kB0U0Frs9U#vH`JK4>5OJ_5U2_PN$noU$hcSKA z5lq`y!1KeHvi1P7QWF(_KScZvwv7_P{CodZp5=RbjcRuZYGa`i;ApPc{7@H5B(NPI z{%sHXmP0wuf7{VBSa+}xoASAb(V^2=yo2kDU*FJI&OgQu8Jn>l6GZp>WA|CGB6 zW61Rw@+^E8rMr1t0=ZsvJbl9ER1EapuMYzRz)tTS zkxWPOzMq!v#-PPJ(Qn}n^qIE}z24@&-Rtr=PYT*_01v2C$N$A;J#BAafIc%kQ_gJ{t8cC zy}_fGKjX^1$GCjw5$-&FiOsa5qp9oh)S7Ut@Jz18QkM#-zp>O_$@wJKWs7$n!-2Eh zSA;yDymlK$`TT>__XgUJY3mPS?$!d@k~27Z?BMX>v@S z$>%t7JYxAC3|d6~=59sCjEzX0x{lm!#8`6PYr!_eO<9Z1V{#ETa)pA>k;_p6<=Tj) z=#rR$Y_`23+dGhFEii^<_3!Ykqfx7$x1Et{a2p%6GuA>7?NKcKXK7Dm$Alm$HJuth zg*_)P;^Y=D-Fb*-uiq*VT`u2sjCpaJW&8@3ki#*; zvvB(>7s3a%%JT{I0mSaEBafSooW-t_+_U(^1#CTbmN<{x11B++e#f#s$FS+>S?oV| z6(_IX!8!7M>iS&;+fQ7=q;&_;Ywl)bQIDhf+^*wt(V6^3kIkiixi>G%#~S8a%8U&N zAH5Rc~+6WDWtdvBb*grgU(VoSkE>^OD?htF}n z#(UiB>lxSXe)A3wUi^%Q#N8(^Xb0}I?kXVHwB!80V};*hjA1&Sb^gpvhcSb;XZDtS zEZuWl(eC!b3s_G-V+C!s@H~s3ZDgHr=)!euJAR&Z;aU0}mla!*d+-!8=WN7KmY-$3 zf79^`n6v!|Ch~jBsr5B{&T{%G1L#L~CjXJ+^AI(0wUS1R%R>au1)T*Gcr1C8Jsepv z9hI0#d&VKVc(-lfWNv)zczDM-7i7zhh~C$I)(#V|_S*bx#8$JUeD)ucG1`4+N;;@Apg=$Od+TJ=!Xv^mzi@nA#L_X^12=KShn`kFW+z!h5~i<5^rSV2A|i$B3529Xmq~J-hj`vIaO!;Y>K=(W)>WR?h6rwJTg%1TROV~` zB|U4Y*U0m*(Jvk7Yzb%b?9Vu)#6Ts+(pzG1X$iP^^A0YN!`qLF?8V+w7qDVC|MxcT z3$W`DZTE3%`vkTU$1h)}9pU~y&tFi}uc+zg(Php_2DbGlY8cK z{%J+W16eObP0T|Y?;FGC^qjvHGuf8iO#fu}nJZX#P9Z+n>R>Wgo`bG81BO;KUgmICGJDzKZkI_7!UTY3^lo<2Eibe=giA#_jvOc8C7kO>Cy^omX78#ddBudXfB+YjQlEzU(Ao z>c&IJArBdI83W1NgSqr6`z+duxjT+xHnl#P{`~aK^mjMWw`MzPDz!h3c{iH6UC2C| z$1*XB@q+1Fxz7mg%>lM6m(s4}u`bxb^0l4y$F4J1v6$`M$t-8W@o=`+=kWQHR%}48 z)b5OJ_%J4Jj&^2x<=MwJ=CAVHqG63=ZOygH2GZYfqMp4OKbQD?55|W3#Imgt6^13u z+f{q>*(NN&)*~ks8(nbjGPWK)MPB(I$?wt~`|029#*DSw*dE@3IU9B&cTYZjLE1~& z@%4ubiIY6$UU)3;+m4-s*x=c0cPwT-xS!>E(cY8f=`cpH?a+J4PKb_YY$-s0#;|(N z-$>54B4_b7+TMKDYp2Myw3SZ~^udpu!7`SS)wIP2= zY`?{unV)=L#!VLOK88sf4N^UPVRk&@J1iJ6KoMxIqXoUD74 zDP8(6^)0t(Sp7gjPXBQA zPRyiMr)_2)GbXTsWn?DXt@C#lU;$$Vqv_A*u&v*pv4O#CO9{tAS8V6~hZK%i(3jb8 z^gQ}3-HEJ)Tlk$q{{8{C7+{t!|IP5jhdDd zJv*|G&Vw-y>0?S^pGH5%&6B!x#H_( zN3fSZS>FDm*i4;oCHHH|Z|>fsSiFmNU^Ux{D;WK|ALJlbA2@*n^wai|<9zzg zr*7QEE*|$|TTr-8roG5nxET`}`xwI5RnK`F(M!?wW~9%iou0i8y%;;}C3dYCmFWD>yX>&Fpae5vSrmW;MHem2_+GVyg$B@??{$4iYU87hhPom$` zhjnTCf~|;4&q7c7T+#<4eVtK$uI?K3>puJ|wxjNkl|II5v zchZl28%d0hFV0)T@?XgK&Iv`w8)*Ypk=>5O_K6Lh&HufI+Fio(I*Z2(skvFy)zpprZ|m5$Ub_pc`5md#hSL@gWgI1GS{`l1 zCi)hPbCBz7YHkRx52GE(B;T1lmohI}?8kV@U~0b)>%!q{_hA_A@<_%=hOm7qd5}dO zv*>?h(eCtS+MoC5kk7t69=viFMv(JCtZV!7S~joAbCPlfljn|z^lGj2IdXi3S)&H^ zuKX3Ag?CIV&7yl`sBI@VcR=VVs_*?zEdDZOr3?5w6(%>?%pE`pYylwV;pA> z7P6eq-6CWRlD)?i`zm%->YusW57BQs zfSFtNlXJF>87rHyMf?xOFlk4}F+R9}ag>d;=QFp{4`-Zk0OQix)NyadUwe_0UgV_r z^6dnD1c`HPJV2f9M_--`a(I6~0pkG!`1v5_$6)d=`63X`1@hef{9NuGMD8<&Phg)_ zh|=FEb|a{*UDL*D^<^D{zvSDQYc*&pdKRABF|Hj<-=jPG%5rEox`zd@Phtu=I?Q_b zF!?yBV9D+yY{wm8n^T?>ZLrVnH}=)aPDlFI?)QP7{)`q3u!r41M4D0#zm z&uCXNCd@&4mtZA6?9RAxKx?ZiM%v9~-H5-$vq|&1M#8f_$3V1U+goCR;-8COmq4C} zO`Jj-a1<+8ug}|=ucXUa*Dc`jY}(m%toxSlJFe(>+i~$D&e1>Sz6jLe9DY8J_2-n; z((jUoQHxd~bHZ#y^c{{)Sp(r3os5tkIY=Kp4Lv8a?`h5o3|qVgy{0TcB=7Nv&q81t z*Lq9t4WGnp_$6c`xaSab8ZZuBM@&cJn3?E2Xab^#OhVL8Q_wMIETV_cM8<5|oMp5# z%%>s3FZC|`_h#RZ!s*hjw8JbDv?^K%gCDO-r&0poYRkJ!y0kjo%9KX@pNQ?d=+ur`|(2M=V-9vp5&)8MQs7V+weG!Ju zUxg9#Rv?@GZT+XrM<)468ax`Q!zLhy=Mz_MWPEu8hVs6oA!E=bvoAWQXA`~P9o-!k z-W_1j))RWpZqRG(4t*C7=n=;5elTwDk5=siVB!(T;{fQk_JEFad+4|E9D53hiPu(LSLUe0mH)K=0A$(04ps zyJf(@$rVOzJkTa49iC}J;E_HIo;^muD`TW`?3O$PZi)Tb*XxfI_O1A^t>R`$pVzzX zxWCG?akDzU{nBL%N`Saq1Hh z2e0sM@Cxe;uaHpqhIK*!*Wv3B9fP3wBy@;Ngl}Y5vr z6E0|O(;AJ<90)sTw6Y;=(bU2bEo@z&Y2^$ZCpUht9klpe13sgriyI8uNFKQ{4?JM# z>H|YJj`ax+hh1nC>?69uDXKdh38$z;wC3r*(b&|6oVJFE zTYK2}1;X6R4^BbUrf&xrw`&h;Uuxae9j;ws5Yj6Lei_*?aCCs7vjbehBVgYl7|s#V za8J&JTXGiKCug7y*O6~&XN?vnhUB#+ni#Z1W4@1ueoLt9wL~+cR?xEGd$lq_3v)|q z-33+wp=cAAh0YOS3eOT}ld(+X*+*6NuZ>MIYEnDZ%f6K|2FigpTE@|Jp)VtG{#1^M z3GnlxhQrW4G@QEa1n-D&B7*1)4_^1_7zz(^>>l7x_>%JgcyK(1SBNic+BratYwOo& zsE(?&>no_K-WUzF^`NF_03ADfa@r1d0e&#!dUDqOfv{uwY0WVnUa@iTW?R9vTLN6W zC$sEl!7HsNoFluz#N8VjElp6TadXsf)*NcGw}P=D44hri$jFS>n?hY%6D`jf4R!xgo6w+ft$uDC?CIkT- z&l3iWjSFpqu@TgDnv-KSRIXJQm21>N<(lV@XY!!l-RKSo#FQCLl!N)gdAVMy{UZ&>S^2nlZl` z5Dkk^ry+i*qsHf|6HM!=qd{}wSPwc@yXlg)iTk4Zf+6_WD)oevj z@0un?yk@BAUB`-J|3ZTlo~5lK<1ItmJ6E?eHT+P$TGfAIM~3@d@76U=NKU~FlN zhD}>2+O1l<9@BcLQmY<07M|;%3Uw_IuBz43z>f`@pmvkys7ISwuZ14!({5^7(Uv;8 z)2_5rY;^-2W7KS{h3e{>3TifLfjZ4-WA$1=!`K2%%xuui!U2t1S)n2Alh}Y(t!-i6 z#uhEDO=0F@2UEVQkxN@xb1h&yu2t*c>jO9LvE$Yy3avXu!pbiMx{j<1Y}!J{-i`Gx z_b=jjDk;;EjQ7h}S8qqla%P75SF|;oeJ-V{`Y-u+`WiLoIv8of#Z;eTCL1YZYh|2Y zQm7AO-JJF5+YUaRyx|_i@icyJaBSZe7WNJ>v9g7kwH-`Yx0u-2!qnCdh8C7k)6`Np z7H*3;rS|HO*E$XGLp?RrP;W*~X&VjA$&C~1IS&}Pir)}~R^DMS^^Jg;UnDF#bX8y; z7y~o^C>VK!^1eW{Y!?6nH`;5jjxhBLhk1ucScXKyCM*`Vonq0-Cye(7!Nj{GOgx#k z^@gc;2#h>~Vc^d1yZY0Q@k9%I=A#4sm$v?VP6WRn2d9`cw4v|VmOe_`#NP1in#3_= zfr$2Nhc;|`x3e@VV`kWLTO$qi_gv%l4>irT(|+OFcM7=X<`=Fb`=xH}nxC~bYOS)- zZ_F{n1{`Co0auR84P}fYf#V9KPa)X59bBjZM^7I(db3{g34pza*k0OG!p7ALw(dT# zaq~h83tQ^Z5cRbUQBTJR_4Q0pUsqrXHA73*bN0}*X-EIdm;X74T!q1eyqfw(^1pUb z_%!p6=5bUpx)fbkK9hR{op~SgAutM7!O^e^i7DbZqC4!uyOZm9Sck^KGB^g-9b;i1 znFQyqX>f_{fi~SU;S$$_e5TMJNmf$lZs};-JqzuUve7QF7wgZy#mIq2TsmWE!RW^J zge&`19E`L}*;$xO+yG?1`TAp~E|PBd~iK0yus#Ah{<35;Nh~y$8HwQ{hFQN#GHk z2s`>82JWIY{~}N~`tAJaAA8dm_GaqKbNM_7h91gPzr|>A86DGbq zCrVQJ%*?+FEQ7kjmYfQA!cl9&l^nUH^dVQh6u87^!ht;6bxvfOf;K#NP3eX9J^H~T zqd)z&9Nym>u5AAZ+!XZTaUZy+a<3!8Eu|kk6F6qGbEq=DvAvbCjCWUU=U|;l?qr|z zPh2DSJDz!6_x6-UvslBZU=S!$5{pjMy$k@rOXpZj;^g;*n z9GH?_#54K!OUQt4_YC;Nr^7og6;5GY$rX8H`84(t1S{p#$Rikr?rfX51ri;2%yZ$` zvm@^jp5;4XL??cqd{f(h1XJH|<^k=A=(s~PtZ5_cJ14*)vIuf4c0;r+I<^dorahtF zL%PACOET?17TnYNDEulslW*Z!@r^9uOb6PXF(De#PsLh#SOtqL4U9>{4$~cZ`0cn$^5G&f1joQe33%&2~$-05@dP zK6fF{eq9sbO-_B{d%%ZUmeiYN%Cj3ercE^UmGU1-bRriK50LUNIu?HUU8cgL*k%)QD(7NnB@e`A%W)Ccacco;Ruec?Ek$U?g@TP8NvqcSS~2Frqtn z!Y3*Yp0R20>Yff?u^(x@5tPMt0>?$SiKp$Ord{GB{S9uZz2KQ8Wwb9^)5chlbBhjL zU>?YNi+0t5dNcFyOb&}URrn;QB|0}^J!kZd_RW|NRvo(*>6YLBjbHK{P{g(5v*d}O zD9<}9-*N7m%649F+6=K9Z10h4_p}nO#cqhM#pZ~OCPe2+yw39g`tqE=0xy<#nJ2?} zVdhPnG(Ji0-u(g3a(yc?n;1%D5wS$LT7!CRwA5-;@uZ%Oo77Xi=dwU5!`FQuN*taus&hE+`3x|>*x%)GnV0*nFBB0=aoep$M3lF zyROV1SGLhyY2#g!vstfa!YMk1n(wM;R&0p^;kFpUx$rNXO5WInc2jthJhST@&w4DG z^;r_@zHZDn+Vo<6Etr?$dpLJXqs^dg=I=?qw^wXO5x?%_UAULeT$6f|TY{P|f!LaM zgcsXk;a)DvoEX{-IGP&hXgAl~NACWJ=k2^cjp#vy5UzwZ(W+tndYW1dYn1n}H{;y4 zdW?^4_PiO3mdya|7zJtI%C+eIj{@f{VN+C{|kd#QX5 z+t92NTxhRcShiZzW;rr`A)ni@ez2l%XT{i&@ZK(w`N{f3xGaJ2EZ4r}Rq~)6-_w=l zv3)G-bk0xk;rs;OsIKsh=%TcBJ=?n~a~ouSk<9b5HPluo)0@@Q8vc>pSV~TN6Mlp_ z(Sm45)F#i>nm4Rb+ReroMosD~@gylD5u8Vr)|vAZLO4D(oG}e@>PG#zGIfZE<^L0( zDV~TUXYxO#-icDQc;G2z@iQ0zDDdQcZa>bfFW zGhQX%X-nSR$x{heQf}n=)}dXM@5=YBLt|Js#w&57Hnd-D`Fn1(X#$V<6t?4&SkJ^M zF|Ob)k&4|7?G()U90BMQ0Tuw|oqOq-N8HPD;ThC-mtNz225M(_>;S9viASCT=UvwBAn18su5)gRYHY4qiKVhv^&jV)`Ig* zo70D8thL1FU~C({fdQ}%j8Nj~MxH^mqtccOCQl&>XBO18RY%5tsdur@ZDQFr=tg@H z84HJy2-x|Dz|JQK_Fn#Q@bpD%wk_Sfecl(e4$N2jH{#<++BMh< zanvHmA0wGu$vmkH_St1JmL>WVyC%BiIsnw5m%?3F`lC_4ZP|b7f(Xui4P&{Kcv~>% z33ecV{`94MS?9~#Pw6L-xt^|!=@rfI)L|Th^EqXXE@PKAj6+zE57Vag6(2$BuU5?) z!`x7>LBj?OHqzht{5ziKlhZh&6;XpI;Tb$e;?&+!=@QX8hNW2;^RtL17&c7{u}LjFSfYdm+r< zQ)%x+2Nm%q{WOW>Cy^Qx9SVmjGFO2*6g?JcQpzxO8pgRIELWmGg+rF-NNO;g^+y=v zT^(KRi#TN8n~c3zIHa%3v092A-DnS`A63eJ(cDn+?hj1a( z2(itg=VG2~z)V{MmO4!ppTka%ec$FS(ShwkWq!0rJGe5&;p4-$q3{;qh427R1rh$- zha|uQU3eZt-z1K8NKz-3Ve%#Ym_4Y!9!zDvUJCgX{Uwq+(O|sr$M{rN#soRfnsG5| zkY%_N=Y({WGECbg?-0Q8e}44uy*Xc7+GXvjLpR1_+Ho$q=upbGvynFWlR3qlE3V5q z;yRokPMa!_ImIO?nk&xhUB-^A*gkP>*swuFgZlM{aUYgz63_S@&-vtZ2GNNS8(p0c`>aBsQN5b9 zI}Ko^rwId%I!ZiA=DNFE8N!`)t%sc%0%*6wJh&eyeRi%JfMn{B^URg!FZ$#Tl*c$7qaE%F7Yh(S=R;^l=GdF5k$xu(bnof&m zb(=QUXsXt*fdP52BfN+RB7=~2hP37Kh&_a~L9Q^a@sNA@yduYc6G!6bmk4PGif`A3 z&>$)hr3e)b^4zjXUD&j20lkK`l=ipuV=+DjS4%^dMRSFl2v5$LrtOR78V7Kj{Xv1pxwqOvUYg}{{d zOl+F86>Nn|u1(OE@8-(*my4ybs=aATRZBy?QpUPkWprCKtDvpfv`UL+O>1g$)J0?J zQC(flf@R&E|5vn@Li|KXn<9_e+(jHGE)jQ#r^L_P-{u|hk@!r=emAlY%dd9gTP@2m zpCz#k$&a~&v;!@OT0}WQRe09bs0CXCEojqL8#Uru9L>~dM;a^TQ2HRHoO2n%C^k@wFeOAkfkZsfml#hhA+``l ziHqEq<{o3h&xtq0N8+!rqCbG;@$5TA%I#MggkeTP5E^9TO^b3$TC zxkOLGnP^H>BhTe@)N8SBXb#P~)uBb(p--+2HEJu`mbi!TWy1DQ5qKgwt0sx@oY zv?a^5Bll4EBVuR+dlF;V7crml^!3C6#?MbtkJn_MQsNo+GI~Y4B|h-{6Y)jLHTyG! z&+qD|Kf}>~;vRVi^7)RqM;s=kPK+Y#i6#x})v2bfR#U}NuLYXasZQHb9lC70=rybf zgGO}}yD0UwE!XT3n=N&V4eM$v18o)amf9+&go(bks6Y3p%8|=TO&d4*k>$D` zpRY-+84?cMi_wcbcIKXCNiNP#VHxo;&3h)sHcjmsWfj*sJfL$}Xi9*;-xzOiujSlx z>Jay_yTb23;C^e*Xcu3yKj;;Cl)a(e67P8J9n<%`_JQ1f6p%0RwMzCr5&u@|t8XEB z@O%7So6CFu^k>ZHU-&;i^POK3SBY)J2qKzrBF}2g8`e~{CU<5!T>FSTI-0Vd#?(N? zn&p~2s44<=Yx;Iq-8-N=3WueroEw!<`q=QyiYxo2{y4XHa-GpVQyY!X z>8U$mV2=HWf&GGVva?bXx_2Mbv17>6w(Z*P;XausG&D3W@wqpsqx-b8PnaJs$^Fmd zM)m|2$lk~$d(X%^M}m*MM*;JwBtJ^>;amRyG{4{Gh1e(lPq81;mvW9+OGsUj*q~lL zJI0||KQ}JJ`lXzPTEof>8YnRkeyrFQ;Zgja_Cz?5L<}S*@tKQ>P1Nc>;v{*!NM3KU zoZqFLyiZ^LA#vZq#^S(;%*fv77x!*@Yf7Zb&9R+vYZx)O3vLaH!nM9pINLiKM|yFt zMz5~e)2kb{^^V2*UU68J9gkT(;xITRj`K#6Ft|^4xp6}W*O)YVM2n$64YAG2%JPqm zjg1cr3(MjDq!YN`-6A_%+l}03{Ggtm-Z|>vKKqzn&=-5o_j=BE6o29|ugN}lZ^@IA z7d%$-LGpqq$%AjpL`gpU!#v>gMbmGH`$QqJiI_=b6Rv~<;Yo-ODZY?^06_`2J6%{-M2mPF`OyU!^X3(yVFYi+y@@8g+1HtkJbeVHK{A z@W=I^hyek()+Z3xvpe8MW-zX1gy2Gtj>u2zh<&M{*pV8BO{w9?BbKK|U|~umW+ZpP z_@pivog9r(sogLtEe^xdyJKk2G>jP3UuE>jVWp-{nOtGfqJ=-MT)9FmH+N-=l`EDT zb8k{d?jPEI+qSLVyLavM+_!gk+a24t`h|5kma%EyQ+WA0d9w8R80YlekBI zAClL{ftC|Eihr#7v^#l72b z`S5OBJ$?wcFPy^DdpGgo$$h+j@faW8zQmW$@9^~-eEIwqUp~IUr}r=M@!bo2eE*8+ zOMH0uocBM&yEjkq_U9*f{P3>ooH?_996NSwld)sQ*m57(pv1()RF;d8+;4M^nVH#I z?oqvqW#TCJ61>bkXCJb>yyG79pAr%hzL57nIv;q=L)7}!4taj{(y8`}->@$pDbPFAHYD%Y=Hzv|rk zu~E;SJq@_8v=jHE58{5LqnICexsR^WcKLgnW_gf(Q^o%fU5mXIZHs>`5boa+?}?8B zu{GrPGt1UzYFGNw-_ssE-MxF4_sf@0tG#;lZx1{G#9$(_#)klfO^G`3rLST*0ds56I(FeEINKE8WOejnlEn}@&R!|VI_@S6EZyjS>sfOoI%k?(tW!}Rq_&bvE(6ytI- z(Ysp&dUTCMLQEv$qq`tBItsB}W6-T@j7mcH_)6T*RF|C3)Ya8}&V4ff>3*2PHFd3M zn|9=ja9NBm;sc82i}6d@vSpRBA>SdSPLO)z8p}=ar;l$`KYx5lJ(b`EJ{9Zh3$^xH z^j6H5a?H=jzoNk}AD=TNXG|4sD#t|}e);f3;p_byazoC9iz}DU;_0L7)FF8zpTg_s zcaIc&QqqUK_K0{$9rGUI?aSME{rm=AKf8t(k1yfj-E+8o`wVW}IDzXokK_7{Be;4! z9~ZCe$KgGB7@Z!^xs$;hU(UJhojLwn#uRi8Q;my?C^KZxz0XiwpTEDS_*|YTJWKs>oAxUE?AcR4e5AfUP*)#`Pb|A~{^^61WAdz^ zs7y<_{!Bdd93n*x+~I<=ufm%q$%M@ z@bOI%KD@ch^SdmwcZl0~^YSKMJ-@DS_Uy?OJbiqboL_0vW`Df;$@WKKVUR;1< z=N91TS*B;^;ppkPIC^F_4i?V9uKZ~@cw#0BPR&B$xtaWI3QnAzj?L>QLB`j2^l(uL z@@-$bPw(vNtb@F%!{y}a8X^9<_7#3L@@Otj9b1XBCs*Ly*`+v6zK)%lgTu#XV#mIz*s*sicJ7{m zP1~ko{_;_rhc^P-4^70r!b#Y7ViI;1Ou&|dW3m14IBY#M3Tt-{#)5U3n6$VXCM^ud zPt&|HY_=zc&UE874=mr>8LMaIAj8R|)ZomNA3KGGI@5;EB2SlyXN1^I(XzB{{t;LI z&S&y$@#$X@m+31H-?C+My<2xrQ-8;ZBeZ!3aOK(_T)Dav=Pqt$d0dZk=hxu$>0InT zFdzAc7Ad@)KSACKm*8ySVq8D71a~gx;`qTuC_FeH7fvj|C2I28g}JzTaV{=jn1i$D zr=#%vWa@Jg4it{T_I)F;bI&;1f$ezy>;|4czopoW!$%e(ck>`jTakj{v!l>|64xS3 zcYsfHON69oBQU8s{F9m@Bux{YdukyfjpMHpo5M4vF+x+CqiY`>jG6C)bt}h}jqTdC z4Sm+x{I3@X*)vw`g|uOWhyRwAC4c1E@;k4I2gK&Y!~};IFD|Owxw8&;Zm*`DT#dW8 zSK-$6TwFM_3>OtF#r5;c$l+XEJUI_HFD}Ae>hku5dAN0P9_}-Jcy$3Tv)rCKIRRHM zO~J(r6LI?dSeE&bC^$O`2Tl#ct|LRK)gjorcOW+J9D;rOCgA3^t$6bIEbiYc#O<30 zarVSY%$%P_UOE2NyFOYvR_B=gs+>3RBdk5^!8N=QTso=4F{A-n2RB5!5Ow%;X~KTr z#_;dfgkuStAtY53DL=WXq-G?z(>Ig#AY`3D(bhZSziBT@%7E}JWk!Ba%FsEsr!sC_ zKV9MRosGD8X({eqTZTKAnOhhXpV0oZY*AIpAUtlN=;4ci9d@R7;P!zDO> zdJ)c@T8uL%SVoR7B*#l|?&M-@-!g)0b-KaGMvY_K%c4fz3aC@RBI;^X16X_1frV==^yu$hIV(FUkv{De{#W5y%JP3( z%O!f2{FHh?e)lfR)uL%rr?hzScn_Z4nS&>{XW+@*>3Dd1G9KNTf`_-J;?d2iczS&r z9$%Y`$Jd41vAA`4G;UlPNt^oK- zkh`u2cJCREQzvHQ?5X)UePS-ouxy+;IiKg``NTqA6W(cy$n}nm!w}Tb7B%WuLfNva zs9d!SDpo3u@)b&R}y5DxzJ(9T;O@v+93INF(c z)}vzYK8d|)qaUzNdPDrTZS(InEw<_jfA?@;V4%-~`zOo3csK8^->R7zE!Rt3h3CAU=Xj*KCX!;u44IH52HJtikS3NY+s*3uJ%HhXaWl-hEQq;F9s#YtF zN>!OTAq#kY1~zXPj0qFF zAw13=tpl5I&PomF+f+rfmKC96S_!%qRbXh#x>COaTAEcsTiOnfuzH9}Z-K~^7DyYb zkIbRQSiCx|R&;ciCG@l2Fjn@z&~!_si zC(wqBq92fhT?Gl)uqPfH55!^Jfmp2D7mH2%qcJVl4=c8NVd2^~n7+~xGxMA=C(niD z)e(!AI%CuX8;qFP7CW{i&U;4tiWr|OImi(VRy%eX_Z9ierLdLI0`XQ}fYb5q;jilaO<2;GuVS?4*=u-#I-n9@w zA1@`R6;k_HqeqUDYD%v*Wk*jAsW@?Ja`n-phlDq2(&Q@J-Qsr%5C1JKmpr#b)35kj zx2Wkw%a-%)&T1i1%Z^jpS zJKZp6qYKwra%Ef17Yo+6!~B)B6RX-`%7WIIy~qW92b*DOo+lRNw&iCoSiZyu+cx*6 zt)7U&BQtR5Amh}Brxo)lycVIbI6Yp#c69;c*vH86iN!cw$hJ@c?a7gqv@;u3wr*Tf ze)7a&wY$efX_=TBTC;b(UA=mBgJ~NQ7%%G2dVV7R+X`YQQAmg{E&us{VK+q6!gEP| z_?*W#8aHm-cgM~xwfCJEg4t_=u&XehYx>3G;KdlsTIY*}+ugD2L&W#A2h3UB29p=H#)O3qm^#A-i&nJ8#2LO=xhe%m z4ot+}o#U~8_Xu(~1IG`~!ZAYpjnjq8=5rGJN=81abT; z`*~IU{QN4?-Z}8y(}*#I#EC?&(l$9oTqbT2(k6RKydZ?*|8{(%#AcMF!nKqisSh79 z|5pqdGQ{-AnKi1jR|j*wq^?}+F97p)xMTTlPinU<^2qIkRSsO|%aiNfpgwoIbL|on#0}Qv`Wy}zy2PGq{kUK_?eV~Q7F_Sg4GTBA zA$zhpqWbHj|5PjVn_!9o6D^Q1z!=%1Z82(&Cl;=WQkgO@Ms?`esPdC%W>uaucU<-1 zBZjC)M@Q>9Iy%}?n_jFZqWK=8&!32C#2jJ@F@T8V=Wgtmwe#`uab}-TKiUO}U3{xo z(Ts2^|4De2HlT1TdXn-h^^)jIP@=d0MJm55?;?4AgZ1!?HEVO#kF!mkd&rAx(}i>0 zDu47PcO#cOAZNM-*FJK>z_}JkAKwZoBaAR;nk5ELw?psAR>+uWj^PX1V#@Nan76vO z%Chw%$}Y|wUZwA#gt`%3{55_3JPfR@tsL0i_hFwzGak8=bipw;f{o=)ym?8Toc3zqVYX#sh=K`Kk_`*162^={?FX&Kp~0>a0<9 zGI}OA_4I1rN=H|_HRCveZ1cvjeV zYr?761>yc0A+|yI6`lN%UjNsc{Ud(Ay(W1s?<%(AD(zt36DJN;J9?=vHSNnanLW8C zTM`zo&r+Q`M=$za(XTFd=1L>iO-& zVM6pM`jmR9_or97~y!_m%(f zklM>-`_Sz8>5UcFZkkzb_?VpfvGL(8oLbwOYiVn>|idd|oD`j+ZhoW%}DXUicJ!mhf4kPvPiWo=Uh9 zzDhWg_xU4~+*6X4-1BGt*q3|hr zDfmChQ^_9nhB^QL+M`~ze3f6y)oJmyLOrdoV*4O@8zHW=Js^z|)d&xZgkLtLkq5fA(EAy|koBz@0{-@vb&pfYe z%_hJ6(9-iuWz&#PRoe7=SH&s&=L!y4&nwtvJZAc!qC>{LiVj)#DmY|3s9>M@xT0hB z^QtbrUsr3B{l2Pc$4}LbyuXyI*;s7Kzs&`Gq+gn8HvMX0VfNMB!sM&1z4aGIC;KmE z<|bc_j19iFG|>NAxypYxZ~qhjqvRQ-s?_DF&HIbK=bA!~an>-1BqR;f43SZ6-1 z>X7!jx?|eMN_=K%KD*?1{?)X8{d&K&&}#lwORM>3rk@%&Y4ovavnC%JH`e&ryhXE5 z^j$w|X}9>wK7_yg8~^G%{gwMw$wB$1c3*#R&i+*1HtS~^>{7!=N?BNz-;W9JK6M#R(fumzuWayozAL`ZKD7mL07qp9KzDZOnW9n|2u4lbT-* z^W;;i=Bf88I%oX+L)%`TDr(w)EmgVJzs!YZbIq@6>S~|e+Pf_a2=bpD-#vO}x45X8 z-o9Ql{Q`VuaKh&Ya{Z}x?OIaj{L9b(uYadhnO{^Z{`gB}+k`I_owDARvP`|NYLQx4 zxplAkMlsX<{0FUVk~-@^rJr(7s*K!t2@`hR#^_!5Fml&@jNbDQqlgha9<}o>ChWWo zx#y?cQz~h*4pj6XytavP*XiDsTlb!)YMpva)jIuNCFkC6f3QpZtXiI9L{>~rJ43I_6tAFR8!IQzK8!xOT&sND4P>pqgC1*dBWdL|#4o*w*u@vnbzuq4 zquZhj=)UXBdXp7!*Sie+kkEsr7D4n3BthmPK^nz-;3((jgpFyX&=MlB&G7_0DiHmsOnC+_eJ(j4~_8QVd#VYlns%82k z`R#JLo_~rH#(QMW;b(IAiEXkHO-mc&*^prag=dZzFZ)KLk;X?Ezy8nu`~Tu|l`<87 zDWm82wTx}XTUaFDE^C*yrfJ6sty^cWDjPBRAmWx@MwbN_(UBYmPd}|7X! z70b_!a`qW-%IW!jk+StC{=4uecHuKQ7p|op`z$^ob`sMkT(k6L_3A&$x>nLQ_%qM@ zuijHy*Y7LK?t7NuTV-rBmo*9*Z|ju3N+pauL@v01pc!W%-1$x^;;o3gLUL9J&xu9w z8k-N_F?-=XWXfx(01n%Pt5iSdwYcXfSo!7X0 z3|zdQ<8jX8Ecf6$asE11aBcO7$@}3lG9ON(j=*um5jYGlP+-qgU^gru_QML`G3g|N zrW}Js+Okp&gT@)~9Tuxtq~0!V$2z!$`&X1M_uc#cJzZ9)P+r=#5=(ecc9eL- z{7~(O6T*9`vZdda{;|U6($y<`EnTDH*D^J~MWwH0Y89but;$~oCFhbV=e6Zp*-~ICCGv{Q9s2v$EGhSiY6upDv-7K49- z`JjUkv>tU7KI02ukgy1R2Xj^Hv~?=hY4=#hKB?5v`~IE(PWk8f57D#u8#j-gDA1fT zeWEGnqDXw=wu-9CGu4V^-j=FU>3tcss_)Ba{P4bPqaWUvYgFxh`9?o}sL;6j#|n*W ze5^=RYEqNOa!xd<{;?uap=tGxRn62s{b17YQx*OCpUO9`{-sQVs$cPE)>5WThEe2a zSfsup4p(U1FQj3|DWzKv+^*CZ`W?q5d<)kHPF+X4 z5&K~_@BqvP2=>FY|F_u3^Svkl}R=qZ$ zs^`cGrR;mA(pFzqu}*)38k+x1(=sPo>OqOKT_`wqsOiMzQ>!%SVrEb+T;Hr(guYd^ zh?X{ggqo2?wvA$~71Zw1%2r^I+RnB?S99BHom(nU>uO=wG~Ukc$Ib@!wK}v6Q>{?u zp=$ZkZ)l5X_f`I}FJsW@Gpv#yQ_DL`I}cE=7cv$0gZC9_?pNK3-o8bV_C$Z?y|>`e zbIvvT#$No<@wm0eVbXWkH`vMJV)S9EUKS%$i19?bZhkQ6>4w@pEUT2OS5;!Ak5tQ+en+1FzNQ5(h{*9)k{lWV03w;WigD$@FHR9mG{C(=e zbLA8xAVKRNqCsza*z^y8O}_x>_vM=0@uA3Fvm8AJW}!)f9n8`^&?7q?%W{{%v709} zvK=axtzCH=f9D1v^{&*vfAelA%QaGUsSk^k$Bb7jfqm~LwSuO=JV!Jpy8BjZMLH9$ z30f(9NlK20&Bw0&Lp^`~`~^K1ABQpdGw!+NZ(x+Q8Q&pu6O0JE0lT0?W1cJ5`-L2fuY4I+oZM}nQ${x_mpuNaHl6ZgK_3Y*!0~36^DMMVV%K6`BE;@hP*?i+TYni z@+|EWS!dyHjhZzIYSpf_vPO;S<9F}fQD@}h>1dqL5q0B&P^XJK>XSdUZr*5=7>GKF z?kLqwN8!3rjx$^abX3q{Ksz+(X$!3sXEg5Vh_WgAsFcn<1~R#?M2Zt?^|C^>G!yb% zaS8dAJ{D=`Oa1$|dTwY%n~_W(BV{javJA?*{shzB_Kyw`>Q_tj_WU9zGBardk7x87Y6C%F?~H+mLQGCY3sg6>RPlU^izI=P0n`I^cxG< z^yFfKDZ8nQ=Ma1M+kcX|;PM}zFDv&qg6${n>shWFZA$kR&?L7`*+FPc=nQcG&Bi2B?}DUaBr_$drJGbJ zTfO2!{_aUa{F@KN-|}qI?K9u`5%sYcw%HXLgiceq6yAQ-oaj#QjrI(9tl(SikvpUG zbqE}}lY3}!|E;}OuyFS!^j&-et^03*KKay76%_HOM;?o?hAEL;g4H};4c(;QpwG`* zCQ>%Gy~^@kX*-hd!#Mie`tVD!kMWQ^uOB?5zxLv#3o1>RG_Ks1?HenMSh^a)i?5?Y z-YZPz{zZEaaZkq$+~0cZb@f9nWKyZo$GWdohgrB&Kb>@g2{Na$3VC+mDj-hi1RF zMH(j0DoNTXl|tJhI!^fw)p{s;{^vX!MbghmIY-~wwY{tS2OK=R4$kzq7MrdRSOTx1it-HaquhtMaX$J5Ah- zs2N+)b?GrAZMg~WxxeXIXRtf`2gSgDU7pPZ+Z|K{XZGhq#}8qMPKh*fA7my2fPvuW4m#4-g$?i7T$5m8Fb9Oijej9VLde$Wn+r$M#DZ1Fw6FWSubyB_HPU4Nu6On zx&xfXbwbD4DbN|(9s%=`Q8&l7i02GN&oahM#=t!y-ZDn@iEaDODy2$)R{5d9XVhu= z3HpIgU>d)LfgAOz?T1raD~ii(NqH^S8g-{=P4p(m@wo)~>Q3$i32PMypKdv8FlgZ( z?g3hWNqL8mIB5%vQdgl#_qAvozXpxsR-;k3RYWc{Vpc#SdKomLmO#DBVyH)!U=h?J z7olP2-=M|ctrx($&@z>aak0>tbbAIhYlY{!_3D0PjP6A%lU8}N=FF(GW$VVW>o%?_ zotw9!)bW!?RKDdoZu`$j*!>z^cD_O2_BZ%{?7ek-6=&Bqye5jfLm;>Wf&~i@CGPI- z?g@k#K|+w=?(XicMT@jp4N9Tz#qRd5-0#|Rav;>6ws*hpeZKG4Kh|&N%$YN1W?lPQ zdtWlwHe0Y0`qey}(uPAOBq3ycGF;{-z;1pF%%=w6>KoVDFLo1ikFG+mN>|t|jO8p& z+H--*^AhrVj*vMrGVkpha{Y*HmPgRle+0vZ-=M?D_s}fA%Pb(imz|Lb4);fEja?|=UrUw!i!+fKfQ;RU;3 zl(Y-&5_h6q!Va{J--foaTZqkQ6TJ~_cpI%F)}VE`2Cc$Zqg9v&ExGMR`)}<_o`+^} zVYI|G=pFJgy1M*;IxYUws#VMH7;k(L8y_?I!o~AAb>sR8+^^2&OeCx>@=s`1VnXn5j z;&u?*(IRFmnn!I$^T>^89=;CEL)V~L@G4>@ni9=JR%z^<_aZvp#Ip+Q|8EY{@VV$X z>OR^G{+9TW>vVm``E8%2XQYikfAK8#AKHU;8&_lLibZ(!>IF=z5pN_Md4l*8PZ4tL z8Qcy(L!bG(pck)+>jqBoLF9xq=37jI%L1<5yeJ+$#`7JA1M6}7t=mZ7JRXB*`eX3y z03f#~>g4y+Z#1x7Ec;7m8n&#r%CJ@ajfSo3Z+RJwHXC&8v_iMHeU>sfwNYK?DQZ16 zlDb->&bEzOi#Aak&?aURL7R%(M(jZA_?>8#up6xs_n>9sUgo`i?N>S0a{bNYr*Ij6 z08Qg|qiO6;G>zGTCQ;kaBytNHhi^jT(Di5>yatT|SHXzo+LO93^`{AWZxFBoy6%er z>+zufYlfaaQ_-sb9n@|67>zrB-@&;3x8(WLl(gh=XV0C&z5}~{ljrC|PY_AH@FmCg z2cDtF+?~*i)9~D6^icFHazw9UN3<9_90R5?_tpF;beZIcjuS>36RK{_qVtaVIB$LSbYXTZ>*0xfAzQb${ctwM`X!D`ys zS~QQ?K%3iyW>H(vEM^PAf=JC7m@RKhg{hwM$|D53a@4r{|4Wjp;ah#@nS|{yAnHDO6vlAfCp*D%emLwF#bEHP05mQh3gK5pKDUAbVstge zaH~Zj_X~TWY2gUi=cJ>KRR#>~C!rbZX)CQhlJDkWYtSTgEgFYyP;IVJ#8xzl+D`05 zqv+jeD4fOZM{{bx=ifYi&Zltt?YG~mI{oa~Gdz9z6i=Q!VJ_t>FfKTY_PM8FlzkFy zGmoNW>OnMPS=9;M0{Ac#^;`*fECbvY*WkFCYpZe4vra~Bb4yRuYjuiq4?co!t$%TR zwVLOI(o<)S|1QrV`=7v(m86Ai!rBgYz^o3L&;tA518VO(DG!2jZ22bOy)~i7z48zz8Ezx62U98U^3MWKC3g(YCPjQEyurN z%R01S-7zN6Ei{1+QK!fZor=9t%Og_Sw6r1ZbFq%PFko$U^}65MDya zPv{;f;rpRP9YpQOU3mBXPw>STU#R%}bFQcM*=H&~`Q#G_KK}S)=HGn`uWA-R6ScVSeX;}c>^ zkDWL~o_D;Y&o$!>-`$VlL=4~g1SVUbp!xLe&v|ZII23)#n6Fh(=?;7HY+expvhmoI%1LW)w-}*U%+R=OQ*1PZHqmMp%jt@WlkZZDh zfcM{jpX*XR#DfP9kh$bE5PMAhjrv=;hFnW)*U!0T*NptPRzFm`o~z!YKJyyZH8=I3 zUL0lo^pIRX;W}UP-ufB*h-y!-CE5Zt|cSH(N;yo0nwtNOq`49Oo-}Tk{!F!N<5!<$_B+uzE2(l;7Jw2(-{BsS@jX5ua{YamCdU?*; zxqBN9AKi}~yS8G(=C!!`+NGD`XIJ(mjo9`GrduAvXyaqltK3SS`>8xPFEYn~at{^K z_H$aoxNf2&-wovZ>~~&A%H}c*nd6T^bNpWLEIyC^u640FtS0%RPnHQO~@aH+7j85T5a*LBj_BragZ{yFQnY6z@<{Hnu}?@t9Tx zqjQ^`yL3jkrae1te}rLMAHihvW3*oX7wWFs_sMqDEZNBhLn96H5`37LS8ATcKs@mcAJN=rsy zd_3%!qouP$Jao;oX+P9xziN9Dy9%IvX*D@~A8nA@O0CdxjD%O%uXq#}uDp($H*c!A zapMNpYPx~fUw@tNgull3!LO@Gm`7@oFOX~M^hewJN-Z#ayf21N@I!}kTQx@RTjd3d1sq>l5Q<@QgV3zp z90p@eU+^rk+t^;{kzx%pmSt|; zQ}X;i=Zv0CPE8D~sGKmUsAP=E$!?W^OJ}(XU-sc7WquOs{Tg( ztz1K{rD`?xL$qJDY0+txbuhPbFT?YoNTaR+I_jTnm_uaYZWE4qih4YLV)OhT{gk;5k=#&Qp1gN=c+GXCf{u4KW#P_waL2 z9P_Y;Fi$#jbecK@qu%f&8S^B+V#m8Re1~$YY6ksQ4Bb!M3tL9&73e3wf&<4+C$|L}bOnC~r9Wb1p$_2G?tzI~`^T zqcl8IGf+g`$hF4U;xUL!ia|tDJoO@7?(DfP0c1?d6CikU1xBoSs|3#iZ zVcYQJg2nUf4;cQ~-EF#rup%wRgkk$v>GXgASPZBvV82+uv~ z2ggq=LoEGZSVAnzBb9oQ#PxL&5X#Si(UEWu34xU-;}u75=AiaQtKp&09hSvddM@pZ z^;z^n+7?p3V^3CV2K`y;tGqvQmUR)d-g!Ed-rY?dk&vqpTRBl zTx8IusW(XCHAFk)nsROV4}tuj+kDk8x3Y^wOXf7y^BV}Ah`umP5uQ8vlT-faxjoDL zXPLM075kI!a&G^jj-5KLAZM2td~+vu?UHarbZ{L9ET;wA()^2Bg5el9L!wSz8K=@$u<8x&~>CI8V`$jq19q< zQnyvj;NvAQHj{dvc7;5Xv#eX_RQeh=9K8yzX^!pNx2xE;Z5y_3-HQDO4q@W1H_%}0 zo9em9c%5a$-^w-QT3YSUYLdqi=!_hVZti(#Kf)QkBLb++{n_^H1A{bE)F09Q7d-15 z=>MRvuP55^CGj3Xal*l~=T8|`ZJCF9seM^@y1qaH_XWw_)L28t{(4S!floy|d?qoE z_RJs*PIh80#bD;N^h29s=7}$|g)QeN1tu{EUZD$Wm$DvI+jF;kOJo*jAuu5nL5!Cp zsmbBwI5a*6K{1i=V-8%;;2?}5&qEzO(9hZhJx8*vhq+k(#_W0zjY{q^PWla=8H20(5yLpfV-Ywv z6g@oixlZO77@OO`G};%sA${4NFo8k(uktMGIn$SdiA(1%oi+Z|`A8gJ zeLh#9dY(YLaU8cQ_T)S$FPN6QA~-V&d)T%ttSmyuZ04*V?S_)^#n{LGZObI`Gj8y6 zo|}{o#)zr@9LuwWrH=y~++ASr<_tSmC)haI!^*)97IwB6W@C%~BW<{@pB1{8S)#*0 zD>SvCF4=|A-)B>=r?YNTLy|ACzS9oH7FFF4d%nr>1#+1G4h+Y<1M@lWB52J+_^kQ> zy{jIuPlb=n?~wC`=3J=*@>}h-Qg}^iuh1vxFt(^WFaUi<1)}HW(dXCf`9I`T@Dri+iJx%)^$VBIs`Kl9G4JbFcZORF!wa`1+&~ua!0*n&pIV0XjN%}p=>Wkmn5q(UP)Q88dK+u&OCV~barB2j=vW= zN4mlwWFVAS6KZ-77-aq~&nnj(kNu7ue@@)Ga9J~t@sIEdO-hGSrybCC zf)$j}y`Vpq`aIbdU8dNhUfDp6Em!LXxHc_Hcuq+l&UdlLs621j<@>;{zz4Q@952Wv zc+4h`^A<9^&_B|R)7PBQjk(Mk_?koCdoc7|&7o^&2W13p+dPYHnaONRY}V*U26+?y z#8z|P(%5YQHDa{zO~}63avtqn&JhULqCFC~+3{MureYorT`N1z4P|@FX)x-04u_$q z8U0^>=!Ba>k-1rafM?Dt_z&AE|E}iw=7r0D+@62V^Gp5tHTve%_O{js{)}go_JY{9 zPAO4FjH^aDx8r+5r<`C}=yG1AUi?7lhYf;0<5hiM?#uJK41t~trY^_yrpD05IN$U4?3w)>|KV8SPtBS&{TF%ugm{g*q0#5e z{w$~NFTit^uU1ccbps0u^v!QUq!3V?O@!$ z8>e8nq3>)j^qAp-9y4oTmJ52#aYLsn2l^y8n9lWp$qZNYo69_@3w+UYrZalYbw&Sq z-src`2PV_q(TwvzbW&(bk>oanJo^(qV%G!6HQ~s8yFt*i83tWTYv_)2Mm>uV_U}Za z*6?^D1v$H-{P5lM?dxL*Z2EAroBIpj1FI$nU!7<5*nP%__@W# zB~!3I#}T{O?wDTSf@!55m_Nk}>lgc@Xr?0?$o1JysmZhS(e>sWyWX77*n7MSOed0G z_ANUtiQ~NuLpx^^w0ARwk!v5cuSorKvO$MG_rMofu$AWvyspnL5v&$J&R#z%kO$Pd!Uzx7vYXxF0SbA>xKcoKIjm@ z-?|KkwO8x0#Z__0~@X8-EZqx-8XRxj;y>g#Sgy1SQF;@#;%c(gJAC%4ST#giLx?f}=&@ld0HCZtIS}(Sq`F?<{@F}X!uNtgXh9T z^;r70azs{TqWe@QC`EmszKWLK)@bHsf#$weXdPgShJM4*)OQ5> zdopf{V*ciMZ`4Wc_gpW2&z>cA=DIrHvrYJjc@!^{m6!C~xOuI?yaluMkDfSKcUKLb zk8hrXGpF`p@AgHw|4Ocg=VaP*`pfpLlV_s#cMPfUg&D^U8wEYNbHJ^o zTOcf417PmNzFcCki#LpX?Kq#vmi3^&MtfK%4BX97%X1KFc@Ki2-yj&U-n5Ld;G9#= z1%{k)0Mcd+rRgNtF}(oIG=^ zK~0_yF3!cNO$E5RD~PusF&8t>u14XZnP@U`m>S=i&hvm7+l&MAoiMO~81009c@FIJbB1}PFX~qg z0>n3ppQO)JicDzN^o=R~I8Vb0onxKR*2NMQ?g6l3AD>{PTL6ZU&!G<9Y*YGZ_PHHw z=ZQgfY-8HFqPf!ubPjYvZE~yc!Fu62kn@eK(J$NwW+A@llS++FvgZ2&-e^%U9G0^} zU^$cd$Y;Ea5gZrovwvd;->t7=A4ehQi#Dst z^O-7l9H%e3wjl`b9gV`8wQguE?^9^)xdzW8s)7(aJr%xllF_1k1mmWj=rq|5uiv|k z`w!kz$310?`J<0N;(EIGap=kkj)f2BN>#nkf37#zWgdVY{Y=nr$N=;<>x=f?jM0A> zwZ_W~O{bb`Y+3ACATi2Va-G+QQwQA2?A9wSYc;;Gh-*aB>W8;p-7pWN|SFBuGd+GAU)Qvd?m#&;s zYV!Q$)@XdbFB)GQ3c{DiJ+Nl^Ff>l=s^MAUJ1x(-y=4y z`+TK;UHaQ)D}BHl4s1iKaT=cc&STqsv;+F&*{Lwiw?}WbA!R#kiZ2>WrVeR2maW8r z!Zq#MI*mEOb93Pl9tpSbSh$46a?C3Vw*KL;VqW)=o`KA7K-+fpBk#0lN5(Yvo*2y7 z!X+#YesQU2?`s3SpaIYg9e{S}_OQ>3gllFv+$!U-WEt1yy>K25V*(MmJP8?Vl79iO z`C-4{ne%dGy!#9P0KfSsPaRjzT{w#a?1R{`b1SaB{wiwn{N!L7p1qQZe_e{lzpe#i zBiC7Nob>BF51H%>|8a5fni|LP6zT!(*?5vI4!m*{M^7HZ$+M?$>XkD%afag@{JeVK zMzkoSowA=)x3muo$Mu6@c{Rp!OVpn<2m==Rq7}7z=+ZzKjA#FraI8g1FW6=Kpn&c3 zK#mOrCM0pK>?C+Z#Btm!3U&eEu<>PGr*4n*2q52nFn94`P6=W8r86eQ(jqf3l6lvK7o(oJAgX2bbVL2%-GV-6MJSg~@s%Clo((4XR&{TWZl z^Ml01_`+AtpTWL^yI-0o^O8O9PsG#HiFkG)49~83V8e!?FYCs0o_k~1WPkW_{M&PK zESi(&;F)~h@kwx=!S=Akc{S(MN&E2UZA9VwXIx8L#%n`5T-PO&=gFuyf&Ng-adlZZ z=lf$~#RNpBCa7aFu^eNJPe$oPOox zFXoHB#Pi-bJUtmp?FhoN%P!ckeh_)?qG^N6`&3$&oH2I7!uz=Uk5=$Ak|1Iy7Kk26a|NF}DKtc_`dAtuV*%#UT*=?lId1`eml7ovZd< zT_!FCfvB8Pq4FHfF`4IMGvqlmo?|mH?9Yx2gHKopyh4KDMt)uVeBd7BhwQO=D61$# zuQY45|3KOS#+>WwUe58HyihnyjpUm0vvBgvNq9_QTZ;OePJRA4eodblb4ZTSd(kmb z`E39FVjkm5JnxCd(-V=@4qrUGWRDH&`u{4=dO0Q-Ss8=?zJnYvH3=tf#U@=$7W=#CNMgJ;|8Jd2@Qf*Z~*gm_`t>23+{ow z$S)a_fu;oLUkJo<)WFUY)l>)D|g&bcZ-hdJLD>E>+q zQoNz%IVw6bpYNk^e%;RB){R{ecycV1+Tn?(7nlcPjVT%@)UfAjo0fNdq69Z2@S%lq#7>}UQp{8~Fj%X4H@ zME!t0G^(5!PE0xBY#aVG)m~qcBjP9)%U^s(amN%rQ8c1X{?u}5ol60 z6n=ac%a5^D5=*D40r&sS|)=8<{l za(?6Zco{^IXlf@H~v;Q2sMh;65t>%}a(OWJwl$s}kY9AQA0~Ecou&NOUb4 z#j)`IXkTK9g{zlaC1B_TqU1%iIte6^e*xzV8(gf`DLu6(JG9>aozsQ0Bb~fIp81g$BYufpbH~ zyJG0O6Z*(l-7)6mCj5#h;JDc(3?{NKFJnQHx_rk(M^7;NNcJF(6UT#gE zA8!x9lY<_3ddvn-&kVr2m7QPkEdN{0vtE`7ET*tMSk7^*suZ*=8G)#|If$%a|J&S5 z*d}|TeA;+K6(qu_U<3?Do1!D*r!J+VRCF$}QRgLe<>#(rZP0tH9oq%=T)!m%;Zrz& zW?n8jRsIUk)jqXWaX++S*~S+nA+<0aiJYe%o1LIS_T^YoK?>q?G{@p|`JUM57&PZx z`MRSy)}yuKYM$%n^~b2PAh>4)ao$8UnvG_A;4kpZnB!h(Sa80?&cDm^Ha|Sx?}8^s zE%4-YAFN$zOrASwbfX5(x|zMyxiS$mX?tvUHyt|+!3#LYXnsEYW~abAEf_1;E=Oi* zE{r)wtK_r(*U)QiEYd9748x)vFu>me1Jg&re>vxYEy&@TTiIwoiMmnE>o2y98AX$7 zu^nDJw;JsKsI7vZv#Y`P`)jiws5W)BRu;z(B$oTRUQm;DX*Wit*62RL2_0wyqRD@i z=aA5#{QUYkS?k~6xfg~^xJhOizczPPV zXC|s~rwiLu-cvY-W(xg`=$^KI%9ud)xIk@=k9c#f4|$iMu%ZZ^vMium!1ACS_APQo zXi5afF$&R}bI0Tz3*ogP=YF`9gu$ZBPd%?yp*j4EV$iqJL;c)uya#;p*#|dnq-N|v z%C!1FJ597lKw&Jpj$w=__e2;_XWS-5!K;|_QZuS~{v9pW+HlS7@7c3|fbZxXySDs3 z&l{cbXs0&8VxFmgsPT9@$LYM&>uQtyeb7{a-jD$jqC zW8wSPc&27NChptWkD9o4{VHWUx#oBZR<2==sOuMB>PLFC(Fu=s48`MpJ@NQRORQep z&_EG2D=xBYXR&Rf6E8J>PZO1SDul8Q#zO;HQ_o~&4zlmq|?W^P4 ze9wD(T6*$;iIdCgkDpjphwo3+K7a9yPR+RPy(JE~yV3#=Hx9+eyZd3~!fxcbGxXC< zlqQjVTQ&9U)tfMF>eZ`nQ!kT#FTtCi1wKCq&-F3s+svm|Z`1U?hGyx5_!{~!49XY; z**8l!!$7thhNKULO|~U$a@g+WdP`>VJ&(&)zE}5aoNtyk`1$Y6(q3H4ES2Z;nr3N4 zs%!^hAYqombL4X>_mjCz5y(D|t6Sbjl9|#e!lXs-)ZVq^oPj(pFiYY!wdZqxP^y{I zZfKhTwgFEP4~ZwVcX&>}6+f>vZhY;g`m(_Dv1I_E~{Avn~vG zPo^;uDr5N4F{PcFP9HlM(@O>sW|+=c zWO_088B6?PUp1`CQ2J<#%NSV`25TvM<+petz{ia^4v3%e4h^zMLcb>UC=F z^BC`Aa^7Iwk)s-zXO*{ZuDNFQZ{>XXoqElosG2YUc8<+o>fc~4+Hd)sUlMO}?eeWt zrdRaexMgj#m8+LFIsM9s+BNO@*t$xb+{@hW+sg3Hsq_~-Czv*_)vjSWud$5SO6(&J z{z1sOTbLVn(X9CcTCSR5jn#9Axz<=!WrJ07tgw2XRrNlP%l-@-^_*2aZ&g)|^Eqa_ zn&+?KIV(A4E8ok$dd_TKM?IhC%+>76IqJTgKh;+AzjA){b>usBU$*@1;tDH02lp0M z)0UgGlzY?uR(p>8_sVIuSi9H~-o8e{^C?2LXKueIL_6N^)Vb64q|}5?d{@LEJ1l|3J(z5M}S$0@8kNHaH+hO?(&HkE&_S_$(9$&M_4l8E9I7jy7T=o1a=7!|{ znuT^)#(lYtoUgskD!JxNp0mInvcGIP_j#^hDfi`=>@Sz!%Kie)zHH@M3n$y?x%(PB zEZID=ja*ZXYtL8r`B|>Heg)&0pw0}eaE5rF5PoGHs(*3&Dc9jY%-F8S?Kf`Jx_tG5 zA?MfC-Mwte^Z6V57LUf!P2+H3S3d5FJ#P&{6V5BBpV+r$?RJf(^BS)b?-5@R-w==f z2Yk)%KPT=p&+~hVK7F8c>~ z{19_<$~oLWBIj@Sd9h#p+e6y(5Bfvh=Q)QC$!`O&Th8Zk*_Z!1#OtW%$iAFUY+CDK z;2YH4cgsOfBe{n|2Lm+cZ}-LF>T~3Oj~)wDB4hh7pvO7lL*f~suB%3_zvLXd+pccT zGlPSJvV45KW6qvG*<{`Fs@l^MZQIRCA7PXgHN+@0akx=Qo|Vz`Nlr%TMb;gSf=x{t zkLv2LTi0MauO)UYyonb5@CU#()FEa385G=c@$6m|oiHFKD!zX}Wc&b+h}eE^5pn%p zBMI)is{8RZ_G=#hi~Dlzm#+WI>&QKL@Eo6j&_3Z!n$(_V=iE6fGHyU1;X|nR$?w(k zc&<-)Ouy*vy_zoNb6qDsA>u$`33lRa~;8AejZOu zA}WZ0CJglE1>fFG&NV*heKqB%E+i^N&t^#2l^;eDJZ z#FnmAL-ysEe5bunxo0^hcKi#$7%hX=)_Y(tI0L5`G;(p zzg7R6+kX>M$K?J5a^3$ekoysCYU0=KQH}{0@+`k)b3ZY6$M=#ih39;eotrtI+b`%N zA5p*M_wrjQAAwv$@MATEtG~jrwk)*2m#y}i|J$}T@A3EUQ+uBF*?zI*TKqq@?_eZ0 z^`vs@#6{eGL+yT6{XT{K{ujUb=h&a;gliT2*qM36gy(59CJWDx7>_(-p1hyy%s+hp z7dFRyG(UFf+T|slxz71BzPIuZ&;JFlKdPM#Yz z{L#2$2bJf-qJrl<)6W0l`ETS|{2=oYsyrtp$E!SxA7l*j56^!i&$1pg*U(jY4hao> zZqIzD;vb&>MxGfz|Jb@sYgwD>Sx89WVu?GLKkVDOb?f|A%>7T?@fY})_kvn;O=!-G z{uk%^KV%!_DQ)>Xa{Uj_e}T`R#~IqswU|qVxnRF<(4fBLQ~8!_aDT_Ozho_LX`B7i zPWhX-X8Za-wba}|2H#76seraEYl8j5@qfXwHb?!>nzDbpeLZrm3*Bx8sNJaz&`8D}YVh2I{o!2)0^J4x-K`0KevSuc7IVu!*siOI z15mo1gMQCzsNLrl8uz^m!v^mYpP*L5FNw#*cf=3GkHk-?O}z9!HUIPfZ~IMmkmuUu zS%K0C&}pTB8TH6D`>h*tytfhiTHCHCk4*@E*Nx~-^dLn&xa~>w;(jj$I=%Iw+q(($ zP1~crtqHoj3`0*hd-QVmM{kc9B8M13(~8yS#m^3{QlW5lgdD=x%gN(=)!IRTxA(suPVJU{2U znrGpOpnzQTc9@7>c1vMmw++4R&k{F?d+1~TKKeL(2BY3zL*MWT@r?ME_&4z* z^Nk392MglB;<(UG8itLV&a7oscC4f+lE{&Z(M)NN-4{T7_F z*l;jiC?&`ZNem_&Fd{4vBg42bdw3Bs9m7Kw!#rpM2KgLC zz2*|%(ypq(_zW#Oe@8r1x6O=yfbRcOF+go)AJ~v<>e!oVU{MY-nzaqypmUcQS&-KI}$*Cbxo1E9B<{F3|8^6T0kwcskG<7-W z?ygXRiIC|l5n8oU37xS@37fGB;oL^fT&<)m+=RRp+Z93niXBSMvTaJz{Edj3wMGe; zvP|)qun^XxXDH@bla;>lrRWhcM(GfkqqOy5J^=R=rI}NLT1NG3qLo^f;fnrtjM=O_!d}2D(FNF)2lxg4O%`WzD2`U-=nF~Gk))3747|nO`G^+C|;8m zgHXIH7AroJmv9Z!rHWtWGR1$&GQMNBTnU`ET#1^!1{q7XC|OIlD%s>XXZbcIcg1#c zzk}TGQ1Vyq#OPH!l`*S#2~fCZmwG&N=~kpJ+N8wITdzo&1o2wFlNKo+yob-~?g}Mub-I z`8#^22I+vJ$yTFtYe_%j1ba(taT9BVhc%XniywVVIl zvD&7)D1AZ;6bI^ted%1qddy74u4E2e$`>fE6Ba6Nv{Cnoy)Gg8T_8KwhORm>XJC7CFl`Ws$#fhf=_D5NOL|G|Oc4s$D2psX3mv zatCuwY*(^bhAc~Dv0QsZj(yptwVZ40)_~mBBCmD0)qBpfWdzG6gwNQNjz#~iznN!h zR@eEdZN`Q!#Bt=9pVd~d&HI~7KJmJs&BGVpLMy7M=ETJW-GSE zbCglVb6`DomePmk49=JYhqAef7i~V0b{RTjr4li7HP=g8r^L-&uf)&WfP{G)l*IWP zmBa-bk-YGEdC;CUWs$ykiz3Ka!m?mFXzImwm0L}n*nt}5!8|Ivl#aCT=bEi@OgojW z=r`~8xt41+MvjZ752kNGgHhx_=5xI8ng8{Eom1qwt;(}5{heWF>U6DG+Vry*|6}+X z^|=wjdmz_JSEYB#cx5o_?tqL6r5^p0es>oP&7YANlXxgf1iCqlWdyG~< zy(ixq|Ebk=;kmD?0^P>G%(?XCi|7Au`IgwZ%}(;%SYyxRS+@;i&Lsn}*|YK^`CUey>k_|-ucqLptZbc}4co>?kPQYWBYAiGKUxsiPwI>(hTOmsy{ z_f*jm=ris$_RoQB@oZS}bN}S=P#7zB4b6vr$!s*`Z|Yk|p;K@k+A!v5?3{@D#`8z)B-^p_&Ic6J$`m93uZbPoyk^6Sd z_{Su_eXHuWBF`~al-9$Qc2Q%M_A$lG-&d@(roHKPbwXX*aEI7p#n8+TI$fOI8HGb5~MU^JU)O?)aWCd-lQP(n3EsJJi>+P&nK6;QReQHRj zurV0Pm|0*+U)sVYS*c4O)sMEV&o&6{S?S2K=n`3|m?V@bgR?8;Jf(?aqGCu5Wj#<_ zSPl~3Sn+sW>qxY4O;Q}FBaCq{ICHY1E1DtgnxW*mw=H>Yz{Zg}Cr!0co%+pwRQkH* z|AOa+T^mq0*ZzGROIazb8*Kus`J{_wzmS26W~<+gAxBr9V$8oZBBV_&=)mqcCp4fo zGz`i^BLVBU;iyboR@izcF>Ych=ZnLML_DoyzwL zHK=D5iH0`O=t+%{cDEke)&|2uK-)zv+G=b1O*7iBXif`ii5>ODscbHDH_YMw9JJ!G zx{QB^^Lmav-iz1K8O)}awB4nB-gBg4*tl&LALb`MfXZ{-4!yr)nGzP;~lwD26_n zN-f%IE!Oecep!kE^%t!y6f_#5=utQ82j(g)3#GPA6uYd4D|K1d8+fKGdbF_)k%j2X zI7QGUwwV1J-b!9#WNF%4Y5Qp;P5 z9%hg0T88rlblSbfU#dP)sok=*u3mk{SAUmg$aNa9&$Bf<*V?eCsS5_|>r@O|(x_ud zHe+aIIKkMuC1VY(ez47G=A-D47acwyq3C+0E4uW7?5j{fUDjip%+NPe5$KBUH6NiE zGTzX)i%}GwQ;T*}kL~IDgaPfbDDH*X(A#Kt2#HwW{$ zKFzE-3s6ux4y#tL!KF*DV(W=>%tbO=sUz28%+{Yg56hp97Q7#||3vyw2*ub+r%rcU zuLk|>me~4)Z-|adSRS96o)wgm*TyR@i@66<(aj?cwMPUgdi7g$YS7f^{@=^9jH9%n z2$N@>4s2p~;pGi%pwwmGl9WR|`irIyXzx6Mwk`Uh+nIf5tdEQXRJbHD-yK0+&_Z!f zfeLc3I3}<@hC_$@x(@L$q(;=U2;&;8A?WQG0lVO2#N`!X?6~nL8&{5^;u2(LaUBY- zJH_?lP*zsPwSOjX-IR$KKYl#Q%ga$Xwg@X%t-|X!ZX$2y3e;j>UQ7RM){#l*&$y(c zUlzK!CSfr3%rkQ$@~1Dul1=-#=H6wTzxXQigPg$n4I43Y)@&4)l&EX8j2<%vIl1}p z_4RK%Vx;Yk4#vih{ywgozCn9t`-3#t6BN)!2`K|bg{BM?g>gY6-*m+)WvmjKUyAs=LZoHoAT2!; z>6zKc%H|sW1!K7W3_0g|G(|;YQCeE8qPUpH#*Wp1$BT-KStezezimJ@Bm-p@qhwn4*;|F;7{)fy1slf*ye8jwv zf)DZGhnnq!2M?KN?``HLyN=~6R-k}u4;8XJv$C`Kzo|NL@o~LELV|bjUE>;dr{(3( zY@4zz*qYqZo)zk@ZgcJ%PI@7<5%r_SLRaq8?vT)fOY?swkCgZDpR?o!EP`UO7z7A#%19J6Q7!L(`9Q8i-*rc9km&5B1zSSUh? z$jHdvCMLaV^!5B1ezoT|na?0W!?Vga;|w(6;77Ar1o>@#hTo56IT&hqX57)xRO83l z-cZLl%&Pn08AIs|^i}E)4Nxotm`^NgG>Xf{vmO>AquM^jR&#P$KWR6zR+VV4Xl}*i zNtj$Y8B?cE!_3)pv1sXXtXRDc>o#o0&fWWPBITi=aX$t9WXyxUyq}L|{DYqxn{#bd-*_cGZ!FjPo5VU^PJ7KK#9j+9dJOfI zKCW!sI82x{iLt{RuJ^eTTet7P8RoUS^Trz*n-4sHYNA2CJ(RV=9OH>l9yNPRq{TbI(?ck$!gWlO|P1PnKNgR&$*aCe?I1t+p4N6 zOyIhDq7mZ%3RRyV_cmVDG_J!Ba!Xs*tPjWi{J+j~t?y~CbYx=B!n2l7YRL2bpYu%J zXfja7mo(tGo*p^w;~b%cC+Bc&(5Va2c1byw14c4(^f5&p!VWpMLf^?Uec|cB*RW$EpqpuVS;3>sau`7hkID zP+z}(jqeyAqP=cn46+)F7B9hqg$vbn3KuMxk9jJu(=mxsa?BvHGI||wPQK2&NqyUJ)ZMy*hkY& zF<_g}kiJfzW7s;KYH}|2&G!FLwqrdNee!E;9gMJ~Y-Qr4O4h*zy!R^lsX1IPbvf2= z+{E=x58>STOSt~}O|{OyPCLDE>kZoL8@PG*4z!sXF@Jdk=7n8Y(e? z*r;&&(MMd*n>lxH-MXdbdfdBr59`7TRaZq@7tl@@GWM81ZysjMs6s`>B$SqwFjgt! zb{w^70%pygjdklbVE3*)*tTsa)~?-z6)V=W-^AH0$;xXbnn#@ zo?c#Xb>*6b4tDO$E&W${{**kAB+tU7aLa9d9maHe&}l%Q*qFYN!&P9jMb!`5whrUx z*33OJz#9&s$tYvluiv=FcOibIJ28 zOrJg#6S>x=*y;>W_^^7orWncA=%2Bt$Wn`tgpW&`EOstRpQE(Yk2!@ z+UT9zxOw9`aSeBFzm5m@-&J$QfAh^_eEx;TM+v7Id`>O+ls@ZymccuC_42D~&c^i{ z*3&*0($3~-?3CL%b7oOjr?Os8ARlF_&nhk{R&{paqD5+1NDfF%-p51KlEc`yZ$Ek7 zgDqQjVEy{d)RlEux^$(g6=J_rrp~~)@`=>73bubHF@DUWKPh0$nTjF9hGBr&K%>D! zhAiZ~X11IEGS3{ZYQfGT;hAkcea6qsghYP7>fE`@_iPuv=i?K+J}4;3sH|+7vU&3^ z<<(cODdNYa9)IxuL)?AmO}ugYCT`z)jiAn6zk=7Uzlv*DFXH;OOSt;#dE9vY8hLzx zufF;kj~+c%<1NVteVLpdVLjNnYZof0==X8U~>+k_I+3EwHHSx8JwV_e7SAC{Kr)6aBR+ji~l|8a*_Ozfb#IL|;jtG?wk_%v?3@n>A||d7jDj zNhi~uvJo2>r?wSJ%Su(9*hsCHyqS`lRPw=|Jb6;h2P?L_Z{I%bVp(n3x{aE!8LQW< zV>!?tE?Q1Mw}^T@SGC)T)CI{4Id|@Ct{=ZrUDJ2{y7koK3Z$iFsO_Ve*hFeZJi;Sl zU}x`$p1pf@Zqc&kxxdP@uCCsH>eOkuSy#7pQws|ZrK)NXL>B&n{Q~7U#a>jbzRz05}!(2;62%=pAt>};&V;B_3_6atL5?F0o%I#?jCXK z)JdeVotMaU^yAnb3=NM&bWA+kCbU<^B@-r2qTW{VSTudqO116_w+9X!WFE}}s;%zc z&HMv9c4EusZPbE|SiNdZwH7Q^VIdzY-7`6^F2}CgI{A-MiK2dl5VSD$liR*Zr|emmwfT&lSq&llX7`f`zQ_yVN?L zk&(%Dq$g5Ww-H+zvu)w}>znAm)|0EXC$ELeXj<8AFyxc9?R*jdXDf)ywv%@J`2}A z4hTj7pHF=JvSll-*G$%%bX9A$dJqvQw?{_KNgzANF?)0=Bddw8q- zy1IG5#nlZxO?v5?_U*fh@1Xo8o@pnWsS(X2M%cx6?dmmasBN3ndU^ENan(ObT@~)% zx%;l#-*ub)2(P_ZbgpHlA^s$9mCV{acna#=~=$heK1O8ZA+tK(?@ zC9D@kHF%}Hreq@N7rasr!edl!MH2!7!&Gj4d;{R+?GFzxU%0E>dXiV>N^^FDqq8d< z9GwX#iS6{;85ymW_fh_gcCg>+Kgr1{cW&Ig)$=%QOrCAs`VI8i%;$dg6}AB`;tK8g z&9~lCZSVA%SGY#H@O_mW-)4K`Hm+U2!8rL9m1k|6SGHo)ufKi+r_Y>aPKS%QapM+l z-eP|Qbzk_s!+wcdY@?iK8&LW<>>M27>h7W1mDFX?Q>pi5<0h){tIa4owM{8}imm46 zjiCnQs~RBvddVpn?2}4opISx6A|hXKD&-eQUPTYYZbc8oX5Bq~XtTnr2b^iM zj?7;wyo%o&McCTeSHljbeNA<{b?>&~&+5j&fo4w_@21h-^eU%JQQQ3Y?!8AJc$=Kh z!>&DB*_K;?jhoitz`_0G^mSZ(^(uDnVITSFbNqahHv5Lk;k9em)EMOPr$~bD2J#+QYW<2=Z()X;jQQEo>c&rh#-14~UZG|hFIu#e`jw)_ zs&7(@rQUOWQrhkg%$PL;3l}fMidD<7|KL8gJtAWeJ9qDe_{>}E?-i}Rb?YX5+kHHJ z`UKCOK2^7j0adQ=2*2c2ApDAE&=;sYOF6CIunEpCE)bh_b@M`cI{TXmu~Vu0qT783 z^hY@DQ+$@hTB5CC^jo5@DzCwe3u@S^Xpq>el$$&A4{9{lgIeHDEpXG=tb-Fq*>NrZ zQTF`rQRLG`<<*k?a~4+2U1n*a#?2Bt%V+9_(xX?81%H-j+Hv9b?YkJaX7T=|o<%bD zpG+ULoH6Jg?AyPeap)Fo-ntpvcS!#6-SmwYXrFJhU;PB8SIxw$)O0BqX~W&T@j7k# zE0yCXPafkN?!Uo)H;oo+xE7v8JFZ@P4VPIrg!}X7FT%^moAuL=6*ib@=HY zJv_x1u}(8bqv&XG2@XMT)o-{nMo6)muLaG@4d^UD9R zu_dpxSxa(jX+>ViyFhLe-ikMv=^ zrJpA*o_Sxw!&ny+kS^@VS@hk-+l3URMOB*Yd+mYmU zgm6nP%|{4^W7u#l%xUAc;P?sq=X_Mod-gV|Rlh;~jekZn#*Qt%vv1!4Lm9)2h>T*J zCqm7`k(`{&e%44e|AwoZ8=uWXg`dAa4DBqh;r<+AQdot3glVXm^nDxVJ+8^8MM z71g$7{6gA^5-VT6e1&!`c6)(sjU(7YeP6tIDf`IQsk$O#Nz(W0$?d6hmi>MJpdxlE;AXgRf_u3B0XVzY$CW-Vy1YM+qG>;GZz zUEuSo%6$Kwwn<9^COT~u5Ga?vMOq{Q67Y@+El7c;O3O{e0cmyG<0Q<5{D0r)S!?h8zIoH8 z+*;><-u+qc-h1uaTF>vft!J&hHuQz|7rpf@l7q{I@zwHI-k03g(yZ8q=F4AxRdV5L zUz;p^)tNP-^Iskgo&WStH*C9a+ZSduH@76$UVE)<%IakG8u7JgcgfNv$+_p9mozjs zsN9#xZd_?{&H5czzr)VIM%P?_gT8-q?e%I0{IS`$AIRq6>!Al|Oa4&0p0)`7$sWa) zh;QOE;v)_Wpfi4u(1ye>|HLOg5%^aahqgiVweVw?BKwzKYPQRLE$7#ZFOg4hF*^1V z(*qZYrf&#(mH3*)*gVc=JQ?{Fx}k?xNMBuh-L-1}y)$|L`~OR_PIihqUa7iXEW9|s z;erb+ow0Di%Qe@=UmXse@4Bn)L!F)XPFpSdUU%JfrZeDUWM$FWi<5Ke>#SUFyZmjM zFIL~hTeV8h*Ee?*e`USu+H1sn*BG6fB7C;I+wxiqR8qdyQxd4$$yD@3}=bc8z^c$9PtG zO)FNIZ_#++g~aBPdhuHQ`R6C+HfT<0@!V+(PCvb-rsmsIrSl0Vobc~kx88e``Z6o% zAK-gP=mO|>mS}vYV%l$%-g=G7cK-S2CKri6R_I$sYu2twu6yTos{68JrS!(f{?2#5C*Avf(+!V4rartUcN=fh4kXc*`JsIAJ%a<{_fgZ|=yBTf-~7ho(!DE{ zR++AiKG&s}xlVYqbSpftM1J;F%a_|W@=U)Ic7(VGec;%1+U9SPzPR8uPG5Y&h6`RJ z8oxDJBfeTAxxM1bEA^Z!OdmKs&rRyiJy(8BohR{Gof7<3e;&u`lT*()?LvKj_aCN8 z=Zi1C_}7m={>`_4QvF8AKmDNe*HaI*;q9Jp7VhT>&$Abwm7KL`VRG%w*CZeP%-zZF ze|UYe?zVNNv*7WS;%WH(#&_MMnAzjb)8gaa-mj)Sy+^*q_rE`+_To>?$Bwjxz9jbP zZ(82;cJntb6aOw*x=cLmyob_^un(C;b`uXP2qZ?h3`%J|cO4zuNCz#;ey| zf4$;KUrgSh^BWp36n!sD&TqURIq&?&q~Su%_b(mNVElT1QYZT1FP>9Zm%LhifNE3Y zBd5vsl@E;<%XdC)!5LTcUD&D8`I1YP{OVhO{q5!Sn_VOMZ@KOFlHdOAn}z>{$?1g! z(n+s1-P9;qIp>^3$(f?_?|k5W$%apUIQg^t+LI4|{7>aW>6=s1V^@pT*Isu+a+&;J z+LAw#kM|St?GxYphWv=XvzQd|Ir>DOl8*;XiK&u^_mOBn?o}VuRadE9COu)c44?L` zmx#9Vy)JsQ=>dF$n{T-}QJhwBM$DZ!9W*4~jIZIbq`xW9T@ADPdvftA<6!ZtSqwuPQCVxxhA6?Mcm@Ha!rug9OKV9#|MLdU-t&tiPyc}>^=7BI{CAV z6{1}XpJP)v7yZ3Ne$qwqAtG&|FZ^hH8fd#n^i#Z^*qbGzY1n?1?2_8m>9IwkIkX0g z)6Y0#k=iH!dN_3ET=fgz-rfDB3g~qYTC$~1=mi)noKc4*FA8b$zW`%sgHRcOq!`>+!jgFvwLj3e=ip}9WlfJDO>*JDl z+K$kB`}Q8i?mw%(jL++v*7qkn<%7RXz6|Z(*QyTw}OC{>i^g{_^2L@$*W<2VaA>GXB7~mQ_|a*red$HD>%v;LNHX!h-&rfal)i!AS1fje{KVVj7u;fY z5X{be)xssGpK<#C)Esrp%YRt0=Rf?z|Mv6mfB$ce`~44oQ1bpR<7wJkhPldk+1oBp zE)s8@c_wtGTy@DsOIOJLy*Fw5SdYFv`#s@*waTOKxZilAwV8>%(3g*HASOzmC~a-h z6N+ck_xu&buW1wh`IojEZ5ikG7k}}P#%0}aynEqmUnd_y-;I&KfG>8g+6nL)x&Yg? z_#7p4EqW8$1{-E_4_%Fhl=sYJfoO`ou_XS1hZdY!FyECm=e+CP^pk09rN(+O?(Z7$ zGq#2pQn>fb(@#I`BPX1A!vCH#ch0{thgwBNe*Emg{SU?V{^N=MzkdB)ci*jc-Kyl> zH{T*Z`0Zvxq>Bvas}x75uRAX}bD?a-uj``Z*TVQ9Qj_+C&Rymhs{5Lre|ZvLPDona{3w_MOS<#PfpV_psoB>wVRF3 zU{!zqxk~4mzC#`_QGDU8(woRh(~9L5TcS-U-|oy~k305<)z#JiOX*(^Hztbi_{vuv z`Qv*(`+4KXmC~>8x^|_}H}VK^tT)SkUvkM?HQq__;kPK>b4myuA3;@>%h7mCPp-|KcOSf5;m;pb&H{yb9kMp9X$CBhVDOTGIYmy8d-) z7c5(*IKtbP%U8eBd}_rlMO(#2RL>={{TIj{;IA|^HXb9Le(~J7b3ZLwF+ce)MdM#- zjn8pdaennvJ^t{+kIY&9UVU#-yuA9lRmqiCT#=kFyH2~1I$S8f6}?TIW97=LMbm3! zf8J>}1KQ%lUUThrrf1HVAK1P9FVqM4sK&cIEPuLPKE`9B@uSkqkJ=c4dq3;_{?Pf8 zTRyF^TA$F^ls{9S)CXwSimr8{>0+(rkKvOA9RY2PM@4J383JvczIl2=;{~Fx;_-Iv zlBE|XO-)xS2KNrFuTolW>!spb`1*p^Twv`o>P-9kweoL>_pAMRqQ($>T6Fyz(e=mB zTIpYuey#LxN>kR;b#--5>)niH8}DjM-l2HKTJiHrwLdNvzSI*Qfw$pna3@|zOaL26 z8-0cJ*iG-gS@E@%7B9o6{o(`N8gtbvefvd?>$zLJ{PpC~zDMNa?NnRsF6*n_wE5#c zo}!iUYk#DEtIejjPC0G9=>_})^aS=!I(7EV@4405cliBHZ-2YB1I}wW zPxV!sNVvaFZJ4E(T`HYSd+lPQ_0>9ex!Q!pjq$^1uiPj4-v5O!iAO)FF_#}r9((k! zlCM4TaMH8=OX{n>Q~d)URo}nHJZlWhZM64g7qIcmPPr$blKRKAw2*;ac^+oy{sUZ30~d0Q#|)%O7vqkE0owW6i$8n_{&=r`z#e@?g(`o^MkATdexQ_T~d|5)^VSV?2zl7CQQ96vn$f0PcXJFtOs=FHLePAdLG z{`k+Nr_cMSWc*tB()96Pcfm?UkoSb$8@pAf0p*8I?Frn{_J~-k6$o^+P zd%x`3HjUN%kZAt77)7h#~E9GpXh&=*`-&Wa*}k% z>83AC2a6`q z1AK`l@kO0%+_l%g(`buKvb{=eHfT(&^`eU|nseN7$2E(dUr_2-`k~U#lnyANJIc|S zyfkV4%YQ%ZwA22ruyEnOOE3MqXnc?K^fboV_sGZEzWvL3U!h$wgcj>tc)Q|p(3Cbh zv1(#w&>8>a%H>VgFGPESF)NH?Ywy^iu_^CQ9(>@7$pc^Pl7I09>vz2KuDhk9)vtTc zr`3o4=kh-uFdhAVyVL5qwca~QZo26vqd7Dt_Kdxvt+Unqvn@6zh%p(T z{p@Fw&ua|Z$3ON_jl*aa4{L0u+9sQXN2_!*;A(0(@srJ zo_~t9Iq2iS|9XvRXxE6Y_$09%Vs`tow;A7}Yj3>q-O^__Sd8FpmtSeNgnr1^sa;JU z8RI!v(;vy0qc>gjrphzUIOBNHc!}urex-YqzNV!2`I4V1MIBvA=SW+lug)WW%6pdw zbgu)NBl^IcIdcyvR<>(<&qJr~{Hs2Vkx?J%!1v5Idqn$>ef^uF_t(|`y;FX~L&lHv z6GCTn9Pbq1qw%i6rp@j0^?pxdlJAgT_bH`MCmW@gTR*HZ#jP8J!5x-9pm*9BTYS?^ zH=CWqPaviP&*FDD?@Bj_XW{Yrr=Mmv`TWKP^Y73Z_|CLn=vShzl{omdYG>T=&UZ=w z-6S5pMzo`^9Q!RhqJCTY%;}GLvtq9A6b3ina;x>%yh`nHjRn=K$Q62*ELos*xl)S~ zeqEnZo}bI2nHKGrU@iFu{avTh>JB)w2^wPH_r=5OAQeAzl=sQhhsL+`2^v;9PZ!$VZ8lzjFFFwluQ2LS5-zohqYqj0~cJ;0Aeg9X!^0i}oAO5Pf z?H>8sW68I^{oUl-qAxV>|JH8B)^^z#G5Wh0zsxun#uuWO|LBkJFh7kkWQ^VB{VLwW ze9x_GY#ai8fXKlmY7?MuPCWUQ#;>PHH=HEhfZiY`K|2Nii?$!UjBa?nWSxF*`dt`v zK>q^z^$OWy#=pExynB_75#NG$8P`F-IedHLyWVa3mpI%h^XDg$V^ul+MBa)S+L;EO zPgS}^>3vFfEA=RSN9pgCpdEIwoWDUHdYj|;CD0i9qHhM3b}P}h_$}5ic}dN#TW(o> z^H+EF&G`D`ib*`YGwD+M8JpGf<%eY3zN9gndjG7uTk)UAtPKrKKc=?E9d~?0diV~F z-blmn7rbI<7MYgOiq-od-;jSoBu_BslJ<- z{MY|_o9OgTiv?n*-XXf;uiJPd(US2?=!7e;@;)#6$lsyybLb7mQp3ZqQ{4aLQ%*_b zrzPSgRg)hiC5ewKls9dr*3&q6fzmsb{#fZ=rLQRsEB!mG{2+l6Rc^XP?+AT7JXE1uzca+uvqvi|nMv2t4}e z*A+Y7rt$S#)Q9vjy~m*O#p(xDe9G)4_MLtJ#uU+yc(L^7>lL%7&4o_D))60~&3ybT zPe|sS@QUOF(H#F7eSgb)Zjt@{yxQpZTAx3C+w^-grhqi?HsfaZ)1LwCUA zS7{sqvhea(yaIizDnZPovN%mso_M&TN@Sa=oP z@NY{0QIaA*qnDvG*L+{8U+Jq#UsC#<(kGNQ>p2_sj@3J+&pN5cGCU$qJV%KIL#YgBt`bnTS ziE%fK133BA`9^bMHN-7mAzH)R*frv-H@*8N^MGD4}~_uDs)=CuSObE2KZBi^f&IrR*6s`ulyI z^J%4CCFJ~vNiTl|@g@%)oN`LN!_U7ehJ?rW3dkDssh*+Sz* z`oHMUv%Y5W6}HaDnlzd}OM3^MOT3;j6~w!-bH__}z~}74zxeCK?`bQOXxA^7?nNh~ zJBan4t(a5oOJAB)Rn1JMnb=2tpf&nH%0Pc2VlrRpOr>+g-mgxQW2%!1k$#${1eh^b zyT?Q46LkDOrAL(DV`z+?MPK}j52}XUn%*Sf9M~rLPpX9IH#j6N%(ca(Mdb zr<)G~ta8_`6Q>YPE2OboRz4ZX*5=BQS{UJ zs*B!Y{CvK68@dy__x9U4h6!Uep*1w*8uN|Sk8`2o8}uEVr}Ixf`Q)Ugw#N9@e6T!i zq3<-6X&U9om2JApu1V_jcd^oqO7By;U1h#O@0N+qdbfJoE46#N=CeChm78&?jz6XJ zKa|k1&4bX47vS$WZUx_s7!`37Vn2-Kqpfhl2`47AW*uWX z0DjfGVA=B`&q7!HFcLg~`I;e_va%kd^R=BoV@Q0A{${;i=~@wVop_>Es`_Tlg` zBhN6>4d(i)t&U!?b#wtu8FsPwq_q&=B^$_dFd_#*yP z+*C)f4NahNOrtK+ zq?`2$v9L_o%;R+(w4I~%JgtvcQhqvT)_m=wAE56UN(+=03Yv2zfG5t9{r_AtqeeQy z#%VxbXqKnp;cn-78{LBr`hS&vuJmK2AF48sC9_VxB$+l_Wr;uZA2Nw-qL-mXIa)=! zMVghaIiAnU(bVoMk+x^(S<|4a?C}ivRc=|OXj>)P&XoO{B^n+h)|`EcrpP)?d0Hp) zlyq#mwyR&IV@k&?(lM&8i^M9P^SOuTL!<*_zv8rp`59*75j_jF&c4Xg*gxX!>{Mw;YUS&*fMddh&os=4XkPvn21wD9y%x>3bHWDXtmIl8TvYbnq(i>4jRK zs(B4XsF#-#H%nGp@E22mie`rb?^l;k@ahH}A+*N>^2VUlme8W{C%&Z_3-EJ@Kt7rDK#d7fNd5u|?3H zHGCg&usrgW)ZR>(=ZZPSq!(l znggr4Ui?ftS0$4kVJ^-JVZ?dUYi1-Bv%fFunuTE0QNs`5ZniyvwYpRa}YLR%Gxr9ifFKL$ivDu;#sapJ8 zF<ywHZzbHO8f8C3+Eq<6L ztY^GmG!!9TCWirCihhN*=#adPBkvfcsE5%RQBR;}jP6?F8%RgkJV4UJ(0ICZL#24P zQha7f^rbm$NqS=Dt3#5mn5lG3ogO0^&r(X}D@iv)XJla-L5tdPW#;I7qIl+XWuaq~ zxZg1a@%^md6`lX3_}u(;FXr|%m3exf=zWt4C&Ii$^hW-XefV>ZiU|+nlR#Ven#8vG zDcY{lHgZ9N*Yo}^{4ANDCi$Nxxt=b5o-Um+L;PGR8dr*!(hJE-kcZ!3>&_&e3t+6J?zPt1Q1{pahk z&>x*D+D{klq5ll&Y3My&d~fX$&ga>znV0<}3C&5T3WG+iuTWcCJ_q_mHh}gD`lj-D z3FeGX>H#^vKNt;O>|@ZJ?|n?$t-^j>WqqHvmnw<*h%wF-?d1bjKu6KKLS`O*t(c#s zY3v*S=^S(jn20pCHv1UzIc9oXYu(3^bVMQ@Q6W7*GWv3_eBvBE!;;QT=7%Id2K{lY z=sf+mUaB&GNf}2eo%7|gIqnar!egTOe;19vsid;c_?RlPM(GkI6mN}mq3qMKl}UwS zuN8BrS+Ea74fjHJynm9{p5ZX&=dZZ5ANTe z(^~Bp<7deSe#-P3fjIq9o%kC-=R=hd9}$0i=1)XO@&AnbM2tI>-mN+=5kH-$^{LvI zk{1TkrAI2ox6F+^Q@VPF>>7Ruw41>`Iz;qiK5)YVzBOIp=hBX;(*8{G>}=sS8@fwR z*tyV|Ytb9fxq7~QzrXpG>}!wQKu!<-bEjIA3e@ z|MX;Br)??}_$3N*_^rkJ4M^hb@+m zaH`tXb4A1IWSZK4m7-(Sd|h7sGNp&)KXd(0lt#4uDaDsw;r@)|0ofqNR59}c(fObM z|3&9W@5$E40sh%6*@DXdDW3g~X!vE}@JZ2Yz4qTJd@d5r-Xhw4w}^Jrj{8AUb?O4i zfW+f0=@Wc!Z6}q|TQh|1WY7G+`A!?+1k**Q>Aw5qb&8(`{gD;h>?frB29vG;5xU#kK5a%BJPS4NLLTgysmZr;+ zwk2%^7CYw8v2Akf2xo+I{LEagALDbBJ#T3Bn@sO^m<%NmY$`1w5H`KjBH zxJzYgOaJ)5fr0UXHAhV?0(PQnhOyxoun!13-Z>;4YyWq=Gi)<_mpHD5?;68(LkYT| z4Zf=bNBkz^Th&_MH!OVT4i5Gn3H~bgOqWxa%?#lsLQ*Nna6!7pwo`oVsO_;8&bBS~ zSX>^L=I||*+iV}n&hX`FznM#A>;7J$D-At9u=J?V&`!sQ9jL^`B-1r=kYt?|@GTgE z>^ZWIXz@SyA;+*Y`9(W#?3hG;?L5xcU4KK-g_e7SFU$DArtYJONAn0rl+oB=7>`AK z$t%XP+#cwHaVfqN?XT(Q{}lLEw)S)*zjFuY4h{`0Jj(dgurx$nhQTM~MG21kIeaHW zy9i%L+2q%yIMdB8)5ZmQ-V&a0l+opIzW^AzwsOy851$kEUm0ii{PFX$c^XdigtF+02`Ohnk^DN1dyzm9p-$&NI6 zF(AjhdQs!FLJIn39Huc29Ob**UXyW5?0b-h8qH@0oO9V0fUVKcnl>vlVfS z2ph$7$b#iWX^m2wt;@;pWEd;PVLJS9@U3bc>|NBg|B0IZW!<%XM+f~jw&7hxgvUp! zw;mnk%1Tj?R74pDA;-%xE&k7tEKJbN977&c3Dy>pTF&~q1pAp>r>Cd{S&7PRJ=k$+ zTU}rKz%#pgcGdRp7`T0G-BHjUscc;XzI(?9<{8T41Io8VXNco8X8+X`-qn+ zqg&i6q%!QtMLEu+yyTENdLq6X%ETt4{oRn_%bh8~WXr~mc3HO{jD29VakQ>)zvQ=l zV9V(G(cvTRui_EVIvO8n#0skwd|;sID3oBQY_!8sijD3?l3ZSHv)r6^HqCr6eBFmW zq=(g3*}AT~MZGjnjol-BoBEO8_JQ@IjeEC@Rc}4={^|~E8#S1R1-|10`#O)F_FJ*c zIKuc@o=OqUkSxD-IQYuLGHcD94ko_~TWk7S+$PL}Vv`7^Sd9KLD;mybP1{p|9)Iy`H#UZl#_ zW!?LCHT92=JTivNwhRn{Z~rPu@|Llcqfbg!j_gv`2fjP39~gXTCmnrWbfi(#(Glf{ z@sgmYGc3z(EiLh%Cu<$$J?MjbSZL=x!gqLNC-{zb3~cTN@0Fu<{p)3eU*M?z6e4T; zd%^dBJm_eFk7gTOMO!IIa73_>%9w8z=f^$PMe8@q)Ehwh3V+4HLO&hOLo2aLEQ}3Q#<0JUgJI9*(Yx~@nDR=z~ODDg3^;YX2v_3)* zc6@h42`*c&7o%JUdqzaqb!WscqB{}Sc*aBxJyB}&Ig(%@94v4de3vSEuw$S`_+oL9 z-|>;2-nHF>yM{(~NDJ;9Q`}?Z$o9ML?q~p8MX?O$fbg&)Sx2^9d3*~KXd5LsLvBfs z-Gj+*4qtEm93;L0&WFNxSy$ue&7On!>Ltyd>!LF=B3-wrXrWC%Z|;-%dcx_zelN` zWU-+UEbcSAYWnM>jn|K^8a*Ji!M9#5ruP1wV>n> z#;{yN534`;XzArDS2wr7#rU~~j(Nq}+jDdHVqFg*zlw1L{S4=nl%j26>krf>8Xl;% zn8vW;87mFnMO{5=BaM$V^%=ecLnDRf#LFemJv!R4#m}$as+i=MwhN(k#P%fkrqX*T{Y(TCjqdj?#kaQa5%np| z-P^7<5iu*r7x`V*y{Y%1fjzxX8NS0Kbw{+%hL#%gJ5Lta@r@REhk8QjZ8&3@}TSbRw@2GZvNG>?sdJ&?frqI8~Gg? zIg%740`2HVeBJ(z4|J&AUe~`=ePBnjdWccP$2Ayn4@kNSrIOhH4Y+LdxeBqK( z{k*Vk=NNrP4SPF;FTH{*CClTAb}Z|@ynAhTeLwgPkBr-L=@Ha@`+FNCxkzuoS5l1q zl?9e}(4x^q2cz(jJ|?>7(93X~Y%AwsO#xqcU?RTo`@YU!8@`Q-aDZ>E;*siy8>#JI z+r3B{x>h~?JI8tl=E&z7A6eA3;0VbGW8A^l7g=Fq9TvqJ9vG4ZZc&77=@I0g<<}(GgfCIsdkkI2m%cz+ zz|CrBI=+k5{_T-|ZX6}5)gTTSR*d7&`sn#T1DRadnrUZ4*gPyBse=XX(3r|PX`Sc) z>Ce|4%j0`%h;NjloR{B2w~)jOCHi??clB0$XV=e?PenKeEy8g?eG2<`ZR#byu}AXT zAjxIa4jOt;y$nZcAwrogc@NqpxLFch*Z*WkDBlsXB$HD|_?C@SIbeJwB-i%!r1;`dJHF`f(()HxaJ;c!EIax$bVD0B^z(x+ZQy$K zVf!2oN1GK6HrVWA#PCq-Ai+UT>us<};~a)>jBkjqEAN279v z4d2bZ>r8%|q_5|t__hx`|E)|%k5ZLe;3v;l?{r>%t^KPQ#|R^_hJuGBg!^Xe{ldwX zcrU+e+?(v|e11Il;8*%t{AcIqxAA`pQ}nY;=T6B6yZoXD+`p<+Tw{lN*BoD$-$tSu zeUjkbAxT1w{HuuXfssbXS9-dAAbMETy|^~9MtQ1CWgCj+mqKnYlfz1BoIJi!f*oHZ zxJ4s+8A-H%7qLn&osCIo)4y@Gm!>NCV3lQBQsE4%*<|I&>Pe~7C)qap$~D^%${wB` zkCej~Nxe0o9@o;(DYl2UzZ-O}>-mD!eNQjiF5o-rqbA4I$3M7hu-BtOn=}H8F<4Fg zj<2_nRt#K@2h&z*6pPgJI)$2feV)xfl!>@FjogL?w0gQH;u~YoNN~G6EPSlmzO^bN zB~*#HLnsU7vod;)JuP4no)eL$9N|bjt7z?a3ipa<>K@98cT#S8TvElJae_&hNpQy! zUxe$e0m~)YUY+JIJq&!|1+GSd^{lpz{$ahH;I`NO=SE3qovbdSa+=jwxT$x$`Um&# zY6yGKgdvv?A%^3<$E0x`YJ9!zymfgV-tAvZ50PxY|69Z?wPO0`BQW3cz<$itoz3 z>Q%B9aLd3i@SvSyR1kv4wp@cy}Dq+q<#?w(PVSa~tNw1JUdM>s|)!MCQ*xG@tG}7F^y|+iBu84FXzqE&2 z1`dp@+`Cfv5}|C74y5E>ZljuEqpi4(v^>1EXcq2SOudY98p(gP{HuH`m^PB*>+;(! z3tTS^T_YR(V2727Qu*TL%l^sDu#3-$$KyJySI9|g?)##I<-}6QyH3oFPs`yOv2=We zXh3)(z6ZC!j<4*mxCQRn*ZGu2Y1||EHGG5p1z(q0@a+-8DZYwdHfoV)?em+c7O7qf z)RVX3wDA3B^AE)$Ju`awmW~ukA{;i-F5o+EQE1vocvviMM{=}x`lfda&x$z4=Vj~M z`FRYpI|lunT~W*d+T&ciRy4Po1zV9xFi1L@NHFrta;x$r&A}>fP|k*fj-uoYEdk%E zwsqY*$5xHH{O*+W;$JbUjxijdDtyg*?&+=3+x&ASy)2D7qeCMpLr;3dBGSS3RU_8V zX36N3VQlvdT2i^i5ss`EiC*9=O6m9_!B(1ZU&qD%{r-OMSW?bPpBB!FHH&phWs>85 zziiF*F^>{!+pf2~6kn^0$(VUV0m&%88Ny(`)KN2ZrzF2{ian`LW9HTyzQWd)Ekch7 zmflMd!cB@)61^H!Yq(wQ-=Lo@2C`!$^<5%u;@ayR_YQZhtAm{6=o)g2!j-MXEns>J zT<-}6>CNz!b#?h&*Ig$)y;k@VeGd4V1t!L| zL%sZX2}UQcf4UcH;59ki|3HaIQ=VY72{a*pe{Zpeg@$&7J;vctEHpG0c>k^^J4Nq& zNx?z)ahj*7#3$I%9KvBgoM&|fv5AZ2Iu&$pKPQ~&REYS7V^u=it~H6memdTN{)Glkp3j(7yUeUuijWu3|eK+ zQ{QVA@#NUEUHn?3t3M;4ZTFklLPA4>FpGOwSYYDNpgSlJvEcYRqKqrr3$?ZB>UCD1A-(Y_k*|B4!2YgwqrfKaceNhdl&tWa`o_15~4+ zp(Cf+zGQe3eDhf2TOCS*k@2XXtGCLh8rz~#ldSKN1cNW}jU5B~cdgZ^D_Xy9e@%W3 zU5(%vooD!N>dn;zEF2fs5gA_}-hZHLpi?GW>0P1r4)r0;OGoL@TFNZ&Q0hZBtBph? zj%dvimqe4ofNLz5KQWd&Jm2c$b&5GA(Ir^N@^KFL%iZ73^qhE~Om20))iB~~8oE?F zgKn00aNpU-aBxM$_Zf|tyGQ!D7+?J79eRs_QL#N*z&G=s8_~~uX(0`b+}&HS8l`xa z(kt#C-rDG7bx-LUX%}!2WxTgzUQUXme$Fg#yEJs2BIwkjr?=XA8+3;h2}98LLLN^w zRJ0%0;flB)k>U!=%bgdnM53cq=Z;dZn2aKJmbOeooBZCILo+YAONH8@+D1M{RQ2X>LsM7e|%&u_)^Clepa8{e*V}L zxBY(kyBaM6ow>K3S!45Xg=^?MrW3ahQ+`|ZM!uoDULIBsU%i6_zUzc9 z$QI!%d0DCWB=S4{qh;Mo6&nim2<0}u&DVkL!&|7iXp!DGQqb3SugbQ;-UAvRmbbz& zf|cP*|A_h-EbUqKo{-adZb;bET}g?kdY`_^uMZQIhemGJF{~$>`WkicjJ{3tcUG z|8}%jW3ZNWZ(!~zN0=JK8d(G@#m94}{vT;zH1WIS{_Q@Mip*%HGnHhbhIV|3LJt|f z^}=_scaznj_}vEMMaRXc9gz-nPmkm=3bl&d7q5$m=klFH(~>)Vax}{D1!2jrEO6f1 zPDFSr^1Hz_Iru)<@dLw`_k8b3@g@Ek@m(elt7jLZW5HLm+Km{#Y8^G0{aw`kfZ-c( zh4Qid+76VMIxJ{Hdu_W-Y^?C`Bhs}@;j~wH26y6MZCP0 z*1zW2=?dGsm-D zpQ-*+@9f-cFQtd*rRO}@0lxTHc^}%_NSOsD#?fLUIndABRg2Ku5b2$}YbbG+lWlqJ zbWP;2Y|C@l&mm}g;oNwQuc=w6pWnl-Qf|OEHx{Q9T@a2kdayO;VSk4-UkcJIeC0E_ zB!e~mzr^;K-CM}o+hx4Jz^sK(6YVU7)dwMbw{4_%HNQ{~uR|WE{22$`4wQ3>a;D!c zqmuH#cVove_-g*EgLzm)DMK4c_$toYyGQLL(bVq2y>m$UGriQ=^J0C9b9^se5sv9z zUS2PE?#lEj`PvvAz?UWBOS~C`$}b1QH6C+(3vDaqH9Nj56_284pM~fJ<6@iTl~i|O zdu4@%axuQhO^fDUesbFbou;2-%_0?Y^|V@BU5fbNP&uV{%JvPLHEp~_0ls+&_BIm8 z$0#)YNRnW^-MYP(cukE)&Ti~j;P`qeQ<~>ch)+w81y0ZvoRvGX!TTk<^qA<)X2r8q(uhkbR{oTl`=4BYu5& zvf~`_rH$kZ_&QoyPL$DutvOqL#%(`P&#&ZF{xBZ#J-#RDV^bI*hekW*X^#XI0 zHWKnnZR+~=n1x#suZkcyUrsV-EM!!M;ZdY zwf)t?cTsmCpb^SU9jyH6zSqRhI^=(#RJewFSWb9Gih}kZ5`HGZ!Z$-W^dpVz(6~@q zz;1u3kG>@#4NXg)(MR0X?`;3jn*u z!nuAePY4#+?C(-TxfI>0<9n+-F-C5f{7QluL%Ck>{;rgEc6^D;&+eLS@;jRdhwvS? zH-ho4=I))dx2CVU8|f~n#8%r#4_{~0E2)vuEmERrO%189mbmu4R@uuePvfsR-flAL z7C6I~ek7K0A!`wiAiwA%G&D<{tk06*VX5@R&(dDxqEMDl2KLhOWqI-HxDH3kooPJ7 zaXS~PRkm5p?1|JK30|6xw{k6vzKzRr zyBe|+{m!(f&0`*D)HYl4K;^d((*xgq+o~nIcv+j|Ur8UzXLaj4q|qDIUCg{$xF_<9>Dli;kUzp1aO4-4GH`(_$RNt}}LM)DKy)zim%n*(_;0UhBt}hwJc6M7+AAS`J zGK*D3SF`Q-5(!w=wXajMD;>Q^G^rJ>^mU71eRpVtrKDH5PwhRksn@ua0+a3cND9?U zX%bvyfm01VKCrpF-8?MER|s325*xf@K;xo~51;>%O;+MV<;S;1CA+>zUQ2zf49AEp zIBztx{g}zGT91k(vjmyt%}?-^<`vZ#7Yn{m3tyy^ICL?-%-oMu_o!F(Q00Chjxz>} z__E`R4?WMg(>PRK^|+2ulXYG0LC3MO#IcBT)aE4kg(%;%yQjB-HQqVIvFNkkU>etD zI4{3onk^abI#bun)@lJ!#Jm;Ve$$2LPb9s%DcJ9p~61(tb+uIALxTV{^5<4ceDGR2qoX;~y4?IUEt zm)I38WJccYe`3F8e0+XuIn}$Z=}_+h9A|CdEKZq!S7luIe_6Jr+3;m7B|U}6u;zw;QHl*lwR?|26deL%e+-a-Ohbo3SC zPWPWdSm<`cz5CT;vM79?^60>~O871jzUjQ}Ca;spZ-y&KXUM|~`+J#b5??CAH(FxH z7b*n#HGFCRX81C15;W30mHkIXKf@Q4sGU}uOK`w<9`#Zl%djmi{rfsKW2*G?o?i7Y zxCBe8`GV%cT#M}4^V;)wrCVSusOf0owgHJumkh^tQi?C==6$Sk_=0qnFMQQ^fI%`aV zt&dRFNBC+E3L+g-ecp3BZz}k@{Y^ErNv$InB{=UvgDTSN>xl5`jt4C^iTtYmhOS22 z$Z8?Iy+T*<09n^7Oh4}q9u^j?r5_I(9^ku#nuApT%_aCwr54YPPTAE@c2d?3#i6mc zZh^5na|cWDB@SKF_h1K6S9G*{S+oK5Ue&)3RD!{_LDK8rH5)exrgmthn!epa_!;@o z(FzZ$oz$eb^kh$X@$=IdWzGUS!cl@FzAn4|?^wt4+6U+jrj?3juq?y~_;6azs&y%%)BkCK1_4U>ek_%o#;_nP!VgbxL ziTo-;xpj8ey6(-w7hTA?jEAW0tJn7|G^@@L{bnpy1B7WMxtGQJgY&GlM9#SOTsskm zZq~W#)fU3&Wk-0AdXvC?^>d8UNVAr~bRvF-%9%`lU3&BS8Oa6J{J+1W!aHS-uj7UM z@^&vscMNzeK+#9_EPyXDXvUU82XrA4u6U5Biu^85V+4mP`3rG;v7(P4jD`kHq}OM+ za|w>}J7hI%?q5O4h44$|H_Mxre`Ok4x$C-@JTEP!LJsBp_S97fVKubj|3pUi@HH~UuU)KulQUMTjE7zy6WZD?rl1=W^5i_?TQk|RvLItGNUtSx04c z-}Q_Tt~YqS~41hXhs9$&{b{yV-8gmG7nFEws4 ze48Z!F2|BeStZB!NoyZnu2DEO@~2kV*-j%gwMLz)4P1DRo=I{24sWlrbyN2a(qy#P(Xj2#4rZx#2?pVDwcXTnB7D^z5ZWM&ZdQ4vsld`P#uB&4tJ>79D722$ ztKQ9OA!qnLTZFi-@LcdU`OQ46Xo1%l+7sm$gfpa<_hWq-w?TVo1)LmeEIZ7e+D61? z*SdZtx*_c>D%hFv+;&L|KJ*dCS9Ba2*g+kHAmeq02cGFAh9!Ilhl7R&-42sp&}}x^ zWz0^!5FPAY+(kbFS{|g2%)Im&FCqOdztO{rh&sLzZAUdCo8dcWZ^V~qmGg4^?~p`d zi@?`LU77u@w$_o$FFK4QeANS7r(TF7EWgsGdwPe}i%%PgMc+StIBNl8frY;ow>^%p z>T6zfoe)Mh<7?6KlkXv*E%;9?~bM{)P z3}Is97E5PLhtNes7vt;oko2l1a4jC?&pHQt)zhdJgleb0CbV=Z!p~nl4t}R-f1~`a z)@(s6<>l9pIl3D=HtC(vfUmSO_^O9b$f@tlaKq0S+_f&n7Y}-|@MUa^(}jO1sI{Wc z$ofQ@zt}mFPGKZJQRPBfJNng62);o>gKs9mDmff2*`>$OWw==gFY9Imux8fOop#4> zH@q;sc?gfRSU<0Ba|w?4MtP2Mi*EL1V~5X2sGfY;U;6pLmzIx`Fy?D1K0=APH;~^& z*7K{@ug;73GP7te_~JeHtvw3x?U9B?vvdRrUV#TK=_Q&qF8Kv>P>&uK2*(kXAiNyj zkY4_C(Pv2gpZJckt#oi%dp4YWs5`ob&i5fjMBRhVBsNN|BTc^EBO6;kwo>!oSldCo zs(u2;R~XZ4&umfaG@6|;b)d`0E9AFc65$I@ zRMv-ke(^nZwe=B}MmRPWwU#oJ*>d@Pu;X^kv=PU_N*BpiA+cCj7JWHXZ^tqQycl1+ zC`Xq!JMdJc!%Ws6N=FeFm+{5kLpre=;ymft`aZ^S%u@sl4ISgINH6%V0O5cwZ)rSZ zwU=il`CqO#&vth(68ON#&`7l*Tu4zaU#ob${87*4oOoVb`;m$NMfh4A+U3{dSF3Y9 zz>aamcVow*uG{U6eYFpzz2s}EeFVOW#i}2aS}Ag6bInA2^@exXX7z$2z0FEy<%F+j zIY9KPeSoiH9rMFT7188k}hzbqqW-P`!0w>*B8F z{sa0}>d)k9iQX@24JYEe#{4UAL__CMjoZlY#*RI`jV8YhLYHxpJ`Q6~T1UQX#av*T zxla0du{8AMT~}D!H%hO|h~5bh!ra)%4C`3J$sGur&L3$C$j>3?8@-f>R3}4x9i|DaE{U24Bb2@df97ogn;>;yGK)bM}!qYV*sdpoWIAv@Pg@C=p2{ zcv+XmNv8Nh8|gr4LFmNTobA0!4yB)Yx9|m^3Y5-MyY^wc0wOQGH`rkDD~su9YnRHmvh=TFZi;!+x5_Jt%)#4;``k#4~gc`jE1@8XVsZW$drx zys4Wr7@@I#jQM|u4PRn~I?lrP{dOiFs=n3AC2c|ZROWpit1BzFSoy@pL3X&;tQt8?~@w&%l69AA-=z@x#x()HLIRcVuh|a znNjU5ym>+li%~f~!pUuKv(U93V6(nx=-tQJr4xJxC__1YUZ^wsR*ynhd(Al-bJ+I9a>~>?9*=A8k;gY1b5#ys5Z>3>EPsJf z&pwJB-9sCv-tgTl43XbKwQ}_@{~3H~12ccS-pw*;MTS{+j5G^l07_}JE||Di}VgF)%WR}YbL#*+oYB*aU6VS zA4f_3(P1F$HHCkX;)m1*46_lWSb3=nwy*z)aqhSu^Ye=T^JUL($Ft%*2NuCH>5cKL zQhbqJ@U8A@AK1__d+V05c6&=6{imwvBjxaKtM>V4xxn+-3wk=c?3$J2WcoN}o=>=aFv@;%< z>t}cyElm4>7C*Iy0vW=@LGZ?S3vFm5L@Tp$l-VkTyttZR7EB>ma{|Zr0*0 z#TRTzmv`-umRZ&XzSJ6Y={0#q?N@LNHQPmt*5|?oVQ{XKHCkb`K#Il9BhA7U?gwYS z!IA3cP#a1+^?DT7?fwt;YYAFRMmrotS}AiWmYx^uRa~q4 zKgeP-oJsMd{1fhxqxTw(mIdJh!gmfWVAa+2Gcrx@n9tlsyvEzQ$m%bovzS9Q+9WvJ zWtf_y)$ycROG~3C4ppLqP$bqnzb>YT9|`gszFg)g@{c@cdm9zictHD_nQUNnM@`?V z(PsKagXKSK8_ldJ!pQz7dUoyGb})Qn zEe=f)KlA>U9Kv@L>*-QHiT5sEFPDbqO)ANq`hZ@8Dh~TG|mFAJOwHyqy#-8{a?EeRRs&ED0T z@7eHG>j8Y5t>>sVw0MzN-qe7jvAwLpp7SKV($PbT--9i>ozYi(KZmhbv4pJS_QZOG z9CRsYhW0DSSzABoSm7I&556Sxi zT}3yvM10NqN^{Y-5@pz1O5hu1c+OsnMyIlym7{d)khBQ*D1ROL*+xN|1ZOSa68&uQ z%ZTR&;oH=|a&(2{cgP|e$R_W2I`>Lyg(>)gGy1BgPrh}x5Cva(8M4^gHp{K;VST#{ zDwLLv{qi-lhy>OPOsSh;ZMgy6s%aB!%njP0zG%V%Zy)_RvxPCSd3;Ct(q*kzWH1D^%^zOI1XZWsFMAoAo zj;|2b7+UwDk$?2`kbf69Jg=CWi}zx!y<}zoy;izcb|qWX$uzVf>~96ecNoC>fgrhT zFVi=EuNJ;L6q_XC?DC8C-6JfiNAwtZBgarT`9;FPmsmR*D(YsvNjmz>uC={8MxrzZ z9UDl{BL(5eLAJi;Fwi!vO}jnpdS_IHQ zS&a*x-~d_*jQ5{zj=K3=xzPEdzZEiD|Y2?@HU6&jdXF4U-uy+ zw)B=MvLOwPw9?}Sy69*Y{O`@uV~q9pMRhTx_;>um5v#q`G#p8fr{{Z)*K-2CIfOm# zk-Kk>GKH}1YyWZ%Zzs5h_Az!~Lp`WPkKzGli)4w4@RjU(uNnW0>Bmb^L>e#J@P$i; z)$1=SY+5PS*6Ns2LH-w%vD$|c2d*Z+5U6HHyyQC9@03c4@-z93V{)**MeQR)y-x27 zg6|xSs#~G@b;w()H}4ARrG|T4YNPZT*XrGE=`n2XkhPb&4s?;;+P-z_OPrm3&rhZE z8b!&py-?rmSgdO}>J*5`Ydsmh-YUitms}Ze)qT^gf<`Q5UZdg_|iY-ZSk3q*XqI@HLN0GD{wO4bP5` z7{1a=U`ld)CB2$Cc5v6Yw6m4W${$OameWe^<>r_cI5gBI=96Q!2{oO7FFscAsEK+= zhD}e0JBIuEUHutONsXOS&o84Y)dsd+LdTc!NYb>jIqSNIMx>?0*{+>UKTBdkIFn(J z-lR95X+_|NcsmIR9#^_kJ>Rh=laxrbDWtq_R{EW3Y96cMLR)61QrXhhi4UXiP0* z>8++NO=+&>IU4@2<91D&=X(*$N!Dp(%kNhRSI2eslug~d=e@hr+emJKkv+#38RmN% z&5~ny8-%xGfz>W@d@~tdCy!dbw5&0HwA*1xu-YKwk`m|U?73mfYoGrQNJczu4aMR@ zO@wpI_phl0{Tw_jkj&!?x{mL-zO67mvZjqzF!)+z68TkocXMd-W^#+{TDwpFGrBoq z>-Z8q5J&XR8I|v>Qjr{4*0vY(N)V*(q5R=GKb!n;pK|&+NN+@3B&Lt)gMQV-|AJ}4 zHPTg$dlzeVV>~TJ>5K>6Dn9~GQE8KA4%WLGhVLL48j_B$e_3;x`O@pU!M;c5@qVG{ zckv0!xIDF3@=y|!Md(1?thOMSM-r+;RP$@kP5<4$vi6bi1>1;kKH5Rvlbwv2l(tgu zKBK_BJ?r{ev2}4K-W2%O7_yG<@CY*`!}Gp$Xbr**qv|!1T^|3D%I_rypHMGqX*IJN zvQ@mePAbhGyMwD(B8mrHTjXOhjKP<3we&ac9n?43n-t}U9<;sPVAz7NBD3A?>H`M5 zxNNtPE5cZQv?Go5rtx{v$woF{Tnewe&cq;d|B6Ay-_wk@}T1@?c6NwR3|LKbd!x?i0Ia+$I$VeJGw`sLnFEo zW2CoMy-suY*7b{u`Nc{a%N*Cm=uW;DaX%=oQId0!t#Wr1zM{^$?sDx_E?BIx~8qk=Nyj^Kp*pAh*-*RJ20}AenUglC;}Ylyjyb27-2Y9=$e1UELY6vmddVjLB2_I z6*OraaUNfIcCPv-YSfE#`{>UU*_eoMDXwupTZ3dC72i8td_6ub84mt*!KtJ>7mSt* zG~%#9BY+F?Kbx(`jPZo>4~y_+&YX7HVbB9bi(u(HUcwlJ?OQ88(=7g{@Rj_cqmLlf^UAp zyY4;vNKo)~iKX0Z^G{#6_){F3A>7f=H@oX~^<2&QKB4S^@ABA%T6^86^l$Qu$LwCS zMJO{5I+gB_Zm)?jj(LX#HEu!wQ-qFD(WF^s-qZRYCAI^wU;n-*Aaea1;)duc#jT{j! z#aD3;`^wjPA%mW#b{W3U?5dTQp_Z@~#?RGDu30zrH%L3ne^AMZ*Wf{mQ>BZzc6?;j zXq|ddgr1it{##vKKBJ5}S4ZibY@P8zKrrI!Ymae6?aVsG*IG<>V7~)xB9*k?)7`jt zQCC6nO3hBGvQwLOVPfyrhziX{371HhVDqY^lP$Jkvg+8Pn_YUv{h|`+I>H^gn|x47 z@kUWWwa$4@MjdE^d{Vw*X(lI@Hd{L_!&O*d5REdsL0b{&D82Hk#+bQVy?NbOPvRAn z4MZvJCPk51XA5n;aYf+8m!b#@=yoW!*(=Na5Z_rDvv&rA4;4|f@|%?UmeV}cxkP$1 zMDth6zXCZ>U-Q^C-K7+rJ~MXBoXj$w(`Gzi#f{JsKTW)w+Kd7MORv(W)9-srow= z*xKC9XxYuKpUq>Ats~y5Q;)dW-aY1nic+SXxf&lFj}z+jiu>bR|ADvDa;QXFR1PZ} zYuh%&L$30mQ*O~-K}&IT1AHUaj_>M@#a#`m7vnazD<0b+e5n&?f+}-#6U&MV$E44t zh4CI7U1XS1my9lEbk8ci|4;~crAWe?wnV(*IwBd@o?pBd&kg>wqvt65e~?#`+?Z1& z#UAy5MouwwVWli@3v>Il@ugsSSgMceubO$Z!s`kx)^#^4-fH&OqF3PS81q$4Xhl1j zC_%*6@8E4EpYwxu7;n0(F5nc=3Vc_T6UwMO+cISByb#~8>p?dk-9T=O@m*u@^Am>} z(w7w&Y2)Mjo6y4nU+>|KHRTA~XlH3N(PLcFi-y*>RwTXj3NmkWecx(}++?^EZ{^X; zZx^3cZZAd95sfnIG9B}>+*E?G#5@U_g++AcjRx9FRT_5(zF6QE`Ow67w8%?h!N0@{ zaeEtOcUiz#sCR3QP0kB(y?VQ<$>bN=H9rMEO9<~*iwxdUSqvrPd3Y_u+4J>Za4vu& z(uFhQk|G>zaB*~FjqsKhoSA_DC%hE3G3|APw{LA|K z7u$y<#j8fYI##{4V7fV98ZXsUa$@S#+>k2*<Ag;D~7)aXBN?;6!AYuWmpWeZNlV@^0xedId{-=X^=aZBK@^pPQj=Iylw3 zK_j~?=W)%WAGf2H4n0hfkCrQjC480eBJdI6;h>>~5|}ZnfoMGM!h$Yyj`++Y+L9FC z4ZiqRrt|Qdky)4H*eeXaqEe9I;As`{aYT+fLl3Zyv~v159m2NI&HO8Lv+L)mo%POl z8>8CQrs27IN16Ba(Jtb>fG+dIHU(UTt&X+yH|%|>c*0_~qK1D{#n6>*zDLqKG@uca zDxsG$`}Z=(BU4*vxEjCczV}D8vUS9DN^4};a?zV+|4Fg%N> zmaBcp5BLTt2j8syyP?E;UafD)?%ySuRSA&7(E2qrsTn9Uw@S0PkvNP=um0C-;M-zRS&o1+Ov#6Yh+Hn>WbtdzrsxM4Pwj0FqU=o=v@ZG z*JjRj31%b*Ru~z^Z;|J0epRnyDm&(0Rzw&Hp-0Cl;V4r3xaHgNsIQ@E*fI&uq&Mnj z>@Vo9(Rxiswb}&38Y$`XI`>FBrE+T6I=)0;)J|8e*;=W#ZIE73V!ir{@v~NR}+w`QdILeE=w)YBO&8zxkr_YYe*R5$O;YaV6pXIXQZ6gpht!!_S$2~l0 zBm;yGO_@lm9KPmXMf;0)MT)H>@LjDroTv-B7-TgnShMI7zljSHOG}8@Biu;3eY9Q{ z7~VUen200YD0EFX3*S3MD?HTL4jH>E;OlQ@i~pcyq-QMmBsTNIy` zh0?5G;yisD*zj$1%Zqj%YwrhLs8ywRZTXM#8#UmV9Vee9(lyk?@r?D#>YdAfUhx$N z1aB*pdhCv+ZQD(c5wAdkeW}s>gp$l%dn^jcJI!mmFV~kRz&BeKb=^(>ut_j}R@Bi& zcGucRLRPc7>|m7cV7nru6OqiM+A%HqSIf%Z@Q(J^Ep8^i*y1PEufS~GdIMA#>T7Zu zbKz2Iy;`=tLvKCed-WQ|y#rgMe;bSgky*aRDa)(*cJ3LwXKbgEdn(B1lbxDX#Wb@c z9JFmJhv`0O=5r&u`P?k8wSRKY>Cp08_6$cjMn5WBFKruAZ9%f#Y%d7YN(5ab7zrIz z8+dK^Y<+v;K`rQLP)1`f(^wri0eqW9U2iENt)!d`GdJSi6@9fDV_$1Ch8JV(@|()5 z`!LWm$aU&nnf%7cbLL&~E~uiB($2NUXGGy#PSM4VGyBN)u)MHgZI3I;#W!+TeC~c^ zSe7^7+c7{H;l?%UQ;oQxpFz3^#j<-v=ak|bt`NS@JHonS@V6Z0eVuyuO#No~mQjB7 ztsIl!h%aBZUTYHkK&NIO3h08c=1Mj{OIFw-9JGIj0=h*A+x&<_8l%gX(2>YYW;3h< z!X_zh>7XN9#5Q8@FZgbd%x(z2Gi@Wdv|0Wk@e5jMQ4>45jy3%$c$7+7=wq5AY!ArG z;=9j67rzR0mDZ0|cm3oJp{r<6J72W2a+D$~jf^D@Xi+E6`N>_z4~A+H&YT(LSKBWL zzQ}djZbF{xL=&QpQA6WfEmsVhH${wvFNd+2fMKjrZf*4u=7FQN{>dE^5YAe=d8~cgu`6qL zU1Fo$=GQ!7nY8AyCc!nbydW%_YCbfwiyijf2Jm!zAMAXfb4|wsLij8YR%>aUjhUvk zgzUJ)j7t|HyCkq>7CpWMp@@BuRO9D>a75LqSg>59iO|jAYnYn!8op?1^$Xa{-MohZ zzMFf;f8_XrDJX*}TG`q{TJMy+HyFArrI)e05#61V-j;qiiXPRSztE`tfKlYaxQ_WI zrJ1B=TgDZBR;Zh!>#=xrz9B3$B4!am*5#L=d+nO?XQXlqvbKne)MF$sida@{h+g^I zWWrYHx*XG=gvE7)`Ir0%=U|1^k}{bWe@Kdh)CghI&QXGyXS`9P&Y@An(=qh_j2bbQ z^T2m$lwU&?eB}!W>kYCLD>aXb`n{x|>kVIGuaZx=%>5~oS?4vlO|yNg{~pcElFF{x zUfxYppMsuvX9pg(N)&i8mMAN`$s%a!9P=Hrwedu}qEN)E)Q2O54BttR3K-{g@4?Ts zqbaTtU#&G$d;ib2^=Jmo@W!OHGregb<`V34>Zm1b2uD3_G{zclvxtXXC8IK=z%??O>79qc5u+pjT&XK(CUa}W|WEBizvV5+~A7eY-lQnxYTWk9EZDahIkd)8t zBPrb$v*(MClf`Q;jdwgP#EERtCjNzFKi?)sR}!~}wvAy?pP}9s&e!%}+b+HGn5B^) z=wyxNKz`SDuheKsape>66MuP8pTaaBzuOxTp*i&P} zHioIG|0#WU#lAFX=uTF)Dysolf~2Ea?p#05kL0(bj?SauNO{ivIeGSc&tcp5Igh+} ze(}EN`hT^)%l5Nv_*Y-HHZ5B$HGO*w-KebxWrr83NBHS&PpenyX^Ttyw)Zj3?z-IM zSQyKn_Na$Tv15#$ZrpqI=bI{F> zFKfqlj(QIA_+tCFjLuUWBchAsn(Rt`!B_JtwXM_q4o~TuSPPB%`Leta+peR3au^6t zj^Cklk*}<=u=@=klVH=(F3nL>d(?8a&T(F1LoSY34_S>CQ2}ZFP@r=?nFGc9qf#u~4tL$UhG) z;X~o`+>bw~*-8BSY@5{{rp3cIW6kH%wt2=D1#~YA^cD%xD81@8RL)vM)-hhDJ-y)~ zjM1L7n_QBGu~}p0X8Hfvdl&essx$9DSPN0C#EMoOKht1a2!fU11@Ud)kthfe1dh;Z z?EFVTQH)R^-jM$1Z>wWb11g|S3!PhO6-WdjsO<|=J4#g$#7of5jEtX|F<8+<6i5KI z`Tu^;v!1=y-sh5&fS1l2p3m89t!LfWcRg#Zz0W>D`6^3ZDb{zox;kTh#=6Yi*Yh1+ zcN0!ZJO`HGiL<_CwQ%!j{8ruX__{XRzRxGk_&;+Zc@n-~;bf(B*WmvWxmoD)x6IvR ztq5DBtx9Ub@Q5g{_Q!hVLt2KV^K0~5pNJ)Esk}aq|F>*(9qIC!B~Myz4|d-ajg!B2 zN9J6u`5QyARIJd#*`2WJu}AaWE!sHmocIA{{JI)@vV32MC;WJ;D{X1}X9ACKSX_QLAS*`tDA9@VXhR%QLGn|e=nHtuzQkGorMx%igI=x+Z# zo;lC2yBY42SeyA*V%ZuMwohB7Ev28rSc_4=g*3j9tCm0uehcr)Z8&JjEF-RY>sH$E z&c(g(OOg&iF-PQES==MP()j#hKMowFr082$JYCIoyYF*2sXw=PK;2n**O4vYtl{dwmaS<7 zUwNN^zuz~zqEd757tR22}^pVG*6qd)DXu)w3 zonxI@hHAXN=~ld@g{K&N|BAokUkS$L_J6C$_Xx(g9E|x?KMltG4Y=ENVauoT9S=QU zZ8&{HdL7w5+JLWK#V7B6V6O0V&G$8bjKB4tP1tYf_3Rw2&1Svad--+|R%h@n$GX60 z8{_d^n4XyVlnNqbmG1AGczWjQ47ymAUk6PRrOlSCRk}BC@4b!pzbe^URgf;(qhwh6 z!oT~lvy=30t)m?6#^75X(@KYZ&s4_wE~o^jRFHUBS%Ko|-%c6Qc% zSLwd}bG$wF2LE;@`Et#N;JOgIF@NFBdoVKfLc4tkLaw~i{ae`T>mW;cy{Wl@Pph76 zx&^;Sd4A#Wur;x^1g(sx(GXfaW#JS&YvYH0^@&cN!9g2JPzDK`4SO2qQz{w?nUR<> zvp97%Jz{0mkH=Z4-|gf%aUgTq}z(Zj`-Yq5Zt{m1Y=W?FS@dg1-&)9Xva`i4(_gyfBkfPF6%jFes>45m_pnLOn{$0bU zC64Vi?QqM*vwgkQ#92a-T{w@$<)@VqYbBZMR_QQZcia*4B+TEHkqVz(@q~o$SwWP1 z$#ns)6j(F9feIPRiVfDzhQUG4&3M}aD=E{a*By=hdCR(oX(6(r!4hmul#%7h>fy!D z3S02~`P+~*{_nBXjpMjFqfV0L>ab?>Zk(?8ck8|*7HiKj=&JR~Gb;E^UT+$YzaspQ z*zR|>zn&hjRBg9?HXToqb)Ikz={#cJb&bx$BV^OA-@RwY?=T{XGe%9_Z|B*Fg!vB7 zF7kz+f8)&f^1U|xZyoynQtp@4m}@il-qnsSpIYJXPsq-D6Bv8Gv{_m%?sX%!V4N;rKM|?8GV_u45ZV1Ow zZI~KZFP>}Adb#WJT8w99t1&NFhpx@5VY&S5#yfUf8hEDSe(Qz1Eh$pWa(QMhUpo;g zmF~?rS^Z(*)v|_!E%|i)?6-SjsYD%NWgaoPRZn7XMK0-5r<}zXF*KImjhN4I<<5D2 zG0wZN-0ShTR`~y^k}!X3Nwy}SEB|ZOD;R04+HR#*8|E{Ri*VYig%uCN|MNym!}AS! zukx&Iy|=C2{6V8zrxLrJuFksiD&If+oa+EjNHA$X6Qzv(1z@>RAxFH`Vc zkkIvPmF`WT`%u$O@=WWYre5p0FJy1Ur$?EDd6K3Ldm=e~a~x5Uiu_7DXP!**$lV>k zXW?B9f0M)~kbH*0_hFPS-#rz+BrMjM1NlI*xY$KoPGCAhg%vrXOD=t^-(fIC&-}UZVhqJ5fzY$?srD?-r#W*)} zovsDnYS29ua*?dnz1H8q`DKvVBV5kfRvX)Yt-p7IuC31G3%dBd3|HsVK^NAGb=h0* zaoe~$KLl#};gd*OFW2W#9>SZ?4}mWCXx>ZR4Ew%+!;hmej#E%tWMm)u;==Y)qi%S$ zbQ*6Vb(zk~ol*wFejm=uI8IAB$8{YJaWCe(mi*sU_4cH5heu zXX-kQJKgK?r1~OI=JlewdoWYdm>uN9@9@&=viI3e&PtbjAKN@bR%Sj4r}geeZmtE# zZ98*&ueF}7+Anw9C%5kp_@1?G{Cd*m|2%mXo>uYvJaPLYZlvP`7@Fcf^r>W~v2>ay zdwizWmo_CaJElY@tqu_GFikC6-W&_^&Rt0Rt;Mg-mdQJ^^GFz{9iE~o#+GX)88a>o zmg#kM4YgRG^+XNQa;{G6TD`ftPRB<3to`MP#I3h@X=NSni@5L3#HnmG<_7udcNM!E zXKt`nneG$#>`&j~=nCU>?`?yGF4^+i2l<_T)0PI^cQY9rdJRt$?UjmAz)Aia!Kfb^ z&PkS5s@Ln=yGO|P_dP+FjHlu6?aWfbctXg(!l7hwih>V2G$;?k$$Qtj)7KxpUY|kZ z%4gBI^6t0ShWDKP8f6^;-F+~-Czni@G#eFb{E(B3BepQ6_&0i|w z?iqhS?*7d)uzQj-ZJJLv-h0mB*8uQ5iK{jEk}ytC`2Rb`=} zqcPtEnfQGy2n6v20pyUdZn?qP~!RfJ79G`PEC9csdu_hf~>b) zenWI7?s54HlD2-FGbtF=HQ6;e{i0|$Uf}Go~OGzq18715`KIZ{xU-z7L6lE zf)Tr4vP2Q}{SqZmq~ttoS)n=J`?C`AZ$8LKPd#>?)ohK_fSM7&QkArPL3Cq3- zd_i{`X9n-3zO$V?G2U`gHx>^&0-&iRgsh_?aq36BfhG+U8-*f6xyh*Y7bUat) z3CQk^7s_4COnei+Kz_4#+&2E7S~xxH{<;0-#y|W#}y``?M>cy}3cZ5$64iGS=t+{M~iQTK<2Rv}1mIJ97h1NXKq}VI6vuSgmC5m3v<7yLFUr zV((rJ!b+FxJ@-)(!*eLS%i-2#kW{;U-O=5%nRNLak|}Awx@SMpbpK|u$s|@7pMy`O zwQCDV`C(zLs|U5DuJ^+v94DDCWQ5FW$x-QMUM)@J%3jS9ly6j4FblXZ^9>z-^UITv zeHXC+PZjz7;%dBK$6c^D?pZ%*e4zpT%Al*(i&Irynb7UO^yNm1-t+3|$kTlg|0i9@ zmnSPZRW;$Qt2Fs??^V87nQ?l)dHaJ+&wYk$jiPts^TlQz2&Jg4FD7$qaa@`EL=AK6uzO$I`=?uctD)|N;7ClSeDXbvoNdn z;BW4~p02O6F^rGwvtmhc-6s)B*6zdJ$9laDyAk#yPMgZ$tYqY>q!QMPdwmsI{o{;{ zc3+uO4AGZOVBffd1AUPT@0okgkxTeS^!0oz8gJtL;pe9=eHdp}_Jt>9u0>p>;mY`O z@0EL^x>1n+b&p|PhPZoPJ~bvSrTY*_ldkgpJ?@KmZ^S1W{E#{CiS=~F?%UgSMff^nbzD)4WF}25l(uQaTQC^G38Zs8LnzM=3<=zQJFO^Ouxz$ zakFq2&RUMUa*Ylp;5`NHwcaFMjG0(3PtCO6%DNB4dS&N@^?t{#%Z{(SouStI`=$dC zT{2d>YQNu+owxV4C-8m3v)B&`BlF3niuXDs$~qbA>t;v^t1a26dbWKr&iXN(h1Inj zu*XQq(?UkqyA~5!Z^jA|l^HS?{}imx+;y`FdqwLtx})meTX!t(nJKVdoV(rH%vBe{ z_1D(s1L*@G>=}E$JXz6tv6822>%y_~qxk9iwC`Fc+ru!gs!3iM%kMBbruvsSr^H6J zZ$>Cn!@RIzig5KTv-u*v(Hwv#R*RNr*LWOHH|zu39T#Yw_0n=HVZ*vQ%eO>wZYE#a z?h_zPx=I*3FWKT;<;D1NZSIXHTzKBx^m1cz>^c^HE(d}3O3BRkaIB7SnaIy`^Mg%)aHFd4h49_3 z%(2X^+41urF7#to1~FO7>{w0NN>jr8U))r#iAK~$wlJ6D?L0#(cUVx@O7r28=Fa@^$171~W< zbeRfdJgI;+t(GF>d>Tt@E@KjDeBCTr?~iiv)xDQ=N8uZNKIh^SjcDiPzUyq)_TK$& z=k?ah(-l{4T5oUIFHdEwu{Q6(Nbit6z!+y4ck-hM1>URCC$6$ZJVVgSl|C{jV}2OI z-1)hRq|4y>@XsHP+dS)t>eQOEU5&64K?a_wXjSl z;2Zg&WACLtix=1HWOSH{W2LLJjvBw2R!Yfn4#zyZpZR=@hC+>x3(LL+e_x2FJj+d2 z{pxc6csOdW^ehV5$(d_2`HtN{+e`4p^F~^x*)Dfp&`rxVI$d$imem>0rh9XKG+k6@ zT)|IljA6Aq?^7PC_kK^zQhH72d=H0oJK`6@_Vj?fdDeo6MS3E+IQbNX`9gBak0-oL zAM2B|Umm);_v*qcyr}gA4Pc`uWwV$>9#-_Rk z{&p$kX7rT0QBr;k8A(3}G{2=hI5%de9pQ_0-9&93gym%2+0#}w&ZMP6mh>r6C5t;W z$5MTaV;VjA<+5FlV;SyyjqfPDE$voT-Fv}S&sA!hypk{NHlPa&{yjvj7tb>A9^Lkv zn$qid-pMAOUM|kra&M?EECmU*jnWUfYu?9Z12nB*`*0ABl$ZNi0`R z^=z5WJJ&-!Rba)8TQ4b(-E4es!krE1Vn4NYIYt+R!@FM6eI2Q9!rD9$a{uQ1V{LZb zJ{4b1@lx;4<;$1m;P`^DFt$=68ICxspPku-MQ9csVe>+X$|E>2dkUdplC zb*;@#FS}NWc|OH>zt1RoA2nep^lMyF!}O}N-XAiTJMm&W1CtPWOc6=4AstJheDum3 zq0lN>g67xQDLRAX$`ylQW9uw8>u%$%m(Q)p_q}z!g%9p*gs$4Iw_ko&By4%Ql3iGB zSouB(z9f9+_Wn!BPm;aEqPe4l{$l^N$JymbTHm6Mg&ZuDG|d^sOrzc@8lH`w}X zu2RT-HIAA>L-ZHt;Hq){nlEiwhPOZFP?oAwziKT;b(V^JpLLWihUqoGFcvFzEW}E= ziqe8{#fR(y(&885rWKY`xDJ?zCJF^)QERm0YRj}8{>riUbVq@18Q!Ox*mNVmD-v1{ z1-mX!$G9uv+U$h)N3>t+l`eN*(1q=?-zM>pX~kWE>k0_3QTn*AxQ=nfNzQeWiZPg> zDw?m@t?(H+qy%!|2xwZ;@$`Dt%b^8o3U+&Sw1+3^%Jh zP3@C~cW571l*yjUeV26m*PYR%e06Pp!tqtMzt^4D`09PHyph9G7jy9JOxxwySg)shW79ni z9F^x}oNX+VZk&>Z-X>`h2W#r|N}rdvWA;itG+qK*E;hbFZl?G2bQJ7rZS?W%hiT)k z>X}n>GuC`E-fGA0c_s-3>um;gBbdX*zAjwd{g1W8+V-q#g|AoW}{?4DY2Wj4NNZLf9~WUa{Na+I@)+MQ8-JA-7lJRR4e-z)UPaoC~r z$#LYE=*PxL(zsadOPHou?hsUunHHtnAy%aJ#w$)<@}w(H@EYAqarG&)`OHFH`DO*? zMtsBi*-FQ^!Pe$7{Ce~(*zSY)mWa0dB+gP~yWjDZyCR;fGWhcT_@So98jnDKpNo3w z>x+D7Q^$!M+8iJ%vSS5(wC7^oufc~j$&8;Kbv;Bc-Do@fu0>{^Mj|^(fe>rDI$4{>9f)%tpQip_L%GVTAJq&)_7;V!k5-tR(JFU zy({8gs;6e|xO}Qi%Enb)d*)2r#VI>|`Ua^#KizQs%xc5MpRl&9j$BQ^P$UcsN3gXx zwutkf2VClQtZ-NI4bm~5V)>MCa5a7j)&W;X%JOi&>Fm)Kgkys>$XUwUGD~?i(Rs^X zD8OX#iAZf{(tE=*UkfjCNnOR*@r=E15Ov|?jS;!XK9!S^q|KQ!SSV{3v zw$kG%Z2U9bh+M!?sTo^O&*#=$8rFDigJ>cvH)es$Z^KO@vOS_4z9(9{57VdZ%HEzG zV9$7E%d60BxToPk*e%(@cCj|oX7Q2pad=mx@8j^TtNrpDlw-G_>h>P;q!qITaAifK zPDH5aJSr1^F=iA~s?K~#t;Tlt%F;~K@5vPA)3GcpEmLJMHjBm#?;*3ihkNqlSv#th zQd-RMu+p?#YD}{8-61QJwzW(wmvl!qlnLP(_${E>u2?56RP8jl=Y{>^JKqE86L-LR z(@&(w@;d}M3!&VcR$3-4vyuKRUG07Rs!ZZKAM&x@7mmD7>9xkeaxkpv%w@=HeNM0E zm}wd-jpN2y%CM%>GBdAbbt4<5ii`wbB|HJ=DqESA?1{USZ+vam(1G;6^h4?NI-E4P zC+WHp^}$+1m+fK8J{Qtp<7;DNV`F*?$4A_2*&7q>k)~7~V?7hbo1Q-Z@ng|X#)Wa& zMe}QXn2LU_%eT#ZNxI-$SGVqov^~vmc1zpU=aF`1wtHW=`(@V!SDYKQTx*HCtlfnE zvd=gbX4Yb@ zWi4vET$@#T)UCoVdF6gcsEXan&U<3OG_>Of@gzg;B6LjL%FKSVZ=rO&SF)bCmSyC2 zrv=fwoyDa=3}-5YdWiMTT*et0mxrlE{1~$B)N#z%7k+#!bsdq;=k&D{QU)2bZ%jMN zt<6*22=v2q$s6U4NX}E9F!tY&srR3_>*)13HK9CrjmE7w*?W$-8*lH9j5PGw_-A$N zMuHlpENeQ`f~}XVDP1Ya_8t1L&M}tjeXbVtBGZRJ6fvD>Z4B7wXfC_*e7Uys z(uUb*t{-2*Uk-c{-wrvuja*MuedmfbpSbJ(&E#rj=5cdS(Xsw4u36g}AJfc!aW)Dq zjYqMR+mv_Egn-g>s_q-?V zGP;j#E_S7wD}4@Xidu~N{C$}BnbvyE6-7U$Y0tH_Cto`41F*kdv&qNzr-=;R)Euwwb_O4j>MAN>=X7{J%+?+wzS#ayijY*ms9w~fQ|N_idJMi5vRknI?TB$unZg`Y9~C0FgPyc_yDia%4{< zeaTWEdI>?FMV#NKqa_@yj7pS{8Sc=CBueW@>sa$$>+W6$`^A-ft>*9JFB#ExjV|4g zF71|#Pi!5xp}(=r!c|L@HlcLXAR=R|Bc1iiR6Z?2peyf_)LClqJ(k|H z#DWEN7M%7Frqq!OYG#kwJJg}B^fOT-bjzJ6UyUEtFhQ)>)7_uWq*rgHRJcI-Z_}k5Qk+Xj%*9ceQNh&m~%`mFZJi-(kx#M$V?)D56$aIcFt(a4GPM zk8$c}tP6=x(z55SOpTYTy)ip=_tvqSC(^~Tlf8Vs&9D~4jgGq=Y6WNIl&NnXX!#$NrjrY z-$-V6l~puyLM{r0Bbz%WOcnTji?!vxFBaB%*xF=`ri=F^f5^(G8}F;D2juy-B==rp z%jX&A;@Kk!`&Ih2bX{Usy)K#`*O9H`5U-`9AuEOMa#tdKheV!1DbGNpT)o=(us+tK zSJi6RYWA_3)~=ezLUg^x@|w#y#`>_PSDpDSwh-5s#nhYd+2~4VY0L1rYuyX$UJvN1 z#hTro+sbwN#9e$6Ns20Jt+ZEv7SGR#aRlUlfd`H)(P8J&_abSuXl&y>R2JJuO*A`8K>iD z+qkPMR~s45LW-tQ|3)(MoGe#@TbyFDQiEe=L>8 zYYMwE4g1Sn)^j&T*4Laa%ZNr4seC>3ZCbZ4TAAh4EITi)ma8;v_vOYIPi5=Q;4EQ< z)|_LkcSic1&v<{y$f5l0=bv3d#us+U7-t$Rj#yP(8b;E-3`kjamF@BScXVcgVoeAH$g4ns^u`g zVR6mcsXw zea@c0Gg{WhIw?Dyd(;NwyE7aKjz*T6smrEkYjWus_vuNt@nr3sSKr^PSZCTENJk_#p6ecf^>Rg~?Vj6ebU_$rsu#GkHf(bHEBpyzi`pAyt2>`- zV{O)L?aY@4yd0}6E?HVE`~x$@YRvBT#8~?|5RP+CEA?~a4$RUP8_Dl)J`vv*@L2}w z$`w9-gYdx{LN`Iw6V?)A)$xh)vNro(m~V5E3H!k|nXCRV9LA`g8Wn_tkz`(o)c!zI#1;2J^z(XR>;0RJ znu7jU2a!n${{-x}M2+9DmZur~Fh7jBF<=(yVG`jK~S(H4c*s7$ooN(qRawmGvb zE!D@+=Vi=h%4u>PgV8{0{YYEc4$e8~T-ymuGE)M*HVlCM612#L&HXGi+C=UM{v-S*LUHA#P(U# zDdk6X1Y^lsHP(->Ye|rbDU`3ahAonD4%)A^SRGc{7?h$PrPlGQm7B|D`$tP3M#J^O zmiQ0TFxBX&Jvx8b&M}hCw>aKL#%o&Dk4Bgu70bmG1M%@;YQmIZ9AlVLM{6K#Y6A9N zv02)!%C6Va-vr$(@{F=z2`q=D9gMIYn44h94@=D_2UAm+ciLtZ>P|bT_J^f@KK&PO zKG9J$uG1kt-)G^Q=0-7UWi;y;qgrj3ri`c46dIrJdWr14=aQ_@9ojmf=``B|*B_;V z@RvkR+h8@uYePsz&5fRGT}GNf&vJ}zzV(EwAb6N}e zx;2##7vSTV6e4V=OUD*FzqpKXv5nJ_h98K<`J9%^m7`@$m%W#4Nw*3X{J|Tifh2gY zhd8QYvyt6SM}7FP)-0oEBOQ&Rjb`AoZXLgT*Nbs7plFY*+@u@UGr!Rb)A>+#pN;`$ z0DI&mX5;K-6cxFMce&6(rF=jh5sa_1;Mlz$-Rw~FrQ?Y!XC)f8T?1}lc zx4f#)T5h?_osanWjkI3!<=Xr})4i~MjJOb0#^2mPQ3@={%3Ucw8zpt`jYiEpg!%p_90oHwZZ3MI@N}5n2)XI z$Hb>IO{RNqlsXxwxp}oxHSGzYdpYP{)^lmjAvNm{FOS>dOv(@XB6klTj^439Iq>L3V5KDFU!fQs&!lXC4`vz`?@|yyW;mZ z-wVsta$LDl?FhSeh>w1a3sbP2h+zq8m)Y&q)_tuh-xcLaX;K$!GSS)*A~|Z6q9@t> zMl*DFHNHs6Hg;TChvo7<)iA6&X^Diw^lqfk!Z024T6*(o*!9WxE2!IY`L;-&t#7>l z#!#G^hqm6(w6$^T8>_$<79;C3ZPt@Ttx|@KNXK0g0o~2>F;|o_ZPO$lO^s8cE3F5v zJ=!YeM{-`sFe!{p>KG13)W%Os(imTAM|{meYqI5w$7c&sr=M)CW*lW}4na&~Ys(z0 z%U|BErEC?eAm12Uq+=OcTIQ88jL(;XbjZ?dv^}m_X*QxA(h{xBu9+?BjK)gSerPCv zIl23rKi?-2o4qZMr{}Z{6}qgGeG&>>k7Y%E(Q(b5yYO}zU6!t&l`@l(S6U-2R5)g3 zspH<+_PqbbG24&X{ytVM_?qBvQYpMAe@ZEDXu7qns%Y5Yh<#@8hc|r>ARc4u=j7Ha$_RHodhg3A&RMIrKsjBtXwo6!!D}^k!HX2(U zFN-r5W0S1Yl^E!yOifA4&AuLU4SrE;%d!q98FJp5eW;bNKJ`U&TE_&}B)#^-QR{vG zypKKBUV5L7o7HIZ$->!P&28hAkp?3cN$B_5%$|jD^lML#X&Ss8-vGAVAR0-7u~NRe zy0E`CDwfN_NjG~uR|=(@NqAM9Yl3gc))VwpBNjGZ(Wv+yCfk@lJUCWDe9Sbb>dGY@ zH4Nt~Gc%SN`)JP0G^#)N>zB8m0J@9PRuWnp*#hUP={xVTL|vJ~b(kwP*$Q8*+tE7g zeVApGcDbs>NJ}}^`Pw`fYt>-aC-n_(N%p+8f!<(f`ymozCx)Nu`1Mto)0HM=#oF*~KLI;OdKri7Zcjr`1SZpbwB zC&%5=C-u2{Z|UhWkA*G2g*)b^qH=sbU$$@mVD>a^skfyUw{1%gZW`~}g7MPPlNFh1 zJ1cAjdlcHP(Iw}tjjKYd4bDmu2R$(LC)%ud_-z6%!jjrZsm&2dx980>24P`S(#8^iJ@?&C%kE}n^zDkW~O zTiser*KF3E>TJe2s>jHzF-#MQO)0!E()Z1HPGLscDYc?fY-N|CX#I(Jm`1 zz05o#nuRV~&i2YR&MY%jgMQRxm8cgPeP;|yQrD-WM)lqokL9>&8m7}!VOX{KuDMfN zjJYgjZThEetu5>$>czO&sF5xSvhV&%pN2RhKF+66J=;wg-1Poi5#7jMK|9!GJ!i5F zS7l)Uwc~Xt@TrT?yugbCFPnYHd0n!GF>uk>5^`t z>3qJmc+yO|HD--Mm?Lya)*0<{w&x>Vx9jS+u-J1w$!xv^TRwA&#CF+`tNH`BxG=3!<6Op2(_RUm=XkcBEAv-ct(9Ci+-MchGv?1Nvm&~9(*!Al`chHZMkYxOTE>hsi;xgUD!fDMMvop7t&Jf%3S$G^|l+cS=a6q+O6wXzIGNAhY=Am7bO>z@AHzXg-joB!M>Yb zl&+E0nM^K;*5uCjhULsk4^Hcu%AQi?+HXBycV3RHHs8u@YmB&#ZeFqxC-mF-7tsg* zq862fa780m({*wje0?My4~26e8Iuf$X+wXQF7zYKBG!k#w1Dn5#^FOIpxdOb^vT5p zZPRjOOeB|-qN9S5iF!f0*&EtEy>qoMefW$1WWpBd6o(ekZMO|=N)8`Wz*wn|1_+h8qmIb!W)x+s5C zchHI`Hd}6_(>l{%!FNQB%pdS2U4*SwuB3*j#3(m4NEOCtj~Ai@J5zbOE9EU0y~g+7 zfN)m2;hr0CRlcYxAS+ybi|8Y%MNW*GYAuxMGJU8OUSyV28ZcrFIb(C@D=3EJtP=X7 zUZJ%XAGr-J52Vil-L;a6M7(6C7LD{-Mk*?W`UWY1SAIA%NSEvKi-GMbXZdzM*nbnJ zDxn*3d?Ymv4K8kvhBHScGdLnBs_x)#F7Xzds+ z`g!e$Eb4ITwdqUSX5(7~A(y@(qRW-Le+HubxA|Z+F%s6f$j;d92K+P8HdHlG5Tl)sFdCo0qk&Ot0yP zZ>_X6GY9pVVs*Xx$F(iz;5S6ul&-U0&;@HF=W}aWdR49YIpigv#tTIxV~N0Z;Wh6Uj>H#M`E!Y**!*E#`lUZd=RjwsUY|CLdDu zcH7Y&a;zvi)-`;-EZ-i4Y{@m>s%(7yejD1Xtj5@9c{;}VSWa)OjkR{Pwf`5S|6?Pb zWX#4l2xQyfR%WcqVz-^?ztPoonRF?u+*R#1^E`#q@>@JHC!ajx>;#tKGh?N?(9NJf z4X%4*GcO+M%oukhkFLwIb2_@ThK`ir)4nQp#5*FMsCcKFPvj2hEpT<~vDs@m@(vcJ zv`-M6x{N$JXDe}k0OWvEOHpY3ee96)owvVMb50s@f8N^{oh7 zsBO)R^BVe+sWdjO^&#_lmp*HWmBz5wTG~dZ^D%Ls#`{#}+lzcEESJK3`r$RZSRT4e z%@fs-widWT7vJ)7lrvNL^kE$Dmq>}HY?7t$`4n|ZtI#V;jn`}SWbX&H>_JjOUFf%T z)Y*qV6V+O(OqY4GOYWFL(zE_#x=c+nMZR#@qsErw9b4mJv6-%tGMf{k@;$*Kxi7}m zNoLNtCObu+X0MF7??LX~=8kDUckaBoV|=M`U;Z5InNOb?^0DfRr?8wpm1#Im-XHo{ zf(p|#%H5Cg%{BU@YXr#>e4{YqtVGu7{e}D3KIRQw4S7wYi#L5TZ2C+$Gi9d6a^;S( z6iJu8G#!0mn0g=ULri1o)YY6m#a@?BbL-V~Ohtb@PGhO1kcqQN?6>N(xJ*|WCR1(0 z>YnW%^Y4{fd`Uj+eT-$uG~T}#Iu(tjzfn?#TE=ON=F~JkU8avYsP!=nYbkn7#>HcO zYU-IbyfXaRi&FCT7^kMa)a!Ar$G0BeMmZZY1ahg9+4$b@r)~cyCjZv4ZA>-}cbJ~VrR&=yw|C7^m)WiP8Lt#vIexhq1`jwohA6CZQz5 zVO&1H<7#|`txvxPlzBq7bMY-gTi0!+d22*hDO0O4T-iA{Xxo?K6vi^nMp?%@;<;$9 z#VpVknCsiq;AW!N{Au~veiien8(uZut{TG-N%3kv>L{w$7_aj_tjLnaUzt{gKBlyF zmiIzK!0Nlgj3;CzNaFnD5=(W9V@=v;V>Lg{v8Ijt7O9Ud(E7D4;nmV=eEiCg=HyjF z)Tq|y4CCV3cpl5=OHiNblX+itb@@~cQQsKH^kH0Ke$CZhex@qC^mt0m%d4%pw8i6F z&lco@!k5Wx(AbD{VAopDC)K;Iatj*)qs`Nk66Zax(3V}7 zw4HTFbRBWW`WDOpvbK5PS=$Oun=Y(1U8z3V5g_dZY3#K;T@4Y-Hip?;?&w_K$(zEp zTX$-?&&KT0wcGbVzkOtw^?H4m?~@$?vuRtwy+zZODd#|xB0183PPC@emP31H3bN*z z%u4Ly`NBpAr*6eQ-FlADGv-4`IUqed#@ch{%DqRd_SG)C z{me(e>^Yze&Rl&Vc=uVii@VpQljwnX*H)_RU7)L@wI5Y z)@^=u@jI2M{)Wg$o#u8rzBd_^$JRB-`AApmu-L9L9wJ&LYU}-N;D18$swrtLf>t@wA+* zO|$)UGaN6);x$JY$2y`g-+y%>x~3PuFVT_Kc%`gswdbpxjj*u> zJMuTia_WK|<0&W^(`PHTewT4vtF6{-w~j`<2i8Wmlzl{4$4L5N?bn==MtbGaxID>n zrMIp&8#gUUMn}g;uB=l;>eaFHX{0rpLP}%X5~BHB8W$JK5!GPzg*jZ^`sOmm1;03w z+NEDn%T=do?aDgbNQlqt$F^sY#~rVM}YSk15n=InB+J z&)!VW(&jw5GWwS%Eg8QG;XZtPj4-&8CFsijE3SU8AvTRzoTzEHO4wO48DB~f#yoeK z9e1QvU1<;92q@p)az`84u&l;lM7srL+OU%LglVghIC~ZgrWG?a@~Isw;WaI5^31bC z*PpJE;v=xeowVFHj&U0XSrxHKo}XkM@Eszq(zId9Y+*gycnfXGAy$00vtsTB@w)$S z3)SSE;ToGvlMFA+TSjKA@>Tl{cVP1iUs-W!!Nzxp5T#XvuUM?R8e?iPAdP?(1Gx?k4G7=`Vio~2kC`n`m)VH&1pSY4k!myhX^X?@tr@tTD}defTA zI0|!7$B%|%Zp$kebw1Ndp0Hwkb$t%_9uJP>9pfuZ)uQD}!bp)^r>*`P*CGx3mRdaB z%rutTQiUnBr;IV5#xfMj!XTu6EscK5ZRstoxzxw~8q$0|w@>4JHHmte+G5SE33Qe| zGnHv9m%6-q4bs4#lrQN!#Uv!4U)6No!I=c zjx)EuwR>FatK5ep8_d?eL$A~MyfBa5XRFiFXNzlJ$2!|fl`D?=aS$kN5`DXX*UG##%JLkouJjvK7hMpj+r8_f@UvciIy(oKk_3GJ5_48F1TCEo6AA?vBRnQ7XOiI1{{ z;x0obtixh`eOixQHLa%fsZE9!;m|eckj$_L`>68dtiuCfiC&qNJDo zY{ln`8f)pzcF&O&nS{m1UD)lz3A(n9%abr$2bAv`w*y;`bwn(rJ&O0#$ElAa;Ct@# zo6gc(jJe^+nXWz8@`UNMey>TPJ^Xmdmdj$}DNP%;S)EOklUhmS@&Xw#qJ( z?pN>&1-LWKE}I z6pmCX7(q*=F7w7U8q&Y!WihEBjrr*^)vUl(zrWJwQ<*;{I*U`6sm!N-4fC2x2-8ug zF0Z~1>`w;QEHnspgN{yux zjkVgBkJOSoC`rrHE7x9r;u7b&CfZ|_tg_v0cAM6F-0Ul}o{G(~>5{LfODahbVpyHC z^9{8jTb9B(qqe&jr-3!-mHmxqjsiyrR~QxcAICCyx7bUiWMN!2=aoNc6&bk%Z`RB3(g zu9sxxY;~!gowJfQwz})a>2f_`Uoa{*T7H~VqhX89?=o$eA~QsdtD#_*B^Hp61XJ?S zlCu$29nVZP=>?FuwI;bLTW2lT4gu5nYQ7Rv7`Tb`XgUxqYn%xI(LKS%s(wO(gF zErt2DWY(_FuGXNR7#YvS#xm4o>U?bI^W}J-#m8rgmdH4p6;_Aw*L+^v?#%FfGui4n zm`qiYWHlVwEuT|3D;B=dDavSP?zqO2F}z12dv#xRd$OhQY?Y|L4hc@nBxiihRh=;T5ZVBIC4ZO7B<#O*6+4@e>+6%m3|62#mR-COS8mR6yRKBns@JnBWW}L8v%zEi2IXk-KO6wJQCBtr& zUv$kGzdN8zy7Bv4wP0R7+x&bzYon^J=GXG{_rqK@&_48Hwan;jw(E(egarQ5xKLKT z`pKE$WLn8#cBiqO=Id%IbT+iZmsDp7**M(=>D6YtF}iCoN)btpSw}?vR;k);F1AU! zAvxpeZ90q{;^u`}t^b=`SUJ*Q3(?*h-JGNXzLtig9tw#j!>Td8Fb^m(wWZKFhT9Rd z)y#B^!J1-Ln$6YTE|gvyUFsHsEhV&Cv)=43DX)o0dtXE!WVtTeZp*(cOZ%eBe`dRC zd2#!VGYmuibWAOCSvfJbY+Hh^j;vle!aDZ!nNTxWVoXC zTAJlC7ypBS?hA-dh>*`lHPk6hCCsa_ULbRQjdJFytn0IkQg*^|t#EaA9w%#r&Gl@} zay!B}OzYY5zM8@vU)aj3yg=qUN6AJu^bZ!jjB_tcix> z*Hl!JPh~!f^RAD9FR%U1a+XWV%GUUDA6Bid(&1X|EL&L%_tkD^ws`=$SPyxkqRo1% zHKyi=JWVep2SuXze=NJv)%}XBEvsEG*gKAmaWzK9LtVy(DJ(Xd&gZaHbmJ+*@<_}`(I186G#-T{ zM&o0tBt3hOU6fv7SK~TMs9Pv>SG!S@6AP`mg*N?i%ge%+d;`YrZ~MoeWsrt33jL<* zh-)*3Z1>=ljB_&13Y>A;W?>7u@v#r7d^-N@WISnYp;8U6x~_N)(+y5?M*rHQ%hB*@ z=-2THuV%9(>$sAw2>GsdY}deDBfBpx*j8sxB3zrvH~d#9TfY{^>^3Xg@zEOm>9EXJ zOLo3-ExG9@WEl6yb6AM$lYVlq*GiI%L#CnM_(ra?TM~X*YzFJ1yF1pkIp5ieTu4d( z@qQ*dTgK~s6yw8LLYs|NWbO`u-Rf*jq2Heey5(p^T-YuZ?_-#JjdB=6?RbeZrr9)P zoC@reG)+R1=3gzWBc3vTiIASRWNhWRN3svfL42 z2Xth`w+AaUtt?KovmunG<-1vgonH5f1lv^F#)@P4d5}0GPo>;(jmL+f{3&L-{Ipx4 zn`bAElhu&&P1tNmo98MyJ#(yuEYGm%J?4+Ox}tWJw_Alt*66av1la{LcV`M&j?d?T zs&7Mc(Rtn8>{e2A@`qn2F2cXwf7`40v_CWt`_ZayrG1;v_^5C5IUgNf_TfuK2>tm- zJxYu2JM3#?_cY8Z?lX4JZAE>XyMM%V$9yyt*9{*Pl^xj1@W&q^c2M8uHfZ*XruCzu z-;CW;1l?ZI9fnkgL)W*t_@iQ!{~!BSjmGCFe7;wD1%20E(OmjB`;PrmQRyRB^e8R6 zf-QJkYJ2OWZhaW)^KswipW*Y~$K6WHnt!mL*U7l{Z9e;tjK4sxgZ}tc_`fUuA%E=K zJm!y2&F$4vJFIW>-yt-@g^G5bS9IIzzRioE`N8f_9i_Yow+=A9pJ|AftBj#~78DFh-K{D%3j(`HplUtM^jL)ji79 zO>z}AKlTw@zwcxA=XLZo{V`krEtK*XC}jsiEJ0g&HZTFJXX(snjVR)>8}p3jOz~2n*JPV4s4~J%#bo~ zIG}d&$Pu)UM~=v_kLJNLuK)QF>-ra1?&}|Mu3XWF^O&=^FZ!`Xbl>a48A092AOCR& z?ES(Yt?JwSl*ElgdbNe4k^XVfjgHDV9J)HujbysR#z`srQQJR?_JXM7T_25YX}jV3 z%}0E(SIbqW_G%ej)~n^r{{OMB`P!cS*uwih>{eFP{O)aoMiezSefZ#eMMthrKXqhD zy5z|7R(C5J`I}J{4nrJyVMut&36!9PMXN>ZJ7*nLIgCDlV8J%`n;=x>{^Y@S+F z_R&l67Cln2^j}%mD?(`NfzlCun@>Y2eG_%v0Nu&4x~ic$Hc{7=iMnpuv8>`WDgWnE z{zC`G?z!c>zRe$fi1qTrQ6sEBBz8W^+xcPGn{%Q0PiV-)dNU|dLokvU-=1Y{E#F?r zQLC2u`B$j#qbp$lsBgWL(lLuA7Ym&Yd(D6sipmzzuiWDw~M7rMmuJshF&e_b?e)_5usTw zbl%}bNA+#~Ei_Z9`C#cxo83=*c$n-0Cp<>?w*4o)sblzUq`gFP_wHu1{vV+mCAyMs zT)8=}56LY0*ZpjF#Q|F%zb!rJ*Sxxo`d9aNTlJUw4&TXsZ21-JX6z4Fo%g|4$MtRQ z_hDJ{*!@Li=QYp0?LYSQ9#PhO#DUT)dbJdNvDXLVru6#YTi5jZ;J!2g-QQz8 z4!ksPhxY72iM&`~HwR~>EP52I3kAfAdzUI;+@9XwR8SJ>%2Mt&BM9fjh z@g=y&-1p`Cj=iti^M8%K8nN%j@@J)!I)||31EN^ViXb7bNsZw8NeR-M@%#DRj4qHIzvI|9PLW{1wLd zz)N3Q#XkLT)s~T4E_$&Nb@tgZvJC5>*7pmk?{84w;{Clo_`&$6=JsuV7okN6-G-17 z_%CSgk=lMR{x-4Ze}(2pqPblH!bva3(z$o7o?Fo$C*5x} z{|YO`H=2LbrnCOfq}C7j;ru5px~dP(e`w#466!t7=Fz45uj20WlN%z2EbA9-yRnXb zqxs&pn@(PO^5dxQxmR?ocgdW45#_$Mk8EcQ!>JeLZkNyt$5^=op?g(y&p~&ajL#`( z(>I#8wkg|hG;eAn+ix^q-NsdV#(AvyuYOaq_R`VCrKK~9O0SsFqx2tU3@UvS{(rcw zr1T$VmX7Gxd?wBrr9V9U{o(dRshd%E1NVnM)vv0p;!!1ACS2W{1 zTo1qE|LflU)$TisO24r4i(l)u^RPZ&e6wh0_tG!!{KD4`+u5xT(v^O>dC+0qx0amR zV{7TD#lQLc_xjv@_?x_T!?pD8qSZw>Nj!-Y#ck>0Bk#cJ;?Jl#*K4{Rc?2~ldCg%* z9=>Y*yNBJ=ZB_I7qS6@`c566hWYJH|rn;?~ap9Ln{&wmykNtM)s6YShl`}4U?&zY@ zq6dC`WXYRFZ+`VRhw=8Q=zI5GHSFE{|GQ$sf~zWuZvDcMe{tVoMTft5Sm`R937P%Ip~{%>C9~oP zjI{8?ONOUPD<)2uF!o{>KVfX?B@>3FCb;yMT)>i~Sj#VYc`4#$^!XRKXcs?WTo@iR ze9R?bIH+FJPrRfeh#x-vs?xDjN+(=hbAy&YZr1m&nRVqf)>K+FX6$!{mtHXHlJnuF zE-Nh>HKnv>@~o?`o?bfn``3SeR?*~Zubh6()iviz_OTZg4ZptTYAx%cvCNN;bY6N* z1^$&<_tEhSkxF$4Ts-{J39e2)WmTUO2>@7U^vQ_*o((bD7|br z29I@JFnq%B^Ct|y0A2}~x}ho8@VL>#hg~wfbi&w)=Z|FkgptEbFF8Lod^k`@`Y8F> zi!>}PB&k@uz(xMBcqG6-=t@Tn8#P*+AZ1u0W@5an!%Yy$6A?wVNOS(!i!VkuN(l;K z8N2f@J{#>W9e2JkK>25tj=lI?M7ugT3z-{XFw*!DBbcCwN|{cA1mR$Yv7cox?|S;t zPRPoqH$VO6rlJ=*DX;dwYT?)KAJ}nOfILr~**ST0;6Hrp*f)=B?ws^)F51_58GGOC zakpIBIr-%k|I|6T^y#^~_q28T-_o{!X?wbpa>I}R{`8*>>A3v$ke~gL;&~Z5ldA?9m)Hx~s(YROM?KIxDHxEKy{cc;2 z&dDEpyxD2_&tBht`>XppCx3zGNu9UfGsk_ksI&4#ZVsLL_fO|_p6?&qo;nD=4F|#Z zsZR6#m#=i5@Bi-N+X3EPd<(bcF8h76K#T6O-@(ABx9sB3-hTAy>BsJqV3UFYZAJ95|l+qM68 z?Y}w)x}INkJ-^C+=IT0Mb)B!e&R04Ix}I<3K22rDbe*rd&R1RMtFH4^p(iU%*Y*8i zuH80M-}QW>>-k3JzH6GU{kLoX?b?64_TR4kH~W(f)pkAK(0kiLu3h)Pwzn4IcJ04i z`)}9&+qM68?Y~|7ub%^5&o?rkW8~6wJ>Mwmz%S0u?E3vtfxkEFdcQ8;iX4yYx<4x9 z&PdaA-5(WlUu0>z?vJ|ekGk%Uy6%ts*|-p2*ZDcuX*pBhb$;$TKih7b>2~eEUHfm> z{@b&_)Yya)qfBoKCh_7q^&9&QR>bv&e zuKm|`+f27>|Lxj;yY}C%{kM=^*Qe>)e>3;lT$--^_fKK}o%nGse(mcsch$l*d;Ti> z>RX7`+ha$4|M``#Hh;B~e;@d(9e5ijll*Z9@qUi}4+KS>_&4mFE3X}M`IzdC%e3lm z^jR_I?W#Ld!z-T|dVc?}_4%*Tr%(7Vh+IqmtMu?bUx!@K|Em61mH(oA!_cN-Qz{=$ z?WiiATs--ARWF=dGNAsH+LH#HbmW)k9&^nx7aq~~i0&d^JmMOJ|Ip{iQ|eFYHDJaW zXHIzhs>iQ-;Csi8e(d~S$TQ%i3%-28NtCNj`kPaJc}kA~{mz(rMj1X+&p2xIwC_E7 z)vl{vyefUwqu;y!djlpsa{iD1*OW7cpYinphY#Rq^VIs8>6x2nZkbs>l~R4>MOW6s zz5nhfR-Cl%e?4>3x|>(5U2w*aKA8Rf%$H`qKb!K>?3ZS~JbT8>C)Pi{e(I#DlOFG| z`^1K_RQvXF=u;fEaObZdtsYkVPbD3dqN3G{?k=zFkAHp2`jquA>ocGdQi=vnqJkru6yyi=~ZK@rd9Q<+&F9*Ws%WG0|YUZrD{Z&ZA?R#!Nd(qj8&RVqRo|$uYT~|M;wyJj0JymyCjY>@wp*y!y z<(i5ME9O=#s~m87$q!yxbllJOF1h56$7*_AKCkln%6VC3bj9OqA74AFVpJ#GR{ZZL zpT)l`&)M|rqb~1E%_A%4*L3f5A(&p<|5{MJ3sjeb>N`VwRt&6|R{3bE*W~flvqZ|P zOD>!v<8=rnXe2C-s^#nLnAV9L^)h|{}uRN+^ z)6ly?wG2#Qt0y#_(4)__$Tzxj9xQcS^~{>_)#IyoRXtiYCUsQB#-Vp1Z9mL`evk_> zcaE&MsB(1WqgCUo7u2k-d1X%TJI=i0#@Z*Ayhd62#F869_N6(eSAS`8T@|b~b$4nx zKFdJ&uF7k11!vF|u9Z_OcUG;ed1c8%YmfiM+9j}8v~Ye3?Us)*RmT2G-?Y@gPH?sP z@EYv5tYXK|Pgly$J$(E?@cnRmM=f|~)$-J))H1BWJu61TT4{gfpqc{J@nV6~D+g9C zCn?x!_dcWwYwfeFyk|u{EPH0n%<6HI#cD8aJBQs>j#U6u`-xrm1=nj3=Bn_{(6QC` zA@zb9QoU)>gG*jt`Wh^j_PYD_`)kJ499{jwq!%Wws9G^;Ic#-#)yAr2pbNg0ccrcs zt~-VnS1eC8&lz94XUX0r6KbDadvDDa%%;(m*QZQs;Zu%DuJc4cFEu9Bal7?=|EXm6 zlGTeoUD>_l*(=F+d1_j9M+gt^e|7&&ApB^mxvB(I7tmHGH&@-88W`HDFzw!_A8hcQ zVb@pontVUj)de+}0o5hdV?ci@R(BHZiy6=t>0qspx#e@qpC9`CP}=RZ)T338&AG8w zY!&wU;F2?Id*5+?&FR(O6snshk?O`tn40g*$v92zM1?tX9TjkEY43q}ITDb-<09Rdu2Uc#xYCW~QAI?>3t>j9wSnFl? z9#A;|D}6oo+Fg@&VYe-rJgfSZIWueSuNhxcf<1aO_Sa35HdSGUIeXm*n^m?`QzNkk zlk3i^={3iI>)Is`EIRg%S;)B(JHVq=^;Jr?J-VJPeYEW{f3oZI7+5cv74~m=Y8d`U zZLZMMD&HL@J8SWvxzhKVOtRdOb!Iv?u*1f-@#cB_PKeU9^thnQ#HLG8bv-T8{^GxpVRGa-W}@2Z+ECnjBml|Ro+T!HVBH5jL2aNUCQGVX~cQ%WYU ztQsTdodFd*Ggqguvtn=E35yl7;JMtb!{j@%vKU-PVy``F^7QJ#cU)3?N$s(BybP`{ zPI?qn=TlOYX>PqWqNJv_Y%y`F7SdgL9(L=_@4uhj{gLr4)Pl{<$+x>$>&BtigU~LV zZ^u`UgY260;-oQ^JBQw-C*~8npGdo=wa%3_8+XQ_dcCZ`xX%Sq-VxDOr(s|0i4*j) zp??^5YGozvL{@Mm2HTz2ZJP8BY?efEa*}h?wUrlEa+h6^YQDX3$ya`{4JW77b4n(Q zrP5l3?6lN$IUgA%TCm!q`nU%h$@#KgScvX)nHlrM`VVG(<~i%oKfP$b#G@8^zJ(AT z-v5{7YUNy?X>+tx3h#xcrIy1kr^+2J&&#~W0axgjLEgb`j1yDkF3g1ztlfh^b$Y62 z1@~Q^s6Z85`&Ztbx?Aj(d+IU>S74l;;7;XTtUEpRsJJ_IZ%xCJA@!|1ISE(NSc$bj z*LC42=O~h-r7Ah2YazzYOVw+vtl{$_dl$=x{d2Y)4ByYnev1Z$e9J1@J7t;m>iG)i zV64F$r=vj0@2#*`IWci><+H2-6$5auy9FyZs6u*OJ`Lf~mAES++o4BP^sl@wbr0`e zg(ip!Po9Not@z-nM8ArDSc!SxJ-s?ryKqs<(g&6tdq=rDH<18W0bPel3`9X!t(0v{ zinrTj%rvAWSzQ6J(GUYGM;cO2|>8rI);hArcLEuJ(!H?$H|VXZ=ycR4&c(NZ@?JM2`D z#q*~W?{wa+nqJLkPHS-@b~`M_{!y`5Z?mLBvdS+XVREfcaA$4^)^?$b6^1pC_QBXM zpKm;ULPwtgAAug#{3yVIhS)Xz`V<1WhCuh_Ay(g*c?~~o4{F;t`OLuTN z=2u^RS(0zAXIXq^rFTZr`dsx0PDS{30Bi80a%Q5n_QLs9Pr=Kvv(j2e;l#9QQqOAG zs95Mba$cezANUzw4z_$o%x?mAg6sHNeKIkjcF*lRU9ZHbE7N)qP_ENJfX|J=R>g7R zvj}Bo+-ikbJ+9Q)$~{fAOv@PBtO$sbF6$5*<`t{-{M2a&@%_SU>pw4ib3M!A$%^;M z_K)XhenTMEic=OD@HrMw$~XmARN}<6g6l4%=j5H&(PEFB?AGE*JHeFJ%99iK)@yNU z+F3QGy5x>jZNs7m@N9Wz%^==sMO^vh3HF6iuf=^7C<#;0bv|f?2~(JO%Tx`+#@y1- zWw}b1wU8=#Qgr84|G|BK^m$pIvp>tylU0)Mu1O`6<#}$!J43m*@`)txZ#GrEJL#y& zpel5^{?b+{wAYRJerK7xgQdlCCBC<&rgqUHK1MHnc-7;A0{F)TF;zYb;V(o%CCBk(+_BvZD zjfqmE%?i`NHFmXNrm2~h41HeueAx7Hmo`dGz04D|0WR69Oh?SYd_VYkxj(Ws*x%=J zJ+@Gs@20A2%AX&0MCIK$NplVES*;e!(~?>$&r*6GmUX!D+KQ35hrJeeIwg0^s@=Pk z&zx?=y$(*qld!{LeJ59rZM_h2RMju1W1~ybc+Y}swZxK)C#XJNB^}a;-=&zAaZkkB z%zl+J!_!2|Jzm)#jQxH-o^Oz)F*K${MgEzU#W5ZC-xXEi8oWtXUwz(0t0h^X3tPRg zqTjjK;yc(EYZflLW$i8XB)j|eT|$*3s;e;Rl9+G>&w-V^&*GC1a^**^q^7ChGG4Fr zg`##GYRq3B5U!Uz)8tA&?RFkSuXYw=_+a>cKAum8eEqX5PddqW=XE_NV{etUSMG1X z97I9(uFB_A%hX=aEvvY$avGjX9QU*D)}K@V_>w)hFQ_3;eN|@7G*cc@IWeh0G|iH5xYW zNs*=x$MvY$3CmzvmXfVtKI(iL?*8>v6KYT1^3`3xY5M2w|J>C3AozZk?_Y%!L;uq! zgrQ8n{rSuh_qwN5-#4dm>GAcyT0eX3YfI0nT~PBPo=otp!jrH)Z?cgym!k`jQ`5ZE z-10k0mX`GGe`k4d#n<~hbHX?JY=RBda?D|sF0JJ7bQy~nuHF$Bq>o62TGCTtYL>^4 zcQs@>t`;xPxoqvvw*Te!%hunx^ufAcZY`Eu=$ zwX-4T)NfnLZ((Vx93@$Y>B=~Im*dZP$5!}qG>@!!d+5|kT5D~J7TmW_J<^bHt+Q9A zl3dhCewI>;kJ%n$r$IAK%4aQc$(#wu5v}?xh3BXNm~rE(A6)Y5^(U;|z4-p0?_RU* znc0oAH$1Sk^ZW1Taeda4l|MZv?RRSBkorr(^|htP;b~$?b;wnoB;sy|Tt0mw%&6Q2EOs_o2I8K%!C8_Di6(zHNd@m1$Aw zoE6GfYtb}DoFS6*DTFK8TCJ?Ra@V8>7M=XNzuxxO+rGW+*BegW{;lmlZ9HfFgLN}* zKYGscNo5D|{_|(`eB;VG$2So(KrZAXn_Wi zA)x*z@@mo+B`S`^LG6Eid*?JMv`7h-J9j4Qch1@GbF#j(*4}&V$AQ~iUmo+*8zI~y za@YEMvfMluSzI0(5{6Cyux91i}^dFzx{K ziKu*}3*VC=oJ+AZ=To!F`divDW6P`@%{Blrs36|RsJ@D>~%$=u+u zKte3Vgt5xi^j4jy>!HS-*D617r4#=_kUcZa=v&6Fyu`+F1^ytOM!0f>*_rM&gYK42 z*m|`-EA@Q*?@(HhRNySQOT@!~A>kK=DSVvMVHc$(SNQPeS!zY1I8id) z`c_X4E5$*GU}nfzgEzeXfXgqxkANudhmaZU%E}Ixil@Oll^eb!@#U?o%kky> zjGQ^2Asc4KXKZ@+x2N!YE1|AGE0coyU7^7VpB)c0VQVb1*CSGaXVbj z5e2&ZzL9zqF=%<2S&3%6EsUb>%5*hWAFVJx<6Pr=&wqz^wQamj>fZhLPyYVSv1bX_ z&XC|A#~0Xw z??4#1g2Ui1h;f_Y&0Ne+DTO$oLb*n&``EYmIKHh!tyPJhIFU)>W>&3Xa++&P^)c=c zK{$Ljl+5qV?n$MwJB07eo-3DH<{i`@=D+NE&HtMJx4t{PQs>1T-~Ig#|FiDnJI0r+ z+OhiGjmWWuTt#y>g6&A~o5hhUd~L}63evsP6%tQ|2l#Rce$v~?^pdlSDOK*4 z0^gcU+!2@pP25>PQn=ziD3|Vr`|x;rZ?H1;9`nz=?*)G2yX1brOD!p~U`U?ZVA)PG=GS!bR7*#W5O5qtCg0PrK6UOY<+07T-McL zrty_@P&>!baDHqAUjbo;EL&wFpvtddUWa*Zj=~lQ0IhVI>z<$*Myo}8$;Nn>I3xHD zGk@ft=NO|eAe%=etxN>IOgnJogflcR!FMh8x;YkL`&<8R_dng2D(1Pz z+m60^uWj|awWaeab|1ULKhNF8QjsHPH7?|qR>RQTY}CA;=?>)_B8iSge%DEkT4$MC zmbP0qT!!xw%@p~5W#hC+5&a%ud_SxYxeO71BWMaP;mTx-rC_ZnLIQG!7HkcTDPW#$ zJni36pkOO=9pzT8pJk#}qSMMw9$LYoNLRI!m6Fx6MhSdDg4RGuz*ZpKlc&gKPc%Z^ z&*-!M%KIMKk_Wi@+xnO6e0R={E+un!Ossh4*rmU}QZc|)`|i`W&u61G1#P@ZM+d_< zn`Ru{WxU1ETeCUm{{p^OwydHxbhIst<7*D{8XOj|j9fX#iQB|);fx%>H9>`y{b)HA z)5_s=)p^|tNWPQmI>t6~Y|fs5?{HD4pE_$da3- zp}UM!_ci!z&-q;bKhQWq|B?^a_kVX)skCDE-!C1zMD3}aCB70LSuyUhmQY)n+EX+; z0WGRRTK9B-d`q;S=Ts1~q^onXV${z!Uw#|*dZUpQ+>sQ(7ZwB{CvcY|%dupkESC3I z9ONFMuBMe_SSLE1R(IFXPB;mKYnuEypVNA0=%HXO^+jLM^zkgB79Q$fUIQ=ljdQ%> zikG#eT^_Jf*vu?Xgd-~*Hm{NV?GdDwg{P}JsQMWuIRD^Z#KyIl`>J<{{q{^sfOPQg-bE0WweCcTe~KdgIRqIDdm)u?D;6)DVw9}e7w z?g$shHyoBrwQUF03gg=@KWj-{a=+sGq~g-we@?hgq;~SXwyw5aJ3g*>E%532dG3lF zu^M_At*ByF+X7wE)1;X{)8%NFP-|<6ZV5?rEcR#gk8XDRSwQY`L>u}ATNcNcaT)rT zVT&uc&fC-@X(tA(*2mg2tQ0OFWM&!*6(74E3ZA3YbO)4LPrPi6Z;R$06SdH2=ba9! z3wev>6#=ya@~ab1mX9=d3YNR19>_J#=a5vAj^;Zo098(StGFc+Pl2_HV+?P*NNW8* z_rC1<#C?bN0pC2rbq@7^=8zTRS@$Q$?g;EYCUq}g$}JeffiLP^Lb;fBQ-U0Srh78) zP|l_t>}R$qX9=~Z<7wY3p+DQ)>&@@~UTL#xh-<{h-vd_vay;1?Tpr2f7Aty(Gm8ZF zx57&O1l8?!t8cjc&fr5Kmw%Pzq2N5{ue>j4mK$r74$XNQk(;3zVE@E@URxLFB|8*Y z;_v6}=N;pF%Ae~`^QnCa`VOk;tVFj|FD_v^f!z!8%kDao);^73*sd^s?D~UmjsG{K zlVNlGxI*dzu4H#4-F)d7T2niB%-u1rq)&bpT2qi#psE2C(tZyZNm!!oL#-;(%(FM; zY$kLIb=jJKZG5lZvWlQ9?Bu}lB`y3*?qVZ{{p zq6$w%j{jEEEW<_XT(d-9OsmVyOdoSx1qp_RuE`u@nBZ8$>f1ZKJ4fORHl@AJbeTLKrphChZqX`{XUvVcaN3 zCuZ%g>FU&h|Elual+7v{)o3>)IIN$;=;mt5m4T#bq={=XzsgIMz3sX)c)#86e<(Oo zT^G2+JIm;yw$TdXCPjvNq$*K=oc1~Dr|)W-=a^-9$CX8rt#tVPf34kV5s3`GY5r7y z@YqmyV8;~e=D=WsLG3est$o|}k9?`!t1VUn)rR<@SNx65A9yJAL*Q55m!18s{dY)@ z%{%r9+Q}6YUEQ2J$%Zj!$ApUC1nR!|jsHkq7NH0@T@R=MKhRb?$G*Dxj?%txF_ouQA^pO!CsVIO%81_?HEu@C1EW&_6g{qCYdc6Pu7f=k3A4TuLyH7 zK3rciI~z0b30GQW9M;HLH1i8HVbM+-MYEl0ccvWLmy|3WNJZ}f%@S=FgMP;RjihJ+ zX(9KzhtKU64;<2@&8l%r)_&y_`8nF{gz8?_58^YM(p8^Rtvb%MMUzfDjBYosvh>p* z&AY?%tW%-KxX+!z@#g;yJrwF{ro9#P>C`t$l~bEYO{06W0gW--%|{XLeL| zRGrJ*LbhH#jU}y;@(L zdBl3unxN|9nPo1d^0rxa`TkiqAo!?fnRyfK5do}f=)Bv#b4OQOe;OD1H&1@g zJk#$viK(Bd`G;6#rdp6Jfh0e`*I+n1w!LYWvr78^To6f)J;`Gm!sX3vx!#W z6l;pq!(!0S$6Yt8{_Xkv0+Cqtgt+;~0tsx6j0oQhwK>l{u^@k^^P=scU{}+p{*PTV z4cYQ?;uKbYV|0kNS`f#H^kS1FpCMXGBSORE)tL@W3DFC*vtXHahOfP2sjnt*(C>D? z;40DF?s?RCx1*o=QRj=U@y?y@InEW9*QI|UY5lhDZ!WQEqczdKUwJ5y?ObFm%0J}( zfGn9cv?dvHSfCgtf2j7af!6|m@PAyPrrr+fTWSpxy2I5~B&*ZqHH0Wuro&ZCe%gnN zdh7=X>x0UUs_IOPGfY>Ps|nv2hY@o1pG|2E&#?hHefZi{t{vupCp6z?9?gQxqVf9Stkxxb30>^xgMEpy>p(GCWD4nu(GH-D z9oMGI&(Z32HLXJ*rYce|R`(is+`Y>!SIgDAntOFk^gbb$n6?;OmO^=po;bKWYhbNQ ztZM#|1+C0z2DG%sU|6IZrY+M#Udy3_Ihus13ZGmMlgvtpe^fK__89W=_BXYZP>wo7 zpKX|GH2cNga(}!h&6~D#Ce2CvvvHPtY+&25ME9W`k66!XJD5tfx7sffz9;Hls#QBS zxisG47P<5NOci|vqKwd~R!*bc5IMeEbgxuAKx4ao^3q5*Lw4g;sf2GClU7JLb_^l; zC4?cx*dG-~F~vYnmnjRW?wv;XE>_JLoclmcdQE!n1I@c`8M#1`DGoLi${x zrN78^cPLKQ$FYg*oEA%GQ@ZMqc7-`01!CA8(P_KY&|6)jE!Uzygt|AC4vb{M=E+AW z3rUi(M=Hjm5e}@eQyc1Gv8sT++AvL3q^fCC-6o-JLfh(QUE8-E(YA%ULs#5p!NW1( z%g0#>Tl5@1(=OJzv&v|XtYo4=VjGjz-n8eWgHT0Jh)ZiOyYe$|ZLfOUSEl@2yWL`R zbn>)S9q}*myIsI{(X-Q)GYvD1i59s{S0v-idF3?E#?(q z&v^Q-2N6e_z8yd|bB=PVteEgEQWk2;$-+@U_+B5S-*N@xTPR@N4Zs&O-7uG;M7xo? zI_UN>UDd z(JH`965tEThaZ}o_BGWEQ%@UsedyM-`Ip6);b*2ZupFVzFw64}&1Ei*_W|YGB!{!T%bYKUMtPqO?X2w@yeITX?PTWy%ijD1>n+BM?o}?6^!=nF zU2FOCl9A@F!GoG2%}`Bw{tRb{%i#)Dc-;m^k#V%+sDGTdi|78}givi@r+=3peW`E! z_lD-wJ{nSlz6gBjf5Vq;VEB@?s=Z3Bs-RgR*j%;#2FOTE+Ca4teEprsmSFhqtCS&K& zM|HOaSJn0j4R-Fc$qb*Bj5PLl9MGx6XQVylr=^w3Vrxh5Lit<%&W@LS(xA`p3w#r} zJ-FSs-M_+j)NdhM*WX;Xy|>c&rmKr*yX#SUZ^nlD20!KIU@aDF!5$c0^2l5W&Z?;z3&K)ZG)_mu$Gld)zm8wux|@M zX7NR);cPYn=F?Nn%;w}`enJk}q6^ir=;tJ6e~z5t0s@gU58-|uF2qM-8oGp3LTJR# zU4-xOSlU;ZeZy_?sBK|)T&&q-+{~p`b=)`FfG;ti4(8+UICHs02wXHr%HasS;C~^Y zsO{+emMn~K)xP1oHMq~Zz&gm%$9Fa>*S5@}@I2yO<{RmidwYAg`uf^0xGq?wp0BO9 zzxSwpmw#ethws-^*Zw|qTd-?zmhWImPDz5Rq@n|*-{|tV;@@ktW|3oq)0Q`Rc6ELl zwVew!8x<%Iy6I@CY3s`eO3@s2uY-Nm}Dp)SEA{&TK_esADVpd#==;IYtv;9tBxXMg)M-U;3d z)~6j7-!rwp5B)my3>`Dcs+r~JY3ONQbIY^6%G%j@6j zzqj^9|E{{#b*l*3oz&*NFO;C)?pj^Dnp#M=20I1EgfyXXp~pfKLh}gY6Mm=jg7q11 zfBP!mEXVH&UC_n40NcelNo2CPT^pS}7Gxa|f1Gw;|GI>;#b>6!h;MP^XiB9z>ZP|5 zK}QcGR7r;Eno3$35({6v%tThUKoa)2Mjd^ZF)e2O+!z7~%M@Q3(=e=|@51+)Gy&Y^lkZMa_q2@xM zU+8dPTVSkzd~N5@;q&JM+x#o3wHwO&#^tpV=C!Mco(`=F&1G^5Bwwyo21!5re(kkT zUuXi=!_N@%&xHP2H$~BkYPOz+cJEDDnzgs=)c#ZZKPos-eP+`qg`2TIVzzp{L`Ue# zM0y&v>P5S`0Aa3)F}nypl3(DJ^w2M2w{Yl>=qMZgYa+gl;1V-kjvr#-LF0d47N-XK#1WyOgDDRWrBmSpDAGqEotHoPn zyShI#fkuXX{`-Q*2;cjI-9CLeG%@(K>uYB*&88LW54pwLfo|1D`;P=aJaBZ>*+ZMN z2wky?ENpDF11Q@FVOkyl@*I zS#N1BdpXJVIqhez0!NYau=QMKG3`nRImXxNrpqC#J%$DWOevS`a z<3rB6V|8D+(+r#32i^IK;pU)gziX&n?h(IN?#g!Ln*V0|hkKRpQr+9NKEE_r8+a!4 zjekIJUT6a8>+P0%?QePC31J5HAjPIlIUfd(6qR@UWb@H}@BaBkiDfj+5&JUVtik9< zCfQL{qI}wSD;i%rwYPw(FyGonZkuGP{Knvmc@)9v!W*O$Er_9iL{>X| z--d`rTL?ecfM6RaQ1ms7HaueZvvHlG%93io;Gf3EV^V31fvr2jDo=(tM&bx>%3rA1 zq^S)&>ifdoDLAXPFIlj9n|tf4Z0X)pNec~w9a9{W%>h@?Rbc6%U+V0wKA-bN{-M0_ zo=bHv*Us_2>3q>~+&A8{+WVO2ZJ(0r;Y)SB^$R4~8hz4;1y8-R_2{@A_tfd7G15{<`WSQA(K^XhKSJO2yxTNdpD>WVjiVkaFEh4Z<8T%+doJF91ez^@b%Ky$ zNPQ|v`gF4S7Ah9Ym%B2YokE`nHv84yDtDUs3Gs%!BG;*;6#Znvw=^%+Q*G@bYo{-E z#>o>j=X1{Ms+6A_$9rB0JsaBT8}R94-g#(Ohi>ys2)z_i27Ab!G%wZCdI#M-^mUFg zh72|IE@p}hl|wI2lVg2iE0SR*!PL^Kq<#|cTp6?5B)7MNn^wJM&Q-#GGf%v zB(V%#LXN(@al!g!-Uv0m>x!MELb?|;=^1W8ERblii7!S)-rb>r=6lEYm9L^ zy&=6-p}f^(8KE%*|8c*M>S26Dd6)0Iy7PHOO0RaNVFrDN+9c^A>ZKT-^ZDk3IZx(~ zqA${yO3{AiYuGUV%SQNOJ_+zdjf*pOOf027GGtpXSrSA2n9#z(w1C!@((2N@oft2y{kZmJe|PUd&koD?bw3LZlj|iUpOW=f&&BT)%xXTMg+;r2~>#WUS1aDrhJXwL9R z$9#!fJH%0CU8LBk6`O~{(l-_>36-x0hc z_(@=b_xn1dIXh?b?xi0t{W$02a|Z(1B8hv}O4~ndZ(3DitY71+P^pcD*(D^ulL=F% zl}UDiFEEGv0%yJ0qe!^rdhvajA$uhPKXJ&7!IxySolLH8H87yfS1dJl_KXkJ*4<*- zAWf5{k)(R4_ZZSHQNW_xi~PVB5)4$QD=-=dYv3@F;I=Z@CH5(Gnn8ximZ`3@%C(Y* z#k~xRENxYTWr?1BIcd(pd0Ea)u68tgeRyV|-#4}d6}5#V9ms~3tL`{ymE-$bspnb$ zUtIS&R+?w(#k!o2<)`HzqmT6YC!-Iw&Jv0G8vax_RNhL|MwUr;gA}6%2EzMj^%~|C zL27B{35C%t1(IJNtfv-qhkq-4bJQ43V|H7}rplw4tnME)hGy4lYE7Dea$1TjC!O%7%gsE-7V!K=@_j+2^ft_l}#hA1K+*c^?5dHPbXW)FRse#ZE7n^QKftG zwK>kSx+RvjlZLA(M`mi~aK%n*AW1JyoJ2cwkQ7&Fmr)DPp-rG37@n<{;>`5S36p2# zo~t@lS~%lupLY$KcJg7gQbHzLAgNTIp<0-?uvDVd1@z{B(S6vQd@bBGD0NjgDGdq?K)w z>H14`gK17LWOs7R_}+kTMH2eWq!{sqR)x(6<7z|XYSRYeM(cUk9?A2Pz0wr9m)ct6 z&2Fao^x`d=Y&mSZfh6ix5x$Up4{Z7vlOuUXIn(55^{i7Q>(As@T6;NywqB}@%B32E z`g3hZeU>3jwMfyH?1otB@6}@8GaFf$R^-)W1(L8=2Q(_)ra|H!V$1k|+O~W8ZJ1qmEp;$YC7jc5qn7N=_hUo7&g;qr@ilU=$`QfyghS!CHG-Ag>% zD?KB{&Yky~?8I}_Xod0&6)Z#0%&>z%BLihV#u}iW32Ns`k~NcJV_u=0d@!t8r2SkK^CP^`leNvei^9@E)jnhN*4eg!>n^m$X*Kx$(iriEe zO9xTgI{g<3w_Fd6_yxT~QvQ9|eRSmnS%iz9BcYdv2r*ZtjgArAC`~x_#fUGYE}rC% ztnyS##Xq;uvLWwrF`jz?al4;>hI+PPA#n#b-hkw=2DPzAI*l|aasglVZcsf9Yi~Q+ zL1n1ybNW_YhF(o=b69=dk`&o`NrAeT>UGIo_6@qxu4(z3@^um!VKz)YO|Futl1j&{ zAMoMQukw4zNP-Dptb2iu)rp@M@2C0cOnwb+m)Mi6Qb|6p@CVlTKdqxy6}9u%OEPKg z)m~|35^UqxQDT8)t234IOr!gk=glNLr-^z54Bw;?DZOt4C4>*|;~@y+E`Alx2^4Bb zd7kcd6DUS}feA;(PPU$@2DhcPN?1`eNPIvU(te?x%;ZQ#dUFfmi~a}Zp+e%>=sA@@ zmR^!(JK2>g>44SOCTSzHD|;KJD%MFHR=0A4vCNVw+iz`cOtlTlUs5tf=gHdFuRODz zTqRYd*~TP~aqigddf8Q>%a?@FC5^j4ve{xV52e}eD)CT5l`B~#5=~Rw;d{XMvTL`y zom?h*UVK{Gx;tqF87$+=XjSMI&2V|E?icHN%0|$aZ5L}E2`15#)7lHt(4|R+yX3!6 z|3dyFlogKeU7v30UH{tn!k#x-QmNf=u-Hn>jGc3^ME6iteu(%MQ@nb*#=vE)pCd&k*l zD<|6ewUa+$C{0VIk1Z9f7+?CV>l2sH+KOZsy;&X2$g9fR;23I8rZ;eyyiB`?G=IJ% zS2M@<_0nwW873y;PG7l_%=^89vNgZTUL?l6$<_Cb?zJ=XqGsDppna*V6ko zh*4Yl(tER0vYJiVDNFAKzGp~+&oGL(g%BQowez*7L@D9aG0Lxvv~7Tmt=Xi5#S7IN zjL?v1wW1zOm1B06o-7G6LRc>@r+yJ1m*KNtpq=eZerb%A?D~*xSQ8eARkB5vV7^Fn zi#@^Nwv}7UtfiL0hE}T9`i-_8<|!7vwuf9NaVI@uP)T%Y$q#?{=GdjnH0PAm(-9{# zd_|(6>NLCF?r|njo2gPdl=i-BC8BRSXvfo9{&DZ_Jaqn9)ZV4i>db9#^sukf2Yf(UYP`QxhVB@S*7eg0gMhr@zF*;TbT1BKs zX@BnyjzCFk{rlRU`Xsg8GQ>1U-BaJjyCDqiF&U#Nviw>UG1S&rE_*%c-5h!H%{5jeuwu@wY#04 zxc)n|()fw1pP`>VQD3fvPH890mn?OfG(AW=50dtf6e|x5DZKZ3=-iNX;!=FME9S_j15wnfs%`<2Q z=q8e0eANmqMmM#_i!4(O$-r0ALqanaMwLBSOjJGu=WC_%2Rn>jCpnwcM#iXn_{x0^ z&aE5x8c!EV6LB@3l0v)3im#1nRP;Gf>!}!Vd}XBjLb~mFg9tAfQ8LNU3^i==}r}sf566@m~tsN=O_V#@BI>lbaT1BgYHceZ7+vn_-MP`#au6sV+ z52HGzNe-GBa+g}q?jsVV$d+i*^y@W)RA-cDltbju2j~TfRjG2+0Z&`{>iPIqSJSgj zseQb8wS{&F$xNd*Jw~(=ROvMDfWNQ#l10WEE9oX`UGV9^@^{@XusF_TNz%CElE$}7njP?!9iBJ)qtwfs?GZ^0? z%`&QiN2(SQz8GI^sFh*GM@i5F>uHR^q?l&0+1faJIs>-X6(+@c8>x?N z9;8}F7GfE_2MM$T55CEeN>Yors1@1GM4}|3R-*mNY(s*{PIK)*CA7XGfz}&&X~!+n z!Ulz5mf>jL*ZEydGt|?m$A)=h=!?_$EJ^!hiqA^hbf+iMEOoRJaeQf?#otwp=hXf& z!PU@TP4PIY#)}{0SGd$u_cnrWPg&0>%%gqW9UXgZ@5bdhdUkI!vCZ>mXm!8>IMmvj2aPm4VcZ|2==o@?D@mD-P6yPB3!kEk8h&6T9bkqiF-GM`B!h&IU- z^(fkFobZ*ziC0R3}2C`STWWxnUDwCpakk6AqVOswDM)$Y^u&@VK$d2Wh1WfJVi7zvW-4{JxMVIu>!kl(Y? zIJyFDiWT$CybfF*E_fxPJ9roUD?iJ|h z!}!+My$nh4S|l1Sm*_Fm2{H}IC?vZEA5F!a)UZ}2-HiT-iuPBf_k`?8A6QB(2VGg- zLhmroRENzt+0cU!K0`9xMn8o{nNv*rjj$f~lF@f8={vJzks$s9Q`{9u;Z5tU+OK?F z@;Q%Eg4m~QCOC_ecL(22IF@`RtTPJm(T^<%n z7E-Cpd|qp3dz@%PlJDKDKTe<97!7YUR7g2(?tx{5uYAZg(BKAXuI9U1X~@U&#)vPW zOOi|SOI+nd{H@0qTJf;f7RJ{`tVXPpgdWg zpv&&GJ0?3St))hjVGzmh8SU9HzHLm?Y5#ALC|!lG&vsPxAgp!u@|#ajg0TWO>07no zbL$3@U$or|6q}ULH_*My^T*_SX9xO0@3y5mB^9*4-b~{K+AAPK&F9|5QEh_t3p#Ns zjhgIJsKn>8F1%W}Xz?ExFRG_Mk`J_K8l!?pOvJ^~*Q`EG<1aUXWIfsbbje8+j08a0lgvT}=?u(dlUJ9^rI zuO9f4{I;IddQwll&2Toai1z<(Mfgf+ZdHJA1cH!VPLSrIbe}{K-}N*e zArg)Ao}*drH1AFw$eV62wG6SF%%`=b#$I;}4v=5H#GtLtyp>v8aiR{Y{-&K4FRh%iOIwFgMR+m@?*scs z*gXXQZZc__9wMdd4qwsg{f*GZ*TSK=zP6E4;Gpws`@=E4x1N?xk>3Q08DACsf5?Y` zE#nZA0q|TeE>=!vys{C#7)9Cye2HH`7#0fPi%}dM;p_CdjsK`CrX3ryXbo7IMy&5e z-vuwziuG06{n~16jkbgSoUVhu9rbdGm6b`=nHlt*Q2|+wEyo(~l8mg9UM*VJ)5yXI z`EEteYL^zVeozl6czQyzpCw@>AzD{5%7vWtR^lxU_w|5qoajRSA8EJnvJJrv`{}?L zSAOPKxCIhYzz?^2*BR;5n}M%9B}VS_*Mg(7AtfHfxY?fh}=CJmwyh`dT)3ee0gTTkQ4@v>~1;n|8I1v%{{OQtdZna2L+{^p(5)s|h>0nTyMS`*$5{15yC5L{?y zCF(EQ=34GGcQK{?wcRcvI>*yB9>m<-MPYwsE*8U5vUKfs6&`LaYryxW5xKE3G2+W) zlfCbp8{i1%E$3G&5v?U8jSSl)$M=Ae*J?l)1jz-)Nuo}{Cqu6r%Un-7{uFwdz706b zu+ms-9dDj%KAJb){B{0ggzQeTMKZv3|IIr&mn|Gr{gJk4y0$U81aSl3j6?%fodxv z?t;5Ov5-a?FxG&6iC$cz>_HL%?sMA9@D+)23|ne*JcCVB9qDV1=B+e-p<8J*rnrjaRi|Ir%@}xiJIuT;?*(n|X6A7i~V< z@Z-G>Uk{ak+C#=MYT>hdNH)IjEcADpdrbzq^$4Q{3Ut9=jxde$kshVGmt+a!27^%l zGJKg{C!E*Om=pBoR)>5|$M*^>L+w?TMEz`%-4%uvhL8^5t&3;#I;O}2%3dm)B1Pra zEL6Ldm1H3i=35D+3GWSTl&wVPwfC61n6~Ae*A*+VhI^WPka!p@%`}EElJ<{|~&2|PVkeA71o==-s==g{%m23m*tv;!+IG!%_v?GS!IU>GB>F5+Ur%m`Ny)v2Qkvwr?;7t&bMyRJzKS@umHGWr;Whxm` zoKG5~t*o~iZRPcnjf!4uy^~&y{mN*5Ji3p6-Zsi1v7nQR)EJyb|LeIKT849vCcv`!BV2@VZL zA4ACxLReEVLxSbCgPXlW{*8Daf{Ljz$!`Q(&RH%;T%v(I5FJMQh=IGzRxPIarxeQK zNbaFefp1**rRHi)wI<=|0)yO>I_UuIaD)BT3p8cgLwV`??UuVu$E^35%ruh6=L_(+ z2=y&6R+0V}@YNHx9z{IO?-(rGM>RBWDWUJp=W1ha0nOq|qS<^&H1CTDvrjP6fsqnU zK$hn2k}k&@R@#Lk6Z=Y#X0IC(N@+F?36;}4dA6((OB|r>Sd<;z`5x*`6olZMqMY=cu>l&2e0? z-RD?tNLK}DHZuPuiB2b-RZdkCwvLu3qqCi2Xm<(h4pXKqs~b|=ka{)nr;snDc4&hz zqzArLHy*ufC~?sZkYDf;xC&=}B?|__8EA7I4K5C6_!7n}2XX-$ktoB{oA%f!vcwHk zdk3q|YX{iJnP1QhBW)fRMryqTvjXF~+Z0o1BzU1FlUc4fiu??8(Mm@o zLkxBmz^*TB-$Zr=uJB`*J-BFow5mu^c3tSE)Romurd_0O0^I<7fdSBskic`!YlORL zTn^mEh`x|6f-cQ{Ga7s&LJ7f|0PV2hGpT`W9FuIJERjer&sUUE@2FC{&=| zQSQ&1VpyPf0+>=f!#AuG1g7ZN-{fULQ$t#5brY>;;k$FuE)ki6E@pKs)5E|MIvLnP zb|KAJ*TB%GGwmr+*QT!Rbx;A}dpR;K;*S|$LB4z!?V)o?^s%M!_CM+UqYWq#}Ey-X2gRS5**dWDfydCZ|9bgm;WuQd9?2(l`PvRp{*kSDKklgdH-4mJ{SOEV+c8 z;Er4gQTqB3WSC1YeUXjuO{**Y!QE^s{UNQ+qs*c`iCdgh`(x72*xLvk1RrURDYF}p zi|wX@5gwpK77kYX^7a*%HE8h02o~yTWKkL#&dKE#vnor8&N7Lvq+MTOG2vLFJm?L) zXXy7taOHL??AHUCh16nZa|A)SAea0Koy=ue2uIwAu=HZL#SW@6rMPb457$HDn}lz6 zjQG~jzH}h$iNjr}-)Mb4Ne&KROl@ekKL=(O>siYgdQ?Cc^>c(UXAV{f-ZzC_7BGc0 zQ#-snbOL`7~(l8qpIpGp@iDwWWYBq&HIM!Uf`316AOP`WcI9rQLrl1p#nSMwGG);ZDc40sKLjpWV- zWNuXGk{f_;O(wX(cvjC%;%+^^Ip?w8WU(@iQ02&?w&b|-78*w9P=B&fJl3{?6$EyQz1+EIcGBaDaR42sBaI*S3)NCW%E z^dHWCU)gLr`~9>Z;#Eu3OXxeKElld*yjc22eE;S!Ux)`n9fm9R4(5^q&T}eI0A1d~ zjkLT~geoxPGK!WMM-)~FtX0B}mc`5tj5~2%OW*kj^%=&)wXIvk;f|L+Z^ySFD^yZh8*vRy=||A+Cte<%m-Y3Tcs>(hK>* zSK&T9M+a4rGWfme`-ROW)Azye)97p1oR);Ig8$mDjpszD5F=bS)rZ9PT3bd||4r;1m($5uIeD#Q7OE}|u3XI!~Td48Ss>b(W(b9sB zMI9^1)BmzOVeQEgcbpukH7duxNKA)v)iUYYu7-Y7f#n zpo7}YTJDBFOoShg1CDS-u1LXsJVj%E#2g5xL;iZwh@Xw6{yk6MFvpiAXD|)TIW&Sx z4{;L+Ga~HJ-a-o(+V%j2qP~RoN?xL>$( zA7TU-uJPYzM{_;G|DV`(E=GL4VSJ$}!COcIArVFxm_UAT5GM(3oH?ptj3@=T$Xck# z$0R1K1t6(JD6b(F83>~iQ7#c7%#aG_Mh>9I;^>MeLw)?= z{!C=MBIHRw@BeP{cT*ang^h$o(oOzu|96G7ey?7tn&G-K7ecNKZM^JQ@vUHcM&&ZT z@Uy^0&PUEUNCM{|P=O1)$5lX(hec8$1y9M+GJKH-x%k1|94UmMBwTqozeZ#mvAjIt z9y}-a;f#YnCx1%`Sr!V!@xB7<1oh(YQm%`peYZ*b8KKhB)NxYUf>`u3wXdlD#eX-4 zuiy)K0?G|@XawUOwON_QLk#IaIwKr}9N;eJEZh;4B5BeooX6!d7s}x2kcP!D369`| z9FdYJJ$ug(!rgcdouoUb-IYMfi4{)KUNAbdJ_x z-$05LU-XU`U%-Wt3?uG>oBP4NbUKiZBO~w;SMZvn79GmcvbGxXp_h$RNCy|yuH@$V z5RdY?4>HQrp&iCuJQhzO;E59OM0i46g*cRv!E)t>&$;|xk&jAIm1hPo*{_3amjag# z=x!it*Zc-#Op?bazxb{sxWT`;&c66dZpcUd`%mAV1V&-$WZ@hIq<{-?Oari9Do{Zf z;&?isARq?}aw#0&0Y@s14?^jl6b=_+c{oCG@Ngc6=SXKXf|bSJo?Moax34nT-A9s6 z;?E+S6Vw|oO(7b>&cc=XF2Dy@^f9GA-J(n9bQ$`LFfQB$pWwokyYUtX>EPznSO~(R z51tZXLMXW>WyOSV1@(W~w?mnJ&IP|nyWwnRUlavyIQUz@a0Hf&ZyX7{39ykM%pBH{ z@QnaUbO^jfJa9t{PYtvV_x%*Q18ukl5AzjZ)Loak-d{snBbTHg?Rb)pQ z1l&hOrHh0LvCX^2iZ9c={Qm=G&WkXP<}mKL^nFoq2i&DF-d7GI2`+LT3ulfc$C>k( z(&_Cju+hL?@^08f_A(g`u?ggBmrBs2h zOkdd>p@rcv;o30G!mm6v8HQ2%QHGYL8Tzaxv9zDfWC=ju0Yo~OkTf&-1CHP>!Xd{j zmd;3lP!`WH2LF*3XXaw5k&i-2*XJTU9426g80b}w3zty-MxZpfP!=x(*n)VxfFO@U zc_<~4I{Y*&H|1hDP2;d5QXqV-0?qStwyn zSJcq#E6@}QPBHFszK3%&9x@zQdd^SgCtN5!BpTVCq{e;LH6G> zh%<~xo&|}9d=a0BkB}Z%F~KQDoVV-@o{k^_4m>sTA#5bWl*dyHVp(a-MR}2$<0agQ z;#nBvG@a!TFhe>#4ewha6e&;!T*wC>-IIuw!d&o?pFKBy^;F%frn0(i&9#z{7S|cZ zWi5{G3`6Yrl0?*Vg!sZ_E`xCeD0c|AXCpX-xyRCldB>27pn*_MoZB1${6HSre#sUl&!Lnvu86 zu*}%fw8gL_Hu**W2z;Tl8JNMx_`-NYIFMX0jDd7UJ>PP{)35}NWceXIpl~R;kODrO z)0uP$2mw(XI0GdiUI^o5Ar6F4?qcPWTkz+G!|6^${E7J8=&s>7Dn0C?f1>f6vR7Xh zom!T+#khs=<%i(n{s`&_7bxNuT*8&7i1<)4_X%MUe{A^j@da>);Xqel0RGi;B`h^S zgU67qg4{rTBvA&-0T(Br!DG1I9Eo=(Tn4a0D#TD4hC9mSc@UbxawES`P9(2zhg^y! z6j@39PW)+k2=GP9Tq+46ID-&I?W2d_qyoR7AC(f zhb+I-VdJKivGk81zd#i2WsWlWI7f(EaDitmgt@`741^%IUQP&4hBYBhJVgr#c%W3e zvT_7`QEL)W7*g=M5lDg%m%;DFo(L%zMwB|8y)n7SQ-8pRJBG_-&xaf!#0llY$0=Ps z_0*8+>!MSK^A8&j=e0D2V#XKfGOKeKSK!QPB(7nfnW2Pmfo~c097l*iz!4TioPkLP z=yGm7Bp-<754*@um;zg*r_n$b4|^kjQ#h8uIU{@rl#tF!hTer6&k?~qBmCAyo`>HL z|Ap|@3_X=nol@P49lhuZ;{JxANQDp~Wy+~ge&|Qh`B6J2T4=#El z{2N?}_?5!(tfV)FooZKoUGx#~ZF!PBcW`CT=jn@%?29TQ(HZ*k)fxJZ%(eR2Y64n+ zf;C7qyA>`@^>bZ?Ij;?_Yz;z#kgKPsd9o&!0$1)9{LLvPl2*vguaWSpyY!Ob)q$$! z;~S_7oRF9$&)pn+A-^KgGTKp@pChgx^YfI*_wVupzQHOS{M^uo&UtoHTbV6b2XKHyG`yYI-9b8H&uP&=9s^W)mj)W9Z9AY^|yEdK} zYZ-F|zGF$Iae$)TO}z&~+DI-T=ao5l+FAd>w^{i1uI3mv_Y8c;5{4~JvrHXc{f~aW zc8C+Ii>t1O3Qo+jwluc5-z@Wg@V$0)>5GWhiErVF+16Ra?UtsM=8pf7-(~>Zp?XQx zre@QUs=^a1tt(m_-C5@C|G~Ez=+c+5s+*54ax6Kq-MZ4e($dnj-JG$$@%r}`)*r?> z;^OXzpSzmHpnvhi9jiB2HJ=Ps>XR?pS{hs2Z@Z;Qd}pMjr=%a6+?EdRy4=rWhTgN` zp40U0lbie7_^YY+3~huK-Sa+ux1;GF@-4b&O7EsqG>o~WdTF!qHB_a4ShM@dKa8HU zo%r3dbhJr)PbHp=zgE(9Zpeij=X+m#ZST(MZcRPw!oG!%#6R$O6OY96oxZJ!=qrM6 z`Ld*{xpd3LI__3!Q z_R!u&<(TJNaLxGMTHRc9OR8?UxNiu!wI}{7%bV7tSE22e#$p=}Z7k)LVgH-)Z6&t% zJsE#(@6M0mdotdZy080{FGln6eWA+HOuDrm-_EP9MBt|lxnTX@D!<8{h7h_p4&RgU zgHu~yfpBy2?Ni-cbRAU<@x5SeN$R?0)aJ(9&!?KK(ZKbFlz&Y+RMf2Bpr7%3+$i}) zX`cHoe*}*2wb#Fi)ytUlZmDWWj;r_+>*e>JHDB9W65R{d{%dA5f$s?Vg0e_7lIC>a zz!!9qZaE2D6A#jNf+I0Wv}^BA@l$m^$=;&o;QKt)qj(;H@LcB7RHCN_uBvtqh z{ntF%1iqtK|MxCB;}D4|a#}HbPbF65z#oZ$@5cYG2j9lqNlBvQt|!^Max%VWuZB+= z{U$VwY24SZdMm>hXYPu|w_&K@lhot;=$fXH_-SIs+pmrgw^;!5@i%@5cXb z9KLwA+mE1dbe0^fN1 zva8B(1jT=Cd_^K%SW8dt84JFhzHBbKTdO+N%kR_ndmRD>EpwgoZ-eiGaD9F@H5Pmo z)o)Zamm>ID!uXDNj3=BUXSf84gu}&Tki~Hy&lic|@sT{y@hFk-eY5fQGuO)hcjQ+j zdY)P2P9^q;p|!90vMF?zS8=*BJ{n&E#g@9xacsH4`Z=!C`tIwy@9X~XkBG^`qJ5NZ zefLsX;|b%!@)mbZwy|sJ$F2*vvXZ+re#eHPjXz(fdVIYnh(6eQ0(dU3+Va5%AHDI> z2OlLKS$^_zgge*kXA4Q>oG5~CmE*-VvsZDl*jF)Gjif;cs9`?D^Sp@TZiF?Y@#J6a z*m48q_jPgMDE*zM6Hj+LmALS}_y-ztEZP_Uz{2}ZQ96+4!6BE~_p3)udoZQXN!B7t z=`-!Y#Sd1Giq3td`&#gQSj27W`d>uySC3l!;Qj{#_e4UttEuPfT)mv(`R5Y{Ej6Zu zg)=tKBy>Y3YE19be?FDi>#@EEW}ZZv2u1L9I_5ef7|bR9f3PrX^q@QUknIxWxv%$Q z7JDSkDo5|fvPWl+mXBU_8Fq81q$4jNE_?Km7a}<#rE}L#$JQH$Z%X>v)aX%(Q;ER` zFXtQg2Oo@1cQXETxA^~xPI)HvWVk%js`$h>5=LblwfzM}B&r@~ivh0XJFe1Giu zI)4PjR-D+nhs$qZoO@LCe-PYRGiH83DL(*pu5w4=yVJRo(CxY*vk@I86gjKDu9?4%;J6->(1Vf?vA()ECjH<8quDO(fEX z?;dHBU!L#k&nIjDAwz8C2V39bIrsHhaOX+-kCX4SkC-~ib}!tZy?2J*TEWs1z9%E{ z%Te0p%AG2toSdru^<7WhHEq;WgHwgDlkrc^Mao^SxxErmrJpXr#?6J zYWUVVL+`}i|7~|azt@7>lUgN-_%BKHdPlU3&^{7y6N!4HAmn8H>m7M2c5cPfk##t1 zTY8-2{Pl!z%7i4*<3v~gU5-=Zsn?25vbziS5n5c4di(0nx3|m654M$UDSlZF-fckz&u@g++&EbX?kE++(hZ{G>Tj=O4IJyLnPA$`AEef!Rr+%LJ` za(}pbTD=x5AAQ1&lqcLn8E^N*ciF)6BJ{ZHE%(y!8=_eD77O9wm!E50vE#c}!tr?` zF{zcP!S9KV{9g=C5rRv5AtbtmgP6>4y4P;l>ZVYm=Eg(|m&a?q+GX?dkG?fN!_=IR6FR zIzRqz8{T3#a?I}A`FdEFwe5S6g}>$gJX`~B{bMBMao5`w3t2t4Cw|VBU02{+TOT5Q z?~9n_H~;4+nN&P}8M?rLYnO;kkn=MdM~)N^udJ_uMIzM|btO;P`1x|28c!wQ8skTd=ezxxhrL1J6f?7^N7ynmdgW}SedF#u0=~a~@1ncb^-;x=$M&#yVCCu)g-%kXFQjb8jt_Ye!TB&D%$CQflA|bV| zZ!6wd#P5+Y?b`~Du+&paQjG&7xMRmRxf8E_lbf&;b3W+979#FDm8idBCR7;K`peD4 zx9R8WTnxmv7j0cG;9HY3`;8-Ox2-)w;YWy879E_$IWle3EQb3%ZwUB46UOrX_wIjh z_0H8h1!N=F37+}v-IyQ$%zHevyLVW))%C`rZ!3hbgW=xu;XevtkusuP6FsrY?;zF= zYTCZ^1RGgbg*Ebm@HqR~)GKYi_0TfM&B6D_p6~A02}wfpaDniqR?J68gto2q&gXH9 z9-PI(?=C83t!l!oURI+qh`76ZpY_$_8&2EZd+YB{GRzN6?e67iyL;O|g0QvmyTWfl zq>P5HiJpF?vFYbH)($$ASeo3X$CYGDUcmaX`M+eKiB$D7W%hOp+;7iV-=rMh9DIN5 z`R;!C$V*3F+V;}cFovhQ9iER6qUHR$?Ii)5mxJSGG&h@EuTt>E3 z{=7m9`t|l)ck$4@-KO*%a#!m{dq6)WzU%7ScU;mI)cb$z`R-mpI4<9|e9JRDXOCaL zQGgI4T$y{;aus{0_uaYm8N_H_67YS=!x0h?P$13}@zB7|yDDZE7{LA%e2l_D2pKD{}ALui_ z#?y^@YM?JtUSqCTyown0vruCRPuBP~g74b!C~U)Y`yc9AKe`}dzn=o%9$}lwg8H`L zmH1x$`4rC|ng8YdBlEq}>+vPumn;n7aA^uSo}{~{AE7W!L1`G@x9hQ;=+*k(By7+8 zvLPP?-~9MU+F$t%(|Gu{Wm>{h>pK*-dA#`={8yt_yklD!Uy*1}9OsSjU-Mi`f`z>yAGj|%t=9LCEj+Y(^d$d8?7x4IPl4~?9{f)FtK!@A^PTzGk(pmI@=gfL?_Jxb^N`4S_A~YP zPC%&OpCA7b@f@6g*7ufYeIt^)Hhw`^OC#;GKBPtJkA07`dU*-UEJq*86h34u{?~ihJHGk95C3W9Uv?9Y|Mbm|!uJ&)r&s;i;r{O5 zHar*T^yfV+&6B@>)i0!I>iUUq)}h$?zr1~QDls`cb}MS;uT{eP9Z%L{Jg9yq)K7vh zv!pJ#J@SZG!Rt6--Q7L&)gEYv&-wUQ@!9j=C#*$|PF=*>7fy!G zL)fL8w6-n$EBoQfp5u{LkK_7mI->FxSGz5r zC$%m^(eIPqhtnb^MNA4yViHeu|BpFhQljdNnDmwTM>>jra#KYn=B%G_g7$F^UG&lC zppCw8GLE)Jm+s!I=%XJ{pQA4k>RRofzLV<$wrQ*pL$?*v^q`E7{*z9r9lDW+85QCv z=W{;ruW!G}(wbxW6@G*FW0%K!yxihjdaLw|U+Fu4d;fZ$-3KdPY*{aUNx!g>iRp>y zVIvtOjIkrYhmazl5tIHslFc1Y_Bxw}sim2Ue?R>GgTH-ya!wx?c*~(%cKCUSE9Zyb zpL@nB`8WEg;;9e6?^<0z>&&=8Gfx>QMnUHWA6kWr8fy64`d`^U&x$}@;p=H{%OgI= ztcb^A<%Axwfy3wY`LVnIS{L(=w{rm(WgP#l{c9xbIhP^%lQ%hOogC5wkApnUv{{dV!S^5qmxMc4+#S?Wo!j%`2N@WSGJMT@`%qdZ_I0h9v@(* z@28uk_hXdzITTbjjw{yxt^NC|)X(Iro-xb17f3z!mFPDx9(^`2UiRSD%e1gQqiE=3gc6qmv7lVh(&myoF(` zS^AM5wSuicG1b4`zpv2UR+nyEf70TZ zuTy;6FZlZx^xNNkQ2eBklSeB49os!2ani`e(m845p!i;t#}Az+c9~35&zrT>Lg+KJ zyzJkVsf|7!`tbWZtBtf~VBgJfWlw#3vi5b<->H+!QTw`o?T~TR;cwwzPMZIo=#$@K zTz!2Qv+B#zn8(vmrJJ9AoTF}?=R`sBP=t1 z@yPo}-ezKysB`}wH;-JLxDL;e5s3qaV46$UBP=ozQx_+mAE6Dy6o>9k>fbx7trUZV z&pd^`XppYEYHnS~XcgQB$i?&9lMf#)rc?~0SoiSJZ%;Bx%s)mi#*I-hc+_vue$C$Z zA5(^zd_3G|6w^krs{H(I+(2K<*LpI{SsjRU$o^H{dY5xr3;q41#<6tKr?@2B_`J6X zNd9!cq+jojljGMV-k-Qg<=^yy74ef3*TXqE@hj5_+In5OpV|**K2L0)7~u6U+J4k2 z`7OH2HMi8DXBxh5Jo(6}g%8PEqJL+eVt$hEqfQmjw!v@;I*;bSJ(iS@2HmFI7LyqG^2di7(N$HQOtK1Z4@jh7bb$uY{g z^uheZck4mFNyP6G@m$`eSHHrPS0#(9XKykmfB#-yKbNj=`v($BcS{pwBCF^ zAoAu#T^4mo=o=)B0>{I@h*%Gpcq;y#d8!fGT=PX+Dx=E|zyFy(otg>f|9tiKJx-|( zVxB|yyQ7G!oHx}xk;SO+o}O`2jc>k!sfI?K`Yrs+-lAjDf9QVC(3Q8O-ZI;3RoD@1 zu_8g-A37uEyj#Zhk?Vod&I!B$EvL?fF9@&f`$6RCd&)eRZsjUH2tEA$E4S!N>9?i} z^VwP-|H9m(``bgG8amEf=GkFI5@uEW;CQ+HGXFOHXKfzS2mSaKJRkha?LE3Xsdw2O za|dr}`cK36G0;l8R>wfSX!?&lx5nJHc{kNy9>a(^g)qA}o6r91CUR zcamzmzT$1Y1df9Ch{H~Q%z{?tJ`D59z8{qNwjTQGLFm!azn9a`98wxzWr8z)o8;e@ z17%s|@V=Z39}j;kcn4xq?5Xj+r2ZNGi`IYkV6oQ*#V{vUVk?FhrZO&5-e~%d>?I7< zR8HOfn|yQCm}>a9@~?|zdrK#ml7;x>f%qKBs&Pb(JIn7IL5;UHV4eA)#dnBmrp!-j zZvJq7xJykS!7cp@Pc|;2-{8LIOy^AJO%)M8(DJ_C?w_jNRaxe^cBO#D&hw^?CfUD_ z$gQg8FIh6KI(#|&*@F*kVJTC$VGC8CADyyFwZftM2-@_OoOhi%@*9l51dgO2rT#Jv z@m?OD{wa*p=AF@|B!>ij40y^?cj=ucPS-+a2m1iybZi@>4$G6%-+C?@;q^BI>{ zM5If>ZY0(q*gk+``s=4d*3{Uy<+%izr0I%_{#k|;9etVas%k^ zVYT!x&WVhCY{%u@W_MfOEw-bPcalpTE+7ny}{l_=_dsRKj?OiWKUWmLHd4y;4tJJVv!I<((=Va>NKh<3OdAH{U zY0mwZtVhAWSH|gvf3M2DOvQ)slR3WRrB>vK;*I|K zY8<>d<__%$?MUq~?Qy!-@M&Ndh>f7<3>Jp67~DhQq-l3(pOO5_Ja{$tYLR`L;sSXq z$28S2|6VDF8~(i-?-KGs%rfmA+B-s*YPC9EXVL`+Ld@@^7*ZO-c>N9iOIzNRdPc^p z7Ascfhg)@4-N7-Ucy-?W*dvNVZp^Q)!o~mS@ErJSnHKMVfb(GpH`5bC`C=(7j`!!Z zo@@5+$DT5=?(oIk7k6L1cW?OjDqKrZ8#;WT{Q&%>K3N>^3Z%}*^v+t=eygDkSBvtg zzzW1LSe&)tYVmuZ!Am~X*euOA1!6E3Bc~hf_v$?S`;Pz6%I60XB!_Z(YvFM4uk4++ z3`KG1jsE#6T#Wv$mrnE}!g9!9ITzEFlo{8}zc!EKfmrIL<1FXD-Dg*$|IBs`S{#2Hv{!fH z{ObA~4}PKvZ%kpg__lAGl#?IGE$_@WsFUz-$ z+#CLF8#`YwDbv2Z(D>_QzgSbUqH;~iiWh5s9iJ zAHJ`X|Ct|nJG^mw`|kWe|D1iDlERb{z55V>cdxDR1~$>X`;eUem%GcuTGBC|G7g5m z{9g|H_re(m)%l0+c2GU!v@aJP4|9MthwgaTmkZ@oQS_Bp9`?p)h0pD~9f61LR&ZNF zrZ8vV2$kHmk2(Waj`qjW9@znw&SijN!vuxSrRCp;Xxy)4p`hanWxr{O>#85XGI_ z{8KUR(8=5))|yqcR^4ADJFd!Tjm`z%&&ZT4^ylx;{m^OJHU$Uy?DWRZuCcZ%O;mlu z!Q?tsd{D-!427pZluLh6EOefd-c;j+GA=u;q#*Qf_~hjcKda1#=?Sl5o`0soU2{t_zsn+A(Dd@$yd!FQ)D4q1})c?v)5~jk+_E z-J3m+^>$Jl$-bEO<(wy9?~^hd&zC{&914#c-m}l9GEsbbn-l(-hvmxmxr6>WP}ap2 z2*0g4=)$(zH!f@&HwZn?YSO@^V+UP|r%a2XFaLXnW4V9mq+raS?$kZ)^{=yqw54SX zcm8yjZn;znlv}LggEHn%S9tnEw=QzR@9dev)#*PZ*;+l`NbB&I z3sHxA{B%K%XtU+rnT~UM`^xZ-_02+y$R}%8{%rzt?HP>ni+k`l-cyDzhu?d%QeRB_ zGVz~{)eUeq*Q`u+>2_>sJcTic!`ts@o5Iwl8kQp88&5HAXVx~x!~a- zDoLhjji}f zmZ9`XD0>%_+o+SZ!0`6nXfbsP!lCn$!Y$pEvpl?5*HDc)Mv(vZyv9?$x`-kxMcqM` z?$kX`v5}&+1Iv{!Nto4{)%<66o5GV-G7CDpbldWf`njWK@NVt4##40%(K_f0_52yX zRC}llG3Dd(w&~f&rCUO4E5rYv!!8(wWm*=t65 z%4fsTM)(cxS)DOwdRejV6$)WY(M1%|X8&^-Q$-PbiHNlfZv7qrWnRCjp_<8HHK)lV zOT@78)H{o;x_=x+`e117vW~JZTKJdNd0E=!ZDWPnB4e_!ptD1_w?>^t{p-V1o!c7! z{BZp5CWfWQmu}6{W7Wle{qX{*XJh-wc;D4H zbWYs|)QWOi%do>6#k!+qn7(+eOE-SHjG^cviVmIGYqO1SxS)5Gv04jTmf0Wcdk@ha z%3`TR=ThmI9q!a^D!X0v{zgk*T;4V?Z}#fSB=ntb^=Z*;=EG(j{+eODHU2xcz<46r zM(wwj(&96Ur9N1VC(DuXTazK|&FnwVrJLuQ?}Lny zYWV#z*&gv3P8cr~6j_%U2aDk=UOBzlQ>^2{@s~M99v*pEP8G%HtM52`XEnwhUXDtx zFZ9;!F5PBI`#or!58UKq&C(yc3%}C84nP0?{osx*4X0!Y7`Ci4>fF|B-*~E6$9HB} zYQMFt%SX$qHhoK_sqtj~vQ1l)A>)W*pD|7y&LCbJWYtwG$pFn8r$1! zd=RC`5@@~K*Rsg}99}Ve*ER)9t&2Pt!d#aAU5y!9wX&l7p_4;58KfQuC+}$~!?zx={1>1XSl%6BwCSb%i${f@vz=gw`;q!{`<#KtN|anw@i0*g%5Zsm8?*y@ zDm?=sr*5!R6J;6yUWltFIfiTHzSA8rlB7?^u?%L1+pfgFD8u)B&}+$NPti*3#n@Ti z>F^3!nj9*=l2g=S>$X>DeEr+(DalhyQ}2VgbbZDgx?4WcyRx@hm%+5)J6pXzeFA*F zjJ6v^!+T*xiI#e=Oi61E!Zt3?bNusv=;YGbQdz2RdDQ-HhS{%EH)V?%#$}tVqxVy9xW`~IX%k8&Vr|i!lWY)>Mf{d@H z>@Qi#l8?>0=Z^a7p!mu+oyA(Wy+Y$}4^b2jwk8ehuJ38pU4Yt)N9!^$2S;C}fBX6k zr!FH8)0Lwh#zpw2=I%;L>rjSjp5u#wb2Ioi-)ffXUmkTFOPvIEWU~guU*1ibJ>jgg z*vGohfo_itVtnzAHYnEBOZG?2alZG<>))-Z>RlS#Gilim)gL`HZ+3Sl*y8nJibRAI zU-_o9SnIY|Xw>Cb=o^lHAxZnIBn``kI|uUl`fyK~jNiHp%*A=nJ4`$pVWDKYm8u%rxwX+{^e1}g@ag^T)IVhGIm4tThnEj?RI6Z zRN}Y~JzkZMHn3$V`8KF87q;F0o$~#HVpkdK(zcN?l(5;eI?D+?1e+Pj=`DH6IT*Ii ze-&ufa(<f_8+`qS636~% z;=HB5nSYVu=fO&$f=e{PQW zf0_Q!Kd-g@R<5z%=06|VzE+w2G0B&=kH5~0M&6lF*YCdWiTaHnnaFEysmIA{g_TT|8iwy$;itfJB~lzBhX z$LY7ft5ExvqZ-Cz-`)oMGj-khwf-Fsb8$64)MOXb8Q;Bx%iG6SXI2)RH_REtV8w6g zU0xD3A3dCwj}+>U}6?TV-z(pI74EmU8UcR_x;sl=arHXutR`m=m%T z{s^JX6df?->is)utlq%6YhBGCxa>sdr*OI%S5|zGi7Lc%1EHJh;sj$VMNA zpSjWr{~IdPV%g{U^bH$fyjA-H@het7bj{=MPSBO;WO*!HyvgaelXvz0bp<-5{Tp@v z45e)$4fl+0qy6c%_?LkF**=j{21|GUUgGllGfJbX70SF^f%seNa!d&ws!~ipsPx}h zmh5nN&OF8?y=}ASuv3LAiW9Qb?~epecloqdl;D7OX%tC_|7+&Y%_8pZsGm<)i(I%< z_x?de#xK?XmTl|M-7eK!RPDEX;O#5zc$iC)rp8lCN4TX7O#RMNOznxVay&WDsoD|3 z^egeNGGCB6;X7Rgo#mK1%m$muvzE|#F5SdMEVmqXL2xhXJ?MAMy6-)hYSlTtxYZ)| z<;u#mHN8-eYQ|1v_^`k6i_d>;sUIBOe0Y!Q+V(dg|5zpFv($h%K!JegJw)iPKqHXjzn zsc+!#Da$x=xC2t-Qso$im)9RLaOWv093kbnZK(_1-;j6HFr0ro%f%hBkSv5}97JDl zDnoc_nbYe%^y(67Q+&UJ;ff;KR^A0e3VeF$Ki9`Su9c&iZxH|SL07VWl^_1+-mmt4 zwVQGlbYe4|`lIL#Q}~njRII32QJ7K;v280+x^i6JK4^O{|K9t%xqw5;aD`g!Hztki z{5F-gax}`8pS7v+6lwy6PBD;WObwZ8tv`tp#9hbZEhjoSI28)^L##i~tKRUYns`pay|Q;p%z-vJza)^r)_ z^~Bk=zS8D-rP+P()Dl`R!|pPC4@&)nLZ&f--JU-s$JnlsuT7LZ24NX|=aks9`dduy zX+%-p%fc(ZSB$|F`Di&NU{2MhVlRGjXG~G= zKX1$X=b-lwW2$@{J$P!&PpSUrsWC?-T}1JlZ9k1MLqBPScKFp&nNA5?@>KFf(U_ETzW(){t%Tzq9lNc_|6=@F4o?}LzPp0g!sp6p+E&_?>2$SNp0bO(uhd?wyjL!v z{^-Ts%I^Db;omEleFL+tEpWrXZEf+km3PCxZENqgmUhFxZEf+km3PCxZENqgmUhFx zZEf+km3PCxZENqgmUhFxZEf+km3PCxZENqgmUhFxZEf+km3PCxZENqgmNxCn8^6!r z);4cTdCz>Q|HqpB3vQhMCoQmMfBL=!>3VBUYSQU~i08UhX(B_DPV-563)yTw%~|Ks zJa!KXOgil_%uP3+=5vr@HqD!z9&B5$H=iybn3k1BY{VT(a#HU|A8+H`p}e*)U!jMq zi|dZ@QLbQHh;83_$7GFrjE3~>P&Re^wDF}4=g)=M_Mb0o{|5_(oaN4#I|-%|*RA7u z>jc}a<0}N>+<#uv{`r~x>ow;skX9jRA*G-POIdDBw^?lE=aUmx&FoRnoh=7lNUiz) z-=~*eFy{qU2HS3#5L+umYRu7=U@Hk&y>RkrLuTPUIjJLPDTYHSVr$Je8!T9gq2oz> zgsnrF-eNjUhyhX(TciwZkBn>N`mzX{rh<dBV0Y<(o-w2yN<%T@sT!S;*+DwIFmjFWg1CXvKg+iaA|Xh*|1BS5`J!o zp`avF=t($}=$S2spEDW~gbsuhkvBQxQ-T)Ao)Q8H!aBmkJ%HSjhWNaDhsc*0_WmwC z{M^6zNrKUEvtS_lEJ0~@P%6F2-OWLK#8pMj6 zDWle57Cj?Glx!fHH&JSP5`JzYLCrKp-6Z)Bh}?j<%J6ef64T7^a}Hvh$-BRV5-g#3 zToKaii5~7jRR3VYZROmx&Ee-}0`5}+A>ok6k*5Tn=4%Mq%DX=i14g^q9!b`kj48bPHj#yCBIlk4HRXjmu!P%T6+Jte(I$k5 zo(;{M`^|dZUEByd6mdm-k)|lLs9jN5kv3LmavDWXyJo;l5IswqIf#Wd-vamD%_OeA zBFLyM;*0@BHyHzqG)7&K`CL1L9_|)H5ZpT(g5jQO2q_|9qnjHH;Ms&->q@$T9K_^` zv__s{Yl?W_BmyS_oODI{qM#!1m^HX4z!(A;KN{LW+?^8!_u`!Jq6~MYITUJBwV+Kl zrf_b1L$%Pz!8Hj}GisecsRPP5$h)(FGeYSbIIsxk-U1<}K2KA}1Kk%KIcwmOtcW$d zAp-nF;&f#wftad=tsIAUQ<1e2T70!o9HDnWz28+WY>fEKM&k2JxRlT`usBF}aGX20 zfh)O7(4IkVT|cZAayYXM+ex)BC!$i&8$kb9lfZ{e?$%J5lRDsMH}IS|X`wB@#Ce89 zxeG~;3^x}9J_>zy$5tCTlV%`ilC&j-8Ez7$-?6)}R3OEn#!U@wx08f|N6qzN?&#Ab zoU3d%DDYU26w^SAJ7y~+uDHUUAT2$nq%iC(7q(*DcSlMJooC%731r!#F7K7P2c9^_mALmpb=C7`D4C^0O3e71QrZ`OAFOeA*X=()E~@+t z*M7aN3l~xEa6eJPpD_pV?&P|RT5|#^`cepW@J6VAo5GKO&ERzwYaXrLE-lhu8d3B`%{itYvSGS?j@nT8OuU4Idje~-Nb?t zLb+ngdbLR_aebkQzb(L}#{Hb~ds33IS|#H#DuZeBXw!aZM{kOHxW6uD!u?fI;r~Dr z!&=aEm~xvdaht8;c9)9V^d{)nJq2Pp-1Ec)xId!eHc{f1()4f2ZM4K~l#1Ih6}N<@ zIl$pgQ3LlGVkF$BiTQA!tl}9f@r-HuiSq0q@r+dQ3{~+AYEK~7$K*eVP<@0QFSK#xsiqBk$Pgdi5l+SdD&omXE3>BaB#$e#Er1=%N zFIMqMlKA|-(MkCXmiQ#9`1Dip>D6ce4w)(rMu|goV>#szDRD5UI0UOWXeoz5Dh^@; z^JiVdCzQk4M&|dLM#b+xBP{v-$A)pBLs)Z1xQD3t9FzEb({PaT`BLI@NX6$96`!(( zBH(bkNvS6vNE~)H45J+0mN>kn;_zn`hnE^Y1rDF7IBb?UY-l(~IXoe8Sf%2yT*cu} z4Om0AsyO6I9PV!@p&aH*9Be8Mvs4^rHtYiqD^(n(OB^OOu)2{haY$8hNK$e5eFN5w zdz#*W`|PGZaJM#T;eMBj=KzUkpN76vtL_rdn^ZhIt9VAxa*d)r(nxwA)>H#L2dj8$ zB%V$6{V2~14b1Q78x+6)8)3=sr|QvGkxi^$#~%2HdRBA3ttXVj*Aj;+6^AcW9R6Cb z&>oOzKd$E}?RygKP8IFDD%!0o+Seu8;`%X^_F0Mc85M1jigtCqQpXA<+JgFvl=fkX zHdjS^zl!!gmE8Ff?HozxnG)?ERJ2o7w702fCrY#_lC4Hdw4+qC!&I~hD%yb(ZCrgI z)!8V~c2m(tsc0irWXJ;^o@9PhoCIU=~20<%+mxw{GX2HFrbE z;e}>+Arco*A?K60pDPtRe_hAw##eQ{socNTv)Xk4Wl7`x$11t+*C}=5J&Cpi=E^un z*ecP!uA(hg(LPtF$bD9#U0>&-w5uiBLKSU+iuMte+=nIFC3WGH_CASrzKV8^iuP_5 z?M#XG_PTgVdz(Z%QAG>B_qHapigvU_JEE>9rA?4%2dZe}RJ5@wTBAf8T^CAeBPCjc ziZ)n9t5wnR5^bXpMrmv7n2*lE+)nnk`?ZSpD;4dh zD%!tFv`*nRO8dS<`<{xnL`D0Sigv3+`-+fDX`hp5pHK!w2w%% z536XGsAw0eXz!C~?~%%Tw?sQrMSHu7Hd94=n?#!?w5M{-676Ue?Fbd^%_`aiiMFp0 zKxtzoTBC|KT1DGIMH?y6h6|f4(QI!1)>uFfG;wtSwVg#iNhy|=PKGyCE9(>gDLF?67Bmc z+ENwm+bY_(B-%eWCsW!NB--axwBUQM+%+oNCneey&Df4O_oEUmtkI$bZw{uk$r7zuMf*Dy?GP31%@S?@<~T~*Q=*Mk z(Z;A~JE>?pNVH+igD7pFM5|TN!WzwME5SRjgStT1m7Lq%gySIR{)w(DIrmBLx{`Cd zRJ8x_&MGzhB)Lzj&XH&rs%UML7WOb;#{+jK zICmE8q~%Nd5g(?(E?3is6LGJPb5CvBb89^9JtqJs>_yWhP6%5lC%^+v36#_CRGi)f zPQ#kEN}L8Yy>V+C<8HvnHp4)R4QPok6u$Kpolc1)970EbyJ1{_9bYD@#)Fe_IzL<0ts*%7_rrTwI#vsaSdD@gm3X+6Pm|G5EchkCD#bb$Ri0+$x9D0rT+vs!p80xnaCt-U$K8e-Gh$Jxi7 z){gCA34td>?adS5{+Rs}DQ$xF2}pYa?%Mg|<}sYiAW? z8z&^&BZDLPH2iSfwoET)FrsZ^C~^=$qK~1wy-%o3gDh_ z2?G2wHiX!7X;bh?3L(T@TxZIimHQ&V5tdhSBP>6_rMF-n7i(OWy-aU;d0EnFqBWYx zR^m>ts}^iiS-)0Y-@{1U^>xM+;`YGo68pC!^>4d`#;i0`FwtfZ86 z59h9cr!SvQVY;lXPXPViqWZld>9@R|?;lXf^7HC%HuiPtz44{>LyWO5WB;xdEPoN? z6Zh&m4cu2s^s`}wg?eTKE^$9X^Oi|@)1c zSb|1D=5rKkQ6M}M(Oa@}v9>UdU)7la>t_LL$Voxr=%gH1N*q6|`!itujdDEV<@j!0 zpu2`>EsWEfbv*&+0OeG!;`IC;LfpGLrLbow{J^bcj16GqZe^C|G_)sB}3VTT3zp8*}%$S#lRY?Mch zaAd!UN_ZXC7l{3XfTOE>SIn*XC7{Xe+LVFTD9K)5*QM==vn6$lx01LEm4EkW>z$?e zOv;pk-q>F^(8^K2IQ{V4bqo)&-j!fNpJUOn1;-e829#hR#)O@mtzg+9OSkmj?Fdfk zVC!LSZ=GV(+FrFxv1*om5!J&MVC!e;VckH}Hdv3)@QBs2EWl>yr>|URi?^(^R@#V7 zZ>g|ik2Hg2!HFQ(}tq2*#nLEH`*tMdBxbvV#j7l{Y zI(0F0&Jqf9mI)U{n6re@8H$167!0!(49z%isTTef$WzZQkvstVCQ!dZ>*2W>g!+2( zX|2(GF@h^h4yvdYG6RXtu!p#NH5j&Qje#%%^Cs+*9tXd%*>knwb-{4o1#umRP*PnxxW5Bs;fzi2 zREa(9Z}KEbPy3Q_)o@h2|px3Vr0IP}N(9aV${J#R^=n1zGdwJ!VK0aHDgA~%r z^L*m|4yaH!9LeD6@HjJYT2NWQUi`7M1Gbjc^m?Z>1F%oj6<^qy6N33}E)MdI+G8abit|1#GoKq{c-iJC zeKUDTnLRqa>kqa9fC{1`qbEfL#`i3H&FZoi+pG?kt=KUMIF;489GqzaK<^2JhNaMF z;h0EvanR3%K+c}Khe~n5%!}eC3b()vGiL+Cn&yKw z*p=`Eyd|(f=8@u)+tY>5v|-%_92oU5pZpH4B%0qF^2;YOj9!9qJEJlRX0JZ(N;)oC z5{{$(td`T1<@lb0BjxRh9Q44%eNbF`>pK}xs@n%zN5WeGPly2ktbc%h_2YZUk2&Kz;WuSEu%{}UqI~KHOGLggB0*3R6Xxz@yohod1S19=Hh0}^Qsm`Q5@rYDHQ zu?DP5r&v>cu+m*|SOZ=j4mLvEaXz`fa~&_m)S=MxVd!a=WhMIH^`@mqjC#Oea*RG0 z9l>*$e-3MSHbO*6c|;|M*U$NHSFp#@iAQEL(ZGfS}`n#7K-8CX3^8386g3l9=-$bi$NbjM>K4O zILlxoTCg;tg%VvF&Qu8Oo!}Z2Mlg8xuEmuiAv1}&cm)RlZ*Dvcy&53~m}M9oaN)Zh zJcMS1p(mGnk%5iu9Ui&A=>1W`&WY)_P7Hz3KEz65VND6EK3GlOdrW_fOqf04UR(`M zn0>&ev5&L$+LLVW$#>O82DW!`1NcgW!(2Q-bGT!CkSp1)8K439dA>@+yLxh6`AE%E z_p;Sww56|Q_3Q%s=d*+FTOYDs6FevQzWsJsU(QLMKjA)&+iaOIXTp7CKD=#djcQuNk5IRXC z(LyM{Wz;F9JNSt-9}rGF7@rdO>;d7YfCIw6=A!pDG=B{-VsoV8$OSdV3~xGqjQc6D zYJ8J(*VW-_(Ex8h!n=@h;T5_g9bC-s2Vh*LI|Ow1XB~`lN(|={7(-g(c5oujzsOZu1g+K7M!xawA_Ys z(Mj-B+OYR);Y0vu*TWk~8-++t6Q?aRrWB&??g`%f0=vN{zbF+crIm2}xJr=CX)mmK zkdI5O{K@{NEkC(kRdV#{Y*#K9$5;Mj(?|VeU0?b$l^R;#-4!>#q~Yv2t|5~D!ycHW z9kI_ZOb)EV_QSawVK!%*)y{=_mD^g=E4+TA(23*XI#e3%A?ZQ3Bp6E{!;})3;nMOX zx1ul3BHpjyq3wbndYEDV33{z&gdDWp_J#KY9|H@3_c|8mrrQc>84;WM)9y&!D75Dg zLqqY<0@&_~gvbbo&^|(IasX5TzITG}P!w3i8FjF;pojFJB7+g$ zk%TuD;hn{tP)No19EmjyAb86Wc1R8I?qo!f4t5<@yPfL%xtdD|>UDE0eXDQe- z29nU&of8A7H>THz(%m^&(brpHeZ^Xcrv9CYp>*evxKrvmZ@Q;$t2h03K*>=aLjl4a zMJN?OK@{o-5boCzcW;2gC}aXCoI)}66VJ(ei#Vg-;N=<)IE-sBKst&Y01)F(0AlSX>G0ScjbX92=}QR4m=K16nDj#c;YyOY z{|bcK~A2w*thZzX}kO{t`$ZLu5aIlT-i@v%;SMV!U$e(#{Pw$h_j}Xg`L#;!vOTP@g!cPcX(68KJJhxJ#e2 zaZpPtg47u{8%q-eB7Vz`L^>?6O8aVWVMeh@FPX zhivKgbjS+|NII=aeA!BD-P4l#iTe2;}Qebleb<*kNh@{hIV-#K8N5K~d$)};P zFqTKc_&OQhZin60TCzCxqBy0CIT_;6&%}mLFvRK0qHMtxB^Mld0L>3TC@Zuq>b@gF zEzz3`ll5g>tbx9xZ{|pG8eExhO@(U?A;s>UB$o8xdbYD|H1{&UmKGh&H(DrZ3 zKy#oq&=$UIi+Qvq&>FUk8yHo_4~(c>VH;>(VO?R%pgAk7DYo9Hwc4@Pv9>kKo-w~y zI>a*8dcfA-d;soWE_>13-*Uh@Ip+BoL*GM3+)!#_C$W0`a)4^Z!5jQZa0PFdp+kCd zW;x+tO}~n0=4ZIWLqqGi#vZ3bHJVvGe7&KW-^Iegyu1o{>a;3B(*r{|Y|M=I&gL}sHW9NrOtIc(-=S7N$1-Q4J@ zr)yM)IoQ=7(nBdef%N~dwX2!UOB+2WKkntFBf#$z%g^lOGJ4Y;hDOgZ#?KJ!>Z0DvGNCZq@&sIm;0jpkwSL17`FO6g&}aE?6G4 znk#@(Cvavmf|$uDxP|}>du3!QT=85XJ}WSD85hg$k1%tNoK(lEoYee$pjoA^4T?|6 zu4I+12G)*_(U#SCM{bI%t9V3dA$(cZ{OPJ z`LK!K+%GNTqVxXk@FxAuX5R9OBjaN81F?nCFq!E!p|9<^WPR0Svc2Kl+0~`mzVDZ5 zO{+?ct}}(O4tZ!tvbK^xlgwjopsP!dKUfe-s&yo-Dh&?M(x)SFBLLxk6bi+i$VJy^}-z?Ny?5p$^qa%LRRt)pCB{_S^ zRIuj^xL^%qP7Wt8<2pvNDF-%fmTW4e)jAeuToh+9JIiSV(&OP2oBimL(zWTK=&|h=$Re&V411w$@Vq3G(yw-w=A;&s@bD}L_5q8?`rvSGeGtz* z7Ze=1ojlj!X5K}f3kr?8nXD(zMcRU~^&9z;oK)U6B}QY7$iZ(`a4y3e8$B6K8MT>a z0^gCSpYY2qj*R;=T7r8tn7$UC#b&s%ZS-hj zV`qNJt$+ay6z&||=jI9S>}cQ%9nn+Uge{;?8j07I8Q`m>ZF}+lF3bXPmFfWfM0j^u z)(+{k(u|9|*@bF%dy|1`v>w*1d{M_Vesg*Zzb-$y{s^u_^Gjg1ybiwci1-x#$R6hI zZUXsaU14&46$ch!`9bMvmez7XYiSJpHggDZevRLIq3vKE?k;I$vu>Q1cHpve(|3?F z4o-WfoZ~L6SL9V7=a^&6v8!SI`nh#{c6M%Ia)+ub#r)<-c5arNkVF;l zyA~6PcT3KZD$aK;W*W4_`uh=_h27bN_YO^j&c8O%*g4o;+4~bL%-!Q)jl{Y0wAwR| z1&}kJX!A?j1x_r3mC_PesV#w=fL=MD1!d>FV*N2EJ2z;%DfhU8@24#zCevaQtcBj7 zdz}e;0h1@Y_%j6>a%Mjd`=G#uzp&Jc`SbO0*iF3nzh(i8+)&L)_*W4WBW6Jr# z8kRZ$|B%trTBhcG6sf2}v1XjzR!ab_8Fc)^^1K0{Wq5|sjqTL5^Rd#=P8zG0e@Ru~80G4XMy{{dVh`1r0Bn)nlynR|H3 z1KJ~m1`cU|6qdL)3WkV6_?j%ILi8LH;&UM{0`oo-?s1X0IiQh&)0klO8o^P$_6mP+ zeOk!HeF$s!NREehgEVowD&akr3x$g#V5jYHdKmDGS6eTnD>7s26&>D76#n55DRS*eQTb z;%}>D_(2l>W*>ai4c@+`@);!$lpz&y;4_pmNTRwMb_CJR_onmEj-aLy==*r>nSG>4 z=*9)Ol-NU>_6EUB|J zAZ`M!Ihx>zsP4U)2C$0(8hn3>#n#i?(vFy)NwLW^woj&`u@6rb=T_{Y z-UI!LQn{3lX{-OpFaG?G$%}&?$zL2yOZFGQ8nK6!t_sSggEG8yiq)eHwAaVc8ueZ& zqTYl=!5)(lF5GMS2(Cxq8`&b^i(bJwMZ%Z8#>4&a&?4chUi=wN?083!PzkXL8e0vq zBM_^ivCkc!6*>iT1dQLXv&Y6u2aM`7B&kzDDjQ|SmytctXYJIake(X^lKIs3_5znR zCuV^Z-YSJ;fVP6=kOBX$>>2oDyXRxtJ0c5%b3l_EK30=EWk*#h+^0^CsVXHsFf<6< zn1=0DrT%GuX(f&H3$AF1N&0xKkKm;(I`u65FQ)rw}O7mvTS63sZ0| zA$s<=lJ>NehBF5(^cN8vt^#pyL-hQm5qgy0lFh+5UnFn|6JQRNui?)mb|?mfX$BU18pIsl0ZV$@}IAf5DNRl+9l#%ytT27>G%e`$v_W;yL?;B6E6-24wV5 z@lmIDzC?P+CDIQc(cqkrljU$jv=YsLJHPr zjOCIUAmSCNe>^AZkW}jajN!B}USof=i8PU9*tWWROt&BXk@4PvZ^u1V# zZQwi|Ti6T@W+c#3lH3MpF*2RehmLsZj;iRKwtco(w=)^%qRDPDnXd@ilk9dR@3YUqU2le28*9_OM9*V&UkjmJfYoZpF^IGA&`Mxe#)Wsf zf`pmO7lZ@*4CKJp4+UEBE5a9n>I>2v)}fpgE%|hv)s8q?jms+qG6iZx=7Nr zH~g~9aSaFiBzlm$Aqs!rgfkHnXqL7^cxHt8bdvdHEmvzc=`D8zWS*Xssp+qW_h?Bb zNHgfMHPXE|EN4>W<0Vx>@rXZeFBP6i`!VXyZaW%k&p%(f1NKP+zw61vuG<6qgyJ-q zIrmr(8uX-iGc7djOg;y+Y0z`uvtD?1#vD!H>HU@|r>73SPp5S|;SFM_Q|2Do`{8+@ zwi4ikD&d8+nb`=%*v8r4u?4uffSztL^>GNto*uWPr`s`htecFDvF^_$uqp+KBS^oA zm8c=0oy<4^G_d(d0z8Q>8>;FGa{;9wOiaqO{i44D=;C{hYGp0ePzMriOD9QN%jRy#;77YM-EWV!shJMCmu;w7&fYA;j*m zne{M|xHUu*7fk2>e1JYcLw~P_r+1Ft3E}LkZ4P*seX^d1TB7M21lYWr=L7g-!N+*s zrHP$&K3Jo%rrDsM$w{L=gSXOiLtu3Rd-Z%kCD(JkT?;$q&zEXlT+hi15bmn&U^{T$ zIrN=9@aD^u{^qA_3j(H|o;LN%+|LT%(FW9-d#wuSZ-MVz7MmlZYXeDu6f=*Gdt9E2wHn+#RU8Bw`=S(?_F0%tX!{M@N{G5 zY|PPBYV6P3js;AmBQK1)lS4rB<(g!-Hu-sbwDoh)h%fuxhV4JA@`=?!xj4toCo>J2 zGaIED?i8Hia@vaYZj+&vYN3^GhWTx}17a|*rKvd2WwTv+KU?Xht@N%1eQg8nPuWK8 z33OY>F3^CThm3_1hq>g^K9aHM{I@AODDM!%S@4<)W zwgbyQrv0;hZnnj(wY0bH%YEg;@%HsQh&>r?Z{T`pU{r~)B+ceam<@t+$7g`=`DqLK zf!BfCOHbKGn*-c=y3rQ!esAq|kp9f%1t?`7cq5=PnEJPXpS)mdHY*><^Q({>Ag0bF`&@zYJynwfTmK$43A~o@_ za}|$ugQsnX*z@g9m~oL%+Dmfj3s%_(jPE!Hlk*&~v!1k|4|qnBA!H~S zMiR-*WH3n}10j7ZAWhAlMUw8zzJCG4(-&mVLtZA6$(S@TY4WW`fFN!ho4sVN@pnc5 z3H(wa2B0?dL2x;Pg7l#zoQTeF5(@E9c#tGIM^QMK1kmDr4LF~|1=&PSbE(oW{lDbU z!GE-Ys#g#MFw9>FJXr2Lv7GU2G!PO47S1GO00cSS7|6ps2@`4B;^3=63DHBi!(v^v zc!7{@;>E+_kEq6v+r%nDvcxK?`)IK|ODsmEi$|l@|ECTp{exnY5z53@HxFfg(9|^b zp%sAyh)sPNq!SzagRux1jaGvr6YN6|AkOnbV5BOr7n*3aSe3;f2=dT?%;IQs4gD`L z`2RGJzz(oGcewfH>gEI>1yu&uP^CbXUQDR~v9Y79N_{X@1*Npr0UA?_fbB*Bke;R>M+#(0 z0M!uLcvbZS0Pp%9S*Th7D=)#4Um!7PDLC>V)|@b!793k=<~A`W585Lfni_c6BEC{x ztcv{=I}|t==ED*bsZKH`&@rQgJZe8BUvLAJC7ZCe zOlvFa#%1$lVUbmilxiS!u1$+%I8UnQSYqf-yk3#V0Zhm0T#Nv9tlU<>PxPQ9)Vfj* zz+XTP)lNz;Mp_AI;pdO<_66MS`WKJYrqx*9a}LJ zTOQ8;H!T1H-RkRqQ`T?78w{06Ed;$xmWW+co`}YTJHTK$))N8FZ+vKKfHTx`9OQ!O zv?qpoX*8WZWzl&_9vyVH)dLD&jXe${V%?CMXh2IM(B6*-YJ#66XlB3R0pljs7dmLR z7-ge)G3^f_=||cj(mZI~u%ZDA0|2WCpu08zL@_?t1yjz_oC3-!OJ`EihS;aH^)Rlo zFBTD;Le=4>_G0#$PT@t`AN^$X|#z}MFdXuJAd6@ zpU&?83UtuEvc&rUfXW`wxJdE=>mQjfXtQI&u#M%RFaTJU0s#24lsp+|JDaE^QEOnm zp#U~!3ba^ivZ@8O9}7c^L+8;r7AWRLDn1eHM3b^qd6ckQzD1Zi|09GUl{3u7|g;N45~`&d>#OphUJB$T<)W2*MuoeMj&c>0-#K&Sr^dwIRN}91C5vGUKg0(^d%4Hx&1~MgpsR$)vrh>we>#MGw%R5z(cRmtXMgB?)OSyMUkGD3wwpwR%b>mjRNrh>+sg$z+B z0qtrfLeX>w7(2!PetR>!705-sBA!{;d2y8O-a+5)-<^)7Oh9>utOGSoi zqN!<=stFWXs#}21Y6q~oM3v$OSF?Hu6{v>+ZrAI8l0tg`MVTMLY25T(Dp;Q>sh6xQ6)S^`j z!(z}6!g@3^#&PhZ%^&+L+WfHuS&&2d=1C#2V)DHEi<*BM0r9{8pzRKd3*%?&psI+i zBdAhUxc`NqJi!=1dq1onw3=W&q5Y6geZe`?rR$5-he`F3c6_)u4R&t5KGJ~_o&Zv- z4Pc}1b+90`1Z)trdk0;hRb%~^`t2Oa(dCf+BNUw~D}~sEidhZ92^d;RYEZ}z4Mj`H zx*M8L)3azdNvEoEbECEgdYUieBaiEJV4;~mSn*LW=ndfaIjgb6?CDkjR*<~r1n~Ed zS@~K9-xV<;M7H z0|HQl9%vfLmP`)o&u8*)X#C6o=1AQS9cvN9)AC z2kU_;lmg~r>J7YXN+uPW+G4$qCW{3_8(RFEc@YjK=DNcwU)xBs0tvX=X9N7)Do#sM8Y(G$w4(Y?_!E|&e`*F)U zSQOL#t`>m=aU6?wC;?E7codq(Wr$?Dc|v|?R?PXTgPb0Blc-lfi6Q_ig@6%vX1va{ zEiMQ|Rmlo7Keeix0fNDU+w{fQ5@eIDv%LT?1V;wSVML<C;OT1#l5_Cq;h-n#i38{ZV?7{xTzUP(%77(dD8)Pma5s_`#9x z7syr`+hPtKH=1OOcon&G0dYl$&qBHf;kL}95D`@@tv)}*%uwi zGGPX{UO<6w`N*W2aPAJ zBcqm@C{`m72H;6SfXGmIKKFMKs>6|XqF8xErKQ)Fn)w~)bH{TO4;JN8zXH?b7ua>t zj_}VhJI(|e=^o(3vV6v0KpInuAXydg!B&tYaV+(K+CeAyUJhT^Sp1I8nhtTvLw%C$ z6zQByVI(g|*vo4Wv}Oc9kdN38W@NvZQ7PSP6d);IMPayRV@B;hGTIE`rJlr5r-6wJ z<&5SRS-aZcfJ@KR{s*A-2+&Vftlw55lx+l4CaL)1xWnkELV;~yrD!=mv(k0n)4do) zdJNsg7!B;$H;$(qlz|LNK%_JFLDf7;B%M)yQ5)OFr4pDI*8m5FHwn=wYkqgeBf9}; zeMT~P0D*(+4J2N+C$NqAnPz?H3jPmd`8?aYe za{Fw@`Pu6uWhb#)=t+`B)^t0LHE~vyi76o*L=%IQ5X4{%VvmtGgahFbn9Y|n8_C7U zEnPr`_jUcR#x{$jqZGZyoB4Ja5t-}kQ_-2Zz_mzac)SV~ zuc|TgDMEd)9%&Z+f@UDv0$(%VB}m|F9<`WH;WZR_st09Dc7wn()fX$y-*aG%CVi?c z&m%ttTcF%y!9;@xG5EvKyUxq}o&=16>U^B6XHOXxAv0c?mPg6|-Z~2qNFo}b*OD|k z5}$>la~4rwv5tElWiv9GJ^0L-@82ucp(?4=7@*`bQr`!d>9NW2$dXU24Dd&01QJW} zI4jD71eA=L30#M(Yqa^AV;m!47l;IbUbOK1RbKobY#7S*+(T;%$z5G=Z=`cCPG z@bt1bkhaJsgZFs&?3nYJ{Lb=>!iE==E zY20rO#H8rt8AORQ#(a8mYCpx;G*-KTYK|X6$fPqr8skH(pJpP);i!&H1P2Z$c4mFm zbfZ6w^qAo_^vAhLPCwHA%V3NSbI}sNmCC230x12=DCqbFoFeQCFS`e#0#K*F0J78^ zplh#_c2*Me+QA{yis!5WmbJjQyG<#@0;a z83tmI7Ke@sutuSCy30jPw9++ zLIQgb8cycx#^r{DfA~1v9!H`IWHy!BWO{N#)zk0d8NG?Vsxm_7jdt}iVL8?f_)NRQ zTp$vT|I}NM$M{BvK7RU9Vo@-d0)YgrLb2h8kj_LaemJXf!o(T%^vKKDQcOvhq^&D< zvq&A(hdQh~DYbQ^v;s(>WsBAQxmdY*v6{+@m6Y{txO9^}akL2dn=U-Z@(hZ^85XkH ze(Y>D7u2wc?KtL1zv9U2q;Du)8GiviPhdFEiEd~D6R#Rlg@1rvGd!oEH-IgD4>1oP zD4R!&5zRn{G6@X=fX@tj3#qffo{B?E6=jiLtPBrMy41+@8?7dC(B^oR4#*8c0{g~N z9gtt$Nh&_P+K(pel$4Jur0$$ywZIqcg?zKIYyi^u`N7 z1LO+TGwfUezD~X&p&To=;XK{$cdX$DzyaOGL5lO+ZO1FeDZc=_c2ZTLUFjafKc^dK zcpd&jY}1XiCStmva2!WIP%x~{RW)n)l`PEbf-u__Y4b88OuR`o5yYU0 zAv5$o+d~4N+@OddjZ-d??16M`r&kMd*5x_hNAnW`9$e#~G2Y0(gKdjZO>5-0p3z9J zLiDIJyjkcOS_r9#vtekTra|D)1nhTw-tYR$%)Ti~aU7%4Acn6gT+X!gr+yE-W8BBGoGmr+XQ@Me{fNGGVg9E$;#Nv!RN0$J`H%lbVdAimZ z%kycOGhkO=vDeUN<055)Py>%6dLq`5nxw0sWFOx7i)o8f$LZhn4KE4O8Cp|xgY-zU zK(T!ViX)mKCz#VdKoXRpMip~rW&{s2h zMx*&ekqz0iN!0}szcyn-@d)gX1DXBZGX;A15_{@T08qrP3M-SDq@e8FZ~!RUQNoNYXUGh?P*sbPCLbN0Am#8$9*_K){drC*fwBtn z@Yve(Y{e(r_JXeOSncu}U82Y`zl9(|l?K2hh%?K+X}AkCV#tLOTJ!sCG3H+b5(6UQ z8dTcrjD0ru*mgV!g(PKLQbyF1)xc+=J&}O96R#iF#~7)o%PR03OzlOaw1@(XEId|+ zPU=2>@6sR~1)(0uT6OK>e>=Jt&|GRr3;i5&-~H^BzQ_>T^LxwFZGEfk=Rf`0d;dD5Dw z{US{At`}Q8r8#+h-c3#k_b$Q&j+UE_7_~u&VFeq=TV@Mu({}d4S16DL)a6+< zYzyWEFPr?QUtb}$!? zJp4j6&7{qJavdOw{JsKh;F(tDv48?|oKBMT#UoaSy2nqVmQ$(1>Deh(;k;HbF<0lR z#7$G_YpgS~4%Jw8kilM+$EwvyAD|LQWwW}GJXn|q$601xGnQj6HYXf>O~F92@EB_L zsH1>}gzL?CJHMIXk74i5f{l2VVW3!1#~vC;C0MA_fM>aLXREj-AYJg5@6=;ml#Tav zg$rXI$BA{&Dy)ZXKURFU`W0A?u^s4|v84!;UTv>h$jSbsBV~{Qh9Nd8)p0o@u4`gm z-nEkfc^wZ)&T<25Gs8EQz{4(~fRb9}-~Z$>lm!8%PzFwnv0yfmJ){2P@1u}|XMR4T zMx4RRU;wk$$o?zSH<05_kQ`t1wzm9Krl=Kci^1+U~Me#|x(tf#m&5X1|F8~j`WxWg#pg-8ET3nIY< z@Izb~iUE8%!ZYXxe#q6v>fuk@yd1{x0Dh>06jw?gU<@rl@q=u7LHv+GOwoS<@4McF!Rzo3>sjjX z4=-ZyzTqF_;`{&dPaf0**%Qm#pgqM9Ag^F|$j`aPb0uNqSAxa03PC(~{NjiSca}$r z=WUR;mWnvTgD1R?Ls#1A=*!DXWFfz(Aa%;k)l?MVGq;+U5-G(@OLB}UTG%9GzfQ*C zkVxA_wj)6(1A8^$|G3r6uMI|aAK&5rZ6``(C)s&UCUK$y?e?BY1Q01Ep;?Wv0k9QS zWEoR%F6bx>|0(bZQL+XcJhu1+c+4%2WhAnT6FysVpx~cFKOr_$bcm$nLa-={dy!B= z3iwfk4W)k!e7N>kCtn~yASD1GXcH`-%}~i{?%)qp5gtcO836rb;KMl%<9kAv4O@j+ zU5(9xI{*_8hxN=A&i^3z`1^cj2||nqIFrK$J&=al^rz#Gr2SctAM#Frib__7uE@Sx z6|kncI6_$*_ccv{m@91;s`qoJ72(LwLve1Wak(_0oRdqR8GQ2bZFWipqOn$#-W>n~ zs16Ds8ypNcZf7svSmSGi++XB5SIDAEjWs@YNiu<-E#Y(l40y`nLW8)}as z_OgM_=A(bj|5pHni`g~%Utd6rkC)YKz&_D{SN`K~*Z*oZeZ(7E0pzDQ$O@n#+Eu#1 z*8#xatp6eCtrtUEkA6J4f%N*bOfl!Nr5{JYbsxA`}`bP1ls3b5AjgnNI?C3+1hkj6sGvJM}^-$EG?*? zVg8@SkMz~_U6d6SZ#GmY{PrCO@hAC+eZT=x<+rN>O)O_CQe^ROnoawOulZEpALIX2 zcuq+Oac4Hm%#rjQx$8wPQy4A0qW6EQ9OFaPIn^$_upd^pUGkT3!+aez)Ug&?Kv zsTP8V30P5Th7gwegySe?{R{uU0a!DJ4|?n0)KBdpp972>pZd0la&G%$LcrKa#&%=c zCQAa*u`l5*bL`7J_Rr@Ff7Aar1c2D@1SEh+U_5l8rAb0|9)0`^-=kp?aL2ta%DJK< zG6%qGc-zpQeH+AUt0w0S#{a@M5E{AD?j#4M7@B1#sare;P(5IOo0L5c%tZqBe)|`` zxnUY`?OH_VTMX~`U33awm@5iv+=ahR$0Ypow%396kuv^;?-5uOSW4xHnU~;9r`c^9 z)&W2d#!pt}i2w_x`sCh|9 z=J*G}2OW+#Y~}nw$7^&}aUB+mRJh&-ibf=Ki1UB!|3wTe=o?TGog<;t#XI`cPMD9c zaL4(E6Y`#q1|=ao6aGK)HG_L)n*Ek}gs1);ZEdwjg=zA@XlLT+X5_pRh`a(!L;32c zf~sHr4_+oR%*3i{T)U?_@x=9NJ}O@Bi>i0Bn^MN(4h~pFCSe|#Tg;50I|k~9L|k8J zJ}tL1+ba$o(Tvy3=NCxC*ae<_b$-eqc4ntxVK@?~zGF0sTX!4axPcPPG#W6p-7G$v z5&&tPts;DB4rz8I{<{Ac$N@!LJfZi-YKBD@s~KF)?R@`4_}HXD>sc9|{w6cgMY~r4 z1ZRku+4?8K#~~q#86PkFU}=(_L>>w_{xR?gxA1*9ZD+5pvM}Cm7()=%&K-S z^!JC4$Iu9eh(^eSSp8JwLh9HF|08iS`vLU#hmXIj`JMnQ&3|7|lcUI0o_WE@=1A9( zynW&S_lGqdlMg;{IrX3U{|9uS{_mMtxyh#a%AXg^280^XsWuAkPVXG$*e860#(|d! z9+Vh4n&YTk>sPSTU;F?7R3fTLMkV6aKF2t4&g=g(fS_?36RrS8UjLub@-&~B7lKw& zSSyQph$R9JcrYaazCPZNDkx18;_;a{-_EGquEK9#p!aB~9>Mo&bW-s7OaEWR?r)xv z$1f6%M1+lL+s%&G<(~*2n>4^HHdH{p1}tD6C0{qzNYs0hApOU{2fG|#Y@$1JksWl| z97b}G=y05KkOxM`=*HL}M~Ln34WA?q=ePu$J}4i0jrE3*j5?q{v(pg>o>2<8;hyFY z{KTCOEQ(6|f__KOu!DwC5>Pc(41`WGdQi>`bXvd}L5(ldicYbtemuR56LwKg(L#$z z`;OhgYPRwvB^t4%Q(O811ej5Pj*f?_R*?q73Wv{GBNO1-GEaaVypmY~nU4Oy1*d29 zk-e7~N~8sb1LlBN6KDvUL)4-jkf)9naO`g6;}bMj>xb!*focFAzgtFYRYTQoFdFVL z4QDnS_IG6J#`Eu^?E$FKtBli$^Rc7HEjrLXA{cmhZSwFhoJFV9l=CCcYw`GJ{Qm@g z7sEi#+7uVoA1a*u>&pL$@Ht{1+0XzG%v`v~W-Lyy8~f;=2p^>ooT^#t%_!6X3!S^h zk>_NgDEw#e7k7B%uO1;qkG3DpoxJSFe++#56mjfCz$Tgap-7a;NUaoOzr)=$?PRsw zgm%Qo0g(o%>T%4ZU5dXjGm6LM=~SGvu)o$7Oo0q8QnVpveo{a~Nfjd5*|v|=Ny7h8 zsC|T0U&utGHqC1ix&Ciuzn_H&H#~V;vq(^>F)x^$$yMLShW9S|N#)Cb~HD)>h?G6HTuEk@X6B2>P-=_b8 zoib^M{yoP2b?D!0w2pqC?tgcj_cFXjZYZPMa-fL(f5#sC>55(>e2#y|*l$J&fJsaO z=CGac|G-f9y*B?p#3S7*)rW+c5J4iBe#rfLVgCQnrho7QS7w4&%>Se8>)71<@%N?= zD*mG2pE{apPx21X!wrmZK$NShWtvz1MYDPZ?ldO*xVTTb_|3?HSZ&h^;7 z73AkLTv3&H_^$a)Ij(3H;VS1d5Ijv_kesO~yD*-rAIs#C?-;a;XHnvPnM-E+sO+nQF_`^2qx(104 zt))3GfL3lxW-LY|^!SA<#1-&*=|c5V?gTz=c^RL=Q@PfVXw0Mj!1Fbr8 zfC5R!Xfq-bJR*;Y*blQAJMOX77%MSixA2Ta?Ln4U)hN`b1cRMtla#N6t2FWneJC2~ zAFV*|dWHPB=^uU_Y0+6qv85^6G@R|pn`*hMLyH$HXK^lpX|_}UjB3sX7-#+es9p;T z^K}mq{YMXI3uI zjSxqIH?%P4^qfsQxtwsV1g>?3MvsK2%wRiuCu>K~1S_b3Di#2Y>gvE?xsRQVDD%IH%6vaGYyw)m{6 zWC+SXD&peS&xS9~PU%Iz6q>ID0N_Borkb@UA1&;n4~|o8p%>88Bi3sttbh~@KwY;B z!p*a4-Z|NYaL2bTzT;X0dkqW2>+X! zyeCU0boLn-048uJ0WO4^fz=WCkwf{jQn)8zlySm_hBUXGY?9kacCt19oA2yEfICGP z40=uygTNk_WcV?7#C3RfT6Drvobl&L#-KfwuP2KADf_5M-!PqKUYoekqPpQ*!R`(cfwS6EUzo5vj1nUu;geF|IL5%@<+ z$?x|5TmD&xK=~*XX|}qo6@er;$;WX#3@~6AsD>ufC23}tP-6;YFq`?=h_MK;u_|up zG%mE5m*xR1xvVJCi`oZt`^Qu1{oOr-c_YZf>5dRJZJiACodd8rOgjLM!?-}>7Z8lW z=HuQ#)e@9U1pJ!hbIL+&?#(n}(7tcp9hsvFA_qrc6=wc1&6~^qK%1kJd@xc_wc|fR z!6CW{i4{ZCnkiYlpIM28ZepL9oktVwsg;KL0R3yWnIgiEe)0DS{Di_o+A&RVCqaYa z9zJ})y$pR7Lma$|jYb3B4cGmda@GMru@yPm5|3US)n+aAFMQ&sU|#+pI0NA42ekZu z0Y`p-A%ACLJ{8Ni4sy;kD4CoNQu2Vr_=9B+|2mWz!TWrkuZPDbSPB{R+hCp42TbG0 z{s2wj5z84kE3H18TEe)g~x#}w7(E}9bn1X1gZ47`;4Z*6y^qHI>9z)M0V`XuBxWLCO8?=c7 z?LvJ#{N;t9y?H)FTc(?bOqn-PI8)|0>6EF_KD#7H!lk}=T#JH|!>#(+p3Ft*$xAI? zc7x1_bXh7sG0n;G*4e*+wSjuj8Nk}3AoVKba0YnIeUss!!Q22Y0I3f;B zaTJlJI5Z?cfEqbPVlnMx)9u!oHvXl~1SmMq|M!VNn#Xq$umH&fnI763-1-oyG!I~k zdw67ybOIxtSoOi=)vxSro-Uf8pzR%trlG||I<+FD2>V0SQ#Vn*cx((KRyr)K7|rzM zvTH!JBuciHWJ*Fr>usTki?eZ%GVoy?aZC8v*q-Lq>+A-LG{zrb);I9jTx4qHdl>YX z_jG>-=A1_IU^!1{4EkunJ+aY|B6OVpfoTkPCBXsCR%QpNIb7x8z~Sham@vA?qlh?R zey_n7h|$QA;!2aI0R?>y+7rbp?H&MC=!qgQS3iL^^owL?-~lk1e&UuU2myzmXbc*N zNE17D-a8H)9k?NDfgJU1yVLno4eR%zW^IS*uj1W-2Oim0hez*||NL};Zt^`cB4U*q z&VRgdOAjr#2=(8zs>1aqhF*2-@DK-i?26Akj$i6AlD)VU6K*R^eq~@r4LGaYvA9ZA zo;-wvYtd3Wi!{kV76fyRLLkSOk6BD+{9FqUwK}*u;jlwyNa{^qQ*S_9oX`L8*x%+{ zdq?ZL`F=91{auR=a_mFH1cN8E8*G3(U7983^C_*DJx1s@NLZ%<6fnFlrE z^M*0+hK2@9WO!I;sZzxy4sn?>q0+iUSZHKqxU?=A7FxD!m?V@63q9wY(vny@EVNRk zk`fmY7OL-+3kxk#qL{?lar5%#{m96$(25mHNMwbu(2^yKN$ZMXp~Z^_OQTBWIsq}? zYhBrt->8a-n^!e)>vK#TSIxu;)lHmO!^ElQnmDqii5o?mxOpwRzS<^kRL8U@6*1eB zTGw1RKQAmaA|h0ppKtCrzaT8MTsidfLQ_uSMRxxB_VbI)dkGEfxS^f@5)&t08WtKJ z9wMoYOdNMvSZMk3;nL`GbKUxiu+YktOG@OGCV$*jrrd<9?S3>i*Nv{VpEoi1NVv|l zGwyo({tf0j;YL$l!cC?A=jn(`u>+4m6>j;YPVLc_w)|NG7JxChMr<`0_t%^xy!lZu%6TR&pn zZ~dr=;~q0{!s7;BiBFhvT6@fOqbJRKiHJ#0iBH*d__Vnn`K%p3XZjQQyxqxjXpJT^KK??-Q9+74^w|+Pg8&E zUUnR3$DiAAZ=24)FmYrb6DQbl^Dj*~sffvE&A+z$-`B*6{Y>0wfQjRLCQcn_;^u=* zoG`?^A34m#jfUIhjWBWRZ%ljQMjE`ueQV-`QRaE#XcMP?XX3~)CT{e-iJOl#aqAxp z{NfVK`;Eq#xcPV!x1M0)xSvd%FwxL?;v^Hdo^0aCpG};Am~yoF6oZe}Q|)r5+2u^P z%lXB`iNBgSb%yD8{F*N_?>Ap=<9CG}ue9S;cD&k-*Vyq|J6>nU>+Lwn$ivnf%yq&a zh7S`q8v0G$WYhI#6Sv-C%g?R$d)rK$u-&|$y2FllnsQQig@x9vSymeD2@9=PFH)K( z+x)%H#LfRS{YgYj{gt}k)^BNcdk)y`Nw>>8XyQg0VWGjnZfSkkZXaURi(+oNxfZj5*o!iCWnMmIt{0ii~8jp&OI&p@aW zT{XHI;>8FRqANs4B3_G7Ho9zdNyOU`%0!om4n~}cP%OGwbY^L^Cn7x59qo=zMY<%? zb!*nGxf|)qNJrO|w&6?Jvge54yA-5{z#)C{C=N4joQ-Kfb( zH%B@uDmrQi(oZ5?EviOTSEOG?x^h(2sMbiojdb~_$f#$LZjbb|plLymA>9M%mF{)! zi;(V%^c?pbcWtCcAU)GP%N>by0@6KQJzXV{o`&?>uD4ymNY6+5N!L@Z)KVw|>HA#G zT$_>JjC4a+L)TiQQ;?n@mh>$V9*QscL&wNCc^2u=vVgUGC%eOeOQfTut)v2PQAiVa zr*jM&Hp~hN3i5~I#fw{w8a1-6z4lt`vdb>Bnl)=?HE-Vhn8D-mSZ}=XhV|ixA6g%O z{IS)gOBd_2&pxxh_~HwzZ{NO_&*#e=I&|p9(W6I?oiJfSyBRZPJhgD)!kbpCSaHGH zwQH+x*s!7GrcIlQZQi`ug}69E_{NPJ!|m&kKmPb5eBHWr6<4lYS#R;;#n=4y+i#Cd zoH+5_`1p7cl3flXn& zlTY|K*uQ`OgmL4>J+pM_(kQ^!os^U$zyJQb%$hYz08art1$YwROaM#i-MhEOUw-+e zFz^~Um9M}4S_TguEZ=?io&5CEPx?N}6yQjJJ6XPbdE}%?lVS!A9N52CuU>op#YYbQ z*b6+gpEqw_HNp$Aj2bmcI&|pZdj9$6OEhiTw9e(1Uw%iOI(42o=bUriDPO+)CuPc% z>0PQ+ss1HOlo%Ek7B&j}`6J@^@bK^vB}JDO|Vc)Tz_ze>i_+gD!{7oH?^9X_q*FtO&a9 zy6dj2P@%%d!NI}5K?NowWFzo5>1QLPLeBmk5fRY`IBxpttFML+A3j_bEm|ayYvG@N z{`vc8!-0RGygCHA{Ze9LqHDl_0RmkTbioA|JOCUlKFjbwE)Lyp_vRWkYP|jO%P*IN z&LU1I=Ndov+;iKAlfTMwBK>jq-FI8}+;dN!;lKa=Zx&?6Gn5zayz`Dc^w2|*kTqiq z5)Zj~4Lq~*)?06F2>U|y6!cKTXP$Xx&))$bkk!_I{_~$>hI{Y5w-@XkSId?y1vXd( zz=HEG$ED+fc`I5 z){r4XG)$Q?r9e@6JpLd)Apb4s)uRG*>?+ttC0}~!C27&3MKJX6l!Acu$<_h+we^ul z9;rrJ`Qe8j1h&9n*bG))p=#Bt7Ictx{q@(YtVQPi{7(gm>VFx0)T~+aD13y3ge-$S z6@1%mx5()(RGk=m-n=ZWY!oLhY&OiTr3%s8L zC-v&pd$U!mR)VoP`}l5NeJm>XFpil>9)V3F4?OTdG}^@(Nq>Lnk7(Gi;a>(Hq#fA! z{`R9Unc#_fFdf&FvRCDG^05t<-eh)@Q>c@`MM99{uil6;erwodufx9DQdssCd~sHjCQY1>_3*y2clt(|L>|Zs{<-fx3OLlZVSFFu0oyJ>^H`e1#0gmBqUhW*>=c+zdZWI7he?6iGX*4uDIfgc^GS`J&rzP!d9ts z-+lM-d0AZVr|h}zB=O+jr6BM@9K8=dgz=|1ft`h6`>jH`1-|Y@d|;xbC_Hxx#SJCGj3f%4Id;{#30>#J3kt1`+E6~Je&=2L_efM4UkHar_4#v8V!p6-) z`)9Xr-=2OE0ZrXSU2*3r;(|CSD0~nnJs`i%0ZwS^lBdxZfu9p3Bx)xBACsPV;)xgG zk9I+(3H>afx!WlZ7~q2_P<+rg0Qnjivd%sC+?CKFA@EJfmMvRUc45r-&0Tlhbq~f> zf@iMs@QL4NaB&zg{u5z0!hVEIgyYJse8xvM@Q{wM2VpPMeTo&!z9=|&3*>Am=n4AT zfIHH2Xd|vWI*6-kCvlbNB<>KTOMW1(sJF${td+P1058dT z;U*vOku{)L@mXI5hrHH1DEQJiS5Vo{UG9)CT<+puBHh;=+~BL=;8qV-toZO7uthMB zDHxC3)3|Ztr&Cf=1UgivO`9g{8*IJV!~<}p0W?^k_#l5cbqB=R&}a8^P7eBodPL_m zC|{e^uP=msZ*j}l;*tRf1CeIvhtLP1C&H%)?ZqAWnz-5nCuxCrIh*(xP^{RmUjzj= z?jdeB>-_?uKf+*y;dU5`co4z>al2YnuHtInt{wa3>d~Wz8*`UBM~Qi40q<0SuHTEG zvWzkOLIsMC-2Ozz&I4}N-Eqeqw!{q0%aQPMS zuOY=`y2~w-fSa)h-(N1!L-JXN6Np9}kxwCknzh5a+Mh2r# z<031`tms7@eOg+9?B z*pT#z9uC9>(*=!>*}%s$sMiTkBOQZqq1*k#jg1@2Lx6pE(EpgS<>j|}=gW%gZ;(Hl z-!EIAd`h-H^Q>%n!XtlRtiBc|OXB(G%lvZXyVJrv`a>M=fFF(u^vM7hHIOf>3i5sl`xLmy8W0@vsbIlzY_N1XT-kr5rmUA8;=Hyk`axk4pb(&#eTaQ}m{ z^Yzw}+^Mtd`@FaOiFF|R;^Jfv^y4=0dlJSa%P+Y^=0!%zG`Cx2*9eqB`8^8Zd%&=( zxGzIJhhpG+Dg&HgO!ggc5d@n}C^MWueF8*j??C!UmbH{LAs zYuA;ZN|u)4;OVcRTlxkCH%A>Qtj7tHFh5$5M{az)Dz3QB;tuMK{*6XEXMiu3UwWBr z27T@M@FPj}4U|Ja{wRkbOERGY4^N#c2QlCCC)VxkeE)s<129|;+MEZvqYO_#hzHyf z5T*f!V-Q{!SGOmjE3byHu-;xb? z-X+VUYRUr0@n2Ea6qNM~;75GCT&#FdPw$FkWlOd3da|Du%K2 zZpbnV_^`^tKft^ZWg>RoUZP~(5zxugQPxi=cM{u)I+m0wEo1=j6Y@6cn#Rz5mE~v1Sjtq|2C&y|0X{N_lfvSU z79v~Q!anVSzR_0v8Sz5sg4Luq%*p=Aamci3VnNqhd-sZU;DA`^>0+g&iM4AtaI{h~ zewrwMe%4ENJoSuhXn3itf-LwQWi15kdIlGh^GlX0Te?idCosj*@FLDSrV+#0rb4-k^ zs9RU&g7(PEkXvf2e;rb+V`1V07V_lE3fa)WGwEjG>_BDaK>5YTsHz;aD_ z;NtP{64o5}1XjV$V(1TDQX&^V?r+v?_t)^NtqjQ5uUK*Gf>Na|l#_w*ah=j-Lc0|U zm31MZvbAPy*?reNvj5$-a(M7Cv1ZN@Ycu#a4Rpgcvb`A@V(r-@*0N=iHFm7*hYi0C zb84#_HkA3LN~yg*1UP{$D4)85O8bfz-&{!iu^GG(hH)Nj78hi^OQr__A5l@V9`?y@ z(Ck6z3=1}?_2-}HUnX#2p^pfe2Ah2?y*t zK-L_(3;JRLc)`I#K%70)?N0w7HumDqko)t0`K4Ijdi6Hrc~(FkeQy!)(-u5c1N?<@ z=OQ$0T&j$WJ2zVP-TR=VfB3Ovp$*m|@WxK?aRzaLHnP18so-aR(mJ_c<`6l**1 zaS&}~J4rXhi{fL0WKW(f2e3wX2j+2BUwNg>1wJM~Xp%puKZ%cS?x5(&ci){+(Dv0E z@I$q;@zDou8IE>Mg1tJwS~XdRaltOHSJE+N%U%ka+fChZ2zUVhA42~QAWl9gSxGx& ze21=b8DIkVP*3!_revv%5wPU}zdw^|)EK$z@y8!HFmhzYEZ6|n&YhAC`JM%xo7um= zWPb9A90qS3e(Nnc47r|(acCyiQfI+mlZ`c?*0ybu4Zq*Pi4#liY1QhMKQ6eS_v&KB zw)_gbJOlYxp-jY5)OlT1&_TP~o65eilfehu#Y%x}JxE!FwjKoC>`sP$Ujch7K~lSQ zmu*izDJx;4&w@RefPQlz zuLACOfTwq-8h%-mB-Sr8BxA@>Nonhq%^1rjo_8MnKB2HF1>=1e{BtgWovC5`T}_7- zFg{Y-h&$ZW?^2xfLA&A+W}uDBFy`Kbac%NP?d9O`k&^YxEa=0vVy)jUd*&~f51(r( z_cd)Q)oYwv7rJ8N>tSKpz{852x83$|M(^Gs*|TR$7I-TIK9_?Ss~v#e^uwHZ;5A@= z0P;cuY&w6MxB}fOz8qYYEGg+2e;)$hW@5cCaf1&`TzemSsPWozAcHMT{-HD;0 zYgl1^JdB|HcXxWG~)lIf@(bisBjZA^1o# zyLOdq_-_ur@kYrx*I)m^%H_*T(O-ypwV2s!$T$Sd-zYxFAD(!+_~QcF+^qj&w5J=wKm__}Io?_i8-HHKs`7B9 zDpIC&88>9Xy$CBBSF2{decydUCcXHgD+9VXt9^Ub4b%$?C*UCsu>2G7Bi%2AJ{kqQ zbgNofyq8}r@7;T=w0+@WY4^^H@^QP@q;tnN<&!S&$S0lOmQEkHmJV%Skq=sV>i*Q!lB ztOr7chULo3H`SwLQHxtQo0OvHOF*Qp|`VN3JbTE1qY|>y6(EWvOfAqGGBQ`4qbMckw=s# zpljlRa3g*90?oH+a+$P!@e%3Rp|y1D+EzY~>nMG{?kY>%3`d~vivGHfgF~cV$x^gmFGU!Gka-TqVSS)8SA~RZ-+SksO|oDM zABL_@r>>^X1+At6M$`qAN8KTR-n;uoX%AZO_Gw%BvQHPl_$x{HVWdo-HbLgkn<2mb zHdVTG>7-%#@+I=tTdk#i`;V|Tr-dw8GFO%?o-MOyO_9ly#z_2VpA6{VU3z@_zI@=h zS31@@SAGO8i1$Ac9D9K_Sq8?kS>W3=kEhz&k|pO|YE8Q*g(xe?(-*va9~VBRJk zz8Ct8hobL85f4Ma9Lx2Sq{rc6iZQB;vy?ckOTD4N{zULmDtHbvsa@%dU%bGQ-Ne7sdnyPtr?ARik zH?NnqYZ7JA!WlB<=P}@^FD0(0S3Y>SseD$sqRc}(Xd9%_E<<~0OVggngpcyTt(Xud{Z)Rxy5fgrGZ9w0~RyD6Ca;jO}sBZ zE}wR3BmMe*hVL&%Vr|_F%=@jB?c2A?-o3l=UFA>!M{2fxHh z)vjF!YYVQ?Fa+Z^2WJ{9Zjw>f9@(>JyZrcLyv&Iu_@y&R5nJ^(Rl4a`D zsk)Af_*er!7`_h^e3Pu-kaLa4Qut07ICt)(8FT$t4t&`BMBc(T=TZT6FI~DoHY6>V zxpOAV$Zx)ok6(OPzA9f%lE^2-31um0C*!u;B&$UW*?Hc1_W&R2s~ivcTQ^s~iI&$3SVx+UekxypAIKMqi@UCuE}y(B1AU(Z_T#Z0r3?1P zswmiB0pC?l;`m+00SCkfze&a(4*IP>$1Yqqn-|PabT4Vc1}Ps|K~}6-E_`=wu}{fYk>zCr$165Y($U_-@Q-9RZ!UjCM8uIt7-j^ASXW@~I8Y`OC4AJy zd^P8Qoc1D4PpMn?KbgSA!P>R`^v3ZsZJYOQzFN8h7lQ})k(o26%EpcBCGq#AiVxEM z{{8!<4(1t&59))tbLR@yDeD>{%+u;OZzqC%Ue6tTtXj27d2r93ow9A~2I!_aGJf1( z>H5m!G7xsfR`^#aQ&q>qN2)Y+>7}Jt2M4cp`nV8&$=fj>;NYaF;Nue5P}6eFQEUtk z@05i#AcwHlSba$t=W%Soaar3-E`*GFO9l<>jlC?Ufkro|o=8mmU1^uPfv~Jyr>=}0 z`vYYD9{Ks_pViNTwdI2EMFs1;PMJR_uSUWr^9JmS!9#|~KJXpoBK7^YZ5zNdz{!t; zq!Vnfv7nhfw8yFMpyLl={wWi7;m(K%zuY2TmLqVktT5%(JghIlyt&m9;Q_Q|k+Grt zysL|E~cYJ7Y}Np=~SZ(H`>aualq)l5CxwtZN!S{j{6zJ2Dw_ z4c*||?$@tBU2fvMpj*f;;xQy;eLYz7F)*jG%Ui@&vd%zKKV)$e|?CRg-`}nWq z*c(Q+LVxeX{PvC=J9JGP`HMQ|cxC2(rZ`c3vIb+7DKhlyj?xo8nm@=R zwlC)(aB~>`ggtI|WAru0JS1q)S`7KM1YvyvfA9P!@ZrEdk9b#VNJ!ZXv|DXk@H%~Y z9Cx+3vH`~1ZQ$1!Dl1nmRho3@J2!j+ubGE76zyGngC+RhN52cD&Bb-*JAsEiSjSB~ zaQ_~xZGcXisn`3!Ln)g#pBOi&W1sTLcG<8YQD)8&`Rm<=O`a|2c4{XVHZ@&Orsu$oj1GKzV$7_Lb z&nvwL_G=30AA4UZKYR=MPq~G4x~k`MzeC(H&_?4vO~ez+$el0u_3xPX;<_R1Cj(#N z>#~x%B%!}_saH$ZRGr|C;(gLR_5{-J8St%~w1Y3!$$z}qkz)%MEI3a7eY%&-yYIe- z^2f@K?SH`UHD4zGG)THf*N{!r>kf~={!Pc)jSX)1XGIwwkX7FFV#Va3J(fy?eXX?Wz(F$2Oe}cq4d7sQg zKhp4RC+UnfV>-s~kXbhuVSHroaJ#QcXL~unitz^LOeaHsw87jE{oM-}{06_?HtY-X zy5fUyB|f%c9mtq5-^)3mJIW;LY3zL{Td}q@H|+TQ7uZsq!^1b`ip$)2j&+Uw6?Km* z;xu<2+Hk~~6L#%_oZPxzR;`#N@dLZaVDNhKfBqu}&?ojS9lAZ)?Jfa)=vtycyc7|6 zwHNIxd60670lq1Y#rpyuA7dV4O#C3&qRV8}%H`Z=N$$FS-kKk>DBBuSpxbxaQWrhKk`T_`U@G|u_)pr$?fj55A90^F7_bohK({G zGPh0RM$-4IF0x?$FFFUoe&+7Gb4?x2d5mPpFXvufF>y)XFZbZ74IP_X$K>@+;5~j< z#W70Yy`$35TlAxB*}O)UFZ)FXyx&sBVI9MsE3cA0;ElbYyAO15R@6ooUtYUnuJiNabYvmogmt%F# z4<0Xn?q}pnzMq$V3e3y-l5N|PWc8}qGRF6b^ue0nwOE6n1l~_VKequNTV3ueiy}TY zy4?>Z0UwLe&IOqBpIyF!^e!DC@54V5|D8|Ptxbe)1JlPF2!AI{-!gs5oRi$K9d;S)-YFCC9VhxT`+|#P5%ktV^mDc1 z!&M#l$PC0uQP3ZMxZJn?4tz|*`oy1sj~~lM%7-OO%ZIN$13&f%%>Asy_s`!-Kdif5 zhIOD$-veXHs$)G1%*QlsIr$vDTnxQ(z)Ze-g+Bj z&Mw0JmVCax(CLe0_RLZ8I&8slwd%>V>gVD+;V_v8d~9;LB7loSMGYTGF89@QfsY@6 zk1-`m$uO)_dOf_9ba<~Ne23pj+qUoGyVw6J{nw1Hb(Eb-nx%h`-^k{MPhQuwksIKf zxNhBhh~qgvG ztH|)E+LCZ?O&J4xOanfWT&{57Vt-M?$9l-onZU<)z{g17V_@m>(kiT^bcAnx+LZ6n zw`StOx^T**3Kc7)1Id zT}7Mwvdgc){v?y-0et`b{`>Dhe=L+avqnpcGG%30-3w%N<*JI0Y3MKdT@JX&C~Ejv z?RG!00PTwhT)u_9I|TT6KfH{*_uPZ>^Q2LbAuBOgK1fDjUz20OiFPP)a;)cy7trrM z_)1dXE7^kY$4JZA`$)e#=UzMf_W{1?6z=PWy+(8ohurw2?KB%>&SS|n^2Xe`^YAX$ ze!;J}dY(+3FhE{{J{);r0~rOqJ`!{{1O0`KRSUStF*j8d?5kC7_xs#vdQ3=&d<)q+ z6!_>+B0^rn`sWGbhQhvDCVNjX{-E!OJ|_B-a>G!sfvXox(biYp08uB;3;bk%s z>tVkI-OWLNSGio*1@Z>dMFJl|L4%f~eLuhtJqq|3UaGA0C|Oosy0RgBSAF5TUIbss zHo)N6<8$%_=k;hi9fc2!5mVsPO~E|WcGyPrHxdWB7BN8QleX!T=lnazC)~4 zMXSW+8V{ReG}=3&WEuGqIC+jX;;^3ZIm}Z39OtQzf^`5qN$>mzNRB*!`#yX>NqlU@ zbK-(LaV)vU`yA(UjS%PDxsNXO4E7Dvc`VAf6WP_I8`96lKbFbwOD0KMtnZGiQeEOP z{-A9&2H!>{8hrFBqWDOIERCFsHjbvv8(va;pr=-lxjj3-B@5;XV%3{rI;B_d7YtmLo55Y{dB$`VzNpSqI%QQ@-op31i#R zGOB(<`3CzGP_}L1ZW#ZG(0N(%O`yyoUkn;N7;98(;CqE>7=LVq-iNGOI!W3;)Kt1vt|p_RYN@Om z4IQ}<{e}@1KC|#{barsz2b~dgzdl$!IIbA*3ZAc;q$ERu8OS zUpRk~`mece_6gWY=SJ1U-kmocwJu@bP<&SmnX(&msI-mfN6Ayi2k4#LIPhO%%tyUX zd@!bcMLZDxPMNglI(F)$c2_m<epSnW}eKPK3rbHyvLBb7s@yACsJ1Nn{(PO zz{l`_zUP3={;^|=0zR@~_ue=UZ5;zyt#&W?n{KLl6|1z6!68KQKNLeo8tu9O4J2;`8ND;&jUAH2eAt}oogaEwh7e# zOgpw2>v-tlhvi|cHRf9Dd+&{rq;6_k4a_x&v}H-x$I>B$F~=8N-@`oHG3IdAryLJ=#>c)_*ECF; zn1C_hT={JpcmsO8KYWP8OGPMsje-5haTfadk^}p^;-Z2Nv@IQaJ(|A7ct4LsNH_3E z%lhZ(`k6JW=ffZIqkQ%CmpcEgV*z~spMtr*ouE~Y^CIeYj71?RdE0Gvbc(Pf1Cubk6+uB@?Cd)Avh<$VxJ-683F? zJ|u7OM+YlKilLv&^TLC3uL$9TJQ7FwN*+gZ_bbM2i9cn+__m{ zKwJM$zYZta|Su1N+&5>EZd?T&SuY>&ss>o32KjjVZy4twnDvtgwI~E?C`$Y^N7WDdP z@U=^AE&3S2??ceHZp2CLXc<5DYtZ3upvTo}TXOtGK5=L}F79(_0^d2qb=aSjv>yoD z(@FQjJ`CM4f5pK4r8$>RzTh{7Teo7rSj@{Vod1Kgx%(z*kNM5PMI9|Fw|B$=`x)}uD z$Z*)}qtNbn$SM9L12$DOaBxhUDiA+K5FfP1x1tXfDYw42$A}})$01c~$cLEEZGHWf z^2?NASOYjyHf>x9J8H9zi|ONX#+nC1<PufZZ>)5Bs+qin`KA#K zE|n3`af%D*49Z*D@6h3GPSDQ+9}l+s-~+1yzf;3LxIdl>Ufk{uz=@0ckp6hC1sILB zOk*#l2&zV$#+=aL_g}fwF}h8&9$1ndVQwwQyB(XpBu*1{~X6~Pk`9i|LHo? z+@0xs`3JxUnx`QMaTDMLzAB5~Y8|V6_Wdl(AHK>T z{%}rhJaB>^WXlhw%gB^lZkHjAu8`L-=N5;#-FdUesJ*!%X^G64JqqK6~9PRCQ+-c*?*_*-H17L^R*7OgO2Uo9}B}*1fkdeJVl>bH5kUr;K zB-0;!M1I6xLf#v9<7T^J*9og@9Pn>YP|HSyJD+O#R$A4z?-$;rF*IrTKhH`}&t zfR0!#8`dvX*~D?)l!U(0{=YX%Tddg|7t>4@Jo~&%f}dm}a4{L}`VH+P?O<-aKJc(T zFI+4^KYOFU_oCl7B5?0nyy6dqg^$2CFdc?)2ii9bZMFBy2;`lNb#8a74Uk>@vGxqu zE!=}}I_$1_*z00N8?XF$_kZCpsvsZUc$JLCIED7-vfrobnoZ({^Fti7ajd|()CuFi z$DE%R|Nngp->=VCTZ!UP0{bMeA#sH!+4qaU2o}vZ<*gMA1NcT*YC1+?PUq} z6`Y3eBc`Jrzrg089km{OfpsI-0}s0baX~pidGI*;S26(hxnaQTqJodWw$(-3ufu*H zfuVkA=)yMT$^~!0zJ9BanQI{CLRQZKZO#X+uY2t^S^H@>`RU$f(gpIP?S=K^3+ylU z)2KM%yb$SodEzw4v>BlH**bn(1DG>#o$V^{6!k*l(#f)Deu7LJKR|qKUzT=Q*WC^> zG5)4oWW~pwWFz+XUxaVjXQSRZ7$40AZBSQi1TIE|gw*d960#pYQOgNm02h=4lm~%* zJXX3W;)89)yqp!r{k=`ds$9A9%@<=$)5G|NcrjqG37KfWECFpU!MJM))~2k&K6=}* zE@%t(;a~K6Yx%Bm6X_aRQ9h~_C0*{kUi!c;9op#)`MzIAnJ}`K{54tUO?Jue)9l;C3um*Z|ix*@g#xy&=?knqJ?v*82x3w5Nu^94+b2b|g z)}uXb(XR9A)(s604^Iq5n>AoR7XJ4JSx!0>RebQjU;Ot21HPXbh5w4X`0qRX(^P7g zDN}r|+kMA&boLK)b`1jLgRBHzR^t1L4cIq!7rre_fv<5VzGqvDb)0jtpU;F_Zj}-L zxmdo&{w8s-hk8Kv_eA_9{-rYHf(zvbjOl-a4ZNbQSGElvA}R2V?7_a$oBsP>S%o!Q zD}e{>DX#pv0d;bn`Y*x3p_k!4{<|X`v6nOcVb>J@c+BE|v`JIQc1oeB;)DI*Kj82$ znGF1+@O+Lb_`Nc}kHs2;*Ivaqehz#qfJxn*kQH0-!UhCBV53ABlJRed6kPv_`>7LtlKq_P?cQB>dY+U`SRa%G zzSHu6ZR9fSC4;|x$s}RscieH@&<}7lKO+~V!;1v zt(rA!E`cB1#qas?e<#5nJ(WOvd+x<_GY3@Vy-K^Sv#2AK%T$ zR+P5`f#qXedil;S*E`p{T-)*A;%u}r8~^5dk!w*N#o7t_>+%1JSIOUa<&;Aa=8tUj zCmZVpJ9Ccoa(wRvTm)nN^AOz6KsaQFgNP55650EN%Qa|{%XPzUmn$S0up|6-I`1pf?kL(Z~I#2ax& z`eDD=Kc}yG;;0DVgY9Em*=Ew*euTXUJ78Naf9tKc!lI(0Tv1UqUjw{nAxuTUFPvNe zw+p{)a1B7-FA#S}+zH_Wxa;3V{5rxb#l-d8`7YNz&0Vf5-iEH}<#L_#4c6O?b-Bt; zaJkC-fbU{PK?Z&4a#itS?ge9nOCSSpFCng{@czpP|3i6iBlaR-OKBHq!iDXOU42pi z5CpvLf-BlJ8MekS{2#ai*975TZXY5)%?*lA%GW;;h#%6KgPWspQo#5i>~r$~+n9nt zv9cNcT!a2Cg?-x}`+{5ox$KIJjC|Pb4jSSP3i=xIIu4;L0*3YOHVAJbyo&Gw!cz#3 zAOQTXdk}6%xCsF+8rRhbS0Dh~u7(H=5H7X@)0ZGzhJfLM>so{x5N<_i3UPHW%6tgn z34~`6UPAaE!aE2bAaq3Njy8S~9$umY{>xk1>-AQ+<(6BX$Niaje=*8gt^LElUJ(;F zq&>=k96VEi_+Y)HjWh(ppDL2{L!RgGZaUfwvULqcA3n!kZq?gjKU?gN zT!%nB-imVWLV5Qf+=p;K0`bCn9z*aTJc+c zMvZf;<6r3l{x6RIcoIIhAdueg28;+BhhCon-@JhEGV--Th&3VjRd-PEE4behbPIe2 zk**!Q5tff45UvbNKaK#{20d-(2fl+|#QP=~{Id+gpYIdz_n|%DpZ~M>9bi=*Tifd# zPNNs;AOR~D6tEi$qJl=F*rLW>lAwu+#%SzfFR}ODHMZEIu`5Q6Np5Z~7}LapCRd}F z1Q6vY?SI$oGl$I)O}yXD{l3c&&$F1>vuDqqJ@f8&tyz0!j;I&+doxHB_Mr>J@741D zPI@~#U3=7*`|DlcgZY&C^<&66$TyHw2y;UgByxh_}HrF-AK-`oW2fuH^}^YgK<4%E!I#i*Xi{Oai7_^-z403H13Zfklh;)t}FLV9O~E> z(i-tr(C(HDB@ci_cNtlaK?b z`*u9jM&NTb@Cg@?4nL)=TaLC^30Z^Z+<-RPiuT)uHs255#3v?uhvWA44yPR)oz6l& zb98e4+{wxL3kX7&&mEmyE-2#6=bj=mkIMyIhy2c;p)C9)ts`8Qjwf)BBSw?`$GGQ5 zxc7F{VH4(AuSGv`y_P|ipq`5%OVLj&QTO$DhHZEjwmptPcsdi?U2GS!jrhOCSJI9s zPM@=0<33_8V=jfsuSvsm{DSBE8MwTO=S~G?ucIBVq3y4tU9O^iuA;53VeKEp`I?in z^EGE@mut>0uGgGh-L7JvNZy;9LzXKnNKZkSg1yN_i1=mou{_UtEppYx#q}!6yo$1~ z;+x48+zVTQJEh>>DX2pVFpz@!q~P~~Qw&Da71Z+@>U$lSxru)IC;H_M-jRE-Q&?y6 zGqSD_;}(Rh&!w%!ZS#L&e9rYKPWXMwL*L{AXSsGdeGa(jvC-u47;W&#!P(i2w#jzl z-`IjUySU*u9$d4~ZugyC-0!13GjW`Oa}f7*7gzUmwD<2q+z{G|i*gRvrHlM7E*au_ zH@8fboyq0GmzL$^>h{3d+4TX|gFeLjmhFgonCu-NnM@9k40^+3o!*cGy_L)L=K5R2 z_W2|}p9ud$`s0cFqMrYjG;mu!-lcr4&X5o8V9C=NO?kj8OD@LF5XW4jv$ItkoSbqo zRHLCX^VVxSZQr5Gs1Kq&@FF;I$uQVf)0pcDh87%0U+DF#Y0P>O+443uJ^6a)WB47j_y z7ho^{2l&0RAFvm~Cs>cN5^IU)VvpLHrShL^18(!3J9l2h9E}n`mjLsp3a|zx3+sW7 zVvm5=^YZg6WB80mwviOe_DPiNzq+uVf`ACT_^j z&yW25{zJROOV?@c{?F*GHJ?zAg?p&Wyxr7!u9S}uhs^s3>3q&2^AXP9ORp^0M_nKs zzOn$nQ?YPAbro`ex-L3E-7M05@yFDC3ClqtuOjTR^iZKJ`-FN*S&lfQ*Yd;Edj-o8 zMOGf6K0=OCpH)YxuaINZZ?#I+Aim}}^)DhPsNdQX)V~-RuJJ&PUWpG_ ze_Dwn94O)(CL%4725wMf0Kx$qA>#N94csW@Q^Y@|*KqtAhnouJbyb|x`8a;_S$gZk z^K|(av4_=EUQb)nFo?O;`Pj$zZVQMt% z2sQrT7&V@AjGD|nPR$_A=bfOI3rafLb*NHouyZCk8W!|75D9e zdv{uKM%0Px6^A;$yfhJYJ}v6qdeJFrjpvAkw48sEn$JH$QFz9tb5Br{ImfB-?4#6V z_7SwjVQP$a;r3}X{bQxQrlQ@Zp#3KArbd%?QNx6t)NtZN;~1wHUjKnv7aQ^+v9xy6>;2x}!Ey-O-z< z?wHL~Z|qj8KW-b<8^4|EPuNNIfxiZmKB5M|UxO+8sKL|&)L`1j)NuMCYB=*SH3arv zoP7*(oEpvHzBmE=ouKG>C#ePcDP{rp*(qv;{(A|1$@puBer5c10QNeq_!Rg%ORu2+ zyRAM;-GPZ7YtIRc^al3&YyftEz5c+`K*;M`E&zK9-Ue^`oCbgRIlZ}E5sq`3z#{T+ zUcRRPrq8G!qz}sJyTCkcb)ae z^5b6^*@$#-0j)0~mk66JshKTsN4-g1sR-z95#jwtpeg_#9)9amrlD*IMxhJoiGmJ^uv$ z+Aguh-zji9bDx4g=01Ms3h{T88lp|ay9xX?fSzbD74NJq{_t+s8~-6SP1r`==Is)8 zH1>}iiT)}v*uz*V54PT@-!if^17>fe`ftsqdPA2`y?0ko-S-%OtEn#VSI@$K^~Ny& zDfnaltB-e7;XlUT)A^6_$Na~Az+Aw(NZ=2BB=}G0EatyL{7L>Ria+Q=@E>zhPv$@H zl)xW2i}}xrKjuDhsZD5au<8LwtLKuIqBOhb-N&KC+;O`vt?^&ULJL4Tt^sj~g zz|T+cA9(yp{3-nRBJ{6#7a4yu6#f&sV(QcRuVum}8ou@rJ<7>-z@GZwmlW>fas0`X zCpX-Gm~A&;=31)t`V^}B&SI+j?s9=Y$$yMLsec9kS@f^uzXn$QtKvU?r=|Y2^50Pv z{#5)2u6R=aTKG@ce^URd`R|;ff5A~|{j1985K{jN{sZ?Z`d9KF;}87D`d8x5%71&PA>Luuzx7%Fg8$go zZZUQR9sJ^3!g#P9*3t5MqW^mS!@8&ftaZMao0sP?df9dg>otbz3|UBZhAp$=ukI82 zcLOQ>r`Ugtzxu-d+fl6j$NE?37%To1{VVwI3H__|otpoI{w;#Pv&8)`_-_sH2W+s8 z?86*rvHt}Apht_^e-;c{^ss_GwgFZ6!!?5cHp2eH_=7RcWn1k(a4zfq&a2J}TR_-< z%g#`H)KBVPHU0$uvHi#RW8G`D|5W@Z?LWpJ+stgcSnwz8KeX+O@2{fv6IM`0R<>@_ zrcEE01nluM;J42n;eBd-@a*5Ia@XM$@y2X$-%_eO)E0lMpRoVxsr0XU{869nKW;yv zhxbx_F%E%VnaVhXojv0djD^`2#MlpGz@{G@p{NgzQuN$o)Nb@$GUR`|#*P=WKm&^C)wla}k z!96?U-W?%ampDj!)Qjub2GSb!jYYj<<{uZ&(j3nejd4CdUlT|psdokMeWJ7nzn?tr zkl0Ir{W5WvV$ZPc$74L$Lvwc=W9|#X9vk;d3jPisK78P}%q(4tAv36Y-vp}jHuUaL z;Ln!--c#(qC-v_Zs*m=mgE4U=a2p2vRz*3XJ;zYx?(b9OZX*>DaU64KkxHsKr-i-> zks-$+Ra8>7$NN;Z$0({|k*YmMQ8h@_o}-0SLs+fXXsQklua2;q2**%ZZ$)$FH8IEVc?K2b<`e}py?K42n+4@jVzEd7-*e8426 zO+uO?;&>p^ipXS&7^q0NC5*)RhJ&Wk_o=t|H!?opZvrI&fAF>BJbwJR`MQIjQfQAc zRQt{O3jW?%qVV4^wf(2YAN22Nj6X(iq=>hdP_=%OiLq1@ecbBZ4=8^2dP-RH5zYJX zFfG}2%pyk-T4bjZF5Y>BmLSgIV#~S3d`^gRZi&dl@!~~XTg zYh`|QsLs#vr-|(~GT)!Mhx*#$;<>rGeX;JoL~tMWdCkXf> z7W+@~-@7Z}gMs}wVy%#xgFc{Y(6Rkytfw!&y-GQ`xldqC-CxDEorId|&f>YvB&6`T7h+_r8U3uZsWbNc;_7 zN%a_i@B`L}pGCFam_b{PeL?0&IZxp3S?&Ckc70|U&${MW=WOet&MV_Gw9WhPJmz~y z;c}nnp6a}aH-yiH_suC0{D*Ici!T3sm+B3fOOfC+Vf($c035i8>O7%;!GFMD%|UZ0 zYWPC>;=Ail#f-Ymp4N|?=g;JO*7e1mlV!@#Hjiz(?eQPww>|$KJl5bh!Pk})?A5DR z&zzf^7cuXnGgJeZsxuhEV~-;ETdMc~EgTq*bM@X?K!3k{^QqYTclL+G28S}PF2A@m zdH!kF$nzXNEzi@^)z=nxy}V9_>inFhKDLejiSvH_`}gNPXaDQDkH_w(PMtdTTjoQ% zmgCn^#GCV|4r7o*V5~0lpY*|4e1Nqu)`);l`oM*6MLYgcd&%~-&1ZYe`HD-E*UR&q zr?`B@rKzt~$7Nm_7I#jaCgV@b&*@J)$Jg4Pvpp^@kG!YtIs8s9?}7SXk3D{W@Vf@N zXp2|&ef}MV16Q?yz1o8R=27jp<^z9h1H%7e@jE5%|M? z$Ui>L$#d|Db~v{1y6OY7JXKjmE5_)H}ah+vRC(Ynv|H(Kelr z|J8HFl_kr2R+%!7?e%|jjm$6e$xx>MQTV+1ZOg;&YPWH9buAI!dU>uaes6tz^7T9L z9dDpoz+3J3*^2%hJXefC>RQIYatsoQc~_HneoFbkjBK0#X`9M&{wS39k>S(w7k6Hr zCgZjtmuH(MkJaa%c3*Y6ypBUD>hs0LF0|H7o*pHVH$ zWvK=1G5(kX>i~a6#vstabujm;9_Bg!=oBmf1(}#RG<8ra^(I0Y#(#}=gBL} z|FhxK%9hU}Lv?w@rK!)$IPz7*p7Fe2@qfMUWxsh+QqqUFf6t=k)Avwq=-ygy%u?a6 za10`RFc^c>9=VP>&HtDlm>)kAf3m%7!#`^0KRRz)UUA3&jxvfX_dk{Ptomb)>CBR{ zzN2Z=ra5@l=q=}dq&gFJ2;3Fo4?5T~22p%4JO;ry81o9o@BSS8QK+Z>OuulOvSh_y4-nGejAo|O%GNEr{ZA!d=5`4FL19w9E<0`*lr<0H!$5AEl?Y}vA# zC4u{Rjvv-f{tfeHjjt>_fq7KxsP=2q!GANMgTaA=po0fnbTG!iV*VfauO8-4Z9aeb zPjMgPP4?5T_aD-tPrjsqD-Th>We2I>@`KcW#Ubjy@)IEgRvo4RtB%mX)ko;H)ko>I zHAm@ntVer&-7$J&-En$j{RxVP4BBv#25me=gEyY0!JAIgn^<@A7R#11kWXpIR+h8$ z_O`S1&WGoO48_{8q1!*Bp*udKVLL9+u$?TQ3wd|f7bIo)t}ki$Zbja+gnaz|-mmCd zTBh|`N0C9b(^z;x?`PS&xL!b&yoXZ zi$mhMUtfC+&vy#XbB5m8c23ll??2^G5fBvNOKbiq0{UQgF!bt1)MjpVhv8PE01Jm;d{2b-zc_;u7`_Q#Ne z6fNp}h?*g6Hv1Eb{@^e*gK($_o(Ip=;)6p%S|aSR>LiWX`!{;{C`W(v=+VTI;`57+ zj=l%o;Qszc|DXm~pH_R|GzEY7?yKlviN8V{kmsNB`h*Kt)1Ip@Zr=HoT8>^y4d27q z#WHWYF8H?Ys10J>T)i<^J16GtW9^7oxAYSOJ&m^+Pi z4*YJ2wR4j!800y@z@RdJUzs;8FgP0+yKKY-#)#3=b7y<`$2|0_ixz3tzu3we@~Gd zSh#jmnY+putOpG8+-Y80$m{2Lt%F$eD(3Ag>xY>eBnIUgPRWDTb##`sbd6O!7>)I| z%!Mqx{+rh|#efg37*t`A*K4$xyp6g}Ur*TQ;hE2?#v{kC{PYXedt)*+O4y;S@jx8} z_AKv4BdoJmc+Y}8<~^+U5Nopd-2(O+Vx4}6xqE2#{tNt#$rryz&A<6rBJj6ylE`kbQ2!ROq6GSwO|#ezSKK`b1o_yG&Y!TcSh-J;{P_v`1MZ}4lzed;@TIo6ZB zM-iA;$a4n;2flC7!?qmAdRVOAwCG{W`VqN?Snvea<_LYoYsGlYBI{!2LCacVv7Xby zg{=E{O((DUmN;ac%v`8oQCXWN)~Er8G4qa6{UNhy;qDVfu&2hFe7|HGhb$j#IY>1J zPQe-$tna`*ne%vEGuMaT5A`~8p>vt{U{{NGN^sv^YC2^%b(+0{zD)U<($mw2mXvk9 z@EzsdxpSw>xs*FtpOZ-SG1iR){vrkbEIOFSA^c?d2AbI!Ur*U&IYRd>L?0FdAxqTaQ!ChVelX9Kz7m*WW5F)iv1M0&zX17|E!O#I0P;P4zUhR+K0R^fxsie7sqbGdpVv`z-8*^ zkXTcv$vB_GT4`!J2y=IbuK?#M_f>Ew_cyTEd;Gqrcu%Y|m-`%Gty{~ypBK`2E|<*eA((=HYLs;|Cv6B<3vF;bNgx3irrMT&jer)I$dB;Jr*g%pt6UD9E-?(JQ#!07E~}OZNZ|t_{njJ z;2>a-b+Q_Va<2~_Cp3pd!^W+ScXGhAm4eUIm{Z3Ycj{w~?>_xEteY7v_AQXMsIc{z zlQDMVy+*{IBh1+roy*u0HU)Gp^E>aC6El7dZ9kJlX0y3pG$mxWaDQk z*o*8aMfL&q1pXukG6v;1#G-?F93scTm=jYMcwwKw#tZBdcv1(earUe@&)Zsl;4DSL z#~s1*3wb!i;yw8p@9+4Q7V`8-~=5eFN9%Kw+JZZHFy)3wym9u?vyCUl<9u&{yFz^{-V=#EwjnIM zC)P(}jc=pji)bp|PppNg*s)_r{>|(X!F_x8?%noVmRZaD?6erYk|KJKS7ESt4y=vu zA#xldIWQJ`jts#*DL?&|^+f-u`{R$|m~Ty6PW~P1H5XC%JIj={?9wMF#v_Hc;FCP4 zU{KA2tiu}eegPIPRP^yD)WFJx7M*P2Lunt%af-0huEBKorIIvbf$$>U@p!$0p&xsKnxPZDWIYJ*C`xg7& z{IOs5Svcgr+k4?Vsy}iyMev$BoAEG@N0j~C6rW6yF){lFu`hsvLG&a0EtpTlxL9(b z#Yf0GnehPoi|sJsvjz^uSk%IctTXxhc7tIH>6hP%|K3&{2086cdKN{E$NFdRm*Bf+ za31qC*R{SHdl*~szAkm%noE7Ats(4n=MG!_N=d;V#!z3Fb8_v6?)ZvYPS{KlJ;zdb zuW`U2@Q1Mg>)~2#2U>kGYzG$lVhYE?$~WOgBUVzkRcC0|-&3u6xVXM44tuuw`1s_- z>#%z;=EQfAI;@9Tm;=>gV(4O99u)p*@r}f?zZUnY#G%l~Y!^a!jI6Q^1up?35{n8R zk5Kr#t7!CwqkqWjTxa!jY&rWq)n@Ek?*Y7XTX`F*Z%Ow3#;ztLHJGw8cQ zA9W!Pg&)_#hYBYuI23wW*oPJyQTPrI3qFd(o^t=VcDo3+B+hIxC+iPiD)m@#O6+OF zWh;7?_wG}0r}&9@4refr6gfIWT&_|9+R z`=!@wJHMjp=)daNe!I4%wu;^G=V9@H1wtN$@_@rM1K3dE> zPOCpndG5Zm?Mptsf_=0*FFh&vq~2(7p~N76pW{6)$Es~Yxz8{5d6Rx>p^tgLEw<|| zI0W}F4#gOS?JpJ{tML9?f~P*F+Ssdb@87Nz(Y?0shi!fN+hW3jWNM22ti*RQiCf1D9gWbk^h|fOq?Z51smVL{8{?FeYV6U{##Q2eIK7m2(r={3~j6vRK z72k@P2jQQQdkwNK6Z@2*pXHu!;+u)!MAm;6`;f5#-K=ob0jdw&w3&Z|(lIymX_zZ6 z{dW38%-Q;sn$84=vaYwmU47ucHh8WoFc%EW`M&5$t;oF>LZkAdP*THwWI&yw0W02Pgg>L`3&C#ycOck@7;Ca zy|onZ&KmN0b2&Nmm`De(w>xyzn9k>{W#Cot&Mc_fwT@;+n~d3PH_WqVAZihZ!R)qrUf&fn%3f5Hw_zKh7U>by3% zHn1>sQzHGIWiF!2o)?GQ&zTP&)6_%wR)}#9&rMZ$kmt)NK5F&%V&=m77GJfp_od>m zX4_D~B6PA9hw$52^mCJ$2gUrqRLnhFUP`kMeok0h6z${VQzF*& zdU$vgq@|^e`|O8Qa_u*je4%Rv{$7d)2Bi*W4ulT2*nw6K1P^*yIM5Ru=<&)Zh=Rc~ zjKS{X$m7-VROZ!*Z!vd?NXfF(`0o!D94`{bFzY zuTt+7spGTi#pih3@&5j=sqy^7Lbv)tzbcrMT*vlZp^X;+T^k5ptKd$-UclQc$ro6x zFlv*SW4dS0o}DGd?(5vSGk@zXH)zRDa_=;P%C>%u0$aac$boGo2BCwCV30Xb(Zdph ztcL{#EgUF#(1Jlv*e#yGV3}UPVDHJ~1q^!iokre$r;}H|8RXb|3Pp}sLMgYNZ_ada z{r~;#bn)8=ZD#LN<}C0We)tLN0EczhS0e;t6O57Bhgb_^=USt;P$VQAQUg*QQf1T@ zs{H;IssO)7%Y}#O-93Nj^%Z{#fAXD3xsypPu#TkSxE&UpDOeNZSz+6O>)5`Nde*{s z%z2DE{~;^L58^p$JH4^(JmWbiEG+CnNx&b^)BgGApSRw+_q*l=?1AgsW-yg)^_mKU zQU~)mM2>}(v54S6p@%IPWIc?rv4TO19tI9s50~lA95{iBVsHw13k*&rZ*U=tE3jI9 z@Jvd+`tuWgEc>%KyxFF4-ub70peC3XAN2ML@_!RH?VC#};H_m8_||fS5cFvPbea&+ z*WBOW8}5JRAI1Z4!9I@{MsA{3%TCg+uT!6>m%R7W>NgGF9wV`a$ba~H;E%@=%6P(` z%V+&6bgbk%t^)-161aN{*h8ItU<*1V9H0x=@6qkswc0KP#KFzJzPd@3o-|)F$f<*8R+36JjfUX z7kXe!T?uGxp#qG2eQR9Xs~-tcPY@qxebWhcO51UaJTm zRO?}IU~&E!IUZ&Vc2;2!O$pwPvW$y=?91qP>)7s{&GWf-0MTj9Jqb-&8^ zvqJ9w_ddQzehK@@3*$x>Z-K+bz#%XQ@q<0@R|JcULkllTECPq2_%=K0<76xLo^@aK zxfP#ZBkw5(75&QGD#XHZ7M_z_r|=zc$M1!x(^65-z;{+r9<~j*M9cxb7iLvuJ`Zdd}IdS5| z$&!FQeulPf+up_6wlY0ttRpXQnBYB&?I(0_5j)W0kFkzL3dh5WUm89^V37UNYM%`2 zV)hFvV`BEn$T9H*D#POuD+VX2co6m=#wCnFPhhv~E5m8)u?v5QL3Q8Dcsj8Xg9DYZ2y-Cxv)U)k--i8!9r!lBjW7om`lXfeuq_Y5FK9C!VZTfv z2H768j7cyqQ80+HG5p!S-A2*U{b&Bv+!^K~wY10n6|S$%B_Dh@WeobfKA*fH0*AmN z^P!@bB_}HS*$29r#S5IZ@!WS-?o)G}`aUww*k_+hk7XYV-Ysg&6>?k=o&)v;AG3`L z+zERDb*qlGO|Rnjl~V8Br|Z|RFDfbASE*8^Y|OI?pZ?)-3hFT)7<*kAci8eDAB!}L z9azj*gncr;{B6#PL5p8n_yr5c#ELBlU2O49^O#ur1|hY?v+?ga zo(_F}$%+HXaeoxPv*rLfL(lsRoULF`V6hN~R!+3&W;GUFf!PrJj_2Ks2hVliE4S_e z(;tv0u+286uMoxNlzP?5yKD>KQ= zd>;`Q>|Usg%K#_RKPWNCK0+UiO9J{#rcT(O2lIWOiUl<{F)sOd+UA4gf$@y@fLRI# z2Y!GMT*x>Sd_PSo+WH4QF)n5d zD&vxA6xe?nH6Oi<9%BD9+y1x3o%;N=4SUHO<0bEYGs(OEEZ`74C@{!4gs@%~oH!Ra zWGpIp^aAGwba@Q^AUUsoGE&qaVAB<8)IK!j^71KJ^1~o zhj$c7O_~%&4c4Zl* zNVm}x$bz{rij1YeS6RkUKo6GjkO|PCQeboTN>B;(Yi~sYfIH?oe|$3z!21!%??~UN z6pU|!Q?`lUaC`!PYP{LT-(9*LEbj#J1y4OlOV6dS&!s8$ zfXXQe_+!8MS6_WKj`ukmv3ft%$NHJ439qer+PQy6I+y>ndlaTG5P4dTSwVAlpBBFl zXN#|A9WyREV12ANu)|>l7KyahPb%6-_Ty= zxzD(*c#i?rXNqv#R&3AlvF$Z7&(lJ6e)aV-T^-7}%%>bb%jUDiALBu$rDH#!x-0G48)2ssxgpx-pAiZy&c-Tl1?{^b3*T-!LO z-N8Cw!L@=lmlmuM$Fx1G8TWm`T^_&>e=dG7T*dAVM)Zg+pbFYw?8?(-0SZe{)#&jI7_e(dK_ zI8ot6>HB^G_#3ipkF^}z`^)lWx;)-^{7d3%nLpK{@S4JH0%y##Jm*Z{O|b>UTr}u> z57f&Q7(AMEh3C2ScXM+q5!{ElviZON{`(-=W+ge4cv!OkEbxFihCKh(>g$%iMmZl= z;Y5K&aH20TP!8(`&VPH&%5mIQvdpK&A3e^YwiDM-An>R7%q=1N&x_y;cw@e0-@4#l z_?Ot%j(hWa;Rb(c|M}Y}CnvYe=+UEpC@I{B-#`2bZRl5$aVMXRv2y+PuN3+AJo1Ar z#=dS3F$YnZhv@O@1n^-Y4wY{&%!vu`^Gu;O6IR2=E%uPNVo>6bLm8J?AAaotv{Oil@h^yybn5j zE(_6K8rerBIpqE1Ut6$)g5X0eBfhmL-<=g4TKwIZha>02O5Zozh&=Ate4^-l8;Lnv z+)4cLw_euQLAX|OnV8oIYzbatZexrIeXr>{{tUo$0ui z%@lJd&*f3(cXP-#rgAJpUJJ-N-v<~h3wy9K_RXHW^(g<=mK}6%Z>)t#*XeWxB?*7) z)~&mWc5{*a^jC+r{qtAfkIQF2UHqb5!gk|t&OTU^>;v5Sz@}pHX8d7&vRCK##dk5D z2jL0)Sp_`EJk)#6)?&Z)O8luq`COlT`JLcCZ*ZC?u;m5ePzoROIrd2h0HZt}XI(vP z@o3ZC&iCD{P`|j-DzyEJ&E8+8#ZB|l3_-AR^$LFZ_+xS)wzefoA zmgn;nFMLj!!@y${?kGMz&%BMW*|J|l-x~QkZ{D(H%Q5WL z@-2KS8Q9~lMELYd^7~TyY$an4`_g_a?Z;9KlwzP11Em-!#Xu^VVxSZQ zr5O1C9Ro&B|2(5tP_9O!EwR4$|KI!gfAjer%7x{J%|ErR`utO~t1mb;&!bKM-_`Yr zT$eJh&W_tdb&l>&_(Od=z5R3bg^BZOEI7W=?S&Ug@rijH>bCo<<9gSImrUN#3+zn3 zf64DzYK*SACZA@j3?5BBBeMHTp3OP5PF|f|H~T{>)!uc}A+YPjB6}7_tiSeV?d`W( z*y7KxZ@NW4{h>r8rfpU1X1Ijh(K*xn`rRGL7P{Lw+)N20S8-=3l_5 zra-Ir$}+h}d}eU3wN>w4d%vCi3pYt)mk*tD*UmohC(`Qk3AQQXcfkY2?)zkC^1f&1 z5O`CgRlmb_`C7+-J36--pBUUDx9XfLU(o2Cvo%_$$H;qCV{pYY8MxeAT8Dt!TBFzR zde^X{$h%ADRPM4yYeai+{oKuZmujEu-6KELxmG=|F}OXHZK@8ndgoj_$8tX)-!6kk ztvz;*FI>TM6xp9tW9Rn3&OQM5c7BZW*OBid+;6weG2{o0R&UL#(Yf459j_QY+kF6j za@4zpUC`MFUeOxL6zXA(HqXu>=nC3xx89@HPCJLP-;vR%g#`r#c_qa`&kJikRyi{Q9)ZICcb9bAnoY8*%|1N6&hCGfLq2DO&UHTeIkLjYH5=`ND*gGrNi^DgwCiD$ zfBS0ofpJdu0quhzKK21|9wzS=W}z~TD{9-#ud)J;o$#rGg%LHX!LG63VCaz zO-1`_bk1hjO*4_k<$2=T7ZAFjFY6gSqYohNu6M0|gmmutCjWLF?ETxl%vvPfVKjd{a`Nj^= z+WT357fa_Hc9hG)J%=K6hxj7DH^j;0*J`j<=PcfHozsik9RlL)k#2zgCFCRr=JJ}vtq4bRlxAA&l!cQ*O7eno2vzNxO8Mx)Cyc+{DL^SBq^Q?#=i!b(Q3 zCOiIW{VVJ81pZt-^D7Qrbu)a~+4aDhW0?lZT7xpN-Oc5PuecPs`G;3)?Yz;b()exP zc)v98K9^(kF8ip~wksWhTkq-%PA@7yY~`g2Bi4Tvx&8WBq`B8z{r9m(zw*}iSl+w1 zQ0H3XFt?e#f1BPq*NE@%F5kCvDtFK58@toh4oBWF z#-GN{KHuaU^DdWd^l3g{=UVYL%FfccRR12>>4x+&=u@N`@Z}R z@b-(H!wcy~uckYZ<_etnA#Y8+TaAn0t4xDO?Qe0P`lw$WjowA93qt+UO#Uy2qudC6 znL3HMSGt{3$Zsa!<_D2h0q3H%dOy*ATIVo+X5gv4JI?R2a}4#_I@wFhjhlF(fAkI zf3m+Ae|3cYS9JVQ`P~`E6#R85veqSR@!7X(?YP;>ShlKlTwG!Jie<=K#=qN$uVlF# z+LaA1s4#r>A(ZbDI$`^1^||8WT7y?M+O?9sZ=3E~ec2*9Lt|$sFt{~2fp&3lD1yJ2 z`vX74rbWl>=6V`O-W8mTpm#=q=JWHf4F#5$Z_JgzzVNa~r&^cFSym}e^TFfVd zu|UCJJB{9}$^61HQ7^3y?{?G}lf*yX_d#xD?nqmH!HP9f0rEcrOd{qR%vTj(J9(nDNLDHT>6&KjgF6@}Eo( zv*J(DzcRgs1%D>u?))AFfhR}k zJtFRb)9>k7+#v2OwbD!halOE$^|S`x91H$*;HxBcnH<--)Jfzv(Ye>VD9;(>_}AVt z{(!7F+^o*@JrS$tcV%Hvtu zd;XQM5jKAXfPvXz9Tv&SToj1Jd?78Jzci){##R+UlFYseSml}1+^b>QM6@Lx^?ViPd(6@16z(y|c&<=X{Wm%4GsL}b{M!9Z`KMmV| zz#sanGwVHdUf^#V`o;zL|3#gyu@6QcxAQf6H(v!kcMD~)&1Ycy3^-$(%~p&kCrE2w zIg9a!dl^yBRCSpgx3jPPHLf*6hg;uC+wrf~-aj4B$M&LLxsR|B#eG%xHX@G~#!#?H z+jfV29YZ?*BF`r8tvV7oze4m)XT#d z&~B*CrSdtQQ-vqRv({OiN9`{(4(@ppe|8SRsj@yYl=#yXhd&GdX^jC7QTK9?-cQ`i z8TW?3KKRt&S^vBizCEK)m%*rCZH(_9%loK9ygv`{ZiM`&@CR;s!v9x@zoPnA+JBP& z?Cf0%YOeZw$A}Hzzhv<6f8u$ZsyE84@ZPHZW#3wMLq4N>i*66X*Cx%0-2DA;zYasL z%Wr&k@QdKN-Hkr6)7iHo^UKiAz5EUIePAK}^aUpWmnNVs%W6%YMf@MY*&~yGTw}%` z{1dt0rA_D`NATMPS)Mh7J&tkl`zVK`{xv?0|J=ZTe}F&I81bIG^b+pZ82bK+eG0Tj zzu%xMI~#r5E+MiP_8;@#zluNhOPPFL?uRm~VT@B~uUhO3t;sJ7=eolNnV``*AURb7wj!)NmN!^!={ z&QFd%cHU@Zs$46doSjA8ecBKH660LgsD`8W_>yywJZ~ zp24HuInkD$4Hv^Vr*NB{eV)Oq@f!3$^q(^R!1Y;(*M-yoCtc(|0f*M z^;!|@FAa{|aA_d&Rz_Oo(8;^cX&n@-a{gMIe_R0k5%e|zx2^Q9o>u$;0A`a<>`1f$ z@bGd2lW*&RCjU0C;28d_b`9_zx0d4%ac^*&y0zQZ#xb7t!djn6vTU;1) zj=-hSquw>}YZII+gEHGAFUoG)2*>W=pLYcg8z!szt7^o_Pz$#e_Sup=<*F^ z8f-_IKB#vk+^Y}j*%Qa*AR#z+RK5ckcO6FB^WpD_?{As{_)U+Y9M%uP;NM<&Uwh+u zE8{o-`gafe%|+crpH=u7?F9_N_vhaRwr;DzO1r_&>fe3<>Rk4(#GgZOwY=(ckFTsY z_xMb!%szBP@9vXZZO+kk*0edtXOOmERn&Hh1On4@qykc^hR;^j7DEJ+u+fB4}1#oc=nDa-!?!qjRqEE85t{^VVxSZQr5Gs1Kq&@FF;I$uQVf)0pcDfo6$4RG zQJIiQkV+QeIH!$)kd2JPae13G&QtCg>0^t@&t+#o5+D^V!f{S3faF6?KsrGDEy8h5 z<8z$nF=QIV2q7EcG(N|9_Sl@GVvhGB?WJPUZS%H4o`64*&*x9(<7fLb_vJiXM-7CY zB7BaYm7jSsL=Pbw;WR$SdAJSpAjcqa5I>8wx1{m8f}w|WF_ZVD4swq9{OA&MF!}DM zVC;jASouMz@!R6tXC-u`9s6QK_lFE><{Q#4wI8k6&@Xk6+fhxhcHhvG8wN!MZs->k zq}@lOLWiafiV8xG;GriMm@5W%3`)TNiw8V>7nwtX9fl&!&Hdh$#o?e2|byYl*UJA7Ln~M8RGKbK0v!_$vzRDRR&TzWDUqLyX3+~&upfaTz zV`xYJc%}SimhxY;mY;Z>@A&l64>~@h^pMoSn+CV^(>~VUKc5k-zZ>P>e9?jEyT<;} zcQwtTqcxAUnUoQ1_hXcM^Ns!8!c+S@rfOn-zFiQk*_VEj9_ur3l{P8L)OOLv!~CDttC}Lcsu8`qJ^EJ4 z#zBL8H};DP;C|#D4!e`yUKcZIpS&-Hwnh6mXJ|D_tF=U{@qM+H`^ILv`DwylPLZ{v z(AuJ1jrNr8N^{Yky3lGDb!mz2_Guaua!2UW63|mgZ#6Sh!lyCq)1w^w$JZy%Bzcbw zcv605zTeQJd?(y7ID8b^F(lON=H`^@oM9)<`l2N?`%eCnK7Xy*j&|Z+BLf{Wv<}BJ zG>(^&sixEEW{oE`-g`SfD4|(m^F&uAFP<=#--5y?j7p!JP+0%5mM0{){_$wrO0r%Q z`ZiiZm+7sS2z_0&j8any?IWHWbrmfWnxM<@)E7Ppg|@fij6z#m@4>wnnh={AT&I70 z6+fko8z!gDHZ@@!ZkSD>wUR=6=|jUWQd$&EkFK6fl{dx2W>%>in;Fs|HZ!cgHgzJN zTH_GfYesYk-XBw%gJ_*2R>UkoD+1T{_GSmNPje8c(WJX-G{X$YE8mBdB*qn56F)Dl zglMT|N=wlWej|GqdETx?o_AW1Hg#lB%j91J+{4ei3V zjO2c5h(3O?c508nDbbxTJEUo}C^d1BS(BR8(l?1yTVGye*5b%r97SKgIBH2tN5t*R z2AFj;CAz_7ToLSV)+F|CnUZX8HirB9G1~0yO{iZ~3yyQI+LzS~8yPq;kn7YxetNX? zWd*OFtKO>>M?VUp@*y$Fx1BTe0xfYks}al_s>;W2n4RSf)40WEjt#fB*K~=^9D}D+ z?#4&%(XpAM!##S%W{!%ex__-%AMDU&ty$-$Np)VC;{YWqPCqci3dj6Og^pl9WB6dy091t^x{_vxzzBW{cxMNa6 zkaNTFg?vu+h5_s~*$1XY0U`fjgoz zQhdymN+E_A=L|P{=L~W>m7#G>%&eBM&+M7Hw3j}|rOBQQjmx^6`}r;zMwj+?_h1cm zml40ZwKnT|EcM%G_D&5Oja==NTv;}`+9Fr$K)%Pwz+o*frQl5f^4m7^HB;Z%%vRBw z8ji_$6Kd)91onKzTp`Lc&c7$^>SQh#?3p@!_QSG=+ze@5M%ty_GK>sbmUI7pnYd49 zUo5-WO`F!~U0vEuZO5QRIa!$waj}_kEl{SLriufX7a5z`xtT{#hd510NSsMwFT|)4 z=b40d>D-p@D%z(?ixljv%%+|39! zZDFPjls3cI)@*dkO73%aol8(s#cuBeR*s{zY5KNiz1yEVLMyv)?$l(i(a1pi42}J~ z=wm5LUBeGe+NXhp)TYDKXU7DaY=<$+uSDj`1`) zuKCcu#vEgM6z%Iv+wIc#_O#o~@8c}F+GGo1*hU>)C2 z9E}UVAWE2@C)wSi&6wqzPue$0)P6+_RkBNetN8jGsdAC}8&UsejGSt|_T4V_?9jYH z-&UF1o0+TAj|q0UFd9bd^i65jyz9WCmtMV-qfwL+a6h`YF|>)hf*ZK}Y}*(mRJ zU$*j~ZKqhCpvAb_e5R)AjHZ&zqiCv`F}gI9cv{LBXK0nVA!^b->g5wt7FHD5Z#Wtr zKO_3Y>7nt{qQ_nS&TQI{9&eZaFqalMt@Hw`%E>qLdnn_T2#sY;^Mu%~2|L zpSW~eQ$b!Ib|({-cx+~U)H}TUqL>w;mqYhQ1%-D2zJylRrD-g+KcQzlP_GR~L*pl- z_VIXzgv>n&d*gpW{qN^+{Y|KUm3U*01J}Q5Sqlm#2^9R$GBI;`LLm;Ka6I2~^`)Gu z@!Np|rJfG%nly4a2HvFf39wv8g+u$-aWm@@s-_y#97*=6@lkzupLADaOj1INBNz*B^fa~tO{$NZMV=~Q7xOLXjjH& zHVn7-D}p*l1$8~l!9%I$X$$JUG@F~pT2Ob+T;JbOLEQ+dnR)5pZP!reWK)K#iR<)_ z6h;fq5=bXK*ITfTSJwdd9oPe{;_EW*= z;LQb$P)!K+(mW<}`}Becgz2c%a3%Mc zy(X1eg8S%~}G%@oeQb&hFcK|{A60VyAo&C`x_GwZ2 zLyvfTOzCSAly}<8%ty--INj~8$u%l{K>~$#JRQ}7R+@ZgVnkqomL46>;}b5geM-Ik z$I$L4PWzi3sfyWcD4&scJ9$}GTp#O|KJFs=SYej@>>mou&0|C#=VxCm2=~{k`dFVj z%EB!9+2;zH2o%;x($qAuR$QP(AC7yhS)mti5I;wL_WlA2bvjM!V`HwH!%uMC3ZHgO zl9FdV@~lXbPr5jnLSs(zQ%1E2O_+1rwZ;vUjy7zzFUr(`YBbI2y4SgT1Q3*;J-L9> zqx?)A+TP}|USWF_JdE4R?at>32s3ry+JzO?4)v8aWe(HD6wv|Vou3RH;0;z|1WgD3 z#{)-IE-UXnezwfQTm0S|7(tbaus@ioj0HiGo0KarKdP$YCWE_+FRaH(#WKIW(m&l* z%%7iaDv->dpRFwj^|x0szadqhW^dt%{OtSrLj?EdXaAPJskLPOjUx6W@5jK}k<1@1 z7GXqko@fP`Sm~6DHcL3^W(UB8t{94!SAEcPQI5<#+&2q(g&cO z^n%|T#Op2m9>;eAzXufI_dd9rqPLmfb!pSI^SbSCnUz9d_XNCyty=z;qLkU-QA4z# zK{E*NAj$;0f6KPJh0`a2(`Usnt1FCdDRsUs&AtdXP_NHbj9%B$ua2T$i}JaeiMw04 zeU^pW{Z$%13O%m$@h|2ld0kyf-BdmTYdA2w1Gja;Qt5Od$LD8z6w9pRl^-K*o{DVdsGQGv~IB=dfgLMvdMLzA>^Ml0;Q&x{^^ znQNd&4PMPbzc|{XKVsqChgkT-5xy^sx4`66TDHNx8bwh>@O$NOpg9VuZb#Y5I{Rox z%%&J$^lwObgx|!#sGc*Tos-#)4~d}4_M?Xc&W+Y5cSF6YVw7(yb0y+&i$jJETpfo} zCbc|^vO7n`nH~CGHHRi@wnxOoAy+kDTtf|ggJV)-*>~V5IF`L4(1W2DxI~Hy{O&fV zXnJX?Ow8&F{)-IP?4Vv9%)xLAw+@U(I2mJVncmVTx#+R0&9Twu_L1hzEm zs*MbKoSa~KB?;&3n&Vh4Q9%!qTc>VC8Rb#JX9u`%e2rKv7M^0? z_&1~Tw?VpYr=xDVY6gqcQTY8v%a8 z*gmoj@Kjfm8U?SHw^^6iw`IA@Wz4!%FS9X`d%!-~DNX0%ZgxrC)?%GGT=a@dk_U3| z*`JcOw3yRk4X)dQ|KW)zkoF@+-nio=-2*4|7QZnk@^ugPbX2UKPY`$Ps1@n^5O3Pi zPQ-U2KD?t&#J3>6C^|7xFOJsYXg7`w;%FI;KEshw9L>+iJB6pJ*S#E`D<032sOM+X z)C^47>x&Uq{P*T1XZZ8l5_4`LJ9Xuizx>LfVSh&y)JEzQyfBW z!@9@=zwBjgn!#xe-i2+*;gX8Fy2K&mmaiysB&D#2f_W`IT$}!zne8F4YzM(z-34zo zGvTO(NM#=ddnfX4t99VfXwS=>V~N0oU5?XzK5C8k z*(s5I7u}juT0$8^T64qE=!+@Z^f&YNMR&Of>!P_P#IFlgs%g3F1>BXd#9fE-wZp(+VJ43&gmH19BT((Q95#A`5w0XXUv{pFd_tY~^MbBiT?m@>ujBr|Y4xFz#fO%j-U?si_#E@KR%zHZKa12O~hK4dwq zD9Anz^wEmQV^hQ@AHv`cdEeyZYhxd0*g2$4H|82+jLQ$s-rn8xu{ND@4GSj6Ts23qvJTm6w*1>u8IbuqA1@;Ym zB%skzWE>nitP#1|AZUV$(NQNj>ZDm_h=K`-qT}f8W|?t_4DB+qWbRBQB3+$Mcfa4K zs>7yt?)#hH{qIda)pbtQS)cQq=RD_GPUR!q&zFx_mJcO>GolhSIeleJ^z%sfCzqOn zhi<4ZjW(9XlwIc(vWF_^4!JZxl0rZVQ+A?~!sF6jkwSk(83&!Lfo*qfEbh+D-&mfS zzA)>VPx1I%F$GE1yXMZhC_QAd5muUuwwEJkL21Bz3pAh$^Zla5@cm;>pdBrgYMSoJ9Y7^G;a@%>ojPz zoe8>McS2v+nW)9C)M)R1`A)0~0qt`_XM%D6913fm!}Lu#kVTuzPn}S}5@++zYQ4vKJiPw+;Wg5a}L%wNUe7 zL3e^SEhLn4FEkZuIt8uvdspSJIt9%)DVpzHOSGX7t zj6GlDdi_$kpf0X6A@=-z*Un2}O`XYF3SRA&-|8Avc$)!l6X0zHylsGYE#U1eYYCQJ z1@CbRyi>-vY{etspyS1B+jc)vZEpuMON@Yd8(=N0h&$yM;KJ!lMRS1z2T4e9=W z!kbNgHO)0S?ZT=#nQe!^J2H8#6xGrQXufBYo=bI#6sU!4b?+8ZfnElw>)Q8nE{IPcgVRcl0>}~3Db(DYX9gU9*dn_7x{crWkUXQW4 zUnK~-ZxV#N{RzU0UnU4F;npbo?U3kmuSTQnKgO_EKH%85zm7&vAC5*ReI1R4--<@3 zAB;xVeiw~i;@%wBXS~v~?|wEsy>-R?y!4E`@4i3FqDx-JORybqf9|njPs>?MSd&@j zkz`j6QGm0NdoJ9mrdAU|3?Q=g|)K9kwfjP=;L))@T0MPbR;mehuaG2llyLe#_q>5lCk@W z^Kz0#!$x5D_sM8E)43{hVOGHRgplfeEJJxZeYBkFEX~4uC3NlmzkCJ<_T%H*A$ct> z8g_C;Mla`9ss1m|^**MY-Nihj-IPi7vFFhnj4F~?(o7C+}CdmrvhLXDXDB;9({UzNHH!`mL zsSMH*C6-YebPcS2K!{1df&7{^K#J{Zl#}~fby;qCMXTPtqE)Y>RWZ4x(ki`Qe@Si` z4m{UuO&%a6>2LAY?>>}a8#Vi6anb0LG+Oo0ymJoLk-d9`f)nuyP5`G8F)oA^u-I9c zbl_g25udU?q1M1}#dMV4!PUarXpyplJZKb)%s< z>G(Fuvg*RAw+&rM%x2*`!1=k^nc||hi=Vx%;8b4p;;V0)vS0bO_$mn!@IGGy?9jML z;uO8O=4}Ry`8vYPhS&^ei~~4%To`dC;4e@H&dWFs>l3E?i&Y0ttxL z;o|6u;OfOCueuv%^>W}wk9Bt$(qm@_n3;=Mt8qvl5NFzGC|w9 zo@w#E*Q#x_mGj8Q;wc--r8q;&I;{7JzdCV5`asNBUH#+cKwJ zf)NK8r7JMvF2Tsu(bvbiFt?pGP6wQLerCa41zbqT#`p-E&d?sF9WqCfb&|fxwrF)x zvX5^}*j}2+Zzfuw^7GAh!Pjr+r_h?y+_I(j+nJ9sC(5WtyYy~Qk|8>`UZIlFiydzp z@RVkXAvQ~nyiG0F+|7+n@?pP;J!kJk0rC?utnb0oDYi@p;wX30;JX{_$tN|CFn@xSYjlG%mM=KA z=#HK>*pKv1`5E>hYMMVo?vva%OF6+5$7|w~)6E$v30j>obx^j&nwK*;t)JeI*gtdF zs0mZ2O&py&WI)outl?uO-7tOf*bzfVj=OHgjZ?;7f78v^{?U4=b!fkb;X_wboc4Q} z?pP($@Qm56hs|D-u%asXKvO4|p#A=A(Vt}(t7~bxj+6Fa_xtk)u3x})e!_9%$8;oh z%M%kE;1jja$S&tI;CFAAN3=X6+x%Y_K2x|b^Ld$hn9RLo}8@0a4`fvvCc2<4)K=GjCXfuc1J?CEII4-Y6_ztvP7{B-dPaEHPgfmD6 zj_*9kxhDJqmPzmPKU=_m?|O(E-QK;@mDFvXI!EH;lc1;98g(yjk!`lyNJ;%b?I*}}&kd%N(%!nVvEF_`K)b7y~82x*KFPx6uWmbgw`;)jr!QjEW4 zo6k1k9n7Amd<(OGr}?n8EWh?*eoO%G_@fJL406rSyq#iUUr?cMiYhSA~Bl?2ErrxLsy1 zb29%MO8=)qk`S{mk+KshXDhL}h%JQOY+_%GU%20Avo6p2ozG>JCjuIyTTW8{=Z4h1 zFZEsz%+tp(PanfPeGK#TD&`e6S>L<{^M-~vtXeAOWdIUC#5`LJ^M13yHIW-V3y^tJ z=da8y6Lgs0Y6p|etZdR=tRmN;D`PS{Ajy`7c?XGD0uM^_T-%OK~EoE5Nq)N z^dHA-v^u>(h>K4!_Df7MC8wmO^&c=WJ!8<|%pqAr&DlA_a)*x?X~`Qkdd%2yrOWPrp!UIse)jMq%O73w^T&R%^6_7;a@DO~vv%G34fRiKd~(x& zJoU7D^Ok3}ZhQ8*hQ{sBzwqLYmzrLF1Mju9A3XH_;SWAM^3lhC_~ehDe)gYU-_c{oPyFf6pa11##}}vmdfNZxS6_eg zw{Op!J$JtI@Bj6We@b25-(C3rVn7b|gnGkZ>i!@98+-2JoHdZSZ-*TsCt0AySEZ`O zkh_CJ3__L_FPiu2<5>BynV-E~#pjT}r z-ES7!%3-}#$}Bf}6B`oU20v$3snI}>&B3JUL2!%GW5H9hsf7*i=dZU59f=L#nB1C% zqga9GI~G7^yDXFR$6Q1E#&!0jla#~JBY3zGael6m+g?$=K<3RG)6bgbWv#ZKQr<^; z)D~dRTE4;l(J@*LK9#L8DIoQC18gt1qrDy(wk*<}Q5|-jLgPUv*I;O@b5i=fatT^^ zUe-Ebw}e9?5tMwEitQzV?6& z^L}v5Z^=e>K#pftSlPWLCo|C>njAnkTh$+c)fNq4)QWi#oW(6z02NNL5dVQW9q zR|0*`nAU#fpa)B?+Q_PJ$%k32@$ zPOhOh5RI--ETG$`au)qxTv>5Gl2jzyILMCaeNqG~eJ-`^iKyA3ffY1)o?)I%fz8d` zT1&b2I{4W{0uKh$cU$ikA0{2)#EJVnLPqj!rJ3T&I&j*T!wFY}bytMXbkJ^mnqn;? z9oQz9vu*N1^EP=wZGINCSxNJ=p3mHKVT8e)G$?2oXF4F?VZe_zL#T&dfvw{Z)SJ@Ar|(jk%AiaoF3 z!Q4i;Ar^iZVUpR<^ZOBA8w-mFo2Srz$a*(v(d)0{EQuXwGuTo}xgdI0$#HwsdNuUGvP?pK@F!Wx;L9=(AE11RN(0HQ(i(KE@ zA9JB3BDOYx$F8>v;7KQx}z|Zif zds%gztH3^uJ-$h%X_3X<}btYb_v%7;+>ijaM1=q5_Sk9tO4f)yKZT47z4+mj6 zj@&D>7Tf2i&oXJ~;C{&(wiWfa8#Ko)!2dr5t)Qyo{SPHTE--Nt-uYP%L6|Z!PV-x@o^nOPM!nS-PoUQSH5^rLX_e0qY)KOkHu?ifyn1spB|j!FjFOc3x+*?yoK8#V68JS8&ePO3Djr zi&f8pXyE3E4)l!hePE9c^o-{D-(i`4Ej?Qz>wZAbF#p4p^Sn&H1Yy`*>Ojw!bSi9t z_7mO(WSawJGsx?te@CXQ zb(P`$zAipV=Nl;Vu8+Dj!j6y}!H(Bonn`&F519u~l5-u<;*TJYxBc)ZSvifQI~EtX zaf2)}X#;xFD&8Q@EqF|vSwM9CGibw@v?&ZPI3>mMAEY>-r1(YHayNMkn&Q{n|9r^; zq1Vc!w?L;i*}mLJ{ctNb2dZ^p?cUWSb&_sXphvpUBCOg>x+9FWd~9k=Q*H)ke;Do4 zlvAuNYQpR%>|UPvw!ITObPB7b^#dl|AJ#i=_t3bQQF7hJJZJkx5uOE1$_rZ^F`rEM zU+BT*r#ZOcymUT_Rm=uD9KPo~69$vL4{{!XHgmm_uV2`Pa_wQA<2GgOzkvO0-NtN` z>%@A(q;RhdwJi?w(t)T2HC(m^ARV?FJ|5f%Uiy8kmPV>2F3!uID{zc*WTWJ?UcIso ztam-UVZ zwn~~buNq5lqgcPIV*0CMU;CaB=6IoJoII<5ha6lxdTPhrCQawIN8U2^hrLt0*CuOk z>AMCGrOC z^wSW#Yhw3*`f4#(C1{0@=iOfOtoTSq0W`}m+Ov)g5&zbDw`fVf2R8G3*9zko@(lkY zMVh0lvfk_xjDZsa#774AcR~uGn=cCwEEH|m={-Ml(t45Q9Os;0^Q1ld=v-MlB&xbG!tzoTHSJ5{(A|x=iZtoadnFg_Oal990ejL!a5@Fb|3eW(5d5E z?PW*VW}nRbb40TKDD~#lq{ug!xlx6_SE`>af<}D=8!<;pO4N3(h(9UMFh670A0Z2;<#UTCMLpe#R%?L)^?IrR2O{7o-s0M zr0a?_dc3XqW#;cf^7kKf>V_{LO!4=wiAOHQUx!?VO1*hVU#Xw_Q2)qR9pnpa#G9Aw z#-saD8fa`MmG~y)Ous9Vyc)&wr!tct^ZK#bXuAn*XGS*8hL#VIG>P!grFJQ;cziHH zcvU8J;0vitf~Dm9y)X*)awuEr-E$o=;iY5XEJvc}c{h4TIG`f~T$5aYqS7{KJkffB z6D)pYPJzDU%VHzFXEM;o-amF4$Naj}sKdL3k7w?U<$4W0q9+G_@FaZIljT`A5218y zoC^C94i2zip82#r;V88Lnx2KfE4-)YsmLQm-QYBc#;R~PIpRFLB!k+SYnpK5RNJw=-cv zOQ=iQkg4(e!C`orVF=h|X}?VCL!mdj=Jjf>^CM;xF+X&E@eo`WIH^MRi^G>Z1`f;O z;v8=KkfXZJgPOrZOoJ|2k@BUmM;1V>$%?d}SB?Gf*Ot}gLte(R^PPV2OVPaejMFJj zO}7nlItO^HSZl_>Mvr={!htdB_3^^3=rgn2=R*%noB{#Q_vU-*+vZ#_&pj^h2OMsV zpoh$iezr50a2R3Ow`dQ`A2Ds$N6=B+8oA3%Cl_SHG8?{N-+i(KI)n)(i+qgoQ@PG1 zap`H(vX}5V6#L5gGUyaD=hUoDFU_3m{7Rgcwb`D2RE_&$aZ@Zlw?cg{^u4bzTh%9j z1r;za_KOuYwk)T!NsI;tgrk9pQI4z=LHo$=QisudG79=v;ICO{=Z~GubP3>%yNo)s z*lbTf=C7_0>+ObP;B6OUO^xCdjLa_=J6oONh-xYoG^z7Lu2jrk%w;oqifKTrYUh}g z11hNb9A#>b&dU;}vr+O1)2M+sW8skIP?w2MU+VO@#A5NcpaCw?8Vl=>GE2Y*t&v%n zG%xG#KKO~DePgk2`;*rxW>?!X!5g$Fb+UZG2qDxtVlgvI2lB-;HSv!5gN@g}YoFQ% zY2!$=Kv|z2ykdPCCN3D1O%xb*E=RbbB37sg2G1{)6>6w6$(dclp+6-~y|W1A*E#dj zSw+6AU9=58D`kVDfk%3YlaLNrJa3n7tl^!!r_5Quq_&vhk7%tH?fp99SD^UXEd3CF z&3d#(?|7|7>%SeVQHx#Y9V-smt%gm$u*V__o+>flDdL_da?U2KY4d#+v1y6Lq3}H7 zy&g67S>(Jf7XAuhHueN8VVyNEi%IFf?$QdMV>(S6B#0KAml6$Z>FtX<-z^ba?0Fpz z*$dK-ruQF`Gz^e2^whZ3wex0LJ99+SAhQ!|C03^QS*nP2$*S?(<)jrU)u{pYxCS>l z%~jTPb43Zl(SQ_!?e+lm*v72I5M*|$;@@F;8T~@c&H|}bd9*gQ!cIr^tFx#VAvXQnCIdd zcrV?+ES)D_?J_dc0n=VydbTGT_#%2kX=TpGRW0AUk~XxtL){Yeju%P_T0-3ycF8ia)Kka&tXHou-)h} z-)gBb$&*cu9zHJ_=Vcsb`CmWaD#FZ3>kOEv#0xu2fAR251!qzBr=QxOp{{nLHXkZ#7C%wVGy_9Kh(k+9<-9f?DWPi17 zchG2CYftIe9gMfVti%&-o9yu&3s>rA-6jvSr8?pj|HN;^SF4(eL37%O|K5j-#*Mca zPV!PTWcC~qx$G^~ZtT(sUoOAvQr_`D`tEDxo#sd1olxFsfArlE<(=@O?^>02aXCa5E- zckF?E%4EkfXynZf$XwuiuyglJVIJrV zSz0wGt<9XBp3VHG?2TE5QQT1hb-mmb#|sFX5Kf+E%A49|Mo8rkE)-{rGiz4cle{HM zN>`qi&yIwrlqs$%POQh9_?7bvv)Vqcd7?&e5?-H{57Sd6y`ZGu_ao__sQFk)U%Lk! z)WCQ#d8O+-r&(ywop`3^L`|kRPRw$Sahe_mWx+1(w7gH|@ zNuoNtf{E6;mM7t7v@XNk&^+y|Qtid9w)Eno zHL0RHci+U!Rp}0Fgs-Q$f8|^sh`CR+U|*ZrLDXO?LOG7r_5{#?)AHwzYp8%oRDj^H zf6BE~gi4~4_qAoCq{LWB8)GH8uPNypr6em#s)a9QuDB;Clr4%Ty{i)>m4~zn^njHtV4u6;m40UKsdd ziaWI-)!o0Lzk5K#0QY*2ZX3UKK!dPdi)R|V6?@MCS5jFzcVWno8ox;@L#U`;R1 zN@+;lVJ+Y+6~5DQ`@L2XHofg{c5-^0IMVU_VA9Qh?y7)Q{B7;08q-xBXQEE*asFZGPud>9^C(2p?y(a6CokhHjoT_} z8qquRX8S8`=mFyz>+N@U3}`UCq=gj|XSuTjEput$6G+zCdY=|HDq7ew3h>|LUW8?C z&lBDD9@b?QKiWIg>5Vh`bYqW@cjE;w*zQ3v&R>Nh_@e?Nt`!Hbf< zkWKCWVyoC*(~eqF8jfV_gM9fn&~~JvZyd&X0DJ}pxM7u;#k<$})KMl}xd5A!)A9w) zdSHvGA>~DrJGmiQ!I!j#GzDjXFK&KYT7w?=k_voD2ELepFJ=efi>i4}-d>*G1ltAJ zHfG?SXlgJ4V{B4AyxTV|QEfie0mEC-2cy5clgWy9_t9>Obx3G-v-ttD_ED>kOr(vi(%ap zJ{1B#DY<7RCzh$XGDp=n z>MW%t3z#R|Iz_71;o={p1?s2&H@h-DW%zPY@p2fSLGzi{#ihV4k zEz_Bl>w3~~(YMAxUb?K!bc5lTb&u!lRFmn3Cj17ETKCU48_ClKgi1 zQ9PX>^P?eg8eQ0yutHOd_8>Q<6mFmtxIPISop1Q&4D4DT2H4XMFZoY<9Aip8H!Kr32IGy zf=r>_dxCm|d4#8T*e-IMVB;)PyjG;oLV6x^lI+lC{u6m~)!X)MBMCyX&-EGBZzH-?CZ0jY*!8rIuDL=m0Mrm-R^JJ;#Q9ic#Xy6lQ#Nkh4hTnyWTH2wM>64L%yV*}E-jOwKHJ5gn2KBu!f4l5M52XKX(ZB)N z2SfuqQHEQ#FqeTl&YA^3Yt*8o!!ooORcstGT%JGPc6Mo=G>3BDrpP}Cs>1iF%P{pr71_6XyA6#mFcHY8A6a+DgB#(TwH^` zI?M! z&PFen7YTeBrSb$nl@|$|j9xAeyW@sB^pA3o{)zZ;T7`23+fp8S)x%L+mC4g&4}x+L z&k4O4cHogfJ8D-)v_GI^t2RT<32bYCTyQb@IYxq7CU{AP@i%DZBY~!0@P+r5O@^mL~auMbPESV$bR!aYTl<=2A&qm>)ijxbYfdW_^@X{x! zCEnZj>`zKfHA+nve3XY|N#G_NNh}SgZ!7>!jRcmUrghcLhB>Hbf`dmrZO{~#criEO z48d9A;6K4v*HsnZT{Q65C-LeD z(~-brP;V73|8;`f&hI1-jHgllw_eIIC2DtQcM_g`P5M5mCTL(^cs7)*{=2--BO7$b$=b)3X?AfVl2H4Rs-G&g6Rf;Z zSbmHkc>OFw@ajeja7PQ)M%eg|e6)H&-+u{WlN5;E8-v*JE9!3#{}5tt%1s{0phf*! zXy%)K(D!3X-=|#D_hR(@6Q%EpObED5-XL*7)${iyS(QL>lDtpRsPA3Z!pJjsCogT5 zb=c*zoSCk8*Xnvr{n0@iU5Dyz^`=1|xk!Tu-zAm^+4?FMCw-~RbQa+hEUpD@QAe8} zc2;A?E|UBVjj%LYBpWcMEPJ_f zw$6r@#GKUYZBVn zh@sw#&{RYMKM8YK*_esu#D8YE3d!45=i|2T3Tn-B2XQ!)g7#K;(&)h~5C$>qDyS{< z!wFqu7|uG1Km>Pc$vFWj5U_>I>V-!GG37n+-`Ps0E+F9^O@rc1t`{+xVwm zmQAhrT?AGRZg|YK@H;8bgea5#BUew1*YfW#^=o3VmOLR@tgysVF@H zy_)4d%ThWIjH`Lsu5H6=zoZUpC57r1H!q#)$rsfa^c*5-MGVlikxv|ZNv?_peiM}y zsL_ftzgJY?e+&HVS5!4&y`{NSh&Hdlc)6+%0#ZAdm1ga{*QMuAG(T<2YTiKOHmg@e zSlmFV-|p4HYY04zlo-{w-oJF}EVH=2(yH`yXso9@tDd&g2#pVE{O2%2PuppP-U$*$ z_Up~QW`w?qFv%a$0q<#D#>osJb)2Ca%h*`8l^|yRxM~wY%xZ$oR2^13ob?tNbgM;N zyL14~WM7dndud-APF>3FMDFL5c69b={2yOx$8x0|ABXa;X~zz%x1_Pb{@e(Dd8w+a zvHp=a6R%9`>}lEf#QK)c&+!T!|6DdPYwJGfQr-d$-6!*`zkeTWHf@<|ocLR<=`HN0 z_F)Z&h3d)6X%m%H^hO`!f?)?#hn_5gr`1xNu@>5gS*vrS1mw*0?L#TB4Mi0WiTW$^URo8Y%|y?O zsLjf%c(&*2RWaDZ#((Bxw3XMa%72UWK#BS!qa&`TxM^ysRI z_ht>aqfaY)*jS&BdiQ7#VP)aP>a=W%XQCT>Bi2fqG01CY zI;(h#?xY!CL@-xG1NGobo%kMtvx0PW*fRu)H>SPS=cRgwS*&kCZWGI6(yt+N`e;EF zG+tE|e4eZOWf$RZP7eo3UDRr+*d|YfR-9|Fc)i%eeR@taEDQdxaILhFzxu}8O)@}~Fj%}IWh1JK0y1Me9TEfygFO8T+IiGH0eVYHy(7rkw$+-CK`cUnKAdY9~mpuhv!39#$FuAR9Z+ z+hQm?F;1cV0=SUM+X(Wu%ysycw5AhDW{sO`)^63qYTXcK*`Q?t6Z0!I%Ib3{lm~c4 z1BtL=1^xS}#+R+^ZOi2=^L1ivv|h^79I`4sa(bv2`b)j21`YVqr?!54w$h3$Y6Y!I z@Agt}R9d>}PL~6xyS5O%#KZdEhTiGXI}Wx(w!h6_XtGHqZRX9?`#^0oH`MaOM$$bWgH3r3>$`jxri@HmEzz{`df_%&5n?)+I z93_%;267hc0TY$o+C6AlBv5b(PHezwnGKiZ8$pYgn= z*ca!?m;0}UHic|H=yx%GBY{COQK<7iDm_if$HsrooKbZ36+ui373j(UUTVos53Jh2w}Gp4xG8P z!={-T4oJ~0F)p29-`>ZihXdchjwS7peVBs-e7YS>+S#LT{pC`e?zHtUSj~x(SdG&5 zMO8kewQ6IL-p8bmA_l*VJfiQLGeK|@8;dSrS3d{)gK*%LC~}(kdoJ^xkM@WL(+Tnn zP6Yp=lQ`zW1!>JN-5cO+(rE7>hU|Xb3uG6+5iP%RY^e2{!3%~1k3{=$xDrxd0783Mjgjdx&24XSOfy^l%T zgVtpnOK)=(w?kUWG2ZJcW)>e-0$MQ}z?B!n*ZkvHoV*8Go@N$RD%a#Q1@zgGx>ai*1 z+y;9Jb%t=#YbayZr8x1*W-$@I21%AUZ0A5^ZI*p^7LLyUXofG zEIh{VLmpe4KN~V(lMR^r?w6?J7a>qnrym;Y+7eiG;XsqyOyHXLE-it~O~h$z#3M*O zawM=ngp=8!?PpTwK5F^p`t+zT4)rCXK9iUCQ@L|4mD^XJ^c0`PHdx1ko7 zJk6AUUtJ~kM2qv699&#?@4gCUKZ=@I0aAY z?SVH{i0s3N&*Us4V3)@H%QF2q1mI+mJj3`}mz5RCxwubd7UyeSlbML$sjS)Qx~@{NdN1cl{~vScx=PptkxJ*0 zR;<)@m9ew;($f#%FQe<4h5K6EDPGSivvl9P9{J2ydtgi=Q}(3UHlt8yzoBh@dV?Kj z2EXGk&zg41pyp#smErK2JL*Oz@2Q;NVxxs9A9z@GXGGYO}D1ly+ z&a=t0V=rOGOttd1L$4Vwe7g7SUizBJ!`qUC>1LyFYN%1*Etw~OHIuZ^T0hz=ZnXFJ zVh;*CE(#|h?2Lusn*%FM^*Q`ZAk+GmR_0>f!gbJni)tO_XJWJGAoQ%8vF0*Ml9$32 zN;pmlPf)@dCCu{9_-c#8fvN9Ed$W`?)srBz=f`PIW&#JV?=iKaC*Y}*Jcf$?{-2|U z5vC_R@nW?HT3>OVC)p7%-k|)lQ5rAB*r+aFToqTbzGB_#!?3{QocYc=&=cuET~!tO znGO3XZJS24Ba|<~MqZ3}a=6>YnX%Nh#kG6zJvwh)mC?bEDLJ_axpJ+kt#&z=IsA)6 z`89`9SXafHZ?)%%8s!#$%Nr^K-+MLxMmWMhW3nVkz@V~kca-e0?)Ea=Le z8nU2;1sScWSq{~!iXWG!z^)Pcom_7}&y9fF=n^_vsNTbgRe(Jw&V??H6G?fqh+XS{g5a~$puh>tqih;h#Q zoffCXL6*>8`%;E1%=)WOLVxz5G+OsmDTr2#LVIOqJw9+5${&Y6)856ioLJ`uL#ph= zI!EgsOt4$cqKkzCgMv<{fSGJMu%M*LNjhd|TH*7k$|;FATnnh`y>oA^5;Ht{@ps?5 zR`I7)T(iK|dLJyl;q^W)uH!b?-i8D3L}B4Ak7TPde{cW3Llg<0u!MmR?kj7s_a>Be zFjiLD7gv_j-W~5!%X#+4%26=<>as@vUzAn*-e!=Zik;s5@5%Cs}?c@$I58nNC@9=I%*LM zALemBnoy#3Mgx1n6G3*8&0A))X^Co>$i|u}yiP569Vd93T5zMJp^XM!52;oUyfhL$ z!j36K_N0oQ3n?hBYPmS&?FPIhZsT(P^_TKblTF|!Elw*eu4`@4z=Q8XLSfw%WbH2$ zHMcEsXk5F3ycN=l_9d`iS>h;w1VfAWTEss>d=27y#PzZG`>@Z_LWiSTTj11BMW0h= z=S~tmq&Yfuciisy-KYVjQY}=f2Bq*Qg=(Qv3s9>T@2M7gzXowV;#3R8-*>@k)!~C} zL_02m(_m%)gI!uN#jxK49!3Kxp@Ah@%!nuDT+eX8g%2&u3i*<66~!`W$nTKp*D067 zS0NrcIM@pLd7Q|bjx)qKM!Tv^$hf4QO5_Q{enI8HqJh)kCBDFT^kR%>fWNWsjlVU% zlty<=i)|&w4*v336R^%%LOpXQB@A@lsh?vVTC8)(2E%b}qo#p9JK6y~zNG1ah1OX8Ni)W0EjV-?arsZvm$TBX zL1=k;12^Clx^N%`deV4sP{7e%@@?u3yazu3HFa;`W@!4gPEBK-OWSzR)g%k9qPljR zA=xgQ+z!ZDDTS%QT=8qCt_A&Kwv|m43blS(oi%LuCX97YkhsDONH{>zWBnY1QymCm zL&3#;74sQTEiW>mDf%+_DpCLYo9wikI1K)yHxR@=-c}_5w?2cEm4Q~L_fiQFqrjm~0o=*n#fTkP4&sw=YG`lZcEHgpa`)%8 zl9Y{gRdNS0+pVJRJ{78aA%W=)%#ZNW%wRa+4`IH?%85aiQU7W&N{N_Jyi^*THd_Y? zq~U%Vr4b};5na$bP6)dk*Ok;2X(1a`&nwn9u}0`l++^_(_XM@B6qM4pgJBF91fobXtxEo`Ve&tvTA6$&R`+ z>Y738&Q`2D#PdRm!3==Hldx6j4ZIRQj6Oe(u<3wGJBYTBU9&z$XZm%hG={~VYZ)jK z>`pkGWC`j@7i9d2vvefYaim$&PSR*C4|7$II0dpZ60u{(SN6zG(w1d*Vr5e7^CE#e z+pxy9eFNHw5rQoctz9w>x9a>DNHb&9_H~o z6_5|bta+@YAIBWWULq#}>*u(3C)S7F0KEA{TX$+Q+gu@PHnW}Kz)9$SX&t5W2qJ;6 zG4hc8!`pwLpY5QtH6U$5Y(2D{Cm`kR4UqpoNw{Dif;uD6y!8f_pyv0Y+dPnUApLVV zVRC}U0=~01aH7{HHrfB;RZA*BNu6h~=TR)dRElGQ^rRWG*51Go=-sJg*mR&|A5O*Z z4NO7Fn-yy=g6?X?79$Pqd^&10_XZvc>)0@OYuQ5C>D;hUj+7Ek!U+h>;^^<~4M4x@ zE_OnS56TJaA)IE=8+g5!Y>ObDL%H`tR<7<@djou!4UYsCU3!vV7W2D;jZG?Ac&F0B z$4s@A^{4*xa!~6N~G6q8k zb8+7uA2d)08u1MF_~X1B>}hzMB!};e;Z)iZSf;=(%f`kalsjY2RM6z!z^E_}yJfOx z-wVC%YVazn9qOCWVGeKhg5QCK3D!Bm@dmy?#RkJ}CB7)r=pTJ6{DDN4OQjgXtHCQ! z$b>N_xx3KzK^GHn#vkm6xv@8N7#oWlKE13gq~xxbLgL*z;m0lwtnd z9%duY4bI1zr)8KQ!$UWFZpgqlfe^kiM86M*C|^8w{sPNvW9Ir|%5^SWT=-jjt%Sl2 zSapdCLawN+y?)G3+H2@aSLDQjdy0F9bMPgQnINnI??dlMG8(}yoFp253953=`R}Pu z?^K>1jXf=S&s@4uf!!#RVeYwMhFbyRnV$GHQfL zsZMG;hjgP*lIapg@Y2N4zSe#vtZR`bUu?7+owqu95nqo(F6i4d@t$WO$H;KxJJ-gf zWzoQQihm(vQw^Y7IKzg^UERWuoqO_$-F#lA_tvAMV4pvnHMi1EAQ##mW-0Kp?ftTk zicGO0=h<}F`EuFrVoHbc%bei1Wsdhp1O1R%+@EbVvZNK29&^(0x zsf0!$bY2OuQC~x5vI1rD(vJPS^!+=KSio9f$Sk4`8Bw!S1Nk0>{~U2TtscTxmcxc6 zV}7{XOb1elhl|DQ+u#ohc`-@7cqtUQoVOKu&7Qt=4@b?SQqC~QXD703jkItd{8`@v zu3?-Of0vZA_`9KYTRNSuB6vR@H1t@90klNs##-873qLlMS@)ztvSXTt__-OZ=krnn zg^aAE4YJFzPcSu|n#T$mz{lx;F7khZbabb6`107j(5po+3fHb%8wosx8LiM)Wv*&U zYK!Mw=$*iqfZ|~OGJL9d1>|88eDTVsr{OEMtPST?)C6|vFRYq1>%5`(!|x1qH|V8R zIHzLOtWC-n8sHmUQ<-%R-d?#0b1u|P);iyJLe7`XRdAIDEAp2lYx59P_9hpUz{xWwEV@OzbwhD$gKRLV$qT`ZK1?z7gc78bkB6+92Mjw z4}vdtX)dfPDmt$%eE&N`(HMN2cvS&fR8(UdRsbkXpO@9?BiK-1Hr?>=^rbxh-|0*4 zRedr2ulJ>W+P~A6O*sGk+Hv8t|JBIQxRg)3a$E{C)N$c+zo=lj|65}tP5pQJvtRgO ze>DGNf9j`R*`J5g)&6MySNmiBxBByU!w>tT{U7_Y@A@nI^XfpgKidDb{&1L6Yg$sf zT&wbM&eN)bavSenbDm?I`?TCL2p)w7&dKjQ=;U_hSFoK2mn7@+FSsTgtT@yavGDqT)FVB4Dx3VINOYhy3l_(tO%-waI3rP@WI7W`GUFbTO#;_NP&@5Kww$OMXx=Y2fyy~>Uxsf* z;H>1^(;ed+pgWhI+wlCfJXwz~CueX@*LiOrYx(97;#*b1yl5cK0&zK!| z`W6LI!m;P%Ib=PO`ur)mr2YM_sBW;n;DT$C=9#g2?Y89ShiHo=PRDPf6N^sE`)+63 zbQjq#KE)0Xr)a}h=*_(gygM9twxW(GbMXQ?zsOcXrxwAxGT__c@H(CVJ-_z(Y55xw zzC%uK$0xGU`H7s?#1NX{)ZjPMsl{(Dq|cwolbt-mg-*ywoFqx0JQTi&vD|?Z%69%p z*{9?*|Bgb|`4l^ale2ada-C0cr*NkDjzXNf)A;7Fi+ zzqD8Rioq58y>adI&yR6Q$6+HlW`Vd=!s;(pei*nLI%&%FZ0~6~y^5LF%VioadyeF) zwL0-d$=Z(sYp~x~FVEBP^b~Sb*rW-Z(~O=4BF#(a&PB7b+2*rL+B4s-(YWYS_7NJ^m_X!FZ}3nhZM;?9O3;+m^Tkac#jg+m@^Q5QweL$sR+NSgmvbA z2*03&^=1RYTM;IGo`LjSX01DF*12I{={C3pcbuDA^i`y`pnXUkWOQ?D=Uiy7h~M09 zGGr%gPIMp4JX@3G?uXrO(#1Wj4Eh}-ouJN+1lk})4#A@&4pxBlgjRVIR(T$lF1hIO zI6w6z9d+mV=sheop;x(_h9M0k&6Sp=55j{IDa?6GQ!!qtl?*fc{awWvFMP+|mR?{x z&pAz%1ohP+%Tm}IRz@vfpW?FBc6=D3H;;spA+w}af93U>PM2Vfi@cIp=v$hrEis%Ci;E@4`8eHn9@BJqi9yPK($ckFMY(Kt!6yP=_e^h}T>bm%KS5@x4H+*OLfS}NDDf$HySs!Jj3HqXzB-otW~WwX z2x-1Hgt#xMXIAuV?FhHhGZ*gYSq@>)3MI_v5C+vMVNDKUkf?;UIfOw@C9KOK3@TT` z`W(WbGK7_$756i?=R6+fZwY;R1vo`u0H>~HvclsSGhgVZ{=&D`W;%F zn&<|#<)u4&IZKL<q>J=}Ee5`z@u)78_{Wq%nvmgre$4ozaRh;)msJSh4hZBb z5KzK=t^xritjSd%poF!#3Ivp}E?0qo64vJ`5I|UgKrSGV+piQ}nvWzo4KF>tf`W))d5fO<+NVic0InmnHVxY`qm(Qh*M^w8GSik(4>r(7x%u= z`bY_@qt&j2)zR9ggw@e%QNrqIH7j9tw3-mUJX(O21{~8Az0wy$;}e58^hcL{u%d8@ zz7eaz53p7`@Si1oHb*;7^h?zIVHT)9&WFOj`S{CKIn{FuN(x@CE-A9A z#>MrEi4IK&z6{L@zTnu?B$_M8Qm4u3SMq&XwOGmbW%Y+Maq^P6Ldn~guYVBMW5{=+ z$1ggSe2T>wfF<104PGSoap!>9eqcb{mI}nOssdZJ}Fyd|Y&+MnI;=>PW8%*zK$?7SEdPgr zZ{Rz0B(M+CV0!x@)+#jw+v%)&=*WjN^$Vd#$nM!(nz66kb2VEspt5vM8 zs1=39Y&+LTauj2%^cAR^O0ZX@;KUkx#X<0k`4yZw2lDR+q2nA5S(z)py`Viw5YyVo zugQ!{z>4xn39X>iBAi@-H5@C1J-MKLS3YLj5+&zHPFnpRinSYXpRA^5JWsZkbE=`= zT~P;F;V_ny4=H9ia4|aPLeoPM>_wQgD0n%1V-WQ2We(})D(Sw8rQ?vUB$kfCdBH-Q z8{U+LHO>QlSeIa6U6weU>7k=hp9*<*w#cL?Jdi_yiJ@C&wwpeNo+&$`c*6+zPGn728;0-f}E1_S+a*sd? zJ#vrtO`e&nytzL(sdQ2aRg7#&CzOgu1{eQ{)0>YWlH%!K* z#dZAIB;oJ4DiNNAYbCB+k+W^Cfc*`xVMH5eAP#}7ck0$8A#{&X*y}V3k1R0?FD^Fz zAJ*PIzNz~DAAg^d+ew=jDW@%$a4(3nUP)7$wg^)2K5(W`G@&2`6^kD?Qm(~o zs(``CR_A49^U@Y^R)iJ>hf}wth0THcEVwz4&UuPJPLekHJzwXfr7G_8{o@CZ=De@3 z_xt^N-(T<7MM(a!S$N@2vv58B0(XEf2maOc2e%G?FW+t!uEyVl#c(e&3q|;Q4Q>!O z`~*`|rtN>rVxT`LI=ae0AL^%<^o6v&#xlIxdL}xIWjc>hp|RoBjpaJtca2=`!<#74 zocls&_RFB>(0fWGL4P9}CIc^yS=DzA7vzvzsU#kAfc9 z%cN_fpj=1Pmw>)d95gURCK59>A5yB%-waBw%htwxE1bB?;_V{}?dc@t7Yz-8HU)=U zgOJhS%U|WPxjiE}tN8@;l{%3c;X{;^oUasmN1`D!q!c0{8L!bLu4RBo@HpRWC)X4S z#qeGf!K)KNwj$LRaUQUFg!MqKU4?uCkV^(~e4*s{T**PBt}nDF0?kCc&BdT;A9g7e zEq+AfrMRCX&W|`}OCaSWAxAl?`9AdgD*#hVxSVe6V-0Ts6d zk`j^7^OVaiqFs^DukpU4QhSM)fQfa@R_Eimqenv9kZO}_b_=E2j{PDM@+kSNO1{Ss zLirlN^Q>~3soYqblscA29-DWc3wj~<=tgGdJ%A zj$OdH(=Rg*mGzT22kXt_Tfl2HrrG{kfZ99)tx50&BgH(l&oU6AzJm30arT9hBH3aj z^q)BCOjur44cEvZOR>Jty=o%0=pJvr)@B?DZUAU+n|1+&z~XrwJqAWFpbPgRBno>jwvK8OYo|k^JT)jf zW@q!YX~ipZxEgMX?qnPm2uL>dtLWqrVr@aOSW|O=IHh>^g5r#VzR<7R@V@>gLMoCV z_p7!2#y;|d-u*WVbYh|GjDi=zN4W%Lf6hbC(~TO4d%kMZLk5m~q+>Q;GHCwUI;M?H zya1i&^j<$!pL(o{Ey^CNPfC0ZiLWN{{rdPnTjP_5_(wVJ(Wf1+Vk@)n(I+Rq#>7{b z_DST^(jH^?x7wpKQMnJ#piN`^>`4_&b6>oDbOhtIWc2xYe@& z*)^dtp96@VZ6!I-Pg6%Q#`jHW9oj}QkM{Lqtyaenttt9ns@zrc&uWBYvd~fN_)OMz zsJv8U+hsj0%F~>;>@(mUiB(5KW1`W}%qX}a;LeHCt5Gy`<^KM6RN`c!ayG@acy()r zn|OoH&2Ip8puTc@^9G0c!?Y%IM+MS+)SHAoqXX1YajnstI1T8|p`Qf#9m3GLe7Yn(EslM^jo=u~Y_dzFo$SK=w*4X`#2>7F`T zJAA!@myJt?Zn2JY3+l+i=M0D7Gwj*uTIBYDgUsyPYPU(}Jk5?j2Ggd@Z0AKS;IT1! zpJ4q<*QX`N{c4#t;Fvf2JS+nF?o_<3GHF&Fm3C29OWWn4(kcg)w$<~ATnK8_Chx6|Pw@V_-*KhPCv}uImX?FYx*rylE(Y{I(W>nP*PHKZlyn?&lF+G^ zZ}OR+OWCCbWKiIIyq6QPrg}4c(a@u^30NuUofTx$uJ=<3BYI8VI)}k$*+pgG?)LKk zUCs*w<@A?w4Ro_zD#x(fIy(w|MpRZLYVZ|iey4@(P{0TsX(`YgnBrZVo$T8J3$Xw5 zhJf^+N2yk&y+f7Pd1}umpc<4rj6TQ#?ND2i{B!ej)S7&m(oRpL{Rw(a53Fo-{n)X{ zZP?>0eH*W+pk1)iY~6N(a_zUE5DcN)$VD(Gj6N1M{AO;Dn*zy~X%4@^M=Krdac<}G z4L+htnYx2a>%B&SfV-@hFbX@pT!zm!I}(Bn;$>QS64JVcy}Ip$U0}9Ri@q7$jtm7d za0fU9Wq6L^Phx0um(`5A|WxV zhwc$mV~4ACt_kCV^B&tr>o;b&UTSq9H-UX13?U+oqvlN6|F6t=~sc@1T9l+((ABs-QVVi5^cUQ(dI@^B(ylu z<~!6j3$(V;>Tz|%Ia4n_e7SNZP@8h%meu4ys*{BlMI;X&}5d<8AW zT|8Q0LmRmKD}#k->8DsL^a@r&fg6-uwS#gQk*jb}EyF?HM!NGeIFbJLS%F5J_!E(&i4%WY7D6LdR%QXX7Tz|gq z4U^B>V#J8~G;G31x;|onyEB{w_f-)+to+hw`a?KXSt)3Lp?j-D=R1XSJQDhC7<^uC z+TVVM^AX(!G!Ek=cJitgb^nTo-s`2;vVLE6Onp0}eUrnVx@U5d8=AFE{+I0R#)pa{;4o7}x2JKPr7Gn(8^`=}P>kB^VZ%$PSK2;RNk zX)c^v!&kM;KWh+rLz8<+Z)7Ae|EwM-?xFF~;K-ZUyB@sQ5y%1chO&G6LPC687B^LQ z67q?0{nXD+>c*WoO*=1R#FtI_rgV61>gViBaop5Fx18KC=N54DC0qc}7qFJc*Vq<$lk47`vh|;0GZ?zMELN4S#0zSh{ znDbib!m_#F#_Yyh8}57@H0?qciU+3!SUzkCn=Anj_+G#V&H1z**n;uUJ>d>$L5M*A zUvDTgN_QCbEJb%Lu02JmEt@)Iq~Ev@9TWI^djF zc%cYR%|7Bx#hrItFIHv~s6@;~t9)4t+n$0qJGMvH!0q6{5Bf-iLz=%t3Ls|=+6>8Q z;16RPT1OuRUB~CB5IHH-r-c@Jlh4xDggb)NCoV0-xe~gaVk+GdBX;Y{d3zA|bWDVv z{LPGw7IuTH-Z%}`H5NFuklf^?Un%ydAEUq~OOp327Ab>5V?I8n0NZ z*@alm5y6tD_TPKpuiPXTv*41T(sO;VFGD>S?i*8S7OCG@Uh26|7Mwwt16*gE^l%Js z$+sO>dh7^(&s3M~|MybzbJocLU5`y~9#8%8QC|k^*o6Z+rLPY6>6E_eAX{;;_^wm> zstsT2t9^)lv*rj|O{tD3eRUj|1rJ918Q>OnC{ee!7aMJ%CpnV2!N_xLs zkyf7FfnVYqBg{i$OF9odF>_}tJq)`!)Wa2=Z~rmi!n2o+8x;(?e(y3U_}tl7h<<;j zPsU4>I;sw%rZlFssOQznn6e}GRP~1#k5=e7!yV1~zp#aK3&-~7z~apvz^@LwGdK1y zxuupqPCBSq-jfbcDjH+AAUqH!A7tuams1Hx&2B->0LS`wKh==rL22Ys4jYY1&JXwn zaLr6REEnK!Cftja_{DG)aLi?CqxS@DkbE7k4wnsjW2%(A7^7+R_QPGngI2UKudiu& zW{XZ~b9UdE%eHoc(%O%DRmh?OnV|jZvG2=HBs63g3C!vX7H)0Ina=`ej=Y zC)vSYYQgS^SFzc3&1#!&`~SU7GZSrkyZ2I?T6_Onn<~H8rt}2HzS|}}!Y}n%2s8Z_ ztV}9(AH3}c)q6d?`_&gy`!ZWd+W8L7a)6Wc=vQUza9Zf1U@ICi;>tL(4q1jC85~pi zgE7?Om(Sz+!5C)!1IEuK__hKDokB&>*j(gnuxs1tYs1(GE+tw5C;j>$>>@yiL9*ji zb>?(V3P#n{&(b>-Jmo?lSj~;n()`D{kaP&VhuYe>DVf3QODm(He`QRhIk>-nb!>}% zdvzp?73|wNsJ!PA<$a2j{}^YiQ?^Zi%%0Xs-$hyARaaacSwg1OiBz13UmNEHH!BO$y7wy1 z8Z`$h%DCJP`3|gJbncovm$e_03psHwjV*O|a=J@$UMu=4H6HTz9l`3cB`PjI;-WcS z2#jEV#`wAp;AP zjBP~k!x~EK5?qiPMLo3Oy_-0%A1@O+X{GN_P79}&JKbD&9pRC)O|Q3S1_;yVBa|Yz z1lUgO+F0$=)SWqZ6yaPQNwhyd|BjlL@Jwg^oc7@IQ!DE2Bm4yEPm$n?;1abgBWhTd z_WAM#?B5-7S#ItqzI%g4;i2x{$OzWjcPyaOQs0!%o?Ak94u#&PaFVbwPwu5XxFW1$ zll_LMUb1C#km<5IEqnj7bXwJ!>WMA`-q~HwSC?8{P0lmb6IM)w{1LsqpK;Qf>Z)pj z-U*{lsgcQ!&GI~ta+0Vc?7o0o5#1n2R$!B|=Vyks>|sAiREti$?K>Nn za$*o#3B)Rb>8xt3+9c1b&?<2C5v>9jRA3P=DPzsh=|nNmN`uo1lYRz01v`6b$Jh$( zB9BHIt4~!!pKmA2V+wCfe#E)FqJ?0@Ll4Jr%g64yCc*`o4=a}Ri1M;gb6`{(=|9^M zfV;7ZlbjLQZ$^%-v3fw6pD0ze?Z`|9=$Xr~_S1P=&wRC7{Nq+cUHkJB;-+0eS+ zXlR{=cJ>%Io|B@`LG%?y{a4{1Zta(0eh=laK+p4Cz~5iODwg}(``7Rv_wtEesp^Bi zBhr7=uHw9-kJ^(HYeah*fkkSM6KA5Y123aJ@1lmyVPm50zfsZ(KhXA9P}3J6{kQ)7 z`ZqYq8~&fuINd9Gsc&H=7v-GoyL>tIDCd#z?Mgo^1Du~?1Z(I*ELdw@|6)PUynDT>s8Q-KL>8#sR~&y{BD8c-3Ii1(`JWS^@~mXUXU0C8k7W`J2Gi#{`MH)!rKyKAiIyoKo}B_-IzVy@(+)J z)3Q1SQlQ^&8OFeIxv|=j^H$NtR8E5Sv#EB!=qkYY`cQVd;-OU-1%H%jOc1_)j1dc4 z_5)+$tzPP@j34MLXxEcok^9F)qmnk(dwG04PqLa38WYPfCbr0x7!&nMUMhEkk~i3U z`7!Y`l(R;@UKtaM0Ox+JFzT4Vn(M#`R+^1>17$6hWEFuo+5?zf0se*{_jfpExxoq~L%u~)hSA(7J ztVC+8feAppbTQtKUnxp`ant4TtDIYy^kutR4({*LU*kVCMwoOw z-dHWRO~CD%YVxcy8|ZZOTbzNTp$icWQ4t=AhR$HswJ7ujVa_wlH7(%w>h@^5z{5v8 z+S+4w=xU&yzz5rTjD7k?UYuS2UMskk@)s^%v>4yHEG1j!EFP<;i0dv+>qzCgH{`;e zUqMajwdEb(Y|88SX7&(Do8GO-gY|PwN79{(nZzkt`1o$FsN;gChU;cHx6Hp7$LplD zZz|4SV_ahy?@F6au>ZN{Iz+u%3?jZgY+-LlL~*p|F=Va_R~1kD_aa{+2DZ%!2ozz^gi zdK9=R4|f1FcEVCe>%zrDWOIQH?JrJ;^+cRl`rB#!PCN5q31(9T+FA_>C6ZE_e6e-C z($cke8M@~VH*|k6E=6hIzZ2~n{$JadHaBgazJC7Md$L36W@(n0+Ib0{dAy-p?@-#~ zUYK+Cd+m|8qzbiY&!q$5T*>#iwx0s6QHNA!<{e=4x~ z#8~(YykIrJ+o4wC>$9K52nSw-;+oP`km;q@_sqHdqq_$3;%L{6U$kn^uXi}k>PilO zW0*a;*zBZH+yf0`HT%qSX#{ha3pEF{uJ5K)>Tsi)w!a39)uVi9@GpW4g?)kTJ#ZHC zcGRXgOW{Gc6jN>fuXvjEH0Py#d5ONzB<7=9XRRuu;&{;ZuhtSsuAl{wT%r2UEbecC zI;y07Y2U%R*7e_W_qR&Tf2my_w2SVtV`hsk8Mbkq_#M*Mh+hl#fJP_wVVq&bN;+rb zY(3xnyvD&M-|kQLJt5CzXpvy_(YtbzH|ZD9x3&nfFhAcd&#ak$cIb+a!KPGOY?RjD z)Et$i9LNh5_&a*yDP(II7S19atzWn1L`@M()bMNL`SmwKVrNcDG%3oWrg!F_&6+q% zYeLAJv%~L2tO>EY6r`Sic7&TnbuZ_D|9OhZ5;c1%hH0-a2L5fjVk^%~Btf$_=PkVY zaorxSDyNy=*PkM}C6ZcVko~NA6VgbUldYe$9&Q~H)m=!BYHxuYhy#6E@{?jds#`Y2 zG)4=^CAXf2f$U@$alCh+hoXryj*_N`BK@7 z4j15M&&>%y%oWc79_AT2ZGBmC}Uas{*BYXQ} z;MYuP*W-mwuh{v6Y*5m$UG=3p$K7X#E@#qjK#6D8YXeEJ>ZkGkv`n*$UN{6+XMd-? zv71ZMK+_~kGIVbNzszIWB%f)Q`R8oAkg4;Iz}qk9)%ol>(B~q}BYl&w7MKYesIai- zXzEVl=tTHsJUOWM-O-}+X?77j(WOP{WWkkQ>_dUOa4%F}?Z)|0ih+M#+r34<2Yjf- z&}@0NqYQ6oIJIG-tuIPLf2Xz=x~_&c0oBI>1UHLz&J<=W(N6~ld; zb8R-&Z2fur8@x~LM|vM&){J%r{)}>r zfYYj^jEt+I1x^|@7xuN7CX{OgZFQ%9N>dOOEmPE zjPqwMcMoV(;P0k0XgD;Y?UJq|;!o7#)#pasfo13}0pB6s-Q>{PC|-7z_Y2}jWXw1* z^@PU3P0aH16MyX2PGr&}9<2S7G%`1-9Q19XXQWM3HS5hk%Xq|Hn&>~EOBQ0*~in%bEXXP&xL>NAio*@QG@&+^W`~12l*d|KY5UUF8sOy|J<`Y zPxWIH+LiiI9iCR|Ff5TqgE~+dDTDk3Q$OG*809%Cl>b$rDEr5xbOla-x>WPvbpKJ) zDfE$1SW{9Q#)-2}EX-+i7$&lF&q8W|m$bL+ShHitjtwM-*i`y^Zf(v~zv?bM>lwZ_ zXZ(QA2A??KWAKd_@O2p0=A;k!Jn$tA_-ycL6Fx)n+8pp3{12P@LEyGv+C;;NF1&y@ zVvR8~ouAJKe~pM0td6y-bs)ZjwctCj1y%o6)bCO`REJCDP^sT9=X1Qot9cE``~7$+ zkRGHuP!05c4wmBRh8iq2;BKepBmM}ggQ{Jfc!p!47oibN4y8t5mm;B!M5XWH-E=H; znBdIqDFyfK*hpw7?)L(;B}ky2s8nReh*wd)rIVhEXQL(O1a85c`a7I$3(7K_JhW73 zoU0n$ zyzAWrt%$=rQ(UjN^!qIEtsU?g;k#kL$HT{_ejaGBPxfa)%Z5b@URCED*UckyCynk} zo_RAgXy_bz*UhfAu3y-PbWVXC-iKVjw9jh4(xJMHo&7E~jM8;?O>zx!PIPVnJ$gY_ zoii4i95uHw>8F_AbgQV@XWQF|vSOj((IIo3uA#1#t|8F=HKcQ-Yn1Cg*A~E^UpQ;K&`-wRnWQCuUmobW9>uOPRDjdheG2S zb4BFSyU!LqVr@5fC^{4-eMlM=WPTF(pJ|R_jp6n^X2=YrkIwBP?E)|MaMw*ft1)Lw zp6j%vb>Z5c)6Yj9?|nD&c+VlwlOMBvWTVg_LG46iR~qafg4+?li&`EtgaRi|r;qw^ z%cW3FiyTNJ9V>a!kS5L@P}W1DJWj83lKYU8Bk4KZhVYBk*bcnk=qz?U=DgXp3%8^q zr%(y~tl5+z$u)#1_wBqp-%qsvPTb}`lNt2ijqFl;nuAFv!m#y|;O=MA zr)@YXFz_1(XL)%x278$HE6Afm(-0d&mdZY!*W~iG5giydBI7EJY$CoE@J_Hi^1Gbo zT$30J9qMgz#zTkVO)gi92`3xPcAP7=vwRQUX{B7e)iTob4@!%Jv_j!DU99lgfSr7o z12r8t(Qg&wAsITB#zOnnGx68vzm1X&O36JjgF<)s3SSE=M9Ji@O_aQ;_idECDL&J= zukr(Mc6}g=urpkd!}~Nr=$0l4u0D+;Q=##aRkO|DR^?o2ZQOV^jt_RY^e#3& z7P=DHJr5mtr1yGy*B4GUtunCBes>r2Oov6hLH*uUh+3VD$!^X%Jn**LGoscxt8%mb z#;!JZ)5vPw4)l;`SEB4||`VpI!m z?;%&p0Q6U5YC0<8Yo&}W_AdaJSD0mv`+o;+QNRmAE10_zj3AP27=MU=3c zV@FPluB%6dPdB<&kBo)BgdX8fWC1kFgK&8g?VQr78&spKFH@tX|4%i#a!`#H52_Kb zSf#ASy$t=6rvWCe2c>e>`B`tk#>3Rn?KPmGQ(qUvG(L^B8X@m?fg zj@RSQvQNY)wqOoC5FuUf*=0rUIoY;zUtY1xo_3ORv%FpQF|Zu_@M^A-b64fxSq%66 zEzxhV-dAx&PQKEPmD#c{20gIJb8|rzT+IcetK**kK(c1MjmII*H^aH+f4pK`WC@YVy=5_q7l- zb#h*#^=;xcJ(*^GQ{ky*xNGvhCVR)Z=RNbKQ~}&kR-C1*_krt?N$WftgB(LL&+pFYlOyvFI#0^T`YX{|RWkQ5M zmu724PHiIR%n|Few@94+oszRB#wt1T26CV-IE}qia`8l_5;JsA%ov;%DJDsY5eCK3 zEs|n*-^y%A^`BgMn%jP}gZDA-MBu(0r#*#A4$YIp=51)6;?h6A54OTdn{k0-U)b#2 z3D*qA27A`YePNTc1-|JBPpQ}q*Cg0lPdRDW&4O1tNQ3jZ7VXsR_Nh2gT?`QKAS7KC z-F$R+lHN2<9E0;W>#oxnCa%Pc#rb=3Sy>hS&CSumt~l%dCoo~)VZo$U8{scrX&YJu z%_Vm&%sy^eX}4xVDpNPHs66LuMNdfD#2Zhr?jq!>)69_hWTZ@{dk*OkA$S_Zyaad} zUNh!arUyh_=mxM0>n^A;cO+o;Dloqq$j2dH74mU>>X;pu$#-iaUu;mmv~KLD&^HCh zQ~K+G-L4c;g_AqZ{nFDVYdyw^+s&Mz%Rtb!pGO_MWOg|d(F}f_7+vO2O z)HdE~IBR4_dJLRU)X~~e3a(h=7i|=87|V?xfg8l?6F+fJSMCmZ4$jeBird3h);*h` z>8}A!lsw5*IKNZO%AEDEJJ6-Lsniz+O4TT(c8E~l5#dm-n^DP!dh~-z9;=kB8LJu3 z1y|;@1Jc<6NRis8uQ?Z8uYD&f3w&@6;Xm1<&F9 z^R}A9q1HYpRs>q1h(2t~X$Ga@rq0En2T5X`JR}(!{BW8QoS<-sheGf6a^e$M51IIy zJdE*h4`rOF^=kJlm@7ICgZ2mO2Y6dP99q~n4=j12bA7|2@=l+v zh2qHlCU&Ao;JMJhpH^W~825fSjwMbaujdAV1471LvsEa1wJy ztxj7@U#Pv0ZRepKk>%$?4(v(1%FNDAvTC|;2SeSG`xqouz-b|y#J&*U`}JwMvyCX@ zU>8RDjb_5VyO(}n?Hi8YwK4iV4^GSVHb}F9LPgx<;gCJ9hWs3@g!BjA6Ca0!57~X; zr9ZumdmQ+O=?uvjZ?oY}SBAf$hf{@hPoxU&1*yVc=izTrsxabitjf}yw_~TF=jX<| zOK+OZSm~|hch4@FH=p6(E$)@e*5GRaFEW>_MH~JB{UuL8uPpVLN$D{oZ{9 z$gTHGzzcaU%SGKReC=-hJ_;FgNUWi@M#h?WX;mLVMPmfsRtC9m=@-0+6TDae+^~Hc zo7cRBQBv?e%BL@Qd6jkwN`8W3VqDYvumd>(Za~2=$DWXRMsXUHa5!`|+Ni;KpRuuu z^eAcZt0~P>+!&40pAV=Z-~J`K5bfESb02LMT}^GdqcqZ?KK0exgj)jH;)J$S7u!}= z%qK(R3dfqX65jrm5pP19Oo`GUu~lZA%RqMp=Y#a?K5Lu4TzysLC3_pS{V46r@8OP* zwtM#Q;v&b*cZs*&Y!_#{@2?h@R@PK5bw9A~nz2>lJUiN`&}VdxEwJLY!o|j=V)q_p zo#P*e-FuU#DX4HVDw)Qws}~^d1rk-GVrQZOEa}qHMAaZOhh5 zZ}*W!XbROUp;{&MBzX6-QzFodOL^=Ac}%bdsg-{5ojigPdZnfgaa<-fsGBV^sjjG6yBdQCE1@HG+;g(Kuuw}Hl+9}PJRt2wMmJXYZ5WRM9eh~ zP(qRN)A-8l)G2{3+eI_z!dmFARm*L{TgS=xm#_)N`}qkRO5nydUtp^;Pc~oRRt@d6 zT}`v@zzNl;6#1kuHE4*W_@U)V|RE2b3KIFvwC+plQlg=DYTItVV<3NNVjK4 zm}8q|k?jaGd~-2!bT z3x(Yiwp|>bNBVCo1>%#Aou3@F)e&D+6%e{tleHZ^79BI7^_z!4QVIB_P%Z{By{Sic2l z1K@m|fKxO8Cl7E&1CCDmcf21%lLj!fS;5eOJ{nC&`_yuD(tqLt(N(rKVm*4M4}32d zhw`2*t=|UPy&A($ut`JeFdmWb3e1QCqh~p2d8a7cfbibXCd`8goEE&9n7?=GCD^#P z-h&%DW&=Wh466o@$IooSEaWiSnYGf1vgU)A@k}q-Kh0;D+Z@d*ml9(~`Um1)K2B>& z!SpBO;TFtfT3swnl~3TjhtnSDTXg=@VO<0t9%@jG8t^C!tDpl^EzTf$d+7_i*V4lqG$JPUsiTBmxjs*fC3<7mIyPeu z;$U|%3H$!fJ)~0}@3Q{gK@NM7R+yIan|d`V~eJ-g*maHRn|+4x$NaaRLejzq`^=WaQx=I^q1 z3oy3K>3XfT2q%>r&;r{FZ&{SGa4Z#VXNzDK7M&Ncunoe3MFM!0YPI7@S zkzm^)m9Ou1U~HIS?e_3?wxho{u0f89N@GtI)4;+5zFY+`cLOj-5XYfTyV2I&a$3P| z*&?Q%n_0=cYU(peY8z6IkLrG#+%uFXD|K4wzSxLd$lXhSkL2KHiC&1%$;2T2g+{~X zB4~gyNPmbFIVkRf2u{J!(}G^dX@c#f6?PKNIF7v3T!VC1nELNr%&7DYt)~BuoO1CK zw0^^c8GbdCuxZPpwbhsiQCHRas2Y#kgIANg6nYNEj7>fF0Mo-VBb6LRZ8FD#X9d_~ zUJGuIuOiM8{jwbT*iiO25j8)JxPuYAvsH#eAIH@&8ZpBXwHohA753rp0{)`-qq92w z6Ge`joMsY6qzqvro=Fw%Fd79xiIv!74r^56-wyD6RUvMuki#Ta!7jxxMsX_;HwB2!>xYcAH}Uz>VlKyW#VcPXB3Jq8}~5c zw1Am&nS75RPABAFHtuJL(*x$^@_7))0p?Ygfw=*3JYZffZWH1(fO)yNEr?@)S#cSd z^@uY8=H=oZM_dwMUM|jyIA{!G?#sX=Ij>Fy|_TlrG7q*K!q__>|mFvsuYKv?6T2S4a z5TC1&M#i{3v`a4vKUEG(J<^S_CzWrd0!fd2*C>!p;S_Lm(7duiiy-DzyX~SLH>8w+ zI*0xhrd{s7-Z8k<9$G?aY2@$fCD*OD-pZKCDEu3Ese*|{FDJ4>jCaCCFZl8b_N|$_ zv01Fm+`qbP^*n}M3!K{04Pl&e8d!q{nmcuvbJsCbkY?kIaQ{qH!<#V|=Y*@k=SOo9 zlp0a2QS4qZE$9Tt{vMC}KH^21SKCoOuas)zK>i>2m;8P*)M3(i9nNN;epLf8jNOTR zFCk7NypE^%JK3=B#LY#V4smy|yD(-i{iC^4fjGVJ4j50a`&QiGx@2G`Pv$P=yHpnk z%m2Z;%wvs+8(bdMQ?1J!cJv49@?(_t?Ya;Rr6123bB31baHe=sR_P(rjR z!;XU9JR7!cXLh6ryI(g8A3vTVjA(-1yjRSE^xG7nX?lwA^2CYkew+P}i@mDYth$sIw13!#O`N@@ku!O8@pH<39P)!f|<)J(ebebWWzn4-dxXLb-|N`bs0@)i)6w#NTXrtr+dY(5yxT$C+5lZ0WP;x#^P zYM>g3Xwzu4$so;>sBngDt9B)lc-$~ALLPVJlp?uts) z4qzkZ&m*8oR^g9MJI~^6iE`;+y{ioMZwEZj$}P~B=9h12Y?iB-4zl#k@{;C`l^Jlc z6$3+#YH@l zXH=3`1D!)JwijlxZhwspBb(~MB6X5yBu3kKDtXq)4CwqZkOYahcCYbS&WAHjIBA!V z=|N37^dHrWLmRJ_$?DE1{}A8XcFv#f>uAyXlIhJYSCeb@&B%NduRn)clb(AG=hTH+ zpwo)bZ*NR~?(s~`bE`8KWZE)Ia@6*%A86lJd;7`Ev&Ph9zX^38(@NC2ByaNeDR7a7 zrj#92`f%k;q>h3Mp?^a6oM$DCf(xOqK?hVvfjcn@w24uWw%oFWM!~BX1Cp7EAL9>W zptwQNrG5b%3jLO|xO}z?V?T&FP*DD)N=-De2OT-!!r~s8+rA0BGDiJ}DTg7wKr>g@ zFkc!WuwBL#pU9#Iz0?F8J^P6~IcR<+`Dp`mW58M$8C^4lU*$u^kPn! z+I1jofn_jl-~cFcWDyNZx{^LNkbYMpy&maJNS~fapQ5BUu{CzLog;2Q=s@HEcSV%> zX#O5qLGW!^j%?<8rMuKcjLzB| zr?V!d)w%N9vpz|=s_F=T1`d~^tjrwO} z%|0LGtS*EyuumIz&Ro&FGRd2=r{+nf??@rZ43n4i++H6yBF~VxS=qJE_8tgh7VV%_ z>qpGsH8lxd0jJaypVph|(|cJ{W2puHRA_k8dM$XjRm0K{mZpTI4}=Xtm<9RL68Vhq zr^7!a;UD75*hM;H%?KZ&xur9eR%IESqyS7_kT1EX8`X*$25 z%NP`VwvmEYm-y;^)=Z2V5$~8trTwL5n#L~~X1CM0C%PFVotjKu8i}A>MUDOG5?^|k z(lX67t-skY7kQ{YYTB--kVvCRe9eTttt$4oCZ<>tOzEKiBIbz%TX?o=b)ApmWlvq_ z`*(YiS2H8k-;fHJQZRI;m#81_xvdUCdNN9GemS{ciZ;5qMEC~9t%my)-8=o~hQLby zGWFcxN8j|q_Sy6J!=6#}D0H4(2sNRkO)E>DBpZttLan_vV7CU^Sn0d9545ZXU4t!W zT@LO1T92VY(wDVsM8mN&I&e~onqy~x59%KcaErEJWz#3V>4~qY|4VqO`ysqk5nhy2 z(1p;d%i@J3^h4m&BP`BC>ZJ0bdp0klTHg-oWI@`87vhVdcVi)})x?9_KQ%^A5UmZ+yIMH3Tb4sN$Y_5bt!2OHd#UF^uCb8o4y>L7%NYKeB1`JI zqfC&@y%$1H^`)NkYg5k!bvNClob=+pQR%MfIBca^X-9_sOeQjgd6 z6Hjg6lB-7P zD!g~;r)GBs=bdpMZ39)dQrEqOYXnDfed$zZ&4Cm1AoX8Kyti@D>THCiwi=sJnht$E zD)jUNH3^NQxb3=@;ht*-b#|CP)jG+q(r1U`%N5nzNBMshWOzM!cnz0p#XWjK>@egf z6t1F;?}1Z84o#1#J}XAzLwz(?<4dK5gDhJu|q1QAQ~_{4DBEoT3_pm2%9@@XPk;e8B)XA zycxMv!e_8iD~HY}a3NwQ-`1<*!on=fhH>V(zy`*i6%?;Vgmrv=DQpBAirY2Pg)fEC z{by@4%VW9jGC{gN(g@sD#xFoCGtJ|7qK!QpxR-i1@JkRo72L%}X(8zLdg-KmH%9DY z=orvLBAn8`6eVsGqSUh7JIi>yk`a|wKtJvP#{{K2B-1(Y1-z782t5(KJ6G4hJMPcb zHn1H9xtfModa^WFnHvBB^pO$3SUje4*ig#GxML2D7eR8yHF>J*?Kqd0hTg}D4vJ7g z`VHme=HZ^1ex2g(jisI|Out5PUxfR*^g_igDd9g-+-DW{OvO#s8{|+xo-q$rgc|YJ zj6cuFoATyk?3ND;a@MrKH1r_L)uHuMl)e-KlkvR>+q6tHN&9f7usW+Su6`sJx~4-T zk__Fg1xv_=u^hU(uMj-8Uk3{C`)S})oMs5pTQXVD=B)n+oWS?5r_bX)q6Lp=K|ulY zcs$HzvoWGq90sk2_$9J$)(fwqPut#y&i=z@!B%n1BSbYqM;|X7tK)?1^}JBac%kYM zjX?B@#}Dx0Cj8aok4O{>g&yDA+*Qj~i4`j<*C{MDtbAqVy~{-VnpF?ouLKmYShciz zT5;uyW%pH8t^prT<;rEq&nlL!xo6eN%KMhWck{aYA6T|hEWhubRo|m;6j$5|LI_wl z#zLADI$X{VXW%Shmt64C9-`_}9PN0I_EGV@(1qUVz!sCz<9K`3vm>FYIK3|pYqIBL;W_>)M6StlIeAUy55W?MV{0VJ(@u#QBrGtG`tu@K7hi-~t@29C;HK*Z}+6%hN^n#kgQp&IoCOe+S zsA{U^#u>rOdsgA))s4N%xuUM|;Af|WJP|l~FHZczpLur36Ijz~8ebLB*K1gQQv!p$ zgT{(cvc>yDG#Ep?V`ea2$^R=Q|GS>!vd8kFTi27v>Y*K|sV2R-09uPUq%ld;fKwaf zL3#A?!6-(f6R8E6a7L~N=R%`sK(71BIB44DrJ{&+g9<@|UirwAggD^) z0X1yWy5DTuV0X`dsVu-8KuC>yh_lRu7a_h`V%u3bkG5!lV(%Ag=anaW)}n=7AJEVsv7a zUt_Hv1bNarhMkpaK3Nt9(yBH8C~RdXw_J?C%A#M7(oy4W2m*N6dhwXO)Fw~ACNr%&2zC<->=vmtT-4thF$+)s1RqG zgP|*8mH3sxWfJj&>$2uxXr~hUN{p9Y>0J-4FL6lyBe#=Q4BWS*R9UQ~aM9gigod7h zxZ8TSgW^KE{x&xgWW56UBLy;-Dn_<$Gzo?CfM^>We4uvX z*TjfgfujM^ufcqxRrmWmpNB%Tz+FLUuBH8G16~0X-c<%9uI^b z24=(>%Ynm?&tM=|R$#v*K3}1bx2*x4t6-mT9_{XC*k>?-L(tY@_}FmdCFn_`-MheM zl1kcW7aoIrKY{)7{VlLe0*O4n{brY678KWzZ5{O+p*xPBAo$a9UKr6N<$;xNX0$KL~!?Wo`M+jjpB6j(V|fNgdy9XIk)I z6mOf}GNeU%m-3@6t6A{Q?4mkOBxwNU7PU^;yR6z-%R$?tAE*CO4+fzD&wY)W{%aJ24FBvg7{ng>MIp+g_kNziZan9;wNNlG1$r{HWc4!^^6uv9y-fZW)R9RlJmUN^)+@-ND_7`=n4K^;FII-M5W* zR&TYZDD7H;{lp!hmR*y;niu<@GjQ)xNte;>uUMPyl?!Vcmm`*iU88NI+RA zXYRjesf%?eWwWRH^Bf;`DUUH;uk=KJoTW|;H7?-? zJfENksQ9@R_$l&V(X~LukAZdHj@cIv^P^rhCm3sV7 z%)o98G$(LdAs0e^rKX5;QoD3Nq1#0^HEtlI$DP{!q-M8tey|*fX1u3njaDeVnNn=&ZvP3=g9)YyWQwAvs)p7H=AF^0%wyg9~lv35&S#LkpndTCpyE4Php+iD+mQakp>;D*|TIq7GIj~*6? zhgSFT)>&QDhR^)Du0OcF_OCjFPEXDs+)w9t?bATXeY6%QTIjqHD^Ghw*oiE&6c#uu z$GflEJJ#h=)=9cU{t1!ST=iwZQi{{myZo@t4-kyLEbv4E7$cQM(p^`J>7a^o@;buTezh}=;9m}n*Y7j z-tGW5?zSMcHQ?TsQ?InOp*Fpmbb+$&5ooUwYgw*~!+DfiOf@kD`El0;#mawq^xujb z?;7W>#j2g+F9iHDtlI_!7kKBe{yy+C;DXh%abLiqIkUDnv;nex(T2LDqvssi zZ?)csp1Y%En3S6O$w1Gs3F8B7+ZOxbliG0?+j89`|2(S~RM~*jE#_Vf{i^o`x6=(x z1(P6YKdJwFH>Cea>i}sYSO}Rw5ibJV>V#DIQ|bs9Hu^b?fSO+LWK4UyYdGpL>->Xn zh^|BKr|e6*PNAG{`e3mtU>Nt_X>QsqSe8)JEJd1l=(wV}@-Db(_bx2B2pJ^N^}hR^ zoS)}BN7&5WSj$zzf>s(?erLk8Ak|>3%eqe7dt9E`NMmJTVyu{fpY`Xjdc(T9Y59hd zjIIediEJpbbe_RUB)O{*8i1_JH_RTKGn?S$f*}b`Fi}?~dl|)5;htt#^Q8<>i9Z6T9$oH*G>@`{D^9{}#8Hmjua( zP-rqP{Z)nTECCV9(-I zQ{cwgM`cz(;csFk(53(fDYoFjo~fyS_t)F6>pa-wN!6bG*K9j_Do6JG`&I`FuFRfR z`)tcYu%|f`g12m%*?-BchdU<`{!q!6fyuSU+FtJ|(q>K8cQRQYv`akS*=oyv>-6hA zl}e~x;`rBlL~Up5-H}Z(N@L6Z^=S(z8d#CG7Sw)W)#9F1P$Ntb+Mi~;qyfE7XunCa zr0`%N&?;^rWs95?RMxbuc@rm1zUJENuD@Z{qPreh&zPrf!^TaUw`{H7_UL1eKk?*K z-iD{2*}h}vv%X!g{rvIWum7?!_g62z^ztjeZrbyk-@f|V>u)r-wC;U#-&?Asf%s4&{+Ajz zch1PONsIk9x29H{be&%}NofBfpU0RlhJWTD|3>&H5Awec|Cm93%{p;X_8@;T{27D% z8{sz(^1lzic9385usCUS`&6ZDa+~~0EtF7lZG?-y??0Th=6!dPQ}ftko{mS4dO*2^ zw#GHe*;uHZW=(HjY%R+sdRL>9^RZgdx}cMd{lb&$ItqFJ>;3)fp4j$gloSO--zN6FXlU`C98f+Qad75)ZA9(0ccu0L!h!?oXPYXw|#itiZ_&>mKy;4O;go z7hWTgi(KI1g)7fh_E>tYW}>!z+oQ0=ZbM!1J_?1*8%rzpm5CL5`nOhW zs<{m{7b_1^w&xIM-NrO*QT{ zxYa{ra+s*pHCTHl!ipU2Q%%se`lrByODo-`TIh}0`-g|q4VlM&<;Lo{C|%~NP5G~l zObz5X?$5c0^tdQtuZ`3P`rUYaANjTaiI!k}N%m{4%apx$C|2-y23GJpvG;Dax1Q9B zFStK^nC;bC#|6p_V~*t|cH*I4YM8g~R(9h01lIob13U5Kr^^kxW0mfs4|nKi zUAX!Uysx59EVz@I9CTZtJCjkmE+VvOL}(?&T?%)q+pdnvYEj)B?sm{nfIm80q(W!wFo&tO;2P7!l+GJ#ubGq-*alrIOe}QHA$@kGW8Ecf zW>sGk!Y-UnQru_o^41iww52M(>z&rxiWXO`QTj*t5Nb{K}Wx zxOHs8{r)X3;$4RZ-?+xg2NGJGtoH`?!OjLG2-h!x>n6t9&aAX9*&&x%zO3P}2k;Ya z3;chiy$O6%RoXv(ZuX>GS_*Wdq=l9gSqh?-(a|)eX{#u!ii3_RqLV@kMIEOu@0hX{ z*MJ}?pjKyeT9mN?9YMqfcO0EbQCz4FamIH*O3Q6o?rqZ~zwdKyT98-gegB_7eA2s} z^PK&hXMf5|Hp`{vmReRYJ8*4wvR!Cc2!QUZCY>3YN|hu-O6=`bp`Ba?HXW) z7R&|0Z87uU(FnMqRT~iM(tQUSUTD~W*=EE{f;U5085%Gf%=;}a8%l>yM7?mBW+u%x zc;<8%d~x6@9F-T}IH~F;pVigMpTk{;Adg&bBH_Cp0rn& zZww+O>=Ts;=Bzm)jfFl}mPKp7HNYm#4QM7A+aWL0FqgrXlCKVu*Ki+f;k3_{iU#ek z_gVFm4+GbgKa>+0v&eVLhz|RPoZ)7`Pc?0O9w|S;%9*8Z)t;3?4s_R6aEc>98ko~O z#h8_^fFEXn)?70*RfNh4XwpTb*{A`VbalHGtD;o2XrZ09G*~%q(Zw}A8EIP7x>uE7 z5R@NC&M`o@+ok`@VMBgSkWKnWyZpcbXk=*eGd^$8e|^}m|MIXtKQ;K`3f5TnsIg8B zjqtsE@3vIRRY8nole4MPxd>k5oy_ZRXyX1J)7s)E83J*W(%OuZG=U^|wxIDu6dy+% z>1?c0a40Qw2Qfy@jqv_XD@}?(izxv6d`L{)dIgMvrBLJYNg|5_+oosPV+Ro-qm&_ynB|_t}OMo&2}tI zS2-qJ3R{-(V?Ntr7%8d~^?{Vp@JM|5M~{~J1O7H!W26)4p!L5Eyvo<4Y| zDHyyPyq-K%;KRwvX%q4lQm4A@*p8}eORqT-|7y$q6*|*l8}@xbgN95rQj5AWu?=+< z##pg~Tnn0kzI*~)h^NRbcTfiN2l;vB#teqs}^LDP!wKz&6dH}Yq;=Pfz@fK9Zp<97#L z$15#Wu2n3)d8I)-7kM96mssr<*GkHFlr>?;6!42k{}tAfA9h+76R|EPVqHwcx|m4o z!XReEqG=PiHYznobF7k)_jsvC`NyMD8I7xozD4u^YUvw7YH9OX$gi&GAVq=9P0PnEffg4K4wjmzmgZM3kFR-e5d+;;o5k(he;2~{ACKj)R4xd(ug?wAoS?SKsclB~=&Mls--&Hq-^CqBs2(oNVF5 zjX4QvO)kGStL=rV&2}c{pf!krb(ktC!? z|MNRnMXBnLTfd-fy`u^G5%7rNRBF{$pXX|+n{}et>h{^PQ9~8H9rx@C$-R$YZPH%e zP}1aV>14*cs&)kPtJox)_!96Ha}(_hs=)E8m8HUG&}TK>jNUsAew*eq)wnl%R7rku zgPZIkBhnwiMYz9RHTjOu=)3cf6W}$p1>mPq z%8`(~N2D1H_V)0Si>6TPe#}oRi1E`3I6rOn-pQ3N&WkjGgXXHd8u~M?6^Kc$aLcX`#$D|& z4sq1fftyPoKC}E)eNg8RfH$6TkKl7_bbWs1U6pU|4F%!L46RBU&^eSZDfOyJelZ9> zl^^^~x7gvni|cncxok6T>DijCCY!3nX6Yuu{Izu{xGn2*&Zfm>s|&jox0l(AZb zv~zxTtjaGKtLu^Ss`mdmT9?yknW+DN#Yby;sC?h76CcmMV7%fk951Xx)8L3HIV>Uf zUgVfVv!!UtzW-&+ta~T=) z`p#94+60}H&cbWKz_EkIoH-s6yEsq>M%bw)fsaYM_BF5?h6XUN9q6XA)xbs*;M$EYMGcDo^+bQe2_e|bbEN-5tZiMv=h!B(;)RU zOH`YPe) zo0ZhpG%}BXcc4KVFISa=lG+1G%9BEr)R&x+YQVj={Yy|%MU`KIlB%m*C$pwj&{D1S zP?@pR-BGln(6xtCJB7}CSokzmDkq&3(Xs{L?=J8ic;KM!#=}$ViXT;vSGTzzDL%o# zZF$})5{5qRn47pP#W8-tFE8M-*!CU+mxWm`4S+`;Ou&q~6ug#MCxkTOk6UBhma&Ka z)M?P?LPNPM#vPAHu0G-xAvQ){#?NxcM}kX)SPmC(iNJr#LwvP~tX-Q&Gn#>BxERL~ zF~6G;pG-q*Wt|8uHS$Rvm5$0c8sQeVxX*L@i-5}ndAs06 z%>B`l9JDD(NC*;NKO)8Pnm-g!Ss#kEukO&f%v{%BcD)^wYWx(Ze+1fc5jP)HUK7UN z0+=(QgR7Z{2*!|2K#CFkbT3J};P*AGaO@dqA`3WkrU1D1`YVQbK0fe#*4ig`DEY7h z{S3}$L4T+rtsLaYkATm}KglXoFnkAY>^Yg11fb zZ^HKmW#I9zWdWLw=wi_U?f7)Pi_~F@v{yqjD&wi;C zzA@B?hlv0hCo+W~*{@FPVlkkNmI! zX*%l}C}!N5(%6`l^20^&dzkW${KujLQuZF~x+OH15+K9&I?hN1(NXZ^W%&Ka)y5iI zc53?d=?yb-GM-M~3I2XP{%Xtx8MYaui2|z^GiyF0_4fs0a=uc*LyMp(Z0ykN=LOz|ZJ`YF4ur zrK+6Qr|*ZA4VC+Ms>^KDq?StG*EicY#`OzF$FeDoOqbQ+EjuG^2J|z4z7Nnv#5W<> z6c0dY?voMD z(H(+|2-tbO(w{@j^FbAB?uCZ58vbW{rDsCACChw;4kl*xH^I*-G^4<4%t0?irGG(_ z<75DOn|L!=Hfc74T_7tGeoBKkVC5wHe2Ya@!*)Fuh8Z<~dUR2r- zYNso3Mk;~l;tS#RN{d5+$MJ-KI@N}byPUh(13GB8czmp2diyNgkzGz}A3>jm^0bdr z?H7ic_2UleO7uW+N@7Ktjb9W4yJsGr?d`1n+9m= z!)natv(g^kZxs1&WotET`l)o-8R8V%;Oi^9TrGLy!j+p3M9j)m=)h1cCQXL zz^k5_F>#ffa(T+Am8-5TaHN33Q=X^|UHxS3qQzOzE6M#h*JKme}3?|tJuX{39yu~SknWgL7||eW3WXQ-l8_-R{H0!{nR2_pJ%06 zqz{E&geG`_a+llz|1LboOG7z!AxB;;$K|{aG|;%AI&I=FCiU^e92M z@U+KWh$|Z#D+&7kXAqB&+K-hxYfbC7a*^j-`KqSm?cd7fJa*kkzK%=7aXmAcn(T|3 zJ_Ws4;wXaty@HFLmcAI!vaCQaeDK0jGB*d~@Nap_OpW)o<9{hMg1ZGGtXn2*p%FjP zH^m_|8^pJwbw0?6^7g>elhSwo<*)0iL=5sp|*04i)fQbB;z-?V-O}dniH&_JckpGDok}g7g%VL(%IpW6#rU zO$V3gA5oQqX1JmcXAlS4xZlqfmdnPZBHsB`2Zn=^W-X_s(vaFqnt6l?XrZY-!Z8N* zx)ycqrG3idUe@fx`iCzdVY5N(kLn$@*?VBkt9Sf@m(VM{9i@F?aUU?_8(GkT-LzM_ zt?!IvfdvUgivB8ZW$VXdKEqi)kN$3$=US*6_Bn97OXtC#{)vZW)9 zedhT%2fS=;edWBI`bq&XngnPBfd-kI#Wu37yUsF{vR-%ga5PtNt*nHXOi^G$D{1|y zz(+kQTP_2f@mpQX+vn;Qw0%?yxl~@N!!%yoVanSWI(zn9?(mRm#*7o%l$p>b$a9z` z;7k6d(7AKx#*PSSZbTfZ)W_@CxJeGvM0^>yIV4Hv@CUgwI=Aq(v(dF)m-{)j{FX)Y@T2!lc>ncJw)$(=uNJKb#byjD?VDL=svE1KT0K_x z`Z2*01q5htL2nWM(Z<48<+K!6hHY598qwF_Ps=~+M9PGES@1tns}^mlk81N<Z&PQCiqFeO{ zqI7K3WmCWBnlOH*MfAQ2?;mloZ40y5Q*7IAKHE0ZY#Z~4D{j$7o&K;k_;FpPifZ&| z-5b>3$cg#K`}?(ANcN^G{r%V4VJ075r11(AOVb)Q=ziANyK-4K1Du zJlM6M-KGPsX$jPt(U*`~TB$ER)Rz{-OQF6r&;QB3q?x_>CucV1^T>^Iyr1RY>3FNh zl%&Io*p3x3OFS1pA{2k)Se>8Gd}fR8`n;~F#CAesBWU06!ku%IYp%;uVlMeO_ekYD z{D{9A-?pIATN$-{RY@~(u*UQ2%zUmg+on28$>((hC-uQ^jvbZVQ!SG7rmKX>$&KSr`G)7MY-;&EnCTF_EGusLgtwzejNWUXyjSqJbq30rMb){Y0lJO zx@$v8x-;4ItDo5oP4=F^uUsZO3(&g!8v9&rndMsAQ~8cs0Dto8WbA_)rVkiO%udhJ zv=Yx9v?JD*<(y!Q-gt-Jq+I*d(nIK#xh~ZSa|$~VAFnH?Lq40_zBm`Q z|GkUHs6#0!c3>YL-A&K9-h(%YfjtU((o-sIY49N#Z_D<>C%^a_8%v&&)cJ+>l=d~d z7Uyrq3|c%+9~yC!gCN{T&$#{$Z*EN3J1S2Tv|N9EI&^hzt;rr$t1j5nX3JhYrZsf> zG*bQc-A<3X6|=e%oJLk3LpC0Om%_!NJaL6&f;WKurYrG;>$hX zdoWp>zaez4=gKM7SygF>;g_Z-h@!vK&kPwXQ=bE!_MQWs2Vg^MuI1X@z#B+nPt-vY zaH|%1{%(t-NBS@FbMU4qvj-U7*k;4QmDXzr0d2~UMK7-5}y$5a>LwVpCJ?ug>` zl<9DG8(?A2o-T=l`>e_lz^epi*k=!_`CV$?FN0Rp@we~*;9d&61sJVusRZ1E{LE?K zRT)x9yx)&Fl)vx8x9V1(3O?~}A5g)rJJ3&WdJwl5zQbF{M~$tpwXfVFc#UGKOl|yC znBniuVZtw{oMMzSqp(N%hQGfKbn0m-7oGtNfrIwUT0MmOnYSlD^Q}CybqN2H<9aL{ z2POQo9N6ErbXo%o)p(}>Pk9P-%OwHet>DIxti&9!q4)k6vSsy1e}(p(A><62gV3Pao{m8EgpD;-hH!r4?n1!F!a;ZC4#+-f4wb`Kk8uz-eh8ETx8UR0UUV z0Ie`9j~K3My(eAWF6=7I^G|vqi;Z|hWiOYb0D^>l<< zxdsr*xn2H+dCGX6yO75n%d>{(`I_fhiae8e9@1XdIF7s4v=R;0=cbab8&G??TuHsm zzRWe*b?6839VG}XmvofipsJsIz^t?X5negoNVU-u zyOefS^wSl1e7Gw3211Fb0q^3HZwHOgBkdb1cmCo3RO*+JpDXpUp;8lLrLGN63a+zH z=I}A2W9=F{1b^>OwCYbk3tt=UkG1L_uw18B-Ne`Ja!?Fz`FW=r^QI~UAKSq4Y5zJS zodjozp2XMJgMy4lE6YP_&%ZGX7Btz}SY;Ma+U@^K zT45}o1=H9#+T{%5C71%l6?a=7Y_G+fuz|zP>usa)Uv0O5XM)uYx>*_h;X}RjJmRh> zV^5GkiADa2exN%13jIKI(V+oaGo9cX_DEj>0?iQDUh+Ng(cQM*L&cOUCBhmH;60xw zHcJ0lzqT1RGLAUVwKw>a&Uu*PrvVamz}XG@)zkNaIo*f(;?y+X7=(urTzjN9`jr~r z5CE;|NwjD^`psEBVS>7Sn1uz&D-rYwJzDrS>Xm*ypxUC`-7;`_uyr4w@lMLW);@{1 z_~D@zj~QyQ@1l88j@iB~%)B(uG2d$k=Q_2kKinJZjn8DIH?HHovAACtr}Qt)i`)8( z97fCpqNtUBwXZkeWbBcy=@-yW=qe)Bwf!3O2+NHF-8#vi)a$NQdPFsbR>*j&DSD)U zdSo{B;M9H#^$NeAzeuc*)~YLAAG*JqfegZH1p4@r+S z0Lpf14vpIx33}mxt?4%?ypWQ0@YdCUG$-I`&c8(CQo%dh6SLtJ$BDAxpQcCZ?$frE z!%A;ONZnF|YfZ?8p1CnX{6FIR?U&QchP3^1Dtsal4^Wr{fBDeeNeJSrxhhS~uS>G# zq#=j7D$9VY2DwJymuLnD(PqmaA6+`e;FC-RKU{x=>IL*L!u#b6o(AbGwv7F9ig|s8 zEz6jRJjBy98+S4I3szDe59{A!F?>>X8TgNRpfvAURD!z<6k!+t8_JP40=iYt67>af_KjH^)QP{f6IP zzZYJ-m_HNY7I-@4+h8u`>BlM9#IM_bieJ# z6<4$nGH+|ZpFK6;&K@5aUKEe3Hqcq5X(JBkD-mb#2Uyk`#Fp?vaPzd*1XxI@0!C=n z%?sLllc2qC5Z?vng55B5ZBVQ1{{y8l4(bD(qeh&UsPs^nxNB6)_rW*wFCl(nj}!nF zrxsiKn#g0b6@1nX19>(N8pK{e?U7!U1)R`Y7p;#saV}+Eza3k=CK%=3sN)td@$WT}nA9orlY_GVCl?%uQR)8O4E zdy_r7o;s%XEOgWXhZ*lk_CgPO(;Ubo!Tai0Y_`5}_ecw6_$|z>!0hjeEUVCZjmwJf zaOP^gODkYCCA}BXdi{u`1zsnu9^2x*FLqY2Ri(bRmpdyo@JQL|sa0^54RHq6Vc zjy6@k%`W7dtf?KQ9N6>0V$@`Pq3u82oj8)Jw&<8{m;$;m~YhdFsuo&ERgilb;bbtHom>EzSim(>4y< zdO%)n(Ke>y+F)Th!?vbw6X3fw88eLfFQWo88(v%%MBz;>$G)7N)Z(r9BIK-$J>7^W zc%OQ7|;Ys-2Fu;c^{7ub%ItdPf z*0siOPk1Kr*`(*bm2Lh{;g4+=tR+5`Q-kU)s;8AWT3<%=*wqzoBg=cpcUrovA9n82 zeDZ9_>o)^_RTxUWHF{bajT4f%n1eWF67bMbJpENjU*J%3Tmx)Ulx85kzMoQaDF*nX zBOJ*{ujT2-D)4cRitr_VTI%gn~PCUT3i)YF`@altiSU7!i2dGyxG!eh$K#$s>!Tc_IceZI_&tjYj5-AGi`f4wX}>qq{hS#U znP!{@%G(O~Jyq_{e>Y}UWLDrTFu>y+G_w12g;dU=jJa7ab(X5P+6_mhW~e$3-7R!3 z66gf5LALAyeE3#{Hf&*?G}OEQR3`gP&0^bD8f zC89rm6TvCCR1mizzKja}P#bxvre;Ukvg@6^~Aam`HRrEC*WA$C^xhAW$^v@m2H=2he zV-qFV#d&ggU0;rXmySG|NET#b7=O^{%Bnsie+S&;EB|wMGXA~}=Pl%g>!!eLQ1->}xHYqb zsaYF4(oQnLJOD;Qh`6o$_dn9rksC^QhF!Sk3mWUuzNZs zr@|AAxIYLD31h&7y2n|I0=>sfyo}G~u47c&IjHw>UhkQxH=B4A>)yyqv&L$E>rd1? zaj53`yyj2DYThFEBC5mwV^o{;aIf@D^o?U|;vPt;jzYInlp>&K2V3CyQ44B#3!($P zkViHhW0Rk44+589)~&#tnK-)d>0{81{1G?hjC42V8PPw48&~stD&rGg24d;q%oiag zD`eN4se9GxXf3-JzIsGNgHuN28erK}mtILgP2h!*iPAXWqm<%yltv>QJ-6^xy~{Y+ z6fjLrYs-WU;JjBYla1|Er^E8hV@C1AXe+E<%U>-)JFhuY_G+)RB$_-~6&N;I51f==lPc4t@Rp9rQM3z_--G<&M2lJ9ZF-r^A?(m|#fd^1d~#rtNXh#6O$x zoO%mRKS-s_{=u_v1vphAEPUvs8G+ff2M|Q*OVHWMZ0dn-!r*!!OwPg2wXZ_G(l(q? z+@1&CpcM>ibbT+pbl8yp4N%B*hO8N=cOZsrV{6~#jC?5L^hyG z(rTLU*I$!N@0Yo7Z(G*vOl(#+8kZ+-P&c;A_co~;{TStTxvteO8(P)qy?a3AoRg0C ziPCK$SaCEE&7t$!aAiz~?{|aa~Y6V{8iGvs6Y@BLYpk&DhTrIqaih9Fg#KSO`gJbs~bXe%RCBpJ=_9cMhCy0TN z;GlPVBll&!Z9nr_>Q=_nBt{p3t4d#t(HC4Qey52h$G&Dnm&CpfkM4+lHAfR;U&lu& z4ix3hi~h=?MeAUp6E1)Tj}h2cuk;9NLVPm? z{s>1-Ks|Bvpugh8?K!*%JaEKwChRcA%6V>}q9Py9gW?P_0U@K7(2# zCM94FV$*4DY$EMiun$MiJp_m!EF~BXeN?wZ*`7tU5yaOy%;VU#Y@C*@MQlprGluP^ zXVsfoo@%r3G}~kp=SMZ5Z3pps(g2yl;m!tJk9;q1wS+^oqyLuAn437vw?jlNpO(HJ zQ0jOc>X^t!K!6q%$&_qn#b0_oBmoxpxAIsI=_ZbJjAANiOPz=U6Wns0W1P#*H4pZb z>Dj1&QM5$ej><=hQ1|80BD5tZLf&z+Bll$slZJO>O(SgpmE&_ryx5pxoCv|P!o5Z4 zH+TrJkbZ=?N-ye>`iJ&We9b*IFdSIzFtq7Icri~OD8l;xMqX33->wQ+ncOY}>5h7P zVzgJ<8A8b%3iT9ehOrn=i@1E_Q8okbv`5;|ulAaKrO;RqoW0Uk%nZyS^uXgG>PfPT zN$Rx;>ss4?U}HYT4-%CjU5)YNxv~WwEn9k|ntn}Cf_;%;FZNf$UaV38{_`*XJGCuqZo?%kS-DFR%NfKqLlO zYnCm{>==dTGw*f2r^(D5=Cs!g3#m@WxmVZtYbP}Pdfc>fZ1-zv%biK`0oW(3lvQ-mJ?U^p6{yWWo=v<>-n7ysI zBZQVUpz@Uy0ejikD>ME!hciSTj_ zLm8L47G_`S)WYY_(i**04BV1-_Lv&_QJ+WDd{@{hUq0&L?62F2t3osQ6_lmM{vkMN z?vh6}8D|BeBV+HQ>*LX3jj%16p>sTMHwFyYO*2B7-jeJk@V5>gw+On!0^R{*<1)R( z14u`t0zShz4?v%v?e(X7AlFtT*Vq@~3mChgMbkp@%8Hjfj}wZZp6VA6+vUUlbZ8}$ zcGp9ZhqLsPk3y50pl5nB8ZU&tA0-(u=Cq1Nde2IgVU^{qG&4Nhds_OqKifNM+l6H& z=FXEX@Iz-5e-|BuKQlt9Y~bFVuiN=_cMPQ~;_2K!lWx{fy0JW+|7X%&Ih4-K)3H%M zUGBJ{bOT{tzn@7rY$)Avp3eO<>7tRr_I}Re`<}>F<%Ff?KDI+>(O{n$ix{921mE$K z=F!bf_)B+mHF%4&RTSUJYlpw{jdyP}H+8PW9_TLi)BLu?b1e(9qZqy8`Oa0sTsg;F zn#S^li7PsEJyV$a)yJ{3r3PU?e1x9qDIr*!Wl}tW_Y|t|#sZBORTKQ!6&BXjn!I|% ztx&bac@6wpn-!0%sXfWt1ljRvXhG8ac%zSG?#3XvA3vH$0lCnvi9yf~LC^t$wtWQV zgde$$;xjm>PfKt1B|^@t#&azsk;IqMTN9z_k8?98V=K+QtHa8y8=T9UAj?f}q%Tv# z_htRr{#3^VzUP_2XK`ZR-xA7k!A7Y4JJ%GS@c~wl+7_1+pK}^s1LnaQdug;}4X@o72(VMnc-7?{zv3Y{u_>9gAZ*^@-kJv<^zQ=W~OBnC( z9dO5OHM(@bPs|0w1IYzRffW3P6&M3KuuRG=NPr!J$zuw_cc@1n42;qQ1EW>J*;y<& zJ3G!}LL3`SM|_dVV??X9L3qJC5?{!lvWUx8m=90gvkmiM6>EhSWp!tK{Hzn-JR}5(dX2Yi42iO#v)q`_^NQhx&h_dA z@|eQyGvc;wFHJb|ht7CVniQYIfxy7djtP%_W+M zW+>(-9D#M(;-Bw)j9t<)2kYOQ=1+@5yv0^%J%^ zHu(3rB%?N_M>qald%5qHY_`EdmJ+BfX|Ni>jm-uZmWiACF-D&1T%%X#QAYCSkRH*D zG;K738G*rBl+jpB{82NVC~1wf6UO+fcxQ|4VkGYtrGG$v6u0dc4uTd1&7lGQ3cc^> z6*S+T6kOS4g(m*uO+;^lP87+dK8oq13u0A2&8i*HM~{cc`b79ROtM}L&Rua}`=GXc zq#T%Emy1ng;?r*H1LeD`b0_c_80nwdGV`F&Jk!6#Rp6R{onhfX)86>psVzdYMl6rc z_6?@|cmK3)>aCP3D(#5XuYmjM?3MDO1YgDLJeuEAs!s;!Z8I>UbA7GAFw)y>y(>~Y z_8$U6pf~yrh|Xc~Xt4j-vh|*Li#CY4OHWyPNLdZBQ5=xkqK3vS zK8jjCihA$p|MMs|4UERw%Am(TSZ*EYHW5)xOuPke^WGvpqcKb^pcVXK>q=-D%mt5X zX8pJF>-#W4} zYs)ClsOEP&-&KE>re0Y+W>w{ydYVnM&g{8o)#^{P)nj%-`n$EzbeVR{PWdme3fW$$ z&6`pGLXSzkQ{FRs?&$S1AGv<)rb{-J-nmmgWWhM3Vm-6=m?xKnPz?@j#P!tbj>^7gz_UhA3XxbIp`&M2BOeOg8qQ)PUv z0%s^TigkUp6~t+N74bIrtgs?_+P{fsjWg)4@{(C(RnsS>M~E9eAbm}IaeR4OCcYZQ z8KbpIUp~PXXN5|9tUnPWV-ydEQW|Lu|1&&-U*8Ms8Z)+Py|kLA@1WKEe_hGXhNfdC zGx1gMes$tT;O{ET38Q!qXjG*gg|Bbp*cj<(17&oNJ?Y=1v41Z&;Robz9yt- ziOiME zvo9}ocaJn5l=~^^9#HPKYRseNQ_%Gzy9TW|JL>kaJo*ale)@_N9A5Lh#o%$Al9uw; zeHQAGE&+dpq|J!1V7;nMRe}B8OxmO6pCHyijHfXMI(VabNmm1wdx_x4^O^Lz&x;Z9 zN*y%8mNo}>Z0m+ata1I4db#Yff75KTAo|67fmT=_96V{NRrp=&X zE$cI8ftJ^kly>aXy%ccJ6q zvShkaU{{;o2F(r|G&^QPn zXs#`AYy#)lx`HAR9Iv%FUT}HJ6uKXpIB!xJ=GWQS9!cyUgIpeY0(j){f(Ce)p&+>} zzQA9_em}#|BYlPQ1ip~yDZ58%=TGL>d!*0%ha;cAYR2z-qz__mNmJ>g{-kSJ4q1jB zs+x;3>D^!WcctA_*T3}ZV%B5l)BF)>lsT%@ZDlJPTj=YCOo@3k4Xn8vk}}0=hh~bF z863dX3@clc9WxwL0|h>#IC6lb1co+YtkuyCZ5Za!HIzY;)Q$BJzppl{o)PzH+<>0x z+ijSyiLx-3Akx@(OHV|hK_ch71*C6;#H(9c0|;eKp`jv6a1)d#c=>#$ko_;q4|GfS zAdSuS73#SR`C(=2Wet$ob-=C(T*p(A3cRM8EY`5bezt=kSCgz`RJU}F%RCggivYJ< z`Vf*N+I3fPS*sTiO97iTthSrL6STRC@a8I%FR-9J>5&=)Hbe zr3Ss;Ep!V^Z=lJ027c@m?kY~n zys_9teb^1VVQ2dRpcdlp-H2|<<*?ZtknG{8^=$iPjwD!LcEe_LFvTvUnBp6a zX1sZ?9)I1{-BL}2^zPonZ~t+#tw$=^%h+SsyOs5;@T6&nOh65P$!j#9=Xf7E23KOi zUS-Z>PM7`N^%$a;vB^xlslEvEQ^L-3Ff)rI0x)x7tFC5awGCSCf>&ttS69?D!QYYK zEq%fYd&nZ!{jTZGIwu<|c&~A}Yt&W?<~T+ddI7d&urGxkI?I`H7xTUc9(cE8jl_91 zTTP9myYr_`Cj&n$o8m_@@epDG30~b@Li4jh&DJ;V=^fysO;cHK1i#d_tky?RWyqHa z>R1l77*G#zsNt~Sy${s+)j@6JlXiIj_s*!fJae)AilDA>uRXcL)F>3hb;Mz943=7! zt>>j~;ial`a)Nr~RP&rKrDp~W$d}duEmiCA3(DUUEB|{ghdy8aekwmp$f>_m@R}L} z@~uskK5FOr@&;RZdq@{_*9ca18%av>)*>_-(B^JvaBlLE247D5dCgQC=$H2q|CieS z0Lm`A>%BV@gOn-}I`iF9ZLB`qFRIUPxjafIy8B4KejMh(beYmGKzhc<(3VjSP7<4h zzxjh22CSx)>lf(mq+RN5zRqWdwcxV%N?*Xk1dU&LxJQbUk85q86TCveBkNe~5aC&{ zRi&A;8kWCPVD&m7i1iQsiBi}hcS{q($F=!~2h%(W*<`nr9EPq+jWV)vv6ftMQA^BW z73Poj@%lSefMN`j4X%pU2s{wlLD$v3zLs+ax}_hW!(LjWM!K^DBA3NK0Bs9%kzl>& zYj?I_UHWxW5&U^)UlY&~_A_BAWZyga9{92H622PPnJ!8%@V5sBF6ym`=&ihF z`$uh{d>V~4_4ecdYc$+RILJ8OTYCpcW&+8(3{8xvh}f&VB*1-T0FpSoso`(#-3`qg zUdEFH(1fkgAjP(U-)4%4+iOA3tcE=OK()PQJ&jThB zfW9LL7=M&zTZTO46_$~pfnP7~7PC&ObY=9&!;6Wkh9>RIN!kzy*HWiu&ln3V@ z(g-{a;-6Yl^dk-fU$Q_$mihWLg+5v3H)p`g-10mmNwzGXtn)uFYy7tCl^Gwq{Tb!J zh?FyDN8c%_9J&E#q`CdHpXTL2PrhwXYn60Ep-B$zzzVL9n#A={-Pwp{mpwd?S~LsS z@qtq@ebmzELYx{#th-atY9g4{eu7sVoyAWRFSHMsb!Na;t>yT^^T13MOLavDwJ3aL zjN7m&a(S>DxJUMwT94l=t_gwl;NYOwV`5vC=Gk&sES&5uS!dfqRT2kL#|^aV)?} zS`ANe(}CfrLKn*rB@&hj?9XjTntjKaz~Qb6|_FB8}FrNVyvhEJvyny_mTMm14(ERO+AQQ{Z`%9?(sFG)BuYYoEol zqHRg>c*9c@plA7?bWE0T9TUQxG>q2PT5$inr5B+yudShR@b%YZi_(Mq?N&&?f3){r zu(p)l1QP$)+G5Zt>XtV4D{Cu_OZ>Z~NBW_w6BecG5cg2Q*pyPqGOJr!GF0k){WV#l zWaDpd|Nl_x`+VKq94qx(E}QO_W}(y+lxpUs-r|Gzp2Mw>dy&pB*3i%$=v1OHUc)K` zKO~~}-!=wl8j*_Pji<_hq zP58^06Mr>~wARi0X^&YRr91L{az=VcHi+RU@kuC3w$OSTJW)oZU3&!hLm9;PPe}(u z!6n!;q06V>J@9C|7v-9b`ZA)j%%ne$`r^uYXiqTVaqQx((OOcz zmQD`?@A<8ytHUMigE>=?^H!eoL7vlcLJLk9S%Vexd?(?_0y_lq74v*#_nql_caeRq zuvUp+Bjm4c1qMBV!HXNte?)M%LjSNFUN$Zdq=Mu5NB3~+gun>v^?_{btiWizdCJ{- z*7mRsUpT(E#9?svbn?by>t?>0Y2hGM+tw#NDI@|cF+TF)&yD?*}8Q)@6L6>Xx zLelKA`MKo^@yXfC$&NI@v~#-7{F=sLa3q5!pK7UZP0=SD2A9Kv`D;tfT$J%$hR|w$ zD`gkip@gI>-=e1s)MN2me0^G0A_p%U{0KT%Ss~6=izVZe1`U;MtDv$A6{{JPZDB12 zjOHq6qHz7WVj6MXa}78{;O$nQ2v63g&+kpob+lyKP|B2n`?42j@0r0Sojpv{Et?d& z;Om*tkH5zBHHb@!-J&YYcA`yKfx`z|R0zKu=GUPSaVVp+;WP9HD_lzTgZ4F~py0#8 zK4)ieiO%);4=PB3RRYDFHi)JuLcGFcC-=E7P(GH&dy^*39fFXdST7|hng99%}l&z6w@n_sV=A)6Npo45cfxv znn7RhqMB(gsF~`bn(2mWwjSIXs@b5v&I0J`m|qvhc1bg%WJTxK0lNez0(&acR_LxZ zx=0cUpXc!SjlGfTe(B1H6IM;9!GNh@n`Z=I3Fn!CUu z5T%o`-BH;~>6vmlV!8A@*PvySk}DCp+GDwh2g6T|oDtA*WgDW>(@{k7($_5qy&9I6 zb%TCyT6P-RTC`@P;5$2)ntfeT2k6l+VATp5Sg2fP1#iWWW_33=R4#)?M|Ly(3y}`f zm}Sgsr#TU!F*H5n*DpT2Nxl)D&ILqsWv~gq2ily#XRWtGJ|#dGa+5sYoU=ElhC#N( zu#fD<9 zU|sfvy}QHDOBx=8w=wT8kj{m4Pe!cH_~21_nwCK?TMysb6E6E_HS=b=ro-=*;4wb? z6r-O}S7wCTtWGJAF-~lbJnR(Qk5?GM$#TFPP-O*HW_AvxDGa`IJd(ZZxr18 zQ`oDSwWEEk513t!e|eAeaGwUXO@O70*{8*wA(8~#NAZJ4oS`nM8&srisSP#x0o0~O zbi=c$fRv}hs>a&%iYIMZr5P$bcZP+DV>@VO9tN#hw$%3I@P4<*ddyntk8hyeSA^c0 z->+k-fot}5N$&s}G&^bu)~CRwx+Li1drH?ipqtz!y%#3`m*ReCao{h_O4254K&qF* zkkNSl0t*Den$l6bl#QdhZ38rdPWsPX(u-mGet%X2C>u78bqM2__k(JJ>kY5lZ9_e7 zhy4Xfa-!1uXc0UUbaDE>6nyh8V3{;Jcf;~QwVCFUGvY|c$s(!;>{(MBd(uVeoLmgP zx~ zHy+Xl*PyO=ZnQcQs$q})Eq!z2TMFr^!V>>Lje$JcI~ov`w_AD+^jQ}q{z}PjaP9%t zfB2Mi5?EXll5FN|Sj`g8TqlJgu-x8V(BY&@ndYP(ZOa_*;kIGGg~J6&wsC;F?+RKDU2Z zz-20!nHPBrn>pky>=gU~#Puuy9R?~4o*FI(6?QEmI+CXb^61+wy$zq5HwU_;tI#U) z7lxQs{gWzS1#tYE+0H^CrwLcg0{KRBikCcK8i-r5Rj{r^OxHba1`Ft!b$H_~UWeZu z%9tp7`dG-Ix+F8&l!f5^3 zeM;H_ioQ$w3uwGR7_8W9PehCPD{d!LgrB}x!{ zY$mkVW*YgQ~_onH9?*txqchjjU=^c@HkJEi<}`GHe-T*=n3OSCWOz}UWSo(f7<#=Z};tj zmA`mjDAz&K|&?%di>rT*JZtFp8o{#*IUaw+OazGc3U*WwKLE$@-<`-^eah=mbN^Vp!K`CyP> zU2*}e%Q-ARhcz0o1P&`92CEgYl47vlj=?g4m)Ip`fb&3o*A#vpyu@cX+-M)H#&Y^vy|7$9nO_$p62-IRZVmF6qlYRrBpZ%cR>oZr)9$ zyp2-ImcCa_-wyWacNgK^YlwZ!w&Y+&ya1ZN2)$7%uSToJ%^)0NUjKn~diNZ-IM^X# zGvYGNPr(V%=i60|o%Fv$wYzJwsD#Ifw&$l>1Ip5i#qdRO!Krq^7@t4Ylrg3iM`O(G z7=})@`}(Ndd-}>TA3LzVE*;>OQ>zBK3Q2)eT>rmInvIgvd~5Ea_4ol_rwhQj%p9OI z_dISe4C&Kxj&(^zNMGbrP1GJDDWl^zly3*mcNOwsujbV4plvVZ3xm?`lCpl3?*m@m z6Fi><`ToW8@!CN;cdPG|^iQ5kK&~|$D@s7Bz@QF%ZdCfiz8J;@+~sDJ@-a{U15Po= zle8zTv6ltb*oOh%wk>r7zxYO0pGyzIj6Nhfu3=Dz13h_4x;iwCL!2)YJa8(sr?3+b+7eJ7Y8-1@ zkGTi~WES!p>&9s_s;%gL#Hkfk%!*&HbW3PlRnWyICkKQa^#;`j@S`cVgXfNh+=i=w z%QThQ9NZ$gxK}FKH-6Um>!!OhUDrO81M1|v24+>Y2?a$i_fjo<&}%$R4Qgni5flXi zVH%jN1LtAn?BjC}lHU=)ufE~(e)0%>z2dWXHt`0*!7ziicPe_!8dy)O@JUxseSnkFyP!jLRoY6{e3Hxm zyQRzfiL;}4+GR0aic`|#{l;>w>v|tyi(Qf*c*jZUnP_Phn@DnLvUY&3&YP_5UW^OJ zJsf({t_NlGH(3R5BnI(gxd?e4MR~$<@El@?(Xi%imennWhd2 zIhF3527I^7Nvp_y-d&0N#~5j#1TkArO1BN-J0asYAg#`< zv1;2JfB{*Y)HmWP`eMvjkKCj!!@x@({6cu^W=N$UMVrI0X%E1@(f~|LUsGBWkXM7V zz?#6lwfUg~rSh&_O4gB(6fR4_U)!=_@cVL7>Wy?jPg=39)Cr61ANMdp2VJ7BND`zM z1~EZSYN6-T5gYd7#Stg$jBs+pE>f{?Bnp*i)>G0Sa9)O`p2$i^0&?m_F=|7-eBde2 zm=$5nrd>Q{XQKu@UJ|#OkA3rE&`eiUgd@HHUGY z!n)?P$^yQ05>lqcS@TPy=a#)XoaV=qgb^N< z-@1t`o*sp_vb({VvSQ~u3F;o})1e2SOfN!%mS6KA!#oN5f9x+96$4tUxp-70D&^nd zFXYv*cQQuU{$g8gT0RlJ*BhME?=MVh5VSMIISYfodzu{P@L1I z%si-pwl7X&c@v~(C#C&iBd@{tkprdLBf>b?A-g|C^eymQ#%Z^->N5`$Ew6_z@D;uY zXz_kY=-0I9#YH$(PfCxYEt;0BgVPGL`~>Z3XwX}oO0+Q2)ciZ5HvKceCI``aNQ*t+ zg3m}?eNeT4u>(}eNogs#Ak=CNTFowQ^*QR{rD5G(A^$Me5v(W95rk2~_`JCxeL(5LO0Cg?>K#|m0t$3%Qaj8@rt zhuiVB9B*6O>I65RiT~xcp>|osnc*vE9!gB5IcO2Q(5>6bmLI~dG}OE21Xw`R*jyQg z1z;1nC3yDCo&X&Dq+|*!lJFfpW@fNveRcFW6HUXkiJ6(1Bhy)3_8R-}Bh^{p%uh`2 zsD{s%+Vnm4_#^O@8hjld>t4y!1=(0l@S$uKFw1Uff8<5`L}*c*ls*M@i&88v*mDDZ z*<(}j)oBgWwM*I!Nw%tmzSEi=6?@wZ9F3lT0X_%DAG+K&th5q2=9vTUb`L1`Btg`} zav>EZd3j0HzP}Q6h!v(6KMwQ#AC&OV?*9_C{?P%#0@zmfvUa(_oU*(yV@?{$;MPIE zh2FDm2bUef2rgV+nXwf!wYP_D-MDm4nm#0GUbM%&tpUz&FlJ;KPaK$!T&r4(A2_g2 zct9w)y4~&)xXj`u=pju2=7Ie`)-yZoIn*<=X>~-QsX*5*DIYx}@SdT!p4i(=^b9@k zggyO9sgP^ApOXFpEq7Cp-i#X%a$r9JpP?k_K_q#shf~m+BbjDYQoW^ah=bOr*$Elp zYpIZcxC>V?aUtX)TF080-hKqG@y_mW4B0u))P~w1IykOX> zZv?N_+XZ@>@YLG_VQCJ$6wnO66|!{rZ2%8P1MD{V32>EsPrf_ zt7+woKr5B`L2uo$x6t(AE9V(dM<+r5)5^j4N4nvO1v&+M-={CbLfz6ALvILIZD>v0 zp7e}a@p9ou&jiWa5ou#$uf=|A_Mi8B^y{dBAk|Yo#JYsn&*2UsfBSC8Zo}E&b7{9^ zm#aP5<azrInab z1&*{rwfHiq*OSt|e&W$Yr56WCR||epc==y}_q1hhf`NQC&4$m4dvITm-|z4{Phky* zzJm)q=9AJo)IvSc!09Uiw&Uu64!Sa3u%)MZt?%!K&cdLsG}*SNAScQHPeT3=zAdOh zl7POynDTtf^DIZ6sp0b!9a(o~Ay*;KH4C{$zz?4eo=4z2-fkjp?p>OoANL#*XtgeB z4~KLuASLk9m6{JiisO*RUjT_MS0HJBqY2t@PmoGMEp|yyaY%W9bR1k);scY8C;2Yu zmX7h$PzN})=Tm!=k?!-DHNT=|k>Hq&x*y^xdq5x3?ArnFkmq-&ncTZ3=y>>BJHI;> z$KHMdZ$LCk(24^5@A}9_2$UD6%}+{S_jOC#;RpY`gkgkZG*;Z!0W)+ji3Xv_Ay1@# z7>gaEae@Y!4ap*AO_#JHTJF2jp?JDFDSbFVayAC7&u-~%z!dkBekO65iLQa}-T>Fa zUcGiToy5Nhk=(aiy6r6`Zpl&EHVVIqMpwl{B$YF|j8#UL0p8uMc)$He?<@FwbHY)1 z^(f}DJp_Gz##{{XU>I5S79(=;Lq}!TXd=63jyRtI==(PC$r zaEUgcx@1^Db4gBs*3Wd;d|4A$fjonCXeiUlLfn1XJ?%gDJx^Bs$M2}CItvp0c{ zqRRHiZ&g<>>1>@4F$qnmgsl?@G`I!aI!)3^SOcQsIF21er#pZ)E=)j1Itfc~83UpQ z1dTH~6L3b;5k{h7;ySp@dmSY6X2|$#=M7oMnMy#avUUHzr>X;}7cj&qLV9E%uHymP1SWI%{I{6Ttc;~T^ACC3U@G=%qR2xUOj=RS;rP%j*NcT_NQj-T z_kmh{ySJ{$g>SdU`eNa^)7)%hN5X-d@w>igA^vX7P})?<#!lvW-*dY+RqcBQ&m`Ab zl<;=%WsvOG70vNd3(xWTf$Nipv!XARRXOlEF+bUZ9+19b%T2KL-s4@7TH;OKoEc!) z**JQ6w=wiye}q5Tln?1~;}C_;!Dy(#4&&grEGr*f45Xw z!7r7982B7W8=FTqc>P{~8rz&5Sk@bp8DoYY54SngiZa9GNr%f^JlRQ~S{n{|Kqv1IdkbU&K1)w(QcEdJlH^lRM z+3w}84?Jr;^+g(I&;g7k`j$AWh_+;WkW!oWzwcSDes9zM9lcCPx`Yv&U#+*2FUL#E z^0&4qk3qP3%PJf9W5=>zVLtQoK$5D9tKAK5%3*pimA<37!l54)(Get->sPooVR`w{?BS-&Ki_ z^yI%udv+nlBc;0gd#SpjsmAhFzLz)pgk%hUJNNwW(fOY!9oF*Q{E_~w5F9JPl<%eN zjHdkI_OclNxAv0M_Trcy?IrwRdv%XedjWU%-?Z2F(q3qs4*Gpt*tp7ocv?P=}eqgSkPSE!gCX^99@e zfycP-;%srTF3Mg1m%5Z*QkT|WQC)~T7^};bQ~ob?asOalJ|F#VUFQBj)P+W0H6)^O z2Of1j1${bh=JJmCI`}oHjjv6pOQ^LROnM={j)PZ49{XRxmJTH3tf0k~4c}(7gI9(4 zXMqLv^di@fT+7uSRy8u?dtn<#Grt!mgf9=lf7UY>Q$7`jU(ic_cZDHYx#V|YB%!Xd zAhw^2U6XONO~vvA-*Rpl>Bs!4&%_uw64A4734IYGd_x)b!~25E=H+U!2ghD4B0oM{ zyVUM!UCTWGkgpx8B8$7&X6P4Wb=WJ}vw!s8HXE9W}aAXJaLr-VINJC0L2d6%nP;`qd&=&&74>wF@f{NZgXs9!I=@dPw*ne$M@a%T0&uj7Qc3W@? zI2$RL&DplJxV{XiJM3$DID&CGx}Divee!cdAvg4sytQx9uf0Q{)l4~TAA%0yaS^@* z#LE%~gz?9Kx6iUPt&$rR(Osd&x_^kuaNm&VF(Lmsid((sDwNjkaWr!m(o9v{ZupK2 zqNdOWnqIQln-}23;xfWoGDruo1GOA4F1t_K>M-D(Pt$3n{nixt^rTjtuw-HhJdF7T zfVQgr$Fj@I!H??=n-kmgnP0(lhKY{5*l(3g7y(~Z}(v|C?@hMNrTYp=;=@{;x-xY8Acul*SsIaoAPlT#q}C~zk%z0T(98z6jx{%S?sqW8ETJnZQNNhrD8ctUj{NDT15zc%?_9Gv9`2*`Syyp@Yxr(%l^7 zY!_+yHCmR7v=Bq3<@gS*!|CZNEl0XW>$`e2Unm8tbmmg2%r?(UHSO5XPhh_V0$U#?+8&(Jfppy%jSTd0DJsPdViH? zQAYfXS&$R!BxBsT)LiY~q{%kR7Kc%2uk}L4h$pVS6i;Kngmz2$Sa^_PsK0P_ik7r^ zfq55w@<*R89b+dk*6c^OW5uj)d=I;x63lXH>CS!NV4d@ZKx9WujSjroOiN|%c3*O3ZTH=3>~jG z!!yM``E{k4L(}oZiOHd9(UADi6g+i%V?vYFyFQdv%y3bd!|7Sg*R^`< z0;XXmb-Q7C67jg*%~Xb4)skdlWcJCcFgs}FA@3!`8<8Y?d@=D@gwx@a}li>$pC~^%brjToGKC-4kzWd^*u&fxIq= zyM&9zGKMJ2#k)keFZ%@ z_D1FY`5c}^JUuv{$I}EnZJe*e6YS@diunSblJK;7z8+6;c-k`GfF~oK9+_{%Q*q0( z^O5^wPT}tZutf_pU{K|sWBK)pFFgp4V5V&2X_S&7*YpyhB#y#qWU|b9<-zoNWh1T% zT$^!i!S#sxmiF!O*tz>f+e71B2GR4-6)sqd`ns!xfpaTx9#(yCHCf{A9yBsT+guky zm+SkpaFY2NMgrM(O%Xt0uk}TJFNvC6y$-f6&`t2DjtQ>f3HbZV} zG>r=)>?-`e){(JC`9^)(qnwZ4W%Zssk=gp%*fS{2P5S;)Uf+KMhm$cBr8ZhB-%*3h zFPa{jh&mNN*)hc`ixeuZ8^W+CA1iO}})?9V|23=R3|O$3CQ=yy&4%s%Vup zS1+sv4*4+(jrmS!|1k?@7Jf?HL-6@Hj+?UhAvWc+Ds%PX>SRNfYjI08`d&5q9-X#; zmh_inu@yRBOwOW;1-{*iuJy4BU0>Yf1^(Dgx($mqE!gnbrs@r!ZhC*i_zv^tMVt9P zT^3*Y>E=h(CuilNhs_UDSXJet4_7_#$;0nGVBW$%Sh6MmLBbl8vHMP|fQEJ5Z58>x zx{AM4us#m<(8YePE^QOH0pXkS@ps>*O8ouHrg!l-Z8LX&e4W|WIMOhjlZeJ`OwL(-{>{C_2nf zEa4}3;v7#Xy!#2*(O5S5UB;o9^6X=rc~c*S~D&7vH?>tUEoiq7QZ0F5OX~&pp?sJBaWw zBvF^?`~JgVTr#`jN#~JZw(qSjp@fOWev?m?y1_rhloPzzit`5gPMr8Q_+?%2Z6J>& z1bs!jVFgS6KbK)8ti|VWnwl<-HVG0@OZ9EO+y-J@TjxXSSn6U#p7??g|rl}{yXu$P5rx6cYPlI0 zMX@xLS8_40Un7hcvqD!Q%!GKDBkf0kSkBa^@uArl!eNRD%Ml7^c5^5P;c;4gP_EYE zqy6uI-Q*GZ;ddrS^KjtpTD*0LDWOTxFh9b|5at)np$Ql1_>Rc8XmosIbe6uu!Tyrl zUR8zpKAWpaZpoK8ZrS91MW4%!Dfrmjzb}E&<^VTm`s_ait>6ic4e; z>Bz#G$7mLWTjaNDJ+m@Y=`Sq+W#_+n;0gyk#R5f# z$NRGnd|bmnmhRxI`NxtLaMgrxD&%Ih5siPTG#uw6MH-F5Ug64uUfpD(awn+3(`zzW z7=zA0bXe0VyqNnsi_o|YJJ!`v}#V(u9TLf1zEiuS6S&R z(mm?m#j;F}SmFh2T$TmcP9HDe@J;HKQVZTQCXSPIi7~+y8Cfmku;Kx?@6$%$3!cSH zkvu7@}^QM~8-uj78% zAIDigwzkIQ#fI`e$!m?9AD2hv*srDMe^`%4XoY7EgQR%q6egngCa3N>F*JXe*!edcFCA9;W$lq_gR zN^6x0pTjk)#2`tE!zIhQh^3hmX@^=-p|kY{SwN@$qW!K$tGih&o}|+9gI3A~T6*d0 z2+^7VTA!%2z6gJtRz<}aHO7L?35zCFaAF5`O0*j2vXj8?bCRAn#>Jwp7B}&Cm}h(z zfAncXk{e?Up*{-}Pqgr&^gItoW4tK5hm{4^Jlr8BD)OPBgNng%P|=qjR0KCu!)_hM zdTPNM%S!b5y$(0lSc{{VbM*7OnoRIPT!>#Q8J!)I7cx$iK}8(?)O!OrFeLjPJ;h5gkQ_sfkyE_Z46Z^@H|SE19i z+qXKtztqG+%L)j`4_b_`U|%zLo-4i|z7(Y23|6{GDrGvIR{=E77;j%p%zeEvY*}w` z6X~N)g%{UDByn=Rg;)t4*ST<3IYFok7D4O4#-!0IUpZ{fSL1CgPE*wsM(koGx4q0) z)>tN$*;ngB%+}K8EARfB1N%-$fG3IBgTcw!@xd8DEzQj~1nt@8U|h%nOw#;-pyptNl$|p)G~BSsfedFUPoEun+t^ zc~a(qh-{zNzj~{6e#I~Q?VLILpP$dGn3b&yqW*INt207WlALTql=4<lzx2Kd@!%1r z(t*E~etL5Xe{t8J-45A>PJp*gkAmKNLquW92$(Xx9slyiQ= zS2-TbM4LO=<12sn^7mk0I(q4Q-}y^_x&MV>_PlJO~&AA+)p;?f)8Q_*lgp0 zutaasQm`MtvmIXsWkh@D+!oB2L{?$DxlQue)zSd19py&3EQ{2VtOh!)2cDYCAzxo- zn~V~T2h~Zz%?P)m1$d0JT5y%=(P!u>gOk$2;U&P6i0ALOk`Rr-dp^IMN`@9Y{r|7U z_6*I4wwN)f_2sd#KM{FQzXU?2N5vdhE#gT|)3};HREoVd_2;2q-PmJ;^Skp;JbnR{YFW_=l zy9mLnn7FQDz4ZI=rnQb#t~T-f0dZ_}J*(s)SN;@Nmv7Ubbcpf&7Bg%FrpAQy(o11z z0-BXJ%B}LNhQ1gRd4Ovjc;BB=$JOwM<8d;omwMpA2kTM)e24= zum4-;*^Y<3E1+RQ;iuH_y?*U$vuW3rYu{RX3p5(F&up~*8mZp)hCSxcc=VWKo!1{NIAucOiU6=>YmMikC<9PhZfEh>I0NtB9K z&xH1|FKkr%f|lF55zkvx$8S2=)Ss6vbX9oKzFcWRuPlsKc#8`v%2Mk5)|6VTI5o_+ z_1rbDRjl2F_WOQ&Vnms=oYJD>>5wZqgs*tjvmtH@d-c+GID4T6XWL@%<=!p)`jR%z zLfQWo?Y)OwdFALk-=lEyI~2IO%EEtiyyYDNz5snE1{$pwXjJ@L8jb&!2DSOH*O{u( z`73Pu4_u&g?BCLP{NK{i+T!wPs~>V%zE_7E&-q>(>kk9bcKAof&&z&(m(WmEXl*Ga zToPE5kJ%LrL4%~K@hY#`bzhFD#WYbDSp>3*BanBcysh^EL(T_ z&;88g?JJ2PFNv^f!QZ$x``XfG)9h>8p1~+&#%tQ`;1XsKh?HGQe%)h35RIInQJ7D2aa9%^s^ zHt~tBH5RH7h3ciJMyZ9^%wBjioQIRLU^UHTQyj!o3oyj1abZPPkyeT&F-CZ;xxXyY z928+Y4LfB~IAv;S?*C~bp^b=lm3iJhYc6#RMDDM3rni}N(6Pp;qp3|N)|WN(m%)SO zm7gaL99wP-T@0}yq<(qGqs!`*ZyMhA6|fpl6Pi$Jn6p_r*fb_mj+5Y7z@7y;?u>=j zzqyYgB(9|*YgJZaXtl>N5S~+ZHe-b=eYJXG(b<(aP`tbye-|%5*=6>Xd3RaM$}G)n zDx0?WE28GW97r`-+>$x9&`LaAZqt2M)bkbEQ|P7P(fKWpNz8#&ydKvpS5JCEv0zS4 zGQ$>Rz-Z=X&+VX8TI`Y087HloJg}P+!xXBQo(@MQRl2y@F&%p8tuPPo<68J1!=T2Q z2Y?})sSm|Si9A!d+-1GlX|x03I!ZFmwU=c4xCL|(KG=Su3wg4`z#+!ncnB83@vht^ z8=G|svZT|(Ay`~gnBY+*F_WE!oa%5@DhsX8NLILcj*Q2ggTcgXp^aiKtXN@P=!0y! zU3hK1_3DYaO`eRnQ}3oV^v~CsE9`SmHWB9v?<@+J?a271o!Z9H|Aya_A>Q?R=weOp z8@;ZjQeyd3i>sT82A(bTEtpdR`-SsYH+|G^^E^jmU(jH@Y%EQ zkz=gyD}u)ils4WhzOH&X@Ed>CSERFFfw1dWz^jz$dPpUVTy95{#@|Nu61$`vrZCI8 z9lb1Ngv#?t7i+2C!J*$vH*Wi{XY;Am^U|p#e8`cpF=MNBUWFYyHYzvYc6HMRs}O4L zzZ-SnGFfKU+9y(Tn>1VA+@@@neyS4ar6=yV%GS^_Ph_X<;wNbr7f0~<`IIzyP5d7}(!92%3;E>l?lY>9CJ=B)cFCm9}B^ zYxs3Ndf+!@Ij+~e`L5K|UU}1C#e~My%^_3j%g*tqb5QzT`M$w`*P9wBb5HQCj#9vn*`OM>ih9E?1u?ltFnn5*v6Ejpw%QC6ZyiB^=EFgY9 z=Kf_;sX5@4JgGQ|iCwwS%FWhaNZC|&nc4<7Szj;XW+!&6&&X{Wt3B0`YCfV|EJLFg zCB}L$GLyo+qB}K1#64CQ%FVI*??uUK2r*Y8aYaBHDDa}`d`k|TuVQ6PRAwPcr#1u+pfqbe* zeh;w=fYRB6(+#nPbPcrd-(LuSZ_urVOOP|s=_PdPr~ft(C-%smAtSQ{`{YMPs2&HA zB5@#<^scJ#e+FD%P@;32S2zEQQPK-)v6P-zr`7JQpsflA|08}DiA=jQBQkRofq^#-&-%m!SWEgG-&H%Q zGz|g?yv7YdHZ!&5x6U+ZP%vo*th>+`s!0cbNd6J5vgntFDm)RW!Z9{I{3E9V0Z1?H zhV=;f=@^BsB7N_dQC`$aEoUQ6`zYl{N?fh>L}kzif9AFWw?qrELuX;*koN35`lyP} z(<4_AmG#@y9*A?wr**SpQCEY+3kFjvM&Wpo4_zj*(B&duTjt>!YKqK|iENb{ZrD`ABD_al zsm%9~kJeh~&lkfUVb>7hvgD|3c@;`V7KeyWSi6>{LCAI|?3(b)J`?|@GqDYJhl)*1 zHt5^4Aul&}I5KQ*Atd7YrIupYe$)4xq7L-Yyy^uzKi3ih(Nzp7N>?)XKeL5JQL z7+hu1?Y;)+Rfcx7h;NeG9#@U-w6eO^do6)spg0*^v;Ft_Uxq|MUv~&|BuZTg54&lb z;IpB}FYG(q$HDWExAJA+PTQ*T(*6P2qNj>AbOR~-=wKX!{q5nSgBAvRbkz!OaRmA? zmC%!^(liDMr`q7^23{Sj-FEMX_fpCiBRBU73|heOPal!DMt&QB-LVMUWef4KFO6LE zI_Ly`ZX8x>6a3WYTd9YZN0v}*gc&T(bb3R5@ljZvLLY$Uy&}Eqao9=1<^Z|g4%`6P z|JP&uxPywvkFkue&H_gCoNn0v!z)Hkakl@NWV-+QBPuV92~+%1noD{R;dX>`jR z*q-X!P##M@5X7MqVqpzknCH7?4rT7~u7d^(wt&luw;U7W|T6^mDK=Ld- z;TQJuhq^ub+UXdl4bW#z7#w@g*{;RTNiWSFSq0AnOzH=^#1JfsYXThn0Sv((4&?fn zSK5FmMJ3t&X{|K5<;4_Y{y89`u#FdUZ1^N zejE0Y-SUhuy&aN|j98#A*(;Amzar^@JPN(VRrQxYpZY@DfiDzK?SzA0C_dP__Q_u; zvHfnQt9708-?E@MZhtInTvgQQ`UNg?U9Y@eAzRl6g57fOs8DMMM%j?OWn?}Op^tPY zlwJu-)`U`eqB~&<7T#mKj;vU>z?PL(9-;2td+4bKPcN3gd$)j+{%MrZtt0Xqqby6e z2iR!-=?e)5g0LC*J^2Gw_j7xI+#s$lgA%}u39V;AF7ErVZ8r8*~b<{?PJHRDkq{hOb2F7 zw~GHaR;uMdMWj+qMycps-X*1404>`d`4yB(r_jo+T5`f7H3gJ-l~N|^*Eski)__wb zhBp6EDW%v0i}`MO%4o0Lh0|49@y{)*f`xpXYaenj0x6(%{SK@~5qTeMy3a zj9xl3yd#ZlOnZUV0`KrZXAyA5VS;=p4jf8+$UJ;G(TX*N8i2bF4~N5-Gs2&X?Q_S{ zdSM*#!;T{kGpWv?QKfnC6`+yPc_f_^z`C{Z^8&)$A^n7EWE7w#@FiRS{Xe6DPqoQ!q7?!6#v#ToAUSHx((O#qPmhhoxBW z>jmDQhLf9g)&Nw*tXPz5R%mMPTg_v&^7 zu@z+;80AD@PGQ~Ylm9V_UIC4C7s{$T82^?rB#PK0G>pCfE5;`9?$N6T+Jpo2MMo7M zM({u75W-@D-;Vv^Xnz+swO5`5{aWH4#xQ@O$*lHRG1v=a7Ipl?-k;_A%TroJ$-?1$ z8EE9>r@nGE_4@h4HW4@w*3F-`?ev5(8E8(4oR)b{F?U8F> zpH6zYz48~>WeNCNUyW{4_XvcY-zP5|6_^RDOhlFj-8{wywaGe?p1i8X5ss*^VLl%y{rrLPN?)gh|=qo36-E5_W!*=VjbJ_ z32Zzl*Qu1>h*GANQj~}?&_T*8y*=`a*yD7|$B^=2H6@s&V!!Gqop2|)M_M1T40DpN zDF4C}blV#-yMv-*Z8y;U8Le%#tZuh*i^ae0V`EY~v&Ed^4(TPJ^X=na*{u|aF;A9c zB!w>iip6taFwYX3&37={sunZhZ@#hzF+Xn7ON)nil<8h|2D^p%;g>~2klU6)b6Np2 z1;q3MJX8J)fwBmVw^}xH!YSCK>R1Rqg7zm@%zy+uHwU^pc(&)nw{iP*6)P&>eF7ok zYs?4HM+ou?_cYk*1CEnhh#V8=`xeLUl)ce~gWHoaROkNRf1jsi7_ z%gOF|TDhgQU0Dpxw{>m85=PHPUW<7^yuNuf2Q$2>Mly5&mjsELDp!f(l47);6)gUPuC!Ew3S z!5O)HFgG_YxIEOlj@h=fVI{)-$L;w}LXp2$xm6AKso|Whv_lJDtt<)+$&Hh zon}Z*8S#|FRMa@HKzbl^*=C&1x8{Jd=>p|x!I%5(%xud#c@+0a7@t|7))!_6yVuda zW=M_!-oudmui;x%N(pV~DVA=vy#!FB7|O6Nq~&^69dluD8xeU`SmP#0-s5-093Xkj zB+Mjl57S8sleYRDm>K>Hd&>Nh%DaI_Tkz6J6+f(o9_&|x(Vb%QLIM4$AhyyhyycCRX)M!Y)b=a)77f!0s z^7&SZwMK27`@k>u$p3|TX*Mtd!8cYmz@9=0x#kVmjfFd#EA171FSPk>F%ffXjr$(x4B$9cCr3;BQeQ$o4v1`iCG#eIG9%3(;T zGT#N_M~}Q;oeyRzz3@`5;X{tc8X)W!TxsBijEZKFPv{qd6w`7MStJ8F{x`7ry0B9q zK2o4HRNRox4OR6o%@{+V_okat3p21|gjHG&5EDe;ZvFCjWaJ5|ud6`HQ*- zUg>wO<996mwYNRK@@6rPwV&Ekn-&aU%P!R zkMI)_8{>nzh6cz*DE|B5B4Ga!oz0+AI$EcR8JaVk?Sj#aW*e)&ntYd5!figlG zL^78yxfrDs)=?=Rju3J%N?A)KToO6zEI#?N)76oUS#?krK$B#nU4#%g^P2Yia3(Yl zZxmU^x61@jNfq7^z_``?@X!v!S!P6k*XB@6sjz9Jx__fH%00n|9(Z2f`je zJt^!rVcH{g$y>sFZaPXwvL{}u2Yy`wb`)kvi;Ar4GEApPgERtLuN`S`IJu5B8Ry$= z6I>bGEVWj3!XeihO1Dj&S6)IsHET2kLJKHB-fK18P3ad$ARR_-h2YxMlK~Z9X`5Qg z9F($F*#jt#DxlG;Wh8VcURp{Rd#d#6+hv^g17##i_V5np z@AAJ+q%!CrParzaqs(1E_s3d^S$YrFS!+9$HJ@5W%_$8znUIr!x&X`0c?6g&*cpPx zSJ>YYjoVckA4h3CRmyTN3-WD(G#4}?kT`w=%xVMtwb0WP*wkfX#0ye3N}VimAwX*9qhdia_FKr!7njLbp$Ch+Zj6OpXcaeV^x^s)YmMrd z-aU%BtKc0G+aUuH(J~K*^@r$p+30cFCGMkL zoN@1QoVL<#kb^gI>L(wsbEL=OX*`RAG^0ztYP6_u+UdAD^0@-cN%bq&I45>!ERn&R(75H}O zf|RYo=x(Pks>oZQoAsk$m;3?Jv(1&p<={{J(7QF=Pn13xF+}%m39hBBluskP=mAO9 zouOJO&IQ7?Y40@AP%DTrKp^ds10x1Vc6;TN2+N&yN|TNijT)E@=z3l9?h#$BaUG3} zgCknY%!5U`7VB4#eF*9ocoQw3%;()~WaX00$c7)Bsu6Oo5!ACqdLQ2&IbU5r8)t<2pIB`VfHemSCc<_&6w6L9! z*F(Bo`l@qr2aTX(>Tfe^bQW|hF4W_TXu2b>I$6i`D1J%NNMRc3yq)V{v*(=Rrcgc; zkq?dD<&a}iF4IQ%SraL2+SKQwB_50efOH)}=*on3(c!;UfEMKMkQdy8tR zA0{2F)Rvfm7~>ytvUX#|Z~F70BZOS8p}zjj&}*<0(X=719W{o4@u$uKrhd-USonDd z7yV5%4R5id4(v}A`21qEkhNrT{(O~RIyuCF2c}bBta^ud>6>AazI4lnan5QP^FhO= zpCT_I1~yq8)4xGkjleALl3yRv#`H4C(zG$%Oj!784+sv^{HKj+%m(V1HZywHEkCSc z#rclzR-P&qT$eQq(!Y?7{DYm7JHe|E0_!>WIu@d|K^x~ z<*G(ETJ92bVxBL*k%N$ekFRk1C{i!c4gJ~!>D%-!`D>gb&r$owF|4}Oi@zC+ z3kc{NY%h)BHiS}sz0eT&TJFVeQAL2NCaV95w2t**ctz#*1(dxO%TOgek%0fl$%q!~ zlwzu-m~Ub?UZUpW9m3Z|X^ah=^h$&*8PRX+fWW$WkFrP1H*pfj5lX-c$Q9C>YXkiB zq)<#iHyx-cSYc~fWuXbXG}Rj(ENb}a@SHlG0Vx=>MBh%q%0%@nY!kh|1K)5QQqA9iXV6Lqc{US*gisTQFFY;e z_9j67;})1Fe_a4b2vj3SdgTN+5IWjaRB-Z;W>@Q&%qZ@aYFxMXlbVtmODg%FONLiA zYLf(<`fqiBPwv~veZ1b0-bDz#K*QstH*xOJ1$ht?wePB}7o?|nH?$IL=qEn~TBGPm zZ_9u#O$cX)4(Z`aF1q5!xiVU5C-??-K3Gv5)@DL_p9g+;8f2caV%%4bNtrk!y;D6S zUCG^X;eRUkXLbiSncK|9aa-~9fBT=sLLNO@$6#9&yz(n5-DiWp^i+{;+aU|qkb)s9 zjZcZ$r?2JKSfGEP$hCtUaQSPT4#`?+!ndER#`%dF=iN1W)ZVKY;H89@Y6t1w4No6q z^&^gkC>Ck;14l#k`xrBb?rEx_8M{tuzhZ^Xs(XQ<--A3Oas*>4A|D$3TZq~)BDW5G z5ej)w*=*R3`wKh<=y7z(R@#HAoW?RmTWP06OR{K?PS$p)oJD%=VrZPd>&KZIW(DFs zG9amM9XRGMDik_Yown-5g{yTDM2{UPrTs-uXx0Zeu+dy7#GsW0iqT$g>5dC_+(AbTCny9Uh#HwE{h_9uSVf#cce8zN4`I4}BMf*jCI(Jx4*aVNlO*3@Wk(>zvJ% z7wnYNQ8w3ImMm76iN1PxG$ZOqY9-ES|5{2Or8I9+X(g5Lu+|9;f#d_*Q0u=A5=TK_ z^m>K#Y?#!f0F`S3%U0TY;I(^av*pLp}1*3%@mg4_`IJn`#J$ z_t)gxcV}bVf%t<7&nE&~+0jZ^HJJGl2vztZlJFMQH-dVO#1dQ^z~elHR_Y|1ZG0~o zYqH+;s?!bG-j(pu#N|%tKzXlWb+jVM@L9`U;3+uNsv$gw_F#CkIwI5-xdnthAKqwv z)p@3aWM=isGZyvxgR_gsrC6)N@=%2MMNT@Z-n)TPH4`g|M*qg|(67MWuv30WO+80V z-4P)Kzq7JkzrCb#zO)NV1!q-=klM`GQc0H}6A%(Ff z{lbs$ueQQ$$RUa#PwNENX$LAYe5Uuu@djWe%kod5J+`rpo>qnnGia|Y%U$s0K;JXp zJqK%Mj6E#JVfE+){y(*;3Dm&*qjf%qSHUq}Opo_*;Ay$%eR%T`+TFMQAF=^^CE_e( z@IrpjhMx$?py6=^yhW#cZuIxyEgX<{{aTf>bwWZwt?(P{lf&|I?8maz{a9Gu8rFEX zPMP-q#JhFELm=^PVR-|*@DXw)X7mpGIPkn%6b<>A z+OH;h;(HYBRe`V3DL;$zZK~g=qb%UaXn?Oe@JG48Q~^hCfenvV`@C>zpi{0Sc?5PH z+FL5uE_jjv2jM&JWYP|QJt49q^bxgYkA%g5_H|z*ZhZC(NaU#GiKyRH@TQ$IERSeM zsJ73VQR0rnGDF*G@ygMjTKY=V(2VuA9$0PEL-N#>7d}eWI?lMH?Y_cZmiXRIdB%md zyC&LppGWtyVflKrokn?Olrps)^*`GCkI{|5pOiN9(y1uXV*u^#zu)%Sd-JT%fRAHSg204|tOtHwb$USjYWt*4NC>*o z7sk8`cFTt%LNV|(Jj-#S+AZ%#d|;p99G85bYG<|<=#a)eZ{8pKoUj)sS-W+6`MumT z*%+lAqjYLIrvH$N{HoOaUPOMi%2V)06oZo%KlphO8faLzRH=3X_>oSz9_6?zLMImz zX^}!dU<%T&R?}Ci>G!xP-s2+%Y1GJalUj---bnHz4w9sIU_(zeTZfo_$TKMB&mbcS z%jd#4i342;ba!Gu0FAn6>n3QUICly1nS~bUl$SsrGKw=(@^scI--`5|@&ZsSg15;| zdD(~oBU-19=toBUZ_y}TH{!}5%}9uQAps#8GeCpJHD8zS=IdZFhLJrA65 zOqFUXsLnx)xxg#Zy$hbII^_(t#Lr=7q&e@V!EX6w7)L8=i zuv%6B6`t%m;dP2q%|xn}Fzq46+Ht&#x;HM=D)zoT`8O?tKC5<3Ga527Sq5%z<5UwmRp&HQX&fqL$zyjhUda zMWyi^_S+Hp56X7u#FJyAyl~_gMmhXoVU*8;o^E{fv|0#N!tw?(WoZmNHN4uY2F4U2x-Sf-w3@+~Z z((A4l>U!34KZRrf^WKA&MBLx~De*eCp`NvNXvx(S;row3gNfuauz@`l1HI)V#FK4r zG#>yG^Yig9=$-{P7Drqe{|xsu+Z&O0LJu4APCBoIC$h^`?VT?9tzliAc3LT*&3`+j zXF8Pe^q`@fO<7 z)Y;eebilmW=9=a~okvyAra{`rG>(dH8@{A9Jk4!twz;5b3tTo@C)9C;wATfoyNCHK zA|JyEQ@8w3)O!JO17!Jdug8vj_d=GiZ7ojM{2IS;5SsA`wi0+Qxht3foQ_GbEEjFI zV3uuNFvqqUTB4ouW~Ax%fG65_;;x0@|612}yImpDadoSj>qnedV=dq%Q>6BF@;LGd zv{2}@mn7S=JP5D5^ouCnjD7t-JZl1O4|p&sJ)GAps!x$oOMt7(^iCVYlv=7 zzK6>eFX+5aKxugC@-QDFo#krmfQjY|s*%dKUlUD7+V?x10<`Qpj>bDuEeH5M77Ko0*Z|B@T`l+Q0#_3DCktJMItCtd6~5*& zNbQo*Q~sz>Z(fd8x)W&aEVJM)p|0{SV~J1~J z!yaM(u5|rwJ$wcU`@T?E>-`J%44)k^JhwbmxBr0!PYsWp-Jkk#)5#{|bNRh|CVwI9 zWRr!F=ul@md+d~N9EQJJ*o_k3 z*(v7@Ln=Fap)0+G!`pn<_~+osdi8wq#GH{Dx(~M*Kz8KhY&^}`hwSyEM zHh}kJ(uWbPKIi3A;lebkl?Amr5>)*L?W8sx^D<9%U4O;A{_No0&|E(c^i){k2Iu3; zlSa@uaDV6J<>4YAc4@jS5&1f3fSi|$z=J&=b*NOz{wXlefrIE zQ(Ink7GXs=Bj15Nw;!t;-*A2K40h!ssLLFcS}9KGcX)N6_2cj}(6CecsRE-N(iZf(bCY+J432UvuOXI-% zb;Yy`C(UZOKDTB0HNQaU3KV=s7V ziG&L!3V};~Pg$tWE4%JNRa#Hf?yN8$4kzKhlcmFpS{uwrjx#Fd_rKNz*K)RsGYW7*;$ ze^`f;%!VT9U)!wELI+xQkgEeeHS|bGi-wafQy@PNkv4kBD7Ld%t6EsD^%UjrfR9Dp z3(E?Pr@6WuS92OK{W-jqEi05e_ya2oGZ4BujaKPDhS#u_2#xYfQ{IH8P$JI9NMp#@ zkp=!trBwHaG&OCVkhZe$U(whWoM6SFX4?KARy6V=XrwTB?Am6zt{FSi^2wEEou-yZH z4qdx5n5UqRybjt*buMZ-AHE;;5`0Giys`nFCeO&?D6I~%dTcY(^iSm_qGNygIl z!+m<@w7!BFX@PaTBnal9_ub459#MRd;l$Mtu-=gvIq{Ah^x6Ih{8Q7GLwaT0e^%?6i`D%#PW3B_w+l4W! zrNrolC7<7wRQH8aTKkxbkkzoWFymw{oP5CYylA|vT@Q(LkGx)$|C3Kh(gK2o4c3hD z7V!PCj`Tmf3atyzN#(kbv6-8$Z|0`P^#2&V9Qd{R8LrFGa_pJ;uG`RmI%RKI&o0C4 z)-^nCAJ(}nS>801sB&=m;N}YMsy8lfi7SpT7NC_SpcVf<+y&h!aHDFi8CwN?{k_iu z>-oh574LaYYrN?Lgnj)^yy-(+_M<82*;QU)&qNp6UexVzdig!hN4Y(0H~3FGzJWN# ze|l5J)QJ3Z>{aYIJ?@ep4)fAh_eV#}xoqa&vF_8j+=Wsv#tf~=IcTo0Zlts~BP}GeGevd2KZz6P*PJI{ z!`>xdug>Q`hV(&1Je=;=a+s0kgYuj3c78^7V^@h40(nWro7xblLSJh2I)KIR^jL7Fhx0w`kL}0TTVDps1ore& z1milj#S9CTFJ88)??XrE8QQIC}5Gs>WoTT-Fxh>rN40_ZDN; zRP*o!c;pcq)a~Pu3(Yq?=>I3Ag6HM%kdOu+vl+VDbL|Y{2)lDg2G7fUlzu|`m1)qp zQl&$J>z3k`OPOaobibMH+8`6Vc#g;D`dIZ!bt8}>P0(N>|5lLoXRz9@QL1iu zIq8CjP-gqIjaEa=FEP*AJ>XWvch@}%X*@sx)*QrS+W-9Z$k=8yLE1slH+x8m$IB-H6ce4QiB*d)~Pc*;*pY~s(=uV#I^*rsp%TXn&vZ|d*k zgQifzejwBAPuOQkGc<9qFca{Lo_RcPnlN|5ie3&q!hxB#MoAoctpCIW;%pu1*{O*` zy9R0})I+N&D|IXuClx{iAgG9t)t`Zsi)!&adJWCcjCIP=TdLh2#`ltu&#>D+1DO?i zeYw4v;%^-6lIKB-#D1LZ+pXAu$}#TL8Tm)p^{aMl#+Y`Bb(c2&5qGj0mu7?8AeY_l zrMD}=A9l)Fzqqu=@~o;>?LcxQ#y^eh-pwyj}!e!$1)LPyBdR@{FEvh zw-a`?%oc1TO)Q$-H2;gSnB_IAt%c5fXDU|ClY|wj;;PnR-nc$^UVa&RA0|o1I9oh? z?pWG@Xbm6qv|lN)?wSzY?-&gsgh4x@$jae~`OeD+6q6Lk3Bd4-%O;=o@knXFzGj8> z!p?@%A+EM}n(ZG*^ZHk0I8qM-v$ESyauUK-`VbdAGd2fn6PsEPSd&3Bu50kTyiqAk zBl{?A&Lv(O8ZgtAWK=fRx~99xKQiRkQatcW&&zIQ2QY+KqA}PAojwXbs|ac9Grn&7 zYC_ci-~uM)HxoVtX%@x1VgpP}br%K_OV($^V7?(~o{+|J&trXv?qQ@akBxJgq2X^_ zG{KWvq&@4^XXvXgCNChC0F0#?Np?JKD$J|`%jfeGy5@?U^R)g!% zYtSordp`9VOVavJap&#mG4@tG!G01a%_ck<7&}zz?Ut_}Vzw2Kj9FXAx^Q8Tmvn@RuZ(#pQ7843&;x>flsj^Js`0~^p zk=F01k5#D%5SL^3-X-4wEL+%~L4#==Wr_%G13zNCo$9sA4g;zN;n-Gp|vzCDreL3BF*70dFIfS7}M}TNM8}Zt&lJi)(Jgl z4CSitVxsR7)OTb3pi52|nhLKPwC0?|N=PY2F>eqDFsUTQvkQJnrK1y<3a&Yxsh${5 zC3qG1e#AOi0<92ONvDZ!?bJnz_AK<#K+>{#p7j|eph>+7)~)DQcF@#Lq_JjCW77qA zRkQlJTvNxN(HHX4sO*18+X%aY^BtPc9_m}P@1ZiiHTXF8wttuZf?ch@ywX5tE21RA zb`O}&H6mbjiQ!@jLa}ifn5{zUH$Tn~qVd!EHz#5uPO6?ds z@K%O<1bWGTfQ=^Y`EP{ffEl{f)N}Hkq%re*oGkHDox-FlR%H`_^9vha$RkqNACZQ* zl&RlKLq3Rj=@EsUtAssr> z!p~F+(3S%QqZW>te{yu*KO=vGUOjeJL;L$p;BSYOZ{)1-bxZXwJN7ME{%>$jWW+Nh zCYvfB|9C>>HX5Nn3YK7WM4+u#1rKHPqzqLfR;@A<=yf`d1J*I0ZD@(@>)23Y0S_6v z&E zDxb(iDJ!>w--kUst<=O5X=8;=g=Vgj(tH`luyAjI+8g(%5)A>8oWH~B6uSD*VWE+8 zF~yxoVY(#6CN+gYO|cCrilQmLolgN$#axo=Cu%B_n#zk*Goz`rIiPf567aiCgxP*{ z=^`GO#1k-1Pd3#REiB<0V>~8@h8I(*%}MNrplh*+uV}XX0vcM_^;iPVD?6|wvOJ;w zjjqILh`KQd z(NZ%(v}maf7Hv>!V{2d0+L|D?>~AKLbI!)w>N;c3$1B6(DSODzLBJue5$v%wdwe8 zG-odLD;TL5*nq)&1*0u0MwkW6#JwdtF=x2dw#DewTjWq*Xz zzH~V{XnNQm(P`gQqx9Jw@pjDMi<|#ZoWLei!{+@G9+)_$iCGrlVF5OW7jFz3vNlGB zVlqAJ-7#?4+W1b1Wy8C`X7Pq6faMb#7DwLQV2M2O{l)jc`+dv(gbQK)?_pUBEQ^|7 z9l$bM!}67qyb)Nw1T2jsuuKP*2P*Qi7O#DGEm4lEC&~@dt-SGPB~NU?4F~-#?x*q( z6&$i#kgNYKB|{1&9~;1Nx`yK;7vU%Z$BmW2h-n0#d0FpOq-Z!^T)O3r6-3c;g`&s< zC|VARmj8Q{T#NFyVaJ8a99m4kL3--|rk4Rz+C8|b$+e4W;zB z96f5Nn)cB8sqVd=%?Ah961~S0sjjy}2SNa{`L_Y{Z#U1r=5!?oNftWq{AN$3dPdpby{r*JyppTMyWbBKDp&3Mz^RP`RLLm%OIJ-VbLeo3Fdp{dwY+Eg4a z#kzSt=aG;~cooZhqnL|e4Z>(fWW;HH2ku$W-o%yFyOww!47knM8=a@{81rl*3xa9& zEq0pexyjt`iVG?;vJ9Yw7xxH-Ud|In%>hp3v3uX-JE?_I0%udXr|N|= z78BWZ4KJ(`y)Ou#tjfG2t;yg)IUr_ipHVY)NdGI*0PfhcBIns82N+k+D{#G`nrr7( zc0lR^=hZcrKB&*hY$oV>K;N~wZq3GE%Axs{pR6H_7WCF{eql{g`U|+_{>hqvQ(6_< z=WI-*L7_J8qHtNgmrIn^A4R66Wky;?K#cA4hSpwNj`V(n^rp9TZl<&h@S&7!hbpv` z+Ipll9h*IO086A&hr4NY!_uN~YFh92Fi)Lw>t5%zwS2NB>z>%=ips4)T?lLSV7`+^ zWR!8BD;|Br;9ZMS9?ZRp5&hR^8gQ4r4(%z=Q&&w`e}fqymlrZia)!Po?sF}RieC`) zm78Rr#~aGa>WcrS$D~pD>S9hQqYUH?_wSK2NZqBpReB=C_3D@BgD#iBN5z4t659v9 zjBDptb|Pk1d|Y?wni5y(Dr1fprT9+cHk6dko7zHUMddmD+KS3umBc&U74PjD8rInu zeozf#@Nz9Wk5ob7Y23iM1$vSH?mgWwQN!|vK4c8k6XMo=xE8mJ6N_A`dn({ zT;`?uO7?*YZB#;?K;3E4W$TL*Zs7J|)HZIsK3K3U;PZIiM*BFRd|y8(Ws-|s(Q}oi z=~OKNE>`e{uJYinCxYn>t|mw=oZEE@b8~1IVeH^8k`e=LG>74S)%IY#B}3x>WBg%V zhe4O$#%1Eohs?vP#${wSeKYXO4lZ|Ao8Ibz^q4cv2Y0ay{xXWU-0f}J+NQV5A2^}i zCg6?~iLY~z$;EkeXpfQCjUi))ogLs$vS=t8`c?3Lub<#P4f)B3OB+&z8Nx3* zc>OPfmP4xrOBhnRV_#wg+uTB_5tqsBlas^arraxhH=Hb_hi5^X2g{k-v{+y>lBVL$ zQkcRSJ9rk^SBo{SIaIZ2uv`lgWF@XKKLVT*9Rb4PH>;a>&~Ez^W&otCgQWR?~S=?&9_ zDU+WK+77P_FA0|l*EM7b<0t74i3X zu;8)|#;$8OT=&8`G4Prop5Jw(*+94W@7m1_-oZ^Ni(712?qU5}jQ~uE5vCVDLb=%Io5kNd!R=2Is-&D|M)Bjgsm22ZE z!XZt;;XdROnuI1zYA>)q(KIp3 zfO(RXj}l+jw#2%;&1%&j+79lsnqZ_Tt?7rsjW8Me`tUzQcnX)+v^_}isQ;n$PFRSZ zQKY1o_jwv=mAk#4^WJron{7Xa+E$*F{-dDfFhW9N`Om+coBZ=H zeaV}?WXT-D=LcU3mI|h$_nmQH7nq#i#+HS{`BK1ryTD}?PF{H?13E3QU|2Qf-yXig zt3O;CW*$!%H9BiTM~2;SG)tI9E>}QhbZ|WS-|50r`OyxK{!qcs0)=gd?w>B)Df}s5 z>eio`SuibpyD+Vr#li^87lgyRI@nVE2PrL{%Bb1$zDEc^E~rQFHilsfE3(*01N7#g zDhK{NMm=gt^o#XtX4TnHASKYY-&4X&hgd94WkY~s2U1NydDptRf6xh&8TC=Ns|fwuf*naG(JJPgZ>)K@HOZ^^t;B0P>+ zDD8um-=mkceH3id1;<(cgkDnLZ93l`2)3Dw_XKP6OFI~sBCYH;o$CzT7`VOL)Vs0G zsyh?7C2&u$Ccm^@&!wIfGmI^(+$)W`=6jU>Df6tDTEIWh!3rqFeDqGFxsBS*ghSKN zZ=e@4B{wfcyV(mj!w1%sJKdMh`NK!;r^NK_`RFA~I5W*Wd5TwBnU}Ppa37tDy-xjV zqK_TkzkVw1&EJ1!Jona_@p^(m{jA~8DtCaD#m#tl7Z&g;RW^ot(T1OEeh zzm%^#w9Y-uzfa%ehQCeo*B^rBCL4u#91v=*TW1WlJvnDM9PuJJ*S48#!^4c4R$SjR z32B+HIIQ4uR|hj&n^>?Y#+mOt^Zunv+uZZ^@M-Az$9=TV3~C0KwcD0aU!QtT%uxIK z*uEvPs?z+Jl#hM&ef!M!@PRhlvV72A>qAWz>O)OBCIz@|)0s~K&VpTm2?aLk@>%0Q zM4iI87BJq!dr)U46l8Xr&~K)o-&9glMiwg<1NZA~7*}HZ{?_=Eb4C6@uYbO2a&jK} zd=vHgCbiEuWuf-?o8}k%SHRV9a`Gzo{8LrId8mOj8XKCZZofD=IhRJ`xlIhU`~@22 zO-LWH<`vWha;K!9dL@|NL}S;h!ErQhnUrzM)I{Tl*%vCstUVtiTx=iek(F=SUqBe5 z-A$Z`+Em*#5j``H|M~W8_!%YowlCQ2ow8J4uYBeQV#)NSt$e$aiZC{BU3HgO-m@ zQQCAXzzf-CaGhD=Vl%p1l>I;8z@}G&Q;1IN*(^(QE4VbpvbrEvx6{?VN#;GPohkXi z0Z?6EhjEJY*qU)huf*XI$F0QS5CBn8r(jQujt}mYmNV{ zn>Zs{DgtSJ`D?)nsx zSZEhRy-!R$WOi@?yF!`QGVuQ|!#*9!;(DXcFZe`beWehg6TCKvi; z8`_dsMl%B+*;&ZTnAJf0{T}6hl!+04k)ccX(%HD9m*(=s5BC^ZOg(`4oR?uT6zFOnK?&{Ts z#i@bnl_XX1)3|e=19|E>-rrAUN3`2qe`A}C|Q znwsWk@kfWGUZtf@Y2V+)1C9kcWS)!?2f-!H0YLZ`_yAO_%RsvX*5C#ptZU4xi2^q& zSQle9`7p5NAcE|@cK4VpK|9FoonTP5Zt#d*8J?WG}k0wd3AJY0ijW^;fUu%=!tggrWEScN=ozQ0J zH)5B(6q*}i66E*p?2EtJWo|TwJPj7?Rd}FT#UNb~N|roxxfXWm6=;hskSG6_MIRKN z!u{S)n~jZEgwh&_e~<2gD7%qA>`-{2a4M-md<;^5&CO@yyKx3@Yj_3Hwk&fyv=dB7 zg>2T%Fttoyyj*Y;P5UOxqSJAlgOy*1--w%Qqvh6dR(epsm&ZDVtSz4<7_;l@Sr{l=}JB) zS5u|r8fSvuv(4(g&wPbLnZ|`Q2klQ%|B!_-<_zRBlRXV~^aPnYR@}54GBzza_M`UB z5B1l}nbDPnS&&>f%;tMG_{Aa8@KoZWQHAsJ$1K8fmnA%NnhqLvSXPo?iO`(cffazI zWvXzGYifA*C0sV^3974EP}=Du@q*9#3Pp)&W=*ol}bSgxg17E}_XgS+gVF5``I zW*B$A&V9KndG-g#oC0=GA~Y8z*@&3yGYejDoU+q;@UUEpJ*&sCDhS${_)INhpPVzY zcb~nA6E;G(W-(@@LF~dTg6^eYI4Eod=Ur+jKO89v3i)A9ctkj;geky^5@DtlgbRf2 z2s0UBHY<8JxMCW2B1KWiiB;PIyX4k}Pvf^Kl3j4W4QH|>^X1n);KYWEcIt2Qm*IxJem1Y%Q!Kjs4?%r%=yvMWp!a0wiTK@U6?3}P^Y)Sa=%27VT}*O;?i7IidMP{GtBnlzQBRHlenCiZkUCaRYL) z(0LhlDqG`sLQ2w!xE0v{txM$t7#aVTA@TpD#6O9Xe(Fj5&Q_9Vj`&~neTufO#&^8_ zDf;f#_yZSO<5uuxej5J;ViC{7r{L*njo%A*rno<&xYOL`vpB8tIRTQTXIdJGHWuiO za8MzpZ&6M_Bq)T^E zPtcuv^o;-e^lnwsa|}suGt&D4+?$l%I3+!dP>^A+N=zWlZ*zhU>Iu)q4~CO ziiGo557hzR?s@R>D?V?*$0nsW`u5%z<5;AKZ?IJA#H7mNq58y?Sm;WI{mdo2z&B9s zF%?JoD0G+`OAhh}SyDO|rZ#sL^EPvb&ch)6ht>z`euDncsJjV<0&O?piaE=aodj(K zKaN)LDIeXAoznKeV{LllILJLOjB&=O^E#~Ft%t@Btl!V%-x7E&K&y9J)0z*LU=P&C zZfm>3=v88H*hLJ|%3ax4R9Eha9SwgI^%O}dN!SaawY=kyx{jwcyb){o-xSa){`HS^ z(r*d~I`y;4i(P0)6KrM@)=em1-1lG2yfWq$+Kin>!b@IhIH|0sPQ<&wiynHCT8Ht1 z&rI_K-TN%IQpP$X_83OFlhDMX@xHm9S7dfW-uPQdMBpYTY1U<1jJPYJy# zu$RW&T~kE-g`2=@pzya6xXDGQDc~4TV`hfl5>}L9EQf1?XCN`l zVV8V?{L=mZ6LGr#&$1ZSAO`mMcfGVGiRHU#cC>&rK&kGx1=2$p(@#Kd*va_STK)&2 zodqU$w8D_oxak~aBA$duKcRk=u)Zh^x=W%(}HAmzvY-4?I z{OWG@(r57>gLj|w7MMI-Xd}3|9igb>fV_jf&>rP}(H>P6{JC$`0arEgly9r^oKz_as>9*nygTkk&+z0udJo{toXqLON)`rK?Gqp!Lswy!e5(5yHC7g4 zW${11+l9HRmCc2A%$a+e^gFiU{w8n;yjbXL+KV~-q~;Z_Dz_45Ch(YRLO9?tmv4W| zG)Xo^6XDuhUc`M&ZW^FYyHA11&)wT(eEu2SrcQ)OZLU&$kQV&d^AqJO2mCtJ_?II7 zrN$1<`jMQCS=rtW-u}m?KjOb`NA^R&E4-U%Gt1R%MHrTC!=4ync@x4wN9vKm@O=Aw z2DfYosNqkw>;|Ql#yBh2OnFhE6WqN`fLy7D!k(^35Lq@sGaMoRJxy*oNrMtgK(Q%M zY=%(M^MGbyvrsy7_BP?}YhAj`zXCk#kAi-5w{a5mrmmx0BNXTd36A_M&~Fake!wzO zw$vrUwYMB4`eh^k*_hjVZw2iZRDKsw*c?YQc>3W6x_MQ)`NFDCXUlgfmItvs`E5Zi zzwHscf5vM~&2PIF@21r2+M*6!bISG-SISlc__G6;ZC%oA*j|m(+T${_G|M|2&GI%6 z_Z-(_%=)eD^fb%0c(*XFN00Ax&px<4;arZHgA4X_a7+`|o7>R~y)q`Wk6U^nJGqwk z8ETR`_#_={x*8+?8*vkh_vvda_;0DR( zn+?f_1>eN&&9r=gj~3r*K1|4mO{R8!zK0+#TT~+l>ThfNOXSk`L!qShx7oMpzX9i$ zM&%~mTnkEj588m~C{kzs8%b6{fBc;b(7p*Bg=!eII@Ab$Zsm6fL;f3l?&jceoN@gy z;(h-Hzr0rr-#a%6CS$AWy3`-507+tO7<+f*v&hNn{O01 z|3z-gp;@E8C9+rDC#JqY2M+ALxtQ5>&boo0UboV7N8McqzHMM?mD>Xnrt1}rgZ|F<7&QDHmspg zA1Xd+&EJ)0;ad&ydxS`CJ}UDHoR8&fnEGZe`#qTj?s3_Wjuq)q@3{x%`F4x3{ZSKZ ze~cw}7?NM=$V;kn|GtIIdZk6*>Ai_%PYBsNg=99(AQ@&sW5zTlnWtf09{M=+oO1_o zeKKfh`aqslL$@rFTMTn|V&pR?jh7c9)p1R{?_-4VIjdZJhnKhEbllp(Tlu-499xB& zzVqDkm6R$!tN9qMqi8>3M}L3+v_UBzoq2ateka}ExFX@qb)?RISxr6S2*FY~9^DYaeH225f=#DfV1uoGJJ$o1C zGT_wE?P*-5O1D}1;wkdw=!672A-U7-=hKSp=h+Qc3rA#DZ^4Lm6OD0f^J`q~b)ijJ zC*r-mTDl z#$93v8K*Cjy?4`lkGrddOA)rtI568 zetuhy{k-V^hs^45f27{j{;pO65tP6@r39{0O5i%g-`JzX9#R6VHVb=8R03c1>9$X9 zcr@rZ3JG^o9d44-&6F3-M0wD=?zmhFyGr|C1&v4f4g;UmVL<;8Z86}cI!PA7$*za< zsHMQz*>~x@CSTAA*3cz0CbzsP=w>9hh{9Kx4M7&DqBUHV^xqMGey@3k6=!#JtB%fW zmf}R^(>T{i_SX0{O%AMDO^_f?t6a|088?H95vOr0C=4kwhG!g^x~;cN!(H~Rf6V%3 zW%*5%f(J#=&SgeejRSTbj9tm54wf&arcEJlR&GbN6}XGQ}?u& zv&@+mPYkzV&Nb-Z$9{_aznXE=bRMqe%Br-mwzdgsk&&@Wr z*gIb=m*YR`@6R$y_Rd#e|3UxKvsF3@hjm(P0nV@>zYlu{pF?UFn-hpdA*r#U`%kDx ziGJff_!3MC`L_J~2J}75&@M8J(~S0rBIWkZRp8}^G`N29qdM3R9WW`t0ef`le`*F` zCG~P%{V^TJi&f=%$=6`-+*Te826p~4ez4yt{YRF)Gg=^S9skfIh%pAcl{=L8e>WdYCmW1++9j}lOa8o%>FFOGgFWU7_zd=wH^|Qq%Om=g&Ml=Zi!k}0zQG(8_D@534b9!NsG(}^HkGQm z+g%#O9jJej{$wS0QYr0J{HUADqMJ|s@mKq>2Np|`3D=(Z`0f+&NBUH{`B0+o74ENB zb6xo_a=rIDHP^MkFOlnFbWc28!fD|7JKw;wrz{g-EYV&|XkiJencMYC_l$ra}3vu`|Nz)0hD(n!O+ z*ESQSxVZ~kdLZ$;FV6My4Knm?tLNJNxZA~=2FrS>l7Fq%`<%>=*fp%UQI!KyTjXg_ zC4oSb7s_(5eRy7@aLoG;gs;Q>HJTyPu2)ZdDx|pg#oz9!#a%U$T|E=I85%;Z5f)&! zyN58#9pO)NP|~c_2RXc)hsECLIWE`fPsH=O=w$WNc)r}ageZg4UJp)%ai^2cgInW& zL{4fQL?y00swWBtHJ=9f>|mzo2e?jr!y8|+a#^FAw!^7J5vwTG> zb8Gx3O5A{3R}*yy9MJtyE4rf&z9y-b!wvxlZ6Lg6<7)^GyX)S)`WSpRG=OJ$iGu|ZHyE4|qAj9I-Vv=uuBK|j7S8ICCxIH*oaGi_q zl>L>pa=?R?L<5(J67U$>H|h?-)IpyC&eED#&ctR5WPQ!5FPY4BaFzh(LDr^zaK}`! z6NsPmtWG)+e^KV2y&2l4SnTIL&lI1)O=Z)w#_gnuom#*SRydizavkQWJP)}uNxyGN z_%4C(wggpmtoEOf8%g2W_IxMX%3-gA+iJ#tGwgiMW5*~osH=ozeX2HF#yBB)p)qH3 zQ)~Py=wzs_KYp5vP2{t)^;XEiuK$i~XxE>L3b6*=LwYGHG(*x!|7H0C|Plnc$@uzxiT(aJ-{6${iQ9J5d6qGB^OElrAArRCX#FSg63C$X z1e(-tE-`Mc>u~C!e{-vTD|?#9IC)u!#!1ZIGUa$l?*X(O$Qr;n>FcJNdTj|tupYAM z;QvrB*>DblzPG$b?ZGBt|hU8 z1)sqltn$LeJ=hV>-uVtN>5q2_^uass z_snDLBDc#1+}O4Ec_Q~!RFth;bBE`i`_|o2F~@TAeGhnq(sg%u*21r}q9T*wxBQM( zp7mw-R(MuE=$XFCQ?d5Gd+(^ov@E*M^B{t+FTHmy1+Q3JdjDEaspsB1)_d+Mz2}ZR z7F_ed9sj3@Nb?5a4h4$mj(b;Cc*^bt;8pjRuKzbuWz3BD^d^3ZZzCM&O{~Qd{v+KJ z-v$JrSFgQ^cnNqT{S)v^unc|w6+8~%hrS8;2^a~#k?<4liM%GvL>?302{Yk7(oE!W zEcb+e0#3qAxKq4@ooGaO6K-RfV}(z^O_*cFS59S=bK-H}lZ)WYUW)%1C*8W)M&-=@ zF`U+)pfir066F84Lf${|uqfxCh&3K@zNN%@0CB`Ms#fhsp<_-_tIp%XJFdhcY?LF67j%!;$Pr&k$+#YUr=>cm ze35-|HRK|B$ZxspmV)K(C-7~fZ?@dEtRUcir<%?;-vKN-3!DAEy;V$94fnx?poU)2V zZiexRt3^0S^);n#4o*4>+3>;fNA|EywOPAai~s0=S2KFIAzaLZa|Yn+Y^x0LZ|F>?%f*yPNS-)fD=t7|m$AFL1M8d3+;hsf`6@%FJR5!xImpw30?bFl1ayQI=*pjG{vLa z#%eAJ@sLFO88mf)leAg?G_em+A-R9)(44#~o7?`>ZI3&-t;gkC(;mMq;Iv6Y;qe;0%`E?BZY$&y2s-e^os3`7 z^D{XG_x1cubQ5CS%j0nZatON+$qLwi71!-6+I8`L!gCI^Kl zV6umRo2Ldh7Fw$T2S*t!_Hg%0Ye)_iw{vrmN5K8^@sMuMoQ=Bez&O^~ZLDd7*cDx~ zaXYuO1|g`;@4wsl>{dF{%ekfb&v)-H^Mj6Ox-#KMW%C!UY<^Bu2jebbB2~-xV9A)k+n)=P}-Z|PH>;VwD8`Xf0ldKVxbU(M!T(`*4JidibT*|aqvpgcT3LOr4K zqi_L{PGTlPj-VBAiWi@uNsHs|BqdBn|j91YtBV^ zU9aSI!H~S(D`#S4R%;*kvj1Iwl;p|X*F}9oCiVqxfJ8pEuK}%_XS9L$d@8uI*1X1IH+O-v6>X!uOT@gw-$yIsczj7u4B7=q$5Ip;v+8h` zxG|HLNDEUE`u+y2F$0~D`HVFW$y~n*(uDE>V>Mv0%zr`_*@<{EB-*Gtv}i<12|2JM z4?Y$2{FPlgg?|@U>Q4It@px^c%Egre$ue*D_`qXBcNfU7HU0$FWIlCv1MEJ(U})dO zL^iji(8;n^m(M6$-cWE;oA8_vxam;(Z=eZja=I6{)gQ;MPHTJ;>N?A8jbGMnkh~9i z8p!8Iy$pBxRp=+;jTkLduHqB%H?UXO3duyK_Q$x#*`&qG8Xmvt3CKHoIlVL;oPOOj z@}7v-?R(N$FVGDG&ci%sgx`=2eVnr(x!DH^hnsJz1{SN+Gt+%Yt+01@_*__x`N%%v zZVPOvJ%#%n|DBk}kQ^tKE3g*&k0jEAt#L|^SM;MXXubMHlfoScZC6Rq{zKf%Vxj5= zuKz+4Bq(Br*p1y(WvpSfe=bXw3Y2@%e(at>FLHwc(n+QGs%~(b&voKH=T|Kh=K;(U z)i^P%qlpeE{|lMGvI92>Ol&IfS$+{dn+EWy8^GsL&5byjcm0Nhj2f@gmvHSHxq9?qFW`+7)&7m- z29jiMHhl*;w~j*_Db?6BSO-hc|3{pSH$aY!6gPIKG=leN8S!qB49`S8V$-)F9_@EZ z@e`?xLc=pIk#DS_lULbgBRojczdzyQOZTm9*RKGgU zRk_H}|0Cr>Xn~O82Z6~>MZzU_qB!!&fk&ZRn_&I!5d2)Wq*KNofm?RV}Ix}IW`y4 zx5X1IX6KPx^gc{CZ?n>Ni)COV&E6SX}P_aJ(I1G?+F9MuT zJ#3j7BOO=IRwLXaq%rab^`8r=jieHFApW=`Khq5V#q-mRDCpI=8f1n7ex7 z)V4C#zLBvEA?ypiTy`qnd_n&V^B8LkH48&RnXYDMnJUW`oX0}D(6)LNWW7Q9Wtd>o zc|>)6qzt@yn?-iHPm0U38I-bOH_#`DWhdgczBdIv^QqM}MS5@YF(bIglW<;_>fPPs z@OV79YwrQKpl4@k5>AS6TA=tqx`xMF8YyF&PnYJD6&DDlQaq`vtZXy5toe{o`fAwN zaXIsb35!Q%Ux1tC6>#?m`KVU%L3f)J>0(PCua~gLkF|zSS7xliOpx>pZZK>$ZZ{~i zqWrZubL#L|nm^~JHA6o9UtyjQOyB|}shg&k=(x0|^4`{SPeN`X%H$cOS%8J2Ma?T;%jtPHs1@YO57zj7V+C@HOj zkcwzwI8hEZVlAZq>B0~b`s1u$U%N@rqh_uEkF693tlEub4$Pz}7tyksBC565$i`a8 z1xBjJHuAd3RdieS`{8e;zoj0DMmGxc1V-qYEix%_+lGGbD-n9 z)f75VHU%yoUk1_+r1Ldd2pdQ@6PFXXtGS${V_as^R+eesnhtJ1zSg#Na*ai@V_&s@ z9=KMw(zhL9d1rc!qt>j%;StBVbyAIEySX-HE4yT3O_BuN#h!^uEOV`Mt2j9Y{;W1C z9FPCDe|(MMC4KFi0&#;TZD+OpkQ<(~9sL+=kM^Z(=bkZ!o&+5}6S>-npyMx^CgE<` z=HM&JSTh0qSLW^Z=Xob~N1ZrTBP`O>U|O~p7r0?2!+mOvt@bg%*ei0+PN^jhHj-lh zSQlnf$t?C8(OsJXt(PJ=gC66pN`6eJXOj`-t-gQ$0Upp`T)}}O?DIL*;reNi;1hbcgE!Nr} zOrBb6sv(#^K#oir%vo4Vra@P<3eyCb(@07mbJdt?%T`m(@UBMBqSRyPacebYx=tEjU1{3>IcoCh@Z6QAT4Ci#{AVj^4aGnE*!Wtsm1p)MXkkk)=-{V= z-^+@hy?;FHFGAXS=Jsk4XUW_5i)somK15?8VjNYEwZ!NTQ|over}E8V7G3 zVn5n9jr#Z>t7~h_bd+5s3r3zo<>nUk4DziKc2CCs`4c~fgTXp1V1<}?hB=S`cKb!KOe{mpi>{OKu!mV5%ZQpK6CQHOi)M%>WiN7Mv|J~9*w60tDSu&h zXP7-4Ww}wtJ1+}w0lwL#{`7Dg) zMeV~vsvmk$FPe#t;#J}_*oQwCN1$?l5YQPOE~<~BJeZrgn4eWiRnjQoS)N!PEss)I zyJ#1=D8-CO4+5Wzi-R-51~BnV5$EH%U3^RIm-;0YuZtsOL^Gm(r0z#LRnc<5{(AU! z;J;9ch!M6P;UA19=rk66lw3)`UIb>$%xuczLXPRV_?MthL|Pcl09_Mh@t{QQ;^Oeb z%WI*OhnmeK-H*g*<%tjDJ1|CI&|j*Ip;<=Ivr1Hdh^lmcq?)5f>t*JCsDu+;Ty*ls(fPe$ z{N27cd{?gW=a1f18NI7ZyuF{z-;0V6aWTmb$o(SMHvrBYrN<`GXK{&!3HdOQeG@i1~u`6jqEOZ@_G?3HV|yUVvc4YOm1$ald`5hmCoGUJUJs~jt&GH zunfS@RpDy?39DG%XyJh^a6tA@(+QuLW>?$?zz$f3g^`e&q=r}j4+I;q=q0SNJRTl<&bfMNj2O`Va`TPdTp_^~W8t zC7wz*>Q8TmY?csU#80a~mB@FcQfK}}`Hlkr$p=5q?FIZk^H&!S*8}wv38;0_FM;kF zrAHuxPo@6HkY#@^%Mk4`eT*TWl?rb5=*8iOkCkfcAN+rD_@T9H&<^-$38TT6{8FV_ z>3}z$sZn}pT(OJP-;DN?B7RBsqlEBR{vrJ>{7|~;N$oEKBt$OFQMaD{Mgssh!p)B^ z#fA9^jbw@W3g#Q|xi}Ib2QLLf6}LeujE1L5w?yAbV{b02WDpRH*;@aIe(CC~uSV$& z{_w3J5RKBr0rLmUe4JKw?n553EDr{T4c`L@gC`kJhB#SV7^N|7z~ldH8N^o#j~uWr z21?^M=lPR=zB4`OO?`Kw^NDHY`u7K_=L;AIIQ;F(pd9>MCWdg zpa+f(!uL}>90i||@M$y!j-$eNqqzF|28tjNb(lF?x)}f%iB(A%(ZQezI#fhKhaq^X z7!QUc8%>f2b26BT5$;Gs8i<&HkCKR1h*gZ9?}_DNd6Y_LAedqq0-LPEJx6@4{~N37 z7b`oWkxxed8xelw=f9KRp>b$F;vZ5^{HRxUacGF)_R;HAf*Qla(${F^g?f^B1|qDl z(z>fL=tK1%l%>^H)GW~qdX)L3!x!o8)u_E8cL4TK%ZRdwRHELZ{*3vf@Pj>QqK6tY zIBR{f^~u|}tp9M`hYLPf@WIt`ZY9mO#tu&{fo96oyHNk~uX+~=KUz9!ZPsC zoZQ7Wu*y-A!8`&p3_bdM3WLcZBbVU;&Grms(U)6UnM;<840WZ19`d3e#gt;Q(nxdN z?p(6SxHmM~Z-a+cE^--QH=8+j5~jtXW4$n~Rvnv_p_;eCOik6ZEimnN z9XkTkXyll|qsDV-=H)PXo?}a3Qv6jg3H~Xm=xY{iAulAVG^7TFe&~k+V_Xr zxAjsjeV7z(4NQu^L;HSD`|gD~VS=8`@~Yw1!lZC7!ld+%z$7{ta#Z@eVAA*HFv)+3 zW^T~jU(vn~z$7?lweRd1>h}#WDc&ZS1ZTJA{+?#`!leAqnyH$LU{d&7weKx3$B);u z7hw|oFErCNOZ{G=nHykI{dol@#XkU((mSj9TW71`b72yF*TAH3J76X!qkJ^87bd}( zHAl_=BAE1jD@+Q%7N!S1*o!c!O=OnY`3}6_SZ(JE@Fv=c6Gu-w<^lKQ(RM5np~f;r zZmfr5kl)Cd@3FyWq~F(lhm}n;pUG$H%jnDSnfzv_o@`FNQ@@3yhhmFN(#!T8wk@tL z&Mi0sfY=AKXcOtnxx=}~8na7!5ut|uY|bgxRBNgUk3LoZ9QPy_^+(s>IBt;-k8_c8 zjdfryDM85yQZ_kFK7EXfF`0pO^G$A(3r}8eMJ#hDWU^a_JR|)^`PMPL$VFL{h4J`C zJmf}xpsHSB^kg2zMWM4EZnPCR^nn}sMG?v~A~AyVfk`$?oDVq~;W^6ZU^!zMlQ;M^ zO3<%yQZU6PulO}#7?aG>zk$(cAShSEenftiB19kBSW;>%g(IqjhXqE;*pBwwFi&@m ze4JLlEoPSVBO(xWxfs;9ZdTw9(j{RV9-eBa3Y|Ie5N=9&Q&~G%Z$|HkZ90jQ%}$#Y zKMEVgMhi^DBv|7T%?mm&@gM%TuJuN`|a1;Ew}^F@97&BfUm*ON1HCPjUOY+U#I1 z5je|0NJid7JLv03K)l$LwbD=`?uW%*k4ux+qC~vQo#Nu<8N^kJBlQXqO^NHEN=V`e&b$9@->xMX36b z2OIY5)%V&_A(a|~dTGX&)9TY6Cu++G_{dWRHk*9bh$%d@V?%NgmoJtv5}!VOpWS3b z_lypD*h4P1K6~GY`a>-v(J-t^`y2eiH?^B#KgyfZKtOPmX@;CJ_@&y01;^f~oR?c^ z3!5Z!ROx_#AR2Mh6tzWjV=|UM!^02ILZOL*U4lBAIXpboz^{LXhiAixIQT{6@tb3M zX+)a<4V@;d$z;+$#=Xt%Wb4?+>`Bg~hl^FAadKh(jGRqn0m{5E4(V>qiY>T-3 z@xOyFMU;gRsWm%Fp$$kj)#~|=f(8VhgICw z7OeErHfm@Qb65`&V=Nqwzdrm{DLr@2AAHtKp=VZluG??(k2npmOV)_f=X0X_utm*E z@1mDX5fnRyJD)9VmPWvjq9^dV{C=ko-Hn7sHZu3a!}nJ8R$=&|!FHfG9Q-8e4G%Br zC4CqX{?$X_C??I=)UedI;?Y_sQyRb0-YD3>Pl>1ceeM4QdqFiDwLPYn&8VqXW{=rrm{zL`bBmaBc+A26-~-fbKb@@({AhgtK%wIB zIOvdbV@9PYR%x!=Za-Sr;G-h+yLM113t3Wr=v!>u-QGL zeTg^-N2%hWxru5U{(mg^QVM2T%1lln4*p?&WtUPIQ3~^Lb*3_aKKsB7`V7Ng&B<{1 zl(zaCj>X{D|2DiDQ`Yu(hSUeE)nvs=>pixH^|Bq@7QIyuml3sZFx|0i!|@sX+K}7- z@Sj^B*+23b3^CkR`)|=_FixU;htvnG1}~~V0};lmpMxbd5LB^@S>MKpP><0zF$W&H z&KnMO@Cz#wJ*`aqET*gi##oPFZL3m#)cQ#Wz+?Od>5{Pd(Oxi@9^*&r4|>#TR#@qg zsBao0INP7UKmV=L+m+t}<)>@|j&h2qLO`F6X2395r5k;Rp`udA0zJql+tb`2X#C^~$s;1Oi7WBk#r~|+4T3zf+o6*LKib^YO8RO;9St7J6nsf^5>ut% zNvX~sCEY4uOnIPuTQO6nT&U0J`B2kJQ1aq@D0CS}F;C0@^a|iQlFq0slz?WaX$`uK zU=9j!m^|cRWUT}wdlcPHK#ei-zgnlrbSy|14TO5m zub%nSiC&&m6{Dsljp(b97tIGI>=Xtk?642V1srmKf%D$5c5oNQd9Q?}nm9Zh%3K1J z7{Sqg1Wg)QcNI5@V2!kmfQNQm6;;BaHdTpQ>WDY|m*BpL_#&)ariZvTF6KN+Af@CI zyo!V0L*NZM!Zzrxwur(1tzxU#uk@XRVaOJt{w`V}u1EW*5^*LREsx^lau_Tn9C9)8 z8Le(r=2qsSZ^CaKP8I2?*g;SEh;cds#+nUy9*(SwtdCSg(C^}*vKWq^QkF55A4BCN z@#8Fi)Uu4CEb*X>qGQwE9!1?4fLHFXkQai7DX%A!rG|+W;8q0mSfp|| zest2Sqzn3iXH%lH-l|bfd+BVkUmDtvChWuE5#@*faOR8JJo1!VQaDj4q{@vl$S*S- z9=<+#OT=GmtEh5BsoYU2vlLiN@Rtj=l#%@sK_O}`#27tz-b?%>|vop`P(}k+^ZM5@}Sa62CDbJ+-}{Wr^R5DyQK1|2@>r^`l}$ zBL>=^(#pzVyLha?G!)O&Xda*p!pnopXaEU63Pn^$KNH0mG&ET5hC%Lw5p9mK(bC`u z7O+x(THZwB%1z*+nnMynV;(HaM8u(PgG?$aJhdl!SQ)L?GotFSG8_a3+mLjISl2%f zjuiIbDPs1!_-{zSVOEv9c+7kZge95|qy2E24ul)6%+(wYM|*TStL3Z$Tla8+(_{d+ zX30anst_wN1Il1#*api+3E+zil<&pNCBt(HE}ZDdx~nFlh8xbiF%l2@9?D1ZbzCIn zQG%uNfMhVT4=djR&|n*pDD8O&F$Lkr;u;}7romY!#%DZ3em1wV6s6IFEN+^-(1du{ z4{lP7x)vX;4#|v3LtwyK8KC~)2jXy7`l9pv9R=!nem%^jB%H^?B>s>uG&60H%GZz! zlg{-kVHyk^tAj~=AGnH1i$J zjKQSxb1qfm&w@$m-2ju~37T00ljyle`<675U#8YyA54OC6HKb7YqW0>Cc)VTllVgR z!lX7Z7GFqO8prLv9y~mj6ebER%OWlogOKd;geaCl9*;;GZ48i68DJAbq-$&=G!y<6 zW}V<~EcSdDf1$fBT#Wnv$KqmNoe*d+t_-bYba(pYx-vc!a@1s1_ZHzmKlLVloiH(^ z#;+cTA4Ys<1GhRS99ZpxW?7$-?&Y`vjoYL(DWOD)!a$57#PBsdiu5Qo3sM^=lN_2I-lQO0F8Qcz2W2^C@(@@LhoPk&=h{e2VO>8Z>smta1Wos&8oQVQQUm5+dDn_N9qqliwx*n z2uXQQv6scN6hQfPKS|c1T&X{jTtoNx>x3GOiXV3+N@3rHUkh~mzpya9`Gj(Nnr{y}Pd~C@y%DuN3$mooO;NG}n~{ac8`?$RHVebeu2rQT+Gv)sSNlt5&FY{%l|* z?Oz^9=kW`50`x{Il(zxL8#UUgxY^I|4Gga@zs4=<594cl#1NSe_Y}7Uc(VNfHj$aV zSA1~%G>aL`wlsI9cLvpb^q#VXWr1{Yid*qf-4kwU5_^Vw zdYnYx+|v|_L1GMh#-O;U-vp0haWyEpm-WE9yHAyjpytu)Fw8^daz zb%=eek4im;dP+5g?)|HEdeT6w^S!?oiW(@N<9ohe%DjIpO>62ay--Sb%qgDze4S6F z(<39=)j2s)qDKJZ#|?6suaV$<1vxh=j0@qbOA{^43~aXbku=TN?oE*HbJAjX-YhI_ zyUr@#owva#NM+fOl*M{<@9j!ok^U{$3Kz>Vv~Mx=n;&@ppgHILtk9g-j?25#C&u)4 zzS$JhnzDrSYCCN*|YTnb%y z0~qPkge8GACH)n^=rx|j_K1USUvFChoMO;4bkIBpdHvRF1T|U7=OLLz?>LjOIqIDP*725qpm(vZ}bq=B3++$gxdzHLdC~w?&VT$#} zHhsZ(g=!`4^T^rM=HagY{#S|n6NQGN0Ns#LCRlrPsUA7i7by~jx5}8H$G1;TWh4i~ z6tafug$bekaEIoSe7Hw^W!3efAQm+Um4SE5k_26kF_UVzrmwuxmsio1dHzx1@3KMScR+sk51tLp z7yen6xyaO`oA|8E90xjhb1F2L=64&qj>{V+CGAKOk~V;0kkjWZLodd~bPKW;_(Q)A zZidd%83Gs5wTE=KwH@5Br0HyEM<`3y{RLWQ+HOuNai3|)OV3Wfv@u=g?EIw;nXh59 zK7sVN*bfjsvZ%=`c;t!DB?&D*2ybW^47bYtr4o*n5lwR-H7LX(&i%UgEt`V@i#R04 zT>jE=fV|56xQosDLXAcGl8PX;ecex>B`HtfcjRqIg2Y*`RO+0B)~|2Y%`IvsJffG9 zzMZV*108y6GoX+@?)N%OmVd~uWssR(Q`BwgwzTn<8Qs=iXjO<}B$<#SPl%SdR=Etb z3{5P1yv+T0o%>@Y-A4t2LonW#UD9j;kdlhJle&`H_#|78&Yc4&(`ENXu}>(mRa`O^ zTr@n4Mcu}8#x~w~1!5*OKPnIofL$|NNb1o|o-R+m2-a~0mWGG%PaP&(QMawn*2dee z?luAjaw&a`+9+fa-iXs0U8>{ zq~XxmDh*X!h=wW*;PG$La44(<4HX!mq2b@8;l(g~yY)NREa=M?Md45AEkJSTSIEw0 zkb*T%&}|>LVO&hFLw%g_U^8jl<8$(l8gkN)C1s#q&AdU*@_1z3OheAlud(bWkFuPV z(A+iD|CSNo%SU`K9`Sv=g|J{vLt*d>hkgB9xD1Ukmi@h>kDnr$CFzyp8YrhavBbT? zg&Vs$=Z+EWU6 zd6R;tXihnDM}r=i@*>6tU_vSU*8uZO%kx3@|4pr%aeI!9G4U zb^Q48Q2}+PEK(G}E8=xPS`>$uq()&*gfW!M;aaXOR$XGdjXOla@chy?&PZeJZRs@D zR=I9#%jcRgPpNXxldaKgj3emL=bmes6ne;&6Z%8&^f8*_L@=+UwShVtJr-~7QD>4z zvvM+@9F}!c%HLb!o-V%3qPDsgB z!PLo93Ns1|$4{7)SvYNaVPWB=IWy-K7S4wazbj|Y%`3c$O+`Nbe_keFC3-h#0aMh> zsAjS?k)jD2ok&J3WBvW|5A3}4_cs3cw`}~BZ`=6m@%CU%TXKVqufW@Yw*&9=8*Tht zybJMOgSQm#kMMql_cx_B{vN!EHP%Rz+M1$+^pcn2Q~H?qUTEMZ8_6#en%_ASWyR35 zVo1YWK=6b%7fJt*xOV}JqB{G=&+KkCn+suqh?``I8*VNNc0o#`rMd}Wk|;_<+G62- zT{PfA1Fn|RwDQV?iw5Pb3(~ql)Tp$L*Cr8K@X{=b2)<}Hn8cW1SriKr`?*16CKrP@+pA!)F!A75%!<7ju{+Pr=gqSYe&y!W ztqM_+NAvqgrQDwUSJ>rj0!iLCP$fDl=bkpD!ZKc3s3EO4x%;x-O%Y3B25c4i8S@6e z3c9fO4t9PrgjnRxJ|T>~PJ5DOIV#uMQ}K3ru<*nOS0N6@>YGV!D2BYn31+JEj3k0Dc?Elkpb){6ZQs|GweJR{OT>1+2w{sx>`#Ro70;a_8V^e zQ=`=QK;h4iB>FRFMTmUyZHHYk<3lzz?kThm;l{YJBZ>Vm;z$Z(=dZe1$Gz2y6GLh7 zeV;wvsJa`DXvovE!{%Vm$-n7~g=uOOYW98gmXO(1Frr!6Vf&>mh;z(8-nZ7))OaW- zsMKD>f2VCk?}ObzWv5LmiS;K1#{j*HI}o?x5pzMr*8~LE2V|y1r_Dee;)p2Ej%VM?(sOYgggm0gvKKNAZjCr zr^)iIInYzG>AW*5Neyp6c#P^g9hCn6c1o7Urt*NPn%m!n@N@V2uVUMskyvJ?doOI*RQ2O%bO*Z zrn8b~k7qd~xl!Ir6LRTFXeZ7rzv8n9&XLVpEv>a3{HhA~M{#pz*KDg_dCuZT9pZXK z6|QH7HGZSh1bzeJTWg!f-AvBmJj^!8Gd1gJe79fc9K$)2)Xu{!t+@nvYrfTx&4M` zpF`lM8olrxbX)jc^$s#e?;zs88LrfZzpdry?NzTE3a4FL7+qf*v8L*!lifc75~;rP z5^5>&Zq~Um#YVmNt*RVnR$`5lY@`{oZ2t{eANQ%UaEDVkEAH`keYdxUD+T8WUK1#} zWs*qkfZpS`pDvkNnuZ+))q7yNMZc?u){vm4?H#ltdIAy}oMTDiMao&v+i$e=M6|qV zt*@jNK`oKnspa4aF(DysiS?}I=t55#y_5{R zlq6N=cOjEO=2W$ujkt^dc{v~NwW?{3)sCeZrCI#Fh*TV3qS})(zP-_X7kN;7U(s&g zOuegq6tSAAzfrID#ll{;Jc(Tr8IFC=8FnaVxWgp1mgo)k_E)pe8WuLc{Z*<}aQ>)M z^QV5|4hvbAg8Rs=jd8B%t<}k=2S^_EC*eN=*M`il!jZ5D?%bsI)pTDV@5Sx3k)&JT zyVDkvw$oB2>M05;(*yc7wIQ}FnZ5JXA@m5+Iu}G(Nq$5siT4je`!#q{&#O!8cdE}J zf#LaqXN-~E8ey|;jYzYIHhQrCGMjgnjXdZrTufhZzTE}q%11+YUg}zS5MKcGw>e>h z?=O9>tg7m13rp=Ojay*hl;u@P!dTkX6jNobEUUooL{GuzJ}F<19T_9LM`HwmzS{ou zHCtQVH1{l94ch^~{7`Wl_Sqbe_ii71VVaoy^_Y8z`m6_6KI~x|(8dvtDfzc;tZ!A^ zBTew#)rZwc{ckHp2Ix_i)q3An$_%ZF%OE(-&9Fy0mUad1kXI`yVWR`K1jZR0ut24{ zvdD)6txAQV!2Y&UG4c{;R%flZRVf?k&TduakAy8M%iGF)Lm1Y6T9qQzwFIuLE965R zDkTQyKsdxT-vH|eO|44FNV3-}$zG+;oj^i^A7GAV1>q?XHGx6jt}Oe7G0;8#@<;(wujP z(w*keaM;;%pBV*vA^#pa5r)Nt;%&-gl%hLwTsnm@KoD*{w@(ngUMl~y@`D2%@)ZLn)WYZiavh5u(Kq#5pxJIwW{&iF z&&rMghOjk#3}NAB=#u{V;xSNYl0OY&u^-C~ zgQ)vU_bEQ^-YI`PfHcGB<3Zv)rdVK$(r5Ts-pFYMmgPJKjOf+L@;U6DPBOLpdYWlp z(8KuVb+ihO4JZThb)y};*SlXSH&BZddr9B!^@d?N(S0siI3+)(V8`Uq1?RjY=l#2( zYaQ;|QhS$N+ejj#{5U}VAG7PQ>*vA4|n#M{t!rkh3b28nA6xKhD&uabnl zh#!M(t#Y(EvI9e{iaASQD|2QZuFvdO78%~`GK{E&O$D+~XsA0WUp{DnRlzR#u3pM- zKJ41a@&Bqg9k`lRH4*3Hsw1CxyjmJuNW(ED ze90;KYLx8JOPsL6RWj&7O*QqHMbmSClZW>(htbb|drS!?!7k}<41NRdF4{@AwtKaa zcEMc-+j1jW6?R~@GRfYFx<91k8{FrNf(JIr1|fIz1njJhyU{w1!OG?-`Am;S9aC0q zEEEOR?Nkq?$t0YV{|@_{y8nU+T8NLLA?8fb_(Ljx68PVb<9BiXeNq1LoPUqXZwCLL z;`l9`|G6lC|9DM)t;(MQ{wKj-j@HK_6$42~E9w!g7*EGbjw##9H=*6s-TKF@@lWrO z(osLD{r=aS;j5ezL$KJug66R;!_Vw57}lM~SY+dX2NoA!=hXcJ&b_v$HJ{1>UqjtO zqgZ}rYKPlicdInk*tOn@{g=D*1h@SY`OO~lb0qzq^R~TDD3IlRuNmzz)#JSdt@NhB z^H3FnU`jn^>A9VxGBy6HDaVf|~b z-;BB%QLX0mwyH<6gt76tbt12y!>)@vawGCe_xMTqcLRyJZBPWqMm4weti@jW%G+_d z{q?}^8}z)6J}x*fYYxjVg2NjvkN+5WIm*Fc;q;Vz4=;@;ZV*&@nPOC9(9%zRMpIQ- z-lVkR*CLMp-v9XHiq#?e5$?c<0BLA@LMrziF-X%tK0VBcuYL?WOc4 z0dL*~DBTqG34?EcSbzQ8TQaLWuO3fO?R{8I@5GVMdpF@7KWFR~Jb$$k)XU@6=I^QP zgZgpwes`k;sE&`}c|s*k?V@;aP`-=q zvpl?oNAAa)6LuQ67{#m`hM$pGO5W$#pMAeF-C(G68p#p`o7_o68u{5JB42WzZdbdt{H9_k6#e_WwKp(_7Ln?!F>^at@lEQyxh0s zE_9*sJege#oZy;Pel4AFo%QH&i)kD7zuOIKh zkFHZJ2DXcZS*q>-+Qklf*RF^4>5Qk6yFR>U?&-yrN5$eZ+X_-`x#Fl_?G@RT z=}ndeW!?@s9iz$&qgc~x1?fBIKsr}&Wo)6NuGuW!? zkmn8v6IghKeQ(jh*?mWZDW<030n%062Hkjv?C&*)Jz0jw3v)GEfaU1PSz<18wlxcN zAIYC#b``#WV85UjqiH5_1jfPLesfow&o9nB?MZzF>D)XUdin5L`@2OQv->`nyVrp} zr?V%t*Lj=t%G%s>t-|G5;o>tR-0a`n4dj=NUGXC!!J%5Eenj|Adebwd&%zE`bun|E zh`O(}ze4hk7#}nI_C3YqFBHvzq#EXTh|fNRakW9`ZF`ECb02!Mnw%-0_sxBvK9l0c zETA7Xn*$%oKOg*9DXIThnIoC}Yywg$UV(J(D|#1lO*O*Trh>Yub5D0LXi*C@J57(5 zoT)23vS5>~G`FfSz0>#@jea5S`mv$~mIh$$BCsBDI|ogHnOUv{d-f*nFd>#-!P1+l zrsT{{w|l|HLgx`nSG$kOW}kRTgE`PH-v|D7`PIRsZCW{XQ2ZaT?+j}(1=i+%ByUwP zv(KT~i7*9R3oH%nJKe2xg*S9axcv7gO{fXSAZ#%3x`@n8f+do4STNcy3YV9h3A#VR z^OZ(hSVWROl6wXW{{0?9V56r)-T~XE283sWNw5g^ksR!CH4u6R^EJERkIcqsA6ebo zRP>UP?ziqpsu}U*x}rCrQ+i3ss9ij(q3>KbzHf5PH7_Yvws_VXN(R&2Ucwv|V_m0Q zty+ar<-<-1;h&L);xi-N_!?QnU_lpOfA#eHa&O6*TDN;q$zGbjvQRVx=D}Xzp#1(o zvN$|UDScr;^C5RPd`7}P2ub`kBpOhXzZ@j4z(A)w6|wGbcA_1>(cd9=^b^-v*j&d5T2bHQsju&u=1cldx?64@aQ%uoZx5w) zb>gcJwiDBKc3D#MVJXVzb$M&M(#$33b>Gup+jS!ouG-U7B&K&hP?*}m_6o3)9J;5} zYVJ!N(a;x(ur7f=I3<p3;u!?h80^1%^juof+Y^5;|fKn%M1&3+2Jo5j^g`<_;#wc?%XR5 zRa6xY>tL`cQlj!^s%ifH`6RsIKb9x+G(U+nFUFi%t2+O+s(y(#Po(dd%la*^IK1i3 zk)aHvWVrKEw26=8)sQV!m|&0SBf09lgAETkF&0j<5-HT6oH=L=YgdmAQu<2OS(;Nm z@1DB>&y0Nk$I8rF>y8mm&@&`Myi^RJrCgz;b>}mq|2;g1XNhA<4E`JNRV(~?g)g7>I7Eb#K->8{L~F9%s*@v^FNOCD@(DjsV& zP*{SmgTTIWe0xs?E}>LUJimCEOQbQLPCSWSVv>6QGxoE!88FX+?_aW61&bD$A$-Fk z4useq~2|GF%1tHmG^psyQNYV!TJJmV1H1A6bHxA+Uso}y17p&Nbc7*SJ*s&hA zVk6p7653H6+R;s@lMeX?Rm#zRtxoPxw06`2sgJ287qi-$1G&FZ@$&dDHJ z72*5rO1ar8`ij>jCx<{^IRb94Hf%3E7s?D9ylLL;h0k;gR|`##&Kebwt}jze-?>FG zUH?^-Hx;}}D3p!S_=_AK592E}z+kahE02akp%ay`@C@CHkT(DJg|l~=YcIC{LN7R$STTOwolq8 zY5eAY;*W8jZw;T#Mt`e6Vdu%}es{8;;qN~7Q+7Aj`roB;X$)HZv&+=l93JZBTn64YmbRx9=-L}(wQ@{2o5)ieo)J~KN{=( zpgg)4Js&H)m1|ZmU0R{Jp-IgYb7w4F%F_gq2{f8i0zG|lB8?^%=WiQ7en|Le%s&W< zo?OrO!q^YQ^Zj7d85im!f9Xt{g`P8%o~29g_bi>Mu~2&AX-ZE#P4UOm!Dy4#!pEAp zM#q}CM#q}CMrT?wuUkq7k01H1Sgkr}{$O<#c>07-^Ot#$6Y{*e?O4qwE$_I+X;@Q z4H`WjNa-p9(mK!i99MDN#&H+N7LI3uv@S7oqZV#DkmStgSk7@3#|=Qr&o+)bIqu@P zA4u`Ha6Aj7^2vNa!|5F7b6mx78<67N#p(S(l5>Ki=|PPi&#?$d{Na*ecS#Z=1+0QA6AzGPINe26oV9WtCYv%4oaXM zilaTApRR4T`{Q0MnlHk;wJY`Pi@R1Y^=PeD^d-?Vmn4m&QtO$b3$M|({K^IDtBb$8 zDi34xyL@!@c;A=kd~Aak<+tVMFIW)h*AukH6I8$w_0OLZgaZyPzaM*%;X?s=jK!~} zf%~i1YtqvX#&V#t>ih`BX+6ItyD#Xon>2Cid4LVXQEngh`}VoH%bEk&4Hb64;vVk9 zgQx@R%?F=4xc6W~^(+3S`hN?$EiRXCJ?G+mTTQ0^Uf1zXw9@$FLVd@0f4%Rf_bFn1 zH*h8NEjjH`JDX7vG5L3?{Wt2H#vi)ewM@UdGv>`3TeLn?lh+ zhmn-%fq>c(%QNjJa3B7btA8tlD}&|1C_gSP-WS!l{#jozzMOF*tAFwG6T>f&u14>j zNimN2@LFyb$N4h!1n-1QAM6L^V#cQt6z_+Th(Yb#s#<3|ws7SepQFC=PD z@y9#1cWigLR@7^MnoW^-e+oN8{esb2BGJ)fXkT*xts6I(Cpe(7sJoJRw1aLbNy5#K zM}U~p(u&H;ii)M=tA8a-!1X4Oe9K#$V z9N8mUU(*Vte7QK5arANY14&Lj#~_f(BgFk9K#JGu=j8@e>xY&+ru9Q3&|@cy7B)gm z-jOXDvBGtnxWZdkoWIQcq~(bq_9S?QO@*#sAicS}UH+`eAx;(9<i< zYWW{GysC1w%dLY+T@NOiyB;*3$Qc%Pd4-I@N#>4y-Ghcn-Xo32c z!tiqOOz8 z7>CRVhcTk?4y@Q;KW26AL~sEl{k5 zP3aa=R_7iIm0M`db8^=M$qhyACy9DrrH-6rUd)5W+Ua9TrPCNjDlW53+#HpEJlW8C zjkmykjpzC?dRo6gd1xcWT6v@e(lK%}y*}fqYBAVtGSljCHxqgp%EM{d0*l{ljWuFq zNwAEa9V+}l3w^F}w>nyIuJNUuN&vQ)^Po0eC4(6p} z_1B5US~X0*hswYlO3eN0-0R2egdEC0yXv#%&l)sI9Vc0nc9kH}VS?55e6JK4WceOF zEW7Fq(r}XJmg=9@zWGJ80a&N6LCvfAuFZJradAB}^cv5h{x44#M|y+Z20>e~YsQM* zDWM?7YPDRu8@d}UBYwj3x*|7A5$-lj8QJNzCPjp#GmRtQmuE%G$T48PuYT=T`MyMI zd?7u2zDJW-+Yrgiz{pL^eR9K3#Am$)Vh+}}1&S$#>&IBS10#`A zlP?CRf874dzq!-LwU`h*>4F1y(xZ6-G}l6gV|5IvXcFy1Ec-sfEP26UreHQ zCnYDhj1HtfPGkDlVqU?=^8DUoil6*eeklKBFnK$TqM2QolWg7Z?aSW8OnpXHTFAQA zG0f@hwpkdY|9J4yCv1VN9X7vh%B7v7F{>hYCcO%~I|P!qn`_jSvwpVi`(j#PP=5Zr zEnvz@39PkCSPlG-W;tw~GP8MffK8-O-4c83W5rfaEyrG4EIuv1hSqBdbt;x1+kO=G zlab4PL{lE<96O(cssO`(fPJKbyw-+)qZitTcDzn-tr0qp-^f1vQG&YQzl%!@qb z%0X=l&f?B05p!KahACr0rYTp1zK1!=^+v6Jmk&_=STKg0N$aFhLzaNapA#@*9*qI_ z@SuFjd1^g(4cJjmT3uQtqhI6Ic^*DL>|1=##??3FdJpEKSR2fcI&)xHbQZ@um{XIF zy>Zye(V`vgcnszhRwifyW#8e2LJP2W=3^C4l^yLVb;UP^4}B#(xIGhoPAj*Vx#r#twP{g z)bwmod+JZZvmN!7^BQVXX@+^M$w{3KakdDz$KAPo%|?{ERMa^8Scd>fADrjo(s&!w z-XdGoJ)7`cob?E1HRXG&k-tmCT;%U1%nH!%(>jcgYdL)uX^iFc`M8``YdJMhYM(wY z1VWgdlJDL3Q?_QfH<&ycX-0jjZ>eNaYll~$9TuP+I)&m7F9>cgz359Q_O8ET8}@g?WAc_ESA zi`2Z(6GzKSG4i72pzxwO*r4SgnR4Jhf1QWw1uKl@Nyt5=BoFBg6jMA?&r`ftAvT(I zUvTq=dYAfiy9A{+5;3{dRx#|K#blC%YA_ma8@MlAGdy1=N_k7a!%JiA*4+|jgrpS3His>r=3? zh~Iag%&@#un_>AB*K>g@p3bloUYw%0L4?%_;{1a6F>TSm{go8#&X-~)TP@WB7 z+*lt=wp!O535C{-9{t-jy3T-AvcvAf(tGSzk)%LMU_^jLV!~#sI-;d)W^ifnPU%h- z-R+W+5MzTDQ`G{(5ucajPN*JmC))OtnLklIh|muc%EQF2mo(H}qlj<*V3eQ-_K-tQ zfysn94$y=~^`L7GXb1l)X0}Q#E%$Q)YaV!j)P^3eRbgu$Fq>zZ%@64O>GsKUHV;5? z#`&S4TLV=`)PE)vs1$?F4>gUZ2-W42U!1?1p8L(|mC+2SN!Qa4S5C*}SCGumIeYMD zL+cWxXi)WHtx9X>L?4}B53l=HZYD(mi_?@|hj{}}N`K;ik25#Z_o$7{0HD$TJLAUx z8KaD=KQ4I9n{Q$s#G7yGWdRO$fV~y{I{;cgXvTzspYEd5!8lp(L%v>5EGlI%dZo+a zdL@tESa}uObo#*I_DDF=e)s?nfN0f2j~m-N2ag9E@wWqi)%cV2WUx;@X>8oS{nx*K zK#vSM;8>36DwaYjivxTrh{pa+UNS489aJ{-*U#Evjg!hrKd2nnm>-C?F`9s*9-M)q zp(9q#T8c=AI}?9o>?C#^aM9miU3Yta8UAJ16?6q-eiV+vVB8l-RP50FG+)hpitg8s zCJsfUUUys#h8y0awrbKuk{;56&vXi+R|jr9z17p)jXdU-bcq+jL2}fdAPL?xMf3g9 zb`cB)kN%y?B374``{B5s$AnuI%m)s|9Rl57#k0k6HOuC;_^ge_xM*)&f z$nuP)8?ymPmoptm``H!&RUI3U!mR-k|7MOmfW-eIkoaB)5??#_KgDSUNPL!OHMDVb za?Iyg!f^pdFULxb)f@vH>wuJxJsb}LDIM(`&vLZx)O1{vfutjx$#DUY(zS}?1|aDe zw*gh17?AQC*e$YPH*E_&)p9LDg04R zf5H9xfux(X{a%wZonsl0_$z>v&NV>F&t^{V08%<$8QydlUZutYRAC68S zZaT*z zAjz8#qfii_zchYb^i6IdscmYfpR3qr4O5v|~w zZ)gSCnJVdGdcn&TLsT!g;(~g?KR_?oWY_e9i@07eGwZ*n7u3QI)eDLVdOF&s+5HW@oF>o%=O(Sx5c_ zJ>txNNsmY+_%G`br3>p3o9zFx9g2==7#6OCfEebRlhHlYNS+Z!E_i!g}oSy2f`p|E%d6C*Kjx z)gPg2R5hJk(>Mp3MxW_TRns^js%dmb+^TL+*EKq%L|x-fyRK_ok$bv%Qk-dlS9`+%UGvs8QbLV^+&ag&>UjDi1bZ8<3IW>sQs(^b7PuBKj|4YZe7#( ztMeJ(>i-FJja2Vz?Nvo9a{t6NjcpjM(lw3UbNA03CgyuL)bIQ0XfefW++v3wt4;o_ zPt#$w$>F|uT~A|nX;j}hTWhDO)K33~ebS(XlRP%GIn6k#)dX|U!TEW3mqEs z-^jI$omjbFZtuUPGMJEXN-uefLSmmQMGC*CreKs3Zq_)jiO67tA%IEv!em zrHhw{ZSp6*dMo(2H@>Vc7FTDlOD&yis!QDY(O8?l5$ij>6zhI9)L1`*z)8oBVKZOt%P&HN^~?!wc&c^L~+TiRu%*Z+f>bxBg$z zEAIYdhGoes*k2RBry4UX<926Q3U*~!Uc&DUTtAE7+xYzkzs2~iPcCZ0PQ5wva&NUb zLPD1?$ArD!(?{_T(oVza;^w#s(>V_6F@az@1rT88qCV=Z*Q^p|kx3McMJ@w^V5 z8vXthi$_;A#)4wqkN(xHJJK?A3p8#z>h3IpuWBVqVLuL-TaAl1`uQDWQ73{zEv31v ziLOzKap-?ni;y$L0;%&4aXR>LjjDLRu4O zlv@Ig@Ch`^Es>5E$yluPqSZBHqb?W~S@Zt;ZEb)5`x=QHp~h2HO}Z`%aVOA-JAp=A z2{icC`(C}-wOCN(hYzDLHHzV$Z>NUd&S~VfGJVbA!@BMa5)x>{m_Q@92{clWK<7L2 z6KEa{yH84o<*&og;Qm5S3VBshE2*@4=o$kcNFHv$__V~+l$Lm!;*O`$N=R)7U88oO zm8hgnN0-@fe@t;t@b|hFP*Fr@CL*sWI~<%}O<$Zpl@)pGx4oLaIGV~T-XEDyq*b|^ z7MirUiTY?$<Q6eK z0QRCLtOJrRW)H`M9NRgb;;3-6{8`iO*np&ib8@-}NV=Z+K+=(w14-v30g2BKq zonsNl`5eoE6mAu#{TypK)^iMU3;{`gm}7(^drfn$M9KYb$&oTXVEq*)4$sA{LoWpSu#|n;XfRz8uoUY@zhvPwx?Ho^W zR5)7R(BicLY0Zrjc)I~*C*Ad)LX()4_x^0x@^bl)(&-i?7pZM#UFp*-ljAKG2*N` z(*+%HR%zF+%3ZuS6BkVHS!o#OL6?vw#hkR4bBrc`PHDr)}GU`9!(4VF7 zj~^Goo8mAnyNNz)@kx~*x9SE%Kp0hv_s5%s9&k~4wC)C@xzYULNlXvps6P={b`zzw zv`5pAY|wRLelbRw&RiG;b^(n%r!iQoUTWufQ zjpmHtQ2k@$*qAvLR8Y6kxb=Zzjhhx2sE6L~pf_hFy$f}Jpf(D*LLxh;3FCWUMXQbW z5%^m)7Pdd#p6?6m<9jTkmI9r$lF|l&)lpzIwg}w>>JcqThD~%?5nC6RnxU84rxL%d z<2@7lVu+MVCe{Y@{ud8{*&EdTiS{wzoY24W1%qKqc`z1(#?S8>_^9$@b{3u8Rn%b)i#K7Lm%>Cn73{ zlH!Z`llb_up+*v`XU^Bj=xJT`{bCukH43J z6n-+0_)37pw}8`Lpc)U5>HVB;;dp|(pXF%UukmLBN$z+c^{1wDx{RZTqYp^wk${wLKc{PfR37y}l5?2* zALaBH9Q(O@`r8_xo#SL6^~+{*dJe}$Kq~hN?!Sh+Z|3ehfRx@Bx%)wm?Ho^WRDhIj z%K=`_K%$*MN^d^L5+LPc0jF1S+yJEfZsYV$j=MPS2U55eAdLY>fOIQ-+ZZtQ?=I4R zb2GPk=y#LDQCW*4+9%70Z^Z4^?^&=_`^tRPIy2s#ln)$&1F6iLEz6-jHCNJ|2Zv?S21ERmMn*s)wa!fFJLA+*Pz z=+A10&}i31g=Y#2i?sJJ^16Tj&Yjz~ZQiWOv$Fi6bvTOhRoXIywvA8p$3`Uy{OAZJ z(j;XpwnrJOilfuDMGtM=`b^Ot)dA(PK|8ecpga<2lt%)MB2J*eU#;HA(fgR8c&n>X z!m50HdsSE0Q-iMOG-C8wDyyrt_!xtP1R60W&?un<8Z{D6lg2xq=CLsL3uZxIw3=91e0IeZ`cGo7-XblPe%vDB3 z5se>tMcLut^3?Rj`K#%Rqt*1q(NtC-qw>`B#?uTFvCq)B)*Txu3hY0I8300!ZP`0*TM`Us^m4Ao06^#OLO88AlJ0(&OVOar6Tz-L;&q z2a=p1#}Ic91L>U~;h26{qn$wFF9Om#eLlx>j;lCs;JA(BP9UX!7pFr&N?({`gd=-T zbGHI1-wuv0j&6=+K+3lVNa^r#TH@&ESj(}VV~}HrV;D%`BOKZL8g1q108%<#9Niqt zIC?nxI7%G-9BVn&11bMOAeG-y?*0YGevavX)#9@Qsh%ctoXK$x$3;L&R|Us495-{^ z!SO|ouX8*Mq;fmT=`T3;b4(BM_&HAIIFsWXj*Eb#L#qH*eEIDAc`(ejm zeZ56w&wVM^^@o?g(Zj6Fi`_jXgMUfI?<+C_8L&lQV(x5Xjoa?d&Zw#F64Ku2F|#*% z3|4oxNp-F5vZOdFKE%%6EOJ->I&t?a+muQc#NMvV(V}c-$16&+ifw-^Ozm8o^T)!S zO>}-*J=4|Mj%~`XScg2X_x9OY9fp9h#J^ z&AZU{L$!z*H5pqT6^BFG@GSwcZ08w@?YoeJs)q`;1t- zGPq8pI5TR}dLSU zEt|ShL62rZY^wMY@D1$9Og>gzWim;1&14@V)O(*>1WVm#a!rph;6~ZrHP9wo28@`$ zvkjdILx|ztmvDO5_&#*&eI} zY+&07B-3rJh9N|U%W z=J*WuNMhw+(8>Yv-QAO_&c=bg_4*e1$B;zneYnSjy=aBWIi0kRFS!i#w8$kr27hIP z+3P|M3K74nL8#Go>ZO$5&||>482f_%uJBWYqmBI(1H!P3tC{M!Qd}i@gUNlw35o~C52&^@-O9uHZ`vp8JcA-zrB+gstF{jE*)?hfPvm(Lu1MDen@)s{lwp~l#vIdjufv|!IiWUr725X)@}q-j-zynHJT+(td>}tODEK#c z1kjHSn#PhHqZ9Hw*d@AE?(J#A`_+iGs4*GyR2lam%*K@z=08*!%OGZn=V{NJ?HxX&fA&9q*5wr})c}&)0hl)atA7 zHMzSD?`I?I0BpFwO|D0H>l?dFu;wPRaqNnsCSlyXLN=+WX;#EwEG>Mf(9~fON1%@~ zD`GMlx{lCZ_gz&Ef8UviWF3AcI8PYCuw%ruo)N)dx0PA@()+E>`viw_Zgw^(Zaf>w?NH3{jA*>x!(9zw>x9_ne;3h>)rwup=(8w) z>2?oK4jH@Vq`wc}*A+uBqc6SM((Oo}dwPd`c*Egt47(+z_nBliY;J_5S0e`4WAnh) zbh;n%gSf6j4zFjyZa2GH8R3u`3un1;R~ywFx>;#8>l4Nrx*bePc^y3xTa&xcGmCx4 z)cOwWx@{U+T4)F-t5?jK+zNRvy>qDh=itg3*^*hA$9h<~)-b=Dy>`F;R zs?shKe{woWNNO(CEEmjWk$YdA#7de<3){rMAkLDe_q$ofJ+o6gCW${39})%38sCIk zyF=V8lGSXD_dg3$LV{=&Q^gg9?{>4)8W`GX@X*V^a70#ym#{i|V{TS(nq*wIm$YdW6ELrMr)g^;5= ztq3vdgU?P@T9do{KFRtA*jY3o-r|#9ur*oyc z?+DU5v1RUQmim95)>5%-NLpVG|KCV!QdcW1KnQBN7oi@7E!a_L9nxvtbpP?aS}ETr z;oTpAl?dkV`#Mrmq|V825-?vqPc8i;E9ZHs9Lw#y3r}}w)*3K)gM0ULTb_qx%xy^) z^So@k5V!>{BuOm^NPG1Dg}Eg~#w(|y?u?Pkb4M6#mvKb;Bul5B@_f8o^i;1!s_Q#2%g$+Nb$FdNC}q8{36bsaXgQ&$-OV>ui<7+7 z^`k|Tn0kLk;4)FT!qUwA)6jFJ=i6Na7WJuydDlX1&Ml{z@wSlg0(;c(!o1u;x&6E$ zAc#U&$T!Ps5n%_X6SLMq65i8aoAo6n8}?L2hVeulYsxd$ zvB*)y>2=?4+e_(Ykw-a2Z(3~rrf9h!JL*YzH`D$gt#a4EaBi#Roh(zgR%0#x39pYc^6J+qf4*If zkp4=K!Tln>#jX~OrcqU7t``jRGk@rCbJ_pZYBritRyv-dPTEzZkjW7rj6HE*(v3&GFP2*1(d7Wi!uvCGR4 z+A@SrPoPV4tu8jHv-uZj4en(N8u0aLJ(OJvS(_jW`kw3uu&a_;Y?vK9^Pyx6th~wC zWlk;1We%r@U5;-(>^bzL^p^Ms^z19`%wg%0jIZ?=94IwwW8sa>4TZy-^Lrf3RFh_V z4d2+LH3&drwm75HfYmWJ@#^rkSot!p^V8&%R(3^Z)4W{RNa|W=gap?sg|=po<&w}h z-P4=D>1IIR{PX6k#a9Y%3Q=6!b2jDN;?8O@)mUs4*L64McjXq44{mhC)N< zZ&7nI!i|N~JAWb?o}(VKY0&qIAu!3CKIw{%G%=}bmSN-=V|c7$KD;p3a&2eBv>wCZ z4YM!pd`4lxg}I|b(|Syxhj)%u4B$uuZ3dkT+63AN+5-A-9VE#wmDru0wRU45t=p9L zVBz4oJOAh$!~E=Wr}s5HLoUPDTJUzkZw<4W2I!WAE!VKrkm+$)nA#q+W!yN=mV@`3 zmIqcN1UA{(mIot3@+2>FV9HjPK{#OI;*>4Fh5nU?z$^-4c!gL^Ukx$2G_NIC;!;n*d=;@WV;N1};a zPlu|lkJH!VH9?0@7vZb6SRHOYRs~1UE{i3m-?zHT{0h>f^V8T>yuZt>D&V8?6uzg4 z&X4#h2~mF{DlPHDla%&o`VmZ{qxm(YyWB3!6^$K3wpNBGSak0&#zG+>O2b_n!`&&- z-&63Jsq+pU-6vm<9u)&I!>o%4gz$3 z-QQx?TvUI5^#&CsVSqe7d9gn(YJ-XLeNxaBYnwcO z9-SLiO-HmX5S`c-wr+j?`J$pYezgI_(Xnwm)iFZPCB5yTF*qDSI$2dut!&h@N=tO< zqLZZ3bh=}!HsY<#!SeiF8?W+llz=qO;s??=O)Zed)9QgV-gFpfFkl=8NaI{zaO?*X zfBH!+yd6mXlR3`hIEUjRAn{jlT*GlQ#~mDB?tYMCJ9j_DQ2|oCmd`c0HXzAyaylPK=_mnG zJPSDO1rlE+r>nVtfV6jmYW$qu&;46Co&b`(vz#`4!SfHKaN{{n2a>!ZPR|Fb`3KS*tW`j|8|Zsbv+c+n zZL-kIE-%l$PJFpAxnr!zU}ZZjFYR&6c)3vSbVK(!y>G4E@tyzGNjjFqkSBUB`$ovp zxR96jti^cc?VjLRsy10;k>y3-CSb`pM zt4Mi#1Tj|R)?xLvmd_h_tY;K0pVx`v>{#wEfkbh(jPblSdAFLDPbv2gBKL7Jmmn<{ zl6mlgGP~fa%X}EAJVE91AoeUgS3dffViR2p+p#}F=8uxP^Vu=^V6Q8ys(RYOQhQ3{ z7TDcmc~z1y7T-InrEmsI;l%gGDWCh8T(XBoH%O03HvO{1KYh*CRyWN(%T^zg+p$0E z{-3iK=yZcIptU$)kUjl*j_km?%7}ctYFsGzOT+e!_zJ9b)OkEYJ0Y( z+1S_p2f-YE^XuAsbvhylUCsC0Xho=dU^CjUr9qKzKF?5cl)Gcf_@b~k+yEcc`g=Wt z^0@)8w_W~0FX?E*axQko=pQ9~eQ;j+v_^dG8oJhv#J-UBPvr@{RCe|O)DKF`KB!4+ zF}i=+D!;9ks1xHv_njwqYPTkFTfM`ZhPrI18sju#B!xx3lIo9B-Cfx$h#v13^6>L! z$4R*wrTwB&$P+wEyeN@TPCO5`pEu+=#n0s*46w0u)r~zmD8zD%E1I5b!^j51=m-1l zv67aXU~Lv!71Rr>?Vg7E$pktLZ}eb6a`#A#JzH6(>jQb;d9TNP&IBvs$K)3VkKABZ zE!I26Y0sahFscum#pB+CRc?A7J=Wuao$n;!80=%}obSMbH~DSiy!$zCmC9=d?^^IO z$0?6X9Dc?+HH?wK*XQE<8=+X_uRYhQ&j1#Aw}g9XjmE!&?S)}6-``QHbedjtG>!GNzJvd}1&UzytBwnuK2#u~fU zTZ38P6x{X>`I#Q`b0qDS^R~TDD0!G2+S-iTP4(dG_Lw|nuu6<9bng9aX$kUj)xd8` zP2u0D*Uo`$Dqc4bSxEQb-y|(W=Ac2`!=D5}JPEAgr*dvjyo)fFo(_MLzdw+vj?C72 z!*X)Zac}aZoaTy~v?t7C%5z?-!AtrX>ipL|D`Dqd@YJDAo$2?W1@<*qvd?pJrkUHX9iG#KffMjEwBePsh4||A606+wzh$$l~qFGxUm=eT97$ ze!lAN6^mCbyA#51TDB z!OsN0zhIi4?E-#DmQ@$^Gh>*2XtxOcITf~UkI0iSW^bG_vx#+WWae^KcSN45 zj@i}pwaDFlG=@lho3Ei`+~Boh#s;em(eD3GnzoaU_cGDkC8SL78eS;HyRfeK>E*)q zPrXaLhQOg^G^+_aMb8uZ*o0%s(PY}Ah((Od=qyu5WDHYmQ}QdNyr~72!px=x7|C!- ztL>iUNnP$F%T=Z(HgTAbe4-(hz#&+^swp`8EVoJQ=m973xx2DClG z)`@ypbI7#a7$_Cniyy)+U`~m40K1T+zjI0WjN3g%e8Bsi%Jua^on;5}8(wIG-fpoC zPsw6o`&ZsJ>~~}cG%QC>-#n(AopEScju$z0mwVl)~ILk5m zkQnPHstnfj&3LCFUR#qvx_3E+N{soW8tPvwx7WY>ZRHkG%S}MJZARWr|D@au7brIY z<+hH(Ua;KaL+IreQOoU{abB$4;$_6jZD_nh%Pl^XR&KuC8?lcN-CK6?D%@92u^#QL z%exZy)N|Cz?!Yd7(_^J&sY!{pGFymd<@}@}6Skx0DdSv5sWkVeXc@EE*UjVu_bUx> zTduYiS#`U&fi)5TsD{K4XH{R#&)8s;v@oUE%Zen?GlAwZR*MhUKkdDg_6zgpJZ0V@ zI7iov-eRkt{fqg^SdF7^M;VsxhUkoJ9m?`E38>4Xpqt{+XH(`Jtknc zrflr=e+3^oJAi$pR$vdQ)wy3bKf$@TUzB^wK#cnV&b|Jk+>LSEcdOhLomx6DlMLz5 z({SyeF15RPp~|p!Cpg^QO`41M4u1SGQ>I-QBi>)v>9di^5a?SK~mx9Hq0ZUDFp%L>cQfn+* zQvE4`WKO5lByUOav$5tHhj-KRO;j4^h(Ei>_++)P=;SO<$dx{&De+B;4I{zKSf2EitVLy1p zXsFq_thQL⁡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 diff --git a/mcu_utils/gdb.cmds b/mcu_utils/gdb.cmds deleted file mode 100644 index 4d9c6970004..00000000000 --- a/mcu_utils/gdb.cmds +++ /dev/null @@ -1,3 +0,0 @@ -target remote :4242 -monitor reset -monitor halt diff --git a/mcu_utils/linux-arm/st-flash b/mcu_utils/linux-arm/st-flash deleted file mode 100755 index 16ccbcf8a67e049766c67bbbf3d2e63380cd97b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186852 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