1<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html"> 2 <head> 3 4 <meta charset="utf-8"> 5 <meta http-equiv="content-type" content="text/html;charset=utf-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"> 7 <meta name="theme-color" content="#2A3A4B"> 8 <base href="/" /> 9 10 11 <link rel="apple-touch-icon" href="images/apple-touch-icon.png"> 12 <link rel="stylesheet" href="css/all.css?v=9268"> 13 14 <link rel="manifest" id="manifest-placeholder"> 15 16
16<script> 17 function contextRoot(pathname) { 18 const contextRootEndIndex = pathname.lastIndexOf('/'); 19 20 return ( 21 contextRootEndIndex === -1 22 ? '/' 23 : pathname.substring(0, contextRootEndIndex + 1) 24 ); 25 } 26 window.EXCALIDRAW_ASSET_PATH = 'libs/excalidraw/'; 27 // Dynamically generate the manifest location URL. It must be served from the document origin, and we may have 28 // the base pointing to the CDN. This way we can generate a full URL which will bypass the base. 29 document.querySelector('#manifest-placeholder').setAttribute('href', window.location.origin + contextRoot(window.location.pathname) + 'manifest.json'); 30 31 document.addEventListener('DOMContentLoaded', () => { 32 if (!JitsiMeetJS.app) { 33 return; 34 } 35 36 JitsiMeetJS.app.renderEntryPoint({ 37 Component: JitsiMeetJS.app.entryPoints.APP 38 }) 39 40 const isEmbedded = () => { 41 try { 42 return window.self !== window.top; 43 } catch (e) { 44 return true; 45 } 46 }; 47 48 const isElectron = navigator.userAgent.includes('Electron'); 49 const shouldRegisterWorker = !isElectron && !isEmbedded() && 'serviceWorker' in navigator; 50 51 if (shouldRegisterWorker) { 52 navigator.serviceWorker 53 .register(window.location.origin + contextRoot(window.location.pathname) + 'pwa-worker.js') 54 .then(reg => { 55 console.log('Service worker registered.', reg); 56 }) 57 .catch(err => { 58 console.log(err); 59 }); 60 } 61 }); 62 </script>
62 63
63<script> 64 // IE11 and earlier can be identified via their user agent and be 65 // redirected to a page that is known to have no newer js syntax. 66 if (window.navigator.userAgent.match(/(MSIE|Trident)/)) { 67 var roomName = encodeURIComponent(window.location.pathname); 68 window.location.pathname = 'static/recommendedBrowsers.html'; 69 } 70 71 window.indexLoadedTime = window.performance.now(); 72 console.log("(TIME) index.html loaded:\t", indexLoadedTime); 73 window.addEventListener('load', function() { 74 window.loadedEventTime = window.performance.now(); 75 console.log("(TIME) window loaded event:\t", loadedEventTime); 76 }); 77 78 // XXX the code below listeners for errors and displays an error message 79 // in the document body when any of the required files fails to load. 80 // The intention is to prevent from displaying broken page. 81 var criticalFiles = [ 82 "config.js", 83 "utils.js", 84 "do_external_connect.js", 85 "interface_config.js", 86 "lib-jitsi-meet.min.js", 87 "app.bundle.min.js", 88 "all.css?v=9268" 89 ]; 90 var loadErrHandler = function(e) { 91 var target = e.target; 92 // Error on
92<script> and <link>(CSS) 93 //
93<script> will have .src and <link> .href 94 var fileRef = (target.src ? target.src : target.href); 95 if (("SCRIPT" === target.tagName || "LINK" === target.tagName) 96 && criticalFiles.some( 97 function(file) { return fileRef.indexOf(file) !== -1 })) { 98 window.onload = function() { 99 // The whole complex part below implements page reloads with 100 // "exponential backoff". The retry attempt is passes as 101 // "rCounter" query parameter 102 var href = window.location.href; 103 104 var retryMatch = href.match(/.+(\?|&)rCounter=(\d+)/); 105 var retryCountStr = retryMatch ? retryMatch[2] : "0"; 106 var retryCount = Number.parseInt(retryCountStr); 107 108 if (retryMatch == null) { 109 var separator = href.indexOf("?") === -1 ? "?" : "&"; 110 var hashIdx = href.indexOf("#"); 111 112 if (hashIdx === -1) { 113 href += separator + "rCounter=1"; 114 } else { 115 var hashPart = href.substr(hashIdx); 116 117 href = href.substr(0, hashIdx) 118 + separator + "rCounter=1" + hashPart; 119 } 120 } else { 121 var separator = retryMatch[1]; 122 123 href = href.replace( 124 /(\?|&)rCounter=(\d+)/, 125 separator + "rCounter=" + (retryCount + 1)); 126 } 127 128 var delay = Math.pow(2, retryCount) * 2000; 129 if (isNaN(delay) || delay < 2000 || delay > 60000) 130 delay = 10000; 131 132 var showMoreText = "show more"; 133 var showLessText = "show less"; 134 135 document.body.innerHTML 136 = "<div style='" 137 + "position: absolute;top: 50%;left: 50%;" 138 + "text-align: center;" 139 + "font-size: medium;" 140 + "font-weight: 400;" 141 + "transform: translate(-50%, -50%)'>" 142 + "Uh oh! We couldn't fully download everything we needed :(" 143 + "<br/> " 144 + "We will try again shortly. In the mean time, check for problems with your Internet connection!" 145 + "<br/><br/> " 146 + "<div id='moreInfo' style='" 147 + "display: none;'>" + "Missing " + fileRef 148 + "<br/><br/></div>" 149 + "<a id='showMore' style='" 150 + "text-decoration: underline;" 151 + "font-size:small;" 152 + "cursor: pointer'>" + showMoreText + "</a>" 153 + " " 154 + "<a id ='reloadLink' style='" 155 + "text-decoration: underline;" 156 + "font-size:small;" 157 + "'>reload now</a>" 158 + "</div>"; 159 160 var reloadLink = document.getElementById('reloadLink'); 161 reloadLink.setAttribute('href', href); 162 163 var showMoreElem = document.getElementById("showMore"); 164 showMoreElem.addEventListener('click', function () { 165 var moreInfoElem 166 = document.getElementById("moreInfo"); 167 168 if (showMoreElem.innerHTML === showMoreText) { 169 moreInfoElem.setAttribute( 170 "style", 171 "display: block;" 172 + "color:#FF991F;" 173 + "font-size:small;" 174 + "user-select:text;");
175 showMoreElem.innerHTML = showLessText; 176 } 177 else { 178 moreInfoElem.setAttribute( 179 "style", "display: none;"); 180 showMoreElem.innerHTML = showMoreText; 181 } 182 }); 183 184 window.setTimeout( 185 function () { window.location.replace(href); }, delay); 186 187 // Call extra handler if defined. 188 if (typeof postLoadErrorHandler === "function") { 189 postLoadErrorHandler(fileRef); 190 } 191 }; 192 window.removeEventListener( 193 'error', loadErrHandler, true /* capture phase */); 194 } 195 }; 196 window.addEventListener( 197 'error', loadErrHandler, true /* capture phase type of listener */); 198 </script>
198 199
199<script>// Jitsi Meet configuration. 200 201var config = {}; 202 203config.hosts = {}; 204config.hosts.domain = 'meet.jitsi'; 205 206var subdir = ''; 207var subdomain = ''; 208if (subdir.startsWith('<!--')) { 209 subdir = ''; 210} 211if (subdomain) { 212 subdomain = subdomain.substring(0,subdomain.length-1).split('.').join('_').toLowerCase() + '.'; 213} 214config.hosts.muc = 'muc.' + subdomain + 'meet.jitsi'; 215config.bosh = 'https://meet.sindominio.net/' + subdir + 'http-bind'; 216config.websocket = 'wss://meet.sindominio.net/' + subdir + 'xmpp-websocket'; 217config.bridgeChannel = { 218 preferSctp: true 219}; 220 221 222// Video configuration. 223// 224 225config.resolution = 720; 226config.constraints = { 227 video: { 228 height: { ideal: 720, max: 720, min: 180 }, 229 width: { ideal: 1280, max: 1280, min: 320}, 230 } 231}; 232 233config.startVideoMuted = 10; 234config.startWithVideoMuted = false; 235 236config.flags = { 237 sourceNameSignaling: true, 238 sendMultipleVideoStreams: true, 239 receiveMultipleVideoStreams: true 240}; 241 242// ScreenShare Configuration. 243// 244 245// Audio configuration. 246// 247 248config.enableNoAudioDetection = true; 249config.enableTalkWhileMuted = false; 250config.disableAP = false; 251config.disableAGC = false; 252 253config.audioQuality = { 254 stereo: false 255}; 256 257config.startAudioOnly = false; 258config.startAudioMuted = 10; 259config.startWithAudioMuted = false; 260config.startSilent = false; 261config.enableOpusRed = false; 262config.disableAudioLevels = false; 263config.enableNoisyMicDetection = true; 264 265 266// Peer-to-Peer options. 267// 268 269config.p2p = { 270 enabled: true, 271 codecPreferenceOrder: ["AV1", "VP9", "VP8", "H264"], 272 mobileCodecPreferenceOrder: ["VP8", "VP9", "H264", "AV1"] 273}; 274 275// Breakout Rooms 276// 277 278config.hideAddRoomButton = false; 279 280 281// Etherpad 282// 283 284// Recording. 285// 286 287config.hiddenDomain = 'recorder.meet.jitsi'; 288config.recordingService = { 289 // Whether to enable file recording or not using the "service" defined by the finalizer in Jibri 290 enabled: true, 291 292 // Whether to show the possibility to share file recording with other people 293 // (e.g. meeting participants), based on the actual implementation 294 // on the backend. 295 sharingEnabled: false 296}; 297 298// Live streaming configuration. 299config.liveStreaming = { 300 enabled: false, 301 dataPrivacyLink: 'https://policies.google.com/privacy', 302 helpLink: 'https://jitsi.org/live', 303 termsLink: 'https://www.youtube.com/t/terms', 304 validatorRegExpString: '^(?:[a-zA-Z0-9]{4}(?:-(?!$)|$)){4}' 305}; 306 307 308// Local recording configuration. 309config.localRecording = { 310 disable: false, 311 notifyAllParticipants: false, 312 disableSelfRecording: false 313}; 314 315 316// Analytics. 317// 318 319config.analytics = {}; 320 321// Dial in/out services. 322// 323 324 325// Calendar service integration. 326// 327 328config.enableCalendarIntegration = false; 329 330// Invitation service. 331// 332 333// Miscellaneous. 334// 335 336// Prejoin page. 337config.prejoinConfig = { 338 enabled: true, 339 340 // Hides the participant name editing field in the prejoin screen. 341 hideDisplayName: false 342}; 343 344// List of buttons to hide from the extra join options dropdown on prejoin screen. 345// Welcome page. 346config.welcomePage = { 347 disabled: false 348}; 349 350// Close page. 351config.enableClosePage = false; 352 353// Default language. 354// Require users to always specify a display name. 355config.requireDisplayName = false; 356 357// Chrome extension banner. 358// Disables profile and the edit of all fields from the profile settings (display name and email) 359config.disableProfile = false; 360 361// Room password (false for anything, number for max digits) 362config.roomPasswordNumberOfDigits = false; 363// Advanced. 364// 365 366// Transcriptions (subtitles and buttons can be configured in interface_config) 367config.transcription = { 368 enabled: false, 369 disableClosedCaptions: true, 370 translationLanguages: [], 371 translationLanguagesHead: ['en'], 372 useAppLanguage: true, 373 preferredLanguage: 'en-US', 374 disableStartForAll: false, 375 autoCaptionOnRecord: false, 376}; 377 378// Dynamic branding 379// Deployment information. 380// 381 382config.deploymentInfo = {}; 383 384// Deep Linking 385config.disableDeepLinking = false; 386 387// P2P preferred codec 388// Video quality settings. 389// 390 391config.videoQuality = {}; 392config.videoQuality.codecPreferenceOrder = ["AV1", "VP9", "VP8", "H264"]; 393config.videoQuality.mobileCodecPreferenceOrder = ["VP8", "VP9", "H264", "AV1"]; 394config.videoQuality.enableAdaptiveMode = true; 395 396config.videoQuality.av1 = {}; 397 398config.videoQuality.h264 = {}; 399 400config.videoQuality.vp8 = {}; 401 402config.videoQuality.vp9 = {}; 403 404// Reactions 405config.disableReactions = false;
406 407// Polls 408config.disablePolls = false; 409 410// Configure toolbar buttons 411// Hides the buttons at pre-join screen 412// Configure remote participant video menu 413config.remoteVideoMenu = { 414 disabled: false, 415 disableKick: false, 416 disableGrantModerator: false, 417 disablePrivateChat: false 418}; 419 420// Configure e2eping 421config.e2eping = { 422 enabled: false 423}; 424 425 426 427// Settings for the Excalidraw whiteboard integration. 428config.whiteboard = { 429 enabled: false, 430}; 431 432// JaaS support: pre-configure image if JAAS_APP_ID was set. 433// Testing 434config.testing = { 435 enableCodecSelectionAPI: true 436}; 437</script>
437<!-- adapt to your needs, i.e. set hosts and bosh path --> 438
438<script>/* eslint-disable no-unused-vars, no-var, max-len */ 439/* eslint sort-keys: ["error", "asc", {"caseSensitive": false}] */ 440 441/** 442 * !!!IMPORTANT!!! 443 * 444 * This file is considered deprecated. All options will eventually be moved to 445 * config.js, and no new options should be added here. 446 */ 447 448var interfaceConfig = { 449 APP_NAME: 'Jitsi Meet', 450 AUDIO_LEVEL_PRIMARY_COLOR: 'rgba(255,255,255,0.4)', 451 AUDIO_LEVEL_SECONDARY_COLOR: 'rgba(255,255,255,0.2)', 452 453 /** 454 * A UX mode where the last screen share participant is automatically 455 * pinned. Valid values are the string "remote-only" so remote participants 456 * get pinned but not local, otherwise any truthy value for all participants, 457 * and any falsy value to disable the feature. 458 * 459 * Note: this mode is experimental and subject to breakage. 460 */ 461 AUTO_PIN_LATEST_SCREEN_SHARE: 'remote-only', 462 BRAND_WATERMARK_LINK: '', 463 464 CLOSE_PAGE_GUEST_HINT: false, // A html text to be shown to guests on the close page, false disables it 465 466 DEFAULT_BACKGROUND: '#040404', 467 DEFAULT_WELCOME_PAGE_LOGO_URL: 'images/watermark.svg', 468 469 DISABLE_DOMINANT_SPEAKER_INDICATOR: false, 470 471 /** 472 * If true, notifications regarding joining/leaving are no longer displayed. 473 */ 474 DISABLE_JOIN_LEAVE_NOTIFICATIONS: false, 475 476 /** 477 * If true, presence status: busy, calling, connected etc. is not displayed. 478 */ 479 DISABLE_PRESENCE_STATUS: false, 480 481 /** 482 * Whether the speech to text transcription subtitles panel is disabled. 483 * If {@code undefined}, defaults to {@code false}. 484 * 485 * @type {boolean} 486 */ 487 DISABLE_TRANSCRIPTION_SUBTITLES: false, 488 489 /** 490 * Whether or not the blurred video background for large video should be 491 * displayed on browsers that can support it. 492 */ 493 DISABLE_VIDEO_BACKGROUND: false, 494 495 DISPLAY_WELCOME_FOOTER: true, 496 DISPLAY_WELCOME_PAGE_ADDITIONAL_CARD: false, 497 DISPLAY_WELCOME_PAGE_CONTENT: false, 498 DISPLAY_WELCOME_PAGE_TOOLBAR_ADDITIONAL_CONTENT: false, 499 500 ENABLE_DIAL_OUT: true, 501 502 FILM_STRIP_MAX_HEIGHT: 120, 503 504 GENERATE_ROOMNAMES_ON_WELCOME_PAGE: true, 505 506 /** 507 * Hide the invite prompt in the header when alone in the meeting. 508 */ 509 HIDE_INVITE_MORE_HEADER: false, 510 511 JITSI_WATERMARK_LINK: 'https://jitsi.org', 512 513 LANG_DETECTION: true, // Allow i18n to detect the system language 514 LOCAL_THUMBNAIL_RATIO: 16 / 9, // 16:9 515 516 /** 517 * Maximum coefficient of the ratio of the large video to the visible area 518 * after the large video is scaled to fit the window. 519 * 520 * @type {number} 521 */ 522 MAXIMUM_ZOOMING_COEFFICIENT: 1.3, 523 524 /** 525 * Whether the mobile app Jitsi Meet is to be promoted to participants 526 * attempting to join a conference in a mobile Web browser. If 527 * {@code undefined}, defaults to {@code true}. 528 * 529 * @type {boolean} 530 */ 531 MOBILE_APP_PROMO: true, 532 533 // Names of browsers which should show a warning stating the current browser 534 // has a suboptimal experience. Browsers which are not listed as optimal or 535 // unsupported are considered suboptimal. Valid values are: 536 // chrome, chromium, electron, firefox , safari, webkit 537 OPTIMAL_BROWSERS: [ 'chrome', 'chromium', 'firefox', 'electron', 'safari', 'webkit' ], 538 539 POLICY_LOGO: null, 540 PROVIDER_NAME: 'Jitsi', 541 542 /** 543 * If true, will display recent list 544 * 545 * @type {boolean} 546 */ 547 RECENT_LIST_ENABLED: true, 548 REMOTE_THUMBNAIL_RATIO: 1, // 1:1 549 550 SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile', 'calendar', 'shortcuts', 'sounds', 'more' ], 551 552 /** 553 * Specify which sharing features should be displayed. If the value is not set 554 * all sharing features will be shown. You can set [] to disable all. 555 */ 556 // SHARING_FEATURES: ['email', 'url', 'dial-in', 'embed'], 557 558 SHOW_BRAND_WATERMARK: false, 559 560 /** 561 * Decides whether the chrome extension banner should be rendered on the landing page and during the meeting. 562 * If this is set to false, the banner will not be rendered at all. If set to true, the check for extension(s) 563 * being already installed is done before rendering. 564 */ 565 SHOW_CHROME_EXTENSION_BANNER: false, 566 567 SHOW_JITSI_WATERMARK: true, 568 SHOW_POWERED_BY: false, 569 SHOW_PROMOTIONAL_CLOSE_PAGE: false, 570 571 /* 572 * If indicated some of the error dialogs may point to the support URL for 573 * help. 574 */ 575 SUPPORT_URL: 'https://community.jitsi.org/', 576 577 // Browsers, in addition to those which do not fully support WebRTC, that 578 // are not supported and should show the unsupported browser page. 579 UNSUPPORTED_BROWSERS: [], 580 581 /** 582 * Whether to show thumbnails in filmstrip as a column instead of as a row. 583 */ 584 VERTICAL_FILMSTRIP: true, 585 586 // Determines how the video would fit the screen. 'both' would fit the whole 587 // screen, 'height' would fit the original video height to the height of the 588 // screen, 'width' would fit the original video width to the width of the 589 // screen respecting ratio, 'nocrop' would make the video as large as 590 // possible and preserve aspect ratio without cropping. 591 VIDEO_LAYOUT_FIT: 'both', 592 593 /** 594 * If true, hides the video quality label indicating the resolution status 595 * of the current large video. 596 * 597 * @type {boolean} 598 */ 599 VIDEO_QUALITY_LABEL_DISABLED: false, 600 601 /** 602 * How many columns the tile view can expand to. The respected range is 603 * between 1 and 5. 604 */ 605 // TILE_VIEW_MAX_COLUMNS: 5, 606 607 // List of undocumented settings 608 /** 609 INDICATOR_FONT_SIZES 610 PHONE_NUMBER_REGEX 611 */ 612 613 // -----------------DEPRECATED CONFIGS BELOW THIS LINE----------------------------- 614 615 /** 616 * Specify URL for downloading ios mobile app. 617 */ 618 // MOBILE_DOWNLOAD_LINK_IOS: 'https://itunes.apple.com/us/app/jitsi-meet/id1165103905', 619 620 /** 621 * Specify custom URL for downloading android mobile app. 622 */ 623 // MOBILE_DOWNLOAD_LINK_ANDROID: 'https://play.google.com/store/apps/details?id=org.jitsi.meet', 624 625 /** 626 * Specify mobile app scheme for opening the app from the mobile browser. 627 */ 628 // APP_SCHEME: 'org.jitsi.meet', 629 630 // NATIVE_APP_NAME: 'Jitsi Meet', 631 632 /** 633 * Hide the logo on the deep linking pages. 634 */ 635 // HIDE_DEEP_LINKING_LOGO: false, 636 637 /** 638 * Specify the Android app package name. 639 */
640 // ANDROID_APP_PACKAGE: 'org.jitsi.meet', 641 642 /** 643 * Specify custom URL for downloading f droid app. 644 */ 645 // MOBILE_DOWNLOAD_LINK_F_DROID: 'https://f-droid.org/packages/org.jitsi.meet/', 646 647 // Connection indicators ( 648 // CONNECTION_INDICATOR_AUTO_HIDE_ENABLED, 649 // CONNECTION_INDICATOR_AUTO_HIDE_TIMEOUT, 650 // CONNECTION_INDICATOR_DISABLED) got moved to config.js. 651 652 // Please use disableModeratorIndicator from config.js 653 // DISABLE_FOCUS_INDICATOR: false, 654 655 // Please use defaultLocalDisplayName from config.js 656 // DEFAULT_LOCAL_DISPLAY_NAME: 'me', 657 658 // Please use defaultLogoUrl from config.js 659 // DEFAULT_LOGO_URL: 'images/watermark.svg', 660 661 // Please use defaultRemoteDisplayName from config.js 662 // DEFAULT_REMOTE_DISPLAY_NAME: 'Fellow Jitster', 663 664 // Moved to config.js as `toolbarConfig.initialTimeout`. 665 // INITIAL_TOOLBAR_TIMEOUT: 20000, 666 667 // Please use `liveStreaming.helpLink` from config.js 668 // Documentation reference for the live streaming feature. 669 // LIVE_STREAMING_HELP_LINK: 'https://jitsi.org/live', 670 671 // Moved to config.js as `toolbarConfig.alwaysVisible`. 672 // TOOLBAR_ALWAYS_VISIBLE: false, 673 674 // This config was moved to config.js as `toolbarButtons`. 675 // TOOLBAR_BUTTONS: [], 676 677 // Moved to config.js as `toolbarConfig.timeout`. 678 // TOOLBAR_TIMEOUT: 4000, 679 680 // Allow all above example options to include a trailing comma and 681 // prevent fear when commenting out the last value. 682 // eslint-disable-next-line sort-keys 683 makeJsonParserHappy: 'even if last key had a trailing comma' 684 685 // No configuration value should follow this line. 686}; 687 688/* eslint-enable no-unused-vars, no-var, max-len */ 689</script>
689 690
690<script src="libs/lib-jitsi-meet.min.js?v=9268"></script>
690 691
691<script src="libs/app.bundle.min.js?v=9268"></script>
691 692 <title>Jitsi Meet</title> 693<meta property="og:title" content="Jitsi Meet"/> 694<meta property="og:image" content="images/jitsilogo.png?v=1"/> 695<meta property="og:description" content="Join a WebRTC video conference powered by the Jitsi Videobridge"/> 696<meta description="Join a WebRTC video conference powered by the Jitsi Videobridge"/> 697<meta itemprop="name" content="Jitsi Meet"/> 698<meta itemprop="description" content="Join a WebRTC video conference powered by the Jitsi Videobridge"/> 699<meta itemprop="image" content="images/jitsilogo.png?v=1"/> 700<link rel="icon" href="images/favicon.svg?v=1"> 701 702 <template id = "welcome-page-additional-content-template"></template> 703 704 <template id = "welcome-page-additional-card-template"></template> 705 706 <template id="settings-toolbar-additional-content-template"></template> 707 708 </head> 709 <body> 710 <noscript aria-hidden="true"> 711 <div>JavaScript is disabled. </br>For this site to work you have to enable JavaScript.</div> 712 </noscript> 713 714 <div id="react" role="main"></div> 715 </body> 716</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.