From e400a90942f7dcc160ab45ef0272157774dc59c5 Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Thu, 27 Jul 2017 12:47:17 +0200 Subject: [PATCH] openvidu-demo project removed --- openvidu-demo/.bowerrc | 3 - openvidu-demo/.classpath | 36 -- openvidu-demo/.gitignore | 1 - openvidu-demo/.project | 35 -- .../org.eclipse.core.resources.prefs | 6 - .../.settings/org.eclipse.jdt.core.prefs | 5 - .../.settings/org.eclipse.m2e.core.prefs | 4 - openvidu-demo/LICENSE | 202 --------- openvidu-demo/NOTICE | 13 - openvidu-demo/README.md | 125 ------ openvidu-demo/package/README.md | 35 -- openvidu-demo/package/bin/install.sh | 50 --- openvidu-demo/package/config/app.conf.json | 50 --- openvidu-demo/package/config/application.conf | 4 - .../package/config/application.properties | 7 - .../package/support-files/keystore.jks | Bin 2232 -> 0 bytes .../package/support-files/log4j.properties | 17 - .../package/support-files/systemd.service | 9 - openvidu-demo/pom.xml | 235 ----------- openvidu-demo/src/assembly/bin.xml | 50 --- .../java/io/openvidu/demo/ClientConfig.java | 55 --- .../java/io/openvidu/demo/DemoController.java | 91 ---- .../openvidu/demo/DemoJsonRpcUserControl.java | 170 -------- .../demo/DemoNotificationRoomHandler.java | 122 ------ .../io/openvidu/demo/FixedNKmsManager.java | 129 ------ .../java/io/openvidu/demo/KmsFilterType.java | 51 --- .../io/openvidu/demo/OpenViduSampleApp.java | 178 -------- .../src/main/resources/application.properties | 12 - openvidu-demo/src/main/resources/banner.txt | 9 - openvidu-demo/src/main/resources/keystore.jks | Bin 2232 -> 0 bytes .../resources/kurento-room-demo.conf.json | 49 --- .../src/main/resources/log4j.properties | 10 - .../src/main/resources/static/angular/app.js | 35 -- .../resources/static/angular/call/call.html | 67 --- .../static/angular/call/callController.js | 194 --------- .../resources/static/angular/login/login.html | 74 ---- .../static/angular/login/loginController.js | 210 --------- .../static/angular/services/Participants.js | 399 ------------------ .../angular/services/serviceParticipant.js | 9 - .../static/angular/services/serviceRoom.js | 60 --- .../resources/static/css/googleapis-fonts.css | 56 --- .../src/main/resources/static/css/room.css | 240 ----------- .../static/img/kurento-rect-logo.png | Bin 32568 -> 0 bytes .../src/main/resources/static/img/kurento.png | Bin 6499 -> 0 bytes .../main/resources/static/img/mario-wings.png | Bin 42037 -> 0 bytes .../src/main/resources/static/img/noVideo.png | Bin 7813 -> 0 bytes .../src/main/resources/static/img/wizard.png | Bin 12367 -> 0 bytes .../src/main/resources/static/index.html | 53 --- .../demo/test/AddRemoveUsersDemoTest.java | 44 -- .../AddRemoveUsersNoSinkVerifyDemoTest.java | 44 -- .../test/NUsersEqualLifetimeDemoTest.java | 45 -- .../test/OneUserQuickReentryDemoTest.java | 44 -- .../demo/test/SeqAddRemoveUserDemoTest.java | 45 -- .../test/SeqNUsersEqualLifetimeDemoTest.java | 45 -- .../test/TwoUsersEqualLifetimeDemoTest.java | 45 -- .../demo/test/UnpublishMediaDemoTest.java | 45 -- .../test/UnsubscribeFromMediaDemoTest.java | 44 -- .../demo/test/WebAppAvailabilityDemoTest.java | 44 -- .../test/fake/ExtraKmsFakeUsersDemoTest.java | 44 -- .../demo/test/fake/MixedUsersDemoTest.java | 44 -- .../test/fake/ParallelNFakeUsersDemoTest.java | 43 -- .../src/test/resources/log4j.properties | 22 - .../src/test/resources/test.conf.json | 30 -- pom.xml | 9 +- 64 files changed, 1 insertion(+), 3796 deletions(-) delete mode 100644 openvidu-demo/.bowerrc delete mode 100644 openvidu-demo/.classpath delete mode 100644 openvidu-demo/.gitignore delete mode 100644 openvidu-demo/.project delete mode 100644 openvidu-demo/.settings/org.eclipse.core.resources.prefs delete mode 100644 openvidu-demo/.settings/org.eclipse.jdt.core.prefs delete mode 100644 openvidu-demo/.settings/org.eclipse.m2e.core.prefs delete mode 100644 openvidu-demo/LICENSE delete mode 100644 openvidu-demo/NOTICE delete mode 100644 openvidu-demo/README.md delete mode 100644 openvidu-demo/package/README.md delete mode 100755 openvidu-demo/package/bin/install.sh delete mode 100644 openvidu-demo/package/config/app.conf.json delete mode 100755 openvidu-demo/package/config/application.conf delete mode 100644 openvidu-demo/package/config/application.properties delete mode 100644 openvidu-demo/package/support-files/keystore.jks delete mode 100644 openvidu-demo/package/support-files/log4j.properties delete mode 100644 openvidu-demo/package/support-files/systemd.service delete mode 100644 openvidu-demo/pom.xml delete mode 100644 openvidu-demo/src/assembly/bin.xml delete mode 100644 openvidu-demo/src/main/java/io/openvidu/demo/ClientConfig.java delete mode 100644 openvidu-demo/src/main/java/io/openvidu/demo/DemoController.java delete mode 100644 openvidu-demo/src/main/java/io/openvidu/demo/DemoJsonRpcUserControl.java delete mode 100644 openvidu-demo/src/main/java/io/openvidu/demo/DemoNotificationRoomHandler.java delete mode 100644 openvidu-demo/src/main/java/io/openvidu/demo/FixedNKmsManager.java delete mode 100644 openvidu-demo/src/main/java/io/openvidu/demo/KmsFilterType.java delete mode 100644 openvidu-demo/src/main/java/io/openvidu/demo/OpenViduSampleApp.java delete mode 100644 openvidu-demo/src/main/resources/application.properties delete mode 100644 openvidu-demo/src/main/resources/banner.txt delete mode 100644 openvidu-demo/src/main/resources/keystore.jks delete mode 100644 openvidu-demo/src/main/resources/kurento-room-demo.conf.json delete mode 100644 openvidu-demo/src/main/resources/log4j.properties delete mode 100644 openvidu-demo/src/main/resources/static/angular/app.js delete mode 100644 openvidu-demo/src/main/resources/static/angular/call/call.html delete mode 100644 openvidu-demo/src/main/resources/static/angular/call/callController.js delete mode 100644 openvidu-demo/src/main/resources/static/angular/login/login.html delete mode 100644 openvidu-demo/src/main/resources/static/angular/login/loginController.js delete mode 100644 openvidu-demo/src/main/resources/static/angular/services/Participants.js delete mode 100644 openvidu-demo/src/main/resources/static/angular/services/serviceParticipant.js delete mode 100644 openvidu-demo/src/main/resources/static/angular/services/serviceRoom.js delete mode 100644 openvidu-demo/src/main/resources/static/css/googleapis-fonts.css delete mode 100644 openvidu-demo/src/main/resources/static/css/room.css delete mode 100644 openvidu-demo/src/main/resources/static/img/kurento-rect-logo.png delete mode 100644 openvidu-demo/src/main/resources/static/img/kurento.png delete mode 100644 openvidu-demo/src/main/resources/static/img/mario-wings.png delete mode 100644 openvidu-demo/src/main/resources/static/img/noVideo.png delete mode 100644 openvidu-demo/src/main/resources/static/img/wizard.png delete mode 100644 openvidu-demo/src/main/resources/static/index.html delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/AddRemoveUsersDemoTest.java delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/AddRemoveUsersNoSinkVerifyDemoTest.java delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/NUsersEqualLifetimeDemoTest.java delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/OneUserQuickReentryDemoTest.java delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/SeqAddRemoveUserDemoTest.java delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/SeqNUsersEqualLifetimeDemoTest.java delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/TwoUsersEqualLifetimeDemoTest.java delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/UnpublishMediaDemoTest.java delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/UnsubscribeFromMediaDemoTest.java delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/WebAppAvailabilityDemoTest.java delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/fake/ExtraKmsFakeUsersDemoTest.java delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/fake/MixedUsersDemoTest.java delete mode 100644 openvidu-demo/src/test/java/io/openvidu/demo/test/fake/ParallelNFakeUsersDemoTest.java delete mode 100644 openvidu-demo/src/test/resources/log4j.properties delete mode 100644 openvidu-demo/src/test/resources/test.conf.json diff --git a/openvidu-demo/.bowerrc b/openvidu-demo/.bowerrc deleted file mode 100644 index 9e00ce04..00000000 --- a/openvidu-demo/.bowerrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "directory" : "static/bower_components" -} diff --git a/openvidu-demo/.classpath b/openvidu-demo/.classpath deleted file mode 100644 index 7e4ca5cd..00000000 --- a/openvidu-demo/.classpath +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openvidu-demo/.gitignore b/openvidu-demo/.gitignore deleted file mode 100644 index b83d2226..00000000 --- a/openvidu-demo/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/openvidu-demo/.project b/openvidu-demo/.project deleted file mode 100644 index a6841310..00000000 --- a/openvidu-demo/.project +++ /dev/null @@ -1,35 +0,0 @@ - - - kurento-room-demo - - - - - - org.eclipse.wst.common.project.facet.core.builder - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.springframework.ide.eclipse.core.springbuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.springframework.ide.eclipse.core.springnature - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - org.eclipse.wst.common.project.facet.core.nature - - diff --git a/openvidu-demo/.settings/org.eclipse.core.resources.prefs b/openvidu-demo/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 29abf999..00000000 --- a/openvidu-demo/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,6 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/main/resources=UTF-8 -encoding//src/test/java=UTF-8 -encoding//src/test/resources=UTF-8 -encoding/=UTF-8 diff --git a/openvidu-demo/.settings/org.eclipse.jdt.core.prefs b/openvidu-demo/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 714351ae..00000000 --- a/openvidu-demo/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/openvidu-demo/.settings/org.eclipse.m2e.core.prefs b/openvidu-demo/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f1..00000000 --- a/openvidu-demo/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/openvidu-demo/LICENSE b/openvidu-demo/LICENSE deleted file mode 100644 index 7a4a3ea2..00000000 --- a/openvidu-demo/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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 [yyyy] [name of copyright owner] - - 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. \ No newline at end of file diff --git a/openvidu-demo/NOTICE b/openvidu-demo/NOTICE deleted file mode 100644 index b7393e6f..00000000 --- a/openvidu-demo/NOTICE +++ /dev/null @@ -1,13 +0,0 @@ -(C) Copyright 2016 Kurento (http://kurento.org) - -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/openvidu-demo/README.md b/openvidu-demo/README.md deleted file mode 100644 index fecbe5af..00000000 --- a/openvidu-demo/README.md +++ /dev/null @@ -1,125 +0,0 @@ -[![License badge](https://img.shields.io/badge/license-Apache2-orange.svg)](http://www.apache.org/licenses/LICENSE-2.0) -[![Documentation badge](https://readthedocs.org/projects/fiware-orion/badge/?version=latest)](http://doc-kurento-room.readthedocs.org/en/latest/) -[![Docker badge](https://img.shields.io/docker/pulls/fiware/orion.svg)](https://hub.docker.com/r/fiware/stream-oriented-kurento/) -[![Support badge]( https://img.shields.io/badge/support-sof-yellowgreen.svg)](http://stackoverflow.com/questions/tagged/kurento) - -[![][KurentoImage]][Kurento] - -Copyright © 2013-2016 [Kurento]. Licensed under [Apache 2.0 License]. - -kurento-room-demo -================= - -Kurento Room Demo implements the group communications with WebRTC using -services from Kurento Room Server. - -The client-side implementation of this demo application is an AngularJS module -that uses the KurentoRoom.js library from the room server package. -It also integrates the room server's Spring application for the server-side -of the Room API. This API is made up of the Room SDK and the signaling -component. For client-server communications the API uses JSON-RPC messages -over WebSockets. - - -What is Kurento ---------------- - -Kurento is an open source software project providing a platform suitable -for creating modular applications with advanced real-time communication -capabilities. For knowing more about Kurento, please visit the Kurento -project website: http://www.kurento.org. - -Kurento is part of [FIWARE]. For further information on the relationship of -FIWARE and Kurento check the [Kurento FIWARE Catalog Entry] - -Kurento is part of the [NUBOMEDIA] research initiative. - -Documentation -------------- - -The Kurento project provides detailed [documentation] including tutorials, -installation and development guides. A simplified version of the documentation -can be found on [readthedocs.org]. The [Open API specification] a.k.a. Kurento -Protocol is also available on [apiary.io]. - -Source ------- - -Code for other Kurento projects can be found in the [GitHub Kurento Group]. - -News and Website ----------------- - -Check the [Kurento blog] -Follow us on Twitter @[kurentoms]. - -Issue tracker -------------- - -Issues and bug reports should be posted to the [GitHub Kurento bugtracker] - -Licensing and distribution --------------------------- - -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. - -Contribution policy -------------------- - -You can contribute to the Kurento community through bug-reports, bug-fixes, new -code or new documentation. For contributing to the Kurento community, drop a -post to the [Kurento Public Mailing List] providing full information about your -contribution and its value. In your contributions, you must comply with the -following guidelines - -* You must specify the specific contents of your contribution either through a - detailed bug description, through a pull-request or through a patch. -* You must specify the licensing restrictions of the code you contribute. -* For newly created code to be incorporated in the Kurento code-base, you must - accept Kurento to own the code copyright, so that its open source nature is - guaranteed. -* You must justify appropriately the need and value of your contribution. The - Kurento project has no obligations in relation to accepting contributions - from third parties. -* The Kurento project leaders have the right of asking for further - explanations, tests or validations of any code contributed to the community - before it being incorporated into the Kurento code-base. You must be ready to - addressing all these kind of concerns before having your code approved. - -Support -------- - -The Kurento project provides community support through the [Kurento Public -Mailing List] and through [StackOverflow] using the tags *kurento* and -*fiware-kurento*. - -Before asking for support, please read first the [Kurento Netiquette Guidelines] - -[documentation]: http://www.kurento.org/documentation -[FIWARE]: http://www.fiware.org -[GitHub Kurento bugtracker]: https://github.com/Kurento/bugtracker/issues -[GitHub Kurento Group]: https://github.com/kurento -[kurentoms]: http://twitter.com/kurentoms -[Kurento]: http://kurento.org -[Kurento Blog]: http://www.kurento.org/blog -[Kurento FIWARE Catalog Entry]: http://catalogue.fiware.org/enablers/stream-oriented-kurento -[Kurento Netiquette Guidelines]: http://www.kurento.org/blog/kurento-netiquette-guidelines -[Kurento Public Mailing list]: https://groups.google.com/forum/#!forum/kurento -[KurentoImage]: https://secure.gravatar.com/avatar/21a2a12c56b2a91c8918d5779f1778bf?s=120 -[Apache 2.0 License]: http://www.apache.org/licenses/LICENSE-2.0 -[NUBOMEDIA]: http://www.nubomedia.eu -[StackOverflow]: http://stackoverflow.com/search?q=kurento -[Read-the-docs]: http://read-the-docs.readthedocs.org/ -[readthedocs.org]: http://kurento.readthedocs.org/ -[Open API specification]: http://kurento.github.io/doc-kurento/ -[apiary.io]: http://docs.streamoriented.apiary.io/ diff --git a/openvidu-demo/package/README.md b/openvidu-demo/package/README.md deleted file mode 100644 index a0989dc7..00000000 --- a/openvidu-demo/package/README.md +++ /dev/null @@ -1,35 +0,0 @@ -[![License badge](https://img.shields.io/badge/license-Apache2-orange.svg)](http://www.apache.org/licenses/LICENSE-2.0) -[![Documentation badge](https://readthedocs.org/projects/fiware-orion/badge/?version=latest)](http://doc-kurento.readthedocs.org/en/latest/) -[![Docker badge](https://img.shields.io/docker/pulls/fiware/orion.svg)](https://hub.docker.com/r/fiware/stream-oriented-kurento/) -[![Support badge]( https://img.shields.io/badge/support-sof-yellowgreen.svg)](http://stackoverflow.com/questions/tagged/kurento) - -${project.name} -====================== - -The ${project.name} implements multimedia group communications with WebRTC using services from -Kurento Room Server. - -There are complete instructions on how to deploy the demo binary: -http://doc-kurento-room.readthedocs.org/en/current/demo_deployment.html - -Installation instructions -------------------------- - -By running `sudo ./bin/install.sh`, the jar file containing the demo will be copied into -_/var/lib/kurento_, and the startup script will be put in _/etc/init.d/${project.artifactId}_. Once -the demo is installed, it can be managed as a regular service with - -``` -sudo service ${project.artifactId} {start|stop|restart} -``` -If you want to change the port, you can do so by editing the file _/etc/kurento/${project.artifactId}.properties_. - -Quick start instructions ------------------------- - -By running `./bin/start.sh` the jar file containing the demo will be started right away, from the -_files/_ folder. - -Press `Control-C` to stop its execution. - -If you want to change the port, you can do so by editing the file _files/${project.artifactId}.properties_. diff --git a/openvidu-demo/package/bin/install.sh b/openvidu-demo/package/bin/install.sh deleted file mode 100755 index be667441..00000000 --- a/openvidu-demo/package/bin/install.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash - -# ${project.description} installer for Ubuntu >= 14.04 -if [ `id -u` -ne 0 ]; then - echo "" - echo "Only root can install Kurento" - echo "" - exit 1 -fi - -echo "Installing kurento-room-sfu-demo" - -APP_HOME=$(dirname $(dirname $(readlink -f $0))) -APP_NAME=${project.artifactId} - -useradd -d /var/kurento/ kurento - -SYSTEMD=$(pidof systemd && echo "systemd" || echo "other") - -# Install binaries -mkdir -p /var/lib/kurento -chown kurento /var/lib/kurento -install -o kurento -g root $APP_HOME/lib/$APP_NAME.jar /var/lib/kurento/ -install -o kurento -g root $APP_HOME/config/$APP_NAME.conf /var/lib/kurento/ -install -o kurento -g root $APP_HOME/config/$APP_NAME.properties /var/lib/kurento/ -install -o kurento -g root $APP_HOME/support-files/keystore.jks /var/lib/kurento/ -ln -s /var/lib/kurento/$APP_NAME.jar /etc/init.d/$APP_NAME -chmod 755 /etc/init.d/$APP_NAME - -mkdir -p /etc/kurento/ -install -o kurento -g root $APP_HOME/config/app.conf.json /etc/kurento/$APP_NAME.conf.json -install -o kurento -g root $APP_HOME/support-files/log4j.properties /etc/kurento/$APP_NAME-log4j.properties - -mkdir -p /var/log/kurento -chown kurento /var/log/kurento - - -if [[ "$SYSTEMD" != "other" ]]; then - install -o root -g root $APP_HOME/support-files/systemd.service /etc/systemd/system/$APP_NAME.service - sudo systemctl daemon-reload - # enable at startup - [ -z "$NOENABLE" ] && systemctl enable $APP_NAME || echo "App not enabled" - # start service - [ -z "$NOSTART" ] && systemctl start $APP_NAME || echo "App not started" -else - # enable at startup - [ -z "$NOENABLE" ] && update-rc.d $APP_NAME defaults || echo "App not enabled" - # start service - [ -z "$NOSTART" ] && service $APP_NAME start || echo "App not started" -fi diff --git a/openvidu-demo/package/config/app.conf.json b/openvidu-demo/package/config/app.conf.json deleted file mode 100644 index e7872179..00000000 --- a/openvidu-demo/package/config/app.conf.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "kms": { - "uris": ["ws://localhost:8888/kurento", "ws://127.0.0.1:8888/kurento"] - }, - "app": { - //has to accessible from the KMS in order to load filter imgs - "uri": "https://localhost:8443/" - }, - "kurento": { - "client": { - //milliseconds - "requestTimeout": 20000 - } - }, - "demo": { - //marker or hat - "filterType" : "marker", - - //markerdetector img(s) in order of preference - "markerUrls": { - "0": "kurento-rect-logo.png", - "1": "twi-logo.png" - }, - - //mario-wings.png or wizard.png - "hatUrl": "mario-wings.png", - "hatCoords": { - // mario-wings hat - "offsetXPercent": -0.35F, - "offsetYPercent": -1.2F, - "widthPercent": 1.6F, - "heightPercent": 1.6F - - //wizard hat - //"offsetXPercent": -0.2F, - //"offsetYPercent": -1.35F, - //"widthPercent": 1.5F, - //"heightPercent": 1.5F - }, - "loopback" : { - "remote": true, - //matters only when remote is true - "andLocal": false - }, - "authRegex": ".*", - "kmsLimit": 1000 - }, - "updateSpeakerInterval": 1800, - "thresholdSpeaker": -50 -} diff --git a/openvidu-demo/package/config/application.conf b/openvidu-demo/package/config/application.conf deleted file mode 100755 index aab3f645..00000000 --- a/openvidu-demo/package/config/application.conf +++ /dev/null @@ -1,4 +0,0 @@ -APP_NAME=${project.artifactId} -LOG_FOLDER=/var/log/kurento -LOG_FILENAME=boot.log -JAVA_OPTS="-Dspring.config.location=file:/var/lib/kurento/${project.artifactId}.properties -DconfigFilePath=/etc/kurento/${project.artifactId}.conf.json -Dlogging.config=/etc/kurento/${project.artifactId}-log4j.properties -XX:+HeapDumpOnOutOfMemoryError" \ No newline at end of file diff --git a/openvidu-demo/package/config/application.properties b/openvidu-demo/package/config/application.properties deleted file mode 100644 index 3996cc67..00000000 --- a/openvidu-demo/package/config/application.properties +++ /dev/null @@ -1,7 +0,0 @@ -server.port: 8443 -server.address: 0.0.0.0 -server.ssl.key-store: keystore.jks -server.ssl.key-store-password: kurento -server.ssl.keyStoreType: JKS -server.ssl.keyAlias: kurento-selfsigned -server.context-path: / \ No newline at end of file diff --git a/openvidu-demo/package/support-files/keystore.jks b/openvidu-demo/package/support-files/keystore.jks deleted file mode 100644 index c13f80382cbaef224ef743a75c779297f2547b43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2232 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 - 4.0.0 - - - io.openvidu - openvidu - 0.0.1-SNAPSHOT - - - openvidu-demo - jar - - OpenVidu Demo - OpenVidu Demo application - http://www.kurento.org/docs/${project.version} - - - - Apache 2.0 - http://www.apache.org/licenses/LICENSE-2.0 - repo - - - - - Kurento - http://www.kurento.org - - - - ${openvidu.scm.url} - scm:git:${openvidu.scm.connection} - scm:git:${openvidu.scm.connection} - develop - - - - - kurento.org - -kurento.org Community - Kurento.org - http://www.kurento.org - - - - - - io.openvidu.demo.OpenViduSampleApp - - - - - io.openvidu - openvidu-server - - - org.springframework.boot - spring-boot-starter-logging - - - - - io.openvidu - openvidu-browser - - - io.openvidu - openvidu-test - test - - - org.kurento.module - markerdetector - - - org.springframework.boot - spring-boot-starter-log4j2 - - - - org.webjars - webjars-locator - - - org.webjars.bower - jquery - 2.2.4 - - - org.webjars - jquery-ui - 1.11.4 - - - org.webjars.bower - angular - 1.5.7 - - - org.webjars.bower - angular-route - 1.5.7 - - - org.webjars.bower - angular-fullscreen - 1.0.1 - - - org.webjars.bower - material-design-iconic-font - 1.1.1 - - - org.webjars.bower - lumx - 0.2.50 - - - org.webjars.bower - angular-clipboard - 1.4.2 - - - - - - - - src/main/resources - false - - - src/main/resources - true - - banner.txt - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - ${start-class} - ZIP - true - - - - - repackage - - - - - - - - org.codehaus.mojo - exec-maven-plugin - - ${start-class} - - - - - org.apache.maven.plugins - maven-assembly-plugin - - src/assembly/bin.xml - ${project.artifactId}-${project.version} - false - - - - package - - single - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - package - - - - - - - - - - - - - - default - - true - - - - - org.apache.maven.plugins - maven-surefire-plugin - - true - - - - org.apache.maven.plugins - maven-failsafe-plugin - - true - - - - - - - integration - - - diff --git a/openvidu-demo/src/assembly/bin.xml b/openvidu-demo/src/assembly/bin.xml deleted file mode 100644 index 7a2b1311..00000000 --- a/openvidu-demo/src/assembly/bin.xml +++ /dev/null @@ -1,50 +0,0 @@ - - bin - - zip - - false - - - - target/${project.artifactId}-${project.version}.jar - lib - ${project.artifactId}.jar - - - package/config/application.conf - - config/${project.artifactId}.conf - true - - - package/config/application.properties - - config/${project.artifactId}.properties - true - - - package/support-files/keystore.jks - - support-files/keystore.jks - false - - - - - - package - - - config/application.conf - config/application.properties - support-files/keystore.jks - - true - - - - diff --git a/openvidu-demo/src/main/java/io/openvidu/demo/ClientConfig.java b/openvidu-demo/src/main/java/io/openvidu/demo/ClientConfig.java deleted file mode 100644 index 9be28a0f..00000000 --- a/openvidu-demo/src/main/java/io/openvidu/demo/ClientConfig.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo; - -class ClientConfig { - private boolean loopbackRemote; - private boolean loopbackAndLocal; - private String filterRequestParam; - - public boolean isLoopbackRemote() { - return loopbackRemote; - } - - public void setLoopbackRemote(boolean loopbackRemote) { - this.loopbackRemote = loopbackRemote; - } - - public boolean isLoopbackAndLocal() { - return loopbackAndLocal; - } - - public void setLoopbackAndLocal(boolean loopbackAndLocal) { - this.loopbackAndLocal = loopbackAndLocal; - } - - public String getFilterRequestParam() { - return filterRequestParam; - } - - public void setFilterRequestParam(String filterRequestParam) { - this.filterRequestParam = filterRequestParam; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("Loopback [remote=").append(loopbackRemote).append(", andLocal=") - .append(loopbackAndLocal).append("], filterRequestParam=").append(filterRequestParam); - return builder.toString(); - } -} diff --git a/openvidu-demo/src/main/java/io/openvidu/demo/DemoController.java b/openvidu-demo/src/main/java/io/openvidu/demo/DemoController.java deleted file mode 100644 index 23ff4a53..00000000 --- a/openvidu-demo/src/main/java/io/openvidu/demo/DemoController.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * (C) Copyright 2016 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package io.openvidu.demo; - -import org.kurento.commons.PropertiesManager; -import io.openvidu.client.OpenViduException; -import io.openvidu.server.core.NotificationRoomManager; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; - -/** - * Rest controller for the room demo app. - * - * @author Radu Tom Vlad (rvlad@naevatec.com) - * @since 6.0.0 - */ -@RestController -public class DemoController { - - private static final Logger log = LoggerFactory.getLogger(DemoController.class); - - private final static boolean DEMO_LOOPBACK_REMOTE = PropertiesManager - .getProperty("demo.loopback.remote", false); - private final static boolean DEMO_LOOPBACK_AND_LOCAL = PropertiesManager - .getProperty("demo.loopback.andLocal", false); - - private static ClientConfig config; - - static { - config = new ClientConfig(); - config.setLoopbackRemote(DEMO_LOOPBACK_REMOTE); - config.setLoopbackAndLocal(DEMO_LOOPBACK_AND_LOCAL); - config.setFilterRequestParam( - KmsFilterType.parseType(OpenViduSampleApp.DEMO_FILTER_TYPE).getCustomRequestParam()); - log.info("Set client config: {}", config); - } - - @Autowired - private NotificationRoomManager roomManager; - - @ResponseStatus(value = HttpStatus.NOT_FOUND) - public class ResourceNotFoundException extends RuntimeException { - private static final long serialVersionUID = 1L; - - public ResourceNotFoundException(String msg) { - super(msg); - } - } - - @RequestMapping("/close") - public void closeRoom(@RequestParam("room") String room) { - log.warn("Trying to close the room '{}'", room); - if (!roomManager.getRooms().contains(room)) { - log.warn("Unable to close room '{}', not found.", room); - throw new ResourceNotFoundException("Room '" + room + "' not found"); - } - try { - roomManager.closeRoom(room); - } catch (OpenViduException e) { - log.warn("Error closing room {}", room, e); - throw new ResourceNotFoundException(e.getMessage()); - } - } - - @RequestMapping("/getClientConfig") - public ClientConfig clientConfig() { - log.debug("Sending client config {}", config); - return config; - } -} diff --git a/openvidu-demo/src/main/java/io/openvidu/demo/DemoJsonRpcUserControl.java b/openvidu-demo/src/main/java/io/openvidu/demo/DemoJsonRpcUserControl.java deleted file mode 100644 index b0917807..00000000 --- a/openvidu-demo/src/main/java/io/openvidu/demo/DemoJsonRpcUserControl.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo; - -import java.io.IOException; -import java.util.SortedMap; - -import org.kurento.client.FaceOverlayFilter; -import org.kurento.client.MediaElement; -import org.kurento.jsonrpc.Transaction; -import org.kurento.jsonrpc.message.Request; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.JsonObject; - -import io.openvidu.server.core.NotificationRoomManager; -import io.openvidu.server.core.api.pojo.ParticipantRequest; -import io.openvidu.server.rpc.JsonRpcUserControl; - -/** - * User control that applies a media filter when publishing video. - * - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class DemoJsonRpcUserControl extends JsonRpcUserControl { - - private static final String SESSION_ATTRIBUTE_FILTER = "customFilter"; - private static final String MARKER_ID = "markerFilterId"; - - private static final Logger log = LoggerFactory.getLogger(DemoJsonRpcUserControl.class); - - private KmsFilterType filterType = KmsFilterType.HAT; - - private String hatUrl; - private float offsetXPercent; - private float offsetYPercent; - private float widthPercent; - private float heightPercent; - - private SortedMap markerUrls; - - public DemoJsonRpcUserControl(NotificationRoomManager roomManager) { - //super(roomManager); - } - - public void setFilterType(KmsFilterType type) { - this.filterType = type; - } - - public void setHatUrl(String hatUrl) { - this.hatUrl = hatUrl; - log.info("Hat URL: {}", hatUrl); - } - - public void setMarkerUrls(SortedMap urls) { - this.markerUrls = urls; - log.info("Marker URL: {}", markerUrls); - } - - public void setHatCoords(JsonObject hatCoords) { - if (hatCoords.get("offsetXPercent") != null) { - offsetXPercent = hatCoords.get("offsetXPercent").getAsFloat(); - } - if (hatCoords.get("offsetYPercent") != null) { - offsetYPercent = hatCoords.get("offsetYPercent").getAsFloat(); - } - if (hatCoords.get("widthPercent") != null) { - widthPercent = hatCoords.get("widthPercent").getAsFloat(); - } - if (hatCoords.get("heightPercent") != null) { - heightPercent = hatCoords.get("heightPercent").getAsFloat(); - } - log.info("Hat coords:\n\toffsetXPercent = {}\n\toffsetYPercent = {}" - + "\n\twidthPercent = {}\n\theightPercent = {}", offsetXPercent, offsetYPercent, - widthPercent, heightPercent); - } - - @Override - public void customRequest(Transaction transaction, Request request, - ParticipantRequest participantRequest) { - try { - if (request.getParams() == null - || request.getParams().get(filterType.getCustomRequestParam()) == null) { - throw new RuntimeException( - "Request element '" + filterType.getCustomRequestParam() + "' is missing"); - } - switch (filterType) { - case MARKER: - handleMarkerRequest(transaction, request, participantRequest); - break; - case HAT: - default: - handleHatRequest(transaction, request, participantRequest); - } - } catch (Exception e) { - log.error("Unable to handle custom request", e); - try { - transaction.sendError(e); - } catch (IOException e1) { - log.warn("Unable to send error response", e1); - } - } - } - - private void handleHatRequest(Transaction transaction, Request request, - ParticipantRequest participantRequest) throws IOException { - boolean filterOn = request.getParams().get(filterType.getCustomRequestParam()).getAsBoolean(); - String pid = participantRequest.getParticipantId(); - if (filterOn) { - if (transaction.getSession().getAttributes().containsKey(SESSION_ATTRIBUTE_FILTER)) { - throw new RuntimeException(filterType + " filter already on"); - } - log.info("Applying {} filter to session {}", filterType, pid); - - FaceOverlayFilter filter = - new FaceOverlayFilter.Builder(roomManager.getPipeline(pid)).build(); - filter.setOverlayedImage(this.hatUrl, this.offsetXPercent, this.offsetYPercent, - this.widthPercent, this.heightPercent); - - addFilter(transaction, pid, filter); - } else { - removeFilter(transaction, pid); - } - transaction.sendResponse(new JsonObject()); - } - - private void handleMarkerRequest(final Transaction transaction, Request request, - ParticipantRequest participantRequest) throws IOException { - Integer currentUrlIndex = - request.getParams().get(filterType.getCustomRequestParam()).getAsInt(); - String pid = participantRequest.getParticipantId(); - - roomManager.updateFilter(roomManager.getRoomManager().getRoomName(pid), MARKER_ID); - - JsonObject result = new JsonObject(); - // TODO: Change RPC to remove next index requirement - // result.addProperty(filterType.getCustomRequestParam(), 0); - transaction.sendResponse(result); - } - - private void addFilter(Transaction transaction, String pid, MediaElement filter) { - roomManager.addMediaElement(pid, filter); - transaction.getSession().getAttributes().put(SESSION_ATTRIBUTE_FILTER, filter); - } - - private void removeFilter(Transaction transaction, String pid) { - if (!transaction.getSession().getAttributes().containsKey(SESSION_ATTRIBUTE_FILTER)) { - throw new RuntimeException("This user has no " + filterType + " filter yet"); - } - log.info("Removing {} filter from session {}", filterType, pid); - roomManager.removeMediaElement(pid, - (MediaElement) transaction.getSession().getAttributes().get(SESSION_ATTRIBUTE_FILTER)); - transaction.getSession().getAttributes().remove(SESSION_ATTRIBUTE_FILTER); - } -} diff --git a/openvidu-demo/src/main/java/io/openvidu/demo/DemoNotificationRoomHandler.java b/openvidu-demo/src/main/java/io/openvidu/demo/DemoNotificationRoomHandler.java deleted file mode 100644 index 698cef41..00000000 --- a/openvidu-demo/src/main/java/io/openvidu/demo/DemoNotificationRoomHandler.java +++ /dev/null @@ -1,122 +0,0 @@ -package io.openvidu.demo; - -import java.util.SortedMap; - -import org.kurento.client.Continuation; -import org.kurento.client.Filter; -import org.kurento.module.markerdetector.ArMarkerdetector; -import io.openvidu.client.internal.ProtocolElements; -import io.openvidu.server.core.api.UserNotificationService; -import io.openvidu.server.core.internal.DefaultNotificationRoomHandler; -import io.openvidu.server.core.internal.Participant; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.JsonObject; - -public class DemoNotificationRoomHandler extends DefaultNotificationRoomHandler { - - private static final Logger log = LoggerFactory.getLogger(DemoNotificationRoomHandler.class); - private SortedMap markerUrls; - - private UserNotificationService notifService; - - public DemoNotificationRoomHandler(UserNotificationService notifService) { - super(notifService); - - this.notifService = notifService; - } - - @Override - public void updateFilter(String roomName, Participant participant, String filterId, - String state) { - Integer newState = -1; - - if (state != null) { - newState = Integer.parseInt(state); - } - - String url = markerUrls.get(newState); - - JsonObject notificationParams = new JsonObject(); - notificationParams.addProperty("MarkerFilterState", newState); - - notifService.sendNotification(participant.getId(), ProtocolElements.CUSTOM_NOTIFICATION, - notificationParams); - - ArMarkerdetector newFilter; - Filter filter = participant.getFilterElement(filterId); - - if (filter == null) { - newFilter = new ArMarkerdetector.Builder(participant.getPipeline()).build(); - log.info("New {} filter for participant {}", filterId, participant.getId()); - participant.addFilterElement(filterId, newFilter); - } else { - log.info("Reusing {} filter in participant {}", filterId, participant.getId()); - newFilter = (ArMarkerdetector) filter; - } - - if (url != null) { - newFilter.setOverlayImage(url, new Continuation() { - @Override - public void onSuccess(Void result) throws Exception { - - } - - @Override - public void onError(Throwable cause) throws Exception { - - } - }); - newFilter.setOverlayScale(1.0F, new Continuation() { - @Override - public void onSuccess(Void result) throws Exception { - - } - - @Override - public void onError(Throwable cause) throws Exception { - - } - }); - } else { - newFilter.setOverlayScale(0.0001F, new Continuation() { - @Override - public void onSuccess(Void result) throws Exception { - - } - - @Override - public void onError(Throwable cause) throws Exception { - - } - }); - } - } - - @Override - public String getNextFilterState(String filterId, String oldState) { - Integer currentUrlIndex; - - if (oldState == null) { - currentUrlIndex = -1; - } else { - currentUrlIndex = Integer.parseInt(oldState); - } - - Integer nextIndex = -1; // disable filter - - if (currentUrlIndex < markerUrls.firstKey()) { - nextIndex = markerUrls.firstKey(); // enable filter using first URL - } else if (currentUrlIndex < markerUrls.lastKey()) { - nextIndex = markerUrls.tailMap(currentUrlIndex + 1).firstKey(); - } - - return nextIndex.toString(); - } - - public void setMarkerUrls(SortedMap markerUrls) { - this.markerUrls = markerUrls; - } -} diff --git a/openvidu-demo/src/main/java/io/openvidu/demo/FixedNKmsManager.java b/openvidu-demo/src/main/java/io/openvidu/demo/FixedNKmsManager.java deleted file mode 100644 index d6dea920..00000000 --- a/openvidu-demo/src/main/java/io/openvidu/demo/FixedNKmsManager.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo; - -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.kurento.client.KurentoClient; -import org.kurento.jsonrpc.Session; -import io.openvidu.client.OpenViduException; -import io.openvidu.server.core.internal.DefaultKurentoClientSessionInfo; -import io.openvidu.server.kms.Kms; -import io.openvidu.server.kms.KmsManager; -import io.openvidu.server.kms.MaxWebRtcLoadManager; -import io.openvidu.server.rpc.JsonRpcNotificationService; -import io.openvidu.server.rpc.ParticipantSession; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; - -/** - * KMS manager for the room demo app. - * - * @author Radu Tom Vlad (rvlad@naevatec.com) - * @since 6.0.0 - */ -public class FixedNKmsManager extends KmsManager { - private static final Logger log = LoggerFactory.getLogger(FixedNKmsManager.class); - - private String authRegex; - private static Pattern authPattern = null; - - @Autowired - private JsonRpcNotificationService notificationService; - - public FixedNKmsManager(List kmsWsUri) { - for (String uri : kmsWsUri) { - this.addKms(new Kms(KurentoClient.create(uri), uri)); - } - } - - public FixedNKmsManager(List kmsWsUri, int kmsLoadLimit) { - for (String uri : kmsWsUri) { - Kms kms = new Kms(KurentoClient.create(uri), uri); - kms.setLoadManager(new MaxWebRtcLoadManager(kmsLoadLimit)); - this.addKms(kms); - } - } - - public synchronized void setAuthRegex(String regex) { - this.authRegex = regex != null ? regex.trim() : null; - if (authRegex != null && !authRegex.isEmpty()) { - authPattern = Pattern.compile(authRegex, Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE); - } - } - - @Override - public synchronized Kms getKms(DefaultKurentoClientSessionInfo sessionInfo) { - String userName = null; - String participantId = sessionInfo.getParticipantId(); - Session session = notificationService.getSession(participantId); - if (session != null) { - Object sessionValue = session.getAttributes().get(ParticipantSession.SESSION_KEY); - if (sessionValue != null) { - ParticipantSession participantSession = (ParticipantSession) sessionValue; - userName = participantSession.getParticipantName(); - } - } - if (userName == null) { - log.warn("Unable to find user name in session {}", participantId); - throw new OpenViduException(OpenViduException.Code.ROOM_CANNOT_BE_CREATED_ERROR_CODE, - "Not enough information"); - } - if (!canCreateRoom(userName)) { - throw new OpenViduException(OpenViduException.Code.ROOM_CANNOT_BE_CREATED_ERROR_CODE, - "User cannot create a new room"); - } - Kms kms = null; - String type = ""; - boolean hq = isUserHQ(userName); - if (hq) { - kms = getLessLoadedKms(); - } else { - kms = getNextLessLoadedKms(); - if (!kms.allowMoreElements()) { - kms = getLessLoadedKms(); - } else { - type = "next "; - } - } - if (!kms.allowMoreElements()) { - log.debug( - "Was trying Kms which has no resources left: highQ={}, " + "{}less loaded KMS, uri={}", - hq, type, kms.getUri()); - throw new OpenViduException(OpenViduException.Code.ROOM_CANNOT_BE_CREATED_ERROR_CODE, - "No resources left to create new room"); - } - log.debug("Offering Kms: highQ={}, {}less loaded KMS, uri={}", hq, type, kms.getUri()); - return kms; - } - - private boolean isUserHQ(String userName) { - return userName.toLowerCase().startsWith("special"); - } - - private boolean canCreateRoom(String userName) { - if (authPattern == null) { - return true; - } - Matcher m = authPattern.matcher(userName); - return m.matches(); - } -} diff --git a/openvidu-demo/src/main/java/io/openvidu/demo/KmsFilterType.java b/openvidu-demo/src/main/java/io/openvidu/demo/KmsFilterType.java deleted file mode 100644 index 116f4f76..00000000 --- a/openvidu-demo/src/main/java/io/openvidu/demo/KmsFilterType.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * (C) Copyright 2016 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package io.openvidu.demo; - -/** - * @author Radu Tom Vlad (radutom.vlad@gmail.com) - * @since 6.5.1 - */ -public enum KmsFilterType { - HAT("hat", "hat"), MARKER("marker", "marker"); - - private String typeValue; - private String customRequestParam; - - private KmsFilterType(String val, String customRequestParam) { - this.typeValue = val; - this.customRequestParam = customRequestParam; - } - - public String getCustomRequestParam() { - return customRequestParam; - } - - /** - * @param val - * filter type String value, ignoring case - * @return the filter type, {@link #HAT} if none found - */ - public static KmsFilterType parseType(String val) { - for (KmsFilterType t : KmsFilterType.values()) { - if (t.typeValue.equalsIgnoreCase(val)) { - return t; - } - } - return HAT; - } -} diff --git a/openvidu-demo/src/main/java/io/openvidu/demo/OpenViduSampleApp.java b/openvidu-demo/src/main/java/io/openvidu/demo/OpenViduSampleApp.java deleted file mode 100644 index 036f14b0..00000000 --- a/openvidu-demo/src/main/java/io/openvidu/demo/OpenViduSampleApp.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * (C) Copyright 2014 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo; - -import java.util.List; -import java.util.Map.Entry; -import java.util.SortedMap; -import java.util.TreeMap; - -import org.kurento.commons.ConfigFileManager; -import org.kurento.commons.PropertiesManager; -import org.kurento.jsonrpc.JsonUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.SpringApplication; -import org.springframework.context.annotation.Bean; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; - -import io.openvidu.server.OpenViduServer; -import io.openvidu.server.core.NotificationRoomManager; -import io.openvidu.server.kms.KmsManager; -import io.openvidu.server.rpc.JsonRpcUserControl; - -import static org.kurento.commons.PropertiesManager.getPropertyJson; - -/** - * Demo application for Kurento Room, extends the Room Server application class. Uses the Room - * Client JS library for the web client, which is built with AngularJS and lumx. - * - * @author Micael Gallego (micael.gallego@gmail.com) - * @author Radu Tom Vlad (rvlad@naevatec.com) - * @since 5.0.0 - */ -public class OpenViduSampleApp extends OpenViduServer { - - private static final Logger log = LoggerFactory.getLogger(OpenViduSampleApp.class); - - public final static String KROOMDEMO_CFG_FILENAME = "kurento-room-demo.conf.json"; - - private static JsonObject DEFAULT_HAT_COORDS = new JsonObject(); - private static JsonObject DEFAULT_MARKER_URLS = new JsonObject(); - - static { - ConfigFileManager.loadConfigFile(KROOMDEMO_CFG_FILENAME); - DEFAULT_HAT_COORDS.addProperty("offsetXPercent", -0.35F); - DEFAULT_HAT_COORDS.addProperty("offsetYPercent", -1.2F); - DEFAULT_HAT_COORDS.addProperty("widthPercent", 1.6F); - DEFAULT_HAT_COORDS.addProperty("heightPercent", 1.6F); - - DEFAULT_MARKER_URLS.addProperty("0", "kurento-rect-logo.png"); - } - - private static final String IMG_FOLDER = "img/"; - - private final static String DEFAULT_APP_SERVER_URL = - PropertiesManager.getProperty("app.uri", "https://localhost:8443"); - private final static String APP_SERVER_URL = - System.getProperty("app.server.url", DEFAULT_APP_SERVER_URL); - - private final Integer DEMO_KMS_NODE_LIMIT = PropertiesManager.getProperty("demo.kmsLimit", 1000); - private final String DEMO_AUTH_REGEX = PropertiesManager.getProperty("demo.authRegex"); - - public final static String DEMO_FILTER_TYPE = - PropertiesManager.getProperty("demo.filterType", "hat"); - - private final String DEMO_HAT_URL = - PropertiesManager.getProperty("demo.hatUrl", "mario-wings.png"); - private final JsonObject DEMO_HAT_COORDS = PropertiesManager - .getPropertyJson("demo.hatCoords", DEFAULT_HAT_COORDS.toString(), JsonObject.class); - - private final JsonObject DEMO_MARKER_URLS = PropertiesManager - .getPropertyJson("demo.markerUrls", DEFAULT_MARKER_URLS.toString(), JsonObject.class); - - @Override - public KmsManager kmsManager() { - JsonArray kmsUris = getPropertyJson(OpenViduServer.KMSS_URIS_PROPERTY, - OpenViduServer.KMSS_URIS_DEFAULT, JsonArray.class); - List kmsWsUris = JsonUtils.toStringList(kmsUris); - - log.info("Configuring Kurento Room Server to use the following kmss: {}", kmsWsUris); - - FixedNKmsManager fixedKmsManager = new FixedNKmsManager(kmsWsUris, DEMO_KMS_NODE_LIMIT); - fixedKmsManager.setAuthRegex(DEMO_AUTH_REGEX); - log.debug("Authorization regex for new rooms: {}", DEMO_AUTH_REGEX); - return fixedKmsManager; - } - - @Override - public JsonRpcUserControl userControl() { - DemoJsonRpcUserControl uc = new DemoJsonRpcUserControl(notificationRoomManager()); - - KmsFilterType type = KmsFilterType.parseType(DEMO_FILTER_TYPE); - log.info("Configuring demo with filter type: {} (parsed is {})", DEMO_FILTER_TYPE, type); - - uc.setFilterType(type); - - switch (type) { - case MARKER: - SortedMap sortedUrls = new TreeMap<>(); - getMarkerUrls(sortedUrls); - uc.setMarkerUrls(sortedUrls); - break; - case HAT: - default: - uc.setHatUrl(getFullUrl(DEMO_HAT_URL)); - uc.setHatCoords(DEMO_HAT_COORDS); - } - - return uc; - } - - @Bean - public NotificationRoomManager notificationRoomManager() { - DemoNotificationRoomHandler notificationRoomHandler = - new DemoNotificationRoomHandler(notificationService()); - - KmsFilterType type = KmsFilterType.parseType(DEMO_FILTER_TYPE); - - switch (type) { - case MARKER: - SortedMap sortedUrls = new TreeMap<>(); - getMarkerUrls(sortedUrls); - - notificationRoomHandler.setMarkerUrls(sortedUrls); - break; - default: - } - - return new NotificationRoomManager(); - } - - private void getMarkerUrls(SortedMap sortedUrls) { - for (Entry entry : DEMO_MARKER_URLS.entrySet()) { - try { - Integer order = Integer.parseInt(entry.getKey()); - if (order < 0) { - throw new Exception("Illegal configuration, marker url index has to be positive"); - } - String url = entry.getValue().getAsString(); - sortedUrls.put(order, getFullUrl(url)); - } catch (Exception e) { - log.warn("Unable to process marker url [{}] from config file {}", entry, - KROOMDEMO_CFG_FILENAME, e); - } - } - } - - private static String getFullUrl(String url) { - if (APP_SERVER_URL.endsWith("/")) { - return APP_SERVER_URL + IMG_FOLDER + url; - } else { - return APP_SERVER_URL + "/" + IMG_FOLDER + url; - } - } - - public static void main(String[] args) throws Exception { - log.info("Using /dev/urandom for secure random generation"); - System.setProperty("java.security.egd", "file:/dev/./urandom"); - SpringApplication.run(OpenViduSampleApp.class, args); - } -} diff --git a/openvidu-demo/src/main/resources/application.properties b/openvidu-demo/src/main/resources/application.properties deleted file mode 100644 index e74781b1..00000000 --- a/openvidu-demo/src/main/resources/application.properties +++ /dev/null @@ -1,12 +0,0 @@ -server.port: 8443 -server.address: 0.0.0.0 -server.ssl.key-store: classpath:keystore.jks -server.ssl.key-store-password: kurento -server.ssl.keyStoreType: JKS -server.ssl.keyAlias: kurento-selfsigned -server.context-path: / - -kms.uris=[\"ws://localhost:8888/kurento\"] - -openvidu.secret: MY_SECRET -openvidu.security: true \ No newline at end of file diff --git a/openvidu-demo/src/main/resources/banner.txt b/openvidu-demo/src/main/resources/banner.txt deleted file mode 100644 index dd03e860..00000000 --- a/openvidu-demo/src/main/resources/banner.txt +++ /dev/null @@ -1,9 +0,0 @@ - - .------------------------------------. - | | - | | |/ / _ _ _ ___ _ _| |_ ___ | - | | ' < || | '_/ -_) ' \ _/ _ \ | - | |_|\_\_,_|_| \___|_||_\__\___/ | - | | - '------------------------------------' - version ${project.version} diff --git a/openvidu-demo/src/main/resources/keystore.jks b/openvidu-demo/src/main/resources/keystore.jks deleted file mode 100644 index c13f80382cbaef224ef743a75c779297f2547b43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2232 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 - -
- -
- - - -
- - - -
{{roomName}}
-
- - - - - - - - -
- -
- - - -
-
- - - - -
- -
- diff --git a/openvidu-demo/src/main/resources/static/angular/call/callController.js b/openvidu-demo/src/main/resources/static/angular/call/callController.js deleted file mode 100644 index f0931805..00000000 --- a/openvidu-demo/src/main/resources/static/angular/call/callController.js +++ /dev/null @@ -1,194 +0,0 @@ -/* - * @author Micael Gallego (micael.gallego@gmail.com) - * @author Raquel Díaz González - */ - -openVidu_room.controller('callController', function ($scope, $window, ServiceParticipant, ServiceRoom, Fullscreen, LxNotificationService) { - - $scope.roomName = ServiceRoom.getRoomName(); - $scope.userName = ServiceRoom.getUserName(); - $scope.participants = ServiceParticipant.getParticipants(); - $scope.openVidu = ServiceRoom.getOpenVidu(); - $scope.filter = ServiceRoom.getFilterRequestParam(); - - $scope.leaveRoom = function () { - - ServiceRoom.closeOpenVidu(); - - ServiceParticipant.removeParticipants(); - - //redirect to login - $window.location.href = '#/login'; - }; - - window.onbeforeunload = function () { - //not necessary if not connected - if (ServiceParticipant.isConnected()) { - ServiceRoom.closeOpenVidu(); - } - }; - - $scope.$on("$locationChangeStart", function () { - console.log("Changed location to: " + document.location); - if (ServiceParticipant.isConnected()) { - ServiceRoom.closeOpenVidu(); - ServiceParticipant.removeParticipants(); - } - }); - - $scope.goFullscreen = function () { - - if (Fullscreen.isEnabled()) - Fullscreen.cancel(); - else - Fullscreen.all(); - - }; - - $scope.disableMainSpeaker = function (value) { - - var element = document.getElementById("buttonMainSpeaker"); - if (element.classList.contains("md-person")) { //on - element.classList.remove("md-person"); - element.classList.add("md-recent-actors"); - ServiceParticipant.enableMainSpeaker(); - } else { //off - element.classList.remove("md-recent-actors"); - element.classList.add("md-person"); - ServiceParticipant.disableMainSpeaker(); - } - } - - $scope.onOffVolume = function () { - var localStream = ServiceRoom.getLocalStream(); - var element = document.getElementById("buttonVolume"); - if (element.classList.contains("md-volume-off")) { //on - element.classList.remove("md-volume-off"); - element.classList.add("md-volume-up"); - localStream.audioEnabled = true; - } else { //off - element.classList.remove("md-volume-up"); - element.classList.add("md-volume-off"); - localStream.audioEnabled = false; - - } - }; - - $scope.onOffVideocam = function () { - var localStream = ServiceRoom.getLocalStream(); - var element = document.getElementById("buttonVideocam"); - if (element.classList.contains("md-videocam-off")) {//on - element.classList.remove("md-videocam-off"); - element.classList.add("md-videocam"); - localStream.videoEnabled = true; - } else {//off - element.classList.remove("md-videocam"); - element.classList.add("md-videocam-off"); - localStream.videoEnabled = false; - } - }; - - $scope.disconnectStream = function () { - var localStream = ServiceRoom.getLocalStream(); - var participant = ServiceParticipant.getMainParticipant(); - if (!localStream || !participant) { - LxNotificationService.alert('Error!', "Not connected yet", 'Ok', function (answer) { - }); - return false; - } - ServiceParticipant.disconnectParticipant(participant); - ServiceRoom.getOpenVidu().disconnectParticipant(participant.getStream()); - } - - //chat - $scope.message; - - $scope.sendMessage = function () { - console.log("Sending message", $scope.message); - var openVidu = ServiceRoom.getOpenVidu(); - openVidu.sendMessage($scope.roomName, $scope.userName, $scope.message); - $scope.message = ""; - }; - - //open or close chat when click in chat button - $scope.toggleChat = function () { - var selectedEffect = "slide"; - // most effect types need no options passed by default - var options = {direction: "right"}; - if ($("#effect").is(':visible')) { - $("#content").animate({width: '100%'}, 500); - } else { - $("#content").animate({width: '80%'}, 500); - } - // run the effect - $("#effect").toggle(selectedEffect, options, 500); - }; - - var style = { - hat: { - "-1": "btn--indigo md-mood", - "0": "btn--amber md-face-unlock" - }, - marker: { - "-1": "btn--indigo md-grid-off", - "0": "btn--amber md-grid-on", - "1": "btn--red md-grid-on" - } - }; - - $scope.filterIndex = "-1"; //off - $scope.filterState; - $scope.filterStyle; - updateFilterValues(); - - function updateFilterValues() { - $scope.filterState = parseInt($scope.filterIndex) < 0 ? "off" : "on"; - $scope.filterStyle = style[$scope.filter][$scope.filterIndex]; - } - - $scope.applyFilter = function () { - var reqParams = {}; - if ($scope.filter === "marker") { - reqParams[$scope.filter] = parseInt($scope.filterIndex); - } else { - if (parseInt($scope.filterIndex) < 0) { //off -> on - $scope.filterIndex = "0"; - reqParams[$scope.filter] = true; - } else { //on -> off - $scope.filterIndex = "-1"; - reqParams[$scope.filter] = false; - } - } - - ServiceRoom.getOpenVidu().sendCustomRequest(reqParams, function (error, response) { - if (error) { - console.error("Unable to toggle filter, currently " + - $scope.filterState, error); - LxNotificationService.alert('Error!', - "Unable to toggle filter, currently " + $scope.filterState, - 'Ok', function (answer) { - }); - return false; - } else { - if ($scope.filter === "marker") { - return; - } - - updateFilterValues(); - console.log("Toggled filter " + $scope.filterState + " (idx " + - $scope.filterIndex + ")"); - } - }); - }; - - ServiceParticipant.addEventListener("marker-filter-status-changed", function (status) { - console.log("Filter status changed", status); - if ($scope.filter === "marker") { - $scope.filterIndex = status; - updateFilterValues(); - $scope.$apply(); - } - }); -}); - - diff --git a/openvidu-demo/src/main/resources/static/angular/login/login.html b/openvidu-demo/src/main/resources/static/angular/login/login.html deleted file mode 100644 index f10b9a42..00000000 --- a/openvidu-demo/src/main/resources/static/angular/login/login.html +++ /dev/null @@ -1,74 +0,0 @@ - -
-
Kurento Room
- -
-
- -
- - - - - Invalid, please use: - a-zA-Z0-9 - -
- -
- - - - - Allowed chars: - a-zA-Z0-9 -
- -
- - - {{ $selected }} - - - - {{ $choice }} - - -
- -
- -
- -
-
-
- -
-
- -
-
-
-
- -
-
- -
-
- - - -
- -
- -
-
- -
- diff --git a/openvidu-demo/src/main/resources/static/angular/login/loginController.js b/openvidu-demo/src/main/resources/static/angular/login/loginController.js deleted file mode 100644 index fad4fd57..00000000 --- a/openvidu-demo/src/main/resources/static/angular/login/loginController.js +++ /dev/null @@ -1,210 +0,0 @@ -/* - * @author Micael Gallego (micael.gallego@gmail.com) - * @author Radu Tom Vlad - */ - -openVidu_room.controller('loginController', function($scope, $rootScope, $http, - $window, $routeParams, ServiceParticipant, ServiceRoom, LxNotificationService) { - - $scope.existingRoomName = false; - $scope.roomPickerClass = 'grid__col6'; - $scope.roomPickerLabel = 'Room'; - var name = $routeParams["existingRoomName"]; - if (name && name.length > 0) { - $scope.room = { - roomName: name - } - $scope.existingRoomName = true; - $scope.roomPickerClass = 'grid__col'; - $scope.roomPickerLabel = 'Fixed room name'; - } - - $scope.nameValidation = function(name) { - return /^[a-zA-Z0-9]+$/.test(name); - }; - - $rootScope.isParticipant = false; - - var contextpath = (location.pathname == '/') ? '' : location.pathname; - - $rootScope.contextpath = (location.pathname == '/') ? '' : location.pathname; - - var roomsFragment = $rootScope.contextpath.endsWith('/') ? '#/rooms/' : '/#/rooms/'; - - $http.get($rootScope.contextpath + '/getAllRooms').success(function(data, status, headers, config) { - console.log(JSON.stringify(data)); - $scope.listRooms = data; - }).error(function(data, status, headers, config) {}); - - $http.get($rootScope.contextpath + '/getClientConfig').success(function(data, status, headers, config) { - console.log(JSON.stringify(data)); - $scope.clientConfig = data; - }).error(function(data, status, headers, config) {}); - - $http.get($rootScope.contextpath + '/getUpdateSpeakerInterval').success(function(data, status, headers, config) { - $scope.updateSpeakerInterval = data - }).error(function(data, status, headers, config) {}); - - $http.get($rootScope.contextpath + '/getThresholdSpeaker').success(function(data, status, headers, config) { - $scope.thresholdSpeaker = data - }).error(function(data, status, headers, config) {}); - - $scope.register = function(room) { - - if (!room) - ServiceParticipant.showError($window, LxNotificationService, { - error: { - message: "Username and room fields are both required" - } - }, contextpath); - - $scope.userName = room.userName; - $scope.roomName = room.roomName; - - var wsUri = 'wss://' + location.host + $rootScope.contextpath + '/room'; - - //show loopback stream from server - var displayPublished = $scope.clientConfig.loopbackRemote || false; - //also show local stream when display my remote - var mirrorLocal = $scope.clientConfig.loopbackAndLocal || false; - - var openVidu = OpenVidu(wsUri, function(error, openVidu) { - - if (error) { - return console.error('Error in OpenVidu client', error); - } - - //TODO token should be generated by the server or a 3rd-party component - //openVidu.setRpcParams({token : "securityToken"}); - - room = openVidu.Room({ - room: $scope.roomName, - user: $scope.userName, - updateSpeakerInterval: $scope.updateSpeakerInterval, - thresholdSpeaker: $scope.thresholdSpeaker - }); - - var localStream = openVidu.Stream(room, { - audio: true, - video: true, - data: false - }); - - localStream.addEventListener("access-accepted", function() { - room.addEventListener("room-connected", function(roomEvent) { - var streams = roomEvent.streams; - if (displayPublished) { - localStream.subscribeToMyRemote(); - } - localStream.publish(); - ServiceRoom.setLocalStream(localStream.getWebRtcPeer()); - for (var i = 0; i < streams.length; i++) { - ServiceParticipant.addParticipant(streams[i]); - } - }); - - room.addEventListener("stream-published", function(streamEvent) { - ServiceParticipant.addLocalParticipant(localStream); - if (mirrorLocal && localStream.displayMyRemote()) { - var localVideo = openVidu.Stream(room, { - video: true, - id: "localStream" - }); - localVideo.mirrorLocalStream(localStream.getWrStream()); - ServiceParticipant.addLocalMirror(localVideo); - } - }); - - room.addEventListener("stream-added", function(streamEvent) { - ServiceParticipant.addParticipant(streamEvent.stream); - }); - - room.addEventListener("stream-removed", function(streamEvent) { - ServiceParticipant.removeParticipantByStream(streamEvent.stream); - }); - - room.addEventListener("newMessage", function(msg) { - ServiceParticipant.showMessage(msg.room, msg.user, msg.message); - }); - - room.addEventListener("error-room", function(error) { - ServiceParticipant.showError($window, LxNotificationService, error, contextpath); - }); - - room.addEventListener("error-media", function(msg) { - ServiceParticipant.alertMediaError($window, LxNotificationService, msg.error, contextPath, function(answer) { - console.warn("Leave room because of error: " + answer); - if (answer) { - openVidu.close(true); - } - }); - }); - - room.addEventListener("room-closed", function(msg) { - if (msg.room !== $scope.roomName) { - console.error("Closed room name doesn't match this room's name", - msg.room, $scope.roomName); - } else { - openVidu.close(true); - ServiceParticipant.forceClose($window, LxNotificationService, 'Room ' + - msg.room + ' has been forcibly closed from server', contextpath); - } - }); - - room.addEventListener("lost-connection", function(msg) { - openVidu.close(true); - ServiceParticipant.forceClose($window, LxNotificationService, - 'Lost connection with room "' + msg.room + - '". Please try reloading the webpage...'); - }, contextpath); - - room.addEventListener("stream-stopped-speaking", function(participantId) { - ServiceParticipant.streamStoppedSpeaking(participantId); - }); - - room.addEventListener("stream-speaking", function(participantId) { - ServiceParticipant.streamSpeaking(participantId); - }); - - room.addEventListener("update-main-speaker", function(participantId) { - ServiceParticipant.updateMainSpeaker(participantId); - }); - - room.addEventListener("custom-message-received", function(data) { - if (data.params.MarkerFilterState !== undefined) { - ServiceParticipant.changeMarkerFilterStatus(data.params.MarkerFilterState); - } - }); - - room.connect(); - }); - - localStream.addEventListener("access-denied", function() { - ServiceParticipant.showError($window, LxNotificationService, { - error: { - message: "Access not granted to camera and microphone" - } - }); - }, contextpath); - localStream.init(); - }); - - //save openVidu & roomName & userName in service - ServiceRoom.setOpenVidu(openVidu); - ServiceRoom.setRoomName($scope.roomName); - ServiceRoom.setUserName($scope.userName); - ServiceRoom.setFilterRequestParam($scope.clientConfig.filterRequestParam); - - $rootScope.isParticipant = true; - - //redirect to call - $window.location.href = '#/call'; - }; - $scope.clear = function() { - $scope.room = ""; - $scope.updateRoomUrl(); - }; - $scope.updateRoomUrl = function(roomName) { - $scope.roomUrl = (roomName && roomName.length > 0) ? location.protocol + '//' + location.host + $rootScope.contextpath + roomsFragment + roomName : ''; - }; -}); \ No newline at end of file diff --git a/openvidu-demo/src/main/resources/static/angular/services/Participants.js b/openvidu-demo/src/main/resources/static/angular/services/Participants.js deleted file mode 100644 index 8ee58c78..00000000 --- a/openvidu-demo/src/main/resources/static/angular/services/Participants.js +++ /dev/null @@ -1,399 +0,0 @@ -/* - * (C) Copyright 2016 OpenVidu (http://openvidu.io/) - * - * 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. - * - */ -function AppParticipant(stream) { - - this.stream = stream; - this.videoElement; - this.thumbnailId; - this.mainVideo; - var that = this; - - this.getStream = function () { - return this.stream; - } - - this.setMain = function () { - that.videoElement.className += " active-video"; - var mainVideosParent = document.getElementById('main-video'); - - if (elementExists(that.mainVideo)) { - $(that.mainVideo).show(); - } else { - that.mainVideo = stream.playOnlyVideo(mainVideosParent, that.thumbnailId); - } - } - - this.removeMain = function () { - $(that.videoElement).removeClass("active-video"); - if (elementExists(that.mainVideo)) { - $(that.mainVideo).hide(); - } else { - console.warn(stream.getGlobalID() + ': no main video element to remove'); - } - } - - this.remove = function () { - if (that.videoElement !== undefined) { - if (that.videoElement.parentNode !== null) { - that.videoElement.parentNode.removeChild(that.videoElement); - } - } - } - - function elementExists(element) { - return element !== undefined && element.id !== undefined && $('#' + element.id).length > 0; - } - - function playVideo() { - - that.thumbnailId = "video-" + stream.getGlobalID(); - - that.videoElement = document.createElement('div'); - that.videoElement.setAttribute("id", that.thumbnailId); - that.videoElement.className = "video"; - - var speakerSpeakingVolumen = document.createElement('div'); - speakerSpeakingVolumen.setAttribute("id", "speaker" + that.thumbnailId); - speakerSpeakingVolumen.className = 'btn--m btn--green btn--fab mdi md-volume-up blinking'; - speakerSpeakingVolumen.style.position = "absolute"; - speakerSpeakingVolumen.style.left = "3%"; - speakerSpeakingVolumen.style.top = "60%"; - speakerSpeakingVolumen.style.zIndex = "100"; - speakerSpeakingVolumen.style.display = "none"; - that.videoElement.appendChild(speakerSpeakingVolumen); - - document.getElementById("participants").appendChild(that.videoElement); - that.stream.playThumbnail(that.thumbnailId); - } - - playVideo(); -} - -function Participants() { - - var mainParticipant; - var localParticipant; - var mirrorParticipant; - var participants = {}; - var roomName; - var that = this; - var connected = true; - var displayingRelogin = false; - var mainSpeaker = true; - - var ee = new EventEmitter(); - - this.isConnected = function () { - return connected; - } - - this.getRoomName = function () { - console.log("room - getRoom " + roomName); - roomName = room.name; - return roomName; - }; - - this.getMainParticipant = function () { - return mainParticipant; - } - - function updateVideoStyle() { - var MAX_WIDTH = 14; - var numParticipants = Object.keys(participants).length; - var maxParticipantsWithMaxWidth = 98 / MAX_WIDTH; - - if (numParticipants > maxParticipantsWithMaxWidth) { - $('.video').css({ - "width": (98 / numParticipants) + "%" - }); - } else { - $('.video').css({ - "width": MAX_WIDTH + "%" - }); - } - }; - - function updateMainParticipant(participant) { - if (!mainParticipant || (mainParticipant != participant)) { - if (mainParticipant) { - mainParticipant.removeMain(); - } - mainParticipant = participant; - mainParticipant.setMain(); - } - } - - this.addLocalParticipant = function (stream) { - localParticipant = that.addParticipant(stream); - mainParticipant = localParticipant; - mainParticipant.setMain(); - }; - - this.addLocalMirror = function (stream) { - mirrorParticipant = that.addParticipant(stream); - }; - - this.addParticipant = function (stream) { - - var participant = new AppParticipant(stream); - participants[stream.getGlobalID()] = participant; - - updateVideoStyle(); - - $(participant.videoElement).click(function (e) { - updateMainParticipant(participant); - }); - - //updateMainParticipant(participant); - - return participant; - }; - - this.removeParticipantByStream = function (stream) { - this.removeParticipant(stream.getGlobalID()); - }; - - this.disconnectParticipant = function (appParticipant) { - this.removeParticipant(appParticipant.getStream().getGlobalID()); - }; - - this.removeParticipant = function (streamId) { - var participant = participants[streamId]; - delete participants[streamId]; - participant.remove(); - - if (mirrorParticipant) { - var otherLocal = null; - if (participant === localParticipant) { - otherLocal = mirrorParticipant; - } - if (participant === mirrorParticipant) { - otherLocal = localParticipant; - } - if (otherLocal) { - console.log("Removed local participant (or mirror) so removing the other local as well"); - delete participants[otherLocal.getStream().getGlobalID()]; - otherLocal.remove(); - } - } - - //setting main - if (mainParticipant && mainParticipant === participant) { - var mainIsLocal = false; - if (localParticipant) { - if (participant !== localParticipant && participant !== mirrorParticipant) { - mainParticipant = localParticipant; - mainIsLocal = true; - } else { - localParticipant = null; - mirrorParticipant = null; - } - } - if (!mainIsLocal) { - var keys = Object.keys(participants); - if (keys.length > 0) { - mainParticipant = participants[keys[0]]; - } else { - mainParticipant = null; - } - } - if (mainParticipant) { - mainParticipant.setMain(); - console.log("Main video from " + mainParticipant.getStream().getGlobalID()); - } else - console.error("No media streams left to display"); - } - - updateVideoStyle(); - }; - - //only called when leaving the room - this.removeParticipants = function () { - connected = false; - for (var index in participants) { - var participant = participants[index]; - participant.remove(); - } - participants = []; - }; - - this.getParticipants = function () { - return participants; - }; - - this.enableMainSpeaker = function () { - mainSpeaker = true; - } - - this.disableMainSpeaker = function () { - mainSpeaker = false; - } - - // Open the chat automatically when a message is received - function autoOpenChat() { - var selectedEffect = "slide"; - var options = {direction: "right"}; - if ($("#effect").is(':hidden')) { - $("#content").animate({width: '80%'}, 500); - $("#effect").toggle(selectedEffect, options, 500); - } - }; - - this.showMessage = function (room, user, message) { - var ul = document.getElementsByClassName("list"); - - var chatDiv = document.getElementById('chatDiv'); - var messages = $("#messages"); - var updateScroll = true; - if (messages.outerHeight() - chatDiv.scrollTop > chatDiv.offsetHeight) { - updateScroll = false; - } - - var vetext = localParticipant.videoElement.textContent || localParticipant.videoElement.innerText; - var localUser = vetext.replace("_webcam", ""); - if (user === localUser) { //me - - var li = document.createElement('li'); - li.className = "list-row list-row--has-primary list-row--has-separator"; - var div1 = document.createElement("div1"); - div1.className = "list-secondary-tile"; - var img = document.createElement("img"); - img.className = "list-primary-tile__img"; - img.setAttribute("src", "http://ui.lumapps.com/images/placeholder/2-square.jpg"); - var div2 = document.createElement('div'); - div2.className = "list-content-tile list-content-tile--two-lines"; - var strong = document.createElement('strong'); - strong.innerHTML = user; - var span = document.createElement('span'); - span.innerHTML = message; - div2.appendChild(strong); - div2.appendChild(span); - div1.appendChild(img); - li.appendChild(div1); - li.appendChild(div2); - ul[0].appendChild(li); - - } else {//others - - var li = document.createElement('li'); - li.className = "list-row list-row--has-primary list-row--has-separator"; - var div1 = document.createElement("div1"); - div1.className = "list-primary-tile"; - var img = document.createElement("img"); - img.className = "list-primary-tile__img"; - img.setAttribute("src", "http://ui.lumapps.com/images/placeholder/1-square.jpg"); - var div2 = document.createElement('div'); - div2.className = "list-content-tile list-content-tile--two-lines"; - var strong = document.createElement('strong'); - strong.innerHTML = user; - var span = document.createElement('span'); - span.innerHTML = message; - div2.appendChild(strong); - div2.appendChild(span); - div1.appendChild(img); - li.appendChild(div1); - li.appendChild(div2); - ul[0].appendChild(li); - autoOpenChat(); - } - - if (updateScroll) { - chatDiv.scrollTop = messages.outerHeight(); - } - }; - - this.showError = function ($window, LxNotificationService, e, contextPath) { - if (displayingRelogin) { - console.warn('Already displaying an alert that leads to relogin'); - return false; - } - displayingRelogin = true; - that.removeParticipants(); - LxNotificationService.alert('Error!', e.error.message, 'Reconnect', function (answer) { - displayingRelogin = false; - relogin($window, contextPath); - }); - }; - - this.forceClose = function ($window, LxNotificationService, msg, contextPath) { - if (displayingRelogin) { - console.warn('Already displaying an alert that leads to relogin'); - return false; - } - displayingRelogin = true; - that.removeParticipants(); - LxNotificationService.alert('Warning!', msg, 'Reload', function (answer) { - displayingRelogin = false; - relogin($window, contextPath); - }); - }; - - this.alertMediaError = function ($window, LxNotificationService, msg, contextPath, callback) { - if (displayingRelogin) { - console.warn('Already displaying an alert that leads to relogin'); - return false; - } - LxNotificationService.confirm('Warning!', 'Server media error: ' + msg - + ". Please reconnect.", {cancel: 'Disagree', ok: 'Agree'}, - function (answer) { - console.log("User agrees upon media error: " + answer); - if (answer) { - that.removeParticipants(); - relogin($window, contextPath); - } - if (typeof callback === "function") { - callback(answer); - } - }); - }; - - function relogin($window, contextPath) { - //TODO call leaveRoom() in openVidu - contextPath = contextPath || '/'; - $window.location.href = contextPath; //'#/login'; - } - - this.streamSpeaking = function (participantId) { - if (participants[participantId.participantId] != undefined) - document.getElementById("speaker" + participants[participantId.participantId].thumbnailId).style.display = ''; - } - - this.streamStoppedSpeaking = function (participantId) { - if (participants[participantId.participantId] != undefined) - document.getElementById("speaker" + participants[participantId.participantId].thumbnailId).style.display = "none"; - } - - this.updateMainSpeaker = function (participantId) { - if (participants[participantId.participantId] != undefined) { - if (mainSpeaker) - updateMainParticipant(participants[participantId.participantId]); - } - } - - this.changeMarkerFilterStatus = function (status) { - this.emitEvent("marker-filter-status-changed", [status]); - console.log("New filter status: " + status); - }; - - this.addEventListener = function (eventName, listener) { - ee.addListener(eventName, listener); - }; - - this.emitEvent = function (eventName, eventsArray) { - ee.emitEvent(eventName, eventsArray); - }; -} \ No newline at end of file diff --git a/openvidu-demo/src/main/resources/static/angular/services/serviceParticipant.js b/openvidu-demo/src/main/resources/static/angular/services/serviceParticipant.js deleted file mode 100644 index 025915d8..00000000 --- a/openvidu-demo/src/main/resources/static/angular/services/serviceParticipant.js +++ /dev/null @@ -1,9 +0,0 @@ -/* - * @author Raquel Díaz González - */ - -openVidu_room.factory('ServiceParticipant', function () { - - return new Participants(); - -}); \ No newline at end of file diff --git a/openvidu-demo/src/main/resources/static/angular/services/serviceRoom.js b/openvidu-demo/src/main/resources/static/angular/services/serviceRoom.js deleted file mode 100644 index 64590808..00000000 --- a/openvidu-demo/src/main/resources/static/angular/services/serviceRoom.js +++ /dev/null @@ -1,60 +0,0 @@ -/* - * @author Raquel Díaz González - */ - -openVidu_room.service('ServiceRoom', function () { - - var openVidu; - var roomName; - var userName; - var localStream; - var filterRequestParam; - - this.getOpenVidu = function () { - return openVidu; - }; - - this.getRoomName = function () { - return roomName; - }; - - this.setOpenVidu = function (value) { - openVidu = value; - }; - - this.setRoomName = function (value) { - roomName = value; - }; - - this.getLocalStream = function () { - return localStream; - }; - - this.setLocalStream = function (value) { - localStream = value; - }; - - this.getUserName = function () { - return userName; - }; - - this.setUserName = function (value) { - userName = value; - }; - - this.closeOpenVidu = function () { - if (openVidu && openVidu instanceof OpenVidu) { - openVidu.close(); - } else { - console.log('OpenVidu instance is not set'); - } - }; - - this.getFilterRequestParam = function () { - return filterRequestParam; - }; - - this.setFilterRequestParam = function (value) { - filterRequestParam = value; - }; -}); diff --git a/openvidu-demo/src/main/resources/static/css/googleapis-fonts.css b/openvidu-demo/src/main/resources/static/css/googleapis-fonts.css deleted file mode 100644 index fbb4db72..00000000 --- a/openvidu-demo/src/main/resources/static/css/googleapis-fonts.css +++ /dev/null @@ -1,56 +0,0 @@ -/* cyrillic-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: local('Open Sans'), local('OpenSans'), url(//fonts.gstatic.com/s/opensans/v13/K88pR3goAWT7BTt32Z01mxJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); - unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; -} -/* cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: local('Open Sans'), local('OpenSans'), url(//fonts.gstatic.com/s/opensans/v13/RjgO7rYTmqiVp7vzi-Q5URJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: local('Open Sans'), local('OpenSans'), url(//fonts.gstatic.com/s/opensans/v13/LWCjsQkB6EMdfHrEVqA1KRJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: local('Open Sans'), local('OpenSans'), url(//fonts.gstatic.com/s/opensans/v13/xozscpT2726on7jbcb_pAhJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: local('Open Sans'), local('OpenSans'), url(//fonts.gstatic.com/s/opensans/v13/59ZRklaO5bWGqF5A9baEERJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); - unicode-range: U+0102-0103, U+1EA0-1EF1, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: local('Open Sans'), local('OpenSans'), url(//fonts.gstatic.com/s/opensans/v13/u-WUoqrET9fUeobQW7jkRRJtnKITppOI_IvcXXDNrsc.woff2) format('woff2'); - unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: local('Open Sans'), local('OpenSans'), url(//fonts.gstatic.com/s/opensans/v13/cJZKeOuBrn4kERxqtaUH3VtXRa8TVwTICgirnJhmVJw.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; -} \ No newline at end of file diff --git a/openvidu-demo/src/main/resources/static/css/room.css b/openvidu-demo/src/main/resources/static/css/room.css deleted file mode 100644 index 3610c213..00000000 --- a/openvidu-demo/src/main/resources/static/css/room.css +++ /dev/null @@ -1,240 +0,0 @@ -html, body { - height: 100%; -} - -#buttonActions>button{ - font-size: 1.9rem; -} - -#room{ - height: 100%; -} - -* { - margin: 0px; - padding: 0px; - overflow: hidden -} - -body { - font-family: 'Open Sans', sans-serif; -} - -.roomUrl { - margin: 40px auto 30px; -} - -#main-video { - height: 100%; - width: 100%; - position: absolute; - top: 0; - bottom: 0; - right: 0; - left: 0; -} - -#main-video>video { - height: 100%; - width: 100%; - position: absolute; - top: 0; - bottom: 0; - right: 0; - left: 0; -} - -#main-video video { - object-fit: contain; -} - -video { - width: 100%; -} - -#content { - background-color: black; - position: absolute; - top: 0px; - left: 0px; - right: 70%; - height: 100%; - width: 100%; -} - -#participants { - position: absolute; - bottom: 0px; - right: 0px; - box-sizing: border-box; - width: 100%; - float: right; - margin: 1em; -} - -.name { - position: absolute; - top: 0px; - bottom: 0px; - left: 0px; - z-index: 99; - background-color: transparent; - margin: 0.5em; - text-shadow: 0px 0px 10px #000000; -} - -.active-video { - border: 2px solid white; -} - -.active-audio { - border: 2px solid blue; -} - -.blinking { - - animation-name: blinking; - animation-duration: 2s; - animation-timing-function: linear; - animation-iteration-count: infinite; - - -webkit-animation-name: blinking; - -webkit-animation-duration: 2s; - -webkit-animation-timing-function: linear; - -webkit-animation-iteration-count: infinite; -} - -@-moz-keyframes blinking{ - 0% { opacity: 1.0; } - 50% { opacity: 0.0; } - 100% { opacity: 1.0; } -} - -@-webkit-keyframes blinking { - 0% { opacity: 1.0; } - 50% { opacity: 0.0; } - 100% { opacity: 1.0; } -} - -@keyframes blinking { - 0% { opacity: 1.0; } - 50% { opacity: 0.0; } - 100% { opacity: 1.0; } -} - -.video { - width: 23%; - /* whatever width you want */ - position: relative; - float: right; - display: block; -} - -.video:after { - padding-top: 56.25%; - /* 16:9 ratio */ - display: block; - content: ''; -} - -.video>div { - position: absolute; - top: 0; - bottom: 0; - right: 0; - left: 0; - width: 100%; - /* fill parent */ - background-color: #000000; - /* let's see it! */ - color: white; - display: flex; - justify-content: center; - /* align horizontal */ - align-items: center; -} - -#logo { - position: absolute; - display: inline; - left: 0px; - top: 0px; - margin: 1em; -} - -#room-name { - display: inline; - width: 100%; - position: absolute; - margin: auto; - background-color: transparent; - margin: 0.5em; - text-shadow: 0px 0px 10px #000000; - text-align: center; - color: white; - font-weight: bold; - font-size: 2em; -} - -.join { - position: relative; - margin: auto; - width: 500px; - text-align: center; - vertical-align: middle; -} - -#join-title { - display: inline-flex; - font-size: 1.5em; - font-weight: bold; - color: #555; - padding-left: 70px; - padding-bottom: 35px; - padding-top: 35px; - background-image: url("../img/kurento.png"); - background-repeat: no-repeat; - background-position: left; - margin: auto 0 auto 0; -} - -/*.join p { - margin: 20px 0 0; -} - -.join p:first-child { - margin-top: 0; -} - -.join input[type=text], .join input[type=password] { - width: 278px; -} - -.join p.submit { - text-align: center; -}*/ - -:-moz-placeholder { - color: #c9c9c9 !important; - font-size: 13px; -} - -::-webkit-input-placeholder { - color: #ccc; - font-size: 13px; -} - -/*chat effect*/ - -#effect { - position: relative; - padding: 0.4em; -} - -.card__content { - padding: 16px; -} - -.card__actions { - border-top-width: 0px; -} diff --git a/openvidu-demo/src/main/resources/static/img/kurento-rect-logo.png b/openvidu-demo/src/main/resources/static/img/kurento-rect-logo.png deleted file mode 100644 index 8210e88d4b0c4d3f76c760c81cc418514ae726b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32568 zcmV*OKw-a$P)JuRBBX;%B-p`)m7ci>FF^e7hG`1e})V0XtKxL2E|Ha4DFGz3c>29~A+K;hT=*4!Z^Q#0GLZsE99SUY`IT|we16V% z&T)4oBElWHX(H(!Bs&nVL%a#e9;AIpc966OdI0GdOawZy?Z^VXw~Yi}^$pyLA|jA%SODlg=n0rH zB-@bmKo4zuIsh{P9f2N$9)XTQVlXKfZC{dt03z8t79ipSKBxdu0ir_i8Yr)Y_#N#&dyI2jciBTv4!Rg&ieo|E)VzTX$wWFNQP??N>XL+dV7_kQT! zi|XEsntK3gAA`mM%JXmHQ@MRb-Epz5FCtR7Ez*AvuKe#XJPFCVb)WRmS_d-*OlAqP z$6B`x*~faDZB*IeIfycVhypyoLkK{EY?}x8_Pqie-&z;H4Z%G49aJ!fgmb9oA?VzT z>fViNAA|1Q_H%RT3xAHcqTI0{2ap0B$u4aD16=)&)=k1t00IGJKn&o4$`o5cq3FuK zD+8j`41icrDUpnemG&`I_W{)Wan$@n zu=p^t_z0@GY&lQR0>6p!?x@Ed3vxh_qzC8zS6KhgsNtV%W2X0bSmjquP%T8YK{Y@H z*((GZph6S@l34@rYZk_UNfDEPBvqcGQ_u+}=QPItjZP75N~~u0rBoxk2YX#qU;!oA z>#GpFrsX<87u7m~nm-Q9Pv9MT8nyB`s(b7!c+y`lxdV`cNZNAycMwZ*)b-?Q)UN=*|(0MgbD#Vg*&nl^S*#)F@%S@V)_B4xbW$!wMG(z+U(IZqE zA?XOx5t5D}oj@9cjxE59wvjPoEu7>Au0V8tUp|F}Y9505%(5&#j9PpIHFr0(R#2Uz zsK(q^^$UDuat9y>k=ew4qn8Z3(j1ww8p@u^<){*7X8# zTp|0x;Vg!dtmILyBm+xQM#a)e297?G3~V?#*@L);L_H+hEj|+uEr@ht!J>RnEtJ>J z!pMFR2#`EDphD>0gSYYo>gWr2cfW#KeiRz>-zb8A2O!rHqaoda(RmnO0@KUL?_y>l zGUd-*CYAeKIPdk(IS_JwBBh(+s#M>~rYJsAfr6tG{abj%mp1VY%%g+dw6gVW_A>yS-*;IMYNWCgZj(t~t2FmQc zuu>ici8rYw>3R&w5Q+N`?^vKrHj&X9GFpSt1~T4;cn?WqdwAv&D&=P(WP5GF1204! zeG%{23wU=uk6Qi~s(Tj%EmUxO=2z|jKpv;vxc@n5uE%yK~1C0Y}5zA4M0Yp22$GSNcXT!exd!=>pvT_wKcL&L$Vlkv+BpE`~Lnd3+ zvJ5UG{maO39hvkX86(<8(qKK6za%Rc!wTGEj@_ptnB}6Z!x(8 zkXfR~u=fe1L-2htBMXi^;seu|aHRr{{kX+G`(1C_EUQE98g(F5-m^L{FDxT)DzqW4 zWCW9KWUz|#FJku2BfayO-USPocx3m@OIY&fVZ;*p`(ML<lRC998~O+gCx(<_>N`E!oq0` zaUU72BYPJyy>rOkC1kLUjJJ_!Xs_Xgs9?^5ZT?P`j!sPmT0KbvJ?W^oz! z92KsVeO7^0^soy-8}J~VSWYrr#q3=`cFth7&seK6>48pd0c4hp6tNLK@1eKxAN>ow z2j4)oj)30+KfL8Cjqd=&5s7zDco*Tq2jm1J%fxb4VqWJnJ&oa@XAJ<)Q2B!d?JDGb8&ARBIXKw^8jwsD%fR zrAJU3A7OURBjYUy6*LuiL*&Ycv@gG{Wq2gPRw14AWEHMd8E}-IFNFtDljarGO0E1Fh zOsIW8QuloJQ{IY2aJJ1N>6QIveF2%hU0v(g8d#=yOWmM3JVjI%0Si%Dfgiv^7utfP z+vxXyLGtTg5&!E&WU@l|($8r8)xRS+@iHn5XMBOLx7@KHW&)#2HuLN+WQBo~thdW~ zKn@frm39UnnW>0%G^p81onNDJc+pcI{-oH1dM0vk<2!blv(E- z5a5v5{6MbZ($tg`=e-g=suS^=^1Ixkev$gIbuLlA-qd!gBNeM3%0Kg$$~p>d-A>hN z!qFw@1jx=h=`T+a|NT28zxV|G=?3c1-Gr~aO!&&PsBUNaIo%@i%?8M11IAZv?UM4r z45)Gpr?)MXl4)0JN?hfxp3c5Yb-&u773Fp?Q#;9Qi!}uprU7uRZT0)izlRnZ+3U7Z z?FNJaG8~{!ZIJ%%Ba(mpfaKp!VXjP2!90zh{)q4|-nym10pE0hj4s0PtSwW=R>c-l z`0z6-ac@*ANfp!Sv5$T^kBL4e# zi2t8Ike*owEqDtH1ScM+`9J*~;VUoA`ZBkad@})J5?f=Xhk&sWt77OZ)f%h9)pF#z zag7<=BzMVfw1;u`Nl7d?~rp^eY27C|IZo8#M8AKM+W=9ztN@Ya)W4nRc8s8c$G;dwx8 z$P%5sveNPWT$d^TXqKkV07rg(cYFPB#8Gg!H+Qa6SK#_}r;c?2VJo^-Cd3nY&xpn26 z0}!Pw$4CdZ7}3NTF^?&89=Tl0o#6m^!Wo3O^10?`RV+)*iqvfA5vE2PnZ84(Pvfwb0&74EdP|N-Eo>i%91EwxF$}eQbe(uNXmCVoD zKC66w3YQK*je#&gby{$!gG3Sfy>lf0@GjB+{SN8L%g7+Y>n`Fy`!tQ8{gCFr`)h(1 zo}Y13w~u_I03v#fnruM4Yio=0$dz$2<+GB1(`UNQm1ZR8W}PCBl+7>-)zEOw6{6NQ z%M+YwMal*-VneqmXoje}=Aaco9HZYoP4c@_B>(h2>3f$jSNA}C{3o8E@q@PsUOPeX z!n62~Jbaz!aO=xA1|X7-P|>EH!UrMes+Q=eCke0Xf7M;IdT;LRv!8X4 zY`=Q8T$BT>{5oz)yX!v9y0(;t()Sq|SpY-?V5gp?#9V2+| z2^w#mApH4X5VRpbV6&{`8uIwuZ@x^N3z)}9n zX=d;dB+G!i=coa=$dJ#tZ(|_UmV_^M;ZPTn2>s!Cl7IP-_`kkK`q5>~_6S-X{9_N% z`0Jn0`1wx=UVI+aZb9?*oS7eYg6oF_G!=l5V4UdJP3T$LdUvO2zl3VH5A>C9C%NqbB1YRK3DS{uO-weYZiN&(h^VJJX2}7n-DiHj zX4?$qpH-rAkYnrHj0K5!*eKQEIY?v7xmDu7e~;+@{WHmLKShQS%I^?7{S@K%zC+{h z{+8gmXYf{TpGg>QRBn5KsCXB8A6sIsR5nwg;hH5RQ?*t%XhQZQ&DYwu9_9-i;qbDcph_M2k`Oky_d%KzDxLn?-IQH0^afC zc#8`M{L;6l-1Yz=-hsh68{+l63>-CpT(1bR@beGAFQ#^>Wx=UktFHXTAL<&Q*=M`d zPUlUoz)okQGIA@%NtC&Yzfav2Fa?f-@bIafYwuH~=CwcEz<~>jsbq%xry)adiz2G9@zfcU?i z#HcSjYJynzN7dr zyg=jo-zRwf1^fpeL>;;70AJ*rE4L*;B;JGZx}AU43+=iXINSrKT^ctZG6N5@k2#3U zK;RSr_6y(E4|T1FSQ75}&lko@ip`qB=BE&NB06MpAq!neLh z`28Q_Eq!xCw>KiUB|zw(f!@iCbo<%jnijlHkQx@Q*(P z?OS^o?3XFGCqSZI)Nsu%m1YwH`@1`Z?m1+A3JaeV9M?OA6QSBC*j4;t#0DBXA6g-_ z8W8x%aDX|vN&4Y=;$MG4`r&2tl^!%Y1kXN7`0C39ubd$G_Dgv89>2paZcuJJfQXJ! z=_Fh0FCXXO^u8{+b<5a`Q0lCcI>+4b4c*{A`xYZiNCAgaHi4q<_3X@~1PTzdMCKvw`W2@fJGxPd!Wc=Gz3% zzeMoZQ+L4eIpwwj2=N}W_bDpgLl9K4{F&4B=i|(ax14|E`|ZcjIk+Xc9=M8n^ZM}K z8D;RkXJ5?#L6GfT^yw=k|N0@x?>{9yy#^}4yYD`N=bj>b<88t>eu#JfgSW-{95*W3 zXrgFD6psnRCXKK~7&Jb!Yk7MCBpIUi&Sy)dfj9tBv&L!EiE)Lj&(QLE@!<7jmUVF5 zy;(6_0d#iX%_hvXZTNOD#GJf9{OgZMe)lQ*%sLXKcq{YxPd-EV_74fa_f!1)9)uwL zMuG!iZ?MJ5vw!5|**|g5(TDlg@#nbv=tDHZ&sL&;djTZ2%ODqv-8d!Wf;b(2%@j=K z3}v>J_}p%n3yxZIZZ!n!Mzum)WT;d0xvS`tmq`C`n&iFn=u2Bj3jTff6+jdG$DfWNUzGHSq2~PH^J8gx`4!|FLKAj^2Z6-hQjgUQ5Q4K0AAB?Dp2^ z^*87bwn*X#(JAwtB}U^ud&3@q*I>JMm3Kb)1tP*dcRh5&*Sb9bq7!6r8OG}w2D0_Z z^Legj$&3PBRr@q8*#Xxhd{eWn&)6=`xf;G5;TL$wBtl=>Abs~V$!|`Qeta1-h*66R z1dlyP_~s7@-uw~aw_m&VJ=|uJrZL)Rl61nx_C;1V&akn0fnI+L5ZaA78jTi*7Vly( z-lI3%MKFxUeg5$NKhth?Ideo8WYEMks~8QoQwfj>@KrBf0*sw23n^~;t?m$ z{gJzm9_Q6>|M-Soty>--VvOY<$;c|A(UkM-&L}W+b0Rr0t^j401(C997G`Xpx~tl` zq~sYQHf-AnP^|{|3hDLH7dA*gx=8%ar|7e5$j%70av1;V=LlauLGa>h1W&w(YL#Uo zw{uClHYuZVkMX2Wf4Ifg?q#-jFVpLi)ySsW={AwA9_feYiGKMJ$$RH9TLV-W;N87K_}w28zV$Q0m)}Np=clf6 zyMhB?Fx=wm#wk`ePO-Cll|(0qNb%A-#$=v?h*+?A(D2)ITk|Z zlD>bQ^xbo$S9XwLjDPo0{HI?aJn=TclP};Me`F>&Zbuo6w%P4pVP|iZ{$P{AXoulw zhd3P}qB3xRk?c3l|IdMA48~|ezrjLxiS6Dx!*L%3hNC^sUiy%$8y9%|krxU4gROXV z%L7El+sJU$t`t=y26Ky$`~QxGn3@F6JsA#?vOnsTy$8NA=d-8mbUV!e@dS4Iq-R%& zfAa~+`xnp`x1iA^IDVYq#g_?R`ys*0-^W|Hy+`sx17-#Jed z4N-VSXxgafmp|eDyB|GJ zZse8+NKv`#`56G5!QSpP|3#U*6q^ev_(*1Wl+*ZGz@aF|hKGS&k!h)mj3;)go!^}z zdG{RYg)K-m-k}A8=T8v6`4hsI-^M$3AJl%l+YKB5aWZ0k=L}oB=h@x6!Z;cb#}P>q z0bq#4?INp+=~RSyhZTb3H*C*JXU`zNs^8kO?DVfcIl5c+3sDU*I#8g-T_fr08$V! z88~u)<%u| z8?G`OZ84neGM?-ql4hh^%ED4r@`>DL_rJ%J9~WVq5J5xn{?VOnvL+w zw=T&D8LUGxL_}w$?FR51e7NL1J5JR8DUS*oWuv`lP2W6aVhC z1;_3f)$QVc>mf_RU;7ckv#)=xtn$qgBL=Nw5Bn@uyt=-~JQ->Hqp?o_OqG-hAa5UVrHso_+iw8jUZx2hc65-F-@&A1LQ8+Mt>ts@sCO28<(;kIs|)>8#Cb?2Nz& z{zLZ?zWf&9TYrW3@KbmzM{i4T07S_io4wO)_s_96yhmS|zQJ@0y#GTZIBJ z`5xsyV(>c=9tLTkBsxwFM_|pWhyhiZ+8w5|h zgld;F7v3)6+aw(^j&~SETlB|k^oCd18?F+?gN%Ha0I*gA$67!UM$Fr4;Bm``s>jyA zBi4d};CnuSAJPaK_`Xk?#(1d0gI?dd!r6--@$dsr?aM{>)#!c-=SMIRMLYCqHti$< zh^VDq!69Nu^oYIjWj6OdVRP?O zMw1;7uk7umv=}as`!y|D3 zcY5o*`{6HHm|OmA069AnVihpgZqjPC@q!Q&$0!jzWyk1ECK032gf!Lro$98Fm=wm_ zFzJy$l*)X&`7qWgy_3pt??NgDMNQ2LR34uFBA$n81Qr;c!ffxM&#aQXcb@dqHT2d1 znjyi%j}yN31A=eAhX2UZGr@5yixJH*TBAR?%--lSqiB7`V2jG zjw(-~Tq52Zk$ilKshvx6rLI-|` zUnAm5L6SyXTK$x*oz;E6^GtxGsbMoR^diGOZJ%zZO}o<}3_{|p;Lgi_XstD)@dW*) z0Yt-S%jQ9frO1qFmAOJ~3K~$)&wm>O|4_IeA z2c!+y_(6d02Q#04l0;lxzrdBXa~wHzFJUd*J_V3S3#Z41wXr4;p&3A{71HT;XfzrO zjjntk;&A<}z0P9j+ z+$4VgBFU*$WUCK;1OMsg315DL@TKqKKlMrl7`L*dCL&69nIt=m;tlpDml;m366?J} zVKbGaWD;c$UT_1%miyGmcd-<;<5G$9dlvg44hV8!kYB`c&q^z0vg17E;dxo2+qr%& zS60t(=E8?8E*!c(Kqf{w*-yDT(zNhs_z*S~bKN$rW}{dHQz?Z)NYj-5VEmeTl|T{(FLN zzlnGFo}2uIzZ$U?Az>7)u{}J^?)WU@cr#N@o$X_aBEsw_DuBS@4fX)XrE-puX$3C; zFoUG$9az;J%lEVA%&U9F7(AscB~YGo&GJXTvUZM7&%MvnkG(>-T@5r%0VFkWevq;; zHr(4(G<;|@Ji2ooTCHaBg}hAZ(lli-9DRuvL~Qgb8c|?T! zFDPX#h!YqqTpP)m`vCRKvGP`AI~2ZiD2*OT_P9#B2{y z^9uxzJx=(_n}k335BT>#cGJGzS0&mcXcH0ZfsIU!FR(YcWUYl5gbWm7EI=}Fxc{tX z81jz4VlP~ffWseLi!$vd6;?-F(9{6IG!O+FX_KtCv>uPm$JBp+V>BDvSJ>U#;;tk2 zSGG+7WIHzW6Jrx92!Ri+me2gcJgru{n4U&?9!i8X(F}%Tk}t`ENYqE7fqi1eWTOXj zSIN=x+^w25p2Owl`NPt-n^LV1)o!5LA!e&j^6_PoKV3v$*s_-M*b#!4-=O(}e^2n- z>(IRQXG%9FWiYwS-uNPe=t@Su^YJytDw@kPRBjFIc2$E(>1tKUI8=Lhmp_zQtn4^b zwI-Egp^__cqgg1o&A#ji1`86aBh$TP98b7-^)!c;k8ybASkYbq$m&FMd8~;w%z5Bt zrwM$Ix%oNT-A=a7xXScT5hp2o{lS+45J^T5_3XMIA|Tp+)mh04p$eF(ZO&(rEWhE~ zD3#Hq7kZ?pR!Kg%jJ~o9lLY@;kJ|~_PJEx>xz|zGC{g&ji-;lCLy~mBIN4zstul<( zh?1Qm(nJxJGDYo_6h5rm>(^W?p=>MEo2gF~g|E0><+|@x_iWmgf*EbaedPDRb))-n z5^?d$r`&VbL;C~d%EWMPs8J$>C_DfIzVhhKb!pGdL8F0K0)hgPB%!xAB#PtD@H5?@ z#6ugsa(bvr@=vCRdlbJ(9V~9qq7e&@P6L#nxAusCbB5&ORm^%H)oI{8e4NHl|CZpy zj|d)q_KW(4Uz)^vK!1Fh-uOJDcmreXB11}fh@==vty`r`g@l)+I|qoNbd4MZrK-Gn zTMi7Dd>4vu@_lnVRO2(XYs}&u_8imh*OV9Gin7xRUAlUPhwr}vkG@oFssLntVz@Ze zXarwTEGrHk^Ye4eEzA=%o7qDYl;;s8n%%u2aq`7Su_PYZ0a9sN4v?w=pz<7wZ4_3c zQpm0ad>=L6LWLd@#iXa#NIt%T{&WKwM5y^D;j3@k3fyPEgLn6XU+8!IB1M~+NwUi% z-eR2O^jYm~{ORG?GA$761Op83Ujn(a1en%e1h zJUjnwe=uS^o{j+AbVvpJd{)){@(rFs1s=**nBfF{ahv#07f4U7 zL8S4H9L9g@X&OKNJHnTLa7(&WxzcNinZ!Fqc}SF6ODvL7xJhXHa-u^eII5)FPOW69 zS`;Yy{fa_Y6}S$PS;sm@9{gArB*iszSIg}!r$w8T&F!mf_cln=gdod@6adj8Y{iDv ziQ#Cd@gg|+8x?L6)7nz%%XFM9C(-hUP>n`M>-o3$)#rf_HPw#kONybP#0Ijnp zm%CX~wH{M`mMYD(0>W&D5o3^z0m&z;q@S!|R`-w~#DDAw!q>k~c;bfykKB5ELqyPK zLX`H2k{!lbE+a9+3!3?Pz>AsQk&EoM-x8;gCT zS%u|LsD_7X`k1vI$tSDCzrTR&j!~_U;Hjqx-}o_&pZt$_ONYOZ@9{;7h#@r-M)5ks zXpLdCiAX|`;LGwEIXK8(MeS0dVAeiR0Z2BM!+lA93>76UrqFPKQ76xWGd5&~;ycHh zscTRL4DNmzIJ3e@V>CJ+`%b2tGr$2bnhd$JcAmQq-&X>ppBgTX4Wm@>$R->Yv9DBP zLZ4>KV}7B-;?g315ReW>fI@i+3=D>2c6R&ReRSoE8#t9l5Rb4+t7Sg03yO++<#=AX zJq>)k`6iNT^uMCl%rWQR$zOPmf!^bljR zQG7+#TS}`@>2dQ>nR!`m36_#?^>~&XF7V>OPJo%66y% zrn+B|U3c!sh(Q}&l*Fite^y++kkPo$+WJLCj|_o~gA6oWoM?ur_0hBlsj<1URNDvR zH$1xYEtZy-2!oI`O+jo`uThq$Z}0X=wHqzC$&$uMJT7N2aor~OTNgDaS(CyJZVEgw z2D7Kp#o^lHCZ~e zY{#FcIwL#^&-3UHN9^?aUu@ZX8rdPXq9`V+uDDfBX}j~-ZK=AQ^<7`wBKdHY*4kMaWkBRl5aH~>1q>L)*EJBsLLOIW z_Rd<>g7md;A<`s9SVp0NSYV=s*cY@Bq7?i_lf^?TbmzK+K{fy-14(ah#MXB2i?tv| zBWa8>wZh08B(B&398~C`8VY^6NBZ#w$%kvmBtXuSS5;rITA;F;G^oidF3bq7bH zM+~Di3k)-|ih#jpz%yVNr?{{n)3X%a( zG8>7Of5u=rN2dW8^y+}*gEi9A+n@#S@FBa5*>`_V@YJgnaC}`QubqmLU81x{qDQ1= zoLP%Jbek!1#v9%I1&;C?7bNx1Gon;={$Vokn4+gIm2_5bE}7e&6L&X?HB}l?f6w>B z1>ZENifc%|SgXPqL!uLFLB!xG55y^NEv#PtknJmqBL>4By}fM$BSJ3`)??wQ2P1(H zNDPcLL`I0TFq(jPP3D%DnO|O_(`nltL>oNMqt_p@vE3tzzM!&qogirfI&r`;qZ<&c z`{#l3z-*7vCpXb&c988c-g1ZF`Il*Y@4v%;`c>4|d@=>A0Ge12m?XQ5k`1&OXNsA- zQr6c7U1`hRt0@3DMB8J^)6tTci8%A0& zNrYf5H2skF;tC5Zhv?4DF&DcFnrIOs*bL8ML6@X4^)0!KdHyaWe1h>USabIk(epQ$RXH8`bZ zDHPmP|K86vyA~mz+NKO5iZo3~(xjMIE5CNGHdF3jzMEJJve(}s*oh4zT{?XefsG6t zz7j@S(NBdInpkU;@6%dZVD8Ye9ph^(Ks@E4wPtN|_X`6^9+@e>v8!RAe83mvavyzq z2icj}S!b3zgs=aI@Gt&D1sq>T87DhgHhhO99b!lefaDdmSs_qnIiytNsVJ2$33;W= zr0Q~2!o3+_icy5BJf?8pYL>#($v0IV;&x)Cb(v9HMP2b7>*UsH<%;eQe0Szq3p`Dn z#w2NiWhLHB*J?kRL}T^_y97IlEitiYhSUh#wi29{r|1~yq%fz1vDP3y;rs$~D~AXh zAv%eR;f&e{Ya2W4?Djvurqo4>r(|Esv6o6gU`y|16r(To(HHlSR8Wfx_|H5~@X}lO z$Bt)*d_CMMSBz+qbigoLW1MWE&7`LAl8v#*t%J1$+6Z~*6@-f0RkIw`{Dt!_U767& zCmTiFtpH=`b^%1ugyE=9u$LIdNw!A@5{xhcwmgN>f`>5YLnk(<2vmEX=Apy17Z-?z z14L^?DbiGPb#0riotp~~yFySVMx2m?P|SlR2I)oU%LAkz+a66f5F4?KZkjM*GxR!27bdU(mM`Sl|KLpt*9BCOYtZP=O_e zP)^#FYGjmPb|RQ)RKvr&_c;Eyo<+63ev`VTdd&9lB)!pDgtV{{t`z<>RuM`sJGU^7 z%avP?Jnumk4li;gQnezEwJ;{nmTM#<=T)ncT1#TGaI)({WklQM2vw!d#+ui%?YY&c zSP`lr-~8*Bi|*vd)j&snZG$L<5ks6rB-(~{g=|$aMI>3SIXyMK(IU}nGhse z&^a{oJzT`)WgXZo`#H}rA8YO*KrJ7lxwK3ex{G)!2Ez&GFRt^g2k+(ZO#?`fE%)pI zSt*D$GDwhNVyh}c5C6W0@E?8})okCKYu_Y^(mi^kbMz;dNX>+@+sYrll`3GW(JaX{ z#VV?`Ca#sJ@DZ1j%&kC4;<5K!u@V^w zrhw(VJ1*Kxp5m0DXtEFz{EI$N4$SM#u_;x&sOi~Mu zi7l^C4Il6B2k`EH6oQ*v?(#Wh7_G6<|1+r`7Ye_hi1UM#mLms+t*I@#)jadj1i6C?l1u&!v5P|V1W^5qp&atv`gvFJ^_~S8N5+SW7ajIEe z-)6Tr_^diLtv1R7FSKqJ3K4@61*t(2rx?vssO~&!Zt-igh)tXh*dCr_Z*mE3;@TMc z8A;1bk(2|D!tpAsL#9wp6sro3(u#;f$nzSmO1{H!t;&-5jFjtIuWlSGQn*oSI{z`H z=%w;QdA{6wkZ+edIHp}I_qrm2Hkvp|va%8>^JdPy)E;lec)RYPyOTDCfV^Bf&x06M z{%!?Wq;$0qh-@NmXJHOmSjIncl!c8|n!`S^fGEXaG+}dlkHK(4r`@XBd?!z7!LnOuIoPNzXx2si$&6z+`il z8DnaIa0q$sO-f1n$s$+Uq(pI4RPCy)H_t5_`LmS5!^#_LX2tml9OE6R!ro{wUYU^d zoKUZjfko_gt-;es3Zv#6{lj8Ch%U1;{M3#e z$NdqnR}WVHs(GHo37W)9l zcGxwJk?mKHXziPY&#gzM&{~%jyH@ACYQR9sCz(CSDp-npvro1RF4#3VJx>t?%GO#{ zM(S0}e^v$QgnPjjsxh9R#b>;5gz?e}X}e?dAx2~Tfc1@C&R<;T#0#_6puS-VTBxvX zdk~Y~GvHf`XT2AVOolKTAf5TI)SB3NaW@&pYsCsjR&Ed=*)Lggk&>X3yHesfN}C5C1^?$BbmN?UO>=Lf-hti#Ip}wROZv?R-^_JMF9}P zkfgiJWbp{m+#;>f5YiM08?0^hIDdKLrj1iqK@-9bWLZp<+!2L^Yc(|@uvWxqBqQaj z1`f+7jMG*seNLLEmAC*!VRfwH8snCoIH0Qa{IlEav$JE()1sWcc%C)aDSK=cbcl0p z_gU8g<$FFs5D+vyMUc&5igK+;#?U1L2%eJ@$pByz6D=NPvamvT(8n_x?aeV9 z$6Q|BqCcE)Qgut~mP@k#%jNY`&^-#yymc zx@EZ~`;*S*AeogX|HYi2)<&%|>mhk>S;?g9%umnP7A&nuIh%=F%5K3S`Cv_l4;VeI zw65|S$E9+6`a)5~;S#RPg_DVQ_i@^!(v}}*34M}eyd%{hWP_pdj>EZ^{1I2~yF}15 z7b(S4KB3G_?xhDf+`P zSJ$_>@9sl%+MiEZRilGy&Ds0NC#drks-aLV56R|B)fYa&J9Z!bGjATKul^!L&}b8( zB`yGxzw%G^2dPG}iuUY37aWC)m4TtKBCfT_d5CCA(3BOu#{DeD@&PS~R*q6vxdoKU zRTe7Nl-LE3%Oi^Wa{*HYqkGLt^{xw;EVQq6K9!Glo*(2PU)No#bCKe=saXqhkYxJ< z_(4D;Y!Y+>XehCO$o)8z_jJYqM9xPXE+W{)Y;;Q0U0}F$l(g9`$y>$QpAOJ~3K~y_WQOAQ=!3bpSJo@xIFzkUdmFSl% zSpgjyEitNiA}$xXh5?#BWx*6Zo3$49Q|=pN)}vBpl81WT;zgacm6g4faUHqU&@QPi zdu@{`QLc1ugsI|kxnOYtQYgGQM7$mit6M22yenlF0almdBq2@hc$mDi5l6AzWMuvj zUAL;>A#S_-(6hF{3ke%7f;k_Wp4fD0&O0jUa~BkfyzIO?%)~<`c4kMjy-M=lzYzLAz&rB5 z=eq7^5#MXj2o_MN(#3Lu9@iYznE!}HH&=#uDXfANfT@fDasL*_^-`tPu)TGafa8F| zwIHry*R4n;a#aAs`Mj@XajlMfP6vbqFm1awh9phx>SiJ(AJ4(zScOU(W#Cl`bmT9o z9!q(>AZXBPb_f{{hwN5H24>eaUrMo(gCN ziv(V)1`xO|Nf-Bn0}iZ~)xiNSNzb$Erfee{?3BAyx$;(&6q_&3+?ui?x7N!SR%TWR zI6syOnXi<%JK6QA9EWQ;vM9C%tRYP`TI(XAXgi*&6{x#TuH~o@jmn0sS<3Su&{F-`iqtv<7}iY=q0}+gx4WAxTm@ zGyG>1)tW~hMZGvqgGlAdGM&>D&@yfDtHBWR6&H(SmIIE;tRnVF89!vOc!<&5B8PU?Eu&Gk-`v{ib7g&p`;HwV2tHc^ zPc_=8?lSmID%EOAY+%6$x}HsPPV7_Gr~XL#tN)YW)xW~O|H;pE-OnmY`7E>_WO?!} zHu~?PC9=1h`_8kD!R-VkYjZ=o;DTg|k5sbj#!*DUmWen@Jr$;{DzWQY6|PvW;C02m z9$~LTaq<*K|cw#d5c< z_vtf%h<$)b0GZcS6(!0DwJ(UcXQ8Z~kXQp@JNr1E=u01`n&bbM(DBo2?u4`gM+K zqz?cx*y66tL69&8iWpErJ45L>C{)CJNyZ#jcS!W=DW*=HH?UP=5+|Wng>_?Y-GqyG z7?etBJWt_z{&fqg_Z`rY=L&EN+(|;+wEYvF0N&>wb$f>PZl|KqV`At!O9@= zV_@f?+Z>b&{5XijSGTfq@Wy&w`al2o=uRE$l|MpE%s>47k4af;oU(J8Qsx9*cNb4} z;1GxmzS%%0NEqx|gNR8G9fC&Io}sT>Y&6~_vY!s3 z(0>`(6)+@8BK=uM4CgaIESoh{i6Z8R_3$cLHX1N7dm%0%;^2tR3p02J=f%@WLa8)7 zZBSshXx};Dg`*gQV__USE)j+(0koh~i9buM;t;?{0vEt>@|4SCm{U26O2)v@8dvKW z2xM#;pqRvnW~fV*g=@gsS$a;Mozgg!`YwfThprIxT*dvBO*S8O)7H z#Ugxh$_EGnKe{eJ2Qx?N?G<`|`9GkRKf?OvpCYHvMG1|M>|r~AY@@)L@gF0EV5fbH zj=OodniX}4ag$v|e<$X-4S}J;(=^0DqGNT3Bti%xJqQ#g?2xp9P0H?2I&qy*F_M9S zpEmlFjO_L`7JpG&v_nr96&l8IrOs zsbnM@9XBQ^l&`YH)v0(qBweNg8^-I?H7#~ZRoYv5%I!upti5dZ;(U936< z4*xzXc&0=uyo!S>IY=t4%BfLhkvgan0FFKO5YXeGWaxO%sl+5jBz)qMi@~u-q6GVe ze2Ix_&0k@vWE;$6P3qk~U8V8oAPp{=R;vxyQiyJqWC>6601rQ7qS)M}Vs)JYv4Eou48jK9eRfrQ^5d2owii(V6GU^q=8*F3s)+eXq_S1wKi>nh-Zk2MiFJR(@fO33RB7>jAT* z)hI%BCRR>5F5(v^gL$ON;$AA9I9HFV7YAv|Kvya`DFiCnwm}Dx27FR_k*Jq^UxW7( zvsYs8E_{~&rfE?qlo+c{`T)sWlIfhu;+~-Eh7t7;1Ukla#P$PG6?(M7y9Kt0o5|5E zlxa0~D7Ty7DLSUX?WIj7ZZ7f66Q_>BW-&4>L}ki%_r?GcQGBgJJ)$gXH+Z*y0o^)! z<1WU9S1?XJ{cvqM23ba)GZQ~1V^;ZO?JwDB-8!JQ-|j>&s0U?Q4+LhsPEvxzjw^_+yY(7sZx!9y0ils& zCm>t$Q|mt?s^rd)F~?|k_duEKw(jAo{U^AHUcDat43(w9FbW_#sh20znK-kLC=2TY zgP-h(CqFypU7}m?!StiD( z$Oj87nE*xGV4>(xFoP*|LSV?0M+*k(RC@V==&Nb}8p>cVlVdYqVXD4^|o{ zHV@Wzsf`uMI>$=^5z;`EClJL6KVax~V+TpTv2SM2wsEvZa9&NxoEj6VfjB-lF#ql?8@-SPSX1Q_TlR#$ciBP_kq35QNW2q$Ei?1`?IUKBVh{hPGj`n=jCCau^+r z)V{{uX!p5sXO;14o{I}p`!dl%BnnkTaU8w1#DP*|6h%6&2v)~+p|OK%?|`Au-EH*F zB68{?qB8rLNfX=5Gh2BMPxZ-|RaST3Wv{j99~_uXKE(hsWLT2yG2_N&+Is})-kXSV zv;peU zhX+Wuh?qEuYSp1#AGmo*Hf0Dr;oo78<_Uz-kO2%(D<7aXZ=vqKj&bojm{)%UV+#oT zvzf-!vCEvF{t@NuN%EN~ZY=&^w0qmb012KY`u2MNGClP1V@wAlnV*=8__*L0bu1nP z9Aztn+^^F2NVPe7j`Y2vhf6Yle4X^c`$-w|nq+X3fpepfD>6HEl6*D>kg{WOwwj}o zF^I-_$J0sTNs5Uw2Cm-pmjo~jT*F{1TOil#l5<@I&~`mOTHNH~$_}pUJydR%$QF>b z6R5R&=vF)EOP$o&n&oDEu6uS zHhH_ogRM7M+W95T_J)5jr6xuOJ0p5a(m;tFOZU!NCsmseBx-QJPBYUeAcXI61UN=t zW7vfpmnH)s3|!9xFzgSe^z#w`CZ6>hM$JQtw+|qfD=;^+Kp`J9(gCLO873UdpY$Ld zHIF=149Z6RJ-98Qs-*<%WU>@9S;o8VU?vhl*Hhfz*kgIC!R$m4kgHLF_lys zMrIMm!J%UH!uzVhL&u+U)bk~zMB>#AN6q8BQ_Po{ojOS_kRZli{Ka4V1^D*(dn>!# z*=*40_3?DTNwFR(2~URq9_rrwjMAPI*jiC^`}m{m1fF4FJ2r(}hH4>8F?Yj=O zMBTlC-dsu^8zs<^Zz;Ji0#C34dZ2s4Pf-CdL8v-64O*U%d`L3zmB1S0eJ*IAd+ zpy1S)Dqp3LodP7g%_TgqpLo6L51e4Yuq;#~BbzJf#Y#wn_%+iE9rHXvI?ge8mkDr$ zaT7hPvc=;t(Y<1EjX2m3l7L~uRd^rb^#>zmk}6&@=PH_)D|nUHufD){UimFd(;t=* zNf03fr%Dc2t2ye;F7>{LD>O<7v=%6VFIgbvEjmD#@dAV2Fld-I+nFqtZU32=U!c*DHic}B`HAPSj4WBJ!rJb~?9>-&bk_#}h&MjQZcX|UDq@#gJyzW;P{|MT~|tertl&Li@b!NWolyrY^m$`u??wETKZlIXUtZHWTN zf`;}s>h9m+E&dEqUcgxR7V`ABk@L?YOy}6oaS-J*6OGWCu4&P>Y-|Fc3BhjH<<@$g<((#z#Vn?A3|qv>BdSx7 zD?@89`Nj8>8k&QpO-Nz>mIt~e&^^#C5P6V!jmUO^+o;73y8a>R-Ua0NWyHi~MD5CB z%k2_ElCkp4jy;KEm6@(yWqI>`7B}Bzr}2QO3ncdVF?C}Uc!nfIOfMfLMMin4!g?yQ zfMexDY3wA&x5r~6q@_#@(210kQPJ|@_KcEnaTP1AUWe>rSvDu<&M-AOmw5jPfJ~LL zoEa}rwgfv$VTAw))GJSj&^sD|B$O-%k%tOA!GfM)(pJjPi4p=&NIqEF=H%^lzI|zy zV)p2PLm?%yI)kj8MBV=w`rTxOG%%tQQ@^9?hZ&X%fBvl=&=u$o=&nE(Kze<&x`)`l z3&!i{nd`{rH;`TnO7mc5!OA0yN1t}pu}jR3Kf!qEG-Jin*j9<<%@5eAKcL&M?{DE`GrV+misCUBg%V@a$f?t)r904z0VHJhQNYlt{rK?_=LwU+3vc7kp0Woj zr;%llMTID|&|7cdwQr*C{zpXhGGh99Y3v`)B$9hS!TwrGEqLu=I$NtufN5u z2R~zZ^Futay~90iU@T~dRFMPP`lX?h?z z5+5RVf4^GX#t6mA>K z3DgB0800$4GL6MR4gyHXZ$9s7JR#B2SFw~3Y;;^c+^BPZx5Z@XcnFabvlug{@!tKZ z{{jwDtwuE}PNP5-){WN*+`_sqpaZ%oktKyF_7KiGSnKHa8lt}j?K|koc|`ssqA&-! z+9S=dB80>;9W2wqnRpW0%9D2{s8ueox_y(az56uUn+ax!9)E;%0Ft&ws$R19j;TiJ zV~43#I(d&FNksfwv9_foLwH?1R40~r7(R1MB1NB15AGMI+QbZF)!NYej@-NUkZy#}oY32uHEGeD;{V!z-I=?%jlF1~%z^fx*JJb^GYLbjoM7uNn6 zz49iywdSKLQvfsjSkx{dB!%oa(_L7%!h>X8aPRTn!L3+Piql zOEF1|nMq5D1A6w5*+-_Lq!>RAjwsh^a9j=DKX%>JJ%`7x6RR|+>tj3}!-?046t2X( zyL|pS&pq`DXBRGE+sSy`(3i1IgELbVPL36@QMihPY8C!Hh#`tY?GFgNy@3?b2wWj) z8U{^i(9@t?&EMbO=3=ePzq~v{<{0TGqBM@IPNN>&_UGw3$YXVYn|Fu~s~66Mq(Hm) zplAb4f!NcCU5%~+RgF-a(Aog`0Xp+0V(dDy{Ty_!L+Kotc`z~v^Y|w?tLd_YGs}-+5bp50; zp8#g8eWModOt&NaRA~u`ir3eJd!^{)+*vN1d1440FajV#2prpFs*-2AoMUCX?oS;P z+9A9>oD1W(Pw=J=R5InCmG5gBQqr|D^o8FI*ZZ1JciMci)#ChEo{V`!m#=9d zXU`&+@1a)i42jUFQ8Ak-N+&xKx(}};48RCJh!W5gsHQ+~3RD4PMI*;NWK|){+lczl z(cL%Et1}4aJXD@Uj6V$%PaQj+GRmbqSv^fDU*pokw^-izh?|SQ;L``Mv$1nOVP_<4 zk+>8{F?Tp4N?4Z22G*ktcfW2ptB7AV%;-a-7owvNpn2>~_=PY>c0TA_IpRj$y z-%(0~`Pl`|p1L&h-R>*fYn2>VPK?v<_Sg!Hb%cmgviw`65*MQejq;@G03={&O-A)8 zNI}NV;8_kzO3;c=w%YvVtquObGB{g3S_ZAKY>X4ZE(*(JIhL=@O-x#OlY=;?oi# zJsL5zIY{3pkwh6VJxLp8(D3BBYQ*<5O^f-N1!@!f&lx>rgM_5DZ#yil?XtPk9M~KX z*c72n5-47=eVO`=Z)o3O&$)dB&^JtanGF3POSakbSZ}*LIa%QR*bzq@YCw7DwFh{& z-Wxu4RNAkuhRB{d$|mpwjaKlhe1PaZf!dMiJ%MfrbWi%TyjpFfUV_GZ==Fa_?|uZ` zUBCY^GGOKq;^7k`Ez@DVJkQDLYs}ZKkabEZrD(Qy>Giur3*3-o__zubsXVE&konU_ zuukm{GyVSHh&v1jB~J_-;fG4zYXGb?c*E`jzJy9~<^y!2uFvqLSyS z^RvA6-d#Sv8z_cC3|?eVFYf9+l(gT43$5@pIQ>4gc9TXXN6YqewptoK+HUd5PMc=m zBWKFPqtcd*aq>J~?ZmJMBefqk{HRjqagYRIYqau3i`tdwroda*cuNvvLLp zlc~x5CCI*S+K`g@T7}uM0=5L#^#glD8j3iE)vI-sIqLzY=P}l9v7T+S<7DxIB(Zv5 z@z!dSUo6*oai&PlI=J@~QbMkX7@tPu%jm}LhDM6uD{yCc_&HvUP@;g^ z1X+>D357A`p}QT7?p=g+2hAIheFsr~0(wt@cMY9g0GS2D--I}NdX5l+N^zP>ahg-J z*O{HXK(#bS&MvdEahrN`i%z#m-|P905|bQZ@2$gLJp~Aer>76QXv6Ep$Ab7}gZ!y< zy(Ab1^^yU|(QWa;zCUkHP0n%Y+>?|`WBb!fiFu3wyPfO zAGGP1yBLiUV0$iEw}&ePebc6sE22#clxC~z(bMqqY>9$>H1$Glt)m{?M%Q=2?Zvv2 z!3*1WKVJSY$Bue02-GTn0|8yo+XA&N{cTgC>k|4BVSvcg5yo9a_ifnv8G7qYM0?#o z*Qy|lhfk8s+65-Z7C3+MIZjMpChwH#xm_B~Jv`5im~3b)cuWewCV#$S2zdfT zVQG8@6k_Kx07qDs1`qM;MMz1KpSe59GuK|`#b>^SJYX!+p|bkILXEBMI=Anw(Nij> zO@*tAc>#GfJ?{%5VA1(4MD-#%JpFnS} zqFRScae7d@_v>_yC@6>OjXE#*CPHgJwLXZI`hgpMz%Vl4gXhWiyO>I`l`GKBIMKqJ0?p~N z!?XfI9D?pkcLlm3(K`~g zW1zMqYTH27C3Jlx3Ecp971}ou^$!sJ70}xVnh4zn{8eH>fiRB*7|Y5~%vY(6pJZxc zfnu(TVc1A%;ClW%&i--*YJ|NJ+mGTWsZ{s_z!AB8Q|cT{vnKukU_}~~3 zr5`0ZbW(EY*o#US_`yGsns$UPt(zYi{%V+`NJPd?{1-Y zw^1vL{vxACq>+8_-Wv|-;wI|S92Hu8&+BSS? z(^k;!K(B>xS3#^IoS>AiQYws7 zDoo&H@sXRk%Q>CYuQNHsou^FgALWg+ghMtUyN^DwwNS@Zi(E zJ}=aATpvGzOH*ldyM_1ByU=b8A5Xu_gED&4=N)G|>^g_tE2Q`=AfZHYw7(hJH|n<} z-m-zW=t~v7YM^%vA4CR7rwPV==)DCyKZU(_p}hiL3#940i;p2yGIo~9u{lnkxXSrc zPf;72M@mV%)1uMbLj@VcI^t$hHp!qYAx%goC=#h!VZE506OBSV92}05+UMcYuiUXElD~p2nP?WkeF^Cr_-eASz1-xiq_zM!7!NHC|Z5en= zrVp4U6SZ!l_6+Ds1RlcPK{#s&@iC(N4r2EmXxv73_k07$EFOu8q?9cqMGN!i`0elgF;856hJ5bm zGw2)(AeL!Rn<(??-4#B$y^QCDar~opr?Iy}C_4sH#FG-!?O}J@^bJWjlcig!p)3cy zJ{`}`bGly5P&~jE5kcak`{vKktIPYVF!A5di$>jl#A`axrU|#;^$P=p9k`06_LC$V zGIABGbrWyhL~ob_siG9*-w%j>G=-XM%^#{ce)Lu?!8|-HNI_v2;wRlkp-Dieh_j``V!@~ ziF?Pwy>FscO=uY431r5F><(DB5Urmhw*CRV{Q)!{AiNHk1%!39p4T)i#ws<=Ej-D! z%imzSb_&PI(QUVAw)XsvHIy7cV)?fren>{h2YFaW1BYeWoIZJh7oPbIo_X>c2S&|D z(L({Gkav($@Zrrx>Ww!0bH(r$mm2>6gD)KZt&n8eO$@hBBUhrEFQE!$(3(!K&rIH8 z(lMCG>>mu%o#sIzPq?9 zP)&*2k*GBTwPyNKX3s!3HMD!sZ9#tvp;i%M9if+@_W)W;ewMM@1LVHrR)i2(rcEZ3 zrI@c!E{#(vRGFwwQ7zZ7ZGTW$uiwRUJwo^IunHC1PYlC7`bWv<3Vi=JewP=X{tYI^ zr;mJINDl>&tYedPGTgX%pViGBTrYUYBm9?sa-I0V;WR@MyVJtx_fTm1`6BJfIY5Bx zveMHOP05QB2TWHgKx8uLwH3Vg-}1{2lM2TzKhCC(d2LdEN9_&=`-a0h<9`QrVskTT zjqm-kH6o`GS?yPC3DlZ_ci+IhYvSJbZ56#~pgaChN#S&m#tQU5gss=mn{S|-%g_rJ zVl@j#N^8kxa!gOobK&fD&MaJ|TA9X_2EA^ZdTS5Y^&*J^NialxX=sBSv&Wj9I?12? z;eW^ZGgpswUPuoG5b*7htYgz|b-DLo;~2eT@&Q9PU^H-7$7*PW-P*;qY<9uj!$g#;s0a6O-+0YmKM}FdHuxDyj{=hPH4eIdx?Mx#>BVqc zV%O07-8XgbD1XiXX#~T;TA(+iA6L0&;w>7eRRgsx(JcuYgxNsaTL^I*+V8{8JLt_1 z(T!zasz~S1(U7@po?@ZQ{PZbKpS;A}>^Vw>F|=0f)wdH9GC=T5M@SzTMQ2Z4=36iS zh-aSsMzkQ#ap|D}Vi=O?T9rnt!}}lJqt|yim7 zsNV*61H4^7Vjo1<{rCzaC#1+aIjWUOPRyQVX6h7`(m1wl0fK(NkC3LnY=P$yt!H>l za9EbjcVGQ&zVpg&F+Ns1G%0aEdT4+MAuvq?*Y#+$+U)E$Xtlcxtc)S$Y5;Gm=DUE1SQ^v0$@E4KR{cba{ks+gQDn9+69(nL4vsO>HE)+RKA4Bw%5 z9UBc8|2sV^%6`X3Z3kU*)U`&oD^?coQTLM)M^)KIsC~i!nbC+`VAw0rI|6UX!2Q(3 zyJg_rG4YlS^p1qS@I7a_7Q$MF?tAEspQG2`MsM9hcN++4A?%VLXW54`c7}1MA zRBKF*&ydR%5K_|bb$p3(1Ufl)njd`o_j&f(%h5tO4@-{>kW9wndwo&&;m#NgR2x2Qajm&8uI2}-H616DtZX0-a zBBHxqSXQ zPh5F{iSZdM)1udF)9JS99U*n-#b>|GpZ(!~&sb&h(7K1wBLgI)Vj+uV8GLy2f$x>r zhlX8rf!K)BPC}G~>X#s#ZqIBt5pJKx)EsWH1h&me*Q4k5d1c&Ya)jGgNQuZec<;Z9 z_wfw~JSO3-4`rmI96M~=&x7?@0$|kr4|?W(j%j>p66Kf%Qbq`%>rXRUW(TE|-fYGmi9^vQCjOO}u+|(W@)y zy*=Nf^{^l~N}Wdm$EfQw;#x1+)ZeN1!$ZYD4&ASJnjH zrbIWSKP$fSz-^%0>*(Fv==JxZxeUD>@S32yXf1pLU-|1;hIWgS$ud@%V0L5b+0*>~Z~hriU44;E=JBl6^4I_ZV3{V_Y=%y!$KulZNQ?}2 zh!@5ps1Y&->X;O0A(7oKvfsz-ck%K?S|?6{6e!Q-LD!>Tz%%9133s~FLATnd+n++G zJF?CQ^bY7@236_cyo0Vg>R7r=r^=23vi;6Wt5R_=s8qf9mIh(qCKe8eLZF73pxXkq zA<>Hxbw{G^1`=k&pOO_V5RO9Fd!X*3Hs3@o{S)fJ+vx4P&}kw~3+()mac`Oy)$%wO z&t2om%g=FU;UZ2ZOS9deHZj9fS6|?pFa3~-v4>kZc@#bRq_8n67P375)CG3yP43-a zWo3PPpi+g7n&^Y2zue%@fy+1C_o<(8ki9O&d$;J0O;TStLwB-9w~*(CswAkzT33DyH-=Ps)A33~4>MByx= zbPh3jC0gE22thWRCkvE{6)NR%Uj>_4AY(hs&z@p@#0>3^LXTB~`18X$Sf)X%-DP{X z9;L;HbfA$QtCPTy_KkMWvQR)~YXj}NxK0LldIEF2Lap0lLMtY0gNiN5r&KMG%^|d= z|M!1~-r71`O*yU_^oZ)r$g-oVRHMocP_y)?`^A6bV1c2SYJ%eT4OOt5FI9vS+^;Us zYXY?-P!9r$vL?~n65Sz4;qN2#CNyv1Ex+wcl${ksaSmBIG2+IM$vDhRo#2T}&v5Dd zHD;$zK9Wm!6g^gegj6c#s7+K@-`eHg(t5&ZA7!K`zF+LPFF|yyjvpJ*o`>#rF&lMq z6E&)}876HDLqW6IdPSf&{CUD?iy-N;gOEGmE`wJ` z78l@%(;JP7hdnGkc7SNDF-?QX@iN_hpS^mEt)04`^~)%LFl2kg4g`BT+6V9q6WwlO zZEuh(mZ^-5Gd?j!*0O0d+RS7n^EnecZ~;e`^IY`qE_!ntwX}3N(~m0OukKNp|0w4k zCP|KR&VInz&z^`=jJY4nWESyM{0#oMmA*hXLGKFmmOyVw)RsTdx84;|)E>8k+WZt% zUq|F;5ZS7~_|PE}N0pB%`Gw>3$(Zo~~GgJuHtv zBmmRIbNhJh7P8YOE1-Jz9EDPbjO$An*Y%jqn^^JKh>%FfL9MOfz4OkXJkBtO(NP$6 z)H&(j!vMKoyHdwSN{E9bMf{rkq@_J}inm$dPnzchs+bd)X$^s1_a%y241U*r5K-U5 z+x-9`+sMf?L4xFG)z~C`CMs5RaVZ%q7x9#$*=)12z733yr2EY8OOfQ^cv)~Hm?Kzg zg}1kh=yfU1%u=dWDU~wxdkWq6m@Sx;Z5i3?!ZZ=3GHP)V_ZPo_zBk;nr~gj(-lX=A zD@hKz&T&+%FjIFF0Md5EsQ3N(@Ym@32IK3aO#{*7dHB)$ra-*l1t8*Wfxek*` zdY`{Zy@UOvOS){-wLVM9@UWC_vjxKPwF3dZdey~WTV++iZ4f1m_rWdPxBnNi<&zlu ztmpB#=`#lifN2=K^vq>C-5&qPfA|M(-B}{})lxDe1rR-4=pPXRBbUeR_gH%47vw7i z=FTios+6!yhnqVc92B)|GSyj5)v&H#r(bWPR#u1eNj__a+K>6ub&gu^AlLL)h2m|M z_)A9!jqrj4J-{nrUjGhq`t;}4tj`4?0Q0kx{N(%JU~OZE?VUQ?JN0PJq)}aMI8G#S zR1dgBYkzEnk*nyl|EBc!6%G$68yl)mKz387(I$Cu`U*yny%d zr>Ld1Q%zPCrD-l!!XbYy6q0VcAH*(mzfju%$=%XOA85f zx{AC3xnSIgDC7~PBK1Ng5}jM{{FRJ^2w(U_EDiywntDlaC&J%Ng@pc zr&y%ZYI5h7zvT9%3(U;aII%E+scp8m+w9~eC49+^5XjkCjM*7n!$7;iXv1TSb$%@L zIp6N9NMfpn^~yJ}e)N6JYfm6D2Mn|R4Cr%}AR!g=S*~1MKnThEAK#(f?hMr#9-N}+k(X*M~raEht%F~&<4o+s$HJ&KmV3MZZOTy&?6_sOjwf${4u z{mVk~*$=Dc% zWUt<$-Uue0P7Sh3NRAQ50iu>X`FCDQo}&qcptsB zgYJgIIlor5K5r70GS-XFWB=qgv48MAjQKf)@$gGuKQ8*h0TPmF8eBMgg6YXI>dh8g z+jZ*o7IE8S)L4>4_OH??t*|pTQVQzZyEN)8n#~p$7iKs=Uqfmzv_Q(h7B)@rT-44U z>gK2Zg}yeBKUWf!3g%PS$o$)XL*@^D4^b?9(M^izO9POQDy0I`wK2-2Jg)1pxV)Z> zqYVWRb);>jQ{|;;(rz@_Tw0+rHpax8E)A-(RB*6PBu%SplG&-m7^fGozV}`1AATS6scTCyN`k~wu~?U zD$Qm)5z8A)L^s$^q{$0F2t3nZadDaLt!*wod70Un8bt$kgkT#e;^&L$`}gshEq{)u zuj#WRA+Ue+12TX1udsjcFEGxY{=$v%{pd>tkT?k;$mblUCaY9SMT*5dQc9YwHtlwI z;O_N*2EHsE#zTU|LJb4MG-$7Huv2ef=L?j}B~H#w&;eQm+1K3;W-bpOd;s_FqpS?t zFb9i`eoc=~`8>w?bJ*YeHujHyi1pI*7}L{VT5!OZ7$6}ThQZ9#INx~gDp@B(qt#|< zb(3DN?}H+ddO`v$TI;~|Ytrw#blV+n-+h3c%W>t|r?72_0`>q^EK-=AL;ma^;mtSj z@10+u4)iQI_lgv#|0Gjp9 zZTfwGyn7rViG2c~SSDzwFRjpb732#{PESzHJ1hZxpwO2XH*Ubu!&6_~x%G z8Bbm%^IJc{{@tHozWfr#^weV=7W-M!R|+7xY=)C_Q_RoS$YmY6y*{p|==S^c``$>9 zD5X$ZV`VZ(DQIu+Qg5`_u6LN7uQ7FQo(9kbymlYCxrJS?BktWpbUP@^{u(3?Lm3+} zK8A7O0`?ETkNulJ#CrLq&ovYGanM%^AR*zCvz%ikVuGz9IR$W&iqTiE#rQ!*)6A03W%24uhg&s92 z_SZB-qFP1HOk-R)hxz=on9o0ldHLcO-KmV;_Vy!hrjtb z|M|7ISzKC+>O`sYLLjv!Q_RywbMJ%q`A@3P!sRPmtW?QNTC9~Oacd`;s7+Jd+`{N| zP_~7(%+G(k$XAHO_!#E(Ygj-0KGrv0M9$41Z2RyNzvT3lRI$<|r6lWQ7_XFAn4jXp z>3Qa7CNZRBuhFE_?IlMm8V1rdaqD$DjV6t5A2VNI_RLB4suoSxW#Ys4DXc7$+ucGL zCT=G4bp}eBGB(D!Gg#mL4KhFZP2Y9<^fh0dvPRF5{8gi034nx@bu!FOO>pVlNlwhx z$k;XrXm`4ZV9Jbc&jl$kOcUj~xSbAb%gdOi!}RIP)Ms<_vnGW*4=69*r~2Ry%CzZc z^IxZ*0N6HUvxu=V%qOp6z522bjBkAt^ZZ#vvG}EqYaExp@+#IS%GfsNPtP+qJ;}d# z^%*|;^gh3M>qB09>jVDj?Hkd$60%&zuq?cl2i*MWKk~P=85YKVoB31Y+`sZPwYT5p z#CvaGC>6v*z6OX~IEnepQ&`VEgK_nWuS#XJ@FmNkdR+7?2@vo>lCf>7!K_RE#-o1vx*5arFx3l}i{G&Ld}zzwY=~jecbT5~oV3z>7~`=DBMZ z`2D>mH*VhLr~mve|Md0^-nn6LUkG~3ORT*03ylBwNhqJD_~Ln5*PmtY!c|HieT3cX z&@~Md^4G%_krGiV`5vj~p2d9jX^cx3kkeDY62|vY>DK}vAsL3jc(uf}OJ|rIEA#3L z*H~O$YrnbPhh_CP0Zb0)ZM$k`Wlv#LC()(oIHU% za~k9PIgI&P#N;HhHi4*Cf2Hh;qtLGvKtd`N^OTBtLJ$4j2dljI#ChI&>jSF)_&U3t zb>ae!HMYHEpoSa}hmtkyc6YJmoJNp0ozo*%A@r3;9d$Y1x zc1s^aO`%5=?>5HJR0kRLdu8R-?(d{Dt;iq`Nc%9Db z8s5$hG+XFK1Kn()>kV|f1>M7!C;nW?vJkl}WOM#Zl7&1XmqS*o$k}Pc)D&{6hMb*2 z&dvH0B>b97i&6A7K#oY-bR~kqal0^K-v;hW4Y-*8n*t>2@2vS4TIS=teX6ZTOO8ua4f^^S5Rz zT3MG?%RjH%g}w{@9=h*>>w@Q@Rj}Acv`A2}cA1a}LxO4g62Y>-GJWRGW)Zn8B9})v zHe_?iatTo?A_@gWx$OU)%R(-YAjP8p`)g)sKMH*fkjF^6(?xA+uP`R9lgDS z+TKBL@AyD!cc9(&!PD)5+XvSJ<)PI8Ai|I!jR7DW#|K3CTQ2*_fn!xfu@EH+it%xO f|7&&WvC#hyTOy+W%Oz4Z00000NkvXXu0mjfmE(y& diff --git a/openvidu-demo/src/main/resources/static/img/kurento.png b/openvidu-demo/src/main/resources/static/img/kurento.png deleted file mode 100644 index 6f1a4ad3b243c7a31ddff38a00835b7e5eea30ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6499 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 JPDHLkV1gbuNT~n- diff --git a/openvidu-demo/src/main/resources/static/img/mario-wings.png b/openvidu-demo/src/main/resources/static/img/mario-wings.png deleted file mode 100644 index cc890036768592f06317144348de7b14786c8e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42037 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 A5&!@I diff --git a/openvidu-demo/src/main/resources/static/img/noVideo.png b/openvidu-demo/src/main/resources/static/img/noVideo.png deleted file mode 100644 index 12197a7dd505d0e1858c9643ecc515af0d05c149..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7813 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 diff --git a/openvidu-demo/src/main/resources/static/img/wizard.png b/openvidu-demo/src/main/resources/static/img/wizard.png deleted file mode 100644 index 4435c1d49471016cfcb466f9e7d53be12d55b45f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12367 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

5pMh3+WU6Uk+M<^g`=;TsRFy`^ zhYzTkf*z>h@Q#sQ$OyTB>qeRttQX-c9*<{LHF$4wMy7Er2*DyptKxy0oydvHp_* zA3l80t18q`YR7CQ*bb;H+L~tGtKB)dKl{@p=6g()*uT!pc;(J3fm`LaCIc$`f8j(X z;zC)XhOC7CkZmL)JRLW;!`oeOo~NH)dpeZHL!5XYtG10_yE;-w-3XR`)2P<_4W=m= znh21~?WK4}$JpxCWnCC@MxgCEDg&eO8#EuD~5}xA4Cf$ z?Lj3-O%X>+7+vk>u4PhAx9sqX&(Ls0m8b~R5}bm9{f9Js0s?w9iFU7Ty<0O_2e*%o zWOa3kP*G8jH#1z|xM5c?YC}K?GUiJujK^_BghF4wh4-V>=1K0j_M?Z%_sRp@e z5?~o2S{T>&7N0h69yig+OHbOSc8$)zRE(z%+srX9{3wYq<&Je0uHwCw=~$2O^UTgR zmu!m|X#jN&=nU=)Kh`H3eu?5YJ)473gG{H_7AOKbL8AA^l4Js|Kv=v0^}48$5fu%3 zjvN}*OPhAob}TBp_;!qyq-Y|J$03ju-hxIL=qoo?Sh~9>_H*N$D>--bO_t9yn+l)U zU9iPeP7WCCLN$_lGM)*!g~|+lUp7lQHVCfxA!gbhofqj?(STa2Tls-bUI5(j7)}Nl zb==y&hsYj?62K%!2Dz3UpQQt~K;F2b6nXc9D|@tleBXrgrPbAOKEGs%_4CaeXm(I6 z$NoC4`Hz!WYI@8z1l{nMKGwK{R~SoL#|_Zd(n3zk?<}RNii7tNY7+F|l_~n3B!ub{ zr~@D?nd&4I&*G8Q*7K=D?6a3Wl_y2XC@3C-id3_mCwYfuIkY%mN-^PE3}zU1<7{Hw zDXHRYL{ivZyK*)A+DehB?q2k-wPmw z5g`QIcw0EWm^>?6LvY-7^whzrHqV`j*uz6--xd?Fe)(m@4q6p;qRtKSlpZL7Y`>XO zHNW&%&+!-kxVHLvwu$a5tv)t68Csy2O7jvEKFJHxAZ7#(W#Jw{59Iz6?x`$*0>}eN zzXa$-(5X|AwK_3^0(h1qP07KpQ1Dz(y4 z+a+rrb7!_^w@PT7L^-43YqI^56B8j{zfySm_<%eKwo1VqS?Nol#lNOO@WZGpNkm!^ z(SsAp#NI(<;`6hoI$UyJp?|nMN$8G=+xcDTTuITZSzltZAMEa)PLjU54G@($mW5CIOxO1;aK~qvwv8x zV`Q@>u!|%J3B;4AV2i=xIUteFsrG{!8f@YzI+uyNV5TWC%#r^nt4ZW>gK>ld$qsln zC9vf7!rD-c#GmH zWQ&NM+KHjL>BhOC(`K_@pPRi`+_~7)pX8mCPafMkqkf6md34pacTwXjm8;f%eJudG z!HDs3_5T`qX$lg!ctGq6I4Y3I4RDYkYy=uq-M<%Al(w_@;<>-Yvsgj93^ z3&SxaOlW^m<;gy{e@7+8mwasidP31Ndrly}uqyyfi`bxT*#|oCpckzl&SgB5Fj8B@ z;x_T-<3!)$TYPgqY+7ZPNgCDLyG3Vy!K2xBckb8Z#;%Q8!mI)e10gC! zwH=^e^4GaOnoxNn+Oc+S7DY!pxkcuHt__M6gL)b*bM`x@Qk%sh*CuL-IpssTz4^0Y zj4vBmcnKA&8FF-mF;N2Tv_KE=2^an$<{=M~X@mI6k5Kiv%v_$xBvD(5-ZTk%1!b}& z`OZAHr2HO*vA*G#tO7o15hhf`}A)e{CzsoKvyoPQ#NQ-Ee13?Wn|2A_~d_A56B7=1nT+I|rzE7%sf4 zMiBcr4-n{-P-#$snO6`})(Mr3IYsO*-Ci9h`7QJsx zg8W>@!N&#r49R%`uQ9@5b0soaThisdcpEtA)_#WA zYM@Y+7uCCDvDcH+w|$B@|h z!{zbe_rLMx9flPzj0Iy}k#zrnl(TKWc#ll`K98fVwrD*;AKi37XPNr*2|4p~Nj@wQ zznVStik~{tqzAt)=0?`K;+2F@+k-qqliA1Da{lE Q|6>b~msXLgfSZN - - - -Kurento Room Demo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- -
- - diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/AddRemoveUsersDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/AddRemoveUsersDemoTest.java deleted file mode 100644 index 05e2f14c..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/AddRemoveUsersDemoTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo.test; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.browser.AddRemoveUsers; - -/** - * @see AddRemoveUsers - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class AddRemoveUsersDemoTest extends AddRemoveUsers { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), NUM_USERS, - WebPageType.ROOT); - } -} diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/AddRemoveUsersNoSinkVerifyDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/AddRemoveUsersNoSinkVerifyDemoTest.java deleted file mode 100644 index 85ddfb0b..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/AddRemoveUsersNoSinkVerifyDemoTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo.test; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.browser.AddRemoveUsersNoSinkVerify; - -/** - * @see AddRemoveUsersNoSinkVerify - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class AddRemoveUsersNoSinkVerifyDemoTest extends AddRemoveUsersNoSinkVerify { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), NUM_USERS, - WebPageType.ROOT); - } -} diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/NUsersEqualLifetimeDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/NUsersEqualLifetimeDemoTest.java deleted file mode 100644 index be47fbee..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/NUsersEqualLifetimeDemoTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo.test; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.browser.NUsersEqualLifetime; - -/** - * @see NUsersEqualLifetime - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class NUsersEqualLifetimeDemoTest extends NUsersEqualLifetime { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), NUM_USERS, - WebPageType.ROOT); - } - -} diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/OneUserQuickReentryDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/OneUserQuickReentryDemoTest.java deleted file mode 100644 index 8ab481ea..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/OneUserQuickReentryDemoTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo.test; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.browser.OneUserQuickReentry; - -/** - * @see OneUserQuickReentry - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class OneUserQuickReentryDemoTest extends OneUserQuickReentry { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), NUM_USERS, - WebPageType.ROOT); - } -} diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/SeqAddRemoveUserDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/SeqAddRemoveUserDemoTest.java deleted file mode 100644 index 34007ea2..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/SeqAddRemoveUserDemoTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo.test; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.browser.SeqAddRemoveUser; - -/** - * @see SeqAddRemoveUser - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class SeqAddRemoveUserDemoTest extends SeqAddRemoveUser { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), NUM_USERS, - WebPageType.ROOT); - } - -} diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/SeqNUsersEqualLifetimeDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/SeqNUsersEqualLifetimeDemoTest.java deleted file mode 100644 index 714a2ef9..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/SeqNUsersEqualLifetimeDemoTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo.test; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.browser.SeqNUsersEqualLifetime; - -/** - * @see SeqNUsersEqualLifetime - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class SeqNUsersEqualLifetimeDemoTest extends SeqNUsersEqualLifetime { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), NUM_USERS, - WebPageType.ROOT); - } - -} diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/TwoUsersEqualLifetimeDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/TwoUsersEqualLifetimeDemoTest.java deleted file mode 100644 index 1ddbc09a..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/TwoUsersEqualLifetimeDemoTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo.test; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.browser.TwoUsersEqualLifetime; - -/** - * @see TwoUsersEqualLifetime - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class TwoUsersEqualLifetimeDemoTest extends TwoUsersEqualLifetime { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), NUM_USERS, - WebPageType.ROOT); - } - -} diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/UnpublishMediaDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/UnpublishMediaDemoTest.java deleted file mode 100644 index 60139419..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/UnpublishMediaDemoTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo.test; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.browser.UnpublishMedia; - -/** - * @see UnpublishMedia - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class UnpublishMediaDemoTest extends UnpublishMedia { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), NUM_USERS, - WebPageType.ROOT); - } - -} diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/UnsubscribeFromMediaDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/UnsubscribeFromMediaDemoTest.java deleted file mode 100644 index dd904538..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/UnsubscribeFromMediaDemoTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo.test; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.browser.UnsubscribeFromMedia; - -/** - * @see UnsubscribeFromMedia - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class UnsubscribeFromMediaDemoTest extends UnsubscribeFromMedia { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), NUM_USERS, - WebPageType.ROOT); - } -} diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/WebAppAvailabilityDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/WebAppAvailabilityDemoTest.java deleted file mode 100644 index 7892d927..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/WebAppAvailabilityDemoTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.openvidu.demo.test; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.browser.WebAppAvailability; - -/** - * @author Radu Tom Vlad (rvlad@naevatec.com) - * @see WebAppAvailability - */ -public class WebAppAvailabilityDemoTest extends WebAppAvailability { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), NUM_USERS, - WebPageType.ROOT); - } -} diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/fake/ExtraKmsFakeUsersDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/fake/ExtraKmsFakeUsersDemoTest.java deleted file mode 100644 index 6037a0cb..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/fake/ExtraKmsFakeUsersDemoTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.openvidu.demo.test.fake; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.fake.ExtraKmsFakeUsers; - -/** - * @see ExtraKmsFakeUsers - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class ExtraKmsFakeUsersDemoTest extends ExtraKmsFakeUsers { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), NUM_USERS, - WebPageType.ROOT); - } - -} diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/fake/MixedUsersDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/fake/MixedUsersDemoTest.java deleted file mode 100644 index f81326b9..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/fake/MixedUsersDemoTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.openvidu.demo.test.fake; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.fake.MixedUsers; - -/** - * @see MixedUsers - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class MixedUsersDemoTest extends MixedUsers { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), CHROME_SPINNER_USERS, - WebPageType.ROOT); - } - -} diff --git a/openvidu-demo/src/test/java/io/openvidu/demo/test/fake/ParallelNFakeUsersDemoTest.java b/openvidu-demo/src/test/java/io/openvidu/demo/test/fake/ParallelNFakeUsersDemoTest.java deleted file mode 100644 index 785fe985..00000000 --- a/openvidu-demo/src/test/java/io/openvidu/demo/test/fake/ParallelNFakeUsersDemoTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * (C) Copyright 2015 Kurento (http://kurento.org/) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.openvidu.demo.test.fake; - -import java.lang.invoke.MethodHandles; -import java.util.Collection; - -import org.junit.runners.Parameterized.Parameters; -import org.kurento.test.browser.WebPageType; - -import io.openvidu.test.fake.ParallelNFakeUsers; - -/** - * @see ParallelNFakeUsers - * @author Radu Tom Vlad (rvlad@naevatec.com) - */ -public class ParallelNFakeUsersDemoTest extends ParallelNFakeUsers { - - @Override - public void setupBrowserTest() throws InterruptedException { - webPageType = WebPageType.ROOT; - super.setupBrowserTest(); - } - - @Parameters(name = "{index}: {0}") - public static Collection data() { - return localChromes(MethodHandles.lookup().lookupClass().getSimpleName(), NUM_USERS, - WebPageType.ROOT); - } -} diff --git a/openvidu-demo/src/test/resources/log4j.properties b/openvidu-demo/src/test/resources/log4j.properties deleted file mode 100644 index 26299d69..00000000 --- a/openvidu-demo/src/test/resources/log4j.properties +++ /dev/null @@ -1,22 +0,0 @@ -log4j.rootLogger=WARN,CONSOLE,file -log4j.logger.org.kurento=INFO -log4j.logger.org.kurento.client.internal=WARN -log4j.logger.org.kurento.room=DEBUG -log4j.logger.io.github.bonigarcia=DEBUG -log4j.logger.org.kurento.commons=DEBUG -log4j.logger.org.kurento.test=DEBUG - -# Appenders -log4j.threshold=ALL - -log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender -log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout -log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p %c [%t] (%F:%L) - %m%n - -log4j.appender.file=org.apache.log4j.RollingFileAppender -log4j.appender.file.File=target/kurento-room-demo-test.log -log4j.appender.file.ImmediateFlush=true -log4j.appender.file.MaxFileSize=10MB -log4j.appender.file.MaxBackupIndex=50 -log4j.appender.file.layout=org.apache.log4j.PatternLayout -log4j.appender.file.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%t] %c (%F:%L(%M)) - %m%n diff --git a/openvidu-demo/src/test/resources/test.conf.json b/openvidu-demo/src/test/resources/test.conf.json deleted file mode 100644 index a02fcc75..00000000 --- a/openvidu-demo/src/test/resources/test.conf.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "kurento": { - "client": { - //milliseconds - "requestTimeout": 20000 - }, - "test": { - "fake": { - //"kmsUri": "ws://127.0.0.1:8888/kurento", - "wr": { - //absolute path on the KMS's machine or http resource - //"files": "/tmp", - - //readable by the user that runs KMS (default is nobody:nogroup) - //"filenames": [] - } - }, - "chrome": { - //if not absolute path, is considered relative to user's home - //"files": "/tmp", - - //accessible to the user that runs the test - "filenames": { - "wav": [], - "y4m": ["video/15sec/rgbHD.y4m"] - } - } - } - } -} diff --git a/pom.xml b/pom.xml index 59c3dedf..67d95c0e 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ io.openvidu openvidu - 0.0.1-SNAPSHOT + 1.0.0-beta.1 pom OpenVidu @@ -72,9 +72,7 @@ openvidu-client openvidu-browser openvidu-test - openvidu-demo openvidu-testapp - openvidu-sample-app openvidu-java-client @@ -123,11 +121,6 @@ openvidu-test ${version.openvidu} - - io.openvidu - openvidu-demo - ${version.openvidu} - io.openvidu openvidu-basicapp