From b733df228888318f55cac7a522ca8b536b8adeca Mon Sep 17 00:00:00 2001 From: Jeonghoon Park Date: Tue, 13 Nov 2018 17:02:02 +0900 Subject: [PATCH] initial upload Change-Id: Ibc6425a9fd0bba44dce7338b3541c8754bf7df94 --- CMakeLists.txt | 57 + LICENSE | 203 +++ NOTICE | 1 + README.md | 159 ++ dashboard/default.gif | Bin 0 -> 4568 bytes dashboard/public/css/style.css | 297 ++++ dashboard/public/image/arrow-01.png | Bin 0 -> 345 bytes dashboard/public/image/arrow-02.png | Bin 0 -> 394 bytes dashboard/public/image/arrow-03.png | Bin 0 -> 542 bytes dashboard/public/image/arrow-04.png | Bin 0 -> 446 bytes dashboard/public/image/arrow-05.png | Bin 0 -> 471 bytes dashboard/public/image/arrow-06.png | Bin 0 -> 513 bytes dashboard/public/image/arrow-07.png | Bin 0 -> 1493 bytes dashboard/public/image/arrow-08.png | Bin 0 -> 500 bytes dashboard/public/image/bg.png | Bin 0 -> 20074 bytes dashboard/public/image/bullet.png | Bin 0 -> 339 bytes dashboard/public/image/image.png | Bin 0 -> 1203 bytes dashboard/public/image/mobile.png | Bin 0 -> 2227 bytes dashboard/public/image/shadow.png | Bin 0 -> 21281 bytes dashboard/public/index.html | 87 + dashboard/public/js/app.js | 266 ++++ dashboard/server.js | 124 ++ include/controller.h | 41 + include/controller_image.h | 27 + include/controller_mv.h | 30 + include/exif.h | 29 + include/log.h | 94 ++ include/motion.h | 29 + include/resource_camera.h | 37 + include/resource_servo_motor_sg90.h | 40 + include/servo-h.h | 29 + include/servo-type.h | 22 + include/servo-v.h | 29 + include/smartthings.h | 1658 ++++++++++++++++++++ include/smartthings_notification.h | 285 ++++ include/smartthings_payload.h | 660 ++++++++ include/smartthings_resource.h | 367 +++++ include/st_thing_master.h | 23 + include/st_thing_resource.h | 23 + include/switch.h | 34 + install-and-start.sh | 11 + iot-vision-camera.manifest | 6 + lib/libst_thing_master_api.so | Bin 0 -> 111232 bytes lib/libst_thing_resource_api.so | Bin 0 -> 72552 bytes packaging/iot-dashboard.service | 17 + packaging/iot-vision-camera.spec | 96 ++ shared/res/default_icon.png | Bin 0 -> 57662 bytes shared/res/master.json | 21 + shared/res/resource.json | 105 ++ smartthings-plugin/device-profile.json | 27 + smartthings-plugin/manifest/ui.json | 594 +++++++ smartthings-plugin/plugin/css/bulma-switch.min.css | 1 + smartthings-plugin/plugin/css/bulma.min.css | 2 + smartthings-plugin/plugin/css/helper.css | 324 ++++ smartthings-plugin/plugin/icon.png | 0 smartthings-plugin/plugin/index.html | 75 + .../plugin/js/capability_modeSwitch.js | 68 + .../plugin/js/capability_motionSensor.js | 41 + .../plugin/js/capability_servoMotor.js | 110 ++ smartthings-plugin/plugin/js/index.js | 143 ++ smartthings-plugin/plugin/manifest.xml | 16 + smartthings-plugin/plugin/res/arrow_down.png | Bin 0 -> 2233 bytes smartthings-plugin/plugin/res/arrow_left.png | Bin 0 -> 2118 bytes smartthings-plugin/plugin/res/arrow_right.png | Bin 0 -> 2102 bytes smartthings-plugin/plugin/res/arrow_up.png | Bin 0 -> 2193 bytes .../plugin/res/board_ic_arrow_left.png | Bin 0 -> 603 bytes smartthings-plugin/plugin/res/controller_bg.png | Bin 0 -> 26417 bytes .../plugin/webfonts/fa-solid-900.ttf | Bin 0 -> 160548 bytes .../plugin/webfonts/fa-solid-900.woff | Bin 0 -> 86876 bytes .../plugin/webfonts/fa-solid-900.woff2 | Bin 0 -> 36708 bytes smartthings-plugin/prod-catalog.json | 4 + src/controller.c | 678 ++++++++ src/controller_image.c | 141 ++ src/controller_mv.c | 258 +++ src/exif.c | 305 ++++ src/motion.c | 184 +++ src/resource_camera.c | 488 ++++++ src/resource_servo_motor_sg90.c | 166 ++ src/servo-h.c | 205 +++ src/servo-v.c | 205 +++ src/st_thing_master.c | 271 ++++ src/st_thing_resource.c | 478 ++++++ src/switch.c | 181 +++ tizen-manifest.xml.in | 23 + update-dashboard.sh | 24 + 85 files changed, 9919 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 NOTICE create mode 100644 README.md create mode 100644 dashboard/default.gif create mode 100644 dashboard/public/css/style.css create mode 100644 dashboard/public/image/arrow-01.png create mode 100644 dashboard/public/image/arrow-02.png create mode 100644 dashboard/public/image/arrow-03.png create mode 100644 dashboard/public/image/arrow-04.png create mode 100644 dashboard/public/image/arrow-05.png create mode 100644 dashboard/public/image/arrow-06.png create mode 100644 dashboard/public/image/arrow-07.png create mode 100644 dashboard/public/image/arrow-08.png create mode 100644 dashboard/public/image/bg.png create mode 100644 dashboard/public/image/bullet.png create mode 100644 dashboard/public/image/image.png create mode 100644 dashboard/public/image/mobile.png create mode 100644 dashboard/public/image/shadow.png create mode 100644 dashboard/public/index.html create mode 100644 dashboard/public/js/app.js create mode 100644 dashboard/server.js create mode 100644 include/controller.h create mode 100644 include/controller_image.h create mode 100644 include/controller_mv.h create mode 100644 include/exif.h create mode 100644 include/log.h create mode 100644 include/motion.h create mode 100644 include/resource_camera.h create mode 100644 include/resource_servo_motor_sg90.h create mode 100644 include/servo-h.h create mode 100644 include/servo-type.h create mode 100644 include/servo-v.h create mode 100644 include/smartthings.h create mode 100644 include/smartthings_notification.h create mode 100644 include/smartthings_payload.h create mode 100644 include/smartthings_resource.h create mode 100644 include/st_thing_master.h create mode 100644 include/st_thing_resource.h create mode 100644 include/switch.h create mode 100755 install-and-start.sh create mode 100644 iot-vision-camera.manifest create mode 100644 lib/libst_thing_master_api.so create mode 100644 lib/libst_thing_resource_api.so create mode 100644 packaging/iot-dashboard.service create mode 100644 packaging/iot-vision-camera.spec create mode 100644 shared/res/default_icon.png create mode 100644 shared/res/master.json create mode 100644 shared/res/resource.json create mode 100644 smartthings-plugin/device-profile.json create mode 100644 smartthings-plugin/manifest/ui.json create mode 100644 smartthings-plugin/plugin/css/bulma-switch.min.css create mode 100644 smartthings-plugin/plugin/css/bulma.min.css create mode 100644 smartthings-plugin/plugin/css/helper.css create mode 100644 smartthings-plugin/plugin/icon.png create mode 100644 smartthings-plugin/plugin/index.html create mode 100644 smartthings-plugin/plugin/js/capability_modeSwitch.js create mode 100644 smartthings-plugin/plugin/js/capability_motionSensor.js create mode 100644 smartthings-plugin/plugin/js/capability_servoMotor.js create mode 100644 smartthings-plugin/plugin/js/index.js create mode 100644 smartthings-plugin/plugin/manifest.xml create mode 100644 smartthings-plugin/plugin/res/arrow_down.png create mode 100644 smartthings-plugin/plugin/res/arrow_left.png create mode 100644 smartthings-plugin/plugin/res/arrow_right.png create mode 100644 smartthings-plugin/plugin/res/arrow_up.png create mode 100644 smartthings-plugin/plugin/res/board_ic_arrow_left.png create mode 100644 smartthings-plugin/plugin/res/controller_bg.png create mode 100644 smartthings-plugin/plugin/webfonts/fa-solid-900.ttf create mode 100644 smartthings-plugin/plugin/webfonts/fa-solid-900.woff create mode 100644 smartthings-plugin/plugin/webfonts/fa-solid-900.woff2 create mode 100644 smartthings-plugin/prod-catalog.json create mode 100644 src/controller.c create mode 100644 src/controller_image.c create mode 100644 src/controller_mv.c create mode 100644 src/exif.c create mode 100644 src/motion.c create mode 100644 src/resource_camera.c create mode 100644 src/resource_servo_motor_sg90.c create mode 100644 src/servo-h.c create mode 100644 src/servo-v.c create mode 100644 src/st_thing_master.c create mode 100644 src/st_thing_resource.c create mode 100644 src/switch.c create mode 100644 tizen-manifest.xml.in create mode 100755 update-dashboard.sh diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..aaab0c4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,57 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) + +SET(CMAKE_VERBOSE_MAKEFILE 0) + +PROJECT(${P_NAME} C) +SET(INSTALL_EXEC_PREFIX "${INSTALL_PREFIX}/bin") +SET(PROJECT_ROOT_DIR "${CMAKE_SOURCE_DIR}") +SET(PROJECT_RESOURCES_DIR "${PROJECT_ROOT_DIR}/res") +SET(CMAKE_INSTALL_RPATH "${INSTALL_PREFIX}/lib") + +INCLUDE(FindPkgConfig) +pkg_check_modules(APP_PKGS REQUIRED + dlog + capi-appfw-service-application + capi-system-peripheral-io + capi-media-camera + capi-media-vision + capi-media-image-util + libtzplatform-config + glib-2.0 + gio-2.0 + ecore + rpc-port + libexif + capi-appfw-package-manager +) + +FOREACH (flag ${APP_PKGS_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + + +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden -Wall -Winline -g -fno-builtin-malloc -fPIE") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") + +LINK_DIRECTORIES(${PROJECT_ROOT_DIR}/lib) +SET(ST_API_LIBS st_thing_master_api st_thing_resource_api) + +INCLUDE_DIRECTORIES(${PROJECT_ROOT_DIR}/include) + +FILE(GLOB APP_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c) + +ADD_EXECUTABLE(${PROJECT_NAME} ${APP_SOURCE}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${APP_PKGS_LDFLAGS} -lm ${ST_API_LIBS}) + +CONFIGURE_FILE(${PROJECT_ROOT_DIR}/tizen-manifest.xml.in ${PROJECT_NAME}.xml @ONLY) + +# Install +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${INSTALL_EXEC_PREFIX}) +INSTALL(FILES ${PROJECT_NAME}.xml DESTINATION ${SYS_PACKAGES_DIR}) +INSTALL(DIRECTORY ${PROJECT_ROOT_DIR}/lib DESTINATION ${INSTALL_PREFIX}) +INSTALL(FILES ${PROJECT_ROOT_DIR}/shared/res/default_icon.png DESTINATION ${APP_SHARED_RES_DIR} RENAME ${PROJECT_NAME}.png) +INSTALL(DIRECTORY ${PROJECT_ROOT_DIR}/res DESTINATION ${INSTALL_PREFIX}) +INSTALL(FILES ${PROJECT_ROOT_DIR}/shared/res/master.json DESTINATION ${APP_SHARED_RES_DIR}) +INSTALL(FILES ${PROJECT_ROOT_DIR}/shared/res/resource.json DESTINATION ${APP_SHARED_RES_DIR}) +INSTALL(DIRECTORY ${PROJECT_ROOT_DIR}/dashboard DESTINATION ${DASH_BOARD_DIR}) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..90ce5ad --- /dev/null +++ b/LICENSE @@ -0,0 +1,203 @@ +Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Samsung Electronics Co., Ltd. + + 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. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..26a0552 --- /dev/null +++ b/NOTICE @@ -0,0 +1 @@ +Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved. diff --git a/README.md b/README.md new file mode 100644 index 0000000..68ff31a --- /dev/null +++ b/README.md @@ -0,0 +1,159 @@ +# IoT Vision App +Analyze images captured by USB camera and then move camera angle by using servo motors. + +## HOW TO RUN - First run + +### 1. Flash binary +Tizen 5.0 M2 IoT 부트 이미지 다운로드 [[링크](http://download.tizen.org/releases/milestone/tizen/unified/tizen-unified_20181024.1/images/standard/iot-boot-armv7l-artik533s/)] + +Tizen 5.0 M2 Iot Headed 이미지 다운로드 [[링크](http://download.tizen.org/releases/milestone/tizen/unified/tizen-unified_20181024.1/images/standard/iot-headed-3parts-armv7l-artik530_710/)] +``` +sudo minicom + thordown +lthor tizen-unified_20181024.1_iot-boot-armv7l-artik533s.tar.gz tizen-unified_20181024.1_iot-headed-3parts-armv7l-artik530_710.tar.gz +``` + +### 2. Install plug-in + +ARTIK 530(5.0) Plugin download from https://developer.samsung.com/tizendevice/firmware + + +### 3. Install Wifi util (*optional) +Tizen 5.0 M2 wifi-manager-tool 다운로드 [[링크](http://download.tizen.org/releases/milestone/tizen/unified/tizen-unified_20181024.1/repos/standard/packages/armv7l/capi-network-wifi-manager-tool-1.0.39-81.5.armv7l.rpm)] +``` +sdb root on; sdb shell 'mount -o remount,rw /' + +sdb push capi-network-wifi-manager-tool-1.0.39-81.5.armv7l.rpm /tmp + +sdb shell 'rpm -ivh /tmp/capi-network-wifi-manager-tool-1.0.39-81.5.armv7l.rpm' +``` + +### 4. Build and install custom version of IoT.js to include WebSocket feature +``` +git clone https://github.com/Samsung/iotjs.git + +cd iotjs + +sed -i 's/Release: 0/Release: 99/' config/tizen/packaging/iotjs.spec + +sed -i '/--no-parallel-build/a \ \ --cmake-param=-DENABLE_MODULE_WEBSOCKET=ON \\' config/tizen/packaging/iotjs.spec + +git diff config/tizen/packaging/iotjs.spec + +./config/tizen/gbsbuild.sh --clean + +sdb push ~/GBS-ROOT/local/repos/tizen_unified_m1/armv7l/RPMS/iotjs-1.0.0-9.0.armv7l.rpm /tmp + +sdb shell 'cd /tmp; rpm -ivh iotjs-1.0.0-9.0.armv7l.rpm' +``` +- https://github.com/Samsung/iotjs/wiki/Build-for-RPi3-Tizen +- https://github.com/Samsung/iotjs/blob/master/docs/api/IoT.js-API-WebSocket.md + + +### 5. Change camera setting +``` +sdb shell "cat /etc/multimedia/mmfw_camcorder_camera0.ini | grep 640" + +sdb shell "sed -i 's/640,480/320,240/g' /etc/multimedia/mmfw_camcorder_camera0.ini" + +sdb shell "cat /etc/multimedia/mmfw_camcorder_camera0.ini | grep 320" +``` + +### 6. Build and install vision app +``` +git clone git://git.tizen.org/apps/native/smart-surveillance-camera # This git + +cd smart-surveillance-camera + +gbs build -A armv7l --include-all + +sdb push ~/GBS-ROOT/local/BUILD-ROOTS/scratch.armv7l.0/home/abuild/rpmbuild/RPMS/armv7l/iot-vision-camera-0.0.1-1.armv7l.rpm /tmp + +sdb shell 'rpm -ivh --force /tmp/iot-vision-camera-0.0.1-1.armv7l.rpm' +``` +### 7. Some more settings +``` +sdb shell 'pkg_initdb' +``` +### 8. Launch vision app +``` +sdb shell 'app_launcher -s iot-vision-camera' +``` +### 9. Check vision app activity +``` +sdb shell 'ls -l /tmp/latest.jpg' +``` +### 10. Install and run monitor server +* If you install latest version of "iot-vision-camera" package, the monitor server is automatically launched in booting time + +* To check status of the monitor server + ``` + sdb shell 'systemctl status iot-dashboard' + ``` + +* To restart the monitor server + ``` + sdb shell 'systemctl stop iot-dashboard' + sdb shell 'systemctl start iot-dashboard' + sdb shell 'systemctl status iot-dashboard' # To check status + ``` + +* To update some files of the monitor server, push the files to dashboard path `/opt/home/dashboard` and restart the monitor server as above + ``` + sdb shell push {path/yourfile} /opt/home/dashboard/{path} + ``` +OR! YOU CAN SIMPLY USE THE SCRIPT: +``` +./update-dashboard.sh +``` + + +## HOW TO RUN - Subsequent Runs +``` +sdb root on; sdb shell 'mount -o remount,rw /' + +sdb shell 'app_launcher -s iot-vision-camera' + + ./update-dashboard.sh +``` + +## Profiling Data + +### 카메라의 물리적 이동시간 +슈퍼슬로우 카메라로 촬영결과 500ms 정도 소요 + +### Rpi + +#### Image Encoding (buffer -> jpg file) +소요시간 20 ~ 135ms (가끔씩 오래걸림, 장담 못함) + +#### Vision Survailance (input -> cb event) +소요시간 38 ~ 50ms + + +### Artik + +#### Image Encoding (buffer -> jpg file) +소요시간 10 ~ 20ms, 대부분 10ms 초반 안정적 + +#### Vision Survailance (input -> cb event) +소요시간 24 ~ 42ms + +## Vision 움직임 정보 형식 (exif) +최대 244Byte 크기의 스트링으로 모두 숫자로 이루어져있다. + +첫 2자리 숫자는 분석결과의 타입으로 TT 의 값을 갖는다. + +그 다음 2자리 숫자는 포함된 움직임의 갯수 NN 의 값을 갖는다. + +하나의 움직임은 8개 숫자로 구성되며 xxyywwhh 의 값을 갖는다. + +xx: x 상대 좌표 +yy: y 상대 좌표 +ww: 상대 넓이 +hh: 상대 높이 + +각각 0~99까지의 범위를 갖는 4개의 숫자를 이어놓은 것이다. +1자리 숫자의 경우 0을 넣어서 전체 길이를 고정한다. + +TTNNxxyywwhhxxyywwhh....xxyywwhh 의 형태의 스트링이 된다. diff --git a/dashboard/default.gif b/dashboard/default.gif new file mode 100644 index 0000000000000000000000000000000000000000..4818c1abf776b36c734981f7f00441d3d2a087b9 GIT binary patch literal 4568 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 z zc!Lc`f;xBwJV=3^=YtoBdkdI>?YDuaw|(-bee@@SVCa6*Fb!ZcnxK;WVDBd z6^DLA7tRiwNk2t%!|bXpFpqjNPa*%cyp_*oH#r zhUVCd(^!L$H-GF1i%ocp@EDIKGmj})kK|a11Gtaqn2-D@jQ)s-?Wm3TH<04Dhu_$T zD+rAViG})jj{6vl)|igOIFYefkrt_k%9xSMD315|k_;J>23US&F)tm_lilX*rXd=$HQpn3o8baVeKPd6;yWZ+B^ycS)6dS&064lyxYX z0hyD;bdd##nTCmwKzWv)*_cJykLoCq0LhhdR+%qXnDn@sXUUmS`I>6^n8Nv&TX}S2 zh)U}qkE*$wn+bq;37mS_m%|yE#aViqhMbF_oSCVSK**7;*_nC?n^!5F#95n@Ssiy| z98ZD(?Ae~~`JV6@pYs06o&!*y_IaQ9nVmVH1*%ZzL z01Voo4*H-F3IOvtp%f~g{CS}ms-FeAp&Uw}2bu!z15UgVp(I+O3|gTmilQ01q8Zwu zF6yEm3Jp&5EV5yuHu|6`nxpf{qCC2vFZ!be8lxt#JR+()H+rNxnxya9qfC0AK>DNs zDx{Awqu~M~M|z`5nxzQPq+AN6UTOeRIs%Y$noKe|R~n&Os-#@nq+bf9VJZS+s*{q_ zB4>)GX{w`Z%A{@jq;F~raayFmRi}1(rzx7JJ-Vkr+NWair?|;Bfg`95N~k$%s62|O zKdPu!fg%Yi6aJ41sS+xwDoUvp@EDp(rg8Ey zklLyh`l>A&s~l>oN>Qt+daJlvr@Bg^yb7znx}m`84yX#K5yz^>x}(X;pUcXuvkIpY zVyh={DS|q!)LN|?daWLst$w<#!`iLhdZyrNq2fBOR8GEmlQ4CLewJ3`XYvZWUstZ<&wP35VxUscC z!L2p$wPBmK5sRRIYS7a$Bda;U!qpwcENHbGx@k3Zfwjv~GL1!=bl)Teudh z8AJ-WOKWy%V<3k6xDJZAiOaG<+Zms60+5@z3_7I3Dz!>WwKR$rf1$aMORJ1Zxq&;U zxkCb^Te@QUtcnY|se8J<5dy9IxUUPlsJpncJGm@iUPM(%z-v=gnzWVsA8k9l8YR5S z3r|lJyKnosy6XbX3s1~jy|}cy(<{A#3%%HjOV|6oc?7+k+o)yRwk;sOj1<1=8%3V} zTfBH1y`gIZ?OR6dTfYT_zT11eA7Z>QfWJ3%zW^LSa6+X5%eX@@zy&100K5?fjIOw; z2nswv4BWo<;=jC`!4Uid6TAQwEWYW{F&<;KPN2XaT)larzw+C=f1AJne8R))7AoAm zQ@g($T)!}EUT8AIsvE&rfWw7k!8L-xva7*1?84uh!(WBGM7+XAY&Bny#6gV0mfOTM z%)RCN!_BM28pWwr+`~5u#b=Y{x#F zTsB3=W#q&g9L8X*y<@z`Q{2T*oW(VK#q+Dj;>5@Ki^a4H$;8UTsYFeVOu(Lb%&lDe zzVEfZg*?7-oSyM3#=T%hN_-5yyU2+g$j^()2N1xYOhB$o%H+$+2t3O<;K4zR%dOnY zlB}+G+zWP#%EOGufE>xZoXYT<%(N`Xip;_fJi?SL%p#n^qm0PR+`_)h%*8y(*Nn`` z+|8oQ$%kyr&P>eJY|h)v!kb*n(U8vGOwL6-&qs{Q;vCAGS_tqA% div { + display: inline-block; + height: 80px; + line-height: 80px; + text-align: center; + vertical-align: middle; + margin-right: 15px; +} + +.two-line { + line-height: 40px !important; +} + +#diagram-top { + margin: 15px 0 0 330px; +} + +#diagram-middle { + margin: 10px 0 0 30px; +} + +#diagram-bottom { + margin: 30px 0 0 335px; +} + +#diagram-right { + position: absolute; + top: 490px; + left: 1420px; +} + +#diagram-right > div { + position: absolute; +} + +.arrow-07 { + width: 129px; + height: 361px; + background: url("../image/arrow-07.png") center no-repeat; + margin: 15px 0 0 -20px; +} + +.arrow-08 { + width: 42px; + height: 85px; + background: url("../image/arrow-08.png") center no-repeat; + margin: 400px 0 0 280px; +} + +#mobile { + width: 131px; + height: 261px; + background: url("../image/mobile.png") center no-repeat; + margin: 100px 0 0 250px; + text-align: center; + color: #ffffff; + font: 800 18px 'arial'; +} + +#mobile-detection { + margin-top: 100px; +} + +.smaller-text { + font-size: 13px; + line-height: 10px; +} + +#mobile-caption { + margin-top: 120px; +} + +#camera-container { + position: absolute; + top: 5px; + left: 1100px; +} + +#camera-container > div, img { + position: absolute; +} + +#camera-view-bg { + z-index:-1; + width: 878px; + height: 658px; + background-image: url("../image/shadow.png"); +} + +#camera-view { + width: 640px; + height: 480px; + left: 90px; + top: 65px; + background-image: url("../image/image.png"); + outline: 5px solid #FBB03B; +} + +#camera-view-caption { + width: 878px; + top: 560px; + left: -15px; +} + +.image-caption { + color: #8FC2F2; + font: 800 15px 'arial'; + text-align: center; +} + +#canvas-container canvas { + z-index: 10; + position: absolute; + left: 90px; + top: 65px; +} + +#fps { + font-weight: 800; +} diff --git a/dashboard/public/image/arrow-01.png b/dashboard/public/image/arrow-01.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc0e1c5e76751d1c71d08b2860474c8558e571f GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^#z4%;!3HGfJBU04QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI21sKjISRuogTXn%4~!TIK2D7-Dhy?i53=LkMt^L71W0i4NN}AY#SIO%QjXRh8p5DFA_5e$2br|>U`ppY_%bqg! g?Xmut;a$b(>R}~V@_glCpsN`?UHx3vIVCg!0DNwDh5!Hn literal 0 HcmV?d00001 diff --git a/dashboard/public/image/arrow-02.png b/dashboard/public/image/arrow-02.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa654fbdbcc1ce53b95c35b630bc9961c485443 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^dO&Qe6%V8QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI21sKjISRuogTXn%4~!y6x%W7?N@C?G;--#z2YI zhu=FQ+E4YpaZD{OGhE@a=!)iFme%?H%_m$^OrA+w=GPW|zT^4KX_L|-dBMFM7naXm zCHKSm2g3`7>;(*Blh*k*+23LaPSAV#sm1-shP<4kWe1+rH5N~P(9h>^aaHukR7Rb~ z)Zb@w!%QFVa`@RC*Jx=lZ40Z$;qXarrK`N{pR>+j4EEf8J@)tQ=K3oyS@+bNpWv9! zVC;F^e{o5Hr|Z<%%Wh=uHMsS3j3^P6O>_%)r1c1j3A$?$-SQ3bL1Y`ns||;u7Yt=C_Rs2Aam0@9E+gl5y|ttleJDjv}tt zJ3ls-*=cbfR1$Dp)YR2$|B(L%_rC>mr#T&9kGgRy(#`Qva&$$$#N!z*&2xIrt$KE* zpndPTnV+1*CrM38^K9`7|52DAeB%?}H)X~Jj6Td;LzZ0-)Y!FOaE_{BYXK8)g4T-c zNze8$^Qj2DtUK9PexQ-%$DO~EQa!ovDOPiN%u=}bcT(>A3AU^arH}6FOTN?$Y4m)s zYsKq>H;oH|*F0~ue!n4*(b!s#+jF7A?K6FQn7=JH`Xd^tz^&pd_CbxiVlwNVlT7zg z81pwZm`5I%t@8j=xZdx9YQ+8O_TST)l$)3AS~4?*wLvr?{!*U)#8u^|?0Oip53E|k zy&yA9e%`j$)+No4lpDkfUQ5(p{?b>o3T{m z1BXdtv2ph84cq^UP5Rbw)Z>G(akZ9t@C*l&3N9x81Dpkt+;N}S;)PS3msdOe1Vxpn LtDnm{r-UW|{DshE literal 0 HcmV?d00001 diff --git a/dashboard/public/image/arrow-04.png b/dashboard/public/image/arrow-04.png new file mode 100644 index 0000000000000000000000000000000000000000..3304a30fa7ad6a9eaaa2b08610d981b83b70d272 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^&Opq=!3HEPk1(79QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI21sKjISRuol=56er8Tz{v0E;uzv_{Oz=}UQU4` zt@}$~wzo`CyR;;*MZ~31;F7RK?zP2Mxk5oKPJ&<9&MsH($Vg$6M;eH@yO`oTdLFo#r*1-fzVJ>`?vemRun% zLFO%!)ioko7;ouy{$|+6b75odB<}0m-fP6K?Vl7E6fWa^a-s#pqp<7*FZmrC?k0ci jU)QwKJzV5;Q6E2J&XO7}Cg=ECP*8fh`njxgN@xNAe2u5p literal 0 HcmV?d00001 diff --git a/dashboard/public/image/arrow-05.png b/dashboard/public/image/arrow-05.png new file mode 100644 index 0000000000000000000000000000000000000000..061d6f1d666f2e0e6d4657ef2dbe456b4970993c GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0y~yU^E1>`8e2sq`RH=5+KEr?&#~tz_78O`%fY(kgt&J z5#-CjP^HGe(9pub@Czu^@PdJ%)PRBERRRNp)eHs(@q#(K0&Rd2Y)RhkE%y{W;-5;PJdx@v7EBhlZVGe774MB0TKxb%px;TbZ+>1Em+t_7;==Fb-CIkIe}@1<$~Z=Xp@Gdk%Y zH#3n*Rz=funWtFnFVCRaD&1P~UeoKQTgUBT;6I>jAo)8{b?#D51NLj4(+;efGHIJ% zwDXw{lT4cY60b=lwM}25ydikT)ob%)55L}deD;3kb?mcN=s!qauyKjA^rzUDr?W%P zMcrE4sJj2qnuhqeNq%0sXS^n90`*7Q)BbIIq4Dc{^f zlPhvf<_W(RN}F_L^4f=6H-0^`FHtR%#k%!++#kl6p!jcp8UILkf1R+f&;H_XP#Al< L`njxgN@xNAPPV$Y literal 0 HcmV?d00001 diff --git a/dashboard/public/image/arrow-06.png b/dashboard/public/image/arrow-06.png new file mode 100644 index 0000000000000000000000000000000000000000..d0afbbfd19639af4a4cac3331cb15f966d12d159 GIT binary patch literal 513 zcmeAS@N?(olHy`uVBq!ia0y~yV7v)pbFcx)r}IVnffP%+qpu?a!^VE@KZ&eBzCyA` zkS_y6l^O#>Lkk1LFQ8Dv3kHT#0|tgy2@DKYGZ+}e3+C(!v;j)6C3(BM0BIoj>Abrh zNO2Z;L>4nJa0`Jj+Ky!ze5fp z$3DK7T<_qtXbETBf!0&!xL>5kR&ZQtwGN*pVDOMn%3eHI*-&?jsKkW-`Pa*qRpwuw zKJ#49m8Q4z-bUX(Z1$Id;YRwlcGthJx4taD^WkZ&r}(5(kA6+EN@QTzrZMIEfrW3) zJ^cj@XJwsDEJr@D6BAI+E9%#89YABudF&(*49aM)^gzufzmhipOnkNc{&E=RWP z5uB7_9c-t2$A2y`AglA%)ksweZCkH8cX=NNLqq+unG*^_w0aWeo_ty6WJoN54BNeCHZ6Fx*b~?Q_ZZ?BiQkk4_EUnPHJUAE`PDEnJP0tg`?yl{oE{s4%%XMa;`PkB(XCb{J6?K%V#Cwb&t;ucLK6VMImFKZ literal 0 HcmV?d00001 diff --git a/dashboard/public/image/arrow-07.png b/dashboard/public/image/arrow-07.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6b8f5d2997d28886b8ddb303b9d93362e559f4 GIT binary patch literal 1493 zcmeAS@N?(olHy`uVBq!ia0vp^jSLKonH+3D*6st|+(3#Y-O<;Pfnj4m_n$;oAYUQb zBgmJ5p-PQ`p`nF=;TKS-;RORjsR0ASs{{rHs~HRo;stYd1=;{5*pj^6U4S$Y{B+)3 z52QE?JR*x37`TN%nDNrxx<5cc_7YEDSN2C-!W`Cu$3yeF85mgAJY5_^DsH{KyU{Br zT;%w}|18TdlyCSZYh%|uGknJ+v$9D+Yc6Y+O-i@;#Z#UW936f8*dvZ*oQV^5mx+pO z+PD6UR8x!myV`3fPQLp4*Y?l>$^uR9q86_}KmCcUZs%70*a`xaYiKv78f8qa@kSc|LTEb8#tw%+gutr3Ji0S zXD*+erPgHkZFS>ghdt`Y7qfNpI7Lz5Dmqf8{@} z96yX?4gtnOu*Xh=JjMt2m=aS`t`FR6*N)}x0R^VaVjYqZk6tdAygVx*`9@2xqBAg9cSvm8cxH0B^y9n7csf7<2y#=l z=?1gBL$_uq0{JmKwDH(q#~rv6LZf@;3!ak0d&%3kdsbv$gl&g697Sf_PKY$n6n?Nt?88%VtmIE ztMl0;)L8J#$F))xe8_%V!FKJKZ-lfl%(@LA>rSItw-L=cTp^Hqr)8@lJOnQLnhHD0 z|Gs(v9Q=a72zc{kDcmFhM!mLNozEfrmN>E0PFcUYP)32t#Q_A@^mg6{Crx1DytShj z7{$A@o|z-3*Yj5ol(YN(m|WZ@!|q$L-LSJ<+E|GRn0PxlI+i#4?YX_f8lIRB@9y>7 zb9;s$FxXujVtA}8*TQ}5($JkKecC2A1Q;-dA-pJ|Hz%C=zO2c^-ORu|VeKe>+GZ{& z_zGiCRmFs&hH**MS(gj$lCW%}!~{wjx3dzU0drvPg6`CL%RrH}FBCNk@?Sl0YX@g` zGR!*JFpzbTsMgt_MQKR@(7NNLrUme@vymz2JypY(<*nZOjCN1 zydNI(dTn#}guorHq!6k5xg`9|yz8^yhJJcKUpu^h?XNBOa_aB@W&giMqkhZ6s@VK( z`|EzZah_ZZ{Ggv`EwGNKRap~ an6#hq=A`=*BkkG literal 0 HcmV?d00001 diff --git a/dashboard/public/image/arrow-08.png b/dashboard/public/image/arrow-08.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a9923063cf7eb9cea8c7db6166868f8f9b344d GIT binary patch literal 500 zcmeAS@N?(olHy`uVBq!ia0vp^T0k7i!3HGlx0m??DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G(@^*It(m?Rjd3QaK z;w5ryO!)y|};5?72~SheWy0`Q?5KSCR@Wy|V1zL{`_A_EBC7XZpU(by-?flJWJP zlgI&6?i?@qiyf;Ln|;;SIl=X|w|7NIKi}GW5gkkm7MU&W&v3aKIQtjBSW4@+V{Rd< z+}p!ew`w$4i`|%Fw@5J5J@=J;kh-SN#WYerkxeO(vEIhzkG`y%*v`=YGFTaq2a zGV+yf%`V!pXw&WcW&7^z`DbUbW@oZ=ig|qAJoWqQ7-VW)=iRNd^*R6THEZpO(AibL hO!9(%b-0DhmA7uPpEo~*?-VEkJYD@<);T3K0RZJKzbya& literal 0 HcmV?d00001 diff --git a/dashboard/public/image/bg.png b/dashboard/public/image/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8c14fd3d1b8fa778743cc1f0632d5fa7b8cb30 GIT binary patch literal 20074 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 CBAfsK literal 0 HcmV?d00001 diff --git a/dashboard/public/image/bullet.png b/dashboard/public/image/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..0b8edd50be60431b4d471deaa5e0ce912edd9333 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2?f>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?gFHN;HUHMdLYGF z;1OBOz`!j8!i<;h*8KqrvX^-Jy0Smw66UZL){N#~4isAA>EaloaenHhjk!#YA}tU5 z)gN=^2=17|%oJY8`haE5jv0q_1uiwJzRPlSDq~eEJP_@}@FVdQ&MBb@0A?F>pa1{> literal 0 HcmV?d00001 diff --git a/dashboard/public/image/image.png b/dashboard/public/image/image.png new file mode 100644 index 0000000000000000000000000000000000000000..7a7e3dc888bc8b83e1413ab4fbd4aa1f5320e066 GIT binary patch literal 1203 zcmV;k1WfyhP) z95AD$j2@gcetDsOYj9;@`Xr7NM@b-B2c8&!!8kC=0?|6~L%bEc7#xTs zV02)gV+t@hu+K387&U;WdjqXTm`!W#xQMt~QOUO#IB-xnN2-`<0t#)J2p zfd`coD+7-XyeZ(*{Q(;XI*=83aG(QMcY_Xe;GF}XwgQLO8P9X6vrdT5KXpFLTdy4G zKnFU|fev(_10CqVy92(R_0ommq?i6z{qo&6U3Ycg?5Y16{(M>Jy0dpNEcTC{Q1>xl zhQD7{pFS3@&v9TO5FF^h{~|ijfvmvFf$BhT;B5iHf%?E`1h{%3rV6kwI4xy+4^Dq< z0#+(1RtACt&wy~3!05mcSluTO95@2uPJz*Z-RdTI{gNREcB>h_abV}b*BliCadK4t z-M3kM{Wyy+^O!fB@^64(0Z6^R_~C&_y~h3Ff#i7>9vz6}xjt+Iqc{+Z1Cc(Z(1Qbk zK5LY5AjksIIuPiDH5ZQoW9+*UcU>t~?z+@c={6ORdCUzhg2O{^qArdnXj02JX{v?SN2m-gD;RK=t zFfjr_0=RHJ>NNh07niQB*~$PLE?^5XK;Qy`6cBiTtsJmn0fHP5IDjAt1Uj&l1vX?L z$O3^11Zg19fUP_bD8LpJfK55D1r6Xu;W`j>fKUnqEg+NuK@SKeK+pujb|B~iVJi?y zfu(m0nopp36n z06fd{0uaCeaO}ky@cOe9fp6V71-5HX(FG3i57_3ct`8Jh-GL5tpaUNr_!r|l)khhz R>KOn4002ovPDHLkV1oMC=|lhk literal 0 HcmV?d00001 diff --git a/dashboard/public/image/mobile.png b/dashboard/public/image/mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d0ce909e96a6bc89a5579672cde62dd6573fdb GIT binary patch literal 2227 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∨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 + + + + + + + + Tizen IoT + + + + + + + +

+
+
Tizen IoT
Smart Surveillance Camera
+
+
    +
  • Captures images continuously with a USB camera
  • +
  • Detects motion of objects in the images
  • +
  • Controls servomotors to follow the motion
  • +
  • Sends the images to connected web clients
  • +
  • Displays a live view of images in each web client
  • +
  • Sends motion info to SmartThings Cloud
  • +
  • Displays motion info on SmartThings Mobile App
  • +
  • TRY IT!You can manually control servomotors using the SmartThings Mobile App
  • +
+
+
+
+
+
Tizen IoT made in Craftroom
+
+
+
Peripheral IO
+
moving
+
Servomotor
+
+
+
Cameracapturing
+
+
Visionanalysing
+
+
IoT.js
+
live streaming (0 fps)
+
Web Client(this screen)
+
+
+
+
SmartThings SDK
+
transferring
+
SmartThings
Cloud
+
+
SmartThings
Mobile App
+
+
+
+
+
+
Motion
Detected
+
Mobile Device
+
+
+
+
+
+ +
+
+ +
Camera Live View
+
+
+ + + + + + + + + + diff --git a/dashboard/public/js/app.js b/dashboard/public/js/app.js new file mode 100644 index 0000000..554d58d --- /dev/null +++ b/dashboard/public/js/app.js @@ -0,0 +1,266 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +const IMG_WIDTH = 640; +const IMG_HEIGHT = 480; +const CANVAS_WIDTH = 640; +const CANVAS_HEIGHT = 480; + +window.onload = function(){ + var canvas; + var frame_timestamp = new Array(100); + var request_time; + var frame_number = 0; + + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function() { + var previewElement = document.getElementById('camera-view'); + + if (xhr.readyState === 4) { + update_fps(); + // console.log(JSON.stringify(frame_timestamp)); + + var latencyTag = document.getElementById('latency'); + if (latencyTag != null) + latencyTag.innerHTML = 'latency: ' + (Date.now() - request_time) + ' ms'; + + previewElement.src = xhr.response; + } + }; + + canvas = new Canvas("camera-view-canvas"); + + runWebSocket(); + + function update_fps() { + frame_timestamp[frame_number] = Date.now(); + var fpsTag = document.getElementById('fps'); + if (fpsTag != null) + fpsTag.innerHTML = JSON.stringify(fps()); + if (++frame_number == frame_timestamp.length) frame_number = 0; + } + + function fps() { + var i = frame_number; + var now = Date.now(); + do { // backtrace to find the frame 1000 milliseconds before + if (now - frame_timestamp[i] >= 1000) { + var fps = frame_number - i; + if (fps < 0) + fps += frame_timestamp.length; + return fps; + } + if (--i < 0) // wrap around to the last slot in the array + i = frame_timestamp.length - 1; + } while (i != frame_number) + } + + function runWebSocket() { + // var wsUri = "ws://192.168.1.211:8888/"; + var wsUri = "ws://" + window.location.hostname + ":8888/"; + + websocket = new WebSocket(wsUri); + websocket.onopen = function(evt) { onOpen(evt) }; + websocket.onclose = function(evt) { onClose(evt) }; + websocket.onmessage = function(evt) { onMessage(evt) }; + websocket.onerror = function(evt) { onError(evt) }; + + // // polling + // setInterval(function() { + // // console.log('hey!'); + // xhr.open('POST', '/requestImage' , true); + // xhr.send(); + // request_time = Date.now(); + // // console.log('update image'); + // }, 100); + } + + function onOpen(evt) + { + writeToScreen("CONNECTED"); + doSend("HELLO FROM BROWSER via WebSocket!!!!!!!!!!!!"); + } + + function onClose(evt) + { + writeToScreen("DISCONNECTED"); + } + + function onMessage(evt) + { + // writeToScreen('RESPONSE: ' + evt.data+''); + + var urlCreator = window.URL || window.webkitURL; + var imageUrl = urlCreator.createObjectURL(evt.data); + document.querySelector("#camera-view").src = imageUrl; + update_fps(); + + var arrayBuffer; + var fileReader = new FileReader(); + fileReader.onload = function(event) { + arrayBuffer = event.target.result; + var exif = EXIF.readFromBinaryFile(arrayBuffer); + var exifInfoString = asciiToStr(exif.UserComment, 8); + var type = 'blur'; + if (getResultType(exifInfoString) != 0) { + type = 'active'; + } + + var pointArray = getPointArrayFromString(exifInfoString.slice(4)); + + if (pointArray.length <= 0) { + document.querySelector("#mobile-detection").innerHTML = "No
Motion"; + } else { + document.querySelector("#mobile-detection").innerHTML = "Motion
Detected"; + } + + canvas.clearPoints(); + canvas.drawPoints(pointArray, type); + }; + fileReader.readAsArrayBuffer(evt.data); + + doSend("ack", true); + + // websocket.close(); + + // var reader = new FileReader(); + // reader.readAsDataURL(evt.data); + // reader.onloadend = function() { + // base64data = reader.result; + // var previewElement = document.getElementById('camera-view'); + // previewElement.src = base64data; + // update_fps(); + // } + } + + function onError(evt) + { + writeToScreen('ERROR: ' + evt.data); + } + + function doSend(message, dont_print_log) + { + websocket.send(message); + if (!dont_print_log) + writeToScreen("SENT: " + message); + } + + function writeToScreen(message) + { + var output = document.getElementById("output"); + if (output == null) + return; + var pre = document.createElement("p"); + pre.style.wordWrap = "break-word"; + pre.innerHTML = message; + output.appendChild(pre); + } + + function asciiToStr(asciiArr, start) { + var string = ""; + var i = start; + + for (; i < asciiArr.length; i++) { + string += String.fromCharCode(asciiArr[i]); + } + + return string; + } + + function getResultType(str) { + return Number(str.slice(0, 2)); + } + + function getPointArrayFromString(pointStr) { + var strLen = pointStr.length; + var i = 0; + var pointArray = []; + + while (i < strLen) { + pointArray.push(pointStr.slice(i, i + 8)); + i += 8; + } + + return pointArray; + } + + var step = 0 + const total_steps = 8 + setInterval(function() { + for (var i = 0; i < total_steps; i++) { + var className = '.step' + (i + 1); + $('li' + className).removeClass('blink'); + $('.d-text-tizen' + className).removeClass('blink'); + $('.d-text-st' + className).removeClass('blink'); + $('.arrow' + className).removeClass('blink'); + $('.try-it-bullet').removeClass('shake-it'); + } + var className = '.step' + (step + 1); + $('li' + className).addClass('blink'); + $('.d-text-tizen' + className).addClass('blink'); + $('.d-text-st' + className).addClass('blink'); + $('.arrow' + className).addClass('blink'); + if (step == 7) + $('.try-it-bullet').addClass('shake-it'); + step = ++step % total_steps; + }, 4000); +}; + +function Canvas(canvasId) { + this.viewCanvas = document.getElementById(canvasId); + this.viewContext = this.viewCanvas.getContext("2d"); +} + +Canvas.prototype.clearCanvas = function() { + this.viewContext.clearRect(0,0, CANVAS_WIDTH, CANVAS_HEIGHT); +} + +Canvas.prototype.clearPoints = function () { + this.clearCanvas(); +} + +Canvas.prototype.drawRect = function(x, y, width, height, color) { + this.viewContext.beginPath(); + this.viewContext.moveTo(x, y); + this.viewContext.lineTo(x, y + height); + this.viewContext.lineTo(x + width, y + height); + this.viewContext.lineTo(x + width, y); + this.viewContext.closePath(); + this.viewContext.lineWidth = 3; + this.viewContext.strokeStyle = color; + this.viewContext.stroke(); +} + +Canvas.prototype.drawPoints = function (pointArray, type) { + var i = 0; + var x, y, w, h; + var color; + + if (type == 'blur') { + color = "rgba(115,232,57,0.8)"; + } else { + color = "rgba(255,0,0, 0.8)"; + } + + for (i = 0; i < pointArray.length; i++) { + x = IMG_WIDTH / 99 * parseInt(pointArray[i].slice(0,2)); + y = IMG_HEIGHT / 99 * parseInt(pointArray[i].slice(2,4)); + w = IMG_WIDTH / 99 * parseInt(pointArray[i].slice(4,6)); + h = IMG_HEIGHT / 99 * parseInt(pointArray[i].slice(6,8)); + + this.drawRect(x, y, w, h, color); + } +} diff --git a/dashboard/server.js b/dashboard/server.js new file mode 100644 index 0000000..a5720f1 --- /dev/null +++ b/dashboard/server.js @@ -0,0 +1,124 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +var fs = require('fs'); +var http = require('http'); + +function extractPath(url) { + var urlParts = url.split('/'), + i = 0, + l = urlParts.length, + result = []; + for (; i < l; ++i) { + if (urlParts[i].length > 0) { + result.push(urlParts[i]); + } + } + return result; +} + +http.createServer(function(req, res) { + req.on('end', function() { + var path = extractPath(req.url); + console.log(req.url) + // var last = path[path.length - 1]; + if (path[0] === undefined) { + res.writeHead(200); + res.end(fs.readFileSync('public/index.html')); + } else if (path[0] == 'test') { + res.writeHead(200); + res.end(fs.readFileSync('public/test.html')); + } else if (req.url == '/js/app.js') { + res.writeHead(200); + res.end(fs.readFileSync('public/js/app.js')); + } else if (req.url == '/css/style.css') { + res.writeHead(200); + res.end(fs.readFileSync('public/css/style.css')); + } else { + res.setHeader('Location', 'http://download.tizen.online/smart-surveillance' + req.url); + res.writeHead(302); + res.end(); + console.log('33333'); + } + }); +}).listen(9090); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +var ENABLE_WEBSOCKET = true; + +if (ENABLE_WEBSOCKET) { + + var websocket = require('websocket'); + + var options = { + port: 8888 + } + + var server = new websocket.Server(options, Listener); + + function Listener(ws) { + console.log('Client connected: handshake done!'); + ws.ack = true; + ws.on('message', function (msg) { + console.log('Message received: %s', msg.toString()); + // ws.send(msg.toString(), {mask: true, binary: false}); //echo + // ws.send('Received: ' + msg.toString()); //echo + // server.close(); + ws.ack = true; + }); + ws.on('ping', function (msg) { + console.log('Ping received: %s', msg.toString()); + }); + ws.on('error', function (msg) { + console.log('Error: %s', msg.toString()); + }); + + var i = 0; + var prev = 0; + var timeout = setInterval(function() { + if (!ws.ack) + return false; + var now = Date.now(); + var data; + try { + data = fs.readFileSync('/tmp/latest.jpg'); + } catch (err) { + data = fs.readFileSync('/opt/home/dashboard/default.gif'); + } + ws.send(data, {mask: false, binary: true}); + console.log(`Sending frame(${i++}), interval(${now - prev} ms)`); + // server.broadcast(data, {mask: false, binary: true}); + // server.broadcast(`HELLO TO ALL FROM IoT.js!!! (${i++}, ${now - prev})`); + prev = now; + ws.ack = false; + }, 1000 / 15.0); + + ws.on('close', function (msg) { + console.log('Client close: ' + msg.reason + ' (' + msg.code + ')'); + clearInterval(timeout); + }); + }; + + server.on('error', function (msg) { + console.log('Error: %s', msg.toString()); + }); + + server.on('close', function (msg) { + console.log('Server close: ' + msg.reason + ' (' + msg.code + ')'); + }); + +} diff --git a/include/controller.h b/include/controller.h new file mode 100644 index 0000000..571f998 --- /dev/null +++ b/include/controller.h @@ -0,0 +1,41 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __CONTROLLER_H__ +#define __CONTROLLER_H__ + +#define MV_RESULT_COUNT_MAX 30 +#define MV_RESULT_LENGTH_MAX (MV_RESULT_COUNT_MAX * 4) //4(x, y, w, h) * COUNT +#define IMAGE_INFO_MAX ((8 * MV_RESULT_LENGTH_MAX) + 4) + +#define IMAGE_WIDTH 320 +#define IMAGE_HEIGHT 240 +#define CAMERA_IMAGE_QUALITY 100 //1~100 +#define CAMERA_PREVIEW_INTERVAL_MIN 50 + +//카메라와 모터에 따라 최적화 필요한 값 -------------------------------- +#define SERVO_MOTOR_VERTICAL_MIN 20 +#define SERVO_MOTOR_VERTICAL_MAX 45 +#define SERVO_MOTOR_VERTICAL_CENTER ((SERVO_MOTOR_VERTICAL_MIN + SERVO_MOTOR_VERTICAL_MAX) / 2) +#define SERVO_MOTOR_HORIZONTAL_MIN 30 +#define SERVO_MOTOR_HORIZONTAL_MAX 75 +#define SERVO_MOTOR_HORIZONTAL_CENTER ((SERVO_MOTOR_HORIZONTAL_MIN + SERVO_MOTOR_HORIZONTAL_MAX) / 2) + +// 70CM 앞 물체가 화면의 서보모터 이동단위(1/20) 만큼 이동에 필요한 값 (실측) +#define SERVO_MOTOR_VERTICAL_STEP 1 +#define SERVO_MOTOR_HORIZONTAL_STEP 1.25 + +#endif diff --git a/include/controller_image.h b/include/controller_image.h new file mode 100644 index 0000000..75e5e8e --- /dev/null +++ b/include/controller_image.h @@ -0,0 +1,27 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __CONTROLLER_IMAGE_H__ +#define __CONTROLLER_IMAGE_H__ + +void controller_image_initialize(void); +void controller_image_finalize(void); +int controller_image_save_image_file(const char *path, + unsigned int width, unsigned int height, const unsigned char *buffer, + const char *comment, unsigned int comment_len); +int controller_image_read_image_file(const char *path, + unsigned int *width, unsigned int *height, unsigned char *buffer, unsigned long long *size); +#endif diff --git a/include/controller_mv.h b/include/controller_mv.h new file mode 100644 index 0000000..3b9b20f --- /dev/null +++ b/include/controller_mv.h @@ -0,0 +1,30 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __CONTROLLER_MV_H__ +#define __CONTROLLER_MV_H__ +#include + +typedef void (*movement_detected_cb)(int horizontal, int vertical, int result[], int result_count, void *user_data); + +mv_source_h controller_mv_create_source( + unsigned char *buffer, unsigned int size, + unsigned int width, unsigned int height, mv_colorspace_e colorspace); +void controller_mv_push_source(mv_source_h source); +int controller_mv_set_movement_detection_event_cb(movement_detected_cb movement_detected_cb, void *user_data); +void controller_mv_unset_movement_detection_event_cb(void); + +#endif diff --git a/include/exif.h b/include/exif.h new file mode 100644 index 0000000..5559187 --- /dev/null +++ b/include/exif.h @@ -0,0 +1,29 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __APP_EXIF_H__ +#define __APP_EXIF_H__ + +/* CAUTION + * This function is only for adding exif with user comment + * to JPEG which has No existing exif data !!! + */ +int exif_write_jpg_file_with_comment(const char *output_file, + const unsigned char *jpg_data, unsigned int jpg_size, + unsigned int jpg_width, unsigned int jpg_height, + const char *comment, unsigned int comment_len); + +#endif /* __APP_EXIF_H__ */ diff --git a/include/log.h b/include/log.h new file mode 100644 index 0000000..faf335a --- /dev/null +++ b/include/log.h @@ -0,0 +1,94 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __LOG_H__ +#define __LOG_H__ + +#include +#include + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "SIV" + +#if !defined(_D) +#define _D(fmt, arg...) dlog_print(DLOG_DEBUG, LOG_TAG, "[%s][%s:%d] " fmt "\n", rindex(__FILE__, '/') + 1, __func__, __LINE__, ##arg) +#endif + +#if !defined(_I) +#define _I(fmt, arg...) dlog_print(DLOG_INFO, LOG_TAG, "[%s][%s:%d] " fmt "\n", rindex(__FILE__, '/') + 1, __func__, __LINE__, ##arg) +#endif + +#if !defined(_W) +#define _W(fmt, arg...) dlog_print(DLOG_WARN, LOG_TAG, "[%s][%s:%d] " fmt "\n", rindex(__FILE__, '/') + 1, __func__, __LINE__, ##arg) +#endif + +#if !defined(_E) +#define _E(fmt, arg...) dlog_print(DLOG_ERROR, LOG_TAG, "[%s][%s:%d] " fmt "\n", rindex(__FILE__, '/') + 1, __func__, __LINE__, ##arg) +#endif + +#define retvm_if(expr, val, fmt, arg...) do { \ + if (expr) { \ + _E(fmt, ##arg); \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + return val; \ + } \ +} while (0) + +#define retv_if(expr, val) do { \ + if (expr) { \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ +} while (0) + +#define retm_if(expr, fmt, arg...) do { \ + if (expr) { \ + _E(fmt, ##arg); \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + return; \ + } \ +} while (0) + +#define ret_if(expr) do { \ + if (expr) { \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + return; \ + } \ +} while (0) + +#define goto_if(expr, val) do { \ + if (expr) { \ + _E("(%s) -> goto", #expr); \ + goto val; \ + } \ +} while (0) + +#define break_if(expr) { \ + if (expr) { \ + _E("(%s) -> break", #expr); \ + break; \ + } \ +} + +#define continue_if(expr) { \ + if (expr) { \ + _E("(%s) -> continue", #expr); \ + continue; \ + } \ +} +#endif diff --git a/include/motion.h b/include/motion.h new file mode 100644 index 0000000..8acd48c --- /dev/null +++ b/include/motion.h @@ -0,0 +1,29 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __MOTION_H__ +#define __MOTION_H__ + +typedef void(*motion_state_changed_cb) (int state, void* user_data); + +int motion_initialize(void); +int motion_finalize(void); +int motion_state_set(int state, const char *pass_key); +int motion_state_get(int *state); +int motion_state_changed_cb_set( + const char *callback_key, motion_state_changed_cb callback, void *cb_data); + +#endif /* __MOTION_H__ */ diff --git a/include/resource_camera.h b/include/resource_camera.h new file mode 100644 index 0000000..8316c97 --- /dev/null +++ b/include/resource_camera.h @@ -0,0 +1,37 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __RESOURCE_CAMERA_H__ +#define __RESOURCE_CAMERA_H__ + +typedef struct __image_buffer_data_s { + unsigned char *buffer; + unsigned int buffer_size; + unsigned int image_width; + unsigned int image_height; + camera_pixel_format_e format; + void *user_data; +} image_buffer_data_s; + +typedef void (*preview_image_buffer_created_cb)(void *buffedata); +typedef void (*capture_completed_cb)(const void *image, unsigned int size, void *user_data); + +int resource_camera_init(preview_image_buffer_created_cb preview_image_buffer_created_cb, void *user_data); +int resource_camera_start_preview(void); +int resource_camera_capture(capture_completed_cb capture_completed_cb, void *data); +void resource_camera_close(void); + +#endif diff --git a/include/resource_servo_motor_sg90.h b/include/resource_servo_motor_sg90.h new file mode 100644 index 0000000..724eab8 --- /dev/null +++ b/include/resource_servo_motor_sg90.h @@ -0,0 +1,40 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __RESOURCE_SERVO_MOTOR_SG90_H__ +#define __RESOURCE_SERVO_MOTOR_SG90_H__ + +void resource_close_servo_motor(int channel); + +/** + * This module is sample codes to handling Servo motors in Tizen platform. + * Hardware is configured with SG90, + * @param[in] channel + * @param[in] duty_cycle_ms + * @return 0 on success, otherwise a negative error value + */ +int resource_set_servo_motor_sg90_value(int channel, double duty_cycle_ms); + +/** + * This module is sample codes to handling Servo motors in Tizen platform. + * Hardware is configured with SG90, + * @param[in] channel + * @param[in] percent + * @return 0 on success, otherwise a negative error value + */ +int resource_rotate_servo_motor_by_percent(int channel, double percent); + +#endif /* __RESOURCE_SERVO_MOTOR_SG90_H__ */ diff --git a/include/servo-h.h b/include/servo-h.h new file mode 100644 index 0000000..d9c5517 --- /dev/null +++ b/include/servo-h.h @@ -0,0 +1,29 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SERVO_H_H__ +#define __SERVO_H_H__ + +#include "servo-type.h" + +int servo_h_initialize(void); +int servo_h_finalize(void); +int servo_h_state_set(double value, const char *pass_key); +int servo_h_state_get(double *value); +int servo_h_state_changed_cb_set( + const char *callback_key, servo_state_changed_cb callback, void *cb_data); + +#endif /* __SERVO_H_H__ */ diff --git a/include/servo-type.h b/include/servo-type.h new file mode 100644 index 0000000..78ed7d2 --- /dev/null +++ b/include/servo-type.h @@ -0,0 +1,22 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SERVO_TYPE_H__ +#define __SERVO_TYPE_H__ + +typedef void(*servo_state_changed_cb) (double value, void* user_data); + +#endif /* __SERVO_TYPE_H__ */ diff --git a/include/servo-v.h b/include/servo-v.h new file mode 100644 index 0000000..80e3e23 --- /dev/null +++ b/include/servo-v.h @@ -0,0 +1,29 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SERVO_V_H__ +#define __SERVO_V_H__ + +#include "servo-type.h" + +int servo_v_initialize(void); +int servo_v_finalize(void); +int servo_v_state_set(double value, const char *pass_key); +int servo_v_state_get(double *value); +int servo_v_state_changed_cb_set( + const char *callback_key, servo_state_changed_cb callback, void *cb_data); + +#endif /* __SERVO_V_H__ */ diff --git a/include/smartthings.h b/include/smartthings.h new file mode 100644 index 0000000..f1b6edc --- /dev/null +++ b/include/smartthings.h @@ -0,0 +1,1658 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_H__ +#define __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup CAPI_SMARTTHINGS_THING_MASTER_MODULE + * @{ + */ + +/** + * @brief Definition for the max length of SSID for access point. + * @since_ses 1 + */ +#define SMARTTHINGS_SSID_LEN_MAX 32 + +/** + * @brief Definition for the max length of cloud information. + * @since_ses 1 + */ +#define SMARTTHINGS_CLOUD_INFO_LEN_MAX 128 + +/** + * @brief Enumeration for the SmartThings error. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */ + SMARTTHINGS_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */ + SMARTTHINGS_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */ + SMARTTHINGS_ERROR_PERMISSION_DENIED = TIZEN_ERROR_PERMISSION_DENIED, /**< Permission denied */ + SMARTTHINGS_ERROR_NO_DATA = TIZEN_ERROR_NO_DATA, /**< No data */ + SMARTTHINGS_ERROR_NOT_SUPPORTED = TIZEN_ERROR_NOT_SUPPORTED, /**< Not supported */ + SMARTTHINGS_ERROR_OPERATION_FAILED = TIZEN_ERROR_UNKNOWN - 1, /**< Operation failed */ + SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE = TIZEN_ERROR_UNKNOWN -2 /**< Service unavailable */ +} smartthings_error_e; + +/** + * @brief Enumeration for SmartThings status. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_STATUS_NOT_READY = -1, /**< Service agent is not ready */ + SMARTTHINGS_STATUS_INIT = 0, /**< Initial state of SmartThings Thing */ + SMARTTHINGS_STATUS_ES_STARTED, /**< Easy-setup is started */ + SMARTTHINGS_STATUS_ES_DONE, /**< Easy-setup is done */ + SMARTTHINGS_STATUS_ES_FAILED_ON_OWNERSHIP_TRANSFER, /**< Easy-setup failed due to Ownership-Transfer failure */ + SMARTTHINGS_STATUS_CONNECTING_TO_AP, /**< Connecting to target Wi-Fi access point */ + SMARTTHINGS_STATUS_CONNECTED_TO_AP, /**< Connected to target Wi-Fi access point */ + SMARTTHINGS_STATUS_CONNECTING_TO_AP_FAILED, /**< Failed to connect to target Wi-Fi access point */ + SMARTTHINGS_STATUS_REGISTERING_TO_CLOUD, /**< Trying to sign up, sign in and publish resources to cloud */ + SMARTTHINGS_STATUS_REGISTERED_TO_CLOUD, /**< Publish resources to cloud is complete. Now the thing is ready to be controlled via cloud */ + SMARTTHINGS_STATUS_REGISTERING_FAILED_ON_SIGN_IN, /**< Failed to sign in to cloud */ + SMARTTHINGS_STATUS_REGISTERING_FAILED_ON_PUB_RES /**< Failed to publish resources to cloud */ +} smartthings_status_e; + +/** + * @brief Enumeration for RPC connection status. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_CONNECTION_STATUS_CONNECTED = 0, /**< Connection is connected */ + SMARTTHINGS_CONNECTION_STATUS_DISCONNECTED, /**< Connection is disconnected */ + SMARTTHINGS_CONNECTION_STATUS_REJECTED, /**< Connection is rejected */ +} smartthings_connection_status_e; + +/** + * @brief The Wi-Fi mode. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_WIFI_MODE_11A = (1 << 0), /**< Wi-Fi 11A */ + SMARTTHINGS_WIFI_MODE_11B = (1 << 1), /**< Wi-Fi 11B */ + SMARTTHINGS_WIFI_MODE_11G = (1 << 2), /**< Wi-Fi 11G */ + SMARTTHINGS_WIFI_MODE_11N = (1 << 3), /**< Wi-Fi 11N */ + SMARTTHINGS_WIFI_MODE_11AC = (1 << 4) /**< Wi-Fi 11AC */ +} smartthings_wifi_mode_e; + +/** + * @brief The Wi-Fi frequency band. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_WIFI_FREQ_24G = (1 << 0), /**< Wi-Fi 2.4GHz */ + SMARTTHINGS_WIFI_FREQ_5G = (1 << 1), /**< Wi-Fi 5GHz */ +} smartthings_wifi_freq_e; + +/** + * @brief The Wi-Fi authentication type of access point. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_WIFI_AUTHTYPE_NONE = 0, /**< No authentication */ + SMARTTHINGS_WIFI_AUTHTYPE_WEP, /**< WEP */ + SMARTTHINGS_WIFI_AUTHTYPE_WPA_PSK, /**< WPA-PSK */ + SMARTTHINGS_WIFI_AUTHTYPE_WPA2_PSK /**< WPA2-PSK */ +} smartthings_wifi_authtype_e; + +/** + * @brief The Wi-Fi encryption type of access point. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_WIFI_ENCTYPE_NONE = 0, /**< No encryption */ + SMARTTHINGS_WIFI_ENCTYPE_WEP_64, /**< WEP 64 */ + SMARTTHINGS_WIFI_ENCTYPE_WEP_128, /**< WEP 128 */ + SMARTTHINGS_WIFI_ENCTYPE_TKIP, /**< TKIP */ + SMARTTHINGS_WIFI_ENCTYPE_AES, /**< AES */ + SMARTTHINGS_WIFI_ENCTYPE_TKIP_AES /**< TKIP/AES */ +} smartthings_wifi_enctype_e; + +/** + * @brief The SmartThings handle. + * @since_ses 1 + */ +typedef struct smartthings_s *smartthings_h; + +/** + * @brief The access point information handle. + * @since_ses 1 + */ +typedef struct smartthings_ap_info_s *smartthings_ap_info_h; + +/** + * @brief The device provisioning information handle. + * @since_ses 1 + */ +typedef struct smartthings_device_prov_info_s *smartthings_device_prov_info_h; + +/** + * @brief The cloud information handle for cloud sign-up. + * @since_ses 1 + */ +typedef struct smartthings_cloud_info_s *smartthings_cloud_info_h; + +/** + * @brief The access point list handle. + * @since_ses 1 + */ +typedef struct smartthings_ap_list_s *smartthings_ap_list_h; + +/** + * @brief Callback for status of connection to SmartThings Thing agent. + * @details The following error codes can be received: \n + #SMARTTHINGS_ERROR_NONE: Success \n + #SMARTTHINGS_ERROR_PERMISSION_DENIED: Permission denied \n + #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE: Service unavailable \n + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can see result as #smartthings_error_e enumeration value. + * @remarks When callback is called, user can see connection status as #smartthings_connection_status_e enumeration value. + * + * @param[in] result The result of connection operation + * @param[in] handle The SmartThings handle + * @param[in] status The status of connection + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_initialize() + */ +typedef void (*smartthings_connection_status_cb)(smartthings_error_e result, smartthings_h handle, smartthings_connection_status_e status, void *user_data); + +/** + * @brief Callback for SmartThings Thing status. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can see SmartThings status as #smartthings_status_e enumeration value. + * + * @param[in] handle The SmartThings handle + * @param[in] status The status of SmartThings + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_status_changed_cb() + * @see smartthings_unset_status_changed_cb() + */ +typedef void (*smartthings_status_changed_cb)(smartthings_h handle, smartthings_status_e status, void *user_data); + +/** + * @brief Callback for getting user's input regarding mutual verification. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can send a confirmation for mutual verification as true or false. + * + * @param[in] handle The SmartThings handle + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_user_confirm_cb() + * @see smartthings_unset_user_confirm_cb() + */ +typedef void (*smartthings_user_confirm_cb)(smartthings_h handle, void *user_data); + +/** + * @brief Callback for getting user's opinion regarding device reset. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can sends a confirmation for reset as true or false. + * + * @param[in] handle The SmartThings handle + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_reset_confirm_cb() + * @see smartthings_unset_reset_confirm_cb() + */ +typedef void (*smartthings_reset_confirm_cb)(smartthings_h handle, void *user_data); + +/** + * @brief Callback for result of reset operation. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can check reset operation succeeds or fails. + * + * @param[in] handle The SmartThings handle + * @param[in] result The result of reset + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_reset_result_cb() + * @see smartthings_unset_reset_result_cb() + */ +typedef void (*smartthings_reset_result_cb)(smartthings_h handle, bool result, void *user_data); + +/** + * @brief Callback for carrying the randomly generated PIN information. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks The @a pin can be used only in the callback. To use outside, make a copy. + * @remarks When callback is called, user can see PIN value and length. + * + * @param[in] handle The SmartThings handle + * @param[in] pin The PIN data in string format + * @param[in] size The PIN length of @a pin + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_pin_cb() + * @see smartthings_unset_pin_cb() + */ +typedef void (*smartthings_pin_generated_cb)(smartthings_h handle, const char* pin, size_t size, void *user_data); + +/** + * @brief Callback for informing the application to close the PIN display. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can know PIN based ownership transfer is finished. + * + * @param[in] handle The SmartThings handle + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_pin_cb() + * @see smartthings_unset_pin_cb() + */ +typedef void (*smartthings_pin_display_close_cb)(smartthings_h handle, void *user_data); + +/** + * @brief Callback for informing Wi-Fi AP information to connect. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks The @a ap_info_h should not be released. + * @remarks The @a ap_info_h will be released when smartthings_unset_wifi_ap_provisioning_cb() is called. + * @remarks When callback is called, user can get Wi-Fi provisioning information. + * + * @param[in] handle The SmartThings handle + * @param[in] ap_info_h The AP information handle + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_wifi_ap_provisioning_cb() + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +typedef void (*smartthings_wifi_ap_provisioning_cb)(smartthings_h handle, smartthings_ap_info_h ap_info_h, void *user_data); + +/** + * @brief Callback for informing device provisioning information. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks The @a dev_prov_h should not be released. + * @remarks The @a dev_prov_h will be released when smartthings_unset_device_provisioning_cb() is called. + * @remarks When callback is called, user can get device provisioning information. + * + * @param[in] handle The SmartThings handle + * @param[in] dev_prov_h The device provisioning information handle + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_device_provisioning_cb() + * @see smartthings_unset_device_provisioning_cb() + */ +typedef void (*smartthings_device_provisioning_cb)(smartthings_h handle, smartthings_device_prov_info_h dev_prov_h, void *user_data); + +/** + * @brief Callback for informing the scan AP list request. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user scans access points, sets AP list and sends it to agent. + * + * @param[in] handle The SmartThings handle + * @param[in] req_id The request ID + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_scan_ap_cb() + * @see smartthings_unset_scan_ap_cb() + */ +typedef void (*smartthings_scan_ap_cb)(smartthings_h handle, int req_id, void *user_data); + +/** + * @brief Callback for informing the stop soft AP request. + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user stops soft AP. + * + * @param[in] handle The SmartThings handle + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_set_stop_soft_ap_cb() + * @see smartthings_unset_stop_soft_ap_cb() + */ +typedef void (*smartthings_stop_soft_ap_cb)(smartthings_h handle, void *user_data); + +/** + * @brief Creates a handle and connects to agent. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks The @a handle must be released using smartthings_deinitialize(). + * @remarks Ths function returns #SMARTTHINGS_ERROR_PERMISSION_DENIED\n + * if the application has no app-defined privilege for 'http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master'. + * + * @param[out] handle The SmartThings handle to be newly created on success + * @param[in] connection_status_cb The RPC connection status callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_NOT_SUPPORTED Not supported + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_deinitialize() + */ +int smartthings_initialize(smartthings_h *handle, + smartthings_connection_status_cb connection_status_cb, + void *user_data); + +/** + * @brief Deinitializes a handle and disconnects from the agent. + * @since_ses 1 + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_initialize() + */ +int smartthings_deinitialize(smartthings_h handle); + +/** + * @brief Starts SmartThings Thing operation. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_stop() + */ +int smartthings_start(smartthings_h handle); + +/** + * @brief Stops SmartThings Thing operation. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_start() + */ +int smartthings_stop(smartthings_h handle); + +/** + * @brief Sets thing status changed callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when SmartThings status is changed. + * @remarks When callback is called, user can get SmartThings status as #smartthings_status_e enumeration value. + * + * @param[in] handle The SmartThings handle + * @param[in] status_cb The status changed callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_status_changed_cb() + */ +int smartthings_set_status_changed_cb(smartthings_h handle, + smartthings_status_changed_cb status_cb, + void *user_data); + +/** + * @brief Unsets thing status changed callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_status_changed_cb() + */ +int smartthings_unset_status_changed_cb(smartthings_h handle); + +/** + * @brief Sets test certificate files. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks These files should be placed in 'res' directory of application. + * @remarks This function is needed only for using test certificate. + * @remarks This function can be used before smartthings_start() + * + * @param[in] handle The SmartThings handle + * @param[in] certificate The certificate file + * @param[in] private_key The private key file + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_set_certificate_file(smartthings_h handle, const char *certificate, const char *private_key); + +/** + * @brief Sets device property for Easy-setup. + * @since_ses 1 + * + * @remarks This function can be used before smartthings_start() + * + * @param[in] handle The SmartThings handle + * @param[in] dev_name The device name + * @param[in] wifi_mode The supported Wi-Fi mode (bit masked value for #smartthings_wifi_mode_e) + * @param[in] wifi_freq The supported Wi-Fi frequency (bit masked value for #smartthings_wifi_freq_e) + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_set_device_property(smartthings_h handle, const char* dev_name, int wifi_mode, int wifi_freq); + +/** + * @brief Gets a device ID. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks The @a device_id should be released using free(). + * + * @param[in] handle The SmartThings handle + * @param[out] device_id The device ID + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_get_device_id(smartthings_h handle, char **device_id); + +/** + * @brief Gets a Easy-setup status. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * @param[out] is_completed The status of Easy-setup whether it is completed or not + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_get_easysetup_status(smartthings_h handle, bool *is_completed); + +/** + * @brief Starts Easy-setup mode. + * + * @details This function requests for turning on soft AP to SmartThings Thing agent. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/softap + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_stop_easysetup() + */ +int smartthings_start_easysetup(smartthings_h handle); + +/** + * @brief Stops Easy-setup mode. + * + * @details This function requests for turning off soft AP to SmartThings Thing agent. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/softap + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_start_easysetup() + */ +int smartthings_stop_easysetup(smartthings_h handle); + +/** + * @brief Sets callback for getting user confirmation for mutual verification based just work ownership transfer. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when it needs user's confirm for mutual verification based just work ownership transfer. + * @remarks When callback is called, user can send a confirmation for mutual verification based just work ownership transfer as true or false. + * + * @param[in] handle The SmartThings handle + * @param[in] confirm_cb The user confirm callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_user_confirm_cb() + */ +int smartthings_set_user_confirm_cb(smartthings_h handle, + smartthings_user_confirm_cb confirm_cb, + void *user_data); + +/** + * @brief Unsets user confirmation callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_user_confirm_cb() + */ +int smartthings_unset_user_confirm_cb(smartthings_h handle); + +/** + * @brief Sets reset confirmation callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when it needs user's confirm for reset. + * @remarks When callback is called, user can send a confirmation for reset as true or false. + * + * @param[in] handle The SmartThings handle + * @param[in] confirm_cb The reset confirm callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_reset_confirm_cb() + */ +int smartthings_set_reset_confirm_cb(smartthings_h handle, + smartthings_reset_confirm_cb confirm_cb, + void *user_data); + +/** + * @brief Unsets reset confirmation callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_reset_confirm_cb() + */ +int smartthings_unset_reset_confirm_cb(smartthings_h handle); + +/** + * @brief Sets reset result callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when reset operation returns its result. + * @remarks When callback is called, user can check reset operation succeeds or fails. + * + * @param[in] handle The SmartThings handle + * @param[in] reset_result_cb The reset result callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_reset_result_cb() + */ +int smartthings_set_reset_result_cb(smartthings_h handle, + smartthings_reset_result_cb reset_result_cb, + void *user_data); + +/** + * @brief Unsets reset result callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_reset_result_cb() + */ +int smartthings_unset_reset_result_cb(smartthings_h handle); + + +/** + * @brief Sets callback for getting randomly generated PIN for the PIN-based ownership transfer request. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks @a generated_cb callback is called when PIN is generated. + * @remarks @a close_cb callback is called when PIN based ownership transfer is finished. + * @remarks When @a generated_cb callback is called, user can see PIN value and length. + * @remarks When @a close_cb callback is called, user can know PIN based ownership transfer is finished. + * + * @param[in] handle The SmartThings handle + * @param[in] generated_cb The PIN generation callback to register + * @param[in] close_cb The PIN display close callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_pin_cb() + */ +int smartthings_set_pin_cb(smartthings_h handle, + smartthings_pin_generated_cb generated_cb, + smartthings_pin_display_close_cb close_cb, + void *user_data); + +/** + * @brief Unsets PIN callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_pin_cb() + */ +int smartthings_unset_pin_cb(smartthings_h handle); + +/** + * @brief Sets callback for getting Wi-Fi AP information during Easy-setup. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when Wi-Fi provisioning event occurs. + * @remarks When callback is called, user can get Wi-Fi provisioning information. + * + * @param[in] handle The SmartThings handle + * @param[in] wifi_ap_cb The Wi-Fi AP callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +int smartthings_set_wifi_ap_provisioning_cb(smartthings_h handle, + smartthings_wifi_ap_provisioning_cb wifi_ap_cb, + void *user_data); + +/** + * @brief Unsets callback for getting Wi-Fi AP information during Easy-setup. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_wifi_ap_provisioning_cb() + */ +int smartthings_unset_wifi_ap_provisioning_cb(smartthings_h handle); + +/** + * @brief Sets callback for getting device provisioning information. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when device provisioning event occurs. + * @remarks When callback is called, user can get device provisioning information. + * + * @param[in] handle The SmartThings handle + * @param[in] dev_prov_cb The device provisioning callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_device_provisioning_cb() + */ +int smartthings_set_device_provisioning_cb(smartthings_h handle, + smartthings_device_provisioning_cb dev_prov_cb, + void *user_data); + +/** + * @brief Unsets callback for getting device provisioning information. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_device_provisioning_cb() + */ +int smartthings_unset_device_provisioning_cb(smartthings_h handle); + +/** + * @brief Sets callback for informing the scan AP list request. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when GET request for access point list. + * @remarks When callback is called, user scans access points, sets AP list and sends it to agent. + * + * @param[in] handle The SmartThings handle + * @param[in] scan_ap_cb The callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_scan_ap_cb() + * @see smartthings_send_ap_list() + */ +int smartthings_set_scan_ap_cb(smartthings_h handle, + smartthings_scan_ap_cb scan_ap_cb, + void *user_data); + +/** + * @brief Unsets callback for informing the scan AP list request. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_scan_ap_cb() + */ +int smartthings_unset_scan_ap_cb(smartthings_h handle); + +/** + * @brief Sets callback for informing the stop soft AP request. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks Only one callback function can be set with this function. + * @remarks If multiple callbacks are set, the last one is registered only. + * @remarks Callback is called when POST request for stopping soft AP. + * @remarks When callback is called, user stops soft AP. + * + * @param[in] handle The SmartThings handle + * @param[in] stop_soft_ap_cb The callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_unset_stop_soft_ap_cb() + */ +int smartthings_set_stop_soft_ap_cb(smartthings_h handle, + smartthings_stop_soft_ap_cb stop_soft_ap_cb, + void *user_data); + +/** + * @brief Unsets callback for informing the stop soft AP request. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_stop_soft_ap_cb() + */ +int smartthings_unset_stop_soft_ap_cb(smartthings_h handle); + +/** + * @brief Sends a user confirmation for MUTUAL VERIFICATION BASED JUST WORK Ownership transfer. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] handle The SmartThings handle + * @param[in] confirm The user confirmation for OTM(ownership transfer method) + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_user_confirm_cb() + * @see smartthings_unset_user_confirm_cb() + */ +int smartthings_send_user_confirm(smartthings_h handle, bool confirm); + + +/** + * @brief Sends a reset confirmation. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] handle The SmartThings handle + * @param[in] confirm The reset confirmation + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_reset_confirm_cb() + * @see smartthings_unset_reset_confirm_cb() + */ +int smartthings_send_reset_confirm(smartthings_h handle, bool confirm); + +/** + * @brief Sends a reset command for resetting the device's Cloud signup and Easy-setup. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] handle The SmartThings handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_set_reset_result_cb() + * @see smartthings_unset_reset_result_cb() + */ +int smartthings_reset(smartthings_h handle); + +/** + * @brief Gets SSID of access point. + * @since_ses 1 + * + * @remarks The @a ssid should be released using free(). + * + * @param[in] ap_info_h The SmartThings AP information handle + * @param[out] ssid The SSID name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_wifi_ap_provisioning_cb() + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +int smartthings_apinfo_get_ssid(smartthings_ap_info_h ap_info_h, char **ssid); + +/** + * @brief Gets password of access point. + * @since_ses 1 + * + * @remarks The @a pwd should be released using free(). + * + * @param[in] ap_info_h The SmartThings AP information handle + * @param[out] pwd The password + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_wifi_ap_provisioning_cb() + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +int smartthings_apinfo_get_password(smartthings_ap_info_h ap_info_h, char **pwd); + +/** + * @brief Gets authentification type of access point. + * @since_ses 1 + * + * @param[in] ap_info_h The SmartThings AP information handle + * @param[out] authtype The authentification type + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_wifi_ap_provisioning_cb() + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +int smartthings_apinfo_get_authtype(smartthings_ap_info_h ap_info_h, smartthings_wifi_authtype_e *authtype); + +/** + * @brief Gets encryption type of access point. + * @since_ses 1 + * + * @param[in] ap_info_h The SmartThings AP information handle + * @param[out] enctype The encryption type + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_wifi_ap_provisioning_cb() + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +int smartthings_apinfo_get_enctype(smartthings_ap_info_h ap_info_h, smartthings_wifi_enctype_e *enctype); + +/** + * @brief Gets channel information of access point. + * @since_ses 1 + * + * @param[in] ap_info_h The SmartThings AP information handle + * @param[out] channel The frequency channel + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_wifi_ap_provisioning_cb() + * @see smartthings_unset_wifi_ap_provisioning_cb() + */ +int smartthings_apinfo_get_channel(smartthings_ap_info_h ap_info_h, int *channel); + +/** + * @brief Gets language of device provisioing information. + * @since_ses 1 + * + * @remarks The @a language should be released using free(). + * + * @param[in] dev_prov_h The SmartThings device provisioning information handle + * @param[out] language The IETF language tag using ISO 639X + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_device_provisioning_cb() + * @see smartthings_unset_device_provisioning_cb() + */ +int smartthings_devinfo_get_language(smartthings_device_prov_info_h dev_prov_h, char **language); + +/** + * @brief Gets country of device provisioing information. + * @since_ses 1 + * + * @remarks The @a country should be released using free(). + * + * @param[in] dev_prov_h The SmartThings device provisioning information handle + * @param[out] country The ISO Country Code (ISO 3166-1 Alpha-2) + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_device_provisioning_cb() + * @see smartthings_unset_device_provisioning_cb() + */ +int smartthings_devinfo_get_country(smartthings_device_prov_info_h dev_prov_h, char **country); + +/** + * @brief Gets datetime of device provisioing information. + * @since_ses 1 + * + * @remarks The @a datetime should be released using free(). + * + * @param[in] dev_prov_h The SmartThings device provisioning information handle + * @param[out] datetime The date and time + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_set_device_provisioning_cb() + * @see smartthings_unset_device_provisioning_cb() + */ +int smartthings_devinfo_get_datetime(smartthings_device_prov_info_h dev_prov_h, char **datetime); + +/** + * @brief Creates a SmartThings AP list handle. + * @since_ses 1 + * + * @remarks The @a ap_list_h must be released using smartthings_aplist_destroy(). + * + * @param[out] ap_list_h The SmartThings AP list handle to be newly created on success + * @param[in] count The count of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OUT_OF_MEMORY Out of memory + * + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_create(smartthings_ap_list_h *ap_list_h, unsigned int count); + +/** + * @brief Destroys a SmartThings AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + */ +int smartthings_aplist_destroy(smartthings_ap_list_h ap_list_h); + +/** + * @brief Sets SSID at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] ssid The SSID of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_ssid(smartthings_ap_list_h ap_list_h, int idx, const char *ssid); + +/** + * @brief Sets BSSID at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] bssid The BSSID of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_bssid(smartthings_ap_list_h ap_list_h, int idx, const char *bssid); + +/** + * @brief Sets authentification type at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] authtype The authentification type of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_authtype(smartthings_ap_list_h ap_list_h, int idx, smartthings_wifi_authtype_e authtype); + +/** + * @brief Sets encryption type at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] enctype The encryption type of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_enctype(smartthings_ap_list_h ap_list_h, int idx, smartthings_wifi_enctype_e enctype); + +/** + * @brief Sets frequency channel at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] channel The frequency channel of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_channel(smartthings_ap_list_h ap_list_h, int idx, int channel); + +/** + * @brief Sets signal level at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] signal_level The signal level of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_signal_level(smartthings_ap_list_h ap_list_h, int idx, int signal_level); + +/** + * @brief Sets max speed rate at the specific index of AP list handle. + * @since_ses 1 + * + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] idx The index + * @param[in] max_rate The max speed rate of AP + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + */ +int smartthings_aplist_set_max_rate(smartthings_ap_list_h ap_list_h, int idx, int max_rate); + +/** + * @brief Sends the scanned AP list. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] handle The SmartThings handle + * @param[in] ap_list_h The SmartThings AP list handle + * @param[in] req_id The request ID + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_aplist_create() + * @see smartthings_aplist_destroy() + * @see smartthings_set_scan_ap_cb() + */ +int smartthings_send_ap_list(smartthings_h handle, smartthings_ap_list_h ap_list_h, int req_id); + +/** + * @brief Creates a SmartThings cloud information handle. + * @since_ses 1 + * + * @remarks The @a cloud_info_h must be released using smartthings_cloudinfo_destroy(). + * + * @param[out] cloud_info_h The SmartThings cloud information handle to be newly created on success + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_OUT_OF_MEMORY Out of memory + * + * @see smartthings_cloudinfo_destroy() + */ +int smartthings_cloudinfo_create(smartthings_cloud_info_h *cloud_info_h); + +/** + * @brief Destroys a SmartThings cloud information handle. + * @since_ses 1 + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_cloudinfo_create() + */ +int smartthings_cloudinfo_destroy(smartthings_cloud_info_h cloud_info_h); + +/** + * @brief Sets region of cloud information. + * @since_ses 1 + * + * @remarks The @a region can be set to one of "global" or "china". + * @remarks If it doesn't use this function, the @a region will be set to "global" internally. + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * @param[in] region The region name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_cloudinfo_set_region(smartthings_cloud_info_h cloud_info_h, const char *region); + +/** + * @brief Sets authentification provider of cloud information. + * @since_ses 1 + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * @param[in] auth_provider The authentification provider + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_cloudinfo_set_auth_provider(smartthings_cloud_info_h cloud_info_h, const char *auth_provider); + +/** + * @brief Sets access token of cloud information. + * @since_ses 1 + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * @param[in] access_token The access token + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_cloudinfo_set_access_token(smartthings_cloud_info_h cloud_info_h, const char *access_token); + +/** + * @brief Sets refresh token of cloud information. + * @since_ses 1 + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * @param[in] refresh_token The refresh token + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_cloudinfo_set_refresh_token(smartthings_cloud_info_h cloud_info_h, const char *refresh_token); + +/** + * @brief Sets user ID of cloud information. + * @since_ses 1 + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * @param[in] user_id The user ID + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_cloudinfo_set_user_id(smartthings_cloud_info_h cloud_info_h, const char *user_id); + +/** + * @brief Sets client ID of cloud information. + * @since_ses 1 + * + * @param[in] cloud_info_h The SmartThings cloud information handle + * @param[in] client_id The client ID + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_cloudinfo_set_client_id(smartthings_cloud_info_h cloud_info_h, const char *client_id); + +/** + * @brief Requests to sign up to cloud. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] handle The SmartThings handle + * @param[in] cloud_info_h The handle for cloud signup + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_sign_up_cloud(smartthings_h handle, smartthings_cloud_info_h cloud_info_h); + +/** + * @brief Sets preconfigured PIN. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * @param[in] pin The PIN code to preconfigure + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_set_preconfigured_pin(smartthings_h handle, const char* pin); + +/** + * @brief Sets MOT(multiple ownership transfer) status. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] handle The SmartThings handle + * @param[in] enable The MOT(multiple ownership transfer) status + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_ERROR_NONE Successful + * @retval #SMARTTHINGS_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_set_mot_status(smartthings_h handle, bool enable); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_H__ */ diff --git a/include/smartthings_notification.h b/include/smartthings_notification.h new file mode 100644 index 0000000..57e1f28 --- /dev/null +++ b/include/smartthings_notification.h @@ -0,0 +1,285 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_NOTIFICATION_H__ +#define __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_NOTIFICATION_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file smartthings_notification.h + */ + +/** + * @addtogroup CAPI_SMARTTHINGS_THING_NOTIFICATION_MODULE + * @{ + */ + +/** + * @brief Enumeration for the type of notification. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_NOTIFICATION_TYPE_ALERT = 1, /**< Alert type */ + SMARTTHINGS_NOTIFICATION_TYPE_NOTICE, /**< Notice type */ + SMARTTHINGS_NOTIFICATION_TYPE_EVENT, /**< Event type */ + SMARTTHINGS_NOTIFICATION_TYPE_INFO, /**< Info type */ + SMARTTHINGS_NOTIFICATION_TYPE_WARNING /**< Warning type */ +} smartthings_notification_type_e; + + +/** + * @brief The SmartThings push message handle. + * @since_ses 1 + */ +typedef struct smartthings_push_msg_s* smartthings_push_msg_h; + +/** + * @brief Creates a SmartThings push message handle. + * @since_ses 1 + * + * @remarks The @a handle must be released using smartthings_push_msg_destroy(). + * + * @param[out] handle The SmartThings push message handle to be newly created on success + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_push_msg_destroy() + */ +int smartthings_push_msg_create(smartthings_push_msg_h *handle); + +/** + * @brief Destroys a SmartThings push message handle and releases all its resources. + * @since_ses 1 + * + * @param[in] handle The SmartThings push message handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_push_msg_create() + */ +int smartthings_push_msg_destroy(smartthings_push_msg_h handle); + +/** + * @brief Sets a URI for the push message. + * @since_ses 1 + * + * @param[in] handle The SmartThings push message handle + * @param[in] uri The URI of push message to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + */ +int smartthings_push_msg_set_uri(smartthings_push_msg_h handle, const char *uri); + +/** + * @brief Sets a type for the push message. + * @since_ses 1 + * + * @param[in] handle The SmartThings push message handle + * @param[in] type The type of push message to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + */ +int smartthings_push_msg_set_type(smartthings_push_msg_h handle, smartthings_notification_type_e type); + +/** + * @brief Sets a code for the push message. + * @since_ses 1 + * + * @param[in] handle The SmartThings push message handle + * @param[in] code The code of push message to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + */ +int smartthings_push_msg_set_code(smartthings_push_msg_h handle, const char *code); + +/** + * @brief Sets a payload for the push message. + * @since_ses 1 + * + * @param[in] handle The SmartThings push message handle + * @param[in] payload The payload of push message to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + */ +int smartthings_push_msg_set_payload(smartthings_push_msg_h handle, smartthings_payload_h payload); + +/** + * @brief Sends the push message. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] st_h The SmartThings resource handle + * @param[in] push_msg_h The SmartThings push message handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + */ +int smartthings_send_push_msg(smartthings_resource_h st_h, smartthings_push_msg_h push_msg_h); + + +/** + * @brief The SmartThings notification message handle. + * @since_ses 1 + */ +typedef struct smartthings_notification_msg_s* smartthings_notification_msg_h; + + +/** + * @brief Creates a SmartThings notification message handle. + * @since_ses 1 + * + * @remarks The @a handle must be released using smartthings_notification_msg_destroy(). + * + * @param[out] handle The SmartThings notification message handle to be newly created on success + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * + * @see smartthings_notification_msg_destroy() + */ +int smartthings_notification_msg_create(smartthings_notification_msg_h *handle); + +/** + * @brief Destroys a SmartThings notification message handle and releases all its resources. + * @since_ses 1 + * + * @param[in] handle The SmartThings notification message handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_notification_msg_create() + */ +int smartthings_notification_msg_destroy(smartthings_notification_msg_h handle); + +/** + * @brief Sets a URI for the notification message. + * @since_ses 1 + * + * @param[in] handle The SmartThings notification message handle + * @param[in] uri The URI of notification message to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + */ +int smartthings_notification_msg_set_uri(smartthings_notification_msg_h handle, const char *uri); + +/** + * @brief Sets a type for the notification message. + * @since_ses 1 + * + * @param[in] handle The SmartThings notification message handle + * @param[in] type The type of notification message to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + */ +int smartthings_notification_msg_set_type(smartthings_notification_msg_h handle, smartthings_notification_type_e type); + +/** + * @brief Sets a payload for the notification message. + * @since_ses 1 + * + * @param[in] handle The SmartThings notification message handle + * @param[in] name The name of payload + * @param[in] payload The payload of notification message to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + */ +int smartthings_notification_msg_set_payload(smartthings_notification_msg_h handle, const char *name, smartthings_payload_h payload); + +/** + * @brief Sends the notification message. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] st_h The SmartThings resource handle + * @param[in] notification_msg_h The SmartThings notification message handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + */ +int smartthings_send_notification_msg(smartthings_resource_h st_h, smartthings_notification_msg_h notification_msg_h); + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_NOTIFICATION_H__ */ diff --git a/include/smartthings_payload.h b/include/smartthings_payload.h new file mode 100644 index 0000000..b4612c1 --- /dev/null +++ b/include/smartthings_payload.h @@ -0,0 +1,660 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_PAYLOAD_H__ +#define __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_PAYLOAD_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file smartthings_payload.h + */ + +/** + * @addtogroup CAPI_SMARTTHINGS_THING_PAYLOAD_MODULE + * @{ + */ + +/** + * @brief The SmartThings payload handle. + * @since_ses 1 + */ +typedef struct smartthings_payload_s *smartthings_payload_h; + +/** + * @brief Creates a SmartThings payload handle. + * @since_ses 1 + * + * @remarks The @a payload must be released using smartthings_payload_destroy(). + * @remarks If the @a payload is set to parent payload as an object or object array + * using smartthings_payload_set_object() or smartthings_payload_set_object_array(), + * the @a payload must not be released. + + * @param[out] payload The SmartThings payload handle to be newly created on success + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * + * @see smartthings_payload_destroy() + */ +int smartthings_payload_create(smartthings_payload_h *payload); + +/** + * @brief Destroys a SmartThings payload handle and releases all its resources. + * @since_ses 1 + * + * @remarks If the @a payload has child payload, its child payload will be released as well. + * + * @param[in] payload The SmartThings payload handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_create() + */ +int smartthings_payload_destroy(smartthings_payload_h payload); + +/** + * @brief Sets an integer value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing value for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] value The value to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_int(smartthings_payload_h payload, const char *attr_name, int value); + +/** + * @brief Sets a boolean value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing value for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] value The value to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_bool(smartthings_payload_h payload, const char *attr_name, bool value); + +/** + * @brief Sets a double value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing value for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] value The value to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_double(smartthings_payload_h payload, const char *attr_name, double value); + +/** + * @brief Sets a string value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing value for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] value The value to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_string(smartthings_payload_h payload, const char *attr_name, const char *value); + +/** + * @brief Sets a byte string value and length for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing value for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] value The value to set + * @param[in] length The size of value + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + */ +int smartthings_payload_set_byte_string(smartthings_payload_h payload, const char *attr_name, const char *value, unsigned int length); + +/** + * @brief Sets an object value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a value is SmartThings payload handle. + * @remarks The function replaces any existing value for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] value The value to set + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_object(smartthings_payload_h payload, const char *attr_name, smartthings_payload_h value); + +/** + * @brief Sets an integer array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing array for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] array The array associated with the given attribute name + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_int_array(smartthings_payload_h payload, const char *attr_name, const int *array, unsigned int length); + +/** + * @brief Sets a boolean array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing array for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] array The array associated with the given attribute name + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_bool_array(smartthings_payload_h payload, const char *attr_name, const bool *array, unsigned int length); + +/** + * @brief Sets a double array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing array for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] array The array associated with the given attribute name + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_double_array(smartthings_payload_h payload, const char *attr_name, const double *array, unsigned int length); + +/** + * @brief Sets a string array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing array for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] array The array associated with the given attribute name + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_set_string_array(smartthings_payload_h payload, const char *attr_name, const char **array, unsigned int length); + +/** + * @brief Sets an object array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The function replaces any existing array for the given @a attr_name. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[in] array The array associated with the given attribute name + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + */ +int smartthings_payload_set_object_array(smartthings_payload_h payload, const char *attr_name, smartthings_payload_h *array, unsigned int length); + +/** + * @brief Adds a payload for child resource of collection resource. + * @since_ses 1 + * + * @remarks The @a resource_uri is key value, one of several child resources of the collection resource. + * @remarks The @a value is SmartThings payload handle. + * @remarks The function replaces any existing payload for the given @a resource_uri. + * + * @param[in] payload The SmartThings payload handle + * @param[in] resource_uri The resource URI of child resource + * @param[in] value The payload associated with the given resource URI + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + */ +int smartthings_payload_add_collection_object(smartthings_payload_h payload, const char *resource_uri, smartthings_payload_h value); + +/** + * @brief Gets an integer value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] value The value associated with the given attribute name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_int(smartthings_payload_h payload, const char *attr_name, int *value); + +/** + * @brief Gets a boolean value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] value The value associated with the given attribute name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_bool(smartthings_payload_h payload, const char *attr_name, bool *value); + +/** + * @brief Gets a double value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] value The value associated with the given attribute name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_double(smartthings_payload_h payload, const char *attr_name, double *value); + +/** + * @brief Gets a string value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a value should be released using free(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] value The value associated with the given attribute name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_string(smartthings_payload_h payload, const char *attr_name, char **value); + +/** + * @brief Gets a byte string value and length for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a value should be released using free(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] value The value associated with the given attribute name + * @param[out] length The size of value + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_byte_string(smartthings_payload_h payload, const char *attr_name, char **value, unsigned int *length); + +/** + * @brief Gets an object value for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a value is SmartThings payload handle. + * @remarks The @a value must be released using smartthings_payload_release_object(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] value The value associated with the given attribute name + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_object(smartthings_payload_h payload, const char *attr_name, smartthings_payload_h *value); + +/** + * @brief Gets an integer array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a array must be released using smartthings_payload_release_int_array(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] array The array associated with the given attribute name + * @param[out] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + * + * @see smartthings_payload_release_int_array() + */ +int smartthings_payload_get_int_array(smartthings_payload_h payload, const char *attr_name, int **array, unsigned int *length); + +/** + * @brief Gets a boolean array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a array must be released using smartthings_payload_release_bool_array(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] array The array associated with the given attribute name + * @param[out] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + * + * @see smartthings_payload_release_bool_array() + */ +int smartthings_payload_get_bool_array(smartthings_payload_h payload, const char *attr_name, bool **array, unsigned int *length); + +/** + * @brief Gets a double array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a array must be released using smartthings_payload_release_double_array(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] array The array associated with the given attribute name + * @param[out] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + * + * @see smartthings_payload_release_double_array() + */ +int smartthings_payload_get_double_array(smartthings_payload_h payload, const char *attr_name, double **array, unsigned int *length); + +/** + * @brief Gets a string array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a array must be released using smartthings_payload_release_string_array(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] array The array associated with the given attribute name + * @param[out] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + * + * @see smartthings_payload_release_string_array() + */ +int smartthings_payload_get_string_array(smartthings_payload_h payload, const char *attr_name, char ***array, unsigned int *length); + +/** + * @brief Gets an object array for the attribute name. + * @since_ses 1 + * + * @remarks The @a attr_name is key value, one of several properties of the resource type. + * @remarks The @a array is a list of SmartThings payload handle. + * @remarks The @a array must be released using smartthings_payload_release_object_array(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] attr_name The attribute name + * @param[out] array The array associated with the given attribute name + * @param[out] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + * + * @see smartthings_payload_release_object_array() + */ +int smartthings_payload_get_object_array(smartthings_payload_h payload, const char *attr_name, smartthings_payload_h **array, unsigned int *length); + +/** + * @brief Gets a payload for child resource of collection resource. + * @since_ses 1 + * + * @remarks The @a resource_uri is key value, one of several child resources of the collection resource. + * @remarks The @a value is SmartThings payload handle. + * @remarks The @a value must be released using smartthings_payload_release_object(). + * + * @param[in] payload The SmartThings payload handle + * @param[in] resource_uri The resource URI of child resource + * @param[out] value The payload associated with the given resource URI + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_NO_DATA No data + */ +int smartthings_payload_get_collection_object(smartthings_payload_h payload, const char *resource_uri, smartthings_payload_h *value); + +/** + * @brief Releases an integer array of the SmartThings payload. + * @since_ses 1 + * + * @param[in] array The array to release + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_get_int_array() + */ +int smartthings_payload_release_int_array(int *array); + +/** + * @brief Releases a boolean array of the SmartThings payload. + * @since_ses 1 + * + * @param[in] array The array to release + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_get_bool_array() + */ +int smartthings_payload_release_bool_array(bool *array); + +/** + * @brief Releases a double array of the SmartThings payload. + * @since_ses 1 + * + * @param[in] array The array to release + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_get_double_array() + */ +int smartthings_payload_release_double_array(double *array); + +/** + * @brief Releases a string array of the SmartThings payload. + * @since_ses 1 + * + * @param[in] array The array to release + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_get_string_array() + */ +int smartthings_payload_release_string_array(char **array, unsigned int length); + +/** + * @brief Releases an object array of the SmartThings payload. + * @since_ses 1 + * + * @param[in] array The array to release + * @param[in] length The length of @a array + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_get_object_array() + */ +int smartthings_payload_release_object_array(smartthings_payload_h *array, unsigned int length); + +/** + * @brief Releases a SmartThings payload. + * @since_ses 1 + * + * @remarks The function is different with smartthings_payload_destroy(). + * @remarks The function releases only payload value that is obtained by smartthings_payload_get_object(). + * + * @param[in] payload The payload to release + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_payload_get_object() + */ +int smartthings_payload_release_object(smartthings_payload_h payload); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_PAYLOAD_H__ */ diff --git a/include/smartthings_resource.h b/include/smartthings_resource.h new file mode 100644 index 0000000..962339b --- /dev/null +++ b/include/smartthings_resource.h @@ -0,0 +1,367 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_RESOURCE_H__ +#define __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_RESOURCE_H__ + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file smartthings_resource.h + */ + +/** + * @addtogroup CAPI_SMARTTHINGS_THING_RESOURCE_MODULE + * @{ + */ + +/** + * @brief Enumeration for the SmartThings resource error. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_RESOURCE_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */ + SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */ + SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */ + SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED = TIZEN_ERROR_PERMISSION_DENIED, /**< Permission denied */ + SMARTTHINGS_RESOURCE_ERROR_NO_DATA = TIZEN_ERROR_NO_DATA, /**< No data */ + SMARTTHINGS_RESOURCE_ERROR_NOT_SUPPORTED = TIZEN_ERROR_NOT_SUPPORTED, /**< Not supported */ + SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED = TIZEN_ERROR_UNKNOWN - 1, /**< Operation failed */ + SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE = TIZEN_ERROR_UNKNOWN -2 /**< Service unavailable */ +} smartthings_resource_error_e; + +/** + * @brief Enumeration for the request type of resource and collection resource. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_RESOURCE_REQUEST_GET = 0, /**< Get request type */ + SMARTTHINGS_RESOURCE_REQUEST_SET = 1, /**< Set request type */ + SMARTTHINGS_RESOURCE_REQUEST_COLLECTION_GET = 2, /**< Get request type for collection */ + SMARTTHINGS_RESOURCE_REQUEST_COLLECTION_SET = 3 /**< Set request type for collection */ +} smartthings_resource_req_type_e; + +/** + * @brief Enumeration for RPC connection status. + * @since_ses 1 + */ +typedef enum { + SMARTTHINGS_RESOURCE_CONNECTION_STATUS_CONNECTED = 0, /**< Connection is connected */ + SMARTTHINGS_RESOURCE_CONNECTION_STATUS_DISCONNECTED, /**< Connection is disconnected */ + SMARTTHINGS_RESOURCE_CONNECTION_STATUS_REJECTED, /**< Connection is rejected */ +} smartthings_resource_connection_status_e; + +/** + * @brief The SmartThings resource handle. + * @since_ses 1 + */ +typedef struct smartthings_resource_s *smartthings_resource_h; + +/** + * @brief Callback for status of connection to SmartThings Thing agent. + * @details The following error codes can be received: \n + #SMARTTHINGS_RESOURCE_ERROR_NONE: Success \n + #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED: Permission denied \n + #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE: Service unavailable \n + * @since_ses 1 + * + * @remarks The @a handle should not be released. + * @remarks The @a handle is the same object for which the callback was set/added. + * @remarks The @a handle will be released when smartthings_deinitialize() is called. + * @remarks When callback is called, user can see result as #smartthings_resource_error_e enumeration value. + * @remarks When callback is called, user can see connection status as #smartthings_connection_status_e enumeration value. + * + * @param[in] result The result of connection operation + * @param[in] handle The SmartThings handle + * @param[in] status The status of connection + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_resource_initialize() + */ +typedef void (*smartthings_resource_connection_status_cb)(smartthings_resource_error_e result, smartthings_resource_h handle, smartthings_resource_connection_status_e status, void *user_data); + + +/** + * @brief Callback for handling request(GET/SET) messages. + * @since_ses 1 + * + * @remarks The @a payload is NULL when @a req_type is #SMARTTHINGS_RESOURCE_REQUEST_GET. + * @remarks The @a payload can be used only in the callback. To use outside, make a copy. + * @remarks The @a st_h should not be released. + * @remarks The @a st_h is the same object for which the callback was set/added. + * @remarks The @a st_h will be released when smartthings_resource_deinitialize() is called. + * @remarks The @a payload should not be released. + * @remarks The @a uri can be used only in the callback. To use outside, make a copy. + * + * @param[in] st_h The SmartThings resource handle + * @param[in] req_id The request ID of request message + * @param[in] uri The resource URI + * @param[in] req_type The request type for request message + * @param[in] payload The payload for SET request message + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_resource_set_request_cb() + * @see smartthings_resource_unset_request_cb() + */ +typedef void (*smartthings_resource_request_cb)(smartthings_resource_h st_h, int req_id, const char *uri, + smartthings_resource_req_type_e req_type, + smartthings_payload_h payload, void *user_data); + +/** + * @brief Callback for status of resource registration to cloud. + * @since_ses 1 + * + * @remarks This callback will be called when status of resource registration is changed. + * @remarks The @a st_h should not be released. + * @remarks The @a st_h is the same object for which the callback was set/added. + * @remarks The @a st_h will be released when smartthings_resource_deinitialize() is called. + * @remarks The @a is_registered will be true when resources are registered to cloud. + * + * @param[in] st_h The SmartThings resource handle + * @param[in] is_registered The status of resource registration to cloud + * @param[in] user_data The user data passed from the callback registration function + * + * @see smartthings_resource_set_cloud_registration_status_cb() + * @see smartthings_resource_unset_cloud_registration_status_cb() + */ +typedef void (*smartthings_resource_cloud_registration_status_cb)(smartthings_resource_h st_h, bool is_registered, void *user_data); + + +/** + * @brief Initializes a resource handle and connects to agent. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks The @a st_h must be released using smartthings_resource_deinitialize(). + * @remarks Ths function returns #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED\n + * if the application has no app-defined privilege for 'http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource'. + * + * @param[out] st_h The SmartThings resource handle to be newly created on success + * @param[in] connection_status_cb The connection status callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY Out of memory + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_NOT_SUPPORTED Not supported + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_resource_deinitialize() + */ +int smartthings_resource_initialize(smartthings_resource_h *st_h, + smartthings_resource_connection_status_cb connection_status_cb, + void *user_data); + +/** + * @brief Deinitializes a resource handle and disconnects from the agent. + * @since_ses 1 + * + * @param[in] st_h The SmartThings resource handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see smartthings_resource_initialize() + */ +int smartthings_resource_deinitialize(smartthings_resource_h st_h); + +/** + * @brief Sets resource request callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] st_h The SmartThings resource handle + * @param[in] req_cb The request callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_resource_unset_request_cb() + */ +int smartthings_resource_set_request_cb(smartthings_resource_h st_h, + smartthings_resource_request_cb req_cb, + void *user_data); + +/** + * @brief Unsets resource request callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] st_h The SmartThings resource handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_resource_set_request_cb() + */ +int smartthings_resource_unset_request_cb(smartthings_resource_h st_h); + +/** + * @brief Sends response for resource request message. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] st_h The SmartThings resource handle + * @param[in] req_id The request ID of request message + * @param[in] uri The resource URI + * @param[in] payload The payload of response message + * @param[in] result The result of response + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_resource_send_response(smartthings_resource_h st_h, int req_id, const char *uri, smartthings_payload_h payload, bool result); + +/** + * @brief Notifies resource change. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing \n + * %http://tizen.org/privilege/internet + * + * @param[in] st_h The SmartThings resource handle + * @param[in] uri The resource URI + * @param[in] payload The payload of response message + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_resource_notify(smartthings_resource_h st_h, const char *uri, smartthings_payload_h payload); + +/** + * @brief Gets resource URIs. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @remarks The @a uris should be released using free(). + * + * @param[in] st_h The SmartThings resource handle + * @param[out] count The resource count + * @param[out] uris The resource URI list + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + */ +int smartthings_resource_get_uris(smartthings_resource_h st_h, int *count, char ***uris); + +/** + * @brief Sets cloud registration callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] st_h The SmartThings resource handle + * @param[in] reg_cb The callback to register + * @param[in] user_data The user data to be passed to the callback function + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_resource_unset_cloud_registration_status_cb() + */ +int smartthings_resource_set_cloud_registration_status_cb(smartthings_resource_h st_h, + smartthings_resource_cloud_registration_status_cb reg_cb, + void *user_data); + +/** + * @brief Unsets cloud registration callback. + * @since_ses 1 + * @privilege %http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource \n + * %http://tizen.org/privilege/appmanager.launch \n + * %http://tizen.org/privilege/datasharing + * + * @param[in] st_h The SmartThings resource handle + * + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SMARTTHINGS_RESOURCE_ERROR_NONE Successful + * @retval #SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED Permission denied + * @retval #SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED Operation failed + * @retval #SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE Service unavailable + * + * @see smartthings_resource_set_cloud_registration_status_cb() + */ +int smartthings_resource_unset_cloud_registration_status_cb(smartthings_resource_h st_h); + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SAMSUNG_EXPERIENCE_SERVICE_SMARTTHINGS_RESOURCE_H__ */ diff --git a/include/st_thing_master.h b/include/st_thing_master.h new file mode 100644 index 0000000..dae1409 --- /dev/null +++ b/include/st_thing_master.h @@ -0,0 +1,23 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __ST_THING_MASTER_H__ +#define __ST_THING_MASTER_H__ + +int st_thing_master_init(); +int st_thing_master_fini(); + +#endif /* __ST_THING_MASTER_H__ */ diff --git a/include/st_thing_resource.h b/include/st_thing_resource.h new file mode 100644 index 0000000..4ebe0c1 --- /dev/null +++ b/include/st_thing_resource.h @@ -0,0 +1,23 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __ST_THING_RESOURCE__ +#define __ST_THING_RESOURCE__ + +int st_thing_resource_init(void); +int st_thing_resource_fini(void); + +#endif /* __ST_THING_RESOURCE__ */ diff --git a/include/switch.h b/include/switch.h new file mode 100644 index 0000000..4fe682a --- /dev/null +++ b/include/switch.h @@ -0,0 +1,34 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SWITCH_H__ +#define __SWITCH_H__ + +typedef enum { + SWITCH_STATE_OFF, + SWITCH_STATE_ON +} switch_state_e; + +typedef void(*switch_state_changed_cb) (switch_state_e state, void* user_data); + +int switch_initialize(void); +int switch_finalize(void); +int switch_state_set(switch_state_e state, const char *pass_key); +int switch_state_get(switch_state_e *state); +int switch_state_changed_cb_set( + const char *callback_key, switch_state_changed_cb callback, void *cb_data); + +#endif /* __SWITCH_H__ */ diff --git a/install-and-start.sh b/install-and-start.sh new file mode 100755 index 0000000..aa6c3bf --- /dev/null +++ b/install-and-start.sh @@ -0,0 +1,11 @@ +sdb root on +sdb shell 'mount -o remount,rw /' + +sdb shell 'app_launcher -t iot-vision-camera' + +sdb push ~/GBS-ROOT/local/BUILD-ROOTS/scratch.armv7l.0/home/abuild/rpmbuild/RPMS/armv7l/iot-vision-camera-0.0.1-1.armv7l.rpm /tmp +sdb shell 'cd /tmp; rpm -ivh --force iot-vision-camera-0.0.1-1.armv7l.rpm' + +sdb shell 'app_launcher -s iot-vision-camera' + +sdb shell 'systemctl status iot-dashboard' diff --git a/iot-vision-camera.manifest b/iot-vision-camera.manifest new file mode 100644 index 0000000..ca37499 --- /dev/null +++ b/iot-vision-camera.manifest @@ -0,0 +1,6 @@ + + + + + + diff --git a/lib/libst_thing_master_api.so b/lib/libst_thing_master_api.so new file mode 100644 index 0000000000000000000000000000000000000000..2e258c901c8bac9c841d9bd8cc38f4d59e406f64 GIT binary patch literal 111232 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%0A{j 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 z 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

OG!) zuyl0q$o`5yV^#$L|)2E|`p$p;<1)PvA(|wN0CQ#;{u}?SmX8yY&`J|E| z2mK|!YtMN(c<^ErF(7RL|du3vTlJymeHkC{bV z-N)fC)gt5Q5ALxwR+Q(dqPGo4riSoL)o{Zv?&WoErswS=wB5qov55t9Hy>Vw{o)-Y z?zGa>2f2@17v|aj2+vf7@h2E(xRW*SPOqST4E;O%>7TUyTYdd|z$p;O7W7QoOzO{~ ze?ve0^&Gy&pWy4CrT<{Y*Kub&TCg@b15K<|+FUhKGSfI;ZD@SH^*dJ*$cH4kWUk{evqf zT7$|9*CD{3%eY2Qkk^X7dNxA% zudw*@3_y1hoF@~SZ{gco%p*?NL2&WsIV13w+^+?9%|keP_;0R&e~vQwUOS07@6I(F zeB6G*;RVx&Ga5S=J zAlZ2{{8(IJKHsFQoFA7};K%$5{8)U9{21-yM+}_n3A=9QjV5@KA*^FA{mnynh~kZ3 zt}d-Gk55o0ADdtGE}qMHnv>}0L|oo9RG8DJD$Hr!G0y3A#?u;+jBN)0l;*&kw!oj) z2yZYieP==Mnogbu{;6~>#=hnr)}iEUJkRcFZxiJGiRdZFag4MB?~y^tu%0Q%us@dH z?jRG@^n2dSduHKWXrkxpMwevPs++ah}^{VChBjWzo}$VdkKL>IsQ+=JfPr1fj{=LXt%>vk?< zdHS;p7(WKa%6?$n;)5YuD&cJvY7_v2$@R;m_F~JApB4EhQ$gkMb4&9*H z4nmr+mi$cO6$JerW&`myxm9$79)3IXOYo~?XLyFCUpw|?Vte`E|# z2ZX?R54gW^6W=6+mir0Kiz(CEJD<3coq3PxQ<{tH%>Oc%ayv8ptfl#* z*_o}t(mZ5m#DfWhDD&70Pew71odiAC0#AnZVE4i2u;q9(?O~lZF!zB& zoI*U>*I&2}KE~+l`3sUy`3vEsYh&d%NPo%Zegc@HfzB2VYQFGu6Y;ntyo44JXpw*} zm2~=B1I{t)^m$kG)#)EGb2(h6KPXz2>GaoCmT-0YT0_f{PJa(L97(57Vx0bT`e{FQ zj;Pbe(bv=I!+zes{+CXF2W>r_KJ*A}rPJR=Tj{qI(04mwQyXhvw1>{pPa7qF1f4IK z_js|H0c2uq6L;=W&eLM6v!k)8x~mLgD@S2RjZH--%U%Yf?(<;|{1%_97*A(+BhVAP zk6+v_8m8iT-enl+ePc}aVYiVJx9`df^R@kD=g@zJ9{L5d?AdwdO!`LWYC3N_K0_>- zWPdk`z3dv`blCnLE}o4Qtlt60v}b?ZYR6n^+v~YDV_O+dZC}us_8D27k!b9y2)+dE zYOoXI7*Fr}Dz9(Ad3cO}m1ltPw;GV+R%oivRuT-Vdxh>FF{>tXN zSu+WI1L(UE-$i#iqHh}d%6EAhoC0arcc@OLbEEVQXq0i|tBUeJgtzEFe)B`cFN?

y7(7uSAW=N~-pLwPuJzieP` zpvGg}iuSdPDH^>C8c0XH3>^66`Yl&Hw*P0{yhCQ;oCL4E??mjfG!MaF<2Ql-F7S5g z?)o%~z`<+3k@hcUkO$gnzTR9lw(RmpX=~nN0>^UvgtLd^?~wTfu%0;rtgC^wi*~Z- zzc@m>%V;P2z6<~7zykJZtd|k+dK-ED&T*I!BuH=9!Q1UI)=(my+m>8k{H|R?TjO@! zz~e29Cm!p45N{2QgTDizvF0t>L>W`O8!p~u#h>fU8D5C96<2Pd5%kb{sMC6gx$9vT zu($f=BA9*|9|>I39-TgpwvSY5YiWG~ZFNr4gU=nF&)%6iPhkEV@c|Q*dGp?Q?LQ)|>S-Lzm-0tqpR|c@XXw93i^$ATeLTtM*kGLzZzZyH!m-a0*-WlD9t@o#PvI-o3Y}BQ_!QM%==l(i@SkQ z<0SDR^zNu^YrJq8@o|*Z#k19cY1v_8!Rs!3G(C4N9-DO^URB)4etX1_l8+YFobl28 z=OFcrsjzoV`0;pWON&%-7o+nbP=*KX$cA~v_a3}5L!|$hU1V1MRon}JMR_Iqpya^kz{RZ?R z`IWcvtOK;&E?WA|X{x%?=A7oHv+X%ele;Fpvl_{#<^u6<0D*5n*R z!-m2+(DV(_F1&u9_Ot;*<2A)cpuv7eu#rXRn@zw+XLa^Y%H3!0D94x4T9giYo^ri| zQkUwi33qkYu-7%uSsUMkvl-FkC?YXAKh!uJ;$0 zF~)JuB0ZaL^q$sj4ZQQlh|^ax{j_+%T+8_+`F{tnIQQ?~g$?Ry;d}bX^$2LZvXgUv zUJ6SPH$(p*^`ofY2A`(D6X|pLof#Hef^V=na@>) zw?pe~^hGc6zQ=OYFHEd&@&>u1(RqQ+3mZgR?jMx?ph?H`L#UHYUvhG~u%e8nm$9!j z=QdXMCBNl5YoDQIM&xUr$bC7aRe&eir$?sHXcgk6={7x>D-|-dX_v*I8xvAX$avfNT8%U6nK=w`nx*IQX0K^!cT<#%iTR+gWG z2HH<~vOEo%mdkR>G05^bU>@i6FU#)}4bdl+Wcf7uN|rmZWgD9KT@L8C6IxA31)RyG z_oA2INT8dM_3@OOy=XF>>q3^L4_4ldOeN5>tocrKgV~E>zZN6M@{O*oa!PyAR65tr z`HFOu?6bE&bN8aZEmm1tUTD_+)rEJNc&7PYfX>X{FM4qvFxr&6d$_?7cYo=mRuv5| zz(srg@oEcS2GjNc^12i}{O2!bKM4+=|G@_?4nKdvciBqc2Y-RSrLFMxaPIXfI49Xf zU(s+4ZEqE=`)RB5m!HyB=Px=>n07&KyqgAIm1?hwicqkv&*i*iBIM?#giM#f605mxH z^1f$eqT#)auXBKy<=J^AzNYXN6F*S=`ODOEUUn*Z`C2;P83gaXq<+AbfA_4~0K?2>YVVEQpAg=_o@}K~JkuHO81XE{yXx@l zN0w)!%6Mjcbk?5XSr_MI&|q2Fxu$q_I^&DpXTXyY_}1cye2ZZ8lwyl`fi1uQj})K8 zvwD2|*KIjEYoziY0fuaYIqSvG(f;(zj|Mx3Tf#Y!Otj_gUfZI51 z)#PhA^J5K%g&R2NToro^8`cy@&|bbufLME9?Z3lz{KxTwDvf{75ytXGma|9vA z--5p1_F?XRk;jVnJ8}0p0^RjiCAec3oyzVDgq!vgJ*tayEx%SLs!}$^)&g+oN3EKdQTEcy;#og==kQ34SoC>&~!5-vT=snVhdlorO;Sa2x3I0Z2-20~_ zxWn_q?w>|57s-s~r8%+QMoNw@s4$nLor}kVA&e_|AA!8<-d8^QB<4|mmo^w4RJuzG zC+vL^@*^3O{On^4?>=b+bCK@dc{REgee2z&z1g|cRhY~BO_?kI4(Dv5VfkEs$=WTS z%UST`Sm(0EH3}0px zs^L++mAhZs5xRQ&Z52QYa(u&TD776r>1|Ju{aNcf4kt{ zOU!v^*}AVDyELEit@}r5SH2g%)y`Eqa~<__kb|`q;H>b$(HW!QRJvDevG8;zGz&Pt z1FxC1FW2MM+>`frkKX_cJqz#@FlMrr4`Rc^9QNG;{lnxpliz+N{6N2FSTC*Q7n2YE z8~i!V#~)8GEU3Vr^^|%1nG1e~ZnXeNQI>?&cd;+?C6Q2;SQ)t);v4jIC(>r3$ou{upTe1ICrk@@W0} z3bYoSinK=OiDz{ws{@m(ieIttjO-(?Z(xt=XSjRhdh%Py@0gBmM9=rq`WW>{B{|(z zI9!kXl`>CG9|Rx2oc@A*xtu;xfp#w)1MO}squpZ_XeT%oX$P$g?Gh#XakYY6^SzTP$Wo47~z1hO^ zY}z5VSG?9-&nBCCpjKY2<17Vxf$t=cc!lBA7ncNn@D-y!4DMeRRo z>7r+drUGX~y;G1csrLRo+uxy!@x3fv#`@@T4KOA^7ws)aGw*HKq#!idc^UgAWL7q+ zi*zexZ-x$oEge2#>F^fjuJ?7c-_v_7PV7m3b4q^olQorSGI}rPY?da0w;Vf7PAj9y z*nVgdcwhfCsrS(&3=KA8J9@AkTc@HIk(pNVi%HL9kLIU|@kx(CHqN&+839dpH)XK9 z>@O2fx@Qh$vhhA29WH#^vD2Zz7~XzBvN5S2I$ZdH{^{^MFg)1^G4GAoh5gupEg!;$ zvNoE@caV-l8;=hCt&b|!hIE_u(B59@K+atw`hKeSJ8!(tSi{;11Snf$=)`-v(5F{M zGNpBMg{6&t4`Rq$k4&37-?|wd%N9NdY~9<5HdpsUn<4LaX)}TL-gCFwyL&q2PGCqU zy~g@jiH+QWo?m+@I-mR$@(rY;(95GuvLD?c+Q_%_)8?C^O(LEbZM<`wB`S;deK+NF z>b-p=_9V9heX)Z%-Qc6mMaa!opHA6A8^2ER)8+@!FKoY8=&hl=iADJC`6q)@ku%Cmban@}Q`aURnLAU+L>KgLti=i>L&y!i5 z(|R=W+q>$NyPm7MplKBOwfg>0)|K1$L9@7M$vzqxeNi&}oa*pTE~1XS*?TNk8|?q zK6jvYcK}DSu6NEhQoji}8!EtAK02{qS#0}KN(5)m64&~;+K&<6=Y->XLOR0&=F+BvAp$U68UsU#zNfaA%?cGi0WTfP-ro}7$5CtpW?Ea{z;jU~Sgd$t#5%HHoqRu+?A zM}8_cu2)9%-OmcXPc{0%oLe9#k`Wd)|92Jt`g{0{E_gqDzDP2Gts8@kaK=!0T6HPz z3i#awhBvY?&`IY$K|9HSV+6XJeW@9P_VkwO*{cNER}1m869%fdf> zvT(W87j?%d3#%F1FAIZ)AFeMhxB8;)2(s`=;P~}LHE_!Hh2TgQJUEqP;YJI`lZ6w2 zQ?4%rN3!6-sU!>60LPPst*rY7Z0TlfYx9MiRgrhdM@Vm@EJFTK7VGYb_`c+KBO^)j z`XQ7U_P19Sj?rd}va+yH{D%J*!0VqVjlMX;+KkCoPB2fsI^yptLk5DBd48k(#Sn7| z25#Ty*%0%si=)_((~6~i#U_%ZvAHPhTSwSWQ=V&(MWedlX ziT6~H3Bfs<4cP@8PbN09&SMaN9lk+4hJ28hU8y6znX)?a8^~{id6UU+Lsn*yUrc^1 zwx(Am`qK|7s~^x4(hvB%MnC-Fcdkq@Ozj86Z)D<~Rwe@Q^hc^kfB5C1op$mwoOC>| zHdXZ9qIPM%(|QECsH7{d@X5uDqv?t=-=Y&d{BrS;3UV>S%7wQ!EBO{$7k;_8x`JE? z&e3#5!ou<7Vs-_&5S*jwipzoH$%WSZm?`)d_zUAdfDcZ77s~no3VkhQ2VmSv@|(zy zCBKRMWb)1A>#;Ara-p;Ce(u+FuU3^rE)w_{$VDcl=e@ej^U6AlZWeE2aq~{U&Rpd) zH>wQXAl`drU6iTL;d{&~o6kICE4(x850f`%-reKFn1$hX(suKYtiqa%Ow5I9ICbl;z4{#qaP*wWDx*tcL$J$m%JM@+cu zL^KhO!=Oh3A6N7c{8Q|_BX-_zRh~6-CV6lF_^01e7S;Z7xqBuRUpD-F>b?DAJ@D>* z(kX<`ap&soU#>y^9sH)MuzMzTQ1jOP6LZrXy?gAZ>>PD}y&HP1gKoQ^OZndM8uoqW z3=zLk=X8(KMq>%q_kbap*SAh&7rzLMbU!dwf`_*+@ASdgU}5mRknSWfHcH<6ficqu zL%jCzxEC0b^+$lAv#>5?Jc|9BMLNdjW-|F6?4LtAF8-0ZG$Hg=M6^)8Oa{fZq|&q90SJ^_97%!fCwo>{n#F~>5FC*PwP zuYAvPsc+nM$niMFZD8EJny>7$Z`>6X#{GGPaR+c`s&PHNSZUm`zHzmFwqkSkjOSdA zaeLVB%Pxq{Z)d*d`BBzRFn+N)6CX@j&~eYig(Ha8Hi4UWCN4koBR<~fepmk2@4>bF zS;pDWNM|6PudRKXXrwi-^&xo{{~U|2d9H&tF9NGvp9q$C@4@o)iQsrL`A6`Q4$)cd zEy!J%d5>YBt8!R0>S?P}sKeG6Hba=f2 z9R#bAUiH&qlaCHb)>nvmN0|3+{EpG&x5khM6k99#ayjG&V9mPo_>@Wjf`I?Y2* zjfN+lj`6R#yDScR)@U6vKZP-8GN#u22)-R3)mfi(by&|}&B#d}IoIS4bt!vV?g7I5 zJ~*faA{BZBOC71e^i>LF2m$7p`d?x$walm0b_>3by zfS%NQVSx;E5Is_QmT^_S4mwmNcxNM-&V7!)PE6l1a=!@_=B_#zTVwLaX+6jJ?MDYTy2A=Z?&Ce9>H00Ek@_v{f#Kg4NATRA=vvSBzI4tPz*dH!kM65=?u3Re{>aF| ziee38H<6Zqa4KW-ZL4mBW6ZU;!Z8Gns`qf5Ks)8@DBouLhDo1q%j-!S_`Z1z_08ji zqs&9&X%5GS@80iZR`L67_Z9U!R^EJSm=C{)RXmTe^~~Zq#GWtX&2Kqnoa&hQy~Eh_r~x$YNrHTdHoLX zV)zQ}JS#W>|3G#_@;VMbLNYM{Iq~FHzP;?rWAquJ=PrRiW~a-O5%GukrqZgscu}N& zv`yzptL!B5!@(gU9QaK%eixze-+ZfbrSE!d z-*GlN8GL|Uc);TGEckR;c#A2MuKzf)-${S1Ma^q5a5bm8qzA*wexkG%Z=dA=iSjDGx736h@oulAPwQvqF z?quLx4;=Yz9-Q&O5e&g9m-|EXc@bWZ#U?f5Cv73tK6x*?aTNI#r0WU2bhCFw^4qW* z=C@5;y78MY&~2dR&YZ>D!O-QFr2Ed2-qUBD<$^=*HM9`Cf&9+P`J%IEge^i>J|p`l z-^Q~&j{{G(a0+u8@0*jJqttvhSD?)^!ok96#TN-Pmnp<+iDLxWK>a?p<^b>X%~Et} zXZ|(yBi7n}g>=153syAt*#41w_(qSV^#jz)9=?Zn&18E#TFXZiUfU|*wZY;gdw2_b z&dvA-y5rbLx<8zr_TjXx0#1K@sf1I9#p&^WaN1h|r%(HE(i!R~aB2mg`hIa*Q`Fq+ z_@1KZbicuAmq~kc8s@|43X9V_`@v}v&j6Im0LgYbRKy?=Stx78tJf+C-)h0`2t~NHGmF(-;3xB_E#e* z+k{+bU!}VkS8wqfUC7A*XW4%F0AXap)ALn~B|YB(9PJ-H*;)*Y;rM=)*70%l!Q*zH zS+g?Q!}xLFd>lAaeQ+ip0nR^#v)$)zdgIWc)_)#4G>SPkFyA!sRKhOwX&w1nNCydq zCvo1%WIgE)Q|no}&)j9k(mx65d@OK}UH9%8$Qg{|wUb`tUhM}}$kS-bC0C~!JluE4 zwO+h+_e09H?(Set4M(*_H2;ey_JvOLVXsxt_S8GpRDXcRw}`i&y=K(Cv%%EoEemD1kRU%v%v>v z-4WniXW{5<t2H+a-6%n0_Z&b~Kp0*!U&b+yY4Pd+@TEj}-r8;RXXGnfV)b zRJz8qfh#OcU!!dbnr>q}`HUV-JD}-}=)6jL9-}iwB&ApCtZJhM!f`y}%l9S_6Kvg_@K0F?CMo z{%dDvmFu^Q!wL7dTI%E5iX)Ql@8@`O?(H4UWggl) zT!MX{;G4V7Ek4~34c|{6ol|yBcHe1khUt5BC%`#Yiuu+Ngp2>|@Kz&V?m9DPmZCpA z911MisB0_u7kBhC{#)te>C#z@y9R;H60an9Iw)!BEITDSOXee-vkNcexz^!1M%GGB zzqeSevjxdE`>bl7TdASmJFob=xs%TJe*cg4l1np}2+#A#_D&+L{aDc8RC-wJS$F&r_Rb zYMP&t$2)Vc(N4Y8(9N9SvvV%WN8Vqw5&{)c;@05WNE#f>n|$E(ii&S<=5#W zS(zYAL=+d{frmR{EUn3H7LFH4^WmSl+!3m3}$op1It{+*V_ z!XeC9Qy6y*vF-={6S8z1<9o8SnR!W;ZZbF>E=w0vE?GL6?=;AMcxM`#>kp42OL03- z$x;;iF?Sq$SmFuHQ_qJ<@0jO-qUpl0=+BC+$WF+fJ6uh=9-r=VU{s-(bY3-^bclV8 z(kN8(JP_bUj!t#r*FIF7OWBCTs=R!>QSnvz->VIV>+Tw0xz7R3 zFt$l&OEc9!sqf{iF?->t@|5fBMe@LV(jyzJj~Af-RD8V8b8a-n=i|lj@qXG5-|Ofz zkg-R^gv13gI(CKsC$;yP2Y#%$wmw7=j63!?_e(L=zsgMsHUhxPBRJwK6JsZbn9*gRcpnjLt+xf7OqS&ZbYfjOtukvbmBv#h+nJ$>?J8 zlF_q?wf@X=bjau%RvyMvegJuR5*h7520Y!dAKB3ON0QNr^p%We65KB)R%gFR`q8-i zO`Q#-z5UF|w9|g(TgY7bex|=Uo?-EQ9ys29<~YiRtw|!+)wDn~40eD$1qbEwHe0p@1+Vmr%1A$d8qXX36C!@dn zW&biNd6tY;@orAJjOP21(I3#KKN;nLS|g)H#*~b{KwdJsoVb#VuBKcv`o9%qRO25> zM%U8!SY-5O+DS%VMYhUiw7)qnvH1FBw3#x=sJ^jKE~EXyX|r%7qdU>9p|jXSV}~7r zbnS{W(W%7i$d4gCitrjbbu{r9%0^MQf&8Aa(@oEC=wiw>!F9 zw70wL>cNx`DVCyvFu_$@5{j`A^kd2eJd7s9^{EUpHNLzcbVh`sz-3KlPiCk=~hsgu3@ z0Bs731LTFp6Xb0yo{8+`Ym}d6ey@7BbK+!A%UxwnIy=OQ`ZL(X~*1$O@y zdnV#K;VAa;+{$*TiN8RZOZtp#9&x|&lpi2}>^bAjM|$b(ZX4_9qgQc~K>QHl5ccp)A3h@K)1*s;{p2Tz4^ie4ZzF#<=|R%L z8BB!1{s@EG(`r4PADu4=gS*JNkAlqjrl{SfxGcgS|F& z!Cw1Q)b(-)Lwfxtdb!9^Tkc@E*B17-Do?zG_ww|#ZLfV5{Mu{(9axC(we?-gg`6!V z;dKB$*++M6xZmdf826{bz060c6CUrPUG?R*fOg{eIr91q-+tkd_gcpyJkFzjih2J! zI!uBaoofk`&w?lEp!TJQIagyWf_p2Mz-P;wh~)i(cJ?CgX)vjMw!!4X$d)|))_c5P z-PP6}{tfv51Uv<2%A9Hb1Nm*p`v&?AS^8~E(C;VkJ%uei`EKw;JVjVeD3DkAHkDxq zd&tXXE@%CHi2TuI1oDSuE8EU*!hK39z+iZ9MEhawvHuahE{^Qqzmqoh?-Qis>+RVe zwcEdnXj1IoKT{XCf2YOIxTy`z=@I3bOW`|?sn5eNO#LbWQ~EAs5}x+KBRtvXH^#<& zpE}{`2ec{s_SfWP-$se;_12u<+)ugAZ+^!7$IoxnekYssad@@fn)92Fk=OanDf$vW zze(#$G1ALEzu8EcY}-xmn0|hfCg&rOoZvTq-h*v>7q*M|A;J`Pu7~_W(!F5jVe&^^ z_P^v0lU`5Qtvqp^5MU~@ZQ;3Kh^s9Du3GEs&IntwZMV=qe^((`U-c{-+a{Z$xiGfv z7R^g!+f?@wdEsxfwf=6S%wB(=6HN;KZlf)OKiM?lY=ihM{JF}f;O`gI34b>;)^VHm zVb&y_mnUKHzu>#b!k}!L!C)^s34>QbBMdGfFAQoNYz!Kk_B`dXX_xSQz_?A54rJEV{ot_?dK?oMn-m;5T1b^A5j_^Eu*!gl@u(r9)PBmkxf}Xk^zI%A*WYhZCZA2Tr=h*b`QquG0sWrO zr%!jg6UXN-=05hG2ZQ&3-S~bVlf1#fS2m)3pd*%;@ z_eKp~--6AnNBn;d{~>rsks-gS5XrbV;+M|Gcaj|2cKrpsW=!PsY7FO~+j3;h?fKHH zC(v2_4#(D6@P_(lJ!kP;XYf79YW(1BmSb@8zH2g5rGzlV%H$oMLl4}O2TC%lJTN1o9kX>BRM z_d{e2TC#4XY(27kWUWO9vk$u-SzA+V$`*L^{imgtoHdj!M9w&J=383`P*RkmB$@e;vc z=Qj|ZeUZBbtRqV?!rk~M{XEuJq@}40*5ZznUcR;A-84qzOf8!uN zzJoubv0F+%^z1I8+^ofaPnp(Y=g1dMy~LR78PncE^LHm>t^4WoEg!?a-_G-K;yC;U z-@4zo%^LgfQnwM=KSu6`NT%ekMW$ria>M;lxEFdBK7BWGt;P@=dhjxQL(=<5zl|_N zUg-@4)As{|e5Z^4>vz?c(7#^n+#ATTpWTPhWp2+GUw!?#_GfoNG~eb~{$)_l-*+a) zItTCa)i-lL`(fnjel{f`k#OM zX~!SS)#~-pVtK^RRvZ3kcFZ5i=4)QA?j_e1JilJ6jEg^!*Z1n#My=SfzCK=+f~oxZ zN}*$YH8)2o4oLf;eVI`uKm zpuX1fSKH%hlVtMDyYJrM_W8^E3M<^3+|gXQQ1aYdp-}UD-!1y?rmY({ElXd_)L9ol6@ z_3wA@>Z{(zbouT4FvKdEOz9H<_flIQ!i`& z+IVjYKW?7E@d~kVvu4m`W-5(Z-ZPWc8lX0LuAW+VjA_h`T#)uY%^%M%kGnPL?ec2X ze70Jt)w9)FW!HGtuV;-W*`W2hQa&F9XHK9He z+CF%}n5#b98o+k_Y-G>0-!tr!Em}q*rEjePk=%TxT=w#HuaM0TJC0T7-QU1g2BmG~ z@YKBfS}ZmXb%mneF4C&cmnw|{+#^g&uHNuN;aN)!nKxs$EHt&$Dwd1&Vy;yDc)NXX z&T+xBD9}4!@^UpbS@i2(O}zxT!@2y9Y&faBq)2Q>HnG+kf<&4|IY!k%Ray^kxb;FfP z;0M@!vUv-Y#&9XtAGyoM?`e$>sT22l`nx5*1AxfhO z`(milWrgZom@e#FXF5%5+W4!k)A*~t)A*~t)A*~t)A$GNUts)2bD{AMg%+L?@#p`FQC zwbSx^#QZ~J@2C5Qn<{R@_iAn-SI;eot>c?254epgH6HFst}yP7;VsE$3YI|mgbx%; zC3o0!BRiJh8*UlA*)Vv8zzx!B;?^r}u38Ozwf6NMhcDGvF>X(qZ^QzWmD48yI4>-F z1(*LD9==DCpTcroEc^A;_J&4T0##eCFaTyrG~H4E!!@bdt%Uxl|MnW+q-_pCd;cv9 zIL#-V?!f0OV;Mg;<~PbCnL3MnIb-p!3^sbPIql#Zh5NunFQ{F|PBKDlAcSEHw+ptX zIAb{xpqk1svNPsw`mMH0(v)PYGi#Y~7baQi|4!GY62;GU973IEDm|`yoXUQAb-W1-FS01U4 z2HV0$u!W4t_R89d7p8AtV{~J)ID078y|FZWUT7S`b;OL4rG0P)Fq=7u#x&@?n zWVCA<$Ng=rZN*X{oSUqV-JiY(kN3xT0D^A-h4|DurDA!9_Au@G%s`GkG}G*~q(<&u zYv^Nbbi!CrXK}{$(^zPow`L^5QH&oHUzA08?BoiG{liYP5SBblen6S&6dw7*nuxvL5qGi+ya1bwgC1#PuJ02b(;q& z7j7e1`J)pS3n!iBo7Weux$aCKKkb_VpIPl^rjzY$GE6g&ANM9_!lP#*0SdEdFNwRu z9GOQ2I}s*rvwDGkMi#GQznU0M+p~rz)7rVp_FJzt?#gD_U1bM1ZyCyF?{Rq@RIPB} zvAoY;!8xon;Gw`|tmm}`?`mJsk$uW*VGZ)aJkV zH7;jUrEd1ITGZOcqotP~Oit{1Em6v7H`*vMx(q=YebkTOK}@5;fo-+y2CJo;AI|7? z0xnUX-jP^y+|osS_9~sk+KJb!{DE?d&Pek$8i5Eh@o=Y>oLHzpbj&lX^m;A}MaHrtS#65($gma7MICF@(jpXo7-FYhk z5@-L_VR|7kcL|)mgvEsUgkPUOUpdV8AkGtum)`@d{9C`{@Y@d+)z9?v8akVgzJK=r z;s4GUn0ZZ$&tBS^d(lk&0XY9GcRxPkIJe$>^9}CuA)S0(y|Gx%)haGU?)x&UGppRy z1FNpf46Iqv%D!*a>Q&b`>j0pW^K!#Qr)wF>dDpF6=e%jbMeF8wT|8$|_mZwlyDp!* zwCjqlE9Wfhax(rXUV1$@>|}5uyv#_skr{5V{aRTpIGNF$Kk8%(<7Iz*ER5?lC!pEs z)qIW!+cH_|II0zWn5dTOPDXFwoJ`%@#sAyMP*u@Uij(n1@!wfjLYnAxML=WH_vH~O z;y`Y#66lZ{E9Pmpg1k`9u$A*-P4Y5W*^xCOhaG;CW#e# z3FaePq7QeD0(+ualWkFW3d15BqL1hl#4DMilg&|B%Y{AFiB_>}k7i4G(aAC-f^3_SCpy`%j}k=p z0fKCy!URO3lbtkl!=$CFY^-dw!a~yKW7@rk0z+r)+=DXE(MNO&qXa`Yc|G$%a1TdB z5sh+Xf}zuzpkUix({4SYQ-9AvqcF*RGV?KXyD5-7(LKMYD+s1ev?k4C>M)(bIA{%; zgx1s|iZxDuLoo8R2A*5o<(yMN^bwuHcL;_~HtX!AUBNmVku~KWr9g56d|WoiS#nud xfblrp4=Iqmfv7@sYYb6Tr}`fekX1ERw?W6(4x1mNs?p6uV6_upZ~zTGjrz5nKS2}_RLfEz7vl>A}6zMrgJXms3ZHI zY~lal(^KvD>g2b^T99$|k!M`zTvj!Ff*bL4ZRavixU^rt6HmP4s_U=1?vksn&O54K zzr3rjz3Spie}9p4H!U1_%FscltgqRlVCl}j$J~4S-;TNJ8N(x+7h3`nl`#k2P&{pByWKUm|WHre-Q&QDvN|NLL>eBs{vzbanwhZioN zJGS84sb!<)^<4YLj*;(APaB_}{rHg`PwISo_N#pxR#|@M=aVL{SlzDou*{}cyWI5m zFU-HLv`K<1ysdlpgBp)d`cVb&Nq{W}Uo#k#HS@`5165LsT%de5} z>?1C(+C}&Fcb6RQ-k5&c{R7 zy7#VDF8L2`$QMnT+~ofJq^mw~`{~`c9rRZ2+SX>NC*SKnrfJs!!_G=?drjKur?+d^ za@tX~4yxYeyu|ZH^lmrd<|peMGOSbO`OD}^=eFH2 zF15Vz`RA`HTQmLjt9v`Q;`-ZWl(lL9e%;#-Prdz$vgey^PQK)vtY`nH;DL+ZtK55( zdv^W8(|25rZ3aB|@R$V))~sGV|L945&pPj`({C*sI^o>$rQvN1Z=raO>);PO5s%U;2-D zaK|ApHomX#Ut4|FY-ag|E0?t?PU^X=vwP>Vo(X?=r0pwbUy!u>m=?K%uOGj%z`5-o zU-jwimgz~iUvlS)={J^d=~a5fv(4P?7a#T4Yn(f$f75n@zIwmc=jqP%e|A{wcly-Z z`DyJo<5TN@nzH!Qtdb#J{@l0eqzQd<`(|Evd;M#Nw0h%?zAf*b`c8w^L)y>o-JsL> zlP9wA`t1$o5 zBa^E>&@}JMd#j(+_?SmJAKBsL`v>KndSrv`J+4jcde83$e)P!UU${f=D7ky=5gqMx?DE{&Z(hHo^1_FD_WS(c z@#|`*b)5A3gWFA>*!SJT+GIR>!IXC!zmfg=7-QI$QDYM*~dhkFJe z*`~?dst;9bpZkY<`%OBuY1RAs9nxaV!-+?|`;S30tIixa^U9N(tZ(z`Q=N{i+vL$N z7hZVzdud(&)+Xtyw@>iD~U1v@1noes{ zFM8sTKBvAg;^ZZ-JU6IH=ZDVh`{r|_Pk#HPdtRy5>3>FaoqA`@qmFs;&F3GRRriuw zmlRz3_PXmosH)iMDUE|Kr?;YB*&QrD1Y7eb*W9_$} zIQFGFvmU7P`JjUj?XdBQwNF-l@~Tq@w;tX4k2N0oD)X_UA8Y(m{mP8syjtLL0@>std)?Rd(nS2Jcm{`#q}jXZJVDfLbn`s(4Y-1FMdSFRe=>mRqB zQF>qM85574ctXE_ob>Fw=dKz%IWOyiI`7}qCjauB*YEzHVVx&6e|PGFKi<&#<0ncR zeEdL<*Is?DYrl?1cRc<5lXv{>;$CU1p17v)>FbZrSljaD;X7`-e`)nCtyZ?G_fn^0 z$8@;pcbC8R`0&REzkcNFC%t~e#!tGuwdv)NFMTrL<1>nfRqFHk(Jg-0;)tOSO-mWM z_LK#uEO|Ne<(kL!=(g*vcCTIjV!h`+?tkOBD_`FH#54ao=k{lgz3SzqH-ECWsQ#_( zO9z!+QS|bzBeDmlzMtJRby4=T+TB0ve9cwe8?^s?(YBNNojtL4zZcJY?7ZPC{`|<8 z8Qou)Gw^>0R(|l($-i6Gbk!A;ubBKo^VH_~&5t>5!*QEOoP6Avms-7a__2o{`}x$b zr#?S*?vtIL>d|4|A#0yn`_#OrmVGef%$v?^Gy0X$A6|6Sd#lfU>5R>z$6k5YnO)C# zaqy{Up8fv7H%GqNZ0^Tze*AKkm&Y9c=<%;VGk563ceaiGa`dYo)Olyk{M1EnjlN>^ zt>+Crzt+$XK6`88=0`ty^wy7V{om3aX*u^SsPuY+GaKA?-9N9b-tDw*OGiw5dULN^ zKim2E`u0NyPtTn`zvHUW)uyzXbm_=bo|<*U&{{*sTzBV=dmp&(m^-Gl8{V_sQ}re< z`Qnq+M_<3|nzL8jGIQ6+r`~^R!lqXiy}h~1=1Vu_SwSx1u)atpr=e2)d)pJ$% zLzf=1^o(=AK6LyCUwkm-go#%@bM9Ts`u(X%`Gw`Tl+SQ4-`*@?XwrSd`V2cOvAFP- zKjx47ORsK=F53Oxf=zuMe0EHq8hswR*juwcHXz=JuvaM>=t+3bJyv2_xj7#_YST*qr>pdH_lkx@499Ei~2v_f9X?0JDkw< z?Y2jEZr$^>c9(Tuc<4u+KI%2O-Nk2oJ!kO9!AJf6nEGAYwSKG1mB0VjvXV_Z?pZl< zW!9=c)Ow=*7iV96^K;WC?7Zvcny3_{09TwNGyAS86`kY(vBH+}v7SBoA#^yw{s zFW*#kLe&+29sT0n$DH1_!QgK{dE>IK?{&ZC=0%ySYNQ-=_i3qbbpP=F(XFqTbHeMJ zP9Of(ZJ#v1<+#g-o%88ecYHc3;qr}Hr)I9X>(-5n=WROsgu(64ST^dsqPs`d>sjNz z``@a*sMhcrf12NN@l9*$-E-AfnL*e;B*F(|2*KGPcX=YMsT9Znn=Z%>?r@_n~gHC>E?m-)msPuWGf0d2ga%0<^E;*=WtUaHYRgBt*RPm4p!|WghmSpc+V8f1c>VVG7Okmv`iG~Fc)Q!VS8TX`L-(>r zXPxl*$4`Ge;;k{iyL`;%TRs`}hl>l=*L&vBX-jr~a`U#D<#Xpe)3wKvPj=jLRl#Qk zyOz~la@(~nN~cZvc)^V=HorOcgt6!D?7gYaf__WxnbYg6vc>baEdJAF<8OR+$Be~C z6r|pD=k&5ic0E+NU&=#IJ~ZX-oVzzZb6C%=U03$Hwsd{T%l)QbIKBBZwaT6^oAOqz zn(c2ZoU?J>v>8v#cy9Ri;g62H;*T$uZWzC@&fAM7Png{BUtiwTvBNn#Pb=Q^>5YqT zY_R2pWtC4@{l~mNwJg76&%3)$`R3)~N9#QLXnAtd6FW*S=-76V?Kkr-IP&D4Mz_yQf&Wh47dMTpt?0I)agY+wM0#Qez+jqzAB7t5&&n>(x6tB{`*gQc}_( ziHV8LQd3hiGcqzOS@QdeADY`(-57430* z_7u6o!a`S2P+;kz-Nv`bc&3$`b6HuL9-!U3cY8qg>;arT9xMaH;jz7d3;|9~ zPIh=YKw4T_h0n~)^c`UPjva3IuHBAs`}Xa{CTn(SNy)fv+qORc#TQ>Nl1t1p;{Q*l z>fbb|rktkMl&J`)CsmG_KrnRVAB{!jJ)v7K#JKK+>UAuNU{0=iXz~LB` zfXAqm3)93y2VY1F1KC8UvH*HKj+-p1rfOvaYdF*}F=WDk;^fRdY7CnlZOBTHMZ^JN>j74-RR8 z5`ro|(ZnNq7>b8!Su-mJBM!(pIXSL!<;pHMH`nyo<-Xgr$!*!P*|04dZyoHRi4!J_ zH+jY88NL6tsrferY6xcEe*Mn0Dey|$@U*K{tEOXA0^%k!+_r7oDhw+SFmk*TV1(o| zas|}>8g5{C5n&$u;1SA#DdZuK5nR1`br1BW&70l&^&6Zm0W%8=3jX@ZCu3i-BL6jT zL*0CX(D%RCseGNLgr?b)zWw?SPEAX_!PdxD_3G7iSvJjW*s#HEHbY@NbPJUhND4#U z#YY~Vv}kH9p~^}=BQu`v3HBqNP>$-9{2DcCcz~Inzg@eIX?p&iJ%#s;{rKZoOa$Qm zs?&0)oAmy#f@%t|;HC8H-Mg!e$_KKtvpY3xP~Wk8UAuOz2NRuhb>QUL}A zf*pW}<8hi&mFJ1}gW&}xG?iBks8y?$v!=S$tJk>o8#b)B9o4O4$A0|0@&2NtHr^)a@~eSrmHE-xq)C%X&0Dm1 zDl;?dr2PE61iRLAD_5@ch6_g+29cAopot#R5G}gO5W>USrfHKf_t+sWvuPW*@ui1d z*`~GrdenBo?cCDl7S<|A2v4T4ToK=jG?KLtHR_z6VrgX$xMXiZ}{}MuwM>fX6_}qm0TyXR2jgCJt|T z%R^nI8%DUq{5Gz{4tI-7t)Ai{FJH3*b>XE4Ax=6F;^61hNp(Zl`VLKWbu{u-R(V{O z*$8#mA-{2cquksoAKG$srHM~9-d`RAHO9B#Km0*K+XSWe?%n5awzD15v}u!sEp~ar zW(XJGa2l`r$sT8mOFVX{OF8Tqmt>~0gMF7`qckbWoUoC}Tr-`X7`Gv57pYvM~BAZ@~v>esKI)23~^S1VPnG_Y}Ao?EeEg+B$N2%yLi zq)|o+g@%v;#KR~F4Wu$`hB#p&O_|c#Os(T;28NU!Ae7sPGGMLS_n5Z%z7_Tk8+oiu^LqE`TYt{%S*IEA4&#k3nkDex z41W<&O`#;)5LId3qUGos)vI^5%N4hH@ghGJY822w8b>3E%Mr&g&~X?;Wk?f;CSyUv zDBMxOF@lOZ9_7l8xzvx&a+_+sDC`*YeLDg0MulHSrcOMvaneh=D1?p|KcN7mocM@K zSK{y}FO5Yugv9n&hc(F6P z8DC;&Q**5G547^%8Sj4t?0*ERDUj5xS+lAQ8|96uQKM!%c9nMDu>u$jL?hK80R)Xa z8Z90g99}|Te9|&9an?^9#w@Pi$}K(eI+tw+7)ds@h9fh?2O!WxP)W!4VrZIr$&)cC&y*`elplJ$Tik7k zOEtT*yNwM+2BtatF%?jwyo^!GShY@6V)~dI*5ds+>8(70DV<4&U=qix+>h~v?V()) zoAS$-FL!x)c~srblA~;CVZ?4XzF+~7W6Zedgolb z4nr{<3dc7X#nosUg9kj($cM)Ch$F2KV{*w-0r2rxxi31N8-Zzn`b!qVQoEe7uvj!( zTS-HQ=JAfnmOg}`mtKT&)Gt6)PI-jrOgqG6*jCX90h`Xsh^=I&UDc{q?cDmH zgWkZtR^Pvc&(AIttB6DS$8vKk_v6}Y*|KF`Pa3U}20=zpgUEx14;zmWLqm!m8M^gG ze9y@@xk)v;yQ~BoHP(p*pdHQFRXn4%%(2S_%!)8ZXS`CsyZ}_1kb0pLk|r*F6_OXm z(MxGU%HVP0rL8#faiLt*3oiqMJ&9fN^y}TH&*R3LVr70dMn7x%wF=NGxnIBjSJ~45 z=Wr(6CTH9-8!qE?&h6aqvpVh!XvV{Nke>(8Hxh_8KwE4T)RK}u<>zTOe=qq`&pox#H60RdiTi4%ovuRmzQ97A1Xi$d!Op3 z@i+lXTn&&RNsEts8VU`gvHlU(ZFi`9u}WX-PR1JpG*Ud8R<$u=e6W66H$s$miX}2V zbNLgyIZh_VmO}^9p)SfJBrnuGzHG=N0K@VJiqk$hfz0KO0h_RR$&z6`di0z&apHvW z#zTmJCN4UeV*r?cLBM zxNkaNVDqp&R+3ugifn`$wg%l^#{}iK6wyHS8ziIn{{(EHY)1C_pp)v{E8&M@@T(na z7h&j>Ry)ExXaY~2L43%?QC_wo&BFpVaMG77UHWw6#*I5!K0D&Qy%44YxSs^738V!n z&6+oV%5I%C;xWqb)>f3gx95|_qqvkO#5mAVp0o^wZjvE>MihK4I(2j7wwanKHqxw9 z+gP&s&k7JXpoCp=%*GrtMANX<51;WE$#KO@{oxvBqzWfvLy!&?nHEu-pdm*9s14Ge z{7{zC)Qep4iAS>FLl$&+ctVng-)h#V*~kixusb_v7`@13(CQy_H2bHxq&|K7o|BVP z>BK5_Zn<$I570$UKq*8ayc&R#`}6R_BM*=CB~*HAO?xS`pv2B`t+CK;SIY*e*gCD> zAX&ULw$o*EWV39v>-F*2VSX$woe8CrXy}8-`0QwPP{H*wUTL1v;Ov;R07Zt{p*SN` zqZ51JNULqCpAZ+ORTewvn$mpJgxkB(GRDADHks>w;och;+0 zCxIPWIPD^u#;E~eRZpy)KGLEqR9=`St~6zk ziA_{Ld9o2Sbiq!cEm`IoG-!~pd*`lU7QSWmY_)PfI1T?Gs3rj0q%_LQd$eY)nzi&m zn3N)0U`ctU389Hjqi~d^TqJt0aiZMl7eL|5$f<1Lm{IM2q8Zz7h)iQz#58PMLd!E1 z{jN7E3j`iW1Df|OBIp4%mLKR8ubcFWr$;3tUCC4DAjAt8_>jTKW;EkMS&GwXv>J(vKXc%}H(e>&#aNA4m;C{D(oXQ$$9tdLWIloUJm> zXGiOq^rLR-#CRAPAL`?aSsUUV?NT0b%7o>R4-neu3E;3^$)rQ5yz*rS)dMd#02(!F zWH~l*=JuEdGEGa0%PF;K{cUhpOT)D{y^P2brM&vUR_aC3ZRf0MkZ+# z1vGf1pg>e!sIY_rB91bW*{or0w=>6p*|f(c7THC;X~eo}OQ`jXXtb7FJ;heWH1Xw= zEYI(DEuTpWR&sWiC%arL8yegfupjhR2c&*E(nr&i|?A$#qyRsQO z)0Jdbv-)g$-?7#0+Op9V?u^cvEJZUPGQIro&N~#g$Nm=61aVQ=->ca5IXjn7X zmDR{}Im_&Nb$0}6GzUi|Y@9?>u?LnBV{%z84NTtwVzN2yEi+J&iF_Qo$YX4b&Zr`e zBThS^bIOCOTsha5shv^c(lc`0)E&9*>+%L}?5<3=-Q<;}*}Y%uoQ*QeU7L+lotycI z+q!tRZ!2|k#lVAabRgP|eCV=)Yyu4jT{LWB4~x63?5xA=H1G6J$B%!}SoVAEx?fOD z7?w`4(Q{Mv>ecLtxYb@bMj(qyiOUgJuU1H&=xPK&OG%ZD54lf@{Hj%|xbl=NcX;z^ zuEV_DZo-;ES1r{>r4=Z3cHC$PmKsndkonv;P!nq9q#&Q(X5=^WC9s zTDp39OXce{t?rn<4)D@AqXSWjZ6 zNyMCqZi#ikCE16&w0_-P=Z-U7+QgS!!HW4_4v*b%sY0iT%)GaQQ@`vZT|)b?w%TZA zI=f2T3U)d(_1~mJ^!z7-G!qHT(Nbq zjG9(khTS4eNp_{?%V@hjN0V&RL<-Ztb*M?X2fN%;4t5=A#?Z?t|7R1+4B(v*}dc|nOM;N)Zg(y)bIG!)v5SiO3~( z>(;Hez1Px)Ib01DD1-olCoZ}`QW{0Yhgk6=4<16rm8Y_VfLf(Wt}84xgJx#Cdrxj= z#@JmHYEPX;F0+L%;iexIGk=-@7!fi&U6`d>}BU%1JraZ161?T2#o->mU|#0Kt0Cb>;X>3KCoGP3Xi|q6&`n` z9eYOCxGZtlnq9JH2#rkiL=O!DLf!@hAH&H$_hlQ5IJXbM8j@(Q;MYt}N$yi(2GUeO zna~haNJXM6uIWm2LMap)6N8CIa-qdu&G*-2j1s1%RGZ?g?beB$8-8AUH*U^Gw{Gn= zSF27XS7fURl9+ZAjVaL;xn>LBa;?hOyDU4-_1~ zU$e*$64p!Fjm^+iI--trmumJJhqLco^tR{2YR;WImo+k)pDhw0BTlnj&04iCvzL5Q z=sEivRiZH}soX1XA#w5u$rGPw3ROnsM3)NCc{Y~DF$E$k+14~%)tof<=GC2D$<_i_ zu)WYF+qA`qO)1>tDs5ZtI)3q>Ym@k$FU#?o0F`Vy9mc^cP8i0OPZ>JgMI)xUZ`T#L zI`wQVH{I9_mHIW*OlR1XgO<_hT!0mgOp6=A$32(=H_A75pO;jpkxRd3xJ&JQYK0E0 zv)Y_WZ^95@(yXmEqovfSS@SYW?t^1R!U~~Ra#CXAi5L=tsKE%KfuUE=0VJG2L=1d{ zc;&;RIHC9zl8+;gZ9CI%xUNLG&UJ5D!`*UfGq-ug77u2!=~-{n7p~{(H(g6Rte|cV z!qr(+Cv*X}KM+G2N2~BZ_Tggp^1oKP+D)tZvt|xD%9(OKsMbzPmw}x9-wR?4z&bovvG&UPOBybGt_g!b** zH&04RZn4{X3x(tq$3PMGk@2Yz8eTjqLkJyX32104BRLAWE~F7mxjZ+_D}lNbLOD73 z|9n~-H*WSuH*4xL*EV~qYmrspa_xYC>uKtf!w~2tK&6Z7Bn;zGIWEJ}+~;%GyDMIp z<0{z*O|;9EBBoith8kKnI?JuBzr}|P`^S{4sWuv|q|FAFzc)`b=&?NV&8Kzj6dy{9v&K0S{j|ej6A=k z>ss=v2NXWL-?-20B15QN((3gZm86NwlTNjB#+`P=chhs@Y`bcY(d4Asp#~$8O%dxU zQ?N#9)HVRB7^yxU0p%}mJa`d^6>F}67>!neYvoNyN~J2U&gJ*Gs>hsDp;M@L7)Mv0 zfzGX5DIqf}>l`yrg<->yYW7aH&)V!IVNg86WE_mksDg$g1Q3k^z+l>>9AyYmAar3` z@(BT)sh4+6xU>j$p*-cv?4Y5zxX`s|RKpD!GQ>Ui+;d(BMm2TEJIWvzU5FFn4iuIe zPWRq>udBOqnQNBS!R>O<5ur6CHaZC-a2c&8$OGitYH>y#WPrx+LpOrxCN7HmFh;jb zz^#4CP`7#1^M0nnuAvLVp{;hz+t16_6k}a#>s5i z!Bs!<43}K9eg&vh$Rf{rz_yz>yp)$iN%-U$!8`WEB(?xf6~* z&b4aU(w`M;=PaJE9^$kM8S>B+55rL(e&klITH{|B?v^muHD39e-&HfSX$`HojPW2E zIMzHr3M~Y*eMe*rJOS-_qG>;xt|LIBj$j>c!)mwn&EfuIA)2k!DY3siwxO-enr5rE z_Q*@FnZ;_^dySK5>)25_m2#5x78#ioqVXY^&=J(?hDZHlm{m`?-0fOA$L*T^h1)fK zqAOgz7#2S|kfo>UxrhfSWZ@KIPyhi?p73Xb#Me*4Q7WJa;oqCKFIC@svpe(5Gd*Zb zN0h|~ICwR!tE|tk9~p(TbYaK;!V51{?4H?$w@xc|IrB!iMNLn1>(g7o9f2F$^?CqV zQ$4`3(2xb(c-r0#(!RjEb<14Q+|S+a#WP%z#kqk{Xfr1IOE-nI4LXiEOQ78(NVa3u zqihL!-pHkzYpwo-p7wb-x4meaFQ6X@lOT-4)VOW-6lY7cf21VIuD7xqv~(Fqp6iO% zEO&+TzH)^#Cc2_!v;AHh1G4r~7I`|s(MZ(vZFlzl)Tv1O})LZ4%LCGVIBQD;1?zzXe4H-BNEm+^1)~V*Iu6oza-MYxlJLpt!rC@AS zS{NIl-vbh0_sIiH|1e(xYEoiSaz}0D#jGBWAPfTt2*i*(CXI4Q%?|OS)juj?orh;*f=0>f%h3(QrORAC!)30T?NXObca@8GdLXMbZs2udx!`sh`k^QFX&^~o z(rPm_Iq8PJ#I3DOEzi1=t*J&#Xn*j*O|5VSJvH7*Acb*+_+&eeEnGCiB{b_01JW)J z3{Xa`)e!+~VEZThpjD~s%DSB3$~vFm%C~KFiA$!rw3+{MDJ$ogylDMC%&rNu?PHR1 zD69I_Xwmi;UVr`d?y}1+^ZGHu7zvbrvu2*L6&Wy<4tjy6IMozm0+ zADx9WWoCh@1?yeI*>Ah5*>)+l#n#{1<6ON7e|HU+PI7rE#jZikYTjlH7RoRxnckU6 z@W@oCHYm-k2~D21h)3~|m$nxb6;HJX)4pN)1+mu2w%FRD;@d+*C;*tm5k?$gqy>EO z%t@~N*vtG$vIoxd9$=*U={Xw7jA%{Od$MY{g!X;imragv&wX&MTe|97*Ry9&$2v(5 zSEJM*=@X`*;h^>C(ZemUk7kS?Ki=z%@!6QMvyOKke)ypueHaiv^?dk{i46pT%F>~s zV*?u*&OZ3%Hroh(XVmMiR`sf`RQ$Q+ zS2;p^OvTD3&}*aTFHBIrJ=a?yM8XtOk>Uywlv-@3NvjsR(t6GO)a!x57_n)%V(K-U zn_e*>8M%093Z1KxQRHUS?c-|9ALHiCnd3JthaY~pJLHfg`aoU{Mz0GmywJ^< zF~i@^f}a_NkrFx%{6F~M1HUN?4^se)k%c^5SRcFcu3fu&-=|NXip|*e4d1#ZxoK|L zW6${STxfSsd2A>?2*MSoX1e0M_8z2Y>WzUG12Lijs7;5l&6Ee#@|lh`H3M*AZY`Jg z$us`e8`p^6e*3MPJbAKv@4fe&eFo02L!35YG#V=dD2z0Uewl8^jvec-IpOCpd)b}0Vv(U8yo~Pof{{l$%u^c()i#C7ql}#LNRyv#=K$80t+rl2$Mll|STuSHi{L%X1Mqf7|Zs7 z~>zPG#0BHaG9(YOR~&HzgQ_HH~@zgiR0+HACaNl2OLm zi{YC$Z|*w)`a)+UGFoH^?mt530$-g3K-F%(BWQQ2DyDmF3PU?c7IlOUo6rI6sLspR zwJmkwB!jxbj&UG)DnrMhOlWg2(0)`_p`T$4N2&u<7_xP(6iZk1UeXA~hf@=ZQlYPO z#&}m;tGUIa>2$xqDvw^ZPkb-HiT0Sv)>>`d9t-)X6>A;9pc@SY1nT9;5hHSG!L-Ws z4A20ZmzU?JO`GOY^3!PfYF`N*riLCik&g?@iJCeUh()mY=fTY)TvV^_wmOc z`|{{4JE<&n;*g;@JUG<q?l#FfE$OQ$KYXlmF}gT7^p-5l9mv~NlPGM z;=IXjPrr-(+u9|XPHi*-F6$=k(8x4WG*t&9*_82*qa>MP3HD^*wpuM+)%ElI8pr-8)*fnX-cZA#9r>qKC$8%H_?rL|cS+Rc}+#aC*CT zyVNU3BbY+T7r@+Qfi69{AlEKb`?q53bM>naq`MA-Di7?8Cz=|eeq?M0Rp_hNR z+HL7@oZD$ryX_Gx)=fWZ%|5&+Ox*ta2d@D$iAOyRNbh5553GFxAbrDJms}8mL~o}K zdMCY~=@(;R5Yf@eo`iJ$`t|c8mFXFN>8UmlQU*F}E@>`Xn8I<;Lyy7Y)1oQ#1?@+& z*_17}vtr2?sNzE&&f5)xm{T1-5lc(YkfyTKjhBNLv)i|n@AV_q8ee3iEd!b94({hbRI(G>f1&UHqN<_Jl$5CJg93kXtT;sF^t9f3_2?c|H$6AQ- zC*Z<3d2+}FD0E~NvBUL>vdB_7Lb*_;Xp|REd>kINA(Thwu!qA7tql)G8>NKAokq-t zSx!PpV;JSB5n;Y)8TRr>-ziVHH(FlgN(|UUdygb~*M-qZJO-*YI05hsOr~2O0=DJj z6KoW(v`+-*WY|M!yVrV_ z=?KgOY?xSE(T`arv>7@AylAp7bmHO66!M4ykWG&dkW&GqQk)um@epGX&o(uq*|kSE987e)s44iW80;Ino;uUJL<^2iii% zLB$CtoZ#Ml_gybnmmjo)wzIRw0We33fCN}?zx}owHoc+i&~&BiZF=@^TitbSUflqT z-Y?2ZXJ&}5Sy=+ufYDjdgE*mViC)x4h!dR1Q3QoNz3tk4^!XnZ^pUK+26Rs+8yPVl~;3{%5vOyyAs?s12M_|v}JCR zUHsdtVD)NeyDp9Dxo*v>xZbU++f(OzHxy+h_C$aQw(sFueNhdeK4D`O=LP^%D*6Kg zvkxOS+$2fYbIv)(KQGJ_iSgiPG|3k5(NQ_IV!fsAwYlwGc8w}-(&_>?asFa=_oyYV zeZxwwXUl5t*!HztzjpjZsa#i7xZ7pe?7}9FQLfIS8IUv{nF3IH5z-zU`S{Q&Egte> zc-f*Afok2wEr%F-F`@)?fgLXhKIOrO<2DzYkA(6fw{h&#u2ai4u4CIauGF5@Ey=8I zH0gX;FgKs7EU{L=2r>c=<6ZuQbO;?zq$gkd`5=Q4&fVT}lMrw0R;bc0`U z!W(bA(VchRd49U11F#m#@S$wt)L-7HgG)$HbG0+mT|%vF8`WiQ#->6y?Vros!(&#s zfi`llAK1VRI4Ik7Xk5#!S=+$h>*QKpQ?TR;%+RLFQz+Y#Mqkp>A3G>+WbCrc*vkA7 zlKolBde)ndR{ExTZTA4NzRxaLL2Qg*x!aKwm~Nnpp0`T1KdfLQ+P^t&uViH8*c4qY%cWD%c6tfkc-Emi@Yb;4|U^255q7I9@6#(9N&Z(X%DYW_n_L}jVZCu z%U-It%U}!}9vXtUfE0)dRfh8L&=VOw>@F+kWVyKu7Q5wZzq7|so!hw89_z4UiX?k1 z)in3Ys~*bZXb3L85uO#Hl3ni2C8e%+UWTiZR_4B* z_DzLe*h^0OE3LNv)U-MVwzjt4YG>Z-?Te}9<@Pk);*!#m0vaDyLYzt{sKQjHv_g1f zAo68Q;y4V(LtBj69lHzsMfvR6v;7ke-24W3Mgzt}htQz|@+3b@i^h`@T;t~D2>#pcg9zP+KnMrk9h#K0>xUt(WliPEX|%?FF8rMg1fSh?&B zSFNdi?$0K|(tV> z`Gox_Pi@4;<`$Xv^SO2?hH1$(6W9*rB@9j+4UVTl$0!&~`BIWJj!^mJAsa(+UzAZx zdd!$H{-U01MW#WfNG>68OoKQ9hz^QFN9KbMKInTZGXZ%x_{2*GQJc^Q9`Q*}(fGS; z7him_8$Nuv*PY86^rxO}b=tb3tmvktuOV`)>afEO^N00ZQ$iQel{vONs2j-CO-zP{of0*CG7MJwE1ET z=iUjqW$x1*iEc>$6WyFo-tl0?Mwg`dy68aYfSx#b(4G3_$b%NPi8`#T;kWNdE!(_l z(+BoNmJ$>owY}Q*Y(ixSUmGW36yH|ka@eoEW z2LL!Vma| zwc(7Ghs^{o`8W@Zg~Nso^I&U~`pj59apY4c9S4V6v;%!`((6FsJ$K#Zet+eao{w)1 zCuUai@8GL_e129fB~-KZwKaQ*)#t;{h-GKIDJ##%(T#Ogve1Wip|5E0NLTVjCoTs+ z1IaqwEPIM@i_yJGnttIcwH@%d%%qGCtV5wd3JV12q;aYUg+jo{g9lz26&em&$O|8G z*l_|VhvE1yzx>iqgFK$e2C8x6CieZJs{Tcz`)njJnpsEVN9DhaT#9KZnDNEseX|hpt#o;1-y4VA3&5TAZXO1#yk+QX8#BnU!57TT)76 zyL8!+`eiTVNe}EoTzRrLG&yD<+t`h_bj2vy2UP3z&)aKpe4EFf3*NgqB90)0$|F?9 zpi(IaT~7H*6RNxvi!aB92@tiBV$`l!zRVrb{V>;~O*8km4<`C!H?Bw3SjmmAhcxxz zciE0MHN}j_*V1CN9||dZ?X}ms$usA<`SztW|K^%aG#)q)8itL~gNE~AkO%0>D@e1? z*cySUTr-Adz<97^6Z9jG(8~|(Pg(41e-)#A=gwWvTmF7QEuTMc-a>mCZh@^)EfFl? z3gbb74oyn=nu8xdLTq}#g*@?!k}t)HGgGi;ax0AE#sv!(xtTL(xrb^ua*J#V+t}#> zn@epY5xZyWKViqIlz+rG}V zKBS8qYtM7ptAh4NVysg`kAbC87y%dMS(P!TksSeBU?$Jl^_`sw7x+B@)9-Q`>sC!<}n%Cp_FlZW{!+?1=Z zo^QGRL>7qY9upQbO9gL&P2Z{O*Vt)$bdQ&{5Jy`DB5g(|<&h5!Cp(ibXEjUA*{-C~LDqh1His=@g)Qn`G;)oOVzGSXu_kBk zSnEn{wqVmo{j`lR)J672pyHv;iQ_3#Y@emGPXCy(R!qH=+Xqx*wlA_JY_N^Wcr(ZV z3di>%3W-J>9vsHPQCWPxKq6l~PyF#T%6o;)xEL7zlBS(pV(&BkO?LPr9t#DmZGZre zO;Gf)ji_Vs5lFtffU5{&dU|5)M_|%<_?v6oisKp>hYq*~Z{6Mt%)^4jE zR0S<&h%8|`M3E>oHfEKYc2!np5540glep}G9c2^I6p}}qLr2;$9dG(>Kunmo52&$> z65CBZWTSNeT2YaJix&((`BH{-$U`|s9Lf=AgopVm7f#P=2&XRaCZ?vl;&bou7NcF> zQ%|fe)6PDWGqb>CG;7bD6~e?8PN%5b4J)EwIbXfyFK?JmBcEtfv~8lyr&?Wm>5AJEhIToVFmKX6oj=khvSk>@ zR-q>^w3*W2V+Z)-EWOVtCI5RP)r@JjNGP_E@@QgG(v$YAi|?sw9EEVCF^u8@&=X?$ ziW5rFkQN_@hY^ZgI!D4`$Jv)CI{InXV`l{-Y#4X+|0qo!0P-a=WJF&ki$cGq+P%h9 zzRPM(qk+-MG{}3Z8ll`|;4M22Lo`K(?V=M@n)s3{Yu3q?)ylJu=S4=-t{}PCQpb(Bz7KH72ahm_+5S-@u{OlCfFpAI8>!@!+Dp4H6z$o=b0JJf;(P2=U~{)51LEV`$bjWS7;>cS)ySk9c3d2he^1uwtaf(&Uj5eTfV( zZG%S|fH|kLQB*lCYO3nsT9~zS=FFM?wjIE73B{cxc%&b?$TLNAB$@K}oA?`;u@P!v zI6{eAy^P$7QCqm(KC#2MEuw=2wO6*0{Rr{YCmV-0r=yW)ooj*J-Fm@Vz0U>-GvM|M zstE>tJL508M{5!5o<^HODWOpGut)h?><1n-LbNa>pDB-!hGbp-a5NGD&KTL~AeXoW zQCw*WGK2E%T@R=km8rMLu3xil{%cf)NvXuIot#E-50(eHM~@!uM<$m|j9Ti)`MQuF z=K;2gO{d8(-{E)09=zmes%58~VsRf@+)v8}aMGL!el0~7P94T4Vn5U?51--+VUsS_ z>1>n1Sw>9Rm<$E`1vQpgYQ6Z?l9J-D!%G+`rV2u^C6rM401c1Ip@;HBgP&;^M}u?D z`GZT$@$b(XFS2}A4A2;`MuJSru=5E&Au~FS;DNP*yY`g12368rp8b`IBKw;$Tz_)8 z!U$!DtBsHVML!vxc)Ujw%2ZxsBX8EH(J1vJ)2=VAUS7fUe;6SaXSBN66Dd~V;yX8; zSWfoAZa9V5inxu|FKo~As%7mh~Ld~Z!vmI*hz__g&019hwk^tGS>6;L@ODWP(N zAy~wfR!F0CuM~c!733l-?ckm+z1wmAc_1t5K})cc9J7%J*W>49Ml`fauy=2umviES zZZVJSQu`8Uqk8tYZIX-Kf+gSDBQ=Zs8p?fKZXmD$!iNt1)HdRwgO0w0g)iLUD&@C! z2~}!ED}2Q|N@s{ll@-}d|M^o~5|6!@EZQg+pN5W&LXhE+4XtdEbtu-P1CCN;{Ln}x zpPlgJJw-)tQW5jHCt5{R22FJG!i}+Ck-F@tZ&52>`q9v%O3D`01`lY zFoD+M&?-W>AP|t}<3s>AMxd}gQgTSWG`DNxN;hrBEH`D!6#pFw9ya5&iYZ@4Q>dAR zH1TjY5)b;48omN-H8tT{6Xieo)b?F9ZC{r@f9gyV(vhoRW3e83@*gk;o z3GLg{JlEcz9|YAZqgxekSik=FCXkEViV9RwsDNlPgz~}$scJPu>nQ0u*VsC0?FiRT zK%!}k#Yi4HM0(hTlJAv19TV)QU?Tu*L9sn~P%YcFOW)`|`{HYVo;B zr*@F1HZU^rO4BBEubya!B>x;yv5qqRde8c5@siKp^VjF_Q(mEDk!E>Qs5(`j^6WjC zwe}9~4VM3dqm=SL2r3L_>@r(#Hd`6Sda;uuwY zHBY_VrRN_M1JKIHWO(3Wz%uYi`#hg7a0wxp$5}|as4&$HsA)Uat&811?CuWhCP#Ga za2XZxo}#ozBS!Hs4NY`r9e_>za+E7yHq(z(ZIT$ZNqg*-%LP*r>&y5^>__b;#3?N> zL%L;`+v(At>{4sH)%}B`6j?tCDoo}|Z43Rpf$$CqRV*M0L!|&R-V0FmJPdLN`9_Gq^y7Fhrp9j%ExMena@Rd&nH&Dee_ge1-P((d^rO?RFK9nM2~?P^5)S*f+In=M#osqW_y>nj z2BRFv(EtpJ3wcqR#X$in&Lq?r=oI>L0g)VYo92)7ctkTLO9s#Sm4|-lD<0CJgO9wB zpL{^U(|Hp}0_9#H6X1f!Rm-haa0R>e=6cBQL5C=m5r z5q>PRN*R_Z_RYYjY}0YJjDQ@xlqJMNLvh~N=BYq7Dk=6^*~M$t+Fxa==IUK_mmL;l z`Fo+fdCsTqz^KGdf{6322v0XT#r9cJfaE>bVzU@w(7ROuGl%9ED{mkNer6`a%Y*DV=UF)xKw&j(%#q6ebKSBhII2XoQTwI;%%N zHIh_b@?v!n>|+elG#t4R2}`umSIJ(X z_{fy$Oc`Xw%Oj1lfJ*Phljb@Rh4S+9_L=ga$%lFfX!4LL9y$cm9+wuJ3=xti7q5@# zKNS8@`LKRuOTI$n#?zIjk*T&w2k4^N#%Rjw)vE^DF8wE6zJ$6;-oG_cD+(thB-v40 zReKnFtc}=q&{0s05FeqG7L9b+7&VxDKu6h7VWp9+xMYQ)@EoIP%3$s0NDpLu6t^bsE(n5a2yf`FMJKTJ;Dd z(yB{&Y9DmP4==aP%^}$Q2B%*2&Bam)&c!MP5_}dWkY$&lO6&Ry7yP2&&gegBgi2S{t2E&+0;(5ez}gy{W8l7K$_@w{K|T$VF+)X&hiQ0m zG+J~TuQ+*OoHP#E(8F@#BUIfHcl3)+;wO{~`NbnZkOQyyp{pLzkRyK4lva6o$g@q+ z$98OanysNbEd8?pMTY7oF87Opia@Kt{*Z4cW6%zuM9F0}O zp@quI5SpS@=7&O+C!~Dn!g}KMA{~~cTsU=ya)?V7q3RKhe90G0`dFIl(C6%~%jI?n z^rO36WbMyM*D&uF1r@1|@bOT=FfL=M0O?Sc=#<$X zUHJ;(k$lDXSC%}1p|WA9x)dreJ`Ek3IBF8VC((5ItTEMwxg+k|%noWK3p7S<*64C@;Rufzm3YeCmvM@BpYl zjqh0ES3YUU32D$NtM*&oO1sg0p^eZ_EsHlIe(*Y!@;~HMXUOxbfJy~c8J0@27o95G zCC^hfb)IOA^Yzi_P?-b8WqcWww0Ma_S6YoyI^98#-M+l(g*@40a+YsG0bLNa^jr<=? zx5y2h+OQ7|<$i5v75h)FT5s3%*4E!ev`3XLRvC?=&9O5ZR~{Dc@Xo)ab&y4LC9i7xGCmoe0{MD!5urgm^q=g69ZU~%imq0h0 zFZ2!4Ot9BIRaYKmR{oN3@*X{2^C5O$DP8HE&8W8hI-bfv}r zLm?dqClFOubrXh8^{FoLS^1eJ>rn&qMdJs|Uwo2!1ic#Vf?b-djrddQ~P z@y7aJ0~5V)`)m9EIjE6pUO5nCT29W(%d2Uh+WEa1@I+I(nS~L$K_g`J5D3ZoPeU1s z5cx_Y*XlJ=`63J7wzuLQTfTfbkIwQS&96GmQuqE`sGIVCGoVT#LQ@oQnVOTEHf`F% zHdQ=f(Z}d*jOItM8iUb8Z}}A?4*G$d%7-CwdC7^%U_{O~AjjFw?|;~{!}Bd4Aemyn zzb!scrN07Q`iG)_lb}jLQd`!VcPK4UMIq`6?FY>(F@k_}g5RW$5yke+hYkW}9Kd?XEQzUukRQ0^7NMWv|@x zwG+T&6#DSD0;1`&kBdyQ56LC)MX~>1olS!p$pSkJiQ^PTspwbpG9e!D!m!-zBA%$k kZ}gYfNaCF}xV$|1>H6z0+kD", + "arguments": [ + { + "n": "var1", + "href": "/capability/switch/main/0", + "property": "power", + "valueType": null, + "alternatives": [ + { + "key": "on", + "value": "___PO_CODE_POWERSWITCH_ON" + }, + { + "key": "off", + "value": "___PO_CODE_POWERSWITCH_OFF", + "type": "inactive" + } + ] + } + ] + }, + "emphasis": false + } + ], + "dpInfo": [ + { + "os": "android", + "dpType": "vendorPlugIn", + "dpUri": "wwst://iot2018" + }, + { + "os": "ios", + "dpType": "vendorPlugIn", + "dpUri": "wwst://iot2018" + } + ], + "dpResources": [ + { + "name": "PowerSwitch", + "controllable": true, + "order": 1, + "link": { + "href": "/capability/switch/main/0", + "if": "oic.if.a", + "rt": "x.com.st.powerswitch" + }, + "iconUrl": { + "vector": "", + "small": "", + "large": "", + "mid": "icon://ic_function_power_switch" + }, + "property": "power", + "controlType": "ToggleSwitch", + "alternatives": [ + { + "key": "on", + "value": "___PO_CODE_POWERSWITCH_ON" + }, + { + "key": "off", + "value": "___PO_CODE_POWERSWITCH_OFF", + "type": "inactive" + } + ], + "step": 0, + "label": { + "label": "___PO_CODE_POWERSWITCH" + }, + "emphasis": true, + "ruleEvent": false, + "ruleAction": true + }, + { + "name": "PowerSwitch", + "controllable": true, + "order": 2, + "link": { + "href": "/capability/switch/main/0", + "if": "oic.if.a", + "rt": "x.com.st.powerswitch" + }, + "iconUrl": { + "vector": "", + "small": "", + "large": "", + "mid": "icon://ic_function_power_switch" + }, + "property": "power", + "controlType": "ToggleSwitch", + "alternatives": [ + { + "key": "on", + "value": "___PO_CODE_POWERSWITCH_ON" + }, + { + "key": "off", + "value": "___PO_CODE_POWERSWITCH_OFF", + "type": "inactive" + } + ], + "step": 0, + "label": { + "label": "___PO_CODE_POWERSWITCH" + }, + "emphasis": true, + "ruleEvent": false, + "ruleAction": false + }, + { + "name": "PowerSwitch", + "controllable": true, + "order": 3, + "link": { + "href": "/capability/switch/main/0", + "if": "oic.if.a", + "rt": "x.com.st.powerswitch" + }, + "iconUrl": { + "vector": "", + "small": "", + "large": "", + "mid": "icon://ic_function_power_switch" + }, + "property": "power", + "controlType": "ToggleSwitch", + "alternatives": [ + { + "key": "on", + "value": "___PO_CODE_POWERSWITCH_ON" + }, + { + "key": "off", + "value": "___PO_CODE_POWERSWITCH_OFF", + "type": "inactive" + } + ], + "step": 0, + "label": { + "label": "___PO_CODE_POWERSWITCH" + }, + "emphasis": true, + "ruleEvent": true, + "ruleAction": false + }, + { + "controlType": "List", + "name": "Audio Volume Command", + "controllable": true, + "property": "command", + "emphasis": false, + "link": { + "rt": "x.com.st.audiovolume", + "href": "/capability/audioVolume/main/0", + "if": "oic.if.a" + }, + "iconUrl": { + "vector": "", + "small": "", + "large": "", + "mid": "icon://ic_function_audio_volume" + }, + "alternatives": [ + { + "value": "___PO_CODE_AUDIOVOLUME_INCREASE", + "key": "increase" + }, + { + "value": "___PO_CODE_AUDIOVOLUME_DECREASE", + "key": "decrease" + }, + { + "value": "___PO_CODE_AUDIOVOLUME_MAX", + "key": "max" + }, + { + "value": "___PO_CODE_AUDIOVOLUME_MIN", + "key": "min" + } + ], + "step": 0, + "label": { + "label": "___PO_CODE_AUDIOVOLUME_COMMAND", + "n": "Audio Volume Command" + }, + "ruleEvent": false, + "ruleAction": false, + "order": 4 + }, + { + "controlType": "List", + "name": "Audio Volume Command", + "controllable": true, + "property": "command", + "emphasis": false, + "link": { + "rt": "x.com.st.audiovolume", + "href": "/capability/audioVolume/main/0", + "if": "oic.if.a" + }, + "iconUrl": { + "vector": "", + "small": "", + "large": "", + "mid": "icon://ic_function_audio_volume" + }, + "alternatives": [ + { + "value": "___PO_CODE_AUDIOVOLUME_INCREASE", + "key": "increase" + }, + { + "value": "___PO_CODE_AUDIOVOLUME_DECREASE", + "key": "decrease" + }, + { + "value": "___PO_CODE_AUDIOVOLUME_MAX", + "key": "max" + }, + { + "value": "___PO_CODE_AUDIOVOLUME_MIN", + "key": "min" + } + ], + "step": 0, + "label": { + "label": "___PO_CODE_AUDIOVOLUME_COMMAND", + "n": "Audio Volume Command" + }, + "ruleEvent": false, + "ruleAction": true, + "order": 5 + }, + { + "controlType": "List", + "name": "Audio Volume Command", + "controllable": true, + "property": "command", + "emphasis": false, + "link": { + "rt": "x.com.st.audiovolume", + "href": "/capability/audioVolume/main/0", + "if": "oic.if.a" + }, + "iconUrl": { + "vector": "", + "small": "", + "large": "", + "mid": "icon://ic_function_audio_volume" + }, + "alternatives": [ + { + "value": "___PO_CODE_AUDIOVOLUME_INCREASE", + "key": "increase" + }, + { + "value": "___PO_CODE_AUDIOVOLUME_DECREASE", + "key": "decrease" + }, + { + "value": "___PO_CODE_AUDIOVOLUME_MAX", + "key": "max" + }, + { + "value": "___PO_CODE_AUDIOVOLUME_MIN", + "key": "min" + } + ], + "step": 0, + "label": { + "label": "___PO_CODE_AUDIOVOLUME_COMMAND", + "n": "Audio Volume Command" + }, + "ruleEvent": true, + "ruleAction": false, + "order": 6 + }, + { + "controlType": "slider", + "name": "Audio Volume", + "controllable": true, + "property": "volume", + "emphasis": false, + "link": { + "rt": "x.com.st.audiovolume", + "href": "/capability/audioVolume/main/0", + "if": "oic.if.a" + }, + "iconUrl": { + "vector": "", + "small": "", + "large": "", + "mid": "icon://ic_function_audio_volume" + }, + "range": [ + 0, + 100 + ], + "step": 0, + "label": { + "label": "___PO_CODE_AUDIOVOLUME_VOLUME", + "n": "Volume" + }, + "ruleEvent": false, + "ruleAction": false, + "order": 7 + }, + { + "controlType": "slider", + "name": "Audio Volume", + "controllable": true, + "property": "volume", + "emphasis": false, + "link": { + "rt": "x.com.st.audiovolume", + "href": "/capability/audioVolume/main/0", + "if": "oic.if.a" + }, + "iconUrl": { + "vector": "", + "small": "", + "large": "", + "mid": "icon://ic_function_audio_volume" + }, + "range": [ + 0, + 100 + ], + "step": 0, + "label": { + "label": "___PO_CODE_AUDIOVOLUME_VOLUME", + "n": "Volume" + }, + "ruleEvent": false, + "ruleAction": true, + "order": 8 + }, + { + "ruleAction": false, + "emphasis": false, + "controllable": false, + "step": 0, + "link": { + "rt": "oic.r.sensor.motion", + "href": "/capability/motionSensor/main/0", + "if": "oic.if.r" + }, + "controlType": "List", + "name": "Motion Sensor", + "label": { + "label": "___PO_CODE_MOTIONSENSOR", + "n": "ST Motion Sensor resource" + }, + "iconUrl": { + "mid": "icon://ic_function_motion_sensor", + "large": "", + "small": "", + "vector": "" + }, + "ruleEvent": false, + "alternatives": [ + { + "type": "inactive", + "value": "___PO_CODE_MOTIONSENSOR_NO_MOTION", + "key": "false" + }, + { + "value": "___PO_CODE_MOTIONSENSOR_MOTION_DETECTED", + "key": "true" + } + ], + "order": 9, + "property": "value" + }, + { + "ruleAction": false, + "emphasis": false, + "controllable": false, + "step": 0, + "link": { + "rt": "oic.r.sensor.motion", + "href": "/capability/motionSensor/main/0", + "if": "oic.if.r" + }, + "controlType": "List", + "name": "Motion Sensor", + "label": { + "label": "___PO_CODE_MOTIONSENSOR", + "n": "ST Motion Sensor resource" + }, + "iconUrl": { + "mid": "icon://ic_function_motion_sensor", + "large": "", + "small": "", + "vector": "" + }, + "ruleEvent": true, + "alternatives": [ + { + "type": "inactive", + "value": "___PO_CODE_MOTIONSENSOR_NO_MOTION", + "key": "false" + }, + { + "value": "___PO_CODE_MOTIONSENSOR_MOTION_DETECTED", + "key": "true" + } + ], + "order": 10, + "property": "value" + }, + { + "ruleAction": true, + "controllable": true, + "range": [ + 1, + 100 + ], + "link": { + "rt": "oic.r.light.dimming", + "href": "/capability/switchLevel/main/0", + "if": "oic.if.a" + }, + "step": 0, + "controlType": "List", + "name": "Switch Level", + "label": { + "label": "___PO_CODE_SWITCHLEVEL_DIMMING", + "n": "st dimming level resource" + }, + "emphasis": false, + "ruleEvent": false, + "iconUrl": { + "mid": "icon://ic_function_light_dimmer", + "large": "", + "small": "", + "vector": "" + }, + "order": 11, + "property": "dimmingSetting" + }, + { + "ruleAction": false, + "controllable": true, + "range": [ + 1, + 100 + ], + "link": { + "rt": "oic.r.light.dimming", + "href": "/capability/switchLevel/main/0", + "if": "oic.if.a" + }, + "step": 0, + "controlType": "List", + "name": "Switch Level", + "label": { + "label": "___PO_CODE_SWITCHLEVEL_DIMMING", + "n": "st dimming level resource" + }, + "emphasis": false, + "ruleEvent": false, + "iconUrl": { + "mid": "icon://ic_function_light_dimmer", + "large": "", + "small": "", + "vector": "" + }, + "order": 12, + "property": "dimmingSetting" + } + ] +} diff --git a/smartthings-plugin/plugin/css/bulma-switch.min.css b/smartthings-plugin/plugin/css/bulma-switch.min.css new file mode 100644 index 0000000..c7d659e --- /dev/null +++ b/smartthings-plugin/plugin/css/bulma-switch.min.css @@ -0,0 +1 @@ +@-webkit-keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.switch[type=checkbox]{outline:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:inline-block;position:absolute;opacity:0}.switch[type=checkbox][disabled]{cursor:not-allowed}.switch[type=checkbox][disabled]+label{opacity:.5}.switch[type=checkbox][disabled]+label::before{opacity:.5}.switch[type=checkbox][disabled]+label::after{opacity:.5}.switch[type=checkbox][disabled]+label:hover{cursor:not-allowed}.switch[type=checkbox]+label{position:relative;display:initial;font-size:1rem;line-height:initial;padding-left:3.5rem;padding-top:.2rem;cursor:pointer}.switch[type=checkbox]+label::before{position:absolute;display:block;top:0;left:0;width:3rem;height:1.5rem;border:.1rem solid transparent;border-radius:3px;background:#b5b5b5;content:''}.switch[type=checkbox]+label::after{display:block;position:absolute;top:.25rem;left:.25rem;width:1rem;height:1rem;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-radius:3px;background:#fff;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;content:''}.switch[type=checkbox].is-rtl+label{padding-left:0;padding-right:3.5rem}.switch[type=checkbox].is-rtl+label::before{left:auto;right:0}.switch[type=checkbox].is-rtl+label::after{left:auto;right:.25rem}.switch[type=checkbox]:checked+label::before{background:#00d1b2}.switch[type=checkbox]:checked+label::after{left:1.625rem}.switch[type=checkbox]:checked.is-rtl+label::after{left:auto;right:1.625rem}.switch[type=checkbox].is-outlined+label::before{background-color:transparent;border-color:#b5b5b5}.switch[type=checkbox].is-outlined+label::after{background:#b5b5b5}.switch[type=checkbox].is-outlined:checked+label::before{background-color:transparent;border-color:#00d1b2}.switch[type=checkbox].is-outlined:checked+label::after{background:#00d1b2}.switch[type=checkbox].is-thin+label::before{top:.54545rem;height:.375rem}.switch[type=checkbox].is-thin+label::after{-webkit-box-shadow:0 0 3px #7a7a7a;box-shadow:0 0 3px #7a7a7a}.switch[type=checkbox].is-rounded+label::before{border-radius:20px}.switch[type=checkbox].is-rounded+label::after{border-radius:50%}.switch[type=checkbox].is-small+label{position:relative;display:initial;font-size:.75rem;line-height:initial;padding-left:2.75rem;padding-top:.2rem;cursor:pointer}.switch[type=checkbox].is-small+label::before{position:absolute;display:block;top:0;left:0;width:2.25rem;height:1.125rem;border:.1rem solid transparent;border-radius:3px;background:#b5b5b5;content:''}.switch[type=checkbox].is-small+label::after{display:block;position:absolute;top:.25rem;left:.25rem;width:.625rem;height:.625rem;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-radius:3px;background:#fff;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;content:''}.switch[type=checkbox].is-small.is-rtl+label{padding-left:0;padding-right:2.75rem}.switch[type=checkbox].is-small.is-rtl+label::before{left:auto;right:0}.switch[type=checkbox].is-small.is-rtl+label::after{left:auto;right:.25rem}.switch[type=checkbox].is-small:checked+label::before{background:#00d1b2}.switch[type=checkbox].is-small:checked+label::after{left:1.25rem}.switch[type=checkbox].is-small:checked.is-rtl+label::after{left:auto;right:1.25rem}.switch[type=checkbox].is-small.is-outlined+label::before{background-color:transparent;border-color:#b5b5b5}.switch[type=checkbox].is-small.is-outlined+label::after{background:#b5b5b5}.switch[type=checkbox].is-small.is-outlined:checked+label::before{background-color:transparent;border-color:#00d1b2}.switch[type=checkbox].is-small.is-outlined:checked+label::after{background:#00d1b2}.switch[type=checkbox].is-small.is-thin+label::before{top:.40909rem;height:.28125rem}.switch[type=checkbox].is-small.is-thin+label::after{-webkit-box-shadow:0 0 3px #7a7a7a;box-shadow:0 0 3px #7a7a7a}.switch[type=checkbox].is-small.is-rounded+label::before{border-radius:20px}.switch[type=checkbox].is-small.is-rounded+label::after{border-radius:50%}.switch[type=checkbox].is-medium+label{position:relative;display:initial;font-size:1.25rem;line-height:initial;padding-left:4.25rem;padding-top:.2rem;cursor:pointer}.switch[type=checkbox].is-medium+label::before{position:absolute;display:block;top:0;left:0;width:3.75rem;height:1.875rem;border:.1rem solid transparent;border-radius:3px;background:#b5b5b5;content:''}.switch[type=checkbox].is-medium+label::after{display:block;position:absolute;top:.25rem;left:.25rem;width:1.375rem;height:1.375rem;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-radius:3px;background:#fff;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;content:''}.switch[type=checkbox].is-medium.is-rtl+label{padding-left:0;padding-right:4.25rem}.switch[type=checkbox].is-medium.is-rtl+label::before{left:auto;right:0}.switch[type=checkbox].is-medium.is-rtl+label::after{left:auto;right:.25rem}.switch[type=checkbox].is-medium:checked+label::before{background:#00d1b2}.switch[type=checkbox].is-medium:checked+label::after{left:2rem}.switch[type=checkbox].is-medium:checked.is-rtl+label::after{left:auto;right:2rem}.switch[type=checkbox].is-medium.is-outlined+label::before{background-color:transparent;border-color:#b5b5b5}.switch[type=checkbox].is-medium.is-outlined+label::after{background:#b5b5b5}.switch[type=checkbox].is-medium.is-outlined:checked+label::before{background-color:transparent;border-color:#00d1b2}.switch[type=checkbox].is-medium.is-outlined:checked+label::after{background:#00d1b2}.switch[type=checkbox].is-medium.is-thin+label::before{top:.68182rem;height:.46875rem}.switch[type=checkbox].is-medium.is-thin+label::after{-webkit-box-shadow:0 0 3px #7a7a7a;box-shadow:0 0 3px #7a7a7a}.switch[type=checkbox].is-medium.is-rounded+label::before{border-radius:20px}.switch[type=checkbox].is-medium.is-rounded+label::after{border-radius:50%}.switch[type=checkbox].is-large+label{position:relative;display:initial;font-size:1.5rem;line-height:initial;padding-left:5rem;padding-top:.2rem;cursor:pointer}.switch[type=checkbox].is-large+label::before{position:absolute;display:block;top:0;left:0;width:4.5rem;height:2.25rem;border:.1rem solid transparent;border-radius:3px;background:#b5b5b5;content:''}.switch[type=checkbox].is-large+label::after{display:block;position:absolute;top:.25rem;left:.25rem;width:1.75rem;height:1.75rem;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-radius:3px;background:#fff;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;content:''}.switch[type=checkbox].is-large.is-rtl+label{padding-left:0;padding-right:5rem}.switch[type=checkbox].is-large.is-rtl+label::before{left:auto;right:0}.switch[type=checkbox].is-large.is-rtl+label::after{left:auto;right:.25rem}.switch[type=checkbox].is-large:checked+label::before{background:#00d1b2}.switch[type=checkbox].is-large:checked+label::after{left:2.375rem}.switch[type=checkbox].is-large:checked.is-rtl+label::after{left:auto;right:2.375rem}.switch[type=checkbox].is-large.is-outlined+label::before{background-color:transparent;border-color:#b5b5b5}.switch[type=checkbox].is-large.is-outlined+label::after{background:#b5b5b5}.switch[type=checkbox].is-large.is-outlined:checked+label::before{background-color:transparent;border-color:#00d1b2}.switch[type=checkbox].is-large.is-outlined:checked+label::after{background:#00d1b2}.switch[type=checkbox].is-large.is-thin+label::before{top:.81818rem;height:.5625rem}.switch[type=checkbox].is-large.is-thin+label::after{-webkit-box-shadow:0 0 3px #7a7a7a;box-shadow:0 0 3px #7a7a7a}.switch[type=checkbox].is-large.is-rounded+label::before{border-radius:20px}.switch[type=checkbox].is-large.is-rounded+label::after{border-radius:50%}.switch[type=checkbox].is-white:checked+label::before{background:#fff}.switch[type=checkbox].is-white.is-outlined:checked+label::before{background-color:transparent;border-color:#fff!important}.switch[type=checkbox].is-white.is-outlined:checked+label::after{background:#fff}.switch[type=checkbox].is-white.is-thin.is-outlined+label::after{-webkit-box-shadow:none;box-shadow:none}.switch[type=checkbox].is-unchecked-white+label::before{background:#fff}.switch[type=checkbox].is-unchecked-white.is-outlined+label::before{background-color:transparent;border-color:#fff!important}.switch[type=checkbox].is-unchecked-white.is-outlined+label::after{background:#fff}.switch[type=checkbox].is-black:checked+label::before{background:#0a0a0a}.switch[type=checkbox].is-black.is-outlined:checked+label::before{background-color:transparent;border-color:#0a0a0a!important}.switch[type=checkbox].is-black.is-outlined:checked+label::after{background:#0a0a0a}.switch[type=checkbox].is-black.is-thin.is-outlined+label::after{-webkit-box-shadow:none;box-shadow:none}.switch[type=checkbox].is-unchecked-black+label::before{background:#0a0a0a}.switch[type=checkbox].is-unchecked-black.is-outlined+label::before{background-color:transparent;border-color:#0a0a0a!important}.switch[type=checkbox].is-unchecked-black.is-outlined+label::after{background:#0a0a0a}.switch[type=checkbox].is-light:checked+label::before{background:#f5f5f5}.switch[type=checkbox].is-light.is-outlined:checked+label::before{background-color:transparent;border-color:#f5f5f5!important}.switch[type=checkbox].is-light.is-outlined:checked+label::after{background:#f5f5f5}.switch[type=checkbox].is-light.is-thin.is-outlined+label::after{-webkit-box-shadow:none;box-shadow:none}.switch[type=checkbox].is-unchecked-light+label::before{background:#f5f5f5}.switch[type=checkbox].is-unchecked-light.is-outlined+label::before{background-color:transparent;border-color:#f5f5f5!important}.switch[type=checkbox].is-unchecked-light.is-outlined+label::after{background:#f5f5f5}.switch[type=checkbox].is-dark:checked+label::before{background:#363636}.switch[type=checkbox].is-dark.is-outlined:checked+label::before{background-color:transparent;border-color:#363636!important}.switch[type=checkbox].is-dark.is-outlined:checked+label::after{background:#363636}.switch[type=checkbox].is-dark.is-thin.is-outlined+label::after{-webkit-box-shadow:none;box-shadow:none}.switch[type=checkbox].is-unchecked-dark+label::before{background:#363636}.switch[type=checkbox].is-unchecked-dark.is-outlined+label::before{background-color:transparent;border-color:#363636!important}.switch[type=checkbox].is-unchecked-dark.is-outlined+label::after{background:#363636}.switch[type=checkbox].is-primary:checked+label::before{background:#00d1b2}.switch[type=checkbox].is-primary.is-outlined:checked+label::before{background-color:transparent;border-color:#00d1b2!important}.switch[type=checkbox].is-primary.is-outlined:checked+label::after{background:#00d1b2}.switch[type=checkbox].is-primary.is-thin.is-outlined+label::after{-webkit-box-shadow:none;box-shadow:none}.switch[type=checkbox].is-unchecked-primary+label::before{background:#00d1b2}.switch[type=checkbox].is-unchecked-primary.is-outlined+label::before{background-color:transparent;border-color:#00d1b2!important}.switch[type=checkbox].is-unchecked-primary.is-outlined+label::after{background:#00d1b2}.switch[type=checkbox].is-link:checked+label::before{background:#3273dc}.switch[type=checkbox].is-link.is-outlined:checked+label::before{background-color:transparent;border-color:#3273dc!important}.switch[type=checkbox].is-link.is-outlined:checked+label::after{background:#3273dc}.switch[type=checkbox].is-link.is-thin.is-outlined+label::after{-webkit-box-shadow:none;box-shadow:none}.switch[type=checkbox].is-unchecked-link+label::before{background:#3273dc}.switch[type=checkbox].is-unchecked-link.is-outlined+label::before{background-color:transparent;border-color:#3273dc!important}.switch[type=checkbox].is-unchecked-link.is-outlined+label::after{background:#3273dc}.switch[type=checkbox].is-info:checked+label::before{background:#209cee}.switch[type=checkbox].is-info.is-outlined:checked+label::before{background-color:transparent;border-color:#209cee!important}.switch[type=checkbox].is-info.is-outlined:checked+label::after{background:#209cee}.switch[type=checkbox].is-info.is-thin.is-outlined+label::after{-webkit-box-shadow:none;box-shadow:none}.switch[type=checkbox].is-unchecked-info+label::before{background:#209cee}.switch[type=checkbox].is-unchecked-info.is-outlined+label::before{background-color:transparent;border-color:#209cee!important}.switch[type=checkbox].is-unchecked-info.is-outlined+label::after{background:#209cee}.switch[type=checkbox].is-success:checked+label::before{background:#23d160}.switch[type=checkbox].is-success.is-outlined:checked+label::before{background-color:transparent;border-color:#23d160!important}.switch[type=checkbox].is-success.is-outlined:checked+label::after{background:#23d160}.switch[type=checkbox].is-success.is-thin.is-outlined+label::after{-webkit-box-shadow:none;box-shadow:none}.switch[type=checkbox].is-unchecked-success+label::before{background:#23d160}.switch[type=checkbox].is-unchecked-success.is-outlined+label::before{background-color:transparent;border-color:#23d160!important}.switch[type=checkbox].is-unchecked-success.is-outlined+label::after{background:#23d160}.switch[type=checkbox].is-warning:checked+label::before{background:#ffdd57}.switch[type=checkbox].is-warning.is-outlined:checked+label::before{background-color:transparent;border-color:#ffdd57!important}.switch[type=checkbox].is-warning.is-outlined:checked+label::after{background:#ffdd57}.switch[type=checkbox].is-warning.is-thin.is-outlined+label::after{-webkit-box-shadow:none;box-shadow:none}.switch[type=checkbox].is-unchecked-warning+label::before{background:#ffdd57}.switch[type=checkbox].is-unchecked-warning.is-outlined+label::before{background-color:transparent;border-color:#ffdd57!important}.switch[type=checkbox].is-unchecked-warning.is-outlined+label::after{background:#ffdd57}.switch[type=checkbox].is-danger:checked+label::before{background:#ff3860}.switch[type=checkbox].is-danger.is-outlined:checked+label::before{background-color:transparent;border-color:#ff3860!important}.switch[type=checkbox].is-danger.is-outlined:checked+label::after{background:#ff3860}.switch[type=checkbox].is-danger.is-thin.is-outlined+label::after{-webkit-box-shadow:none;box-shadow:none}.switch[type=checkbox].is-unchecked-danger+label::before{background:#ff3860}.switch[type=checkbox].is-unchecked-danger.is-outlined+label::before{background-color:transparent;border-color:#ff3860!important}.switch[type=checkbox].is-unchecked-danger.is-outlined+label::after{background:#ff3860} \ No newline at end of file diff --git a/smartthings-plugin/plugin/css/bulma.min.css b/smartthings-plugin/plugin/css/bulma.min.css new file mode 100644 index 0000000..935ab34 --- /dev/null +++ b/smartthings-plugin/plugin/css/bulma.min.css @@ -0,0 +1,2 @@ +/*! bulma.io v0.6.2 | MIT License | github.com/jgthms/bulma */@-webkit-keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}/*! minireset.css v0.0.2 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{-webkit-box-sizing:border-box;box-sizing:border-box}*{-webkit-box-sizing:inherit;box-sizing:inherit}:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}audio,embed,img,object,video{max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0;text-align:left}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1rem;font-weight:400;line-height:1.5}a{color:#3273dc;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#ff3860;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#dbdbdb;border:none;display:block;height:1px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{text-align:left;vertical-align:top}table th{color:#363636}.is-clearfix:after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-clipped{overflow:hidden!important}.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1023px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1024px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1216px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1408px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1023px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1024px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1216px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1408px){.has-text-centered-fullhd{text-align:center!important}}.has-text-justified{text-align:justify!important}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1023px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1024px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1216px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1408px){.has-text-justified-fullhd{text-align:justify!important}}.has-text-left{text-align:left!important}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1023px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1024px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1216px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1408px){.has-text-left-fullhd{text-align:left!important}}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1023px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1023px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1024px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1024px) and (max-width:1215px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1216px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1216px) and (max-width:1407px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1408px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-text-link{color:#3273dc!important}a.has-text-link:focus,a.has-text-link:hover{color:#205bbc!important}.has-text-info{color:#209cee!important}a.has-text-info:focus,a.has-text-info:hover{color:#0f81cc!important}.has-text-success{color:#23d160!important}a.has-text-success:focus,a.has-text-success:hover{color:#1ca64c!important}.has-text-warning{color:#ffdd57!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd324!important}.has-text-danger{color:#ff3860!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ff0537!important}.has-text-black-bis{color:#121212!important}.has-text-black-ter{color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1023px){.is-block-touch{display:block!important}}@media screen and (min-width:1024px){.is-block-desktop{display:block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1216px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1408px){.is-block-fullhd{display:block!important}}.is-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-flex-tablet-only{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}}@media screen and (max-width:1023px){.is-flex-touch{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}}@media screen and (min-width:1024px){.is-flex-desktop{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-flex-desktop-only{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}}@media screen and (min-width:1216px){.is-flex-widescreen{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-flex-widescreen-only{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}}@media screen and (min-width:1408px){.is-flex-fullhd{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1023px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1024px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1216px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1408px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1023px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1024px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1216px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1408px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-inline-flex-tablet-only{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media screen and (max-width:1023px){.is-inline-flex-touch{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media screen and (min-width:1024px){.is-inline-flex-desktop{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-inline-flex-desktop-only{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media screen and (min-width:1216px){.is-inline-flex-widescreen{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-inline-flex-widescreen-only{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media screen and (min-width:1408px){.is-inline-flex-fullhd{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.is-hidden{display:none!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1023px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1024px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1216px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1408px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1023px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1023px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1024px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1024px) and (max-width:1215px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1216px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1216px) and (max-width:1407px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1408px){.is-invisible-fullhd{visibility:hidden!important}}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.is-radiusless{border-radius:0!important}.is-shadowless{-webkit-box-shadow:none!important;box-shadow:none!important}.is-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.box{background-color:#fff;border-radius:5px;-webkit-box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);color:#4a4a4a;display:block;padding:1.25rem}.box:not(:last-child){margin-bottom:1.5rem}a.box:focus,a.box:hover{-webkit-box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px #3273dc;box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px #3273dc}a.box:active{-webkit-box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #3273dc;box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #3273dc}.button{-moz-appearance:none;-webkit-appearance:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:none;box-shadow:none;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-size:1rem;height:2.25em;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.375em - 1px);padding-left:calc(.625em - 1px);padding-right:calc(.625em - 1px);padding-top:calc(.375em - 1px);position:relative;vertical-align:top;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border-color:#dbdbdb;color:#363636;cursor:pointer;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:.75em;padding-right:.75em;text-align:center;white-space:nowrap}.button.is-active,.button.is-focused,.button:active,.button:focus{outline:0}.button[disabled]{cursor:not-allowed}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-.375em - 1px);margin-right:.1875em}.button .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:calc(-.375em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.375em - 1px);margin-right:calc(-.375em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#3273dc;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){-webkit-box-shadow:0 0 0 .125em rgba(50,115,220,.25);box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled]{background-color:transparent;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){-webkit-box-shadow:0 0 0 .125em rgba(255,255,255,.25);box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled]{background-color:#fff;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled]{background-color:#0a0a0a;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#fff}.button.is-white.is-loading:after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined[disabled]{background-color:transparent;border-color:#fff;-webkit-box-shadow:none;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#0a0a0a;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){-webkit-box-shadow:0 0 0 .125em rgba(10,10,10,.25);box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled]{background-color:#0a0a0a;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled]{background-color:#fff;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading:after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined[disabled]{background-color:transparent;border-color:#0a0a0a;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;-webkit-box-shadow:none;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:#363636}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:#363636}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:#363636}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){-webkit-box-shadow:0 0 0 .125em rgba(245,245,245,.25);box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:#363636}.button.is-light[disabled]{background-color:#f5f5f5;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.button.is-light.is-inverted{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted:hover{background-color:#292929}.button.is-light.is-inverted[disabled]{background-color:#363636;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading:after{border-color:transparent transparent #363636 #363636!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.button.is-light.is-outlined.is-loading:after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined[disabled]{background-color:transparent;border-color:#f5f5f5;-webkit-box-shadow:none;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#363636;-webkit-box-shadow:none;box-shadow:none;color:#363636}.button.is-dark{background-color:#363636;border-color:transparent;color:#f5f5f5}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#f5f5f5}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){-webkit-box-shadow:0 0 0 .125em rgba(54,54,54,.25);box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#f5f5f5}.button.is-dark[disabled]{background-color:#363636;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.button.is-dark.is-inverted{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted:hover{background-color:#e8e8e8}.button.is-dark.is-inverted[disabled]{background-color:#f5f5f5;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#363636}.button.is-dark.is-loading:after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#f5f5f5}.button.is-dark.is-outlined.is-loading:after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined[disabled]{background-color:transparent;border-color:#363636;-webkit-box-shadow:none;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#f5f5f5;-webkit-box-shadow:none;box-shadow:none;color:#f5f5f5}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){-webkit-box-shadow:0 0 0 .125em rgba(0,209,178,.25);box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled]{background-color:#00d1b2;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled]{background-color:#fff;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading:after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined[disabled]{background-color:transparent;border-color:#00d1b2;-webkit-box-shadow:none;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;-webkit-box-shadow:none;box-shadow:none;color:#fff}.button.is-link{background-color:#3273dc;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#276cda;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){-webkit-box-shadow:0 0 0 .125em rgba(50,115,220,.25);box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#2366d1;border-color:transparent;color:#fff}.button.is-link[disabled]{background-color:#3273dc;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#3273dc}.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled]{background-color:#fff;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#3273dc}.button.is-link.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#3273dc;color:#3273dc}.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#3273dc;border-color:#3273dc;color:#fff}.button.is-link.is-outlined.is-loading:after{border-color:transparent transparent #3273dc #3273dc!important}.button.is-link.is-outlined[disabled]{background-color:transparent;border-color:#3273dc;-webkit-box-shadow:none;box-shadow:none;color:#3273dc}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#3273dc}.button.is-link.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;-webkit-box-shadow:none;box-shadow:none;color:#fff}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#1496ed;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){-webkit-box-shadow:0 0 0 .125em rgba(32,156,238,.25);box-shadow:0 0 0 .125em rgba(32,156,238,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#118fe4;border-color:transparent;color:#fff}.button.is-info[disabled]{background-color:#209cee;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled]{background-color:#fff;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#209cee}.button.is-info.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading:after{border-color:transparent transparent #209cee #209cee!important}.button.is-info.is-outlined[disabled]{background-color:transparent;border-color:#209cee;-webkit-box-shadow:none;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;-webkit-box-shadow:none;box-shadow:none;color:#fff}.button.is-success{background-color:#23d160;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#22c65b;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){-webkit-box-shadow:0 0 0 .125em rgba(35,209,96,.25);box-shadow:0 0 0 .125em rgba(35,209,96,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#20bc56;border-color:transparent;color:#fff}.button.is-success[disabled]{background-color:#23d160;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#23d160}.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled]{background-color:#fff;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#23d160}.button.is-success.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#23d160;color:#23d160}.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#23d160;border-color:#23d160;color:#fff}.button.is-success.is-outlined.is-loading:after{border-color:transparent transparent #23d160 #23d160!important}.button.is-success.is-outlined[disabled]{background-color:transparent;border-color:#23d160;-webkit-box-shadow:none;box-shadow:none;color:#23d160}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#23d160}.button.is-success.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;-webkit-box-shadow:none;box-shadow:none;color:#fff}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdb4a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){-webkit-box-shadow:0 0 0 .125em rgba(255,221,87,.25);box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd83d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled]{background-color:#ffdd57;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffdd57}.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled]{background-color:rgba(0,0,0,.7);border-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading:after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading:after{border-color:transparent transparent #ffdd57 #ffdd57!important}.button.is-warning.is-outlined[disabled]{background-color:transparent;border-color:#ffdd57;-webkit-box-shadow:none;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:rgba(0,0,0,.7);-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.7)}.button.is-danger{background-color:#ff3860;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#ff2b56;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){-webkit-box-shadow:0 0 0 .125em rgba(255,56,96,.25);box-shadow:0 0 0 .125em rgba(255,56,96,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ff1f4b;border-color:transparent;color:#fff}.button.is-danger[disabled]{background-color:#ff3860;border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#ff3860}.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled]{background-color:#fff;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#ff3860}.button.is-danger.is-loading:after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#ff3860;color:#ff3860}.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#ff3860;border-color:#ff3860;color:#fff}.button.is-danger.is-outlined.is-loading:after{border-color:transparent transparent #ff3860 #ff3860!important}.button.is-danger.is-outlined[disabled]{background-color:transparent;border-color:#ff3860;-webkit-box-shadow:none;box-shadow:none;color:#ff3860}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#ff3860}.button.is-danger.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;-webkit-box-shadow:none;box-shadow:none;color:#fff}.button.is-small{border-radius:2px;font-size:.75rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled]{background-color:#fff;border-color:#dbdbdb;-webkit-box-shadow:none;box-shadow:none;opacity:.5}.button.is-fullwidth{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading:after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em;position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;-webkit-box-shadow:none;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:290486px;padding-left:1em;padding-right:1em}.buttons{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child){margin-right:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.is-centered{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.buttons.is-right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.container{margin:0 auto;position:relative}@media screen and (min-width:1024px){.container{max-width:960px;width:960px}.container.is-fluid{margin-left:32px;margin-right:32px;max-width:none;width:auto}}@media screen and (max-width:1215px){.container.is-widescreen{max-width:1152px;width:auto}}@media screen and (max-width:1407px){.container.is-fullhd{max-width:1344px;width:auto}}@media screen and (min-width:1216px){.container{max-width:1152px;width:1152px}}@media screen and (min-width:1408px){.container{max-width:1344px;width:1344px}}.content:not(:last-child){margin-bottom:1.5rem}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:400;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style:decimal outside;margin-left:2em;margin-top:1em}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636;text-align:left}.content table tr:hover{background-color:#f5f5f5}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content.is-small{font-size:.75rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.input,.textarea{-moz-appearance:none;-webkit-appearance:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:none;box-shadow:none;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-size:1rem;height:2.25em;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.375em - 1px);padding-left:calc(.625em - 1px);padding-right:calc(.625em - 1px);padding-top:calc(.375em - 1px);position:relative;vertical-align:top;background-color:#fff;border-color:#dbdbdb;color:#363636;-webkit-box-shadow:inset 0 1px 2px rgba(10,10,10,.1);box-shadow:inset 0 1px 2px rgba(10,10,10,.1);max-width:100%;width:100%}.input.is-active,.input.is-focused,.input:active,.input:focus,.textarea.is-active,.textarea.is-focused,.textarea:active,.textarea:focus{outline:0}.input[disabled],.textarea[disabled]{cursor:not-allowed}.input::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input.is-hovered,.input:hover,.textarea.is-hovered,.textarea:hover{border-color:#b5b5b5}.input.is-active,.input.is-focused,.input:active,.input:focus,.textarea.is-active,.textarea.is-focused,.textarea:active,.textarea:focus{border-color:#3273dc;-webkit-box-shadow:0 0 0 .125em rgba(50,115,220,.25);box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.input[disabled],.textarea[disabled]{background-color:#f5f5f5;border-color:#f5f5f5;-webkit-box-shadow:none;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input[readonly],.textarea[readonly]{-webkit-box-shadow:none;box-shadow:none}.input.is-white,.textarea.is-white{border-color:#fff}.input.is-white.is-active,.input.is-white.is-focused,.input.is-white:active,.input.is-white:focus,.textarea.is-white.is-active,.textarea.is-white.is-focused,.textarea.is-white:active,.textarea.is-white:focus{-webkit-box-shadow:0 0 0 .125em rgba(255,255,255,.25);box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.input.is-black,.textarea.is-black{border-color:#0a0a0a}.input.is-black.is-active,.input.is-black.is-focused,.input.is-black:active,.input.is-black:focus,.textarea.is-black.is-active,.textarea.is-black.is-focused,.textarea.is-black:active,.textarea.is-black:focus{-webkit-box-shadow:0 0 0 .125em rgba(10,10,10,.25);box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.input.is-light,.textarea.is-light{border-color:#f5f5f5}.input.is-light.is-active,.input.is-light.is-focused,.input.is-light:active,.input.is-light:focus,.textarea.is-light.is-active,.textarea.is-light.is-focused,.textarea.is-light:active,.textarea.is-light:focus{-webkit-box-shadow:0 0 0 .125em rgba(245,245,245,.25);box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.input.is-dark,.textarea.is-dark{border-color:#363636}.input.is-dark.is-active,.input.is-dark.is-focused,.input.is-dark:active,.input.is-dark:focus,.textarea.is-dark.is-active,.textarea.is-dark.is-focused,.textarea.is-dark:active,.textarea.is-dark:focus{-webkit-box-shadow:0 0 0 .125em rgba(54,54,54,.25);box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.input.is-primary,.textarea.is-primary{border-color:#00d1b2}.input.is-primary.is-active,.input.is-primary.is-focused,.input.is-primary:active,.input.is-primary:focus,.textarea.is-primary.is-active,.textarea.is-primary.is-focused,.textarea.is-primary:active,.textarea.is-primary:focus{-webkit-box-shadow:0 0 0 .125em rgba(0,209,178,.25);box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.input.is-link,.textarea.is-link{border-color:#3273dc}.input.is-link.is-active,.input.is-link.is-focused,.input.is-link:active,.input.is-link:focus,.textarea.is-link.is-active,.textarea.is-link.is-focused,.textarea.is-link:active,.textarea.is-link:focus{-webkit-box-shadow:0 0 0 .125em rgba(50,115,220,.25);box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.input.is-info,.textarea.is-info{border-color:#209cee}.input.is-info.is-active,.input.is-info.is-focused,.input.is-info:active,.input.is-info:focus,.textarea.is-info.is-active,.textarea.is-info.is-focused,.textarea.is-info:active,.textarea.is-info:focus{-webkit-box-shadow:0 0 0 .125em rgba(32,156,238,.25);box-shadow:0 0 0 .125em rgba(32,156,238,.25)}.input.is-success,.textarea.is-success{border-color:#23d160}.input.is-success.is-active,.input.is-success.is-focused,.input.is-success:active,.input.is-success:focus,.textarea.is-success.is-active,.textarea.is-success.is-focused,.textarea.is-success:active,.textarea.is-success:focus{-webkit-box-shadow:0 0 0 .125em rgba(35,209,96,.25);box-shadow:0 0 0 .125em rgba(35,209,96,.25)}.input.is-warning,.textarea.is-warning{border-color:#ffdd57}.input.is-warning.is-active,.input.is-warning.is-focused,.input.is-warning:active,.input.is-warning:focus,.textarea.is-warning.is-active,.textarea.is-warning.is-focused,.textarea.is-warning:active,.textarea.is-warning:focus{-webkit-box-shadow:0 0 0 .125em rgba(255,221,87,.25);box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.input.is-danger,.textarea.is-danger{border-color:#ff3860}.input.is-danger.is-active,.input.is-danger.is-focused,.input.is-danger:active,.input.is-danger:focus,.textarea.is-danger.is-active,.textarea.is-danger.is-focused,.textarea.is-danger:active,.textarea.is-danger:focus{-webkit-box-shadow:0 0 0 .125em rgba(255,56,96,.25);box-shadow:0 0 0 .125em rgba(255,56,96,.25)}.input.is-small,.textarea.is-small{border-radius:2px;font-size:.75rem}.input.is-medium,.textarea.is-medium{font-size:1.25rem}.input.is-large,.textarea.is-large{font-size:1.5rem}.input.is-fullwidth,.textarea.is-fullwidth{display:block;width:100%}.input.is-inline,.textarea.is-inline{display:inline;width:auto}.input.is-rounded{border-radius:290486px;padding-left:1em;padding-right:1em}.input.is-static{background-color:transparent;border-color:transparent;-webkit-box-shadow:none;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:.625em;resize:vertical}.textarea:not([rows]){max-height:600px;min-height:120px}.textarea[rows]{height:unset}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox[disabled],.radio[disabled]{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.25em}.select:not(.is-multiple)::after{border:1px solid #3273dc;border-right:0;border-top:0;content:" ";display:block;height:.5em;pointer-events:none;position:absolute;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:center;transform-origin:center;width:.5em;margin-top:-.375em;right:1.125em;top:50%;z-index:4}.select.is-rounded select{border-radius:290486px;padding-left:1em}.select select{-moz-appearance:none;-webkit-appearance:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:none;box-shadow:none;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-size:1rem;height:2.25em;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.375em - 1px);padding-left:calc(.625em - 1px);padding-right:calc(.625em - 1px);padding-top:calc(.375em - 1px);position:relative;vertical-align:top;background-color:#fff;border-color:#dbdbdb;color:#363636;cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select.is-active,.select select.is-focused,.select select:active,.select select:focus{outline:0}.select select[disabled]{cursor:not-allowed}.select select::-moz-placeholder{color:rgba(54,54,54,.3)}.select select::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.select select:-moz-placeholder{color:rgba(54,54,54,.3)}.select select:-ms-input-placeholder{color:rgba(54,54,54,.3)}.select select.is-hovered,.select select:hover{border-color:#b5b5b5}.select select.is-active,.select select.is-focused,.select select:active,.select select:focus{border-color:#3273dc;-webkit-box-shadow:0 0 0 .125em rgba(50,115,220,.25);box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.select select[disabled]{background-color:#f5f5f5;border-color:#f5f5f5;-webkit-box-shadow:none;box-shadow:none;color:#7a7a7a}.select select[disabled]::-moz-placeholder{color:rgba(122,122,122,.3)}.select select[disabled]::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.select select[disabled]:-moz-placeholder{color:rgba(122,122,122,.3)}.select select[disabled]:-ms-input-placeholder{color:rgba(122,122,122,.3)}.select select::-ms-expand{display:none}.select select[disabled]:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:unset;padding:0}.select select[multiple] option{padding:.5em 1em}.select:hover::after{border-color:#363636}.select.is-white select{border-color:#fff}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{-webkit-box-shadow:0 0 0 .125em rgba(255,255,255,.25);box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{-webkit-box-shadow:0 0 0 .125em rgba(10,10,10,.25);box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{-webkit-box-shadow:0 0 0 .125em rgba(245,245,245,.25);box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark select{border-color:#363636}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{-webkit-box-shadow:0 0 0 .125em rgba(54,54,54,.25);box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{-webkit-box-shadow:0 0 0 .125em rgba(0,209,178,.25);box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link select{border-color:#3273dc}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{-webkit-box-shadow:0 0 0 .125em rgba(50,115,220,.25);box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.select.is-info select{border-color:#209cee}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{-webkit-box-shadow:0 0 0 .125em rgba(32,156,238,.25);box-shadow:0 0 0 .125em rgba(32,156,238,.25)}.select.is-success select{border-color:#23d160}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{-webkit-box-shadow:0 0 0 .125em rgba(35,209,96,.25);box-shadow:0 0 0 .125em rgba(35,209,96,.25)}.select.is-warning select{border-color:#ffdd57}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{-webkit-box-shadow:0 0 0 .125em rgba(255,221,87,.25);box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.select.is-danger select{border-color:#ff3860}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{-webkit-box-shadow:0 0 0 .125em rgba(255,56,96,.25);box-shadow:0 0 0 .125em rgba(255,56,96,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em;margin-top:0;position:absolute;right:.625em;top:.625em;-webkit-transform:none;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;-webkit-box-shadow:0 0 .5em rgba(255,255,255,.25);box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;-webkit-box-shadow:0 0 .5em rgba(10,10,10,.25);box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:#363636}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:#363636}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;-webkit-box-shadow:0 0 .5em rgba(245,245,245,.25);box-shadow:0 0 .5em rgba(245,245,245,.25);color:#363636}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:#363636}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#f5f5f5}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;-webkit-box-shadow:0 0 .5em rgba(54,54,54,.25);box-shadow:0 0 .5em rgba(54,54,54,.25);color:#f5f5f5}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#f5f5f5}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;-webkit-box-shadow:0 0 .5em rgba(0,209,178,.25);box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#3273dc;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#276cda;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;-webkit-box-shadow:0 0 .5em rgba(50,115,220,.25);box-shadow:0 0 .5em rgba(50,115,220,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#2366d1;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#1496ed;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;-webkit-box-shadow:0 0 .5em rgba(32,156,238,.25);box-shadow:0 0 .5em rgba(32,156,238,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#118fe4;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#23d160;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#22c65b;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;-webkit-box-shadow:0 0 .5em rgba(35,209,96,.25);box-shadow:0 0 .5em rgba(35,209,96,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#20bc56;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdb4a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;-webkit-box-shadow:0 0 .5em rgba(255,221,87,.25);box-shadow:0 0 .5em rgba(255,221,87,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd83d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#ff3860;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#ff2b56;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;-webkit-box-shadow:0 0 .5em rgba(255,56,96,.25);box-shadow:0 0 .5em rgba(255,56,96,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ff1f4b;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:3px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.file.is-boxed .file-cta{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:3px 3px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 3px 3px;border-width:0 1px 1px}.file.is-centered{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:none}.file.is-right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.file.is-right .file-cta{border-radius:0 3px 3px 0}.file.is-right .file-name{border-radius:3px 0 0 3px;border-width:1px 0 1px 1px;-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.file-label{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;cursor:pointer;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:.01em;left:0;outline:0;position:absolute;top:0;width:.01em}.file-cta,.file-name{-moz-appearance:none;-webkit-appearance:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:none;box-shadow:none;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-size:1rem;height:2.25em;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.375em - 1px);padding-left:calc(.625em - 1px);padding-right:calc(.625em - 1px);padding-top:calc(.375em - 1px);position:relative;vertical-align:top;border-color:#dbdbdb;border-radius:3px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta.is-active,.file-cta.is-focused,.file-cta:active,.file-cta:focus,.file-name.is-active,.file-name.is-focused,.file-name:active,.file-name:focus{outline:0}.file-cta[disabled],.file-name[disabled]{cursor:not-allowed}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:left;text-overflow:ellipsis}.file-icon{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;height:1em;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#3273dc}.help.is-info{color:#209cee}.help.is-success{color:#23d160}.help.is-warning{color:#ffdd57}.help.is-danger{color:#ff3860}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child .button,.field.has-addons .control:first-child .input,.field.has-addons .control:first-child .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child .button,.field.has-addons .control:last-child .input,.field.has-addons .control:last-child .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button.is-hovered,.field.has-addons .control .button:hover,.field.has-addons .control .input.is-hovered,.field.has-addons .control .input:hover,.field.has-addons .control .select select.is-hovered,.field.has-addons .control .select select:hover{z-index:2}.field.has-addons .control .button.is-active,.field.has-addons .control .button.is-focused,.field.has-addons .control .button:active,.field.has-addons .control .button:focus,.field.has-addons .control .input.is-active,.field.has-addons .control .input.is-focused,.field.has-addons .control .input:active,.field.has-addons .control .input:focus,.field.has-addons .control .select select.is-active,.field.has-addons .control .select select.is-focused,.field.has-addons .control .select select:active,.field.has-addons .control .select select:focus{z-index:3}.field.has-addons .control .button.is-active:hover,.field.has-addons .control .button.is-focused:hover,.field.has-addons .control .button:active:hover,.field.has-addons .control .button:focus:hover,.field.has-addons .control .input.is-active:hover,.field.has-addons .control .input.is-focused:hover,.field.has-addons .control .input:active:hover,.field.has-addons .control .input:focus:hover,.field.has-addons .control .select select.is-active:hover,.field.has-addons .control .select select.is-focused:hover,.field.has-addons .control .select select:active:hover,.field.has-addons .control .select select:focus:hover{z-index:4}.field.has-addons .control.is-expanded{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.field.has-addons.has-addons-centered{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.field.has-addons.has-addons-right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.field.is-grouped{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.field.is-grouped>.control{-ms-flex-negative:0;flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.field.is-grouped.is-grouped-right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.field.is-grouped.is-grouped-multiline{-ms-flex-wrap:wrap;flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:-webkit-box;display:-ms-flexbox;display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:5;-ms-flex-positive:5;flex-grow:5;-ms-flex-negative:1;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{-ms-flex-negative:1;flex-shrink:1}.field-body>.field:not(.is-narrow){-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{font-size:1rem;position:relative;text-align:left}.control.has-icon .icon{color:#dbdbdb;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}.control.has-icon .input:focus+.icon{color:#7a7a7a}.control.has-icon .input.is-small+.icon{font-size:.75rem}.control.has-icon .input.is-medium+.icon{font-size:1.25rem}.control.has-icon .input.is-large+.icon{font-size:1.5rem}.control.has-icon:not(.has-icon-right) .icon{left:0}.control.has-icon:not(.has-icon-right) .input{padding-left:2.25em}.control.has-icon.has-icon-right .icon{right:0}.control.has-icon.has-icon-right .input{padding-right:2.25em}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#7a7a7a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.25em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.25em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em;position:absolute!important;right:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.icon{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:290486px}.image.is-16by9 img,.image.is-1by1 img,.image.is-2by1 img,.image.is-3by2 img,.image.is-4by3 img,.image.is-square img{bottom:0;left:0;position:absolute;right:0;top:0;height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:3px;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}.notification:not(:last-child){margin-bottom:1.5rem}.notification a:not(.button){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{position:absolute;right:.5rem;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:#363636}.notification.is-dark{background-color:#363636;color:#f5f5f5}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-link{background-color:#3273dc;color:#fff}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-success{background-color:#23d160;color:#fff}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.notification.is-danger{background-color:#ff3860;color:#fff}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress:not(:last-child){margin-bottom:1.5rem}.progress::-webkit-progress-bar{background-color:#dbdbdb}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-link::-webkit-progress-value{background-color:#3273dc}.progress.is-link::-moz-progress-bar{background-color:#3273dc}.progress.is-link::-ms-fill{background-color:#3273dc}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-success::-webkit-progress-value{background-color:#23d160}.progress.is-success::-moz-progress-bar{background-color:#23d160}.progress.is-success::-ms-fill{background-color:#23d160}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-danger::-webkit-progress-value{background-color:#ff3860}.progress.is-danger::-moz-progress-bar{background-color:#ff3860}.progress.is-danger::-ms-fill{background-color:#ff3860}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}.table{background-color:#fff;color:#363636;margin-bottom:1.5rem}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#f5f5f5}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#3273dc;border-color:#3273dc;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#23d160;border-color:#23d160;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#ff3860;border-color:#ff3860;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table th{color:#363636;text-align:left}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.tags{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.has-addons .tag{margin-right:0}.tags.has-addons .tag:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.tags.has-addons .tag:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.tags.is-centered{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tag:not(body){-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;border-radius:3px;color:#4a4a4a;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-size:.75rem;height:2em;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-left:.25em;margin-right:-.375em}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:#363636}.tag:not(body).is-dark{background-color:#363636;color:#f5f5f5}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-link{background-color:#3273dc;color:#fff}.tag:not(body).is-info{background-color:#209cee;color:#fff}.tag:not(body).is-success{background-color:#23d160;color:#fff}.tag:not(body).is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.tag:not(body).is-danger{background-color:#ff3860;color:#fff}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag:not(body).is-delete{margin-left:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete:after,.tag:not(body).is-delete:before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);-webkit-transform-origin:center center;transform-origin:center center}.tag:not(body).is-delete:before{height:1px;width:50%}.tag:not(body).is-delete:after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:290486px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title+.highlight{margin-top:-.75rem}.title:not(.is-spaced)+.subtitle{margin-top:-1.5rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.5rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.block:not(:last-child){margin-bottom:1.5rem}.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:290486px;cursor:pointer;display:inline-block;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete:after,.delete:before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);-webkit-transform-origin:center center;transform-origin:center center}.delete:before{height:2px;width:50%}.delete:after{height:50%;width:2px}.delete:focus,.delete:hover{background-color:rgba(10,10,10,.3)}.delete:active{background-color:rgba(10,10,10,.4)}.delete.is-small{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.delete.is-medium{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.delete.is-large{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.highlight{font-weight:400;max-width:100%;overflow:hidden;padding:0}.highlight:not(:last-child){margin-bottom:1.5rem}.highlight pre{overflow:auto;max-width:100%}.loader{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.number{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;border-radius:290486px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-size:1.25rem;height:2em;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.breadcrumb{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:1rem;overflow:hidden;overflow-x:auto;white-space:nowrap}.breadcrumb:not(:last-child){margin-bottom:1.5rem}.breadcrumb a{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#3273dc;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:.5em .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#4a4a4a;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;-webkit-box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);color:#4a4a4a;max-width:100%;position:relative}.card-header{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-shadow:0 1px 2px rgba(10,10,10,.1);box-shadow:0 1px 2px rgba(10,10,10,.1);display:-webkit-box;display:-ms-flexbox;display:flex}.card-header-title{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#363636;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;font-weight:700;padding:.75rem}.card-header-title.is-centered{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.card-header-icon{-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:.75rem}.card-image{display:block;position:relative}.card-content{padding:1.5rem}.card-footer{border-top:1px solid #dbdbdb;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex}.card-footer-item{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #dbdbdb}.card .media:not(:last-child){margin-bottom:.75rem}.dropdown{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:unset;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:3px;-webkit-box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item{padding-right:3rem;white-space:nowrap}a.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active{background-color:#3273dc;color:#fff}.dropdown-divider{background-color:#dbdbdb;border:none;display:block;height:1px;margin:.5rem 0}.level{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.level:not(:last-child){margin-bottom:1.5rem}.level code{border-radius:3px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:-webkit-box;display:-ms-flexbox;display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:-webkit-box;display:-ms-flexbox;display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item{margin-right:.75rem}.level.is-mobile .level-item:not(:last-child){margin-bottom:0}.level.is-mobile .level-item:not(.is-narrow){-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}@media screen and (min-width:769px),print{.level{display:-webkit-box;display:-ms-flexbox;display:flex}.level>.level-item:not(.is-narrow){-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}}.level-item{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:-webkit-box;display:-ms-flexbox;display:flex}}.level-right{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:-webkit-box;display:-ms-flexbox;display:flex}}.media{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;text-align:left}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:-webkit-box;display:-ms-flexbox;display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;overflow:auto;text-align:left}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#3273dc;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:3px;font-size:1rem}.message:not(:last-child){margin-bottom:1.5rem}.message strong{color:currentColor}.message a:not(.button):not(.tag){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff;color:#4d4d4d}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a;color:#090909}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:#363636}.message.is-light .message-body{border-color:#f5f5f5;color:#505050}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#f5f5f5}.message.is-dark .message-body{border-color:#363636;color:#2a2a2a}.message.is-primary{background-color:#f5fffd}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#021310}.message.is-link{background-color:#f6f9fe}.message.is-link .message-header{background-color:#3273dc;color:#fff}.message.is-link .message-body{border-color:#3273dc;color:#22509a}.message.is-info{background-color:#f6fbfe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#12537e}.message.is-success{background-color:#f6fef9}.message.is-success .message-header{background-color:#23d160;color:#fff}.message.is-success .message-body{border-color:#23d160;color:#0e301a}.message.is-warning{background-color:#fffdf5}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#3b3108}.message.is-danger{background-color:#fff5f7}.message.is-danger .message-header{background-color:#ff3860;color:#fff}.message.is-danger .message-body{border-color:#ff3860;color:#cd0930}.message-header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#4a4a4a;border-radius:3px 3px 0 0;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;line-height:1.25;padding:.5em .75em;position:relative}.message-header .delete{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-top-left-radius:0;border-top-right-radius:0;border-top:none}.message-body{border:1px solid #dbdbdb;border-radius:3px;color:#4a4a4a;padding:1em 1.25em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{bottom:0;left:0;position:absolute;right:0;top:0;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:none;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:-webkit-box;display:-ms-flexbox;display:flex}.modal-background{bottom:0;left:0;position:absolute;right:0;top:0;background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px),print{.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:290486px;cursor:pointer;display:inline-block;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px;background:0 0;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-close:after,.modal-close:before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);-webkit-transform-origin:center center;transform-origin:center center}.modal-close:before{height:2px;width:50%}.modal-close:after{height:50%;width:2px}.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.modal-close:active{background-color:rgba(10,10,10,.4)}.modal-close.is-small{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.modal-close.is-medium{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.modal-close.is-large{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.modal-card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden}.modal-card-foot,.modal-card-head{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:5px;border-top-right-radius:5px}.modal-card-title{color:#363636;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:10px}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}@media screen and (min-width:1024px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:1024px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:#363636}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:#363636}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-brand .navbar-link::after{border-color:#363636}@media screen and (min-width:1024px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:#363636}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#363636}}.navbar.is-dark{background-color:#363636;color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#f5f5f5}@media screen and (min-width:1024px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#f5f5f5}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#f5f5f5}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:1024px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#3273dc;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:1024px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#3273dc;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#118fe4;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:1024px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#118fe4;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#118fe4;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#23d160;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#20bc56;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:1024px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#20bc56;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#20bc56;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#23d160;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}@media screen and (min-width:1024px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#ff3860;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ff1f4b;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:1024px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ff1f4b;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ff1f4b;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#ff3860;color:#fff}}.navbar>.container{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{-webkit-box-shadow:0 2px 3px rgba(10,10,10,.1);box-shadow:0 2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{-webkit-box-shadow:0 -2px 3px rgba(10,10,10,.1);box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;min-height:3.25rem}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;-webkit-transform-origin:center;transform-origin:center;-webkit-transition-duration:86ms;transition-duration:86ms;-webkit-transition-property:background-color,opacity,-webkit-transform;transition-property:background-color,opacity,-webkit-transform;transition-property:background-color,opacity,transform;transition-property:background-color,opacity,transform,-webkit-transform;-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:nth-child(1){-webkit-transform:translateY(5px) rotate(45deg);transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){-webkit-transform:translateY(-5px) rotate(-45deg);transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem 1rem;position:relative}a.navbar-item.is-active,a.navbar-item:hover,a.navbar-link.is-active,a.navbar-link:hover{background-color:#f5f5f5;color:#3273dc}.navbar-item{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#3273dc}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#3273dc;border-bottom-style:solid;border-bottom-width:3px;color:#3273dc;padding-bottom:calc(.5rem - 3px)}.navbar-content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1}.navbar-link{padding-right:2.5em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#dbdbdb;border:none;display:none;height:1px;margin:.5rem 0}@media screen and (max-width:1023px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.navbar-menu{background-color:#fff;-webkit-box-shadow:0 8px 16px rgba(10,10,10,.1);box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{-webkit-box-shadow:0 -2px 3px rgba(10,10,10,.1);box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1024px){.navbar,.navbar-end,.navbar-menu,.navbar-start{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex}.navbar{min-height:3.25rem}.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-link.is-active,.navbar.is-transparent a.navbar-link:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#3273dc}.navbar-burger{display:none}.navbar-item,.navbar-link{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.navbar-item.has-dropdown{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{-webkit-transform:rotate(135deg) translate(.25em,-.25em);transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid #dbdbdb;border-radius:5px 5px 0 0;border-top:none;bottom:100%;-webkit-box-shadow:0 -8px 8px rgba(10,10,10,.1);box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;-webkit-transform:translateY(0);transform:translateY(0)}.navbar-link::after{border:1px solid #3273dc;border-right:0;border-top:0;content:" ";display:block;height:.5em;pointer-events:none;position:absolute;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:center;transform-origin:center;width:.5em;margin-top:-.375em;right:1.125em;top:50%}.navbar-menu{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.navbar-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;margin-right:auto}.navbar-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top:1px solid #dbdbdb;-webkit-box-shadow:0 8px 8px rgba(10,10,10,.1);box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#3273dc}.navbar-dropdown.is-boxed{border-radius:5px;border-top:none;-webkit-box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));-webkit-transform:translateY(-5px);transform:translateY(-5px);-webkit-transition-duration:86ms;transition-duration:86ms;-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-left:-1rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-right:-1rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{-webkit-box-shadow:0 -2px 3px rgba(10,10,10,.1);box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}a.navbar-item.is-active,a.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:hover),a.navbar-link.is-active:not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#f5f5f5}}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:290486px}.pagination.is-rounded .pagination-link{border-radius:290486px}.pagination,.pagination-list{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{-moz-appearance:none;-webkit-appearance:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:1px solid transparent;border-radius:3px;-webkit-box-shadow:none;box-shadow:none;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-size:1rem;height:2.25em;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.375em - 1px);padding-left:calc(.625em - 1px);padding-right:calc(.625em - 1px);padding-top:calc(.375em - 1px);position:relative;vertical-align:top;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:1em;padding-left:.5em;padding-right:.5em;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:.25rem;text-align:center}.pagination-ellipsis.is-active,.pagination-ellipsis.is-focused,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link.is-active,.pagination-link.is-focused,.pagination-link:active,.pagination-link:focus,.pagination-next.is-active,.pagination-next.is-focused,.pagination-next:active,.pagination-next:focus,.pagination-previous.is-active,.pagination-previous.is-focused,.pagination-previous:active,.pagination-previous:focus{outline:0}.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled]{cursor:not-allowed}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.25em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#3273dc}.pagination-link:active,.pagination-next:active,.pagination-previous:active{-webkit-box-shadow:inset 0 1px 2px rgba(10,10,10,.2);box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;-webkit-box-shadow:none;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#3273dc;border-color:#3273dc;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{-ms-flex-wrap:wrap;flex-wrap:wrap}@media screen and (max-width:768px){.pagination{-ms-flex-wrap:wrap;flex-wrap:wrap}.pagination-next,.pagination-previous{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1}.pagination-list li{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.pagination-previous{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.pagination-next{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.pagination{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.pagination.is-centered .pagination-previous{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.pagination.is-centered .pagination-list{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.pagination.is-centered .pagination-next{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.pagination.is-right .pagination-previous{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.pagination.is-right .pagination-next{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.pagination.is-right .pagination-list{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}}.panel{font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel-block,.panel-heading,.panel-tabs{border-bottom:1px solid #dbdbdb;border-left:1px solid #dbdbdb;border-right:1px solid #dbdbdb}.panel-block:first-child,.panel-heading:first-child,.panel-tabs:first-child{border-top:1px solid #dbdbdb}.panel-heading{background-color:#f5f5f5;border-radius:3px 3px 0 0;color:#363636;font-size:1.25em;font-weight:300;line-height:1.25;padding:.5em .75em}.panel-tabs{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:.875em;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#3273dc}.panel-block{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#363636;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-right:.75em}.panel-block>.control{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{-ms-flex-wrap:wrap;flex-wrap:wrap}.panel-block.is-active{border-left-color:#3273dc;color:#363636}.panel-block.is-active .panel-icon{color:#3273dc}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:1rem;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs:not(:last-child){margin-bottom:1.5rem}.tabs a{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#3273dc;color:#3273dc}.tabs ul{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{-webkit-box-flex:0;-ms-flex:none;flex:none;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.tabs.is-right ul{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:3px 3px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-radius:3px 0 0 3px}.tabs.is-toggle li:last-child a{border-radius:0 3px 3px 0}.tabs.is-toggle li.is-active a{background-color:#3273dc;border-color:#3273dc;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:290486px;border-top-left-radius:290486px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:290486px;border-top-right-radius:290486px;padding-right:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{-webkit-box-flex:0;-ms-flex:none;flex:none}.columns.is-mobile>.column.is-full{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.columns.is-mobile>.column.is-one-third{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{-webkit-box-flex:0;-ms-flex:none;flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{-webkit-box-flex:0;-ms-flex:none;flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{-webkit-box-flex:0;-ms-flex:none;flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{-webkit-box-flex:0;-ms-flex:none;flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-1{-webkit-box-flex:0;-ms-flex:none;flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333%}.columns.is-mobile>.column.is-2{-webkit-box-flex:0;-ms-flex:none;flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66667%}.columns.is-mobile>.column.is-3{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333%}.columns.is-mobile>.column.is-5{-webkit-box-flex:0;-ms-flex:none;flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66667%}.columns.is-mobile>.column.is-6{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{-webkit-box-flex:0;-ms-flex:none;flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333%}.columns.is-mobile>.column.is-8{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66667%}.columns.is-mobile>.column.is-9{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{-webkit-box-flex:0;-ms-flex:none;flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333%}.columns.is-mobile>.column.is-11{-webkit-box-flex:0;-ms-flex:none;flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66667%}.columns.is-mobile>.column.is-12{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none}.column.is-full-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.column.is-three-quarters-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.column.is-two-thirds-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.6666%}.column.is-half-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.column.is-one-third-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.3333%}.column.is-one-quarter-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.column.is-one-fifth-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:20%}.column.is-two-fifths-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:40%}.column.is-three-fifths-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:60%}.column.is-four-fifths-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-1-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-left:8.33333%}.column.is-2-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-left:16.66667%}.column.is-3-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-left:33.33333%}.column.is-5-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-left:41.66667%}.column.is-6-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-left:58.33333%}.column.is-8-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-left:66.66667%}.column.is-9-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-left:83.33333%}.column.is-11-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-left:91.66667%}.column.is-12-mobile{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none}.column.is-full,.column.is-full-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-1,.column.is-1-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333%}.column.is-2,.column.is-2-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66667%}.column.is-3,.column.is-3-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333%}.column.is-5,.column.is-5-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66667%}.column.is-6,.column.is-6-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333%}.column.is-8,.column.is-8-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66667%}.column.is-9,.column.is-9-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333%}.column.is-11,.column.is-11-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66667%}.column.is-12,.column.is-12-tablet{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width:1023px){.column.is-narrow-touch{-webkit-box-flex:0;-ms-flex:none;flex:none}.column.is-full-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.column.is-three-quarters-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.column.is-two-thirds-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.6666%}.column.is-half-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.column.is-one-third-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.3333%}.column.is-one-quarter-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.column.is-one-fifth-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:20%}.column.is-two-fifths-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:40%}.column.is-three-fifths-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:60%}.column.is-four-fifths-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-1-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:8.33333%}.column.is-offset-1-touch{margin-left:8.33333%}.column.is-2-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:16.66667%}.column.is-offset-2-touch{margin-left:16.66667%}.column.is-3-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.33333%}.column.is-offset-4-touch{margin-left:33.33333%}.column.is-5-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:41.66667%}.column.is-offset-5-touch{margin-left:41.66667%}.column.is-6-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:58.33333%}.column.is-offset-7-touch{margin-left:58.33333%}.column.is-8-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.66667%}.column.is-offset-8-touch{margin-left:66.66667%}.column.is-9-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:83.33333%}.column.is-offset-10-touch{margin-left:83.33333%}.column.is-11-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:91.66667%}.column.is-offset-11-touch{margin-left:91.66667%}.column.is-12-touch{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width:1024px){.column.is-narrow-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none}.column.is-full-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.column.is-three-quarters-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.column.is-two-thirds-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.6666%}.column.is-half-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.column.is-one-third-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.3333%}.column.is-one-quarter-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.column.is-one-fifth-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:20%}.column.is-two-fifths-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:40%}.column.is-three-fifths-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:60%}.column.is-four-fifths-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-1-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-left:8.33333%}.column.is-2-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-left:16.66667%}.column.is-3-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-left:33.33333%}.column.is-5-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-left:41.66667%}.column.is-6-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-left:58.33333%}.column.is-8-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-left:66.66667%}.column.is-9-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-left:83.33333%}.column.is-11-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-left:91.66667%}.column.is-12-desktop{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width:1216px){.column.is-narrow-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none}.column.is-full-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.column.is-three-quarters-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.column.is-two-thirds-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.6666%}.column.is-half-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.column.is-one-third-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.3333%}.column.is-one-quarter-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.column.is-one-fifth-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:20%}.column.is-two-fifths-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:40%}.column.is-three-fifths-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:60%}.column.is-four-fifths-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-1-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-left:8.33333%}.column.is-2-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-left:16.66667%}.column.is-3-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-left:33.33333%}.column.is-5-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-left:41.66667%}.column.is-6-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-left:58.33333%}.column.is-8-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-left:66.66667%}.column.is-9-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-left:83.33333%}.column.is-11-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-left:91.66667%}.column.is-12-widescreen{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width:1408px){.column.is-narrow-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none}.column.is-full-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.column.is-three-quarters-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.column.is-two-thirds-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.6666%}.column.is-half-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.column.is-one-third-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.3333%}.column.is-one-quarter-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.column.is-one-fifth-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:20%}.column.is-two-fifths-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:40%}.column.is-three-fifths-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:60%}.column.is-four-fifths-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-1-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-left:8.33333%}.column.is-2-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-left:16.66667%}.column.is-3-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-left:33.33333%}.column.is-5-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-left:41.66667%}.column.is-6-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-left:58.33333%}.column.is-8-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-left:66.66667%}.column.is-9-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-left:83.33333%}.column.is-11-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-left:91.66667%}.column.is-12-fullhd{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:-webkit-box;display:-ms-flexbox;display:flex}.columns.is-multiline{-ms-flex-wrap:wrap;flex-wrap:wrap}.columns.is-vcentered{-webkit-box-align:center;-ms-flex-align:center;align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:-webkit-box;display:-ms-flexbox;display:flex}}@media screen and (min-width:1024px){.columns.is-desktop{display:-webkit-box;display:-ms-flexbox;display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}.columns.is-variable.is-1{--columnGap:0.25rem}.columns.is-variable.is-2{--columnGap:0.5rem}.columns.is-variable.is-3{--columnGap:0.75rem}.columns.is-variable.is-4{--columnGap:1rem}.columns.is-variable.is-5{--columnGap:1.25rem}.columns.is-variable.is-6{--columnGap:1.5rem}.columns.is-variable.is-7{--columnGap:1.75rem}.columns.is-variable.is-8{--columnGap:2rem}.tile{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:block;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:-webkit-box;display:-ms-flexbox;display:flex}.tile.is-1{-webkit-box-flex:0;-ms-flex:none;flex:none;width:8.33333%}.tile.is-2{-webkit-box-flex:0;-ms-flex:none;flex:none;width:16.66667%}.tile.is-3{-webkit-box-flex:0;-ms-flex:none;flex:none;width:25%}.tile.is-4{-webkit-box-flex:0;-ms-flex:none;flex:none;width:33.33333%}.tile.is-5{-webkit-box-flex:0;-ms-flex:none;flex:none;width:41.66667%}.tile.is-6{-webkit-box-flex:0;-ms-flex:none;flex:none;width:50%}.tile.is-7{-webkit-box-flex:0;-ms-flex:none;flex:none;width:58.33333%}.tile.is-8{-webkit-box-flex:0;-ms-flex:none;flex:none;width:66.66667%}.tile.is-9{-webkit-box-flex:0;-ms-flex:none;flex:none;width:75%}.tile.is-10{-webkit-box-flex:0;-ms-flex:none;flex:none;width:83.33333%}.tile.is-11{-webkit-box-flex:0;-ms-flex:none;flex:none;width:91.66667%}.tile.is-12{-webkit-box-flex:0;-ms-flex:none;flex:none;width:100%}}.hero{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1023px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:#363636}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag),.hero.is-light strong{color:inherit}.hero.is-light .title{color:#363636}.hero.is-light .subtitle{color:rgba(54,54,54,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:#363636}@media screen and (max-width:1023px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(54,54,54,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:#363636}.hero.is-light .tabs a{color:#363636;opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:#363636}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:#363636;border-color:#363636;color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#f5f5f5}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#f5f5f5}.hero.is-dark .subtitle{color:rgba(245,245,245,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#f5f5f5}@media screen and (max-width:1023px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(245,245,245,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#f5f5f5}.hero.is-dark .tabs a{color:#f5f5f5;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#f5f5f5}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#3273dc;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-link .navbar-menu{background-color:#3273dc}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#2366d1;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3273dc}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#1577c6 0,#3273dc 71%,#4366e5 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1577c6 0,#3273dc 71%,#4366e5 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#118fe4;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#04a6d7 0,#209cee 71%,#3287f5 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#04a6d7 0,#209cee 71%,#3287f5 100%)}}.hero.is-success{background-color:#23d160;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-success .navbar-menu{background-color:#23d160}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#20bc56;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#23d160}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#12af2f 0,#23d160 71%,#2ce28a 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#12af2f 0,#23d160 71%,#2ce28a 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1023px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffaf24 0,#ffdd57 71%,#fffa70 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffaf24 0,#ffdd57 71%,#fffa70 100%)}}.hero.is-danger{background-color:#ff3860;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1023px){.hero.is-danger .navbar-menu{background-color:#ff3860}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ff1f4b;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ff3860}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#ff0561 0,#ff3860 71%,#ff5257 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ff0561 0,#ff3860 71%,#ff5257 100%)}}.hero.is-small .hero-body{padding-bottom:1.5rem;padding-top:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding-bottom:9rem;padding-top:9rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding-bottom:18rem;padding-top:18rem}}.hero.is-fullheight .hero-body,.hero.is-halfheight .hero-body{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-halfheight .hero-body>.container{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{bottom:0;left:0;position:absolute;right:0;top:0;overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:-webkit-box;display:-ms-flexbox;display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-foot,.hero-head{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.hero-body{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;padding:3rem 1.5rem}.section{padding:3rem 1.5rem}@media screen and (min-width:1024px){.section.is-medium{padding:9rem 1.5rem}.section.is-large{padding:18rem 1.5rem}}.footer{background-color:#f5f5f5;padding:3rem 1.5rem 6rem} +/*# sourceMappingURL=bulma.min.css.map */ \ No newline at end of file diff --git a/smartthings-plugin/plugin/css/helper.css b/smartthings-plugin/plugin/css/helper.css new file mode 100644 index 0000000..c016278 --- /dev/null +++ b/smartthings-plugin/plugin/css/helper.css @@ -0,0 +1,324 @@ +.margin-left-s {margin-left: 10px !important;} +.margin-left-m {margin-left: 20px !important;} +.margin-left-l {margin-left: 30px !important;} +.margin-left-xl {margin-left: 40px !important;} +.margin-left-xxl {margin-left: 50px !important;} + +.margin-top-s {margin-top: 10px !important;} + +.margin-top-m {margin-top: 20px !important;} +.margin-top-l {margin-top: 30px !important;} +.margin-top-xl {margin-top: 40px !important;} +.margin-top-xxl {margin-top: 50px !important;} + +.margin-bottom-s {margin-bottom: 10px !important;} +.margin-bottom-m {margin-bottom: 20px !important;} +.margin-bottom-l {margin-bottom: 30px !important;} +.margin-bottom-xl {margin-bottom: 40px !important;} +.margin-bottom-xxl {margin-bottom: 50px !important;} + +.margin-right-s {margin-right: 10px !important;} +.margin-right-m {margin-right: 20px !important;} +.margin-right-l {margin-right: 30px !important;} +.margin-right-xl {margin-right: 40px !important;} +.margin-right-xxl {margin-right: 50px !important;} + +.padding-left-s {padding-left: 10px !important;} +.padding-left-m {padding-left: 20px !important;} +.padding-left-l {padding-left: 30px !important;} +.padding-left-xl {padding-left: 40px !important;} +.padding-left-xxl {padding-left: 50px !important;} + +.padding-top-s {padding-top: 10px !important;} +.padding-top-m {padding-top: 20px !important;} +.padding-top-l {padding-top: 30px !important;} +.padding-top-xl {padding-top: 40px !important;} +.padding-top-xxl {padding-top: 50px !important;} + +.padding-bottom-s {padding-bottom: 10px !important;} +.padding-bottom-m {padding-bottom: 20px !important;} +.padding-bottom-l {padding-bottom: 30px !important;} +.padding-bottom-xl {padding-bottom: 40px !important;} +.padding-bottom-xxl {padding-bottom: 50px !important;} + +.padding-right-s {padding-right: 10px !important;} +.padding-right-m {padding-right: 20px !important;} +.padding-right-l {padding-right: 30px !important;} +.padding-right-xl {padding-right: 40px !important;} +.padding-right-xxl {padding-right: 50px !important;} + +.round-border {border-radius: 50% !important;} + +hr { + display: block; + height: 1px; + margin: 0 0; +} + +html { + min-height: 100%; + height: 100%; + -webkit-tap-highlight-color:transparent; +} + +body { + height: inherit; + overflow-y: auto; + overflow-x: hidden; +} + +.is-vertical-center { + display: flex; + align-items: center; +} + +#app-title { + text-transform: uppercase; +} + +#camera_controller { + width: 270px; + height: 270px; + background-image: url("../res/controller_bg.png"); + background-size: 100% 100%; +} + +.mid-div { + margin: 20px 0 20px 0; +} + +#motion_area { + border-radius: 50%; + background-color: #ffffff; + background-size: contain; + width: 100px; + height: 100px; + display: inline-block; + box-shadow: 0 0 5px grey; + /* margin-top: 85px; */ +} + +#camera_controller[data-state='auto_mode_on'] > #motion_area[data-state='motion_detected'] { + background-color: #209cee !important; +} + +#camera_controller[data-state='auto_mode_on'] > #motion_area[data-state='motion_detected'] p{ + color: #ffffff !important; +} + +#camera_controller[data-state='auto_mode_on'] > #motion_area[data-state='motion_detected'] p:after{ + content: 'Motion Detected'; +} + +#camera_controller[data-state='auto_mode_on'] > #motion_area[data-state='no_motion'] { + background-color: #ffffff !important; +} + +#camera_controller[data-state='auto_mode_on'] > #motion_area[data-state='no_motion'] p{ + color: #777 !important; +} + +#camera_controller[data-state='auto_mode_on'] > #motion_area[data-state='no_motion'] p:after{ + content: 'No\aMotion'; + white-space: pre; +} + +#camera_controller[data-state='auto_mode_off'] #motion_area { + background-color: #ffffff !important; +} + +#camera_controller[data-state='auto_mode_off'] p{ + color: #ccc !important; +} + +#camera_controller[data-state='auto_mode_off'] p:after{ + content: ''; +} + +#motion_area > p { + transform: translateY(50%); +} + +.icon-move { + height: 85px; + width: 85px; +} + +#camera_controller[data-state='auto_mode_on'] > .icon-move { + background-color: #ccc; +} + +#camera_controller[data-state='auto_mode_off'] > .icon-move { + background-color: #209cee; +} + +#move-left, #move-right { + margin-top: 10px; +} + +#move-left { + float: left; + mask: url("../res/arrow_left.png") no-repeat center; + mask-size: 18px 30px; + -webkit-mask: url("../res/arrow_left.png") no-repeat center; + -webkit-mask-size: 18px 30px; +} + +#move-right { + float: right; + mask: url("../res/arrow_right.png") no-repeat center; + mask-size: 18px 30px; + -webkit-mask: url("../res/arrow_right.png") no-repeat center; + -webkit-mask-size: 18px 30px; +} + +#move-up { + mask: url("../res/arrow_up.png") no-repeat center; + mask-size: 30px 18px; + -webkit-mask: url("../res/arrow_up.png") no-repeat center; + -webkit-mask-size: 30px 18px; +} + +#move-down { + mask: url("../res/arrow_down.png") no-repeat center; + mask-size: 30px 18px; + -webkit-mask: url("../res/arrow_down.png") no-repeat center; + -webkit-mask-size: 30px 18px; +} + +#auto_mode[data-state='on'] > #auto_mode_on_text { + display: block; +} + +#auto_mode[data-state='on'] > #auto_mode_off_text { + display: none; +} + +#auto_mode[data-state='off'] > #auto_mode_on_text { + display: none; +} + +#auto_mode[data-state='off'] > #auto_mode_off_text { + display: block; +} + +#mode_name { + width: 200px; +} + +/* slider for IE */ +input[type=range].slider.is-info::-ms-track{ + background:#209cee!important; + height: 2px; + border-color: transparent; + color: transparent; + background-color: transparent; +} + +/* slider for mozilla */ +input[type=range].slider.is-info::-moz-range-track { + position:relative; + width: 100%; + height: 6px; + background: #ccc; +} + +input[type=range].slider.is-info::-moz-range-progress { + position:relative; + width: 100%; + height: 6px; + background: #209cee; +} + +/* slider for chrome */ +@media screen and (-webkit-min-device-pixel-ratio:0) { + input[type='range'].slider.is-info { + overflow: hidden; + width: 100%; + -webkit-appearance: none; + } + + input[type='range'].slider.is-info::-webkit-slider-runnable-track { + height: 10px; + -webkit-appearance: none; + color: #13bba4; + margin-top: -1px; + } + + input[type='range'].slider.is-info::-webkit-slider-thumb { + box-shadow: 1080px 0 0 1080px #ccc; + } +} + +@media only screen and (min-height: 600px) { + html { + min-width: 100%; + min-height: 100%; + width: 100%; + height: 100%; + } +} + +.leftSide { + float: left; + width: 100%; + background-color: #fafafa; +} + +.rightSide { + float: left; + width: 100%; +} + +@media only screen and (orientation: landscape) and (min-height: 360px){ + .leftSide { + width: 50%; + height: inherit; + } + .rightSide { + width: 50%; + } +} + +@media only screen and (min-width: 768px) { + .leftSide { + height: auto; + } +} + +.loader { + border: 3px solid #f3f3f3; + border-radius: 100%; + border-top: 3px solid #3498db; + width: 40px; + height: 40px; + -webkit-animation: spin 2s linear infinite; /* Safari */ + animation: spin 2s linear infinite; +} + +/* Safari */ +@-webkit-keyframes spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.shadow-up { + filter: drop-shadow(0px -10px 5px #cccccc); + } + + .shadow-down { + filter: drop-shadow(0px 10px 5px #cccccc); + } + + .shadow-right { + filter: drop-shadow(10px 0px 5px #cccccc); + } + + .shadow-left { + filter: drop-shadow(-10px 0px 5px #cccccc); + } \ No newline at end of file diff --git a/smartthings-plugin/plugin/icon.png b/smartthings-plugin/plugin/icon.png new file mode 100644 index 0000000..e69de29 diff --git a/smartthings-plugin/plugin/index.html b/smartthings-plugin/plugin/index.html new file mode 100644 index 0000000..05144cc --- /dev/null +++ b/smartthings-plugin/plugin/index.html @@ -0,0 +1,75 @@ + + + + + + + + Smart Surveillance Camera + + + + + + + +

+
+
+ +
+
+
+ + +
+ + +
+
Tizen IoT
+
Smart Surveillance Camera
+
+ +
+
+
+
+
+
+

+
+
+
+ +
+
+
+ +
+ + +
+
+ +
+
+

Auto Control Mode

+

On

+

Off

+
+
+ + +
+
+
+
+ + + + + + + + + diff --git a/smartthings-plugin/plugin/js/capability_modeSwitch.js b/smartthings-plugin/plugin/js/capability_modeSwitch.js new file mode 100644 index 0000000..d713160 --- /dev/null +++ b/smartthings-plugin/plugin/js/capability_modeSwitch.js @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2015 - 2017 Samsung Electronics Co., Ltd 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. + */ + +var capabilityModeSwitch = { + 'href' : { + switch: "/capability/switch/main/0" + }, + 'controlMode' : "on", + + 'update' : function() { + ocfDevice.getRemoteRepresentation(this.href.switch, this.onRepresentCallback); + }, + + 'onRepresentCallback' : function(result, deviceHandle, uri, rcsJsonString) { + scplugin.log.debug(className, arguments.callee.name, result); + scplugin.log.debug(className, arguments.callee.name, uri); + + if (result == "OCF_OK" || result == "OCF_RESOURCE_CHANGED" || result == "OCF_RES_ALREADY_SUBSCRIBED") { + capabilityModeSwitch.controlMode = rcsJsonString["power"]; + } + + if (capabilityModeSwitch.controlMode == "off") { + document.getElementById("auto_mode").setAttribute('data-state', 'on'); + document.getElementById("camera_controller").setAttribute('data-state', 'auto_mode_on'); + document.getElementById("auto_mode_check").checked = true; + } else { + document.getElementById("auto_mode").setAttribute('data-state', 'off'); + document.getElementById("camera_controller").setAttribute('data-state', 'auto_mode_off'); + document.getElementById("auto_mode_check").checked = false; + } + }, + + 'set' : function(state) { + scplugin.log.debug(className, arguments.callee.name, "power : " + state); + var setRcsJson = {}; + setRcsJson["power"] = state; + ocfDevice.setRemoteRepresentation(this.href.switch, setRcsJson, this.onRepresentCallback); + }, + + 'isControllable': function() { + if (this.controlMode == 'on') { + return true; + } else { + return false; + } + }, + + 'modeToggle' : function() { + if (this.controlMode == "on") { + this.set("off"); + } else { + this.set("on"); + } + } +} diff --git a/smartthings-plugin/plugin/js/capability_motionSensor.js b/smartthings-plugin/plugin/js/capability_motionSensor.js new file mode 100644 index 0000000..3cd7f56 --- /dev/null +++ b/smartthings-plugin/plugin/js/capability_motionSensor.js @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd 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. + */ + +var capabilityMotionSensor = { + 'href' : { + motion: "/capability/motionSensor/main/0" + }, + + 'update' : function() { + ocfDevice.getRemoteRepresentation(this.href.motion, this.onRepresentCallback); + }, + + 'onRepresentCallback' : function(result, deviceHandle, uri, rcsJsonString) { + scplugin.log.debug(className, arguments.callee.name, result); + scplugin.log.debug(className, arguments.callee.name, uri); + + if (result == "OCF_OK" || result == "OCF_RESOURCE_CHANGED" || result == "OCF_RES_ALREADY_SUBSCRIBED") { + if(rcsJsonString["value"] === undefined) return; + + var state = rcsJsonString["value"]; + + if (state) + document.getElementById("motion_area").setAttribute('data-state', 'motion_detected'); + else + document.getElementById("motion_area").setAttribute('data-state', 'no_motion'); + } + } +} diff --git a/smartthings-plugin/plugin/js/capability_servoMotor.js b/smartthings-plugin/plugin/js/capability_servoMotor.js new file mode 100644 index 0000000..40b4f61 --- /dev/null +++ b/smartthings-plugin/plugin/js/capability_servoMotor.js @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd 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. + */ + +const SERVO_RANGE = { + VERTICAL: { + MIN: 15, + MAX: 65 + }, + HORIZONTAL: { + MIN: 5, + MAX: 65 + } +}; +const SERVO_STEP = { + VERTICAL: (SERVO_RANGE.VERTICAL.MAX - SERVO_RANGE.VERTICAL.MIN) / 10, + HORIZONTAL: (SERVO_RANGE.HORIZONTAL.MAX - SERVO_RANGE.HORIZONTAL.MIN) / 10, +}; +const CONTROL_TYPE_VERTICAL = "vertical"; +const CONTROL_TYPE_HORIZONTAL = "horizontal"; + +var capabilityServoMotor = { + 'href' : { + v: "/capability/audioVolume/main/0", + h: "/capability/switchLevel/main/0" + }, + 'valueV' : 50, + 'valueH' : 50, + + 'update' : function() { + for (var item in this.href) { + ocfDevice.getRemoteRepresentation(this.href[item], this.onRepresentCallback); + } + }, + + 'onRepresentCallback' : function(result, deviceHandle, uri, rcsJsonString) { + scplugin.log.debug(className, arguments.callee.name, result); + scplugin.log.debug(className, arguments.callee.name, uri); + + if (result == "OCF_OK" || result == "OCF_RESOURCE_CHANGED" || result == "OCF_RES_ALREADY_SUBSCRIBED") { + if (uri == capabilityServoMotor.href.v) { + if(rcsJsonString["volume"] === undefined) return; + capabilityServoMotor.valueV = rcsJsonString["volume"]; + } else if (uri == capabilityServoMotor.href.h) { + if(rcsJsonString["dimmingSetting"] === undefined) return; + capabilityServoMotor.valueH = rcsJsonString["dimmingSetting"]; + } + } + }, + + 'move' : function(type, value) { + var setRcsJson = {}; + var href; + scplugin.log.debug(className, arguments.callee.name, "Servo Motor type: " + type, "value: " + value); + + if (type == CONTROL_TYPE_VERTICAL) { + setRcsJson["volume"] = value; + href = this.href.v; + } else if (type == CONTROL_TYPE_HORIZONTAL) { + setRcsJson["dimmingSetting"] = value; + href = this.href.h; + } else { + scplugin.log.debug(className, arguments.callee.name, "Servo Motor invalid type!"); + } + + ocfDevice.setRemoteRepresentation(href, setRcsJson, this.onRepresentCallback); + }, + + 'moveDown' : function() { + var nextVal = this.valueV + SERVO_STEP.VERTICAL; + if (nextVal >= SERVO_RANGE.VERTICAL.MAX) + nextVal = SERVO_RANGE.VERTICAL.MAX; + + this.move(CONTROL_TYPE_VERTICAL, nextVal); + }, + + 'moveUp' : function() { + var nextVal = this.valueV - SERVO_STEP.VERTICAL; + if (nextVal <= SERVO_RANGE.VERTICAL.MIN) + nextVal = SERVO_RANGE.VERTICAL.MIN; + + this.move(CONTROL_TYPE_VERTICAL, nextVal); + }, + 'moveLeft' : function() { + var nextVal = this.valueH + SERVO_STEP.HORIZONTAL; + if (nextVal >= SERVO_RANGE.HORIZONTAL.MAX) + nextVal = SERVO_RANGE.HORIZONTAL.MAX; + + this.move(CONTROL_TYPE_HORIZONTAL, nextVal); + }, + 'moveRight' : function() { + var nextVal = this.valueH - SERVO_STEP.HORIZONTAL; + if (nextVal <= SERVO_RANGE.HORIZONTAL.MIN) + nextVal = SERVO_RANGE.HORIZONTAL.MIN; + + this.move(CONTROL_TYPE_HORIZONTAL, nextVal); + } +} diff --git a/smartthings-plugin/plugin/js/index.js b/smartthings-plugin/plugin/js/index.js new file mode 100644 index 0000000..0085cb3 --- /dev/null +++ b/smartthings-plugin/plugin/js/index.js @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd 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. + */ + +var ocfDevice; +var capabilities = [capabilityModeSwitch, capabilityMotionSensor, capabilityServoMotor]; +var className = "iot2018"; + +window.onload = function () { + console.log("version : 0.0.1"); + registerTouchEvents(); + init(); +}; + +function init() { + console.log("-----------init-----------"); + scplugin.manager.getOCFDevices(getOCFDeviceCB); +} + +function getOCFDeviceCB(devices) { + console.log("getOCFDeviceCB : " + devices.length); + + for (var i in devices) { + console.log("deviceHandle: " + devices[i].deviceHandle); + console.log("deviceName: " + devices[i].deviceName); + console.log("deviceType: " + devices[i].deviceType); + console.log("metadata: " + devices[i].metadata); + } + + setMainDevice(devices[0]); + ocfDevice.subscribe(onRepresentCallback); + + for (var i = 0; i < capabilities.length; i++) { + capabilities[i].update(); + } +} + +function onRepresentCallback(result, deviceHandle, uri, rcsJsonString) { + for (var i = 0; i < capabilities.length; i++) { + var hrefObj = capabilities[i].href; + + for (var item in hrefObj) { + if (hrefObj[item] == uri) + capabilities[i].onRepresentCallback(result, deviceHandle, uri, rcsJsonString); + } + } +} + +function registerTouchEvents() { + var elements = document.getElementsByClassName("icon-move"); + // up-left-right-down + + // Move Up + elements[0].addEventListener("touchstart", function() { + if (!capabilityModeSwitch.isControllable()){ + return; + } + document.getElementById("camera_controller").className = "shadow-up"; + }, false); + + // Move Left + elements[1].addEventListener("touchstart", function() { + if (!capabilityModeSwitch.isControllable()){ + return; + } + document.getElementById("camera_controller").className = "shadow-left"; + }, false); + + // Move Right + elements[2].addEventListener("touchstart", function() { + if (!capabilityModeSwitch.isControllable()){ + return; + } + document.getElementById("camera_controller").className = "shadow-right"; + }, false); + + // Move Down + elements[3].addEventListener("touchstart", function() { + if (!capabilityModeSwitch.isControllable()){ + return; + } + document.getElementById("camera_controller").className = "shadow-down"; + }, false); + + for (var i = 0; i < elements.length; i++){ + elements[i].addEventListener("touchend", function() { + document.getElementById("camera_controller").className = ""; + }, false); + } +} + +function setMainDevice(device) { + scplugin.log.debug(className, arguments.callee.name, "set ocf device : " + device.deviceName); + ocfDevice = device; +} + +function backAction() { + scplugin.manager.close(); +} + +function onModeBtnClicked() { + capabilityModeSwitch.modeToggle(); +} + +function onMoveUpBtnClicked() { + if (!capabilityModeSwitch.isControllable()){ + return; + } + capabilityServoMotor.moveUp(); +} + +function onMoveDownBtnClicked() { + if (!capabilityModeSwitch.isControllable()){ + return; + } + capabilityServoMotor.moveDown(); +} + +function onMoveLeftBtnClicked() { + if (!capabilityModeSwitch.isControllable()){ + return; + } + capabilityServoMotor.moveLeft(); +} + +function onMoveRightBtnClicked() { + if (!capabilityModeSwitch.isControllable()){ + return; + } + capabilityServoMotor.moveRight(); +} diff --git a/smartthings-plugin/plugin/manifest.xml b/smartthings-plugin/plugin/manifest.xml new file mode 100644 index 0000000..b276531 --- /dev/null +++ b/smartthings-plugin/plugin/manifest.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/smartthings-plugin/plugin/res/arrow_down.png b/smartthings-plugin/plugin/res/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..02432674057d18a71e246ca3c1a36d7670b88963 GIT binary patch literal 2233 zcmV;q2uAmbP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/smartthings-plugin/plugin/res/arrow_up.png b/smartthings-plugin/plugin/res/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..123ca02727d58d4fdd6af0d36951ff980332f176 GIT binary patch literal 2193 zcmV;C2yXX@P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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

X2e=n5jaFwdJY?DcWP7kv*aY0VX#@ z15H3W;W8lACkvzjNy?*Vu}G4J7epe78KAQFWd$zJ|5!=GE!-emwrYR| pNS|$KUcsD5j4{R-V~jDTxgUDi3H@y@m6iYi002ovPDHLkV1n0{{VV_g literal 0 HcmV?d00001 diff --git a/smartthings-plugin/plugin/res/controller_bg.png b/smartthings-plugin/plugin/res/controller_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..abd0c2e530e8327434dc7dd155ce2fb3c76ba413 GIT binary patch literal 26417 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 literal 0 HcmV?d00001 diff --git a/smartthings-plugin/plugin/webfonts/fa-solid-900.ttf b/smartthings-plugin/plugin/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..618136ab12df83b807b9ae22d073b0689e6b4472 GIT binary patch literal 160548 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 B=Kufz literal 0 HcmV?d00001 diff --git a/smartthings-plugin/plugin/webfonts/fa-solid-900.woff b/smartthings-plugin/plugin/webfonts/fa-solid-900.woff new file mode 100644 index 0000000000000000000000000000000000000000..af7c4f7ab6161fbcfc650e7762696fc91506c341 GIT binary patch literal 86876 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 z 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%0D%d#pWwyRB45*$uyM1NE=Q)3=`B%?XD)-apyozFV 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 literal 0 HcmV?d00001 diff --git a/smartthings-plugin/plugin/webfonts/fa-solid-900.woff2 b/smartthings-plugin/plugin/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f025a0092be0b301dd17b4f89fd1c19d8544b796 GIT binary patch literal 36708 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 Q`-jtUnj7G-b^iqA7lzXYN&o-= literal 0 HcmV?d00001 diff --git a/smartthings-plugin/prod-catalog.json b/smartthings-plugin/prod-catalog.json new file mode 100644 index 0000000..3038d30 --- /dev/null +++ b/smartthings-plugin/prod-catalog.json @@ -0,0 +1,4 @@ +{ + "modelCd": "YOUR_DEVICE_NAME", + "easysetupId": "001" +} \ No newline at end of file diff --git a/src/controller.c b/src/controller.c new file mode 100644 index 0000000..e98435f --- /dev/null +++ b/src/controller.c @@ -0,0 +1,678 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "controller.h" +#include "controller_mv.h" +#include "controller_image.h" +#include "log.h" +#include "resource_camera.h" +#include "switch.h" +#include "servo-h.h" +#include "servo-v.h" +#include "servo-type.h" +#include "motion.h" +#include "st_thing_master.h" +#include "st_thing_resource.h" + +#define CAMERA_MOVE_INTERVAL_MS 450 +#define THRESHOLD_EVENT_COUNT 2 +#define VALID_EVENT_INTERVAL_MS 200 + +#define IMAGE_FILE_PREFIX "CAM_" +#define EVENT_INTERVAL_SECOND 0.5f + +#define TEMP_IMAGE_FILENAME "/tmp/tmp.jpg" +#define LATEST_IMAGE_FILENAME "/tmp/latest.jpg" + +// #define TEST_SERVO_MOTER_CAL 1 +// #define TEST_DEBUG_MODE 1 +// #define ENABLE_SMARTTHINGS +#define APP_CALLBACK_KEY "controller" + +typedef struct app_data_s { + long long int last_moved_time; + long long int last_valid_event_time; + double current_servo_x; + double current_servo_y; + int motion_state; + + int vision_result_x_sum; + int vision_result_y_sum; + + int valid_event_count; + + unsigned int latest_image_width; + unsigned int latest_image_height; + char *latest_image_info; + int latest_image_type; // 0: 카메라 이동 시간의 이미지, 1: 유효 이벤트 숫자 아래의 이미지, 2: 유효한 동작 이미지 + + unsigned char *latest_image_buffer; + + Ecore_Thread *image_writter_thread; + pthread_mutex_t mutex; +} app_data; + +static long long int __get_monotonic_ms(void) +{ + long long int ret_time = 0; + struct timespec time_s; + + if (0 == clock_gettime(CLOCK_MONOTONIC, &time_s)) + ret_time = time_s.tv_sec* 1000 + time_s.tv_nsec / 1000000; + else + _E("Failed to get time"); + + return ret_time; +} + +static mv_colorspace_e __convert_colorspace_from_cam_to_mv(camera_pixel_format_e format) +{ + mv_colorspace_e colorspace = MEDIA_VISION_COLORSPACE_INVALID; + switch (format) { + case CAMERA_PIXEL_FORMAT_NV12: + colorspace = MEDIA_VISION_COLORSPACE_NV12; + break; + case CAMERA_PIXEL_FORMAT_NV21: + colorspace = MEDIA_VISION_COLORSPACE_NV21; + break; + case CAMERA_PIXEL_FORMAT_YUYV: + colorspace = MEDIA_VISION_COLORSPACE_YUYV; + break; + case CAMERA_PIXEL_FORMAT_UYVY: + colorspace = MEDIA_VISION_COLORSPACE_UYVY; + break; + case CAMERA_PIXEL_FORMAT_422P: + colorspace = MEDIA_VISION_COLORSPACE_422P; + break; + case CAMERA_PIXEL_FORMAT_I420: + colorspace = MEDIA_VISION_COLORSPACE_I420; + break; + case CAMERA_PIXEL_FORMAT_YV12: + colorspace = MEDIA_VISION_COLORSPACE_YV12; + break; + case CAMERA_PIXEL_FORMAT_RGB565: + colorspace = MEDIA_VISION_COLORSPACE_RGB565; + break; + case CAMERA_PIXEL_FORMAT_RGB888: + colorspace = MEDIA_VISION_COLORSPACE_RGB888; + break; + case CAMERA_PIXEL_FORMAT_RGBA: + colorspace = MEDIA_VISION_COLORSPACE_RGBA; + break; + case CAMERA_PIXEL_FORMAT_NV12T: + case CAMERA_PIXEL_FORMAT_NV16: + case CAMERA_PIXEL_FORMAT_ARGB: + case CAMERA_PIXEL_FORMAT_JPEG: + case CAMERA_PIXEL_FORMAT_H264: + case CAMERA_PIXEL_FORMAT_INVALID: + default : + colorspace = MEDIA_VISION_COLORSPACE_INVALID; + _E("unsupported format : %d", format); + break; + } + + return colorspace; +} + +static void __thread_write_image_file(void *data, Ecore_Thread *th) +{ + app_data *ad = (app_data *)data; + unsigned int width = 0; + unsigned int height = 0; + unsigned char *buffer = 0; + char *image_info = NULL; + int ret = 0; + + pthread_mutex_lock(&ad->mutex); + width = ad->latest_image_width; + height = ad->latest_image_height; + buffer = ad->latest_image_buffer; + ad->latest_image_buffer = NULL; + if (ad->latest_image_info) { + image_info = ad->latest_image_info; + ad->latest_image_info = NULL; + } else { + image_info = strdup("00"); + } + pthread_mutex_unlock(&ad->mutex); + +#ifdef TEST_DEBUG_MODE + char filename[PATH_MAX] = {'\0', }; + static long long int captured_time = 0; + long long int now = __get_monotonic_ms(); + int servo_x = 0; + int servo_y = 0; + int latest_image_type = 0; + + char *data_path = NULL; + data_path = app_get_data_path(); + + pthread_mutex_lock(&ad->mutex); + servo_x = (int)ad->current_servo_x; + servo_y = (int)ad->current_servo_y; + latest_image_type = ad->latest_image_type; + pthread_mutex_unlock(&ad->mutex); + + snprintf(filename, PATH_MAX, "%s%s%lld_H_%d_V_%d_%lld_%d.jpg", + data_path, + IMAGE_FILE_PREFIX, + __get_monotonic_ms(), + servo_x, + servo_y, + __get_monotonic_ms() - captured_time, + latest_image_type); + + free(data_path); + data_path = NULL; + + ret = controller_image_save_image_file(filename, width, height, buffer, image_info, strlen(image_info)); + if (ret) + _E("failed to save image file"); + + captured_time = __get_monotonic_ms(); +#else + ret = controller_image_save_image_file(TEMP_IMAGE_FILENAME, width, height, buffer, image_info, strlen(image_info)); + if (ret) { + _E("failed to save image file"); + } else { + ret = rename(TEMP_IMAGE_FILENAME, LATEST_IMAGE_FILENAME); + if (ret != 0 ) + _E("Rename fail"); + } +#endif + free(image_info); + free(buffer); +} + +static void __thread_end_cb(void *data, Ecore_Thread *th) +{ + app_data *ad = (app_data *)data; + + // _D("Normal termination for thread %p.\n", th); + pthread_mutex_lock(&ad->mutex); + ad->image_writter_thread = NULL; + pthread_mutex_unlock(&ad->mutex); +} + +static void __thread_cancel_cb(void *data, Ecore_Thread *th) +{ + app_data *ad = (app_data *)data; + unsigned char *buffer = NULL; + + _E("Thread %p got cancelled.\n", th); + pthread_mutex_lock(&ad->mutex); + buffer = ad->latest_image_buffer; + ad->latest_image_buffer = NULL; + ad->image_writter_thread = NULL; + pthread_mutex_unlock(&ad->mutex); + + free(buffer); +} + +static void __copy_image_buffer(image_buffer_data_s *image_buffer, app_data *ad) +{ + unsigned char *buffer = NULL; + + pthread_mutex_lock(&ad->mutex); + ad->latest_image_height = image_buffer->image_height; + ad->latest_image_width = image_buffer->image_width; + + buffer = ad->latest_image_buffer; + ad->latest_image_buffer = image_buffer->buffer; + pthread_mutex_unlock(&ad->mutex); + + free(buffer); +} + +static void __preview_image_buffer_created_cb(void *data) +{ + image_buffer_data_s *image_buffer = data; + app_data *ad = (app_data *)image_buffer->user_data; + mv_source_h source = NULL; + mv_colorspace_e image_colorspace = MEDIA_VISION_COLORSPACE_INVALID; + switch_state_e switch_state = SWITCH_STATE_OFF; + char *info = NULL; + + ret_if(!image_buffer); + ret_if(!ad); + +#ifdef TEST_DEBUG_MODE + static long long int last_time = 0; + static int seq = 0; + long long int now = __get_monotonic_ms(); + seq++; + _D("BUFFER seq[%d] interval[%lld]", seq, now - last_time); + last_time = now; +#endif + + image_colorspace = __convert_colorspace_from_cam_to_mv(image_buffer->format); + goto_if(image_colorspace == MEDIA_VISION_COLORSPACE_INVALID, FREE_ALL_BUFFER); + + __copy_image_buffer(image_buffer, ad); + + switch_state_get(&switch_state); + if (switch_state == SWITCH_STATE_OFF) { /* SWITCH_STATE_OFF means automatic mode */ + source = controller_mv_create_source(image_buffer->buffer, + image_buffer->buffer_size, image_buffer->image_width, + image_buffer->image_height, image_colorspace); + } + + pthread_mutex_lock(&ad->mutex); + info = ad->latest_image_info; + ad->latest_image_info = NULL; + pthread_mutex_unlock(&ad->mutex); + free(info); + + if (source) + controller_mv_push_source(source); + +#ifdef TEST_DEBUG_MODE + _D("Vision need %lldms", __get_monotonic_ms() - now); +#endif + free(image_buffer); + + motion_state_set(ad->motion_state, APP_CALLBACK_KEY); + ad->motion_state = 0; + + pthread_mutex_lock(&ad->mutex); + if (!ad->image_writter_thread) { + ad->image_writter_thread = ecore_thread_run(__thread_write_image_file, __thread_end_cb, __thread_cancel_cb, ad); + } else { + _E("Thread is running NOW"); + } + pthread_mutex_unlock(&ad->mutex); + + return; + +FREE_ALL_BUFFER: + free(image_buffer->buffer); + free(image_buffer); +} + +// x, y -10 ~ 10 offset +static void __move_camera(int x, int y, void *user_data) +{ + app_data *ad = (app_data *)user_data; + ret_if(!ad); + + if (x > 10) x = 10; + if (x < -10) x = -10; + if (y > 10) y = 10; + if (y < -10) y = -10; + + x *= -1; // 카메라는 좌우 반전!! + double calculated_x = ad->current_servo_x + x * SERVO_MOTOR_HORIZONTAL_STEP; + double calculated_y = ad->current_servo_y + y * SERVO_MOTOR_VERTICAL_STEP; + + if (calculated_x > SERVO_MOTOR_HORIZONTAL_MAX) + calculated_x = SERVO_MOTOR_HORIZONTAL_MAX; + + if (calculated_x < SERVO_MOTOR_HORIZONTAL_MIN) + calculated_x = SERVO_MOTOR_HORIZONTAL_MIN; + + if (calculated_y > SERVO_MOTOR_VERTICAL_MAX) + calculated_y = SERVO_MOTOR_VERTICAL_MAX; + + if (calculated_y < SERVO_MOTOR_VERTICAL_MIN) + calculated_y = SERVO_MOTOR_VERTICAL_MIN; + + ad->current_servo_x = calculated_x; + ad->current_servo_y = calculated_y; + + servo_h_state_set(calculated_x, APP_CALLBACK_KEY); + servo_v_state_set(calculated_y, APP_CALLBACK_KEY); + + return; +} + +static void __set_result_info(int result[], int result_count, app_data *ad, int image_result_type) +{ + char image_info[IMAGE_INFO_MAX + 1] = {'\0', }; + char *current_position; + int current_index = 0; + int string_count = 0; + int i = 0; + char *latest_image_info = NULL; + char *info = NULL; + + current_position = image_info; + + current_position += snprintf(current_position, IMAGE_INFO_MAX, "%02d", image_result_type); + string_count += 2; + + current_position += snprintf(current_position, IMAGE_INFO_MAX - string_count, "%02d", result_count); + string_count += 2; + + for (i = 0; i < result_count; i++) { + current_index = i * 4; +#ifdef TEST_DEBUG_MODE + _D("RESULT: [%02d] [%02d] [%02d] [%02d]", result[i], result[i + 1], result[i + 2], result[i + 3]); +#endif + if (IMAGE_INFO_MAX - string_count < 0) + break; + + current_position += snprintf(current_position, IMAGE_INFO_MAX - string_count, "%02d%02d%02d%02d" + , result[current_index], result[current_index + 1], result[current_index + 2], result[current_index + 3]); + string_count += 8; + } + +#ifdef TEST_DEBUG_MODE + _D("RESULT: Count [%02d] String [%s]", result_count, image_info); +#endif + latest_image_info = strdup(image_info); + pthread_mutex_lock(&ad->mutex); + info = ad->latest_image_info; + ad->latest_image_info = latest_image_info; + pthread_mutex_unlock(&ad->mutex); + free(info); +} + +static void __mv_detection_event_cb(int horizontal, int vertical, int result[], int result_count, void *user_data) +{ + app_data *ad = (app_data *)user_data; + long long int now = __get_monotonic_ms(); + + ad->motion_state = 1; + + if (now < ad->last_moved_time + CAMERA_MOVE_INTERVAL_MS) { + // _D("@@@ CAMERA MOVE TIME @@@"); + ad->valid_event_count = 0; + pthread_mutex_lock(&ad->mutex); + ad->latest_image_type = 0; + pthread_mutex_unlock(&ad->mutex); + __set_result_info(result, result_count, ad, 0); + return; + } + + if (now < ad->last_valid_event_time + VALID_EVENT_INTERVAL_MS) { + ad->valid_event_count++; + } else { + ad->valid_event_count = 1; + } + + ad->last_valid_event_time = now; + + if (ad->valid_event_count < THRESHOLD_EVENT_COUNT) { + ad->vision_result_x_sum += horizontal; + ad->vision_result_y_sum += vertical; + pthread_mutex_lock(&ad->mutex); + ad->latest_image_type = 1; + pthread_mutex_unlock(&ad->mutex); + __set_result_info(result, result_count, ad, 1); + return; + } + + ad->valid_event_count = 0; + ad->vision_result_x_sum += horizontal; + ad->vision_result_y_sum += vertical; + + int x = ad->vision_result_x_sum / THRESHOLD_EVENT_COUNT; + int y = ad->vision_result_y_sum / THRESHOLD_EVENT_COUNT; + + x = 10 * x / (IMAGE_WIDTH / 2); + y = 10 * y / (IMAGE_HEIGHT / 2); + +#ifndef TEST_SERVO_MOTER_CAL + __move_camera((int) x, (int) y, ad); +#endif + ad->last_moved_time = now; + + ad->vision_result_x_sum = 0; + ad->vision_result_y_sum = 0; + pthread_mutex_lock(&ad->mutex); + ad->latest_image_type = 2; + pthread_mutex_unlock(&ad->mutex); + + __set_result_info(result, result_count, ad, 2); +} + +#ifdef TEST_SERVO_MOTER_CAL +static Eina_Bool _control_interval_event_cb(void *data) +{ + static int h = SERVO_MOTOR_HORIZONTAL_MIN; + static int v = SERVO_MOTOR_VERTICAL_MIN; + + v += SERVO_MOTOR_VERTICAL_STEP; + if (v > SERVO_MOTOR_VERTICAL_MAX) + v = SERVO_MOTOR_VERTICAL_MIN; + + h += SERVO_MOTOR_HORIZONTAL_STEP; + if (h > SERVO_MOTOR_HORIZONTAL_MAX) + h = SERVO_MOTOR_HORIZONTAL_MIN; + + // servo_h_state_set(h, APP_CALLBACK_KEY); + // servo_v_state_set(v, APP_CALLBACK_KEY); + + _D("SERVO V ONLY v[%d] h[%d]", v, h); + + return ECORE_CALLBACK_RENEW; +} +#endif + +static void __switch_changed(switch_state_e state, void* user_data) +{ + app_data *ad = (app_data *)user_data; + _D("switch changed to - %d", state); + ret_if(!ad); + + /* Move servo motors to initial position */ + if (state != SWITCH_STATE_ON) + return; + + ad->current_servo_x = SERVO_MOTOR_HORIZONTAL_CENTER; + ad->current_servo_y = SERVO_MOTOR_VERTICAL_CENTER; + + servo_h_state_set(ad->current_servo_x, APP_CALLBACK_KEY); + servo_v_state_set(ad->current_servo_y, APP_CALLBACK_KEY); +} + +static void __servo_v_changed(double value, void* user_data) +{ + app_data *ad = (app_data *)user_data; + ret_if(!ad); + + _D("servo_v changed to - %lf", value); + ad->current_servo_y = value; +} + +static void __servo_h_changed(double value, void* user_data) +{ + app_data *ad = (app_data *)user_data; + ret_if(!ad); + + _D("servo_h changed to - %lf", value); + ad->current_servo_x = value; +} + +static void __device_interfaces_fini(void) +{ + switch_finalize(); + servo_v_finalize(); + servo_h_finalize(); + motion_finalize(); +} + +static int __device_interfaces_init(app_data *ad) +{ + retv_if(!ad, -1); + + if (switch_initialize()) { + _E("failed to switch_initialize()"); + return -1; + } + + if (servo_v_initialize()) { + _E("failed to switch_initialize()"); + goto ERROR; + } + + if (servo_h_initialize()) { + _E("failed to switch_initialize()"); + goto ERROR; + } + + if (motion_initialize()) { + _E("failed to motion_initialize()"); + goto ERROR; + } + + switch_state_changed_cb_set(APP_CALLBACK_KEY, __switch_changed, ad); + servo_v_state_changed_cb_set(APP_CALLBACK_KEY, __servo_v_changed, ad); + servo_h_state_changed_cb_set(APP_CALLBACK_KEY, __servo_h_changed, ad); + // motion : only set result value, callback is not needed + + return 0; + +ERROR : + __device_interfaces_fini(); + return -1; +} + +static bool service_app_create(void *data) +{ + app_data *ad = (app_data *)data; + + controller_image_initialize(); + + pthread_mutex_init(&ad->mutex, NULL); + + if (__device_interfaces_init(ad)) + goto ERROR; + + if (controller_mv_set_movement_detection_event_cb(__mv_detection_event_cb, data) == -1) { + _E("Failed to set movement detection event callback"); + goto ERROR; + } + + if (resource_camera_init(__preview_image_buffer_created_cb, ad) == -1) { + _E("Failed to init camera"); + goto ERROR; + } + +#ifdef TEST_SERVO_MOTER_CAL + ecore_timer_add(EVENT_INTERVAL_SECOND, _control_interval_event_cb, NULL); +#endif + + if (resource_camera_start_preview() == -1) { + _E("Failed to start camera preview"); + goto ERROR; + } + +#ifdef ENABLE_SMARTTHINGS + /* smartthings APIs should be called after camera start preview, they can't wait to start camera */ + if (st_thing_master_init()) + goto ERROR; + + if (st_thing_resource_init()) + goto ERROR; +#endif /* ENABLE_SMARTTHINGS */ + + ad->current_servo_x = SERVO_MOTOR_HORIZONTAL_CENTER; + ad->current_servo_y = SERVO_MOTOR_VERTICAL_CENTER; + + servo_h_state_set(ad->current_servo_x, APP_CALLBACK_KEY); + servo_v_state_set(ad->current_servo_y, APP_CALLBACK_KEY); + + return true; + +ERROR: + __device_interfaces_fini(); + + resource_camera_close(); + controller_mv_unset_movement_detection_event_cb(); + controller_image_finalize(); + +#ifdef ENABLE_SMARTTHINGS + st_thing_master_fini(); + st_thing_resource_fini(); +#endif /* ENABLE_SMARTTHINGS */ + + pthread_mutex_destroy(&ad->mutex); + + return false; +} + +static void service_app_terminate(void *data) +{ + app_data *ad = (app_data *)data; + Ecore_Thread *thread_id = NULL; + unsigned char *buffer = NULL; + char *info = NULL; + _D("App Terminated - enter"); + + resource_camera_close(); + controller_mv_unset_movement_detection_event_cb(); + + pthread_mutex_lock(&ad->mutex); + thread_id = ad->image_writter_thread; + ad->image_writter_thread = NULL; + pthread_mutex_unlock(&ad->mutex); + + if (thread_id) + ecore_thread_wait(thread_id, 3.0); // wait for 3 second + + __device_interfaces_fini(); + + controller_image_finalize(); + +#ifdef ENABLE_SMARTTHINGS + st_thing_master_fini(); + st_thing_resource_fini(); +#endif /* ENABLE_SMARTTHINGS */ + + pthread_mutex_lock(&ad->mutex); + buffer = ad->latest_image_buffer; + ad->latest_image_buffer = NULL; + info = ad->latest_image_info; + ad->latest_image_info = NULL; + pthread_mutex_unlock(&ad->mutex); + free(buffer); + free(info); + + pthread_mutex_destroy(&ad->mutex); + free(ad); + _D("App Terminated - leave"); +} + +static void service_app_control(app_control_h app_control, void *data) +{ + /* APP_CONTROL */ +} + +int main(int argc, char* argv[]) +{ + app_data *ad = NULL; + int ret = 0; + service_app_lifecycle_callback_s event_callback; + + ad = calloc(1, sizeof(app_data)); + retv_if(!ad, -1); + + event_callback.create = service_app_create; + event_callback.terminate = service_app_terminate; + event_callback.app_control = service_app_control; + + ret = service_app_main(argc, argv, &event_callback, ad); + + return ret; +} diff --git a/src/controller_image.c b/src/controller_image.c new file mode 100644 index 0000000..5e47b70 --- /dev/null +++ b/src/controller_image.c @@ -0,0 +1,141 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include "log.h" +#include "exif.h" + +static image_util_encode_h encode_h = NULL; +static image_util_decode_h decode_h = NULL; + +#define IMAGE_COLORSPACE IMAGE_UTIL_COLORSPACE_I420 + +void controller_image_initialize(void) +{ + int error_code = image_util_encode_create(IMAGE_UTIL_JPEG, &encode_h); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_encode_create [%s]", get_error_message(error_code)); + } + + error_code = image_util_decode_create(&decode_h); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_decode_create [%s]", get_error_message(error_code)); + } +} + +void controller_image_finalize(void) +{ + int error_code = image_util_encode_destroy(encode_h); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_encode_destroy [%s]", get_error_message(error_code)); + } + + error_code = image_util_decode_destroy(decode_h); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_decode_destroy [%s]", get_error_message(error_code)); + } +} + +int controller_image_save_image_file(const char *path, + unsigned int width, unsigned int height, const unsigned char *buffer, + const char *comment, unsigned int comment_len) +{ + unsigned char *encoded = NULL; + unsigned long long size = 0; + + int error_code = image_util_encode_set_resolution(encode_h, width, height); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_encode_set_resolution [%s]", get_error_message(error_code)); + return -1; + } + + error_code = image_util_encode_set_colorspace(encode_h, IMAGE_COLORSPACE); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_encode_set_colorspace [%s]", get_error_message(error_code)); + return -1; + } + + error_code = image_util_encode_set_quality(encode_h, 90); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_encode_set_quality [%s]", get_error_message(error_code)); + return -1; + } + + error_code = image_util_encode_set_input_buffer(encode_h, buffer); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_encode_set_input_buffer [%s]", get_error_message(error_code)); + return -1; + } + + error_code = image_util_encode_set_output_buffer(encode_h, &encoded); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_encode_set_output_buffer [%s]", get_error_message(error_code)); + return -1; + } + + error_code = image_util_encode_run(encode_h, &size); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_encode_run [%s]", get_error_message(error_code)); + return -1; + } + + error_code = exif_write_jpg_file_with_comment(path, + encoded, (unsigned int)size, width, height, comment, comment_len); + + free(encoded); + + return error_code; +} + +int controller_image_read_image_file(const char *path, + unsigned long *width, unsigned long *height, unsigned char *buffer, unsigned long long *size) +{ + int error_code = image_util_decode_set_input_path(decode_h, path); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_decode_set_input_path [%s] [%s]", path, get_error_message(error_code)); + return -1; + } + + error_code = image_util_decode_set_output_buffer(decode_h, &buffer); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_decode_set_output_buffer [%s]", get_error_message(error_code)); + return -1; + } + + error_code = image_util_decode_set_colorspace(decode_h, IMAGE_UTIL_COLORSPACE_RGBA8888); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_decode_set_colorspace [%s]", get_error_message(error_code)); + return -1; + } + + error_code = image_util_decode_set_jpeg_downscale(decode_h, IMAGE_UTIL_DOWNSCALE_1_1); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_decode_set_jpeg_downscale [%s]", get_error_message(error_code)); + return -1; + } + + error_code = image_util_decode_run(decode_h, width, height, size); + if (error_code != IMAGE_UTIL_ERROR_NONE) { + _E("image_util_decode_run [%s]", get_error_message(error_code)); + return -1; + } + + return error_code; +} diff --git a/src/controller_mv.c b/src/controller_mv.c new file mode 100644 index 0000000..4462b47 --- /dev/null +++ b/src/controller_mv.c @@ -0,0 +1,258 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include +#include "controller.h" +#include "controller_mv.h" +#include "log.h" + +#define VIDEO_STREAM_ID 0 +#define THRESHOLD_SIZE_REGION 100 + +struct __mv_data { + mv_surveillance_event_trigger_h mv_trigger_handle; + movement_detected_cb movement_detected_cb; + void *movement_detected_cb_data; +}; + +static struct __mv_data *mv_data = NULL; + +static const char *__mv_err_to_str(mv_error_e err) +{ + const char *err_str; + switch (err) { + case MEDIA_VISION_ERROR_NONE: + err_str = "MEDIA_VISION_ERROR_NONE"; + break; + case MEDIA_VISION_ERROR_NOT_SUPPORTED: + err_str = "MEDIA_VISION_ERROR_NOT_SUPPORTED"; + break; + case MEDIA_VISION_ERROR_MSG_TOO_LONG: + err_str = "MEDIA_VISION_ERROR_MSG_TOO_LONG"; + break; + case MEDIA_VISION_ERROR_NO_DATA: + err_str = "MEDIA_VISION_ERROR_NO_DATA"; + break; + case MEDIA_VISION_ERROR_KEY_NOT_AVAILABLE: + err_str = "MEDIA_VISION_ERROR_KEY_NOT_AVAILABLE"; + break; + case MEDIA_VISION_ERROR_OUT_OF_MEMORY: + err_str = "MEDIA_VISION_ERROR_OUT_OF_MEMORY"; + break; + case MEDIA_VISION_ERROR_INVALID_PARAMETER: + err_str = "MEDIA_VISION_ERROR_INVALID_PARAMETER"; + break; + case MEDIA_VISION_ERROR_INVALID_OPERATION: + err_str = "MEDIA_VISION_ERROR_INVALID_OPERATION"; + break; + case MEDIA_VISION_ERROR_PERMISSION_DENIED: + err_str = "MEDIA_VISION_ERROR_PERMISSION_DENIED"; + break; + case MEDIA_VISION_ERROR_NOT_SUPPORTED_FORMAT: + err_str = "MEDIA_VISION_ERROR_NOT_SUPPORTED_FORMAT"; + break; + case MEDIA_VISION_ERROR_INTERNAL: + err_str = "MEDIA_VISION_ERROR_INTERNAL"; + break; + case MEDIA_VISION_ERROR_INVALID_DATA: + err_str = "MEDIA_VISION_ERROR_INVALID_DATA"; + break; + case MEDIA_VISION_ERROR_INVALID_PATH: + err_str = "MEDIA_VISION_ERROR_INVALID_PATH"; + break; + default: + err_str = "Unknown Error"; + break; + } + + return err_str; +} + +static void __movement_detected_event_cb(mv_surveillance_event_trigger_h trigger, mv_source_h source, int video_stream_id, mv_surveillance_result_h event_result, void *data) +{ + int ret = 0; + int horizontal = 0; + int vertical = 0; + int result[MV_RESULT_LENGTH_MAX] = {0, }; + int result_count = 0; + int result_index = 0; + int valid_area_sum = 0; + int i; + size_t move_regions_num = 0; + mv_rectangle_s *regions = NULL; + + ret_if(!trigger); + ret_if(!event_result); + ret_if(!mv_data); + + ret = mv_surveillance_get_result_value(event_result, MV_SURVEILLANCE_MOVEMENT_NUMBER_OF_REGIONS, &move_regions_num); + retm_if(ret, "failed to mv_surveillance_get_result_value for %s - [%s]", MV_SURVEILLANCE_MOVEMENT_NUMBER_OF_REGIONS, __mv_err_to_str(ret)); + + regions = malloc(sizeof(mv_rectangle_s) * move_regions_num); + ret = mv_surveillance_get_result_value(event_result, MV_SURVEILLANCE_MOVEMENT_REGIONS, regions); + retm_if(ret, "failed to mv_surveillance_get_result_value for %s - [%s]", MV_SURVEILLANCE_MOVEMENT_REGIONS, __mv_err_to_str(ret)); + + for (i = 0; i < move_regions_num; i++) { + // _D("region[%u] - position[%d x %d], witdh[%d], height[%d]", i, regions[i].point.x, regions[i].point.y, regions[i].width, regions[i].height); + // _D("region[%u] - area[%d]", i, regions[i].width * regions[i].height); + + if (regions[i].width * regions[i].height < THRESHOLD_SIZE_REGION || result_count >= MV_RESULT_COUNT_MAX) + continue; + + result[result_index] = regions[i].point.x * 99 / IMAGE_WIDTH; + result[result_index + 1] = regions[i].point.y * 99 / IMAGE_HEIGHT; + result[result_index + 2] = regions[i].width * 99 / IMAGE_WIDTH; + result[result_index + 3] = regions[i].height * 99 / IMAGE_HEIGHT; + + result_count++; + result_index = result_count * 4; + + valid_area_sum += regions[i].width * regions[i].height; + } + + for (i = 0; i < move_regions_num; i++) { + if (regions[i].width * regions[i].height < THRESHOLD_SIZE_REGION) + continue; + + //offset 은 움직임의 중심 좌표가 화면의 중심으로 부터 얼마나 벗어났는지의 값으로 -160 ~ 160, -120 ~ 120 의 값을 갖는다. + int x_offset = (regions[i].point.x + regions[i].width / 2) - (IMAGE_WIDTH / 2); + int y_offset = (regions[i].point.y + regions[i].height / 2) - (IMAGE_HEIGHT / 2); + int area = regions[i].width * regions[i].height; + + // offset 값에 움직임 크기의 상대값(비율)을 곱한 다음, 모두 더해서 최종 offset 값을 구한다. + // 최종값의 범위는 offset 값의 범위와 같아야 한다. + horizontal += (int) x_offset * area / valid_area_sum; + vertical += (int) y_offset * area / valid_area_sum; + } + free(regions); + + mv_data->movement_detected_cb(horizontal, vertical, result, result_count, mv_data->movement_detected_cb_data); +} + +void controller_mv_push_source(mv_source_h source) +{ + int ret = 0; + ret_if(!source); + + ret = mv_surveillance_push_source(source, VIDEO_STREAM_ID); + if (ret) + _E("failed to mv_surveillance_push_source() - [%s]", __mv_err_to_str(ret)); + + mv_destroy_source(source); +} + +mv_source_h controller_mv_create_source( + unsigned char *buffer, unsigned int size, + unsigned int width, unsigned int height, mv_colorspace_e colorspace) +{ + mv_source_h source = NULL; + int ret = 0; + + retv_if(!buffer, NULL); + + ret = mv_create_source(&source); + retvm_if(ret, NULL, "failed to mv_create_source - [%s]", __mv_err_to_str(ret)); + + ret = mv_source_fill_by_buffer(source, buffer, size, width, height, colorspace); + if (ret) { + _E("failed to fill source - %d", ret); + + if (source) + mv_destroy_source(source); + + return NULL; + } + + return source; +} + +int controller_mv_set_movement_detection_event_cb(movement_detected_cb movement_detected_cb, void *user_data) +{ + int ret = 0; + mv_engine_config_h engine_cfg = NULL; + + if (movement_detected_cb == NULL) + return -1; + + if (mv_data != NULL) { + mv_data->movement_detected_cb = movement_detected_cb; + mv_data->movement_detected_cb_data = user_data; + return 0; + } + + mv_data = malloc(sizeof(struct __mv_data)); + if (mv_data == NULL) { + _E("Failed to allocate media vision data"); + return -1; + } + memset(mv_data, 0, sizeof(struct __mv_data)); + + ret = mv_create_engine_config(&engine_cfg); + if (ret) { + _E("failed to subsmv_create_engine_configs() - %s", __mv_err_to_str(ret)); + goto ERROR; + } + + mv_engine_config_set_int_attribute(engine_cfg, MV_SURVEILLANCE_MOVEMENT_DETECTION_THRESHOLD, 50); /* 10 is default value [0 ~ 255] */ + + ret = mv_surveillance_event_trigger_create(MV_SURVEILLANCE_EVENT_TYPE_MOVEMENT_DETECTED, &mv_data->mv_trigger_handle); + if (ret) { + _E("failed to mv_surveillance_event_trigger_create - [%s]", __mv_err_to_str(ret)); + goto ERROR; + } + + ret = mv_surveillance_subscribe_event_trigger(mv_data->mv_trigger_handle, VIDEO_STREAM_ID, engine_cfg, __movement_detected_event_cb, mv_data); + + if (ret) { + _E("failed to subscribe %s - %s", MV_SURVEILLANCE_EVENT_TYPE_MOVEMENT_DETECTED, __mv_err_to_str(ret)); + goto ERROR; + } + + if (engine_cfg) + mv_destroy_engine_config(engine_cfg); + + mv_data->movement_detected_cb = movement_detected_cb; + mv_data->movement_detected_cb_data = user_data; + + return 0; + +ERROR: + if (engine_cfg) + mv_destroy_engine_config(engine_cfg); + + if (mv_data->mv_trigger_handle) + mv_surveillance_event_trigger_destroy(mv_data->mv_trigger_handle); + + free(mv_data); + mv_data = NULL; + + return -1; +} + +void controller_mv_unset_movement_detection_event_cb(void) +{ + if (mv_data == NULL) + return; + + if (mv_data->mv_trigger_handle) + mv_surveillance_event_trigger_destroy(mv_data->mv_trigger_handle); + + free(mv_data); + mv_data = NULL; +} diff --git a/src/exif.c b/src/exif.c new file mode 100644 index 0000000..c4ce134 --- /dev/null +++ b/src/exif.c @@ -0,0 +1,305 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "log.h" + +#define ASCII_COMMENT_HEADER "ASCII\0\0\0" +// #define CHECK_EXIF_BEFOR_CREATE + +static int check_exif_from_data(const unsigned char *img, unsigned int size) +{ +#ifdef CHECK_EXIF_BEFOR_CREATE + ExifLoader *loader = NULL; + unsigned char ret = 0; + const unsigned char *buf = NULL; + unsigned int b_size = 0; + + retv_if(!img, -1); + retv_if(size == 0, -1); + + loader = exif_loader_new(); + retv_if(!loader, -1); + + ret = exif_loader_write(loader, img, size); + if (ret) { + _E("failed to loader write"); + exif_loader_unref(loader); + return -1; + } + + exif_loader_get_buf(loader, &buf, &b_size); + if (buf) { + _E("image has already exif data [%u]", b_size); + exif_loader_unref(loader); + return -1; + } + + exif_loader_unref(loader); +#endif /* CHECK_EXIF_BEFOR_CREATE */ + + return 0; +} + +static ExifEntry * +add_tag_by_init(ExifData *exif, ExifIfd ifd, ExifTag tag) +{ + ExifEntry *entry = NULL; + + retv_if(!exif, NULL); + + entry = exif_content_get_entry(exif->ifd[ifd], tag); + if (!entry) { + entry = exif_entry_new(); + retv_if(!entry, NULL); + + exif_entry_initialize(entry, tag); + + entry->tag = tag; + exif_content_add_entry(exif->ifd[ifd], entry); + + exif_entry_unref(entry); + } + return entry; +} + +static ExifEntry * +add_tag_by_malloc(ExifData *exif, ExifIfd ifd, ExifTag tag, unsigned int size) +{ + ExifEntry *entry = NULL; + void *buffer = NULL; + ExifMem *mem = NULL; + + retv_if(!exif, NULL); + retv_if(size == 0, NULL); + + mem = exif_mem_new_default(); + retv_if(!mem, NULL); + + entry = exif_entry_new_mem(mem); + if (!entry) { + _E("failed to exif_entry_new_mem()"); + exif_mem_unref(mem); + return NULL; + } + + buffer = exif_mem_alloc(mem, size); + if (!buffer) { + _E("failed to exif_mem_alloc()"); + exif_mem_unref(mem); + exif_entry_unref(entry); + return NULL; + } + + entry->data = buffer; + entry->size = size; + entry->tag = tag; + entry->components = size; + entry->format = EXIF_FORMAT_UNDEFINED; + exif_content_add_entry (exif->ifd[ifd], entry); + + exif_mem_unref(mem); + exif_entry_unref(entry); + + return entry; +} + +static ExifEntry * +add_tag_user_comment(ExifData *exif, const char *comment, unsigned int length) +{ + ExifEntry *entry = NULL; + size_t header_size = 0; + + retv_if(!exif, NULL); + retv_if(!comment, NULL); + retv_if(length == 0, NULL); + + header_size = sizeof(ASCII_COMMENT_HEADER) -1; + + entry = add_tag_by_malloc(exif, EXIF_IFD_EXIF, EXIF_TAG_USER_COMMENT, + header_size + length); + + retv_if(!entry, NULL); + + memcpy(entry->data, ASCII_COMMENT_HEADER, header_size); + memcpy(entry->data + header_size, comment, length); + + return entry; +} + +static int +create_exif_data(const unsigned char *jpg_data, unsigned int jpg_size, + unsigned int jpg_width, unsigned int jpg_height, + const char *user_comment, unsigned int comment_len, + unsigned char **exif_data, unsigned int *exif_size) +{ + + unsigned char *data; + unsigned int data_len; + ExifEntry *ee = NULL; + ExifData *exif = NULL; + + retv_if(!jpg_data, -1); + retv_if(!exif_data, -1); + retv_if(!exif_size, -1); + + if (check_exif_from_data(jpg_data, jpg_size)) + return -1; + + exif = exif_data_new(); + retv_if(!exif, -1); + + exif_data_set_option(exif, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION); + exif_data_set_data_type(exif, EXIF_DATA_TYPE_COMPRESSED); + exif_data_set_byte_order(exif, EXIF_BYTE_ORDER_INTEL); + + exif_data_fix(exif); + + ee = add_tag_by_init(exif, EXIF_IFD_EXIF, EXIF_TAG_PIXEL_X_DIMENSION); + exif_set_long(ee->data, EXIF_BYTE_ORDER_INTEL, jpg_width); + + ee = add_tag_by_init(exif, EXIF_IFD_EXIF, EXIF_TAG_PIXEL_Y_DIMENSION); + exif_set_long(ee->data, EXIF_BYTE_ORDER_INTEL, jpg_height); + + ee = add_tag_user_comment(exif, user_comment, comment_len); + + exif_data_save_data(exif, &data, &data_len); + if (!data) { + _E("failed to get exif data"); + exif_data_unref(exif); + return -1; + } + exif_data_unref(exif); + + *exif_data = data; + *exif_size = data_len; + + return 0; +} + +static int +save_jpeg_file(const char *output_file, + const unsigned char *jpg_data, unsigned int jpg_size) +{ + FILE *fp = NULL; + retv_if(!output_file, -1); + retv_if(!jpg_data, -1); + retv_if(jpg_size <= 2, -1); + + fp = fopen(output_file, "wb"); + retv_if(!fp, -1); + + if (1 != fwrite(jpg_data, jpg_size, 1, fp)) { + _E("failed to write jpg data"); + fclose(fp); + return -1; + } + + fflush(fp); + fclose(fp); + + _D("file saved [%s]", output_file); + + return 0; +} + +static int +save_jpeg_file_with_exif(const char *output_file, + const unsigned char *jpg_data, unsigned int jpg_size, + unsigned char *exif_data, unsigned int exif_size) +{ + FILE *fp = NULL; + const unsigned char exif_header[] = { 0xff, 0xd8, 0xff, 0xe1 }; // FFD8 -SOI Maker, FFE1 - APP1 Maker + const unsigned short exif_header_length = 4; + const unsigned short jpg_offset = 2; // SOI maker offset + unsigned short exif_length = 0; + + ((unsigned char *)&exif_length)[0] = (exif_size + 2) >> 8; + ((unsigned char *)&exif_length)[1] = (exif_size + 2) & 0x00ff; + + retv_if(!output_file, -1); + retv_if(!jpg_data, -1); + retv_if(!exif_data, -1); + retv_if(jpg_size <= 2, -1); + retv_if(exif_size == 0, -1); + + fp = fopen(output_file, "wb"); + retv_if(!fp, -1); + + if (1 != fwrite(exif_header, exif_header_length, 1, fp)) { + _E("failed to write exif header"); + goto ERROR; + } + + if (1 != fwrite(&exif_length, sizeof(exif_length), 1, fp)) { + _E("failed to write exif legth"); + goto ERROR; + } + + if (1 != fwrite(exif_data, exif_size, 1, fp)) { + _E("failed to write exif"); + goto ERROR; + } + + if (1 != fwrite(jpg_data + jpg_offset, jpg_size - jpg_offset, 1, fp)) { + _E("failed to write jpg data"); + goto ERROR; + } + + fflush(fp); + fclose(fp); + + return 0; +ERROR: + fclose(fp); + unlink(output_file); + _E(" failed to save file - [%s]", output_file); + return -1; +} + +int exif_write_jpg_file_with_comment(const char *output_file, + const unsigned char *jpg_data, unsigned int jpg_size, + unsigned int jpg_width, unsigned int jpg_height, + const char *comment, unsigned int comment_len) +{ + int ret = 0; + unsigned char *exif_data = NULL; + unsigned int exif_size = 0; + + if (!comment || (comment_len == 0)) { + _W("There is no comment"); + return save_jpeg_file(output_file, jpg_data, jpg_size); + } + + ret = create_exif_data(jpg_data, jpg_size, jpg_width, jpg_height, + comment, comment_len, &exif_data, &exif_size); + if (ret) { + _E("failed to create_exif_data(), save jpg data only"); + return save_jpeg_file(output_file, jpg_data, jpg_size); + } + + ret = save_jpeg_file_with_exif( + output_file, jpg_data, jpg_size, exif_data, exif_size); + + free(exif_data); + return ret; +} diff --git a/src/motion.c b/src/motion.c new file mode 100644 index 0000000..33e028d --- /dev/null +++ b/src/motion.c @@ -0,0 +1,184 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include "log.h" +#include "motion.h" + +#define IDLE_PRIORITY (G_PRIORITY_HIGH_IDLE + 30) + +struct motion_data_s { + int state; + GHashTable *callback_hash; +}; + +struct motion_callback_s { + motion_state_changed_cb callback; + void *cb_data; +}; + +struct motion_pass_data_s { + char *pass_key; + int state; +}; + +static struct motion_data_s *g_motion; +static pthread_mutex_t g_motion_mutex; + +static int __free_motion_handle(struct motion_data_s *handle) +{ + if (handle->callback_hash) { + g_hash_table_destroy(handle->callback_hash); + g_hash_table_unref(handle->callback_hash); + } + + free(handle); + return 0; +} + +int motion_initialize(void) +{ + if (g_motion) { + _D("The motion is already initialized!"); + return 0; + } + + g_motion = malloc(sizeof(struct motion_data_s)); + retv_if(!g_motion, -1); + + g_motion->callback_hash = + g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + + pthread_mutex_init(&g_motion_mutex, NULL); + g_motion->state = 0; + + /* TODO : initialize real motion detector here */ + + return 0; +} + +int motion_finalize(void) +{ + if (g_motion) { + pthread_mutex_destroy(&g_motion_mutex); + __free_motion_handle(g_motion); + g_motion = NULL; + } + + return 0; +} + +static void __cb_item_foreach(gpointer key, gpointer value, gpointer user_data) +{ + char *item_name = key; + struct motion_callback_s *cb_item = value; + struct motion_pass_data_s *pass_item = user_data; + + ret_if(!item_name); + ret_if(!cb_item); + ret_if(!pass_item); + + + if (pass_item->pass_key && + (0 == g_strcmp0(item_name, pass_item->pass_key))) { + // _D("pass item - %s", item_name); + return; + } + + _D("callback called for [%s]", item_name); + cb_item->callback(pass_item->state, cb_item->cb_data); +} + +static gboolean __call_cb_idle(gpointer data) +{ + struct motion_pass_data_s *pass_item = data; + + g_hash_table_foreach(g_motion->callback_hash, __cb_item_foreach, pass_item); + g_free(pass_item->pass_key); + g_free(pass_item); + + return G_SOURCE_REMOVE; +} + +int motion_state_set(int state, const char *pass_key) +{ + int old_state = 0; + retv_if(!g_motion, -1); + + // _D("set state : %d", state); + + pthread_mutex_lock(&g_motion_mutex); + old_state = g_motion->state; + pthread_mutex_unlock(&g_motion_mutex); + + if (old_state != state) { + /* TODO : handle real motion detector here */ + pthread_mutex_lock(&g_motion_mutex); + g_motion->state = state; + pthread_mutex_unlock(&g_motion_mutex); + + if (g_hash_table_size(g_motion->callback_hash) > 0) { + struct motion_pass_data_s *pass_item = NULL; + + pass_item = g_new(struct motion_pass_data_s, 1); + pass_item->pass_key = g_strdup(pass_key); + pass_item->state = state; + g_idle_add_full(IDLE_PRIORITY, + __call_cb_idle, pass_item, NULL); + } + } + return 0; +} + +int motion_state_get(int *state) +{ + retv_if(!g_motion, -1); + retv_if(!state, -1); + + pthread_mutex_lock(&g_motion_mutex); + *state = g_motion->state; + pthread_mutex_unlock(&g_motion_mutex); + + // _D("get state : %d", *state); + + return 0; +} + +int motion_state_changed_cb_set( + const char *callback_key, motion_state_changed_cb callback, void *cb_data) +{ + retv_if(!g_motion, -1); + retv_if(!g_motion->callback_hash, -1); + retv_if(!callback_key, -1); + + if (callback) { + struct motion_callback_s *cb_item = NULL; + cb_item = g_try_new(struct motion_callback_s, 1); + retv_if(!cb_item, -1); + + cb_item->callback = callback; + cb_item->cb_data = cb_data; + + g_hash_table_insert(g_motion->callback_hash, + g_strdup(callback_key), cb_item); + } else { + g_hash_table_remove(g_motion->callback_hash, callback_key); + } + + return 0; +} diff --git a/src/resource_camera.c b/src/resource_camera.c new file mode 100644 index 0000000..c76ccbb --- /dev/null +++ b/src/resource_camera.c @@ -0,0 +1,488 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#ifdef DEBUG_THREAD +#include +#endif + +#include "log.h" +#include "controller.h" +#include "resource_camera.h" + +struct __camera_data { + camera_h cam_handle; + + void *captured_file; + unsigned int image_size; + + preview_image_buffer_created_cb preview_image_buffer_created_cb; + void *preview_image_buffer_created_cb_data; + + capture_completed_cb capture_completed_cb; + void *capture_completed_cb_data; + + bool is_af_enabled; +}; + +static struct __camera_data *g_camera_data = NULL; + +static const char * __cam_err_to_str(camera_error_e err) +{ + const char *err_str; + + switch (err) { + case CAMERA_ERROR_NONE: + err_str = "CAMERA_ERROR_NONE"; + break; + case CAMERA_ERROR_INVALID_PARAMETER: + err_str = "CAMERA_ERROR_INVALID_PARAMETER"; + break; + case CAMERA_ERROR_INVALID_STATE: + err_str = "CAMERA_ERROR_INVALID_STATE"; + break; + case CAMERA_ERROR_OUT_OF_MEMORY: + err_str = "CAMERA_ERROR_OUT_OF_MEMORY"; + break; + case CAMERA_ERROR_DEVICE: + err_str = "CAMERA_ERROR_DEVICE"; + break; + case CAMERA_ERROR_INVALID_OPERATION: + err_str = "CAMERA_ERROR_INVALID_OPERATION"; + break; + case CAMERA_ERROR_SECURITY_RESTRICTED: + err_str = "CAMERA_ERROR_SECURITY_RESTRICTED"; + break; + case CAMERA_ERROR_DEVICE_BUSY: + err_str = "CAMERA_ERROR_DEVICE_BUSY"; + break; + case CAMERA_ERROR_DEVICE_NOT_FOUND: + err_str = "CAMERA_ERROR_DEVICE_NOT_FOUND"; + break; + case CAMERA_ERROR_ESD: + err_str = "CAMERA_ERROR_ESD"; + break; + case CAMERA_ERROR_PERMISSION_DENIED: + err_str = "CAMERA_ERROR_PERMISSION_DENIED"; + break; + case CAMERA_ERROR_NOT_SUPPORTED: + err_str = "CAMERA_ERROR_NOT_SUPPORTED"; + break; + case CAMERA_ERROR_RESOURCE_CONFLICT: + err_str = "CAMERA_ERROR_RESOURCE_CONFLICT"; + break; + case CAMERA_ERROR_SERVICE_DISCONNECTED: + err_str = "CAMERA_ERROR_SERVICE_DISCONNECTED"; + break; + default: + err_str = "Unknown"; + break; + } + return err_str; +} + +#ifdef DEBUG_THREAD +static void __print_thread_id(char *msg) +{ + pthread_t id; + id = pthread_self(); + _D("[%s] tid %u", msg, (unsigned int)id); +} +#endif + +static void __print_camera_state(camera_state_e previous, camera_state_e current, bool by_policy, void *user_data) +{ + switch (current) { + case CAMERA_STATE_CREATED: + _D("Camera state: CAMERA_STATE_CREATED"); + break; + + case CAMERA_STATE_PREVIEW: + _D("Camera state: CAMERA_STATE_PREVIEW"); + break; + + case CAMERA_STATE_CAPTURING: + _D("Camera state: CAMERA_STATE_CAPTURING"); + break; + + case CAMERA_STATE_CAPTURED: + _D("Camera state: CAMERA_STATE_CAPTURED"); + break; + + default: + _D("Camera state: CAMERA_STATE_NONE"); + break; + } +} + +static long long int __get_monotonic_ms(void) +{ + long long int ret_time = 0; + struct timespec time_s; + + if (0 == clock_gettime(CLOCK_MONOTONIC, &time_s)) + ret_time = time_s.tv_sec* 1000 + time_s.tv_nsec / 1000000; + else + _E("Failed to get time"); + + return ret_time; +} + +static image_buffer_data_s *__make_preview_image_buffer_data(camera_preview_data_s *frame) +{ + unsigned char *buffer = NULL; + unsigned int buffer_size = 0; + + image_buffer_data_s *image_buffer = malloc(sizeof(image_buffer_data_s)); + if (image_buffer == NULL) { + _E("Failed to allocate image buffer data"); + goto ERROR; + } + + switch (frame->num_of_planes) { + case 1: + buffer_size = frame->data.single_plane.size; + buffer = malloc(buffer_size); + if (!buffer) { + _E("failed to malloc buffer"); + goto ERROR; + } + memcpy(buffer, frame->data.single_plane.yuv, buffer_size); + break; + case 2: + { + unsigned char *buffer2 = NULL; + buffer_size = + frame->data.double_plane.y_size + frame->data.double_plane.uv_size; + buffer = malloc(buffer_size); + if (!buffer) { + _E("failed to malloc buffer"); + goto ERROR; + } + buffer2 = buffer + frame->data.double_plane.y_size; + memcpy(buffer, + frame->data.double_plane.y, frame->data.double_plane.y_size); + memcpy(buffer2, + frame->data.double_plane.uv, frame->data.double_plane.uv_size); + } + break; + case 3: + { + unsigned char *buffer2 = NULL; + unsigned char *buffer3 = NULL; + buffer_size = frame->data.triple_plane.y_size + + frame->data.triple_plane.u_size + + frame->data.triple_plane.v_size; + buffer = malloc(buffer_size); + if (!buffer) { + _E("failed to malloc buffer"); + goto ERROR; + } + buffer2 = buffer + frame->data.triple_plane.y_size; + buffer3 = buffer2 + frame->data.triple_plane.u_size; + memcpy(buffer, + frame->data.triple_plane.y, frame->data.triple_plane.y_size); + memcpy(buffer2, + frame->data.triple_plane.u, frame->data.triple_plane.u_size); + memcpy(buffer3, + frame->data.triple_plane.v, frame->data.triple_plane.v_size); + } + break; + default: + _E("unhandled num of planes : %d", frame->num_of_planes); + goto ERROR; + break; + } + + image_buffer->image_width = frame->width; + image_buffer->image_height = frame->height; + image_buffer->buffer_size = buffer_size; + image_buffer->buffer = buffer; + image_buffer->format = frame->format; + + return image_buffer; + +ERROR: + free(buffer); + free(image_buffer); + + return NULL; +} + +static bool __camera_attr_supported_af_mode_cb(camera_attr_af_mode_e mode, void *user_data) +{ + struct __camera_data *camera_data = user_data; + + _I("Auto-Focus Mode [%d]", mode); + + if (mode != CAMERA_ATTR_AF_NONE) + camera_data->is_af_enabled = true; + + return true; +} + +static void __capturing_cb(camera_image_data_s *image, camera_image_data_s *postview, camera_image_data_s *thumbnail, void *user_data) +{ + struct __camera_data *camera_data = user_data; + if (image == NULL) { + _E("Image is NULL"); + return; + } + + free(camera_data->captured_file); + camera_data->captured_file = malloc(image->size); + if (camera_data->captured_file == NULL) + return; + + _D("Now is on Capturing: Image size[%d x %d]", image->width, image->height); + + memcpy(camera_data->captured_file, image->data, image->size); + camera_data->image_size = image->size; + + return; +} + +static void __completed_cb(void *user_data) +{ + int ret = 0; + struct __camera_data *camera_data = user_data; + + _D("Capture is completed"); + + if (camera_data->capture_completed_cb) + camera_data->capture_completed_cb(camera_data->captured_file, camera_data->image_size, camera_data->capture_completed_cb_data); + + camera_data->capture_completed_cb = NULL; + free(camera_data->captured_file); + camera_data->captured_file = NULL; + + if (!camera_data->cam_handle) { + _E("Camera is NULL"); + return; + } + + ret = camera_start_preview(camera_data->cam_handle); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to start preview [%s]", __cam_err_to_str(ret)); + return; + } + + return; +} + +static void __start_capture(void *user_data) +{ + int ret = 0; + struct __camera_data *camera_data = user_data; + + ret = camera_start_capture(camera_data->cam_handle, __capturing_cb, __completed_cb, camera_data); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to start capturing [%s]", __cam_err_to_str(ret)); + return; + } +} + +static void __camera_preview_cb(camera_preview_data_s *frame, void *user_data) +{ + struct __camera_data *camera_data = user_data; + static long long int last = 0; + long long int now = __get_monotonic_ms(); + + if (now - last < CAMERA_PREVIEW_INTERVAL_MIN) + return; + + // _D("###Time Ellapse [%lld], [%lld], [%lld]", last, now, now - last); + +#ifdef DEBUG_THREAD + __print_thread_id("PREVIEW"); +#endif + + image_buffer_data_s *image_buffer_data = __make_preview_image_buffer_data(frame); + if (image_buffer_data == NULL) { + _E("Failed to create mv source"); + return; + } + image_buffer_data->user_data = camera_data->preview_image_buffer_created_cb_data; + + ecore_main_loop_thread_safe_call_async(camera_data->preview_image_buffer_created_cb, image_buffer_data); + last = now; +} + +int resource_camera_init(preview_image_buffer_created_cb preview_image_buffer_created_cb, void *user_data) +{ + int ret = CAMERA_ERROR_NONE; + + if (preview_image_buffer_created_cb == NULL) + return -1; + + g_camera_data = malloc(sizeof(struct __camera_data)); + if (g_camera_data == NULL) { + _E("Failed to allocate Camera data"); + return -1; + } + memset(g_camera_data, 0, sizeof(struct __camera_data)); + + ret = camera_create(CAMERA_DEVICE_CAMERA0, &(g_camera_data->cam_handle)); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to create camera [%s]", __cam_err_to_str(ret)); + goto ERROR; + } + + ret = camera_attr_set_image_quality(g_camera_data->cam_handle, CAMERA_IMAGE_QUALITY); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to set image quality [%s]", __cam_err_to_str(ret)); + goto ERROR; + } + + ret = camera_set_preview_resolution(g_camera_data->cam_handle, IMAGE_WIDTH, IMAGE_HEIGHT); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to set preview resolution [%s]", __cam_err_to_str(ret)); + goto ERROR; + } + + ret = camera_set_capture_resolution(g_camera_data->cam_handle, IMAGE_WIDTH, IMAGE_HEIGHT); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to set capture resolution [%s]", __cam_err_to_str(ret)); + goto ERROR; + } + + ret = camera_set_capture_format(g_camera_data->cam_handle, CAMERA_PIXEL_FORMAT_JPEG); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to set capture format [%s]", __cam_err_to_str(ret)); + goto ERROR; + } + + ret = camera_set_state_changed_cb(g_camera_data->cam_handle, __print_camera_state, NULL); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to set state changed callback [%s]", __cam_err_to_str(ret)); + goto ERROR; + } + + ret = camera_set_preview_cb(g_camera_data->cam_handle, __camera_preview_cb, g_camera_data); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to set preview callback [%s]", __cam_err_to_str(ret)); + goto ERROR; + } + + ret = camera_attr_foreach_supported_af_mode(g_camera_data->cam_handle, __camera_attr_supported_af_mode_cb, g_camera_data); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to set auto focus attribute check callback [%s]", __cam_err_to_str(ret)); + goto ERROR; + } + + g_camera_data->preview_image_buffer_created_cb = preview_image_buffer_created_cb; + g_camera_data->preview_image_buffer_created_cb_data = user_data; + + return 0; + +ERROR: + if (g_camera_data->cam_handle) + camera_destroy(g_camera_data->cam_handle); + + free(g_camera_data); + g_camera_data = NULL; + return -1; +} + +int resource_camera_start_preview(void) +{ + camera_state_e state; + int ret = CAMERA_ERROR_NONE; + + if (g_camera_data == NULL) { + _I("Camera is not initialized"); + return -1; + } + + ret = camera_get_state(g_camera_data->cam_handle, &state); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to get camera state [%s]", __cam_err_to_str(ret)); + return -1; + } + + if (state == CAMERA_STATE_CAPTURING) { + _D("Camera is now capturing"); + return -1; + } + + if (state != CAMERA_STATE_PREVIEW) { + ret = camera_start_preview(g_camera_data->cam_handle); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to start preview [%s]", __cam_err_to_str(ret)); + return -1; + } + } + + return 0; +} + +int resource_camera_capture(capture_completed_cb capture_completed_cb, void *user_data) +{ + camera_state_e state; + int ret = CAMERA_ERROR_NONE; + + if (g_camera_data == NULL) { + _I("Camera is not initialized"); + return -1; + } + + ret = camera_get_state(g_camera_data->cam_handle, &state); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to get camera state [%s]", __cam_err_to_str(ret)); + return -1; + } + + if (state == CAMERA_STATE_CAPTURING) { + _D("Camera is now capturing"); + return -1; + } + + if (state != CAMERA_STATE_PREVIEW) { + _I("Preview is not started [%d]", state); + ret = camera_start_preview(g_camera_data->cam_handle); + if (ret != CAMERA_ERROR_NONE) { + _E("Failed to start preview [%s]", __cam_err_to_str(ret)); + return -1; + } + } + + __start_capture(g_camera_data); + + g_camera_data->capture_completed_cb = capture_completed_cb; + g_camera_data->capture_completed_cb_data = user_data; + + return 0; +} + +void resource_camera_close(void) +{ + if (g_camera_data == NULL) + return; + + camera_unset_preview_cb(g_camera_data->cam_handle); + camera_stop_preview(g_camera_data->cam_handle); + + camera_destroy(g_camera_data->cam_handle); + g_camera_data->cam_handle = NULL; + + free(g_camera_data->captured_file); + g_camera_data->captured_file = NULL; + + free(g_camera_data); + g_camera_data = NULL; +} diff --git a/src/resource_servo_motor_sg90.c b/src/resource_servo_motor_sg90.c new file mode 100644 index 0000000..d30cce4 --- /dev/null +++ b/src/resource_servo_motor_sg90.c @@ -0,0 +1,166 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include "log.h" + +#define ENABLE_SERVO_TIMEOUT + +/* This value is only for Servo Motor - SG90 */ +#define SERVO_MOTOR_DEFAULT_PERIOD 20.0 +#define SERVO_MOTOR_DUTY_CYCLE_COUNTER_CLOCKWISE 0.9 +#define SERVO_MOTOR_DUTY_CYCLE_CLOCKWISE 2.4 + +#ifdef ENABLE_SERVO_TIMEOUT +#define SERVO_TIMEOUT_INTERVAL 150 +#endif /* ENABLE_SERVO_TIMEOUT */ + +/* This APIs are only made for Eagleye530s */ +/* There are 2 pins for PWM */ +static peripheral_pwm_h g_pwm0_h; +static peripheral_pwm_h g_pwm2_h; + +#ifdef ENABLE_SERVO_TIMEOUT +static guint g_timer_id0; +static guint g_timer_id2; + +static gboolean __timeout_cb(void *data) +{ + int channel = GPOINTER_TO_INT(data); + + _D("pwm channel[%d] disable", channel); + if (channel == 0 && g_pwm0_h) { + peripheral_pwm_set_enabled(g_pwm0_h, false); + g_timer_id0 = 0; + } else if (channel == 2 && g_pwm2_h) { + peripheral_pwm_set_enabled(g_pwm2_h, false); + g_timer_id2 = 0; + } + return FALSE; +} + +static void __remove_timeout_cb(int channel) +{ + if (channel == 0) { + if (g_timer_id0) { + g_source_remove(g_timer_id0); + g_timer_id0 = 0; + } + } else if (channel == 2) { + if (g_timer_id2) { + g_source_remove(g_timer_id0); + g_timer_id2 = 0; + } + } +} + +static void __add_timeout_cb(int channel) +{ + if (channel == 0) { + g_timer_id0 = g_timeout_add(SERVO_TIMEOUT_INTERVAL, + __timeout_cb, GINT_TO_POINTER(channel)); + } else if (channel == 2) { + g_timer_id2 = g_timeout_add(SERVO_TIMEOUT_INTERVAL, + __timeout_cb, GINT_TO_POINTER(channel)); + } +} +#endif /* ENABLE_SERVO_TIMEOUT */ + +void resource_close_servo_motor(int channel) +{ +#ifdef ENABLE_SERVO_TIMEOUT + __remove_timeout_cb(channel); +#endif /* ENABLE_SERVO_TIMEOUT */ + + if (channel == 0 && g_pwm0_h) { + peripheral_pwm_close(g_pwm0_h); + g_pwm0_h = NULL; + } else if (channel == 2 && g_pwm2_h) { + peripheral_pwm_close(g_pwm2_h); + g_pwm2_h = NULL; + } +} + +int resource_set_servo_motor_sg90_value(int channel, double duty_cycle_ms) +{ + int ret = 0; + peripheral_pwm_h *pwm_h = NULL; + + if (duty_cycle_ms >= SERVO_MOTOR_DEFAULT_PERIOD) { + _E("Too large duty cycle"); + return -1; + } + +#ifdef ENABLE_SERVO_TIMEOUT + __remove_timeout_cb(channel); +#endif /* ENABLE_SERVO_TIMEOUT */ + + if (channel == 0) { + pwm_h = &g_pwm0_h; + } else if (channel == 2) { + pwm_h = &g_pwm2_h; + } else { + _E("unsupported channel - %d", channel); + return -1; + } + + if (!*pwm_h) { + ret = peripheral_pwm_open(0, channel, pwm_h); + if (ret != PERIPHERAL_ERROR_NONE) { + _E("failed to open servo motor with channel(%d) : %s", channel, get_error_message(ret)); + return -1; + } + } + + ret = peripheral_pwm_set_period(*pwm_h, SERVO_MOTOR_DEFAULT_PERIOD * 1000 * 1000); + if (ret != PERIPHERAL_ERROR_NONE) { + _E("failed to set period : %s", get_error_message(ret)); + return -1; + } + + ret = peripheral_pwm_set_duty_cycle(*pwm_h, duty_cycle_ms * 1000 * 1000); + if (ret != PERIPHERAL_ERROR_NONE) { + _E("failed to set duty cycle : %s", get_error_message(ret)); + return -1; + } + + ret = peripheral_pwm_set_enabled(*pwm_h, true); + if (ret != PERIPHERAL_ERROR_NONE) { + _E("failed to enable : %s", get_error_message(ret)); + return -1; + } + +#ifdef ENABLE_SERVO_TIMEOUT + __add_timeout_cb(channel); +#endif /* ENABLE_SERVO_TIMEOUT */ + + return 0; +} + +int resource_rotate_servo_motor_by_percent(int channel, double percent) +{ + int ret = 0; + double duty_cycle = 0.0f; + + duty_cycle = ((SERVO_MOTOR_DUTY_CYCLE_CLOCKWISE - SERVO_MOTOR_DUTY_CYCLE_COUNTER_CLOCKWISE) + * (percent / 100.0)) + + SERVO_MOTOR_DUTY_CYCLE_COUNTER_CLOCKWISE; + + ret = resource_set_servo_motor_sg90_value(channel, duty_cycle); + + return ret; +} diff --git a/src/servo-h.c b/src/servo-h.c new file mode 100644 index 0000000..77c9434 --- /dev/null +++ b/src/servo-h.c @@ -0,0 +1,205 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include +#include "log.h" +#include "servo-type.h" +#include "resource_servo_motor_sg90.h" + +#define IDLE_PRIORITY (G_PRIORITY_HIGH_IDLE + 30) +#define VALUE_DEFAULT (50.0f) +#define SERVO_H_CHANNEL 2 + +struct servo_h_data_s { + double value; + GHashTable *callback_hash; +}; + +struct servo_h_callback_s { + servo_state_changed_cb callback; + void *cb_data; +}; + +struct servo_h_pass_data_s { + char *pass_key; + double value; +}; + +static struct servo_h_data_s *g_servo_h; +static pthread_mutex_t g_servo_h_mutex; + +static int __free_servo_h_handle(struct servo_h_data_s *servo_h) +{ + if (servo_h->callback_hash) { + g_hash_table_destroy(servo_h->callback_hash); + g_hash_table_unref(servo_h->callback_hash); + } + + free(servo_h); + return 0; +} + +int servo_h_finalize(void) +{ + if (g_servo_h) { + resource_close_servo_motor(SERVO_H_CHANNEL); + pthread_mutex_destroy(&g_servo_h_mutex); + __free_servo_h_handle(g_servo_h); + g_servo_h = NULL; + } + return 0; +} + +int servo_h_initialize(void) +{ + if (g_servo_h) { + _D("The servo_h is already initialized!"); + return 0; + } + + g_servo_h = malloc(sizeof(struct servo_h_data_s)); + retv_if(!g_servo_h, -1); + + g_servo_h->callback_hash = + g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + + pthread_mutex_init(&g_servo_h_mutex, NULL); + g_servo_h->value = VALUE_DEFAULT; + + if (resource_rotate_servo_motor_by_percent(SERVO_H_CHANNEL, VALUE_DEFAULT)) { + _E("faiiled to set servo h value to 0"); + servo_h_finalize(); + return -1; + } + + return 0; +} + +static void __cb_item_foreach(gpointer key, gpointer value, gpointer user_data) +{ + char *item_name = key; + struct servo_h_callback_s *cb_item = value; + struct servo_h_pass_data_s *pass_item = user_data; + + ret_if(!item_name); + ret_if(!cb_item); + ret_if(!pass_item); + + + if (pass_item->pass_key && + (0 == g_strcmp0(item_name, pass_item->pass_key))) { + // _D("pass item - %s", item_name); + return; + } + + _D("callback called for [%s]", item_name); + cb_item->callback(pass_item->value, cb_item->cb_data); +} + +static gboolean __call_cb_idle(gpointer data) +{ + struct servo_h_pass_data_s *pass_item = data; + + g_hash_table_foreach(g_servo_h->callback_hash, __cb_item_foreach, pass_item); + g_free(pass_item->pass_key); + g_free(pass_item); + + return G_SOURCE_REMOVE; +} + +static inline int __double_is_same(double a, double b) +{ + const double eps = 0.0001; + if (fabs(a-b) < eps) + return 1; + else + return 0; +} + +int servo_h_state_set(double value, const char *pass_key) +{ + double old_value = 0.0; + retv_if(!g_servo_h, -1); + + pthread_mutex_lock(&g_servo_h_mutex); + old_value = g_servo_h->value; + pthread_mutex_unlock(&g_servo_h_mutex); + + if (!__double_is_same(old_value, value)) { + if (resource_rotate_servo_motor_by_percent(SERVO_H_CHANNEL, value)) { + _E("faiiled to set servo h value to [%lf]", value); + return -1; + } + _D("set value : %lf", value); + pthread_mutex_lock(&g_servo_h_mutex); + g_servo_h->value = value; + pthread_mutex_unlock(&g_servo_h_mutex); + + if (g_hash_table_size(g_servo_h->callback_hash) > 0) { + struct servo_h_pass_data_s *pass_item = NULL; + + pass_item = g_new(struct servo_h_pass_data_s, 1); + pass_item->pass_key = g_strdup(pass_key); + pass_item->value = value; + g_idle_add_full(IDLE_PRIORITY, + __call_cb_idle, pass_item, NULL); + } + } else { + _D("a value[%lf] is same as old one[%lf]" , value, old_value); + } + return 0; +} + +int servo_h_state_get(double *value) +{ + retv_if(!g_servo_h, -1); + retv_if(!value, -1); + + pthread_mutex_lock(&g_servo_h_mutex); + *value = g_servo_h->value; + pthread_mutex_unlock(&g_servo_h_mutex); + + _D("get value : %lf", *value); + + return 0; +} + +int servo_h_state_changed_cb_set( + const char *callback_key, servo_state_changed_cb callback, void *cb_data) +{ + retv_if(!g_servo_h, -1); + retv_if(!g_servo_h->callback_hash, -1); + retv_if(!callback_key, -1); + + if (callback) { + struct servo_h_callback_s *cb_item = NULL; + cb_item = g_try_new(struct servo_h_callback_s, 1); + retv_if(!cb_item, -1); + + cb_item->callback = callback; + cb_item->cb_data = cb_data; + + g_hash_table_insert(g_servo_h->callback_hash, + g_strdup(callback_key), cb_item); + } else { + g_hash_table_remove(g_servo_h->callback_hash, callback_key); + } + + return 0; +} diff --git a/src/servo-v.c b/src/servo-v.c new file mode 100644 index 0000000..e1cf675 --- /dev/null +++ b/src/servo-v.c @@ -0,0 +1,205 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include +#include "log.h" +#include "servo-type.h" +#include "resource_servo_motor_sg90.h" + +#define IDLE_PRIORITY (G_PRIORITY_HIGH_IDLE + 30) +#define VALUE_DEFAULT (50.0f) +#define SERVO_V_CHANNEL 0 + +struct servo_v_data_s { + double value; + GHashTable *callback_hash; +}; + +struct servo_v_callback_s { + servo_state_changed_cb callback; + void *cb_data; +}; + +struct servo_v_pass_data_s { + char *pass_key; + double value; +}; + +static struct servo_v_data_s *g_servo_v; +static pthread_mutex_t g_servo_v_mutex; + +static int __free_servo_v_handle(struct servo_v_data_s *servo_v) +{ + if (servo_v->callback_hash) { + g_hash_table_destroy(servo_v->callback_hash); + g_hash_table_unref(servo_v->callback_hash); + } + + free(servo_v); + return 0; +} + +int servo_v_finalize(void) +{ + if (g_servo_v) { + resource_close_servo_motor(SERVO_V_CHANNEL); + pthread_mutex_destroy(&g_servo_v_mutex); + __free_servo_v_handle(g_servo_v); + g_servo_v = NULL; + } + + return 0; +} + +int servo_v_initialize(void) +{ + if (g_servo_v) { + _D("The servo_v is already initialized!"); + return 0; + } + + g_servo_v = malloc(sizeof(struct servo_v_data_s)); + retv_if(!g_servo_v, -1); + + g_servo_v->callback_hash = + g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + + pthread_mutex_init(&g_servo_v_mutex, NULL); + g_servo_v->value = VALUE_DEFAULT; + + if (resource_rotate_servo_motor_by_percent(SERVO_V_CHANNEL, VALUE_DEFAULT)) { + _E("faiiled to set servo h value to 0"); + servo_v_finalize(); + return -1; + } + + return 0; +} + +static void __cb_item_foreach(gpointer key, gpointer value, gpointer user_data) +{ + char *item_name = key; + struct servo_v_callback_s *cb_item = value; + struct servo_v_pass_data_s *pass_item = user_data; + + ret_if(!item_name); + ret_if(!cb_item); + ret_if(!pass_item); + + if (pass_item->pass_key && + (0 == g_strcmp0(item_name, pass_item->pass_key))) { + // _D("pass item - %s", item_name); + return; + } + + _D("callback called for [%s]", item_name); + cb_item->callback(pass_item->value, cb_item->cb_data); +} + +static gboolean __call_cb_idle(gpointer data) +{ + struct servo_v_pass_data_s *pass_item = data; + + g_hash_table_foreach(g_servo_v->callback_hash, __cb_item_foreach, pass_item); + g_free(pass_item->pass_key); + g_free(pass_item); + + return G_SOURCE_REMOVE; +} + +static inline int __double_is_same(double a, double b) +{ + const double eps = 0.0001; + if (fabs(a-b) < eps) + return 1; + else + return 0; +} + +int servo_v_state_set(double value, const char *pass_key) +{ + double old_value = 0.0; + retv_if(!g_servo_v, -1); + + pthread_mutex_lock(&g_servo_v_mutex); + old_value = g_servo_v->value; + pthread_mutex_unlock(&g_servo_v_mutex); + + if (!__double_is_same(old_value, value)) { + if (resource_rotate_servo_motor_by_percent(SERVO_V_CHANNEL, value)) { + _E("faiiled to set servo v value to [%lf]", value); + return -1; + } + _D("set value : %lf", value); + pthread_mutex_lock(&g_servo_v_mutex); + g_servo_v->value = value; + pthread_mutex_unlock(&g_servo_v_mutex); + + if (g_hash_table_size(g_servo_v->callback_hash) > 0) { + struct servo_v_pass_data_s *pass_item = NULL; + + pass_item = g_new(struct servo_v_pass_data_s, 1); + pass_item->pass_key = g_strdup(pass_key); + pass_item->value = value; + g_idle_add_full(IDLE_PRIORITY, + __call_cb_idle, pass_item, NULL); + } + } else { + _D("a value[%lf] is same as old one[%lf]" , value, old_value); + } + return 0; +} + +int servo_v_state_get(double *value) +{ + retv_if(!g_servo_v, -1); + retv_if(!value, -1); + + pthread_mutex_lock(&g_servo_v_mutex); + *value = g_servo_v->value; + pthread_mutex_unlock(&g_servo_v_mutex); + + _D("get value : %lf", *value); + + return 0; +} + +int servo_v_state_changed_cb_set( + const char *callback_key, servo_state_changed_cb callback, void *cb_data) +{ + retv_if(!g_servo_v, -1); + retv_if(!g_servo_v->callback_hash, -1); + retv_if(!callback_key, -1); + + if (callback) { + struct servo_v_callback_s *cb_item = NULL; + cb_item = g_try_new(struct servo_v_callback_s, 1); + retv_if(!cb_item, -1); + + cb_item->callback = callback; + cb_item->cb_data = cb_data; + + g_hash_table_insert(g_servo_v->callback_hash, + g_strdup(callback_key), cb_item); + } else { + g_hash_table_remove(g_servo_v->callback_hash, callback_key); + } + + return 0; +} diff --git a/src/st_thing_master.c b/src/st_thing_master.c new file mode 100644 index 0000000..edb1fe4 --- /dev/null +++ b/src/st_thing_master.c @@ -0,0 +1,271 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include "log.h" + +/* You have to FIX IT !!! */ +#define CERT_FILE "cert_file_name.pem" // cert file name in 'res' directory +#define PRIV_FILE "private_key_file_name.der" // private key file name in 'res' directory + +static smartthings_h g_st_master_h; + +static void _user_confirm_cb(smartthings_h handle, void *user_data) +{ + if (smartthings_send_user_confirm(handle, true) != 0) + _E("smartthings_send_user_confirm() is failed"); +} + +static void _reset_confirm_cb(smartthings_h handle, void *user_data) +{ + if (smartthings_send_reset_confirm(handle, true) != 0) + _E("smartthings_send_reset_confirm() is failed"); +} + +static void _reset_result_cb(smartthings_h handle, bool result, void *user_data) +{ + _I("reset result = [%d]", result); +} + +static const char *thing_status_to_str(smartthings_status_e status) +{ + const char *status_str = NULL; + + switch (status) { + case SMARTTHINGS_STATUS_NOT_READY: + status_str = "SMARTTHINGS_STATUS_NOT_READY"; + break; + case SMARTTHINGS_STATUS_INIT: + status_str = "SMARTTHINGS_STATUS_INIT"; + break; + case SMARTTHINGS_STATUS_ES_STARTED: + status_str = "SMARTTHINGS_STATUS_ES_STARTED"; + break; + case SMARTTHINGS_STATUS_ES_DONE: + status_str = "SMARTTHINGS_STATUS_ES_DONE"; + break; + case SMARTTHINGS_STATUS_ES_FAILED_ON_OWNERSHIP_TRANSFER: + status_str = "SMARTTHINGS_STATUS_ES_FAILED_ON_OWNERSHIP_TRANSFER"; + break; + case SMARTTHINGS_STATUS_CONNECTING_TO_AP: + status_str = "SMARTTHINGS_STATUS_CONNECTING_TO_AP"; + break; + case SMARTTHINGS_STATUS_CONNECTED_TO_AP: + status_str = "SMARTTHINGS_STATUS_CONNECTED_TO_AP"; + break; + case SMARTTHINGS_STATUS_CONNECTING_TO_AP_FAILED: + status_str = "SMARTTHINGS_STATUS_CONNECTING_TO_AP_FAILED"; + break; + case SMARTTHINGS_STATUS_REGISTERING_TO_CLOUD: + status_str = "SMARTTHINGS_STATUS_REGISTERING_TO_CLOUD"; + break; + case SMARTTHINGS_STATUS_REGISTERED_TO_CLOUD: + status_str = "SMARTTHINGS_STATUS_REGISTERED_TO_CLOUD"; + break; + case SMARTTHINGS_STATUS_REGISTERING_FAILED_ON_SIGN_IN: + status_str = "SMARTTHINGS_STATUS_REGISTERING_FAILED_ON_SIGN_IN"; + break; + case SMARTTHINGS_STATUS_REGISTERING_FAILED_ON_PUB_RES: + status_str = "SMARTTHINGS_STATUS_REGISTERING_FAILED_ON_PUB_RES"; + break; + default: + status_str = "Unknown Status"; + break; + } + return status_str; +} + +static void +_thing_status_cb( + smartthings_h handle, smartthings_status_e status, void *user_data) +{ + _D("status: [%d] [%s]", status, thing_status_to_str(status)); +} + +static const char *__master_error_to_str(smartthings_error_e error) +{ + const char *err_str = NULL; + + switch (error) { + case SMARTTHINGS_ERROR_NONE: + err_str = "SMARTTHINGS_ERROR_NONE"; + break; + case SMARTTHINGS_ERROR_INVALID_PARAMETER: + err_str = "SMARTTHINGS_ERROR_INVALID_PARAMETER"; + break; + case SMARTTHINGS_ERROR_OUT_OF_MEMORY: + err_str = "SMARTTHINGS_ERROR_OUT_OF_MEMORY"; + break; + case SMARTTHINGS_ERROR_PERMISSION_DENIED: + err_str = "SMARTTHINGS_ERROR_PERMISSION_DENIED"; + break; + case SMARTTHINGS_ERROR_NO_DATA: + err_str = "SMARTTHINGS_ERROR_NO_DATA"; + break; + case SMARTTHINGS_ERROR_NOT_SUPPORTED: + err_str = "SMARTTHINGS_ERROR_NOT_SUPPORTED"; + break; + case SMARTTHINGS_ERROR_OPERATION_FAILED: + err_str = "SMARTTHINGS_ERROR_OPERATION_FAILED"; + break; + case SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE: + err_str = "SMARTTHINGS_ERROR_SERVICE_UNAVAILABLE"; + break; + default: + err_str = "Unknown error"; + break; + } + + return err_str; +} + +static void +_things_connection_status_cb(smartthings_error_e error, + smartthings_h handle, smartthings_connection_status_e status, + void *user_data) +{ + _D("result [%s], status = [%d]", __master_error_to_str(error), status); + + if (status == SMARTTHINGS_CONNECTION_STATUS_CONNECTED) { + int err = 0; + bool is_es_completed = false; + const char* dev_name = "iot-vision-cam"; + int wifi_mode = SMARTTHINGS_WIFI_MODE_11B + | SMARTTHINGS_WIFI_MODE_11G + | SMARTTHINGS_WIFI_MODE_11N; + + int wifi_freq = SMARTTHINGS_WIFI_FREQ_24G | SMARTTHINGS_WIFI_FREQ_5G; + + err = smartthings_set_device_property( + handle, dev_name, wifi_mode, wifi_freq); + if (err) { + _E("smartthings_initialize() is failed, [%s]", + __master_error_to_str(err)); + return; + } + + err = smartthings_set_certificate_file(handle, CERT_FILE, PRIV_FILE); + if (err) { + _E("smartthings_set_certificate_file() is failed, [%s]", + __master_error_to_str(err)); + return; + } + + err = smartthings_set_user_confirm_cb(handle, _user_confirm_cb, NULL); + if (err) { + _E("smartthings_set_user_confirm_cb() is failed, [%s]", + __master_error_to_str(err)); + return; + } + + err = smartthings_set_reset_confirm_cb(handle, _reset_confirm_cb, NULL); + if (err) { + _E("smartthings_set_reset_confirm_cb() is failed, [%s]", + __master_error_to_str(err)); + return; + } + + err = smartthings_set_reset_result_cb(handle, _reset_result_cb, NULL); + if (err) { + _E("smartthings_set_reset_confirm_cb() is failed, [%s]", + __master_error_to_str(err)); + return; + } + + err = smartthings_set_status_changed_cb(handle, _thing_status_cb, NULL); + if (err) { + _E("smartthings_set_status_changed_callback() is failed, [%s]", + __master_error_to_str(err)); + return; + } + + err = smartthings_start(handle); + if (err) { + _E("smartthings_start() is failed, [%s]", + __master_error_to_str(err)); + return; + } + + err = smartthings_get_easysetup_status(handle, &is_es_completed); + if (err) { + _E("smartthings_get_easysetup_status() is failed, [%s]", + __master_error_to_str(err)); + return; + } + + if (is_es_completed == true) { + _I("Easysetup is already done"); + return; + } + + err = smartthings_start_easysetup(handle); + if (err) { + _E("smartthings_start_easysetup() is failed, [%s]", + __master_error_to_str(err)); + smartthings_stop(handle); + return; + } + } else { + _E("connection failed"); + } + return; +} + +int st_thing_master_init() +{ + int err = 0; + smartthings_h st_handle = NULL; + + if (g_st_master_h) { + _I("Already initialized!"); + return 0; + } + + err = smartthings_initialize(&st_handle, _things_connection_status_cb, NULL); + if (err) { + _E("smartthings_initialize() is failed, [%s]", + __master_error_to_str(err)); + return -1; + } + + g_st_master_h = st_handle; + + return 0; +} + +int st_thing_master_fini() +{ + if (!g_st_master_h) { + _I("handle is already NULL"); + return 0; + } + + smartthings_unset_user_confirm_cb(g_st_master_h); + smartthings_unset_reset_confirm_cb(g_st_master_h); + smartthings_unset_reset_result_cb(g_st_master_h); + smartthings_unset_status_changed_cb(g_st_master_h); + + smartthings_stop_easysetup(g_st_master_h); + smartthings_stop(g_st_master_h); + + if (smartthings_deinitialize(g_st_master_h) != 0) { + _E("smartthings_deinitialize() is failed"); + return -1; + } + g_st_master_h = NULL; + + return 0; +} diff --git a/src/st_thing_resource.c b/src/st_thing_resource.c new file mode 100644 index 0000000..6dcb842 --- /dev/null +++ b/src/st_thing_resource.c @@ -0,0 +1,478 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include "log.h" +#include "switch.h" +#include "servo-h.h" +#include "servo-v.h" +#include "motion.h" + +// switch +#define URI_SWITCH "/capability/switch/main/0" +#define KEY_SWITCH "power" +#define VALUE_SWITCH_ON "on" +#define VALUE_SWITCH_OFF "off" + +// volume - servo v +#define URI_AUDIOVOLUME "/capability/audioVolume/main/0" +#define KEY_VOLUME "volume" +#define KEY_MUTE "mute" + +// dim switch - servo h +#define URI_SWITCHLEVEL "/capability/switchLevel/main/0" +#define KEY_SWITCHLEVEL "dimmingSetting" + +// motion +#define URI_MOTION "/capability/motionSensor/main/0" +#define KEY_MOTION "value" + +#define RESOURCE_CALLBACK_KEY "st_thing_resource" + +static smartthings_resource_h g_st_res_h; +static smartthings_resource_connection_status_e g_conn_status = + SMARTTHINGS_RESOURCE_CONNECTION_STATUS_DISCONNECTED; + + +static const char * +__resource_error_to_str(smartthings_resource_error_e error) +{ + const char *err_str = NULL; + + switch (error) { + case SMARTTHINGS_RESOURCE_ERROR_NONE: + err_str = "SMARTTHINGS_RESOURCE_ERROR_NONE"; + break; + case SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER: + err_str = "SMARTTHINGS_RESOURCE_ERROR_INVALID_PARAMETER"; + break; + case SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY: + err_str = "SMARTTHINGS_RESOURCE_ERROR_OUT_OF_MEMORY"; + break; + case SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED: + err_str = "SMARTTHINGS_RESOURCE_ERROR_PERMISSION_DENIED"; + break; + case SMARTTHINGS_RESOURCE_ERROR_NO_DATA: + err_str = "SMARTTHINGS_RESOURCE_ERROR_NO_DATA"; + break; + case SMARTTHINGS_RESOURCE_ERROR_NOT_SUPPORTED: + err_str = "SMARTTHINGS_RESOURCE_ERROR_NOT_SUPPORTED"; + break; + case SMARTTHINGS_RESOURCE_ERROR_OPERATION_FAILED: + err_str = "SMARTTHINGS_RESOURCE_ERROR_NOT_SUPPORTED"; + break; + case SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE: + err_str = "SMARTTHINGS_RESOURCE_ERROR_SERVICE_UNAVAILABLE"; + break; + default: + err_str = "Unknown error"; + break; + } + + return err_str; +} + +/* get and set request handlers */ +static bool +handle_get_motion(smartthings_payload_h resp_payload, void *user_data) +{ + int state = 0; + + motion_state_get(&state); + + _D("GET request for motion : %d", state); + smartthings_payload_set_bool(resp_payload, KEY_MOTION, state ? true : false); + + return true; +} + +static bool +handle_set_motion(smartthings_payload_h payload, + smartthings_payload_h resp_payload, void *user_data) +{ + bool bvalue = 0; + + if (smartthings_payload_get_bool(payload, KEY_MOTION, &bvalue) == 0) { + _D("requested volume: [%d]", bvalue); + motion_state_set((int)bvalue, RESOURCE_CALLBACK_KEY); + smartthings_payload_set_bool(resp_payload, KEY_MOTION, bvalue); + } + + return true; +} + +static bool +handle_get_switch(smartthings_payload_h resp_payload, void *user_data) +{ + switch_state_e state = SWITCH_STATE_OFF; + const char *switch_state_name = NULL; + + switch_state_get(&state); + + if (state == SWITCH_STATE_OFF) + switch_state_name = VALUE_SWITCH_OFF; + else + switch_state_name = VALUE_SWITCH_ON; + + _D("GET request for switch : %s", switch_state_name); + smartthings_payload_set_string(resp_payload, KEY_SWITCH, switch_state_name); + + return true; +} + +static bool +handle_set_switch(smartthings_payload_h payload, + smartthings_payload_h resp_payload, void *user_data) +{ + char *str_value = NULL; + switch_state_e state = SWITCH_STATE_OFF; + + if (smartthings_payload_get_string(payload, KEY_SWITCH, &str_value) != 0) { + _E("failed to smartthings_payload_get_string()"); + return false; + } + retv_if(!str_value, false); + + _D("SET request for switch: [%s]", str_value); + + if (0 == g_strcmp0(str_value, VALUE_SWITCH_ON)) + state = SWITCH_STATE_ON; + + switch_state_set(state, RESOURCE_CALLBACK_KEY); + + smartthings_payload_set_string(resp_payload, KEY_SWITCH, str_value); + free(str_value); + + return true; +} + +static bool +handle_get_audiovolume(smartthings_payload_h resp_payload, void *user_data) +{ + double value = 0.0f; + + servo_v_state_get(&value); + + _D("current volume: [%f]", value); + smartthings_payload_set_int(resp_payload, KEY_VOLUME, (int)value); + smartthings_payload_set_bool(resp_payload, KEY_MUTE, false); + + return true; +} + +static bool +handle_set_audiovolume(smartthings_payload_h payload, + smartthings_payload_h resp_payload, void *user_data) +{ + int ivalue = 0; + + if (smartthings_payload_get_int(payload, KEY_VOLUME, &ivalue) == 0) { + _D("requested volume: [%d]", ivalue); + servo_v_state_set((double)ivalue, RESOURCE_CALLBACK_KEY); + smartthings_payload_set_int(resp_payload, KEY_VOLUME, ivalue); + } + + smartthings_payload_set_bool(resp_payload, KEY_MUTE, false); + + return true; +} + +static bool +handle_get_switchLevel(smartthings_payload_h resp_payload, void *user_data) +{ + + double value = 0; + + servo_h_state_get(&value); + + _D("current switchLevel: [%f]", value); + smartthings_payload_set_int(resp_payload, KEY_SWITCHLEVEL, (int)value); + + return true; + +} + +static bool +handle_set_switchLevel(smartthings_payload_h payload, + smartthings_payload_h resp_payload, void *user_data) +{ + int ivalue = 0; + + if (smartthings_payload_get_int(payload, KEY_SWITCHLEVEL, &ivalue) == 0) { + _D("requested dimming: [%d]", ivalue); + servo_h_state_set((double)ivalue, RESOURCE_CALLBACK_KEY); + smartthings_payload_set_int(resp_payload, KEY_SWITCHLEVEL, ivalue); + } + + return true; +} + +static void +_request_cb(smartthings_resource_h handle, int req_id, + const char *uri, smartthings_resource_req_type_e req_type, + smartthings_payload_h payload, void *user_data) +{ + smartthings_payload_h resp_payload = NULL; + bool result = false; + int error = SMARTTHINGS_RESOURCE_ERROR_NONE; + + _D("request on %s, type[%d], id[%d]", uri, req_type, req_id); + + smartthings_payload_create(&resp_payload); + if (!resp_payload) { + _E("Response payload is NULL"); + return; + } + + if (req_type == SMARTTHINGS_RESOURCE_REQUEST_GET) { + if (0 == g_strcmp0(uri, URI_SWITCH)) + result = handle_get_switch(resp_payload, user_data); + else if (0 == g_strcmp0(uri, URI_AUDIOVOLUME)) + result = handle_get_audiovolume(resp_payload, user_data); + else if (0 == g_strcmp0(uri, URI_SWITCHLEVEL)) + result = handle_get_switchLevel(resp_payload, user_data); + else if (0 == g_strcmp0(uri, URI_MOTION)) + result = handle_get_motion(resp_payload, user_data); + else + _E("No matching Resource uri"); + } else if (req_type == SMARTTHINGS_RESOURCE_REQUEST_SET) { + if (0 == g_strcmp0(uri, URI_SWITCH)) + result = handle_set_switch(payload, resp_payload, user_data); + else if (0 == g_strcmp0(uri, URI_AUDIOVOLUME)) + result = handle_set_audiovolume(payload, resp_payload, user_data); + else if (0 == g_strcmp0(uri, URI_SWITCHLEVEL)) + result = handle_set_switchLevel(payload, resp_payload, user_data); + else if (0 == g_strcmp0(uri, URI_MOTION)) + result = handle_set_motion(payload, resp_payload, user_data); + else + _E("No matching Resource uri"); + } else { + _E("Invalid request type - %d", req_type); + smartthings_payload_destroy(resp_payload); + return; + } + + error = smartthings_resource_send_response(handle, req_id, uri, resp_payload, result); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) { + smartthings_payload_destroy(resp_payload); + _E("smartthings_resource_send_response() failed, [%s]", + __resource_error_to_str(error)); + return; + } + + if (req_type == SMARTTHINGS_RESOURCE_REQUEST_SET) { + error = smartthings_resource_notify(handle, uri, resp_payload); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) + _E("smartthings_resource_notify() failed, [%s]", + __resource_error_to_str(error)); + } + + if (smartthings_payload_destroy(resp_payload)) + _E("smartthings_payload_destroy failed"); + + return; +} + +static void +_resource_connection_status_cb(smartthings_resource_error_e error, + smartthings_resource_h handle, + smartthings_resource_connection_status_e status, void *user_data) +{ + _D("result [%s], status=[%d]", __resource_error_to_str(error), status); + + g_conn_status = status; + + if (status == SMARTTHINGS_RESOURCE_CONNECTION_STATUS_CONNECTED) { + if (smartthings_resource_set_request_cb(handle, _request_cb, NULL)) { + _E("smartthings_resource_set_request_cb() is failed"); + return; + } + } else { + _E("connection failed"); + } + return; +} + +static void __motion_changed(int value, void* user_data) +{ + smartthings_resource_h handle = user_data; + smartthings_payload_h payload = NULL; + int error = SMARTTHINGS_RESOURCE_ERROR_NONE; + + ret_if(!handle); + + _D("motion changed to - %d", value); + + ret_if(g_conn_status != SMARTTHINGS_RESOURCE_CONNECTION_STATUS_CONNECTED); + + smartthings_payload_create(&payload); + if (!payload) { + _E("failed to create payload is NULL"); + return; + } + + smartthings_payload_set_bool(payload, KEY_MOTION, value ? true : false); + + error = smartthings_resource_notify(handle, URI_MOTION, payload); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) + _E("smartthings_resource_notify() failed, [%s]", + __resource_error_to_str(error)); + + smartthings_payload_destroy(payload); +} + +static void __switch_changed(switch_state_e state, void* user_data) +{ + smartthings_resource_h handle = user_data; + smartthings_payload_h payload = NULL; + int error = SMARTTHINGS_RESOURCE_ERROR_NONE; + const char *switch_state_name = NULL; + + _D("switch changed to - %d", state); + ret_if(!handle); + ret_if(g_conn_status != SMARTTHINGS_RESOURCE_CONNECTION_STATUS_CONNECTED); + + smartthings_payload_create(&payload); + if (!payload) { + _E("failed to create payload is NULL"); + return; + } + + if (state == SWITCH_STATE_OFF) + switch_state_name = VALUE_SWITCH_OFF; + else + switch_state_name = VALUE_SWITCH_ON; + + smartthings_payload_set_string(payload, KEY_SWITCH, switch_state_name); + + error = smartthings_resource_notify(handle, URI_SWITCH, payload); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) + _E("smartthings_resource_notify() failed, [%s]", + __resource_error_to_str(error)); + + smartthings_payload_destroy(payload); +} + +static void __servo_v_changed(double value, void* user_data) +{ + smartthings_resource_h handle = user_data; + smartthings_payload_h payload = NULL; + int error = SMARTTHINGS_RESOURCE_ERROR_NONE; + + _D("servo_v changed to - %f", value); + ret_if(!handle); + ret_if(g_conn_status != SMARTTHINGS_RESOURCE_CONNECTION_STATUS_CONNECTED); + + smartthings_payload_create(&payload); + if (!payload) { + _E("failed to create payload is NULL"); + return; + } + + smartthings_payload_set_int(payload, KEY_VOLUME, (int)value); + + error = smartthings_resource_notify(handle, URI_AUDIOVOLUME, payload); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) + _E("smartthings_resource_notify() failed, [%s]", + __resource_error_to_str(error)); + + smartthings_payload_destroy(payload); +} + +static void __servo_h_changed(double value, void* user_data) +{ + smartthings_resource_h handle = user_data; + smartthings_payload_h payload = NULL; + int error = SMARTTHINGS_RESOURCE_ERROR_NONE; + + _D("servo_h changed to - %f", value); + ret_if(!handle); + ret_if(g_conn_status != SMARTTHINGS_RESOURCE_CONNECTION_STATUS_CONNECTED); + + smartthings_payload_create(&payload); + if (!payload) { + _E("failed to create payload is NULL"); + return; + } + + smartthings_payload_set_int(payload, KEY_SWITCHLEVEL, (int)value); + + error = smartthings_resource_notify(handle, URI_SWITCHLEVEL, payload); + if (error != SMARTTHINGS_RESOURCE_ERROR_NONE) + _E("smartthings_resource_notify() failed, [%s]", + __resource_error_to_str(error)); + + smartthings_payload_destroy(payload); +} + +static int __device_interfaces_set_callbak(smartthings_resource_h handle) +{ + retv_if(!handle, -1); + + // Assume that, device interfaces are already initialized in controller.c + switch_state_changed_cb_set(RESOURCE_CALLBACK_KEY, + __switch_changed, handle); + servo_v_state_changed_cb_set(RESOURCE_CALLBACK_KEY, + __servo_v_changed, handle); + servo_h_state_changed_cb_set(RESOURCE_CALLBACK_KEY, + __servo_h_changed, handle); + motion_state_changed_cb_set(RESOURCE_CALLBACK_KEY, + __motion_changed, handle); + + return 0; +} + + +int st_thing_resource_init(void) +{ + smartthings_resource_h st_res_h = NULL; + int error = 0; + + if (g_st_res_h) { + _I("Already initialized!"); + return 0; + } + + error = smartthings_resource_initialize(&st_res_h, + _resource_connection_status_cb, NULL); + if (error) { + _E("smartthings_resource_initialize() is failed, [%s]", + __resource_error_to_str(error)); + return -1; + } + + g_st_res_h = st_res_h; + g_conn_status = SMARTTHINGS_RESOURCE_CONNECTION_STATUS_DISCONNECTED; + + __device_interfaces_set_callbak(g_st_res_h); + + return 0; +} + +int st_thing_resource_fini(void) +{ + if (!g_st_res_h) + return 0; + + smartthings_resource_unset_request_cb(g_st_res_h); + smartthings_resource_deinitialize(g_st_res_h); + g_st_res_h = NULL; + g_conn_status = SMARTTHINGS_RESOURCE_CONNECTION_STATUS_DISCONNECTED; + + return 0; +} diff --git a/src/switch.c b/src/switch.c new file mode 100644 index 0000000..297d66c --- /dev/null +++ b/src/switch.c @@ -0,0 +1,181 @@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include "log.h" +#include "switch.h" + +#define IDLE_PRIORITY (G_PRIORITY_HIGH_IDLE + 30) + +struct switch_data_s { + switch_state_e state; + GHashTable *callback_hash; +}; + +struct switch_callback_s { + switch_state_changed_cb callback; + void *cb_data; +}; + +struct switch_pass_data_s { + char *pass_key; + switch_state_e state; +}; + +static struct switch_data_s *g_switch; +static pthread_mutex_t g_switch_mutex; + +static int __free_switch_handle(struct switch_data_s *sw) +{ + if (sw->callback_hash) { + g_hash_table_destroy(sw->callback_hash); + g_hash_table_unref(sw->callback_hash); + } + + free(sw); + return 0; +} + +int switch_initialize(void) +{ + if (g_switch) { + _D("The switch is already initialized!"); + return 0; + } + + g_switch = malloc(sizeof(struct switch_data_s)); + retv_if(!g_switch, -1); + + g_switch->callback_hash = + g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + + pthread_mutex_init(&g_switch_mutex, NULL); + g_switch->state = SWITCH_STATE_OFF; + + /* TODO : initialize real switch here */ + + return 0; +} + +int switch_finalize(void) +{ + if (g_switch) { + pthread_mutex_destroy(&g_switch_mutex); + __free_switch_handle(g_switch); + g_switch = NULL; + } + + return 0; +} + +static void __cb_item_foreach(gpointer key, gpointer value, gpointer user_data) +{ + char *item_name = key; + struct switch_callback_s *cb_item = value; + struct switch_pass_data_s *pass_item = user_data; + + ret_if(!item_name); + ret_if(!cb_item); + ret_if(!pass_item); + + + if (pass_item->pass_key && + (0 == g_strcmp0(item_name, pass_item->pass_key))) { + // _D("pass item - %s", item_name); + return; + } + + _D("callback called for [%s]", item_name); + cb_item->callback(pass_item->state, cb_item->cb_data); +} + +static gboolean __call_cb_idle(gpointer data) +{ + struct switch_pass_data_s *pass_item = data; + + g_hash_table_foreach(g_switch->callback_hash, __cb_item_foreach, pass_item); + g_free(pass_item->pass_key); + g_free(pass_item); + + return G_SOURCE_REMOVE; +} + +int switch_state_set(switch_state_e state, const char *pass_key) +{ + int old_state = 0; + retv_if(!g_switch, -1); + + pthread_mutex_lock(&g_switch_mutex); + old_state = g_switch->state; + pthread_mutex_unlock(&g_switch_mutex); + + if (old_state != state) { + pthread_mutex_lock(&g_switch_mutex); + g_switch->state = state; + pthread_mutex_unlock(&g_switch_mutex); + + if (g_hash_table_size(g_switch->callback_hash) > 0) { + struct switch_pass_data_s *pass_item = NULL; + + pass_item = g_new(struct switch_pass_data_s, 1); + pass_item->pass_key = g_strdup(pass_key); + pass_item->state = state; + g_idle_add_full(IDLE_PRIORITY, + __call_cb_idle, pass_item, NULL); + } + } + return 0; +} + +int switch_state_get(switch_state_e *state) +{ + retv_if(!g_switch, -1); + retv_if(!state, -1); + + pthread_mutex_lock(&g_switch_mutex); + *state = g_switch->state; + pthread_mutex_unlock(&g_switch_mutex); + + // _D("get state : %d", *state); + + return 0; +} + +int switch_state_changed_cb_set( + const char *callback_key, switch_state_changed_cb callback, void *cb_data) +{ + retv_if(!g_switch, -1); + retv_if(!g_switch->callback_hash, -1); + retv_if(!callback_key, -1); + + if (callback) { + struct switch_callback_s *cb_item = NULL; + cb_item = g_try_new(struct switch_callback_s, 1); + retv_if(!cb_item, -1); + + cb_item->callback = callback; + cb_item->cb_data = cb_data; + + g_hash_table_insert(g_switch->callback_hash, + g_strdup(callback_key), cb_item); + } else { + g_hash_table_remove(g_switch->callback_hash, callback_key); + } + + return 0; +} diff --git a/tizen-manifest.xml.in b/tizen-manifest.xml.in new file mode 100644 index 0000000..fa96d83 --- /dev/null +++ b/tizen-manifest.xml.in @@ -0,0 +1,23 @@ + + + + + + @PROJECT_NAME@.png + + + + + + + + http://tizen.org/privilege/camera + http://tizen.org/privilege/peripheralio + http://tizen.org/privilege/appmanager.launch + http://tizen.org/privilege/datasharing + http://tizen.org/privilege/internet + http://tizen.org/privilege/softap + http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.master + http://com.samsung.tizen.smartthings-thing/appdefined/smartthings-thing.resource + + diff --git a/update-dashboard.sh b/update-dashboard.sh new file mode 100755 index 0000000..b6fee32 --- /dev/null +++ b/update-dashboard.sh @@ -0,0 +1,24 @@ +cd dashboard + +sdb root on; +sdb shell 'mount -o remount,rw /'; + +sdb shell 'systemctl stop iot-dashboard' + +sdb shell 'rm -rf /opt/home/dashboard' +sdb shell 'mkdir -p /opt/home/dashboard/public/js'; +sdb shell 'mkdir -p /opt/home/dashboard/public/css'; + +sdb push server.js /opt/home/dashboard; +sdb push default.gif /opt/home/dashboard; +sdb push public/index.html /opt/home/dashboard/public/index.html; +sdb push public/test.html /opt/home/dashboard/public/test.html; +sdb push public/js/app.js /opt/home/dashboard/public/js/app.js; +sdb push public/css/style.css /opt/home/dashboard/public/css/style.css; + +sdb shell 'cd /opt/home/dashboard; find .'; + +# sdb shell 'cd /opt/home/dashboard; iotjs server.js' + +sdb shell 'systemctl start iot-dashboard' +sdb shell 'systemctl status iot-dashboard' -- 2.7.4