////Z/pe/8u/w/|{//'/t/~//Z/T//(/0800000d0# 00 0l! 0F$ 0+ 03 080=!0B?"0#0$0Z%0&0W'0;(0x)0Y*0#*+0"3,0c<-0H.0UV/0^00>0!?0":#:':/:5:8:9:@:E:H:XP%:T&:V(:{X*:Y+:O]2:]3:rr4:?lj??[?hBiBjBkBlBBBB[BBBEBB9BAD*IG+IK,IT-IW.IKZ/I_0Ih3Ij4Iq5I+w6I|7I8I]9I;I=I?I@IZFIGIAHI<II JI޸KILIMI8PIPQI1RISITIVUIUVIBXIjZI\I]IWbIdI eI fI gI$ hI% iI( jI) kI9* lI* mIc, nI- oIV/ pI0 qI2 rI,5 sI9 tI> uIF vIN wIO xIZQ yIR zIT {ItU |IV }IZ ~I^ IOb Ic I e Ikf I I I) Ix IEb I I= I I I I IW IM Ip I I I I I I I I I I 1 1I[2I[:IeIgAIfBIgCIfDIeEI[NInOInWIxYIy[Iz^Iy_Iz`IyaIxcInPNG  IHDR szz IDATxb UE Dq?A:Y,Z 8%n@362wd7}LyIAL=c|d|~~wX/)Q{{v'9:{a#IVD`#:ߗ⢮(7MAlɝz6zT_>*ꅞj|ಛs/_߶6ځη4Jw/C9gy/vzb:V#j֞Qh>SbG lV*_mF!ڢ.:qFgt0 xG|j v6 >WӅ9f'7'+(-O=xdBIfm:ˣ:`gB`MzH|P x]H@l 1"g#mGd}c"CHʥm!u:;#ilCϛ86 '"9-y(;2_H+4CW2饴QHd\gO܍ҁoӿc2$f|9?IENDB`

$i18n{message}

$i18n{message}

$i18n{fileName}

$i18n{message}

// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the action API. var setIcon = require('setIcon').setIcon; apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, $Function.bind(function(args) { bindingUtil.sendRequest('action.setIcon', [args, callback], /*options=*/undefined); }, this)); }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the browserAction API. var setIcon = require('setIcon').setIcon; var getExtensionViews = requireNative('runtime').GetExtensionViews; apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, function(args) { bindingUtil.sendRequest( 'browserAction.setIcon', [args, callback], undefined); }.bind(this)); }); apiFunctions.setCustomCallback('openPopup', function(name, request, callback, response) { if (!callback) return; if (bindingUtil.hasLastError()) { callback(); } else { var views = getExtensionViews(-1, -1, 'POPUP'); callback(views.length > 0 ? views[0] : null); } }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming RtpStream API. var natives = requireNative('cast_streaming_natives'); apiBridge.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('destroy', function(transportId) { natives.DestroyCastRtpStream(transportId); }); apiFunctions.setHandleRequest('getSupportedParams', function(transportId) { return natives.GetSupportedParamsCastRtpStream(transportId); }); apiFunctions.setHandleRequest('start', function(transportId, params) { natives.StartCastRtpStream(transportId, params); }); apiFunctions.setHandleRequest('stop', function(transportId) { natives.StopCastRtpStream(transportId); }); apiFunctions.setHandleRequest('toggleLogging', function(transportId, enable) { natives.ToggleLogging(transportId, enable); }); apiFunctions.setHandleRequest('getRawEvents', function(transportId, extraData, callback) { natives.GetRawEvents(transportId, extraData, callback); }); apiFunctions.setHandleRequest('getStats', function(transportId, callback) { natives.GetStats(transportId, callback); }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming Session API. var natives = requireNative('cast_streaming_natives'); apiBridge.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('create', function(audioTrack, videoTrack, callback) { natives.CreateSession(audioTrack, videoTrack, callback); }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming UdpTransport API. var natives = requireNative('cast_streaming_natives'); apiBridge.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('destroy', function(transportId) { natives.DestroyCastUdpTransport(transportId); }); apiFunctions.setHandleRequest('setDestination', function(transportId, destination) { natives.SetDestinationCastUdpTransport(transportId, destination); }); apiFunctions.setHandleRequest('setOptions', function(transportId, options) { natives.SetOptionsCastUdpTransport(transportId, options); }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming Session API. var natives = requireNative('cast_streaming_natives'); apiBridge.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest( 'createAndBind', function(ap, vp, local, weidgth, height, fr, url, cb, op) { }); }); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var contextMenusHandlers = require('contextMenusHandlers'); apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var handlers = contextMenusHandlers.create(true /* isWebview */); apiFunctions.setHandleRequest( 'contextMenusCreate', handlers.requestHandlers.create); apiFunctions.setHandleRequest( 'contextMenusUpdate', handlers.requestHandlers.update); apiFunctions.setHandleRequest( 'contextMenusRemove', handlers.requestHandlers.remove); apiFunctions.setHandleRequest( 'contextMenusRemoveAll', handlers.requestHandlers.removeAll); }); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements chrome-specific API. // See web_view_api_methods.js for details. var ChromeWebView = getInternalApi('chromeWebViewInternal'); var ChromeWebViewSchema = requireNative('schema_registry').GetSchema('chromeWebViewInternal'); var CreateEvent = require('guestViewEvents').CreateEvent; var GuestViewInternalNatives = requireNative('guest_view_internal'); var idGeneratorNatives = requireNative('id_generator'); var registerElement = require('guestViewContainerElement').registerElement; var utils = require('utils'); var WebViewElement = require('webViewElement').WebViewElement; var WebViewImpl = require('webView').WebViewImpl; var WebViewAttributeNames = require('webViewConstants').WebViewAttributeNames; // This is the only "webViewInternal.onClicked" named event for this renderer. // // Since we need an event per , we define events with suffix // (subEventName) in each of the . Behind the scenes, this event is // registered as a ContextMenusEvent, with filter set to the webview's // |viewInstanceId|. Any time a ContextMenusEvent is dispatched, we re-dispatch // it to the subEvent's listeners. This way // .contextMenus.onClicked behave as a regular chrome Event type. var ContextMenusEvent = CreateEvent('chromeWebViewInternal.onClicked'); // See comment above. var ContextMenusHandlerEvent = CreateEvent('chromeWebViewInternal.onContextMenuShow'); function GetUniqueSubEventName(eventName) { return eventName + '/' + idGeneratorNatives.GetNextId(); } // This event is exposed as .contextMenus.onClicked. function createContextMenusOnClickedEvent(webViewInstanceId, opt_eventName, opt_argSchemas, opt_eventOptions) { var subEventName = GetUniqueSubEventName(opt_eventName); var newEvent = bindingUtil.createCustomEvent(subEventName, false, false); var view = GuestViewInternalNatives.GetViewFromID(webViewInstanceId); if (view) { view.events.addScopedListener( ContextMenusEvent, $Function.bind(function() { // Re-dispatch to subEvent's listeners. $Function.apply(newEvent.dispatch, newEvent, $Array.slice(arguments)); }, newEvent), {instanceId: webViewInstanceId}); } return newEvent; } // This event is exposed as .contextMenus.onShow. function createContextMenusOnContextMenuEvent(webViewInstanceId, opt_eventName, opt_argSchemas, opt_eventOptions) { var subEventName = GetUniqueSubEventName(opt_eventName); var newEvent = bindingUtil.createCustomEvent(subEventName, false, false); var view = GuestViewInternalNatives.GetViewFromID(webViewInstanceId); if (view) { view.events.addScopedListener( ContextMenusHandlerEvent, $Function.bind(function(e) { var defaultPrevented = false; var event = { preventDefault: function() { defaultPrevented = true; } }; // Re-dispatch to subEvent's listeners. $Function.apply(newEvent.dispatch, newEvent, [event]); if (!defaultPrevented) { // TODO(lazyboy): Remove |items| parameter completely from // ChromeWebView.showContextMenu as we don't do anything useful with // it currently. var items = []; var guestInstanceId = GuestViewInternalNatives. GetViewFromID(webViewInstanceId).guest.getId(); ChromeWebView.showContextMenu(guestInstanceId, e.requestId, items); } }, newEvent), {instanceId: webViewInstanceId}); } return newEvent; } // ----------------------------------------------------------------------------- // WebViewContextMenusImpl object. // An instance of this class is exposed as .contextMenus. function WebViewContextMenusImpl(viewInstanceId) { this.viewInstanceId_ = viewInstanceId; } $Object.setPrototypeOf(WebViewContextMenusImpl.prototype, null); WebViewContextMenusImpl.prototype.create = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusCreate, null, args); }; WebViewContextMenusImpl.prototype.remove = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusRemove, null, args); }; WebViewContextMenusImpl.prototype.removeAll = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusRemoveAll, null, args); }; WebViewContextMenusImpl.prototype.update = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusUpdate, null, args); }; function WebViewContextMenus() { privates(WebViewContextMenus).constructPrivate(this, arguments); } utils.expose(WebViewContextMenus, WebViewContextMenusImpl, { functions: [ 'create', 'remove', 'removeAll', 'update', ], }); // ----------------------------------------------------------------------------- class ChromeWebViewImpl extends WebViewImpl { constructor(webviewElement) { super(webviewElement); this.setupContextMenus(); } } ChromeWebViewImpl.prototype.setupContextMenus = function() { if (!this.contextMenusOnContextMenuEvent_) { var eventName = 'chromeWebViewInternal.onContextMenuShow'; var eventSchema = utils.lookup(ChromeWebViewSchema.events, 'name', 'onShow'); var eventOptions = {supportsListeners: true, supportsLazyListeners: false}; this.contextMenusOnContextMenuEvent_ = createContextMenusOnContextMenuEvent( this.viewInstanceId, eventName, eventSchema, eventOptions); } var createContextMenus = $Function.bind(function() { return this.weakWrapper(function() { if (this.contextMenus_) { return this.contextMenus_; } this.contextMenus_ = new WebViewContextMenus(this.viewInstanceId); // Define 'onClicked' event property on |this.contextMenus_|. var getOnClickedEvent = $Function.bind(function() { return this.weakWrapper(function() { if (!this.contextMenusOnClickedEvent_) { var eventName = 'chromeWebViewInternal.onClicked'; var eventSchema = utils.lookup(ChromeWebViewSchema.events, 'name', 'onClicked'); var eventOptions = {supportsListeners: true, supportsLazyListeners: false}; var onClickedEvent = createContextMenusOnClickedEvent( this.viewInstanceId, eventName, eventSchema, eventOptions); this.contextMenusOnClickedEvent_ = onClickedEvent; return onClickedEvent; } return this.contextMenusOnClickedEvent_; }); }, this); $Object.defineProperty( this.contextMenus_, 'onClicked', {get: getOnClickedEvent(), enumerable: true}); $Object.defineProperty( this.contextMenus_, 'onShow', { get: this.weakWrapper(function() { return this.contextMenusOnContextMenuEvent_; }), enumerable: true }); return this.contextMenus_; }); }, this); // Expose .contextMenus object. $Object.defineProperty( this.element, 'contextMenus', { get: createContextMenus(), enumerable: true }); }; class ChromeWebViewElement extends WebViewElement { static get observedAttributes() { return WebViewAttributeNames; } constructor() { super(); privates(this).internal = new ChromeWebViewImpl(this); } } registerElement('WebView', ChromeWebViewElement); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the declarativeContent API. var setIcon = require('setIcon').setIcon; apiBridge.registerCustomHook(function(api) { var declarativeContent = api.compiledApi; // Validation for most types is done in the native C++ with native bindings, // but setIcon is funny (and sadly broken). Ideally, we can move this // validation entirely into the native code, and this whole file can go // away. var nativeSetIcon = declarativeContent.SetIcon; declarativeContent.SetIcon = function(parameters) { // TODO(devlin): This is very, very wrong. setIcon() is potentially // asynchronous (in the case of a path being specified), which means this // becomes an "asynchronous constructor". Errors can be thrown *after* the // `new declarativeContent.SetIcon(...)` call, and in the async cases, // this wouldn't work when we immediately add the action via an API call // (e.g., // chrome.declarativeContent.onPageChange.addRules( // [{conditions: ..., actions: [ new SetIcon(...) ]}]); // ). Some of this is tracked in http://crbug.com/415315. setIcon(parameters, $Function.bind(function(data) { // Fake calling the original function as a constructor. $Object.setPrototypeOf(this, nativeSetIcon.prototype); $Function.apply(nativeSetIcon, this, [data]); }, this)); }; }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the desktopCapture API. var idGenerator = requireNative('id_generator'); apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var pendingRequests = {}; function onRequestResult(id, result, options) { if (id in pendingRequests) { var callback = pendingRequests[id]; delete pendingRequests[id]; callback(result, options); } } apiFunctions.setHandleRequest('chooseDesktopMedia', function(sources, target_tab, callback) { // |target_tab| is an optional parameter. if (callback === undefined) { callback = target_tab; target_tab = undefined; } var id = idGenerator.GetNextId(); pendingRequests[id] = callback; bindingUtil.sendRequest('desktopCapture.chooseDesktopMedia', [id, sources, target_tab, $Function.bind(onRequestResult, null, id)], undefined); return id; }); apiFunctions.setHandleRequest('cancelChooseDesktopMedia', function(id) { if (id in pendingRequests) { delete pendingRequests[id]; bindingUtil.sendRequest( 'desktopCapture.cancelChooseDesktopMedia', [id], undefined, undefined); } }); }); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the developerPrivate API. apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; // Converts the argument of |functionName| from DirectoryEntry to URL. function bindFileSystemFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(directoryEntry, callback) { var fileSystemName = directoryEntry.filesystem.name; var relativePath = $String.slice(directoryEntry.fullPath, 1); var url = directoryEntry.toURL(); return [fileSystemName, relativePath, url, callback]; }); } bindFileSystemFunction('loadDirectory'); // developerPrivate.enable is the same as chrome.management.setEnabled. // TODO(devlin): Migrate callers off developerPrivate.enable. bindingsAPI.compiledApi.enable = chrome.management.setEnabled; apiFunctions.setHandleRequest('allowFileAccess', function(id, allow, callback) { chrome.developerPrivate.updateExtensionConfiguration( {extensionId: id, fileAccess: allow}, callback); }); apiFunctions.setHandleRequest('allowIncognito', function(id, allow, callback) { chrome.developerPrivate.updateExtensionConfiguration( {extensionId: id, incognitoAccess: allow}, callback); }); apiFunctions.setHandleRequest('inspect', function(options, callback) { var renderViewId = options.render_view_id; if (typeof renderViewId == 'string') { renderViewId = parseInt(renderViewId); if (isNaN(renderViewId)) throw new Error('Invalid value for render_view_id'); } var renderProcessId = options.render_process_id; if (typeof renderProcessId == 'string') { renderProcessId = parseInt(renderProcessId); if (isNaN(renderProcessId)) throw new Error('Invalid value for render_process_id'); } chrome.developerPrivate.openDevTools({ extensionId: options.extension_id, renderProcessId: renderProcessId, renderViewId: renderViewId, incognito: options.incognito }, callback); }); }); // Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the downloads API. var downloadsInternal = getInternalApi('downloadsInternal'); bindingUtil.registerEventArgumentMassager('downloads.onDeterminingFilename', function(args, dispatch) { var downloadItem = args[0]; // Copy the id so that extensions can't change it. var downloadId = downloadItem.id; var suggestable = true; function isValidResult(result) { if (result === undefined) return false; if (typeof(result) != 'object') { console.error('Error: Invocation of form suggest(' + typeof(result) + ') doesn\'t match definition suggest({filename: string, ' + 'conflictAction: string})'); return false; } else if ((typeof(result.filename) != 'string') || (result.filename.length == 0)) { console.error('Error: "filename" parameter to suggest() must be a ' + 'non-empty string'); return false; } else if ([undefined, 'uniquify', 'overwrite', 'prompt'].indexOf( result.conflictAction) < 0) { console.error('Error: "conflictAction" parameter to suggest() must be ' + 'one of undefined, "uniquify", "overwrite", "prompt"'); return false; } return true; } function suggestCallback(result) { if (!suggestable) { console.error('suggestCallback may not be called more than once.'); return; } suggestable = false; if (isValidResult(result)) { downloadsInternal.determineFilename( downloadId, result.filename, result.conflictAction || ""); } else { downloadsInternal.determineFilename(downloadId, "", ""); } } try { var results = dispatch([downloadItem, suggestCallback]); var async = (results && results.results && (results.results.length != 0) && (results.results[0] === true)); if (suggestable && !async) suggestCallback(); } catch (e) { suggestCallback(); throw e; } }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the GCM API. var forEach = require('utils').forEach; apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var gcm = bindingsAPI.compiledApi; apiFunctions.setUpdateArgumentsPostValidate( 'send', function(message, callback) { // Validate message.data. var payloadSize = 0; forEach(message.data, function(property, value) { if (property.length == 0) throw new Error("One of data keys is empty."); var lowerCasedProperty = property.toLowerCase(); // Issue an error for forbidden prefixes of property names. if (lowerCasedProperty.startsWith("goog.") || lowerCasedProperty.startsWith("google") || property.startsWith("collapse_key")) { throw new Error("Invalid data key: " + property); } payloadSize += property.length + value.length; }); if (payloadSize > gcm.MAX_MESSAGE_SIZE) throw new Error("Payload exceeded allowed size limit. Payload size is: " + payloadSize); if (payloadSize == 0) throw new Error("No data to send."); return arguments; }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Identity API. apiBridge.registerCustomHook(function(binding, id, contextType) { var apiFunctions = binding.apiFunctions; apiFunctions.setHandleRequest('getRedirectURL', function(path) { if (path === null || path === undefined) path = '/'; else path = String(path); if (path[0] != '/') path = '/' + path; return 'https://' + id + '.chromiumapp.org' + path; }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the image writer private API. apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setUpdateArgumentsPostValidate( 'writeFromFile', function(device, fileEntry, options, callback) { var fileSystemName = fileEntry.filesystem.name; var relativePath = $String.slice(fileEntry.fullPath, 1); return [device, fileSystemName, relativePath, callback]; }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the input ime API. Only injected into the // v8 contexts for extensions which have permission for the API. var appWindowNatives = requireNative('app_window_natives'); var keyEventHandled; bindingUtil.registerEventArgumentMassager('input.ime.onKeyEvent', function(args, dispatch) { var keyData = args[1]; var result = undefined; try { // dispatch() is weird - it returns an object {results: array} iff // there is at least one result value that !== undefined. Since onKeyEvent // has a maximum of one listener, we know that any result we find is the one // we're interested in. var dispatchResult = dispatch(args); if (dispatchResult && dispatchResult.results) result = dispatchResult.results[0]; } catch (e) { result = false; console.error('Error in event handler for onKeyEvent: ' + e.stack); } if (result !== undefined) { keyEventHandled(keyData.requestId, !!result); } }); apiBridge.registerCustomHook(function(api) { keyEventHandled = api.compiledApi.keyEventHandled; // TODO(shuchen): override onKeyEvent.addListener only for compatibility. // This should be removed after the IME extension doesn't rely on the // additional "async" parameter. var originalAddListener = api.compiledApi.onKeyEvent.addListener; api.compiledApi.onKeyEvent.addListener = function(cb, opt_extraInfo) { $Function.call(originalAddListener, this, cb); }; api.apiFunctions.setCustomCallback('createWindow', function(name, request, callback, windowParams) { if (!callback) { return; } var view; if (windowParams && windowParams.frameId) { view = appWindowNatives.GetFrame( windowParams.frameId, false /* notifyBrowser */); view.id = windowParams.frameId; } callback(view); }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Media Gallery API. var blobNatives = requireNative('blob_natives'); var mediaGalleriesNatives = requireNative('mediaGalleries'); var blobsAwaitingMetadata = {}; var mediaGalleriesMetadata = {}; function createFileSystemObjectsAndUpdateMetadata(response) { var result = []; mediaGalleriesMetadata = {}; // Clear any previous metadata. if (response) { for (var i = 0; i < response.length; i++) { var filesystem = mediaGalleriesNatives.GetMediaFileSystemObject( response[i].fsid); $Array.push(result, filesystem); var metadata = response[i]; delete metadata.fsid; mediaGalleriesMetadata[filesystem.name] = metadata; } } return result; } apiBridge.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; // getMediaFileSystems and addUserSelectedFolder use a custom callback so that // they can instantiate and return an array of file system objects. apiFunctions.setCustomCallback('getMediaFileSystems', function(name, request, callback, response) { var result = createFileSystemObjectsAndUpdateMetadata(response); if (callback) callback(result); }); apiFunctions.setCustomCallback('addUserSelectedFolder', function(name, request, callback, response) { var fileSystems = []; var selectedFileSystemName = ""; if (response && 'mediaFileSystems' in response && 'selectedFileSystemIndex' in response) { fileSystems = createFileSystemObjectsAndUpdateMetadata( response['mediaFileSystems']); var selectedFileSystemIndex = response['selectedFileSystemIndex']; if (selectedFileSystemIndex >= 0) { selectedFileSystemName = fileSystems[selectedFileSystemIndex].name; } } if (callback) callback(fileSystems, selectedFileSystemName); }); apiFunctions.setHandleRequest('getMediaFileSystemMetadata', function(filesystem) { if (filesystem && filesystem.name && filesystem.name in mediaGalleriesMetadata) { return mediaGalleriesMetadata[filesystem.name]; } return { 'name': '', 'galleryId': '', 'isRemovable': false, 'isMediaDevice': false, 'isAvailable': false, }; }); function getMetadataCallback(uuid, name, request, callback, response) { if (response && response.attachedImagesBlobInfo) { for (var i = 0; i < response.attachedImagesBlobInfo.length; i++) { var blobInfo = response.attachedImagesBlobInfo[i]; var blob = blobNatives.TakeBrowserProcessBlob( blobInfo.blobUUID, blobInfo.type, blobInfo.size); response.metadata.attachedImages.push(blob); } } if (callback) callback(response ? response.metadata : null); delete blobsAwaitingMetadata[uuid]; } apiFunctions.setHandleRequest('getMetadata', function(mediaFile, options, callback) { var blobUuid = blobNatives.GetBlobUuid(mediaFile) // Store the blob in a global object to keep its refcount nonzero -- this // prevents the object from being garbage collected before any metadata // parsing gets to occur (see crbug.com/415792). blobsAwaitingMetadata[blobUuid] = mediaFile; var optArgs = { __proto__: null, customCallback: $Function.bind(getMetadataCallback, null, blobUuid), }; bindingUtil.sendRequest( 'mediaGalleries.getMetadata', [blobUuid, options, callback], optArgs); }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the notifications API. // var exceptionHandler = require('uncaught_exception_handler'); var imageUtil = require('imageUtil'); var notificationsPrivate = requireNative('notifications_private'); function imageDataSetter(context, key) { var f = function(val) { this[key] = val; }; return $Function.bind(f, context); } // A URL Spec is an object with the following keys: // path: The resource to be downloaded. // width: (optional) The maximum width of the image to be downloaded in device // pixels. // height: (optional) The maximum height of the image to be downloaded in // device pixels. // callback: A function to be called when the URL is complete. It // should accept an ImageData object and set the appropriate // field in |notificationDetails|. function getUrlSpecs(imageSizes, notificationDetails) { var urlSpecs = []; // |iconUrl| might be optional for notification updates. if (notificationDetails.iconUrl) { $Array.push(urlSpecs, { path: notificationDetails.iconUrl, width: imageSizes.icon.width * imageSizes.scaleFactor, height: imageSizes.icon.height * imageSizes.scaleFactor, callback: imageDataSetter(notificationDetails, 'iconBitmap') }); } // |appIconMaskUrl| is optional. if (notificationDetails.appIconMaskUrl) { $Array.push(urlSpecs, { path: notificationDetails.appIconMaskUrl, width: imageSizes.appIconMask.width * imageSizes.scaleFactor, height: imageSizes.appIconMask.height * imageSizes.scaleFactor, callback: imageDataSetter(notificationDetails, 'appIconMaskBitmap') }); } // |imageUrl| is optional. if (notificationDetails.imageUrl) { $Array.push(urlSpecs, { path: notificationDetails.imageUrl, width: imageSizes.image.width * imageSizes.scaleFactor, height: imageSizes.image.height * imageSizes.scaleFactor, callback: imageDataSetter(notificationDetails, 'imageBitmap') }); } // Each button has an optional icon. var buttonList = notificationDetails.buttons; if (buttonList && typeof buttonList.length === 'number') { var numButtons = buttonList.length; for (var i = 0; i < numButtons; i++) { if (buttonList[i].iconUrl) { $Array.push(urlSpecs, { path: buttonList[i].iconUrl, width: imageSizes.buttonIcon.width * imageSizes.scaleFactor, height: imageSizes.buttonIcon.height * imageSizes.scaleFactor, callback: imageDataSetter(buttonList[i], 'iconBitmap') }); } } } return urlSpecs; } function replaceNotificationOptionURLs(notification_details, callback) { var imageSizes = notificationsPrivate.GetNotificationImageSizes(); var url_specs = getUrlSpecs(imageSizes, notification_details); if (!url_specs.length) { callback(true); return; } var errors = 0; imageUtil.loadAllImages(url_specs, { onerror: function(index) { errors++; }, oncomplete: function(imageData) { if (errors > 0) { callback(false); return; } for (var index = 0; index < url_specs.length; index++) { var url_spec = url_specs[index]; url_spec.callback(imageData[index]); } callback(true); } }); } function genHandle(name, failure_function) { return function(id, input_notification_details, callback) { // TODO(dewittj): Remove this hack. This is used as a way to deep // copy a complex JSON object. var notification_details = $JSON.parse( $JSON.stringify(input_notification_details)); var that = this; var stack = exceptionHandler.getExtensionStackTrace(); replaceNotificationOptionURLs(notification_details, function(success) { if (success) { bindingUtil.sendRequest( name, [id, notification_details, callback], undefined); return; } bindingUtil.runCallbackWithLastError( 'Unable to download all specified images.', $Function.bind(failure_function, null, callback || function() {}, id)); }); }; } var handleCreate = genHandle('notifications.create', function(callback, id) { callback(id); }); var handleUpdate = genHandle('notifications.update', function(callback, id) { callback(false); }); var notificationsCustomHook = function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('create', handleCreate); apiFunctions.setHandleRequest('update', handleUpdate); }; apiBridge.registerCustomHook(notificationsCustomHook); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the omnibox API. Only injected into the v8 contexts // for extensions which have permission for the omnibox API. // Remove invalid characters from |text| so that it is suitable to use // for |AutocompleteMatch::contents|. function sanitizeString(text, shouldTrim) { // NOTE: This logic mirrors |AutocompleteMatch::SanitizeString()|. // 0x2028 = line separator; 0x2029 = paragraph separator. var kRemoveChars = /(\r|\n|\t|\u2028|\u2029)/gm; if (shouldTrim) text = text.trimLeft(); return text.replace(kRemoveChars, ''); } // Parses the xml syntax supported by omnibox suggestion results. Returns an // object with two properties: 'description', which is just the text content, // and 'descriptionStyles', which is an array of style objects in a format // understood by the C++ backend. function parseOmniboxDescription(input) { var domParser = new DOMParser(); // The XML parser requires a single top-level element, but we want to // support things like 'hello, world!'. So we wrap the // provided text in generated root level element. var root = domParser.parseFromString( '' + input + '', 'text/xml'); // DOMParser has a terrible error reporting facility. Errors come out nested // inside the returned document. var error = root.querySelector('parsererror div'); if (error) { throw new Error(error.textContent); } // Otherwise, it's valid, so build up the result. var result = { description: '', descriptionStyles: [] }; // Recursively walk the tree. function walk(node) { for (var i = 0, child; child = node.childNodes[i]; i++) { // Append text nodes to our description. if (child.nodeType == Node.TEXT_NODE) { var shouldTrim = result.description.length == 0; result.description += sanitizeString(child.nodeValue, shouldTrim); continue; } // Process and descend into a subset of recognized tags. if (child.nodeType == Node.ELEMENT_NODE && (child.nodeName == 'dim' || child.nodeName == 'match' || child.nodeName == 'url')) { var style = { 'type': child.nodeName, 'offset': result.description.length }; $Array.push(result.descriptionStyles, style); walk(child); style.length = result.description.length - style.offset; continue; } // Descend into all other nodes, even if they are unrecognized, for // forward compat. walk(child); } }; walk(root); return result; } apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setUpdateArgumentsPreValidate('setDefaultSuggestion', function(suggestResult) { if (suggestResult.content != undefined) { // null, etc. throw new Error( 'setDefaultSuggestion cannot contain the "content" field'); } return [suggestResult]; }); apiFunctions.setHandleRequest('setDefaultSuggestion', function(details) { var parseResult = parseOmniboxDescription(details.description); bindingUtil.sendRequest('omnibox.setDefaultSuggestion', [parseResult], undefined); }); apiFunctions.setUpdateArgumentsPostValidate( 'sendSuggestions', function(requestId, userSuggestions) { var suggestions = []; for (var i = 0; i < userSuggestions.length; i++) { var parseResult = parseOmniboxDescription( userSuggestions[i].description); parseResult.content = userSuggestions[i].content; parseResult.deletable = userSuggestions[i].deletable; $Array.push(suggestions, parseResult); } return [requestId, suggestions]; }); }); bindingUtil.registerEventArgumentMassager('omnibox.onInputChanged', function(args, dispatch) { var text = args[0]; var requestId = args[1]; var suggestCallback = function(suggestions) { chrome.omnibox.sendSuggestions(requestId, suggestions); }; dispatch([text, suggestCallback]); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the pageAction API. var setIcon = require('setIcon').setIcon; apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, $Function.bind(function(args) { bindingUtil.sendRequest('pageAction.setIcon', [args, callback], undefined); }, this)); }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the pageCapture API. var handleUncaughtException = require('uncaught_exception_handler').handle; var pageCaptureNatives = requireNative('page_capture'); var CreateBlob = pageCaptureNatives.CreateBlob; var SendResponseAck = pageCaptureNatives.SendResponseAck; apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setCustomCallback('saveAsMHTML', function(name, request, callback, response) { if (response) response = CreateBlob(response.mhtmlFilePath, response.mhtmlFileLength); try { callback(response); } catch (e) { handleUncaughtException( 'Error in chrome.pageCapture.saveAsMHTML callback', e, request.stack); } finally { // Notify the browser. Now that the blob is referenced from JavaScript, // the browser can drop its reference to it. SendResponseAck(request.id); } }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the syncFileSystem API. var fileSystemNatives = requireNative('file_system_natives'); var syncFileSystemNatives = requireNative('sync_file_system'); apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; // Functions which take in an [instanceOf=FileEntry]. function bindFileEntryFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(entry, callback) { var fileSystemUrl = entry.toURL(); return [fileSystemUrl, callback]; }); } $Array.forEach(['getFileStatus'], bindFileEntryFunction); // Functions which take in a FileEntry array. function bindFileEntryArrayFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(entries, callback) { var fileSystemUrlArray = []; for (var i=0; i < entries.length; i++) { $Array.push(fileSystemUrlArray, entries[i].toURL()); } return [fileSystemUrlArray, callback]; }); } $Array.forEach(['getFileStatuses'], bindFileEntryArrayFunction); // Functions which take in an [instanceOf=DOMFileSystem]. function bindFileSystemFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(filesystem, callback) { var fileSystemUrl = filesystem.root.toURL(); return [fileSystemUrl, callback]; }); } $Array.forEach(['getUsageAndQuota'], bindFileSystemFunction); // Functions which return an [instanceOf=DOMFileSystem]. apiFunctions.setCustomCallback('requestFileSystem', function(name, request, callback, response) { var result = null; if (response) { result = syncFileSystemNatives.GetSyncFileSystemObject( response.name, response.root); } if (callback) callback(result); }); // Functions which return an array of FileStatusInfo object // which has [instanceOf=FileEntry]. apiFunctions.setCustomCallback('getFileStatuses', function(name, request, callback, response) { var results = []; if (response) { for (var i = 0; i < response.length; i++) { var result = {}; var entry = response[i].entry; result.fileEntry = fileSystemNatives.GetFileEntry( entry.fileSystemType, entry.fileSystemName, entry.rootUrl, entry.filePath, entry.isDirectory); result.status = response[i].status; result.error = response[i].error; $Array.push(results, result); } } if (callback) callback(results); }); }); bindingUtil.registerEventArgumentMassager('syncFileSystem.onFileStatusChanged', function(args, dispatch) { // Make FileEntry object using all the base string fields. var fileEntry = fileSystemNatives.GetFileEntry( args[0].fileSystemType, args[0].fileSystemName, args[0].rootUrl, args[0].filePath, args[0].isDirectory); // Combine into a single dictionary. var fileInfo = new Object(); fileInfo.fileEntry = fileEntry; fileInfo.status = args[1]; if (fileInfo.status == "synced") { fileInfo.action = args[2]; fileInfo.direction = args[3]; } dispatch([fileInfo]); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the systemIndicator API. // TODO(dewittj) Refactor custom binding to reduce redundancy between the // extension action APIs. var setIcon = require('setIcon').setIcon; apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, $Function.bind(function(args) { bindingUtil.sendRequest('systemIndicator.setIcon', [args, callback], undefined); }, this)); }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Tab Capture API. apiBridge.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; function proxyToGetUserMedia(name, request, callback, response) { if (!callback) return; if (!response) { // When the response is missing, runtime.lastError has already been set. // See chrome/browser/extensions/api/tab_capture/tab_capture_api.cc. callback(null); return; } // Convenience function for processing webkitGetUserMedia() error objects to // provide runtime.lastError messages for the tab capture API. function getErrorMessage(error, fallbackMessage) { if (!error || (typeof error.message != 'string')) return fallbackMessage; return error.message.replace(/(navigator\.)?(webkit)?GetUserMedia/gi, name); } var options = {}; if (response.audioConstraints) options.audio = response.audioConstraints; if (response.videoConstraints) options.video = response.videoConstraints; try { navigator.webkitGetUserMedia( options, function onSuccess(media_stream) { callback(media_stream); }, function onError(error) { bindingUtil.runCallbackWithLastError( getErrorMessage(error, "Failed to start MediaStream."), $Function.bind(callback, null, null)); }); } catch (error) { bindingUtil.runCallbackWithLastError( getErrorMessage(error, "Invalid argument(s)."), $Function.bind(callback, null, null)); } } apiFunctions.setCustomCallback('capture', proxyToGetUserMedia); apiFunctions.setCustomCallback('captureOffscreenTab', proxyToGetUserMedia); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the tts API. var idGenerator = requireNative('id_generator'); var lazyBG = requireNative('lazy_background_page'); apiBridge.registerCustomHook(function(api) { var apiFunctions = api.apiFunctions; var tts = api.compiledApi; var handlers = {}; function ttsEventListener(event) { var eventHandler = handlers[event.srcId]; if (eventHandler) { eventHandler({ type: event.type, charIndex: event.charIndex, length: event.length, errorMessage: event.errorMessage }); if (event.isFinalEvent) { delete handlers[event.srcId]; // Balanced in 'speak' handler. lazyBG.DecrementKeepaliveCount(); } } } // This file will get run if an extension needs the ttsEngine permission, but // it doesn't necessarily have the tts permission. If it doesn't, trying to // add a listener to chrome.tts.onEvent will fail. // See http://crbug.com/122474. try { tts.onEvent.addListener(ttsEventListener); } catch (e) {} apiFunctions.setHandleRequest('speak', function() { var args = $Array.from(arguments); if (args.length > 1 && args[1]) { if (args[1].onEvent) { var id = idGenerator.GetNextId(); args[1].srcId = id; handlers[id] = args[1].onEvent; // Keep the page alive until the event finishes. // Balanced in eventHandler. lazyBG.IncrementKeepaliveCount(); } if (args[1].gender) { console.warn( 'chrome.tts.speak: ' + 'Voice gender is deprecated and values will be ignored starting ' + 'in Chrome 71.'); } } bindingUtil.sendRequest('tts.speak', args, undefined); return id; }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the ttsEngine API. bindingUtil.registerEventArgumentMassager('ttsEngine.onSpeak', function(args, dispatch) { var text = args[0]; var options = args[1]; var requestId = args[2]; var sendTtsEvent = function(event) { chrome.ttsEngine.sendTtsEvent(requestId, event); }; dispatch([text, options, sendTtsEvent]); }); apiBridge.registerCustomHook(function(api) { // Provide a warning if deprecated parameters are used. api.apiFunctions.setHandleRequest('updateVoices', function(voices) { for (var i = 0; i < voices.length; i++) { if (voices[i].gender) { console.warn( 'chrome.ttsEngine.updateVoices: ' + 'Voice gender is deprecated and values will be ignored ' + 'starting in Chrome 71.'); break; } } bindingUtil.sendRequest( 'ttsEngine.updateVoices', [voices], undefined); }); }.bind(this)); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the webrtcDesktopCapturePrivate API. var idGenerator = requireNative('id_generator'); apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var pendingRequests = {}; function onRequestResult(id, result) { if (id in pendingRequests) { var callback = pendingRequests[id]; delete pendingRequests[id]; callback(result); } } apiFunctions.setHandleRequest('chooseDesktopMedia', function(sources, request, callback) { var id = idGenerator.GetNextId(); pendingRequests[id] = callback; bindingUtil.sendRequest( 'webrtcDesktopCapturePrivate.chooseDesktopMedia', [id, sources, request, $Function.bind(onRequestResult, null, id)], undefined); return id; }); apiFunctions.setHandleRequest('cancelChooseDesktopMedia', function(id) { if (id in pendingRequests) { delete pendingRequests[id]; bindingUtil.sendRequest( 'webrtcDesktopCapturePrivate.cancelChooseDesktopMedia', [id], undefined); } }); }); // Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the webrtcLoggingPrivate API. var getBindDirectoryEntryCallback = require('fileEntryBindingUtil').getBindDirectoryEntryCallback; apiBridge.registerCustomHook(function(binding, id, contextType) { var apiFunctions = binding.apiFunctions; apiFunctions.setCustomCallback('getLogsDirectory', getBindDirectoryEntryCallback()); }); // chrome/common/media_router/mojom/media_controller.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'chrome/common/media_router/mojom/media_controller.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mediaRouter.mojom'); var media_status$ = mojo.internal.exposeNamespace('mediaRouter.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'chrome/common/media_router/mojom/media_status.mojom', 'media_status.mojom.js'); } var time$ = mojo.internal.exposeNamespace('mojoBase.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'mojo/public/mojom/base/time.mojom', '../../../../mojo/public/mojom/base/time.mojom.js'); } function MediaController_Play_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_Play_Params.prototype.initDefaults_ = function() { }; MediaController_Play_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_Play_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_Play_Params.encodedSize = codec.kStructHeaderSize + 0; MediaController_Play_Params.decode = function(decoder) { var packed; var val = new MediaController_Play_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaController_Play_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_Play_Params.encodedSize); encoder.writeUint32(0); }; function MediaController_Pause_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_Pause_Params.prototype.initDefaults_ = function() { }; MediaController_Pause_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_Pause_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_Pause_Params.encodedSize = codec.kStructHeaderSize + 0; MediaController_Pause_Params.decode = function(decoder) { var packed; var val = new MediaController_Pause_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaController_Pause_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_Pause_Params.encodedSize); encoder.writeUint32(0); }; function MediaController_SetMute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_SetMute_Params.prototype.initDefaults_ = function() { this.mute = false; }; MediaController_SetMute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_SetMute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_SetMute_Params.encodedSize = codec.kStructHeaderSize + 8; MediaController_SetMute_Params.decode = function(decoder) { var packed; var val = new MediaController_SetMute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.mute = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaController_SetMute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_SetMute_Params.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.mute & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaController_SetVolume_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_SetVolume_Params.prototype.initDefaults_ = function() { this.volume = 0; }; MediaController_SetVolume_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_SetVolume_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_SetVolume_Params.encodedSize = codec.kStructHeaderSize + 8; MediaController_SetVolume_Params.decode = function(decoder) { var packed; var val = new MediaController_SetVolume_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.volume = decoder.decodeStruct(codec.Float); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaController_SetVolume_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_SetVolume_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Float, val.volume); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaController_Seek_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_Seek_Params.prototype.initDefaults_ = function() { this.time = null; }; MediaController_Seek_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_Seek_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaController_Seek_Params.time err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_Seek_Params.encodedSize = codec.kStructHeaderSize + 8; MediaController_Seek_Params.decode = function(decoder) { var packed; var val = new MediaController_Seek_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.time = decoder.decodeStructPointer(time$.TimeDelta); return val; }; MediaController_Seek_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_Seek_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(time$.TimeDelta, val.time); }; function MediaController_NextTrack_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_NextTrack_Params.prototype.initDefaults_ = function() { }; MediaController_NextTrack_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_NextTrack_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_NextTrack_Params.encodedSize = codec.kStructHeaderSize + 0; MediaController_NextTrack_Params.decode = function(decoder) { var packed; var val = new MediaController_NextTrack_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaController_NextTrack_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_NextTrack_Params.encodedSize); encoder.writeUint32(0); }; function MediaController_PreviousTrack_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_PreviousTrack_Params.prototype.initDefaults_ = function() { }; MediaController_PreviousTrack_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_PreviousTrack_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_PreviousTrack_Params.encodedSize = codec.kStructHeaderSize + 0; MediaController_PreviousTrack_Params.decode = function(decoder) { var packed; var val = new MediaController_PreviousTrack_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaController_PreviousTrack_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_PreviousTrack_Params.encodedSize); encoder.writeUint32(0); }; var kMediaController_Play_Name = 1549515263; var kMediaController_Pause_Name = 1198343308; var kMediaController_SetMute_Name = 586590081; var kMediaController_SetVolume_Name = 928562510; var kMediaController_Seek_Name = 1119781559; var kMediaController_NextTrack_Name = 485431279; var kMediaController_PreviousTrack_Name = 229233413; function MediaControllerPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MediaController, handleOrPtrInfo); } function MediaControllerAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MediaController, associatedInterfacePtrInfo); } MediaControllerAssociatedPtr.prototype = Object.create(MediaControllerPtr.prototype); MediaControllerAssociatedPtr.prototype.constructor = MediaControllerAssociatedPtr; function MediaControllerProxy(receiver) { this.receiver_ = receiver; } MediaControllerPtr.prototype.play = function() { return MediaControllerProxy.prototype.play .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.play = function() { var params_ = new MediaController_Play_Params(); var builder = new codec.MessageV0Builder( kMediaController_Play_Name, codec.align(MediaController_Play_Params.encodedSize)); builder.encodeStruct(MediaController_Play_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.pause = function() { return MediaControllerProxy.prototype.pause .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.pause = function() { var params_ = new MediaController_Pause_Params(); var builder = new codec.MessageV0Builder( kMediaController_Pause_Name, codec.align(MediaController_Pause_Params.encodedSize)); builder.encodeStruct(MediaController_Pause_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.setMute = function() { return MediaControllerProxy.prototype.setMute .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.setMute = function(mute) { var params_ = new MediaController_SetMute_Params(); params_.mute = mute; var builder = new codec.MessageV0Builder( kMediaController_SetMute_Name, codec.align(MediaController_SetMute_Params.encodedSize)); builder.encodeStruct(MediaController_SetMute_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.setVolume = function() { return MediaControllerProxy.prototype.setVolume .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.setVolume = function(volume) { var params_ = new MediaController_SetVolume_Params(); params_.volume = volume; var builder = new codec.MessageV0Builder( kMediaController_SetVolume_Name, codec.align(MediaController_SetVolume_Params.encodedSize)); builder.encodeStruct(MediaController_SetVolume_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.seek = function() { return MediaControllerProxy.prototype.seek .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.seek = function(time) { var params_ = new MediaController_Seek_Params(); params_.time = time; var builder = new codec.MessageV0Builder( kMediaController_Seek_Name, codec.align(MediaController_Seek_Params.encodedSize)); builder.encodeStruct(MediaController_Seek_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.nextTrack = function() { return MediaControllerProxy.prototype.nextTrack .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.nextTrack = function() { var params_ = new MediaController_NextTrack_Params(); var builder = new codec.MessageV0Builder( kMediaController_NextTrack_Name, codec.align(MediaController_NextTrack_Params.encodedSize)); builder.encodeStruct(MediaController_NextTrack_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.previousTrack = function() { return MediaControllerProxy.prototype.previousTrack .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.previousTrack = function() { var params_ = new MediaController_PreviousTrack_Params(); var builder = new codec.MessageV0Builder( kMediaController_PreviousTrack_Name, codec.align(MediaController_PreviousTrack_Params.encodedSize)); builder.encodeStruct(MediaController_PreviousTrack_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function MediaControllerStub(delegate) { this.delegate_ = delegate; } MediaControllerStub.prototype.play = function() { return this.delegate_ && this.delegate_.play && this.delegate_.play(); } MediaControllerStub.prototype.pause = function() { return this.delegate_ && this.delegate_.pause && this.delegate_.pause(); } MediaControllerStub.prototype.setMute = function(mute) { return this.delegate_ && this.delegate_.setMute && this.delegate_.setMute(mute); } MediaControllerStub.prototype.setVolume = function(volume) { return this.delegate_ && this.delegate_.setVolume && this.delegate_.setVolume(volume); } MediaControllerStub.prototype.seek = function(time) { return this.delegate_ && this.delegate_.seek && this.delegate_.seek(time); } MediaControllerStub.prototype.nextTrack = function() { return this.delegate_ && this.delegate_.nextTrack && this.delegate_.nextTrack(); } MediaControllerStub.prototype.previousTrack = function() { return this.delegate_ && this.delegate_.previousTrack && this.delegate_.previousTrack(); } MediaControllerStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaController_Play_Name: var params = reader.decodeStruct(MediaController_Play_Params); this.play(); return true; case kMediaController_Pause_Name: var params = reader.decodeStruct(MediaController_Pause_Params); this.pause(); return true; case kMediaController_SetMute_Name: var params = reader.decodeStruct(MediaController_SetMute_Params); this.setMute(params.mute); return true; case kMediaController_SetVolume_Name: var params = reader.decodeStruct(MediaController_SetVolume_Params); this.setVolume(params.volume); return true; case kMediaController_Seek_Name: var params = reader.decodeStruct(MediaController_Seek_Params); this.seek(params.time); return true; case kMediaController_NextTrack_Name: var params = reader.decodeStruct(MediaController_NextTrack_Params); this.nextTrack(); return true; case kMediaController_PreviousTrack_Name: var params = reader.decodeStruct(MediaController_PreviousTrack_Params); this.previousTrack(); return true; default: return false; } }; MediaControllerStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateMediaControllerRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaController_Play_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_Play_Params; break; case kMediaController_Pause_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_Pause_Params; break; case kMediaController_SetMute_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_SetMute_Params; break; case kMediaController_SetVolume_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_SetVolume_Params; break; case kMediaController_Seek_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_Seek_Params; break; case kMediaController_NextTrack_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_NextTrack_Params; break; case kMediaController_PreviousTrack_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_PreviousTrack_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMediaControllerResponse(messageValidator) { return validator.validationError.NONE; } var MediaController = { name: 'media_router.mojom.MediaController', kVersion: 0, ptrClass: MediaControllerPtr, proxyClass: MediaControllerProxy, stubClass: MediaControllerStub, validateRequest: validateMediaControllerRequest, validateResponse: null, }; MediaControllerStub.prototype.validator = validateMediaControllerRequest; MediaControllerProxy.prototype.validator = null; exports.MediaController = MediaController; exports.MediaControllerPtr = MediaControllerPtr; exports.MediaControllerAssociatedPtr = MediaControllerAssociatedPtr; })();// chrome/common/media_router/mojom/media_router.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'chrome/common/media_router/mojom/media_router.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mediaRouter.mojom'); var media_controller$ = mojo.internal.exposeNamespace('mediaRouter.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'chrome/common/media_router/mojom/media_controller.mojom', 'media_controller.mojom.js'); } var media_status$ = mojo.internal.exposeNamespace('mediaRouter.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'chrome/common/media_router/mojom/media_status.mojom', 'media_status.mojom.js'); } var mirroring_service_host$ = mojo.internal.exposeNamespace('mirroring.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'components/mirroring/mojom/mirroring_service_host.mojom', '../../../../components/mirroring/mojom/mirroring_service_host.mojom.js'); } var mirror_service_remoting$ = mojo.internal.exposeNamespace('media.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'media/mojo/mojom/mirror_service_remoting.mojom', '../../../../media/mojo/mojom/mirror_service_remoting.mojom.js'); } var time$ = mojo.internal.exposeNamespace('mojoBase.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'mojo/public/mojom/base/time.mojom', '../../../../mojo/public/mojom/base/time.mojom.js'); } var ip_address$ = mojo.internal.exposeNamespace('network.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'services/network/public/mojom/ip_address.mojom', '../../../../services/network/public/mojom/ip_address.mojom.js'); } var ip_endpoint$ = mojo.internal.exposeNamespace('network.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'services/network/public/mojom/ip_endpoint.mojom', '../../../../services/network/public/mojom/ip_endpoint.mojom.js'); } var presentation$ = mojo.internal.exposeNamespace('blink.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'third_party/blink/public/mojom/presentation/presentation.mojom', '../../../../third_party/blink/public/mojom/presentation/presentation.mojom.js'); } var origin$ = mojo.internal.exposeNamespace('url.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'url/mojom/origin.mojom', '../../../../url/mojom/origin.mojom.js'); } var url$ = mojo.internal.exposeNamespace('url.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'url/mojom/url.mojom', '../../../../url/mojom/url.mojom.js'); } var SinkIconType = {}; SinkIconType.CAST = 0; SinkIconType.CAST_AUDIO_GROUP = SinkIconType.CAST + 1; SinkIconType.CAST_AUDIO = SinkIconType.CAST_AUDIO_GROUP + 1; SinkIconType.MEETING = SinkIconType.CAST_AUDIO + 1; SinkIconType.HANGOUT = SinkIconType.MEETING + 1; SinkIconType.EDUCATION = SinkIconType.HANGOUT + 1; SinkIconType.WIRED_DISPLAY = SinkIconType.EDUCATION + 1; SinkIconType.GENERIC = SinkIconType.WIRED_DISPLAY + 1; SinkIconType.MIN_VALUE = 0, SinkIconType.MAX_VALUE = 7, SinkIconType.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: return true; } return false; }; SinkIconType.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RouteControllerType = {}; RouteControllerType.kNone = 0; RouteControllerType.kGeneric = RouteControllerType.kNone + 1; RouteControllerType.kMirroring = RouteControllerType.kGeneric + 1; RouteControllerType.MIN_VALUE = 0, RouteControllerType.MAX_VALUE = 2, RouteControllerType.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; RouteControllerType.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RouteRequestResultCode = {}; RouteRequestResultCode.UNKNOWN_ERROR = 0; RouteRequestResultCode.OK = RouteRequestResultCode.UNKNOWN_ERROR + 1; RouteRequestResultCode.TIMED_OUT = RouteRequestResultCode.OK + 1; RouteRequestResultCode.ROUTE_NOT_FOUND = RouteRequestResultCode.TIMED_OUT + 1; RouteRequestResultCode.SINK_NOT_FOUND = RouteRequestResultCode.ROUTE_NOT_FOUND + 1; RouteRequestResultCode.INVALID_ORIGIN = RouteRequestResultCode.SINK_NOT_FOUND + 1; RouteRequestResultCode.INCOGNITO_MISMATCH = RouteRequestResultCode.INVALID_ORIGIN + 1; RouteRequestResultCode.NO_SUPPORTED_PROVIDER = RouteRequestResultCode.INCOGNITO_MISMATCH + 1; RouteRequestResultCode.CANCELLED = RouteRequestResultCode.NO_SUPPORTED_PROVIDER + 1; RouteRequestResultCode.ROUTE_ALREADY_EXISTS = RouteRequestResultCode.CANCELLED + 1; RouteRequestResultCode.DESKTOP_PICKER_FAILED = RouteRequestResultCode.ROUTE_ALREADY_EXISTS + 1; RouteRequestResultCode.MIN_VALUE = 0, RouteRequestResultCode.MAX_VALUE = 10, RouteRequestResultCode.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: return true; } return false; }; RouteRequestResultCode.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; function MediaSink(values) { this.initDefaults_(); this.initFields_(values); } MediaSink.prototype.initDefaults_ = function() { this.sinkId = null; this.name = null; this.description = null; this.domain = null; this.iconType = 0; this.providerId = 0; this.extraData = null; }; MediaSink.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaSink.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 64} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaSink.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaSink.name err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaSink.description err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true) if (err !== validator.validationError.NONE) return err; // validate MediaSink.domain err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, true) if (err !== validator.validationError.NONE) return err; // validate MediaSink.iconType err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 32, SinkIconType); if (err !== validator.validationError.NONE) return err; // validate MediaSink.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 36, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaSink.extraData err = messageValidator.validateUnion(offset + codec.kStructHeaderSize + 40, MediaSinkExtraData, true); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaSink.encodedSize = codec.kStructHeaderSize + 56; MediaSink.decode = function(decoder) { var packed; var val = new MediaSink(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.sinkId = decoder.decodeStruct(codec.String); val.name = decoder.decodeStruct(codec.String); val.description = decoder.decodeStruct(codec.NullableString); val.domain = decoder.decodeStruct(codec.NullableString); val.iconType = decoder.decodeStruct(codec.Int32); val.providerId = decoder.decodeStruct(codec.Int32); val.extraData = decoder.decodeStruct(MediaSinkExtraData); return val; }; MediaSink.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaSink.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.sinkId); encoder.encodeStruct(codec.String, val.name); encoder.encodeStruct(codec.NullableString, val.description); encoder.encodeStruct(codec.NullableString, val.domain); encoder.encodeStruct(codec.Int32, val.iconType); encoder.encodeStruct(codec.Int32, val.providerId); encoder.encodeStruct(MediaSinkExtraData, val.extraData); }; function DialMediaSink(values) { this.initDefaults_(); this.initFields_(values); } DialMediaSink.prototype.initDefaults_ = function() { this.ipAddress = null; this.modelName = null; this.appUrl = null; }; DialMediaSink.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; DialMediaSink.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate DialMediaSink.ipAddress err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, ip_address$.IPAddress, false); if (err !== validator.validationError.NONE) return err; // validate DialMediaSink.modelName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate DialMediaSink.appUrl err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 16, url$.Url, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; DialMediaSink.encodedSize = codec.kStructHeaderSize + 24; DialMediaSink.decode = function(decoder) { var packed; var val = new DialMediaSink(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.ipAddress = decoder.decodeStructPointer(ip_address$.IPAddress); val.modelName = decoder.decodeStruct(codec.String); val.appUrl = decoder.decodeStructPointer(url$.Url); return val; }; DialMediaSink.encode = function(encoder, val) { var packed; encoder.writeUint32(DialMediaSink.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(ip_address$.IPAddress, val.ipAddress); encoder.encodeStruct(codec.String, val.modelName); encoder.encodeStructPointer(url$.Url, val.appUrl); }; function CastMediaSink(values) { this.initDefaults_(); this.initFields_(values); } CastMediaSink.prototype.initDefaults_ = function() { this.ipEndpoint = null; this.modelName = null; this.capabilities = 0; this.castChannelId = 0; }; CastMediaSink.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; CastMediaSink.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate CastMediaSink.ipEndpoint err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, ip_endpoint$.IPEndPoint, false); if (err !== validator.validationError.NONE) return err; // validate CastMediaSink.modelName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; CastMediaSink.encodedSize = codec.kStructHeaderSize + 24; CastMediaSink.decode = function(decoder) { var packed; var val = new CastMediaSink(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.ipEndpoint = decoder.decodeStructPointer(ip_endpoint$.IPEndPoint); val.modelName = decoder.decodeStruct(codec.String); val.capabilities = decoder.decodeStruct(codec.Uint8); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.castChannelId = decoder.decodeStruct(codec.Int32); return val; }; CastMediaSink.encode = function(encoder, val) { var packed; encoder.writeUint32(CastMediaSink.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(ip_endpoint$.IPEndPoint, val.ipEndpoint); encoder.encodeStruct(codec.String, val.modelName); encoder.encodeStruct(codec.Uint8, val.capabilities); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.Int32, val.castChannelId); }; function MediaRoute(values) { this.initDefaults_(); this.initFields_(values); } MediaRoute.prototype.initDefaults_ = function() { this.mediaRouteId = null; this.presentationId = null; this.mediaSource = null; this.mediaSinkId = null; this.description = null; this.isLocal = false; this.forDisplay = false; this.isIncognito = false; this.isLocalPresentation = false; this.controllerType = 0; }; MediaRoute.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRoute.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 56} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRoute.mediaRouteId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.presentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.mediaSinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, false) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.description err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 32, false) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.controllerType err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 44, RouteControllerType); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRoute.encodedSize = codec.kStructHeaderSize + 48; MediaRoute.decode = function(decoder) { var packed; var val = new MediaRoute(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaRouteId = decoder.decodeStruct(codec.String); val.presentationId = decoder.decodeStruct(codec.String); val.mediaSource = decoder.decodeStruct(codec.NullableString); val.mediaSinkId = decoder.decodeStruct(codec.String); val.description = decoder.decodeStruct(codec.String); packed = decoder.readUint8(); val.isLocal = (packed >> 0) & 1 ? true : false; val.forDisplay = (packed >> 1) & 1 ? true : false; val.isIncognito = (packed >> 2) & 1 ? true : false; val.isLocalPresentation = (packed >> 3) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.controllerType = decoder.decodeStruct(codec.Int32); return val; }; MediaRoute.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRoute.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaRouteId); encoder.encodeStruct(codec.String, val.presentationId); encoder.encodeStruct(codec.NullableString, val.mediaSource); encoder.encodeStruct(codec.String, val.mediaSinkId); encoder.encodeStruct(codec.String, val.description); packed = 0; packed |= (val.isLocal & 1) << 0 packed |= (val.forDisplay & 1) << 1 packed |= (val.isIncognito & 1) << 2 packed |= (val.isLocalPresentation & 1) << 3 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.Int32, val.controllerType); }; function Issue(values) { this.initDefaults_(); this.initFields_(values); } Issue.Severity = {}; Issue.Severity.FATAL = 0; Issue.Severity.WARNING = Issue.Severity.FATAL + 1; Issue.Severity.NOTIFICATION = Issue.Severity.WARNING + 1; Issue.Severity.MIN_VALUE = 0, Issue.Severity.MAX_VALUE = 2, Issue.Severity.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; Issue.Severity.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; Issue.ActionType = {}; Issue.ActionType.DISMISS = 0; Issue.ActionType.LEARN_MORE = Issue.ActionType.DISMISS + 1; Issue.ActionType.MIN_VALUE = 0, Issue.ActionType.MAX_VALUE = 1, Issue.ActionType.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: return true; } return false; }; Issue.ActionType.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; Issue.prototype.initDefaults_ = function() { this.routeId = null; this.sinkId = null; this.severity = 0; this.isBlocking = false; this.title = null; this.message = null; this.defaultAction = 0; this.helpPageId = 0; this.secondaryActions = null; }; Issue.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; Issue.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 64} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate Issue.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate Issue.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate Issue.severity err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 16, Issue.Severity); if (err !== validator.validationError.NONE) return err; // validate Issue.title err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, false) if (err !== validator.validationError.NONE) return err; // validate Issue.message err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 32, true) if (err !== validator.validationError.NONE) return err; // validate Issue.defaultAction err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 40, Issue.ActionType); if (err !== validator.validationError.NONE) return err; // validate Issue.secondaryActions err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 48, 4, new codec.Enum(Issue.ActionType), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; Issue.encodedSize = codec.kStructHeaderSize + 56; Issue.decode = function(decoder) { var packed; var val = new Issue(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.sinkId = decoder.decodeStruct(codec.String); val.severity = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.isBlocking = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.title = decoder.decodeStruct(codec.String); val.message = decoder.decodeStruct(codec.NullableString); val.defaultAction = decoder.decodeStruct(codec.Int32); val.helpPageId = decoder.decodeStruct(codec.Int32); val.secondaryActions = decoder.decodeArrayPointer(new codec.Enum(Issue.ActionType)); return val; }; Issue.encode = function(encoder, val) { var packed; encoder.writeUint32(Issue.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.String, val.sinkId); encoder.encodeStruct(codec.Int32, val.severity); packed = 0; packed |= (val.isBlocking & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.String, val.title); encoder.encodeStruct(codec.NullableString, val.message); encoder.encodeStruct(codec.Int32, val.defaultAction); encoder.encodeStruct(codec.Int32, val.helpPageId); encoder.encodeArrayPointer(new codec.Enum(Issue.ActionType), val.secondaryActions); }; function RouteMessage(values) { this.initDefaults_(); this.initFields_(values); } RouteMessage.Type = {}; RouteMessage.Type.TEXT = 0; RouteMessage.Type.BINARY = RouteMessage.Type.TEXT + 1; RouteMessage.Type.MIN_VALUE = 0, RouteMessage.Type.MAX_VALUE = 1, RouteMessage.Type.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: return true; } return false; }; RouteMessage.Type.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; RouteMessage.prototype.initDefaults_ = function() { this.type = 0; this.message = null; this.data = null; }; RouteMessage.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; RouteMessage.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate RouteMessage.type err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, RouteMessage.Type); if (err !== validator.validationError.NONE) return err; // validate RouteMessage.message err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, true) if (err !== validator.validationError.NONE) return err; // validate RouteMessage.data err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 1, codec.Uint8, true, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; RouteMessage.encodedSize = codec.kStructHeaderSize + 24; RouteMessage.decode = function(decoder) { var packed; var val = new RouteMessage(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.type = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.message = decoder.decodeStruct(codec.NullableString); val.data = decoder.decodeArrayPointer(codec.Uint8); return val; }; RouteMessage.encode = function(encoder, val) { var packed; encoder.writeUint32(RouteMessage.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.type); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.NullableString, val.message); encoder.encodeArrayPointer(codec.Uint8, val.data); }; function SinkSearchCriteria(values) { this.initDefaults_(); this.initFields_(values); } SinkSearchCriteria.prototype.initDefaults_ = function() { this.input = null; this.domain = null; }; SinkSearchCriteria.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; SinkSearchCriteria.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate SinkSearchCriteria.input err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate SinkSearchCriteria.domain err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; SinkSearchCriteria.encodedSize = codec.kStructHeaderSize + 16; SinkSearchCriteria.decode = function(decoder) { var packed; var val = new SinkSearchCriteria(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.input = decoder.decodeStruct(codec.String); val.domain = decoder.decodeStruct(codec.String); return val; }; SinkSearchCriteria.encode = function(encoder, val) { var packed; encoder.writeUint32(SinkSearchCriteria.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.input); encoder.encodeStruct(codec.String, val.domain); }; function MediaRouteProviderConfig(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProviderConfig.prototype.initDefaults_ = function() { this.enableDialDiscovery = false; this.enableCastDiscovery = false; this.enableDialSinkQuery = false; this.enableCastSinkQuery = false; this.useMirroringService = false; }; MediaRouteProviderConfig.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProviderConfig.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProviderConfig.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProviderConfig.decode = function(decoder) { var packed; var val = new MediaRouteProviderConfig(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.enableDialDiscovery = (packed >> 0) & 1 ? true : false; val.enableCastDiscovery = (packed >> 1) & 1 ? true : false; val.enableDialSinkQuery = (packed >> 2) & 1 ? true : false; val.enableCastSinkQuery = (packed >> 3) & 1 ? true : false; val.useMirroringService = (packed >> 4) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProviderConfig.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProviderConfig.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.enableDialDiscovery & 1) << 0 packed |= (val.enableCastDiscovery & 1) << 1 packed |= (val.enableDialSinkQuery & 1) << 2 packed |= (val.enableCastSinkQuery & 1) << 3 packed |= (val.useMirroringService & 1) << 4 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function RoutePresentationConnection(values) { this.initDefaults_(); this.initFields_(values); } RoutePresentationConnection.prototype.initDefaults_ = function() { this.connectionRemote = new presentation$.PresentationConnectionPtr(); this.connectionReceiver = new bindings.InterfaceRequest(); }; RoutePresentationConnection.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; RoutePresentationConnection.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate RoutePresentationConnection.connectionRemote err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 0, false); if (err !== validator.validationError.NONE) return err; // validate RoutePresentationConnection.connectionReceiver err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; RoutePresentationConnection.encodedSize = codec.kStructHeaderSize + 16; RoutePresentationConnection.decode = function(decoder) { var packed; var val = new RoutePresentationConnection(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.connectionRemote = decoder.decodeStruct(new codec.Interface(presentation$.PresentationConnectionPtr)); val.connectionReceiver = decoder.decodeStruct(codec.InterfaceRequest); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; RoutePresentationConnection.encode = function(encoder, val) { var packed; encoder.writeUint32(RoutePresentationConnection.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(new codec.Interface(presentation$.PresentationConnectionPtr), val.connectionRemote); encoder.encodeStruct(codec.InterfaceRequest, val.connectionReceiver); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_CreateRoute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_CreateRoute_Params.prototype.initDefaults_ = function() { this.mediaSource = null; this.sinkId = null; this.originalPresentationId = null; this.origin = null; this.tabId = 0; this.incognito = false; this.timeout = null; }; MediaRouteProvider_CreateRoute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_CreateRoute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 56} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.originalPresentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.origin err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, origin$.Origin, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.timeout err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 40, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_CreateRoute_Params.encodedSize = codec.kStructHeaderSize + 48; MediaRouteProvider_CreateRoute_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_CreateRoute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); val.sinkId = decoder.decodeStruct(codec.String); val.originalPresentationId = decoder.decodeStruct(codec.String); val.origin = decoder.decodeStructPointer(origin$.Origin); val.tabId = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.incognito = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.timeout = decoder.decodeStructPointer(time$.TimeDelta); return val; }; MediaRouteProvider_CreateRoute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_CreateRoute_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeStruct(codec.String, val.sinkId); encoder.encodeStruct(codec.String, val.originalPresentationId); encoder.encodeStructPointer(origin$.Origin, val.origin); encoder.encodeStruct(codec.Int32, val.tabId); packed = 0; packed |= (val.incognito & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(time$.TimeDelta, val.timeout); }; function MediaRouteProvider_CreateRoute_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_CreateRoute_ResponseParams.prototype.initDefaults_ = function() { this.route = null; this.connection = null; this.errorText = null; this.resultCode = 0; }; MediaRouteProvider_CreateRoute_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_CreateRoute_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_ResponseParams.route err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaRoute, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_ResponseParams.connection err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, RoutePresentationConnection, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_ResponseParams.errorText err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_ResponseParams.resultCode err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 24, RouteRequestResultCode); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_CreateRoute_ResponseParams.encodedSize = codec.kStructHeaderSize + 32; MediaRouteProvider_CreateRoute_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_CreateRoute_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.route = decoder.decodeStructPointer(MediaRoute); val.connection = decoder.decodeStructPointer(RoutePresentationConnection); val.errorText = decoder.decodeStruct(codec.NullableString); val.resultCode = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_CreateRoute_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_CreateRoute_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(MediaRoute, val.route); encoder.encodeStructPointer(RoutePresentationConnection, val.connection); encoder.encodeStruct(codec.NullableString, val.errorText); encoder.encodeStruct(codec.Int32, val.resultCode); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_JoinRoute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_JoinRoute_Params.prototype.initDefaults_ = function() { this.mediaSource = null; this.presentationId = null; this.origin = null; this.tabId = 0; this.incognito = false; this.timeout = null; }; MediaRouteProvider_JoinRoute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_JoinRoute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 48} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_Params.presentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_Params.origin err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 16, origin$.Origin, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_Params.timeout err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 32, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_JoinRoute_Params.encodedSize = codec.kStructHeaderSize + 40; MediaRouteProvider_JoinRoute_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_JoinRoute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); val.presentationId = decoder.decodeStruct(codec.String); val.origin = decoder.decodeStructPointer(origin$.Origin); val.tabId = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.incognito = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.timeout = decoder.decodeStructPointer(time$.TimeDelta); return val; }; MediaRouteProvider_JoinRoute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_JoinRoute_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeStruct(codec.String, val.presentationId); encoder.encodeStructPointer(origin$.Origin, val.origin); encoder.encodeStruct(codec.Int32, val.tabId); packed = 0; packed |= (val.incognito & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(time$.TimeDelta, val.timeout); }; function MediaRouteProvider_JoinRoute_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_JoinRoute_ResponseParams.prototype.initDefaults_ = function() { this.route = null; this.connection = null; this.errorText = null; this.resultCode = 0; }; MediaRouteProvider_JoinRoute_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_JoinRoute_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_ResponseParams.route err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaRoute, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_ResponseParams.connection err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, RoutePresentationConnection, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_ResponseParams.errorText err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_ResponseParams.resultCode err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 24, RouteRequestResultCode); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_JoinRoute_ResponseParams.encodedSize = codec.kStructHeaderSize + 32; MediaRouteProvider_JoinRoute_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_JoinRoute_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.route = decoder.decodeStructPointer(MediaRoute); val.connection = decoder.decodeStructPointer(RoutePresentationConnection); val.errorText = decoder.decodeStruct(codec.NullableString); val.resultCode = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_JoinRoute_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_JoinRoute_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(MediaRoute, val.route); encoder.encodeStructPointer(RoutePresentationConnection, val.connection); encoder.encodeStruct(codec.NullableString, val.errorText); encoder.encodeStruct(codec.Int32, val.resultCode); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_ConnectRouteByRouteId_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_ConnectRouteByRouteId_Params.prototype.initDefaults_ = function() { this.mediaSource = null; this.routeId = null; this.presentationId = null; this.origin = null; this.tabId = 0; this.incognito = false; this.timeout = null; }; MediaRouteProvider_ConnectRouteByRouteId_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_ConnectRouteByRouteId_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 56} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.presentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.origin err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, origin$.Origin, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.timeout err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 40, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_ConnectRouteByRouteId_Params.encodedSize = codec.kStructHeaderSize + 48; MediaRouteProvider_ConnectRouteByRouteId_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_ConnectRouteByRouteId_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); val.routeId = decoder.decodeStruct(codec.String); val.presentationId = decoder.decodeStruct(codec.String); val.origin = decoder.decodeStructPointer(origin$.Origin); val.tabId = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.incognito = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.timeout = decoder.decodeStructPointer(time$.TimeDelta); return val; }; MediaRouteProvider_ConnectRouteByRouteId_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_ConnectRouteByRouteId_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.String, val.presentationId); encoder.encodeStructPointer(origin$.Origin, val.origin); encoder.encodeStruct(codec.Int32, val.tabId); packed = 0; packed |= (val.incognito & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(time$.TimeDelta, val.timeout); }; function MediaRouteProvider_ConnectRouteByRouteId_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.prototype.initDefaults_ = function() { this.route = null; this.connection = null; this.errorText = null; this.resultCode = 0; }; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.route err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaRoute, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.connection err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, RoutePresentationConnection, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.errorText err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.resultCode err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 24, RouteRequestResultCode); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encodedSize = codec.kStructHeaderSize + 32; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_ConnectRouteByRouteId_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.route = decoder.decodeStructPointer(MediaRoute); val.connection = decoder.decodeStructPointer(RoutePresentationConnection); val.errorText = decoder.decodeStruct(codec.NullableString); val.resultCode = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(MediaRoute, val.route); encoder.encodeStructPointer(RoutePresentationConnection, val.connection); encoder.encodeStruct(codec.NullableString, val.errorText); encoder.encodeStruct(codec.Int32, val.resultCode); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_TerminateRoute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_TerminateRoute_Params.prototype.initDefaults_ = function() { this.routeId = null; }; MediaRouteProvider_TerminateRoute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_TerminateRoute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_TerminateRoute_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_TerminateRoute_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_TerminateRoute_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_TerminateRoute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_TerminateRoute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_TerminateRoute_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); }; function MediaRouteProvider_TerminateRoute_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_TerminateRoute_ResponseParams.prototype.initDefaults_ = function() { this.errorText = null; this.resultCode = 0; }; MediaRouteProvider_TerminateRoute_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_TerminateRoute_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_TerminateRoute_ResponseParams.errorText err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, true) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_TerminateRoute_ResponseParams.resultCode err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, RouteRequestResultCode); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_TerminateRoute_ResponseParams.encodedSize = codec.kStructHeaderSize + 16; MediaRouteProvider_TerminateRoute_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_TerminateRoute_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.errorText = decoder.decodeStruct(codec.NullableString); val.resultCode = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_TerminateRoute_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_TerminateRoute_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.NullableString, val.errorText); encoder.encodeStruct(codec.Int32, val.resultCode); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_SendRouteMessage_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SendRouteMessage_Params.prototype.initDefaults_ = function() { this.mediaRouteId = null; this.message = null; }; MediaRouteProvider_SendRouteMessage_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SendRouteMessage_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SendRouteMessage_Params.mediaRouteId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SendRouteMessage_Params.message err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SendRouteMessage_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouteProvider_SendRouteMessage_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SendRouteMessage_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaRouteId = decoder.decodeStruct(codec.String); val.message = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_SendRouteMessage_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SendRouteMessage_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaRouteId); encoder.encodeStruct(codec.String, val.message); }; function MediaRouteProvider_SendRouteBinaryMessage_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SendRouteBinaryMessage_Params.prototype.initDefaults_ = function() { this.mediaRouteId = null; this.data = null; }; MediaRouteProvider_SendRouteBinaryMessage_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SendRouteBinaryMessage_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SendRouteBinaryMessage_Params.mediaRouteId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SendRouteBinaryMessage_Params.data err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 1, codec.Uint8, false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SendRouteBinaryMessage_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouteProvider_SendRouteBinaryMessage_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SendRouteBinaryMessage_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaRouteId = decoder.decodeStruct(codec.String); val.data = decoder.decodeArrayPointer(codec.Uint8); return val; }; MediaRouteProvider_SendRouteBinaryMessage_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SendRouteBinaryMessage_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaRouteId); encoder.encodeArrayPointer(codec.Uint8, val.data); }; function MediaRouteProvider_StartObservingMediaSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StartObservingMediaSinks_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_StartObservingMediaSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StartObservingMediaSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StartObservingMediaSinks_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StartObservingMediaSinks_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StartObservingMediaSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StartObservingMediaSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StartObservingMediaSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StartObservingMediaSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_StopObservingMediaSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StopObservingMediaSinks_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_StopObservingMediaSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StopObservingMediaSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StopObservingMediaSinks_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StopObservingMediaSinks_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StopObservingMediaSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StopObservingMediaSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StopObservingMediaSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StopObservingMediaSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_StartObservingMediaRoutes_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StartObservingMediaRoutes_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_StartObservingMediaRoutes_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StartObservingMediaRoutes_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StartObservingMediaRoutes_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StartObservingMediaRoutes_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StartObservingMediaRoutes_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StartObservingMediaRoutes_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StartObservingMediaRoutes_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StartObservingMediaRoutes_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_StopObservingMediaRoutes_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StopObservingMediaRoutes_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_StopObservingMediaRoutes_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StopObservingMediaRoutes_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StopObservingMediaRoutes_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StopObservingMediaRoutes_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StopObservingMediaRoutes_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StopObservingMediaRoutes_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StopObservingMediaRoutes_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StopObservingMediaRoutes_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_StartListeningForRouteMessages_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StartListeningForRouteMessages_Params.prototype.initDefaults_ = function() { this.routeId = null; }; MediaRouteProvider_StartListeningForRouteMessages_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StartListeningForRouteMessages_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StartListeningForRouteMessages_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StartListeningForRouteMessages_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StartListeningForRouteMessages_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StartListeningForRouteMessages_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StartListeningForRouteMessages_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StartListeningForRouteMessages_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); }; function MediaRouteProvider_StopListeningForRouteMessages_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StopListeningForRouteMessages_Params.prototype.initDefaults_ = function() { this.routeId = null; }; MediaRouteProvider_StopListeningForRouteMessages_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StopListeningForRouteMessages_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StopListeningForRouteMessages_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StopListeningForRouteMessages_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StopListeningForRouteMessages_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StopListeningForRouteMessages_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StopListeningForRouteMessages_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StopListeningForRouteMessages_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); }; function MediaRouteProvider_DetachRoute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_DetachRoute_Params.prototype.initDefaults_ = function() { this.routeId = null; }; MediaRouteProvider_DetachRoute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_DetachRoute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_DetachRoute_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_DetachRoute_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_DetachRoute_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_DetachRoute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_DetachRoute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_DetachRoute_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); }; function MediaRouteProvider_EnableMdnsDiscovery_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_EnableMdnsDiscovery_Params.prototype.initDefaults_ = function() { }; MediaRouteProvider_EnableMdnsDiscovery_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_EnableMdnsDiscovery_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_EnableMdnsDiscovery_Params.encodedSize = codec.kStructHeaderSize + 0; MediaRouteProvider_EnableMdnsDiscovery_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_EnableMdnsDiscovery_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaRouteProvider_EnableMdnsDiscovery_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_EnableMdnsDiscovery_Params.encodedSize); encoder.writeUint32(0); }; function MediaRouteProvider_UpdateMediaSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_UpdateMediaSinks_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_UpdateMediaSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_UpdateMediaSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_UpdateMediaSinks_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_UpdateMediaSinks_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_UpdateMediaSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_UpdateMediaSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_UpdateMediaSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_UpdateMediaSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_SearchSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SearchSinks_Params.prototype.initDefaults_ = function() { this.sinkId = null; this.mediaSource = null; this.searchCriteria = null; }; MediaRouteProvider_SearchSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SearchSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SearchSinks_Params.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SearchSinks_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SearchSinks_Params.searchCriteria err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 16, SinkSearchCriteria, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SearchSinks_Params.encodedSize = codec.kStructHeaderSize + 24; MediaRouteProvider_SearchSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SearchSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.sinkId = decoder.decodeStruct(codec.String); val.mediaSource = decoder.decodeStruct(codec.String); val.searchCriteria = decoder.decodeStructPointer(SinkSearchCriteria); return val; }; MediaRouteProvider_SearchSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SearchSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.sinkId); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeStructPointer(SinkSearchCriteria, val.searchCriteria); }; function MediaRouteProvider_SearchSinks_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SearchSinks_ResponseParams.prototype.initDefaults_ = function() { this.sinkId = null; }; MediaRouteProvider_SearchSinks_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SearchSinks_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SearchSinks_ResponseParams.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SearchSinks_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_SearchSinks_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SearchSinks_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.sinkId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_SearchSinks_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SearchSinks_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.sinkId); }; function MediaRouteProvider_ProvideSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_ProvideSinks_Params.prototype.initDefaults_ = function() { this.providerName = null; this.sinks = null; }; MediaRouteProvider_ProvideSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_ProvideSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ProvideSinks_Params.providerName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ProvideSinks_Params.sinks err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(MediaSink), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_ProvideSinks_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouteProvider_ProvideSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_ProvideSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerName = decoder.decodeStruct(codec.String); val.sinks = decoder.decodeArrayPointer(new codec.PointerTo(MediaSink)); return val; }; MediaRouteProvider_ProvideSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_ProvideSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.providerName); encoder.encodeArrayPointer(new codec.PointerTo(MediaSink), val.sinks); }; function MediaRouteProvider_CreateMediaRouteController_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_CreateMediaRouteController_Params.prototype.initDefaults_ = function() { this.routeId = null; this.mediaController = new bindings.InterfaceRequest(); this.observer = new media_status$.MediaStatusObserverPtr(); }; MediaRouteProvider_CreateMediaRouteController_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_CreateMediaRouteController_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateMediaRouteController_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateMediaRouteController_Params.mediaController err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateMediaRouteController_Params.observer err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 12, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_CreateMediaRouteController_Params.encodedSize = codec.kStructHeaderSize + 24; MediaRouteProvider_CreateMediaRouteController_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_CreateMediaRouteController_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.mediaController = decoder.decodeStruct(codec.InterfaceRequest); val.observer = decoder.decodeStruct(new codec.Interface(media_status$.MediaStatusObserverPtr)); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_CreateMediaRouteController_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_CreateMediaRouteController_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.InterfaceRequest, val.mediaController); encoder.encodeStruct(new codec.Interface(media_status$.MediaStatusObserverPtr), val.observer); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_CreateMediaRouteController_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_CreateMediaRouteController_ResponseParams.prototype.initDefaults_ = function() { this.success = false; }; MediaRouteProvider_CreateMediaRouteController_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_CreateMediaRouteController_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_CreateMediaRouteController_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_CreateMediaRouteController_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_CreateMediaRouteController_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.success = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_CreateMediaRouteController_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_CreateMediaRouteController_ResponseParams.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.success & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouter_RegisterMediaRouteProvider_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_RegisterMediaRouteProvider_Params.prototype.initDefaults_ = function() { this.providerId = 0; this.mediaRouterProvider = new MediaRouteProviderPtr(); }; MediaRouter_RegisterMediaRouteProvider_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_RegisterMediaRouteProvider_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_RegisterMediaRouteProvider_Params.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_RegisterMediaRouteProvider_Params.mediaRouterProvider err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 4, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_RegisterMediaRouteProvider_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_RegisterMediaRouteProvider_Params.decode = function(decoder) { var packed; var val = new MediaRouter_RegisterMediaRouteProvider_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerId = decoder.decodeStruct(codec.Int32); val.mediaRouterProvider = decoder.decodeStruct(new codec.Interface(MediaRouteProviderPtr)); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouter_RegisterMediaRouteProvider_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_RegisterMediaRouteProvider_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.providerId); encoder.encodeStruct(new codec.Interface(MediaRouteProviderPtr), val.mediaRouterProvider); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouter_RegisterMediaRouteProvider_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_RegisterMediaRouteProvider_ResponseParams.prototype.initDefaults_ = function() { this.instanceId = null; this.config = null; }; MediaRouter_RegisterMediaRouteProvider_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_RegisterMediaRouteProvider_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_RegisterMediaRouteProvider_ResponseParams.instanceId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_RegisterMediaRouteProvider_ResponseParams.config err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, MediaRouteProviderConfig, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_RegisterMediaRouteProvider_ResponseParams.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_RegisterMediaRouteProvider_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouter_RegisterMediaRouteProvider_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.instanceId = decoder.decodeStruct(codec.String); val.config = decoder.decodeStructPointer(MediaRouteProviderConfig); return val; }; MediaRouter_RegisterMediaRouteProvider_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_RegisterMediaRouteProvider_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.instanceId); encoder.encodeStructPointer(MediaRouteProviderConfig, val.config); }; function MediaRouter_OnSinksReceived_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnSinksReceived_Params.prototype.initDefaults_ = function() { this.providerId = 0; this.mediaSource = null; this.sinks = null; this.origins = null; }; MediaRouter_OnSinksReceived_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnSinksReceived_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinksReceived_Params.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinksReceived_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinksReceived_Params.sinks err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 8, new codec.PointerTo(MediaSink), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinksReceived_Params.origins err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 24, 8, new codec.PointerTo(origin$.Origin), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnSinksReceived_Params.encodedSize = codec.kStructHeaderSize + 32; MediaRouter_OnSinksReceived_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnSinksReceived_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerId = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.mediaSource = decoder.decodeStruct(codec.String); val.sinks = decoder.decodeArrayPointer(new codec.PointerTo(MediaSink)); val.origins = decoder.decodeArrayPointer(new codec.PointerTo(origin$.Origin)); return val; }; MediaRouter_OnSinksReceived_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnSinksReceived_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.providerId); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeArrayPointer(new codec.PointerTo(MediaSink), val.sinks); encoder.encodeArrayPointer(new codec.PointerTo(origin$.Origin), val.origins); }; function MediaRouter_OnIssue_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnIssue_Params.prototype.initDefaults_ = function() { this.issue = null; }; MediaRouter_OnIssue_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnIssue_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnIssue_Params.issue err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, Issue, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnIssue_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouter_OnIssue_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnIssue_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.issue = decoder.decodeStructPointer(Issue); return val; }; MediaRouter_OnIssue_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnIssue_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(Issue, val.issue); }; function MediaRouter_OnRoutesUpdated_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnRoutesUpdated_Params.prototype.initDefaults_ = function() { this.providerId = 0; this.routes = null; this.mediaSource = null; this.joinableRouteIds = null; }; MediaRouter_OnRoutesUpdated_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnRoutesUpdated_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRoutesUpdated_Params.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRoutesUpdated_Params.routes err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(MediaRoute), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRoutesUpdated_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRoutesUpdated_Params.joinableRouteIds err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 24, 8, codec.String, false, [0, 0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnRoutesUpdated_Params.encodedSize = codec.kStructHeaderSize + 32; MediaRouter_OnRoutesUpdated_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnRoutesUpdated_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerId = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.routes = decoder.decodeArrayPointer(new codec.PointerTo(MediaRoute)); val.mediaSource = decoder.decodeStruct(codec.String); val.joinableRouteIds = decoder.decodeArrayPointer(codec.String); return val; }; MediaRouter_OnRoutesUpdated_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnRoutesUpdated_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.providerId); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeArrayPointer(new codec.PointerTo(MediaRoute), val.routes); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeArrayPointer(codec.String, val.joinableRouteIds); }; function MediaRouter_OnSinkAvailabilityUpdated_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnSinkAvailabilityUpdated_Params.prototype.initDefaults_ = function() { this.providerId = 0; this.availability = 0; }; MediaRouter_OnSinkAvailabilityUpdated_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnSinkAvailabilityUpdated_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinkAvailabilityUpdated_Params.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinkAvailabilityUpdated_Params.availability err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 4, MediaRouter.SinkAvailability); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnSinkAvailabilityUpdated_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouter_OnSinkAvailabilityUpdated_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnSinkAvailabilityUpdated_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerId = decoder.decodeStruct(codec.Int32); val.availability = decoder.decodeStruct(codec.Int32); return val; }; MediaRouter_OnSinkAvailabilityUpdated_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnSinkAvailabilityUpdated_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.providerId); encoder.encodeStruct(codec.Int32, val.availability); }; function MediaRouter_OnPresentationConnectionStateChanged_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnPresentationConnectionStateChanged_Params.prototype.initDefaults_ = function() { this.routeId = null; this.state = 0; }; MediaRouter_OnPresentationConnectionStateChanged_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnPresentationConnectionStateChanged_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionStateChanged_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionStateChanged_Params.state err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, MediaRouter.PresentationConnectionState); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnPresentationConnectionStateChanged_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_OnPresentationConnectionStateChanged_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnPresentationConnectionStateChanged_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.state = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouter_OnPresentationConnectionStateChanged_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnPresentationConnectionStateChanged_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.Int32, val.state); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouter_OnPresentationConnectionClosed_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnPresentationConnectionClosed_Params.prototype.initDefaults_ = function() { this.routeId = null; this.reason = 0; this.message = null; }; MediaRouter_OnPresentationConnectionClosed_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnPresentationConnectionClosed_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionClosed_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionClosed_Params.reason err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, MediaRouter.PresentationConnectionCloseReason); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionClosed_Params.message err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnPresentationConnectionClosed_Params.encodedSize = codec.kStructHeaderSize + 24; MediaRouter_OnPresentationConnectionClosed_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnPresentationConnectionClosed_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.reason = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.message = decoder.decodeStruct(codec.String); return val; }; MediaRouter_OnPresentationConnectionClosed_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnPresentationConnectionClosed_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.Int32, val.reason); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.String, val.message); }; function MediaRouter_OnRouteMessagesReceived_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnRouteMessagesReceived_Params.prototype.initDefaults_ = function() { this.routeId = null; this.messages = null; }; MediaRouter_OnRouteMessagesReceived_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnRouteMessagesReceived_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRouteMessagesReceived_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRouteMessagesReceived_Params.messages err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(RouteMessage), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnRouteMessagesReceived_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_OnRouteMessagesReceived_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnRouteMessagesReceived_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.messages = decoder.decodeArrayPointer(new codec.PointerTo(RouteMessage)); return val; }; MediaRouter_OnRouteMessagesReceived_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnRouteMessagesReceived_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeArrayPointer(new codec.PointerTo(RouteMessage), val.messages); }; function MediaRouter_OnMediaRemoterCreated_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnMediaRemoterCreated_Params.prototype.initDefaults_ = function() { this.tabId = 0; this.remoter = new mirror_service_remoting$.MirrorServiceRemoterPtr(); this.remotingSource = new bindings.InterfaceRequest(); }; MediaRouter_OnMediaRemoterCreated_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnMediaRemoterCreated_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnMediaRemoterCreated_Params.remoter err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 4, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnMediaRemoterCreated_Params.remotingSource err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 12, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnMediaRemoterCreated_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_OnMediaRemoterCreated_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnMediaRemoterCreated_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.tabId = decoder.decodeStruct(codec.Int32); val.remoter = decoder.decodeStruct(new codec.Interface(mirror_service_remoting$.MirrorServiceRemoterPtr)); val.remotingSource = decoder.decodeStruct(codec.InterfaceRequest); return val; }; MediaRouter_OnMediaRemoterCreated_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnMediaRemoterCreated_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.tabId); encoder.encodeStruct(new codec.Interface(mirror_service_remoting$.MirrorServiceRemoterPtr), val.remoter); encoder.encodeStruct(codec.InterfaceRequest, val.remotingSource); }; function MediaRouter_GetMediaSinkServiceStatus_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_GetMediaSinkServiceStatus_Params.prototype.initDefaults_ = function() { }; MediaRouter_GetMediaSinkServiceStatus_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_GetMediaSinkServiceStatus_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_GetMediaSinkServiceStatus_Params.encodedSize = codec.kStructHeaderSize + 0; MediaRouter_GetMediaSinkServiceStatus_Params.decode = function(decoder) { var packed; var val = new MediaRouter_GetMediaSinkServiceStatus_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaRouter_GetMediaSinkServiceStatus_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_GetMediaSinkServiceStatus_Params.encodedSize); encoder.writeUint32(0); }; function MediaRouter_GetMediaSinkServiceStatus_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_GetMediaSinkServiceStatus_ResponseParams.prototype.initDefaults_ = function() { this.status = null; }; MediaRouter_GetMediaSinkServiceStatus_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_GetMediaSinkServiceStatus_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMediaSinkServiceStatus_ResponseParams.status err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_GetMediaSinkServiceStatus_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MediaRouter_GetMediaSinkServiceStatus_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouter_GetMediaSinkServiceStatus_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.status = decoder.decodeStruct(codec.String); return val; }; MediaRouter_GetMediaSinkServiceStatus_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_GetMediaSinkServiceStatus_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.status); }; function MediaRouter_GetMirroringServiceHostForTab_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_GetMirroringServiceHostForTab_Params.prototype.initDefaults_ = function() { this.targetTabId = 0; this.receiver = new bindings.InterfaceRequest(); }; MediaRouter_GetMirroringServiceHostForTab_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_GetMirroringServiceHostForTab_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMirroringServiceHostForTab_Params.receiver err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 4, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_GetMirroringServiceHostForTab_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouter_GetMirroringServiceHostForTab_Params.decode = function(decoder) { var packed; var val = new MediaRouter_GetMirroringServiceHostForTab_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.targetTabId = decoder.decodeStruct(codec.Int32); val.receiver = decoder.decodeStruct(codec.InterfaceRequest); return val; }; MediaRouter_GetMirroringServiceHostForTab_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_GetMirroringServiceHostForTab_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.targetTabId); encoder.encodeStruct(codec.InterfaceRequest, val.receiver); }; function MediaRouter_GetMirroringServiceHostForDesktop_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_GetMirroringServiceHostForDesktop_Params.prototype.initDefaults_ = function() { this.initiatorTabId = 0; this.receiver = new bindings.InterfaceRequest(); this.desktopStreamId = null; }; MediaRouter_GetMirroringServiceHostForDesktop_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_GetMirroringServiceHostForDesktop_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMirroringServiceHostForDesktop_Params.desktopStreamId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMirroringServiceHostForDesktop_Params.receiver err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 4, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_GetMirroringServiceHostForDesktop_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_GetMirroringServiceHostForDesktop_Params.decode = function(decoder) { var packed; var val = new MediaRouter_GetMirroringServiceHostForDesktop_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.initiatorTabId = decoder.decodeStruct(codec.Int32); val.receiver = decoder.decodeStruct(codec.InterfaceRequest); val.desktopStreamId = decoder.decodeStruct(codec.String); return val; }; MediaRouter_GetMirroringServiceHostForDesktop_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_GetMirroringServiceHostForDesktop_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.initiatorTabId); encoder.encodeStruct(codec.InterfaceRequest, val.receiver); encoder.encodeStruct(codec.String, val.desktopStreamId); }; function MediaRouter_GetMirroringServiceHostForOffscreenTab_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.prototype.initDefaults_ = function() { this.presentationUrl = null; this.presentationId = null; this.receiver = new bindings.InterfaceRequest(); }; MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.presentationUrl err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, url$.Url, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.presentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.receiver err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.encodedSize = codec.kStructHeaderSize + 24; MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.decode = function(decoder) { var packed; var val = new MediaRouter_GetMirroringServiceHostForOffscreenTab_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.presentationUrl = decoder.decodeStructPointer(url$.Url); val.presentationId = decoder.decodeStruct(codec.String); val.receiver = decoder.decodeStruct(codec.InterfaceRequest); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(url$.Url, val.presentationUrl); encoder.encodeStruct(codec.String, val.presentationId); encoder.encodeStruct(codec.InterfaceRequest, val.receiver); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaSinkExtraData(value) { this.initDefault_(); this.initValue_(value); } MediaSinkExtraData.Tags = { dialMediaSink: 0, castMediaSink: 1, }; MediaSinkExtraData.prototype.initDefault_ = function() { this.$data = null; this.$tag = undefined; } MediaSinkExtraData.prototype.initValue_ = function(value) { if (value == undefined) { return; } var keys = Object.keys(value); if (keys.length == 0) { return; } if (keys.length > 1) { throw new TypeError("You may set only one member on a union."); } var fields = [ "dialMediaSink", "castMediaSink", ]; if (fields.indexOf(keys[0]) < 0) { throw new ReferenceError(keys[0] + " is not a MediaSinkExtraData member."); } this[keys[0]] = value[keys[0]]; } Object.defineProperty(MediaSinkExtraData.prototype, "dialMediaSink", { get: function() { if (this.$tag != MediaSinkExtraData.Tags.dialMediaSink) { throw new ReferenceError( "MediaSinkExtraData.dialMediaSink is not currently set."); } return this.$data; }, set: function(value) { this.$tag = MediaSinkExtraData.Tags.dialMediaSink; this.$data = value; } }); Object.defineProperty(MediaSinkExtraData.prototype, "castMediaSink", { get: function() { if (this.$tag != MediaSinkExtraData.Tags.castMediaSink) { throw new ReferenceError( "MediaSinkExtraData.castMediaSink is not currently set."); } return this.$data; }, set: function(value) { this.$tag = MediaSinkExtraData.Tags.castMediaSink; this.$data = value; } }); MediaSinkExtraData.encode = function(encoder, val) { if (val == null) { encoder.writeUint64(0); encoder.writeUint64(0); return; } if (val.$tag == undefined) { throw new TypeError("Cannot encode unions with an unknown member set."); } encoder.writeUint32(16); encoder.writeUint32(val.$tag); switch (val.$tag) { case MediaSinkExtraData.Tags.dialMediaSink: encoder.encodeStructPointer(DialMediaSink, val.dialMediaSink); break; case MediaSinkExtraData.Tags.castMediaSink: encoder.encodeStructPointer(CastMediaSink, val.castMediaSink); break; } encoder.align(); }; MediaSinkExtraData.decode = function(decoder) { var size = decoder.readUint32(); if (size == 0) { decoder.readUint32(); decoder.readUint64(); return null; } var result = new MediaSinkExtraData(); var tag = decoder.readUint32(); switch (tag) { case MediaSinkExtraData.Tags.dialMediaSink: result.dialMediaSink = decoder.decodeStructPointer(DialMediaSink); break; case MediaSinkExtraData.Tags.castMediaSink: result.castMediaSink = decoder.decodeStructPointer(CastMediaSink); break; } decoder.align(); return result; }; MediaSinkExtraData.validate = function(messageValidator, offset) { var size = messageValidator.decodeUnionSize(offset); if (size != 16) { return validator.validationError.INVALID_UNION_SIZE; } var tag = messageValidator.decodeUnionTag(offset); var data_offset = offset + 8; var err; switch (tag) { case MediaSinkExtraData.Tags.dialMediaSink: // validate MediaSinkExtraData.dialMediaSink err = messageValidator.validateStructPointer(data_offset, DialMediaSink, false); if (err !== validator.validationError.NONE) return err; break; case MediaSinkExtraData.Tags.castMediaSink: // validate MediaSinkExtraData.castMediaSink err = messageValidator.validateStructPointer(data_offset, CastMediaSink, false); if (err !== validator.validationError.NONE) return err; break; } return validator.validationError.NONE; }; MediaSinkExtraData.encodedSize = 16; var kMediaRouteProvider_CreateRoute_Name = 1076787515; var kMediaRouteProvider_JoinRoute_Name = 2098056945; var kMediaRouteProvider_ConnectRouteByRouteId_Name = 568394884; var kMediaRouteProvider_TerminateRoute_Name = 1179810998; var kMediaRouteProvider_SendRouteMessage_Name = 1085208061; var kMediaRouteProvider_SendRouteBinaryMessage_Name = 513418127; var kMediaRouteProvider_StartObservingMediaSinks_Name = 1487629603; var kMediaRouteProvider_StopObservingMediaSinks_Name = 1406641220; var kMediaRouteProvider_StartObservingMediaRoutes_Name = 1759385908; var kMediaRouteProvider_StopObservingMediaRoutes_Name = 551403914; var kMediaRouteProvider_StartListeningForRouteMessages_Name = 1389699310; var kMediaRouteProvider_StopListeningForRouteMessages_Name = 721262489; var kMediaRouteProvider_DetachRoute_Name = 692740655; var kMediaRouteProvider_EnableMdnsDiscovery_Name = 1405576643; var kMediaRouteProvider_UpdateMediaSinks_Name = 437955509; var kMediaRouteProvider_SearchSinks_Name = 430886131; var kMediaRouteProvider_ProvideSinks_Name = 1494284795; var kMediaRouteProvider_CreateMediaRouteController_Name = 1790096448; function MediaRouteProviderPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MediaRouteProvider, handleOrPtrInfo); } function MediaRouteProviderAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MediaRouteProvider, associatedInterfacePtrInfo); } MediaRouteProviderAssociatedPtr.prototype = Object.create(MediaRouteProviderPtr.prototype); MediaRouteProviderAssociatedPtr.prototype.constructor = MediaRouteProviderAssociatedPtr; function MediaRouteProviderProxy(receiver) { this.receiver_ = receiver; } MediaRouteProviderPtr.prototype.createRoute = function() { return MediaRouteProviderProxy.prototype.createRoute .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.createRoute = function(mediaSource, sinkId, originalPresentationId, origin, tabId, timeout, incognito) { var params_ = new MediaRouteProvider_CreateRoute_Params(); params_.mediaSource = mediaSource; params_.sinkId = sinkId; params_.originalPresentationId = originalPresentationId; params_.origin = origin; params_.tabId = tabId; params_.timeout = timeout; params_.incognito = incognito; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_CreateRoute_Name, codec.align(MediaRouteProvider_CreateRoute_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_CreateRoute_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_CreateRoute_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.joinRoute = function() { return MediaRouteProviderProxy.prototype.joinRoute .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.joinRoute = function(mediaSource, presentationId, origin, tabId, timeout, incognito) { var params_ = new MediaRouteProvider_JoinRoute_Params(); params_.mediaSource = mediaSource; params_.presentationId = presentationId; params_.origin = origin; params_.tabId = tabId; params_.timeout = timeout; params_.incognito = incognito; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_JoinRoute_Name, codec.align(MediaRouteProvider_JoinRoute_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_JoinRoute_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_JoinRoute_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.connectRouteByRouteId = function() { return MediaRouteProviderProxy.prototype.connectRouteByRouteId .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.connectRouteByRouteId = function(mediaSource, routeId, presentationId, origin, tabId, timeout, incognito) { var params_ = new MediaRouteProvider_ConnectRouteByRouteId_Params(); params_.mediaSource = mediaSource; params_.routeId = routeId; params_.presentationId = presentationId; params_.origin = origin; params_.tabId = tabId; params_.timeout = timeout; params_.incognito = incognito; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_ConnectRouteByRouteId_Name, codec.align(MediaRouteProvider_ConnectRouteByRouteId_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_ConnectRouteByRouteId_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.terminateRoute = function() { return MediaRouteProviderProxy.prototype.terminateRoute .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.terminateRoute = function(routeId) { var params_ = new MediaRouteProvider_TerminateRoute_Params(); params_.routeId = routeId; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_TerminateRoute_Name, codec.align(MediaRouteProvider_TerminateRoute_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_TerminateRoute_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_TerminateRoute_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.sendRouteMessage = function() { return MediaRouteProviderProxy.prototype.sendRouteMessage .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.sendRouteMessage = function(mediaRouteId, message) { var params_ = new MediaRouteProvider_SendRouteMessage_Params(); params_.mediaRouteId = mediaRouteId; params_.message = message; var builder = new codec.MessageV0Builder( kMediaRouteProvider_SendRouteMessage_Name, codec.align(MediaRouteProvider_SendRouteMessage_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_SendRouteMessage_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.sendRouteBinaryMessage = function() { return MediaRouteProviderProxy.prototype.sendRouteBinaryMessage .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.sendRouteBinaryMessage = function(mediaRouteId, data) { var params_ = new MediaRouteProvider_SendRouteBinaryMessage_Params(); params_.mediaRouteId = mediaRouteId; params_.data = data; var builder = new codec.MessageV0Builder( kMediaRouteProvider_SendRouteBinaryMessage_Name, codec.align(MediaRouteProvider_SendRouteBinaryMessage_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_SendRouteBinaryMessage_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.startObservingMediaSinks = function() { return MediaRouteProviderProxy.prototype.startObservingMediaSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.startObservingMediaSinks = function(mediaSource) { var params_ = new MediaRouteProvider_StartObservingMediaSinks_Params(); params_.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StartObservingMediaSinks_Name, codec.align(MediaRouteProvider_StartObservingMediaSinks_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StartObservingMediaSinks_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.stopObservingMediaSinks = function() { return MediaRouteProviderProxy.prototype.stopObservingMediaSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.stopObservingMediaSinks = function(mediaSource) { var params_ = new MediaRouteProvider_StopObservingMediaSinks_Params(); params_.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StopObservingMediaSinks_Name, codec.align(MediaRouteProvider_StopObservingMediaSinks_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StopObservingMediaSinks_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.startObservingMediaRoutes = function() { return MediaRouteProviderProxy.prototype.startObservingMediaRoutes .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.startObservingMediaRoutes = function(mediaSource) { var params_ = new MediaRouteProvider_StartObservingMediaRoutes_Params(); params_.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StartObservingMediaRoutes_Name, codec.align(MediaRouteProvider_StartObservingMediaRoutes_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StartObservingMediaRoutes_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.stopObservingMediaRoutes = function() { return MediaRouteProviderProxy.prototype.stopObservingMediaRoutes .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.stopObservingMediaRoutes = function(mediaSource) { var params_ = new MediaRouteProvider_StopObservingMediaRoutes_Params(); params_.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StopObservingMediaRoutes_Name, codec.align(MediaRouteProvider_StopObservingMediaRoutes_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StopObservingMediaRoutes_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.startListeningForRouteMessages = function() { return MediaRouteProviderProxy.prototype.startListeningForRouteMessages .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.startListeningForRouteMessages = function(routeId) { var params_ = new MediaRouteProvider_StartListeningForRouteMessages_Params(); params_.routeId = routeId; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StartListeningForRouteMessages_Name, codec.align(MediaRouteProvider_StartListeningForRouteMessages_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StartListeningForRouteMessages_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.stopListeningForRouteMessages = function() { return MediaRouteProviderProxy.prototype.stopListeningForRouteMessages .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.stopListeningForRouteMessages = function(routeId) { var params_ = new MediaRouteProvider_StopListeningForRouteMessages_Params(); params_.routeId = routeId; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StopListeningForRouteMessages_Name, codec.align(MediaRouteProvider_StopListeningForRouteMessages_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StopListeningForRouteMessages_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.detachRoute = function() { return MediaRouteProviderProxy.prototype.detachRoute .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.detachRoute = function(routeId) { var params_ = new MediaRouteProvider_DetachRoute_Params(); params_.routeId = routeId; var builder = new codec.MessageV0Builder( kMediaRouteProvider_DetachRoute_Name, codec.align(MediaRouteProvider_DetachRoute_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_DetachRoute_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.enableMdnsDiscovery = function() { return MediaRouteProviderProxy.prototype.enableMdnsDiscovery .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.enableMdnsDiscovery = function() { var params_ = new MediaRouteProvider_EnableMdnsDiscovery_Params(); var builder = new codec.MessageV0Builder( kMediaRouteProvider_EnableMdnsDiscovery_Name, codec.align(MediaRouteProvider_EnableMdnsDiscovery_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_EnableMdnsDiscovery_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.updateMediaSinks = function() { return MediaRouteProviderProxy.prototype.updateMediaSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.updateMediaSinks = function(mediaSource) { var params_ = new MediaRouteProvider_UpdateMediaSinks_Params(); params_.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_UpdateMediaSinks_Name, codec.align(MediaRouteProvider_UpdateMediaSinks_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_UpdateMediaSinks_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.searchSinks = function() { return MediaRouteProviderProxy.prototype.searchSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.searchSinks = function(sinkId, mediaSource, searchCriteria) { var params_ = new MediaRouteProvider_SearchSinks_Params(); params_.sinkId = sinkId; params_.mediaSource = mediaSource; params_.searchCriteria = searchCriteria; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_SearchSinks_Name, codec.align(MediaRouteProvider_SearchSinks_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_SearchSinks_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_SearchSinks_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.provideSinks = function() { return MediaRouteProviderProxy.prototype.provideSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.provideSinks = function(providerName, sinks) { var params_ = new MediaRouteProvider_ProvideSinks_Params(); params_.providerName = providerName; params_.sinks = sinks; var builder = new codec.MessageV0Builder( kMediaRouteProvider_ProvideSinks_Name, codec.align(MediaRouteProvider_ProvideSinks_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_ProvideSinks_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.createMediaRouteController = function() { return MediaRouteProviderProxy.prototype.createMediaRouteController .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.createMediaRouteController = function(routeId, mediaController, observer) { var params_ = new MediaRouteProvider_CreateMediaRouteController_Params(); params_.routeId = routeId; params_.mediaController = mediaController; params_.observer = observer; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_CreateMediaRouteController_Name, codec.align(MediaRouteProvider_CreateMediaRouteController_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_CreateMediaRouteController_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_CreateMediaRouteController_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; function MediaRouteProviderStub(delegate) { this.delegate_ = delegate; } MediaRouteProviderStub.prototype.createRoute = function(mediaSource, sinkId, originalPresentationId, origin, tabId, timeout, incognito) { return this.delegate_ && this.delegate_.createRoute && this.delegate_.createRoute(mediaSource, sinkId, originalPresentationId, origin, tabId, timeout, incognito); } MediaRouteProviderStub.prototype.joinRoute = function(mediaSource, presentationId, origin, tabId, timeout, incognito) { return this.delegate_ && this.delegate_.joinRoute && this.delegate_.joinRoute(mediaSource, presentationId, origin, tabId, timeout, incognito); } MediaRouteProviderStub.prototype.connectRouteByRouteId = function(mediaSource, routeId, presentationId, origin, tabId, timeout, incognito) { return this.delegate_ && this.delegate_.connectRouteByRouteId && this.delegate_.connectRouteByRouteId(mediaSource, routeId, presentationId, origin, tabId, timeout, incognito); } MediaRouteProviderStub.prototype.terminateRoute = function(routeId) { return this.delegate_ && this.delegate_.terminateRoute && this.delegate_.terminateRoute(routeId); } MediaRouteProviderStub.prototype.sendRouteMessage = function(mediaRouteId, message) { return this.delegate_ && this.delegate_.sendRouteMessage && this.delegate_.sendRouteMessage(mediaRouteId, message); } MediaRouteProviderStub.prototype.sendRouteBinaryMessage = function(mediaRouteId, data) { return this.delegate_ && this.delegate_.sendRouteBinaryMessage && this.delegate_.sendRouteBinaryMessage(mediaRouteId, data); } MediaRouteProviderStub.prototype.startObservingMediaSinks = function(mediaSource) { return this.delegate_ && this.delegate_.startObservingMediaSinks && this.delegate_.startObservingMediaSinks(mediaSource); } MediaRouteProviderStub.prototype.stopObservingMediaSinks = function(mediaSource) { return this.delegate_ && this.delegate_.stopObservingMediaSinks && this.delegate_.stopObservingMediaSinks(mediaSource); } MediaRouteProviderStub.prototype.startObservingMediaRoutes = function(mediaSource) { return this.delegate_ && this.delegate_.startObservingMediaRoutes && this.delegate_.startObservingMediaRoutes(mediaSource); } MediaRouteProviderStub.prototype.stopObservingMediaRoutes = function(mediaSource) { return this.delegate_ && this.delegate_.stopObservingMediaRoutes && this.delegate_.stopObservingMediaRoutes(mediaSource); } MediaRouteProviderStub.prototype.startListeningForRouteMessages = function(routeId) { return this.delegate_ && this.delegate_.startListeningForRouteMessages && this.delegate_.startListeningForRouteMessages(routeId); } MediaRouteProviderStub.prototype.stopListeningForRouteMessages = function(routeId) { return this.delegate_ && this.delegate_.stopListeningForRouteMessages && this.delegate_.stopListeningForRouteMessages(routeId); } MediaRouteProviderStub.prototype.detachRoute = function(routeId) { return this.delegate_ && this.delegate_.detachRoute && this.delegate_.detachRoute(routeId); } MediaRouteProviderStub.prototype.enableMdnsDiscovery = function() { return this.delegate_ && this.delegate_.enableMdnsDiscovery && this.delegate_.enableMdnsDiscovery(); } MediaRouteProviderStub.prototype.updateMediaSinks = function(mediaSource) { return this.delegate_ && this.delegate_.updateMediaSinks && this.delegate_.updateMediaSinks(mediaSource); } MediaRouteProviderStub.prototype.searchSinks = function(sinkId, mediaSource, searchCriteria) { return this.delegate_ && this.delegate_.searchSinks && this.delegate_.searchSinks(sinkId, mediaSource, searchCriteria); } MediaRouteProviderStub.prototype.provideSinks = function(providerName, sinks) { return this.delegate_ && this.delegate_.provideSinks && this.delegate_.provideSinks(providerName, sinks); } MediaRouteProviderStub.prototype.createMediaRouteController = function(routeId, mediaController, observer) { return this.delegate_ && this.delegate_.createMediaRouteController && this.delegate_.createMediaRouteController(routeId, mediaController, observer); } MediaRouteProviderStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaRouteProvider_SendRouteMessage_Name: var params = reader.decodeStruct(MediaRouteProvider_SendRouteMessage_Params); this.sendRouteMessage(params.mediaRouteId, params.message); return true; case kMediaRouteProvider_SendRouteBinaryMessage_Name: var params = reader.decodeStruct(MediaRouteProvider_SendRouteBinaryMessage_Params); this.sendRouteBinaryMessage(params.mediaRouteId, params.data); return true; case kMediaRouteProvider_StartObservingMediaSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_StartObservingMediaSinks_Params); this.startObservingMediaSinks(params.mediaSource); return true; case kMediaRouteProvider_StopObservingMediaSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_StopObservingMediaSinks_Params); this.stopObservingMediaSinks(params.mediaSource); return true; case kMediaRouteProvider_StartObservingMediaRoutes_Name: var params = reader.decodeStruct(MediaRouteProvider_StartObservingMediaRoutes_Params); this.startObservingMediaRoutes(params.mediaSource); return true; case kMediaRouteProvider_StopObservingMediaRoutes_Name: var params = reader.decodeStruct(MediaRouteProvider_StopObservingMediaRoutes_Params); this.stopObservingMediaRoutes(params.mediaSource); return true; case kMediaRouteProvider_StartListeningForRouteMessages_Name: var params = reader.decodeStruct(MediaRouteProvider_StartListeningForRouteMessages_Params); this.startListeningForRouteMessages(params.routeId); return true; case kMediaRouteProvider_StopListeningForRouteMessages_Name: var params = reader.decodeStruct(MediaRouteProvider_StopListeningForRouteMessages_Params); this.stopListeningForRouteMessages(params.routeId); return true; case kMediaRouteProvider_DetachRoute_Name: var params = reader.decodeStruct(MediaRouteProvider_DetachRoute_Params); this.detachRoute(params.routeId); return true; case kMediaRouteProvider_EnableMdnsDiscovery_Name: var params = reader.decodeStruct(MediaRouteProvider_EnableMdnsDiscovery_Params); this.enableMdnsDiscovery(); return true; case kMediaRouteProvider_UpdateMediaSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_UpdateMediaSinks_Params); this.updateMediaSinks(params.mediaSource); return true; case kMediaRouteProvider_ProvideSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_ProvideSinks_Params); this.provideSinks(params.providerName, params.sinks); return true; default: return false; } }; MediaRouteProviderStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaRouteProvider_CreateRoute_Name: var params = reader.decodeStruct(MediaRouteProvider_CreateRoute_Params); this.createRoute(params.mediaSource, params.sinkId, params.originalPresentationId, params.origin, params.tabId, params.timeout, params.incognito).then(function(response) { var responseParams = new MediaRouteProvider_CreateRoute_ResponseParams(); responseParams.route = response.route; responseParams.connection = response.connection; responseParams.errorText = response.errorText; responseParams.resultCode = response.resultCode; var builder = new codec.MessageV1Builder( kMediaRouteProvider_CreateRoute_Name, codec.align(MediaRouteProvider_CreateRoute_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_CreateRoute_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_JoinRoute_Name: var params = reader.decodeStruct(MediaRouteProvider_JoinRoute_Params); this.joinRoute(params.mediaSource, params.presentationId, params.origin, params.tabId, params.timeout, params.incognito).then(function(response) { var responseParams = new MediaRouteProvider_JoinRoute_ResponseParams(); responseParams.route = response.route; responseParams.connection = response.connection; responseParams.errorText = response.errorText; responseParams.resultCode = response.resultCode; var builder = new codec.MessageV1Builder( kMediaRouteProvider_JoinRoute_Name, codec.align(MediaRouteProvider_JoinRoute_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_JoinRoute_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_ConnectRouteByRouteId_Name: var params = reader.decodeStruct(MediaRouteProvider_ConnectRouteByRouteId_Params); this.connectRouteByRouteId(params.mediaSource, params.routeId, params.presentationId, params.origin, params.tabId, params.timeout, params.incognito).then(function(response) { var responseParams = new MediaRouteProvider_ConnectRouteByRouteId_ResponseParams(); responseParams.route = response.route; responseParams.connection = response.connection; responseParams.errorText = response.errorText; responseParams.resultCode = response.resultCode; var builder = new codec.MessageV1Builder( kMediaRouteProvider_ConnectRouteByRouteId_Name, codec.align(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_TerminateRoute_Name: var params = reader.decodeStruct(MediaRouteProvider_TerminateRoute_Params); this.terminateRoute(params.routeId).then(function(response) { var responseParams = new MediaRouteProvider_TerminateRoute_ResponseParams(); responseParams.errorText = response.errorText; responseParams.resultCode = response.resultCode; var builder = new codec.MessageV1Builder( kMediaRouteProvider_TerminateRoute_Name, codec.align(MediaRouteProvider_TerminateRoute_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_TerminateRoute_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_SearchSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_SearchSinks_Params); this.searchSinks(params.sinkId, params.mediaSource, params.searchCriteria).then(function(response) { var responseParams = new MediaRouteProvider_SearchSinks_ResponseParams(); responseParams.sinkId = response.sinkId; var builder = new codec.MessageV1Builder( kMediaRouteProvider_SearchSinks_Name, codec.align(MediaRouteProvider_SearchSinks_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_SearchSinks_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_CreateMediaRouteController_Name: var params = reader.decodeStruct(MediaRouteProvider_CreateMediaRouteController_Params); this.createMediaRouteController(params.routeId, params.mediaController, params.observer).then(function(response) { var responseParams = new MediaRouteProvider_CreateMediaRouteController_ResponseParams(); responseParams.success = response.success; var builder = new codec.MessageV1Builder( kMediaRouteProvider_CreateMediaRouteController_Name, codec.align(MediaRouteProvider_CreateMediaRouteController_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_CreateMediaRouteController_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; default: return false; } }; function validateMediaRouteProviderRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaRouteProvider_CreateRoute_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_CreateRoute_Params; break; case kMediaRouteProvider_JoinRoute_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_JoinRoute_Params; break; case kMediaRouteProvider_ConnectRouteByRouteId_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_ConnectRouteByRouteId_Params; break; case kMediaRouteProvider_TerminateRoute_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_TerminateRoute_Params; break; case kMediaRouteProvider_SendRouteMessage_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_SendRouteMessage_Params; break; case kMediaRouteProvider_SendRouteBinaryMessage_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_SendRouteBinaryMessage_Params; break; case kMediaRouteProvider_StartObservingMediaSinks_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StartObservingMediaSinks_Params; break; case kMediaRouteProvider_StopObservingMediaSinks_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StopObservingMediaSinks_Params; break; case kMediaRouteProvider_StartObservingMediaRoutes_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StartObservingMediaRoutes_Params; break; case kMediaRouteProvider_StopObservingMediaRoutes_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StopObservingMediaRoutes_Params; break; case kMediaRouteProvider_StartListeningForRouteMessages_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StartListeningForRouteMessages_Params; break; case kMediaRouteProvider_StopListeningForRouteMessages_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StopListeningForRouteMessages_Params; break; case kMediaRouteProvider_DetachRoute_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_DetachRoute_Params; break; case kMediaRouteProvider_EnableMdnsDiscovery_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_EnableMdnsDiscovery_Params; break; case kMediaRouteProvider_UpdateMediaSinks_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_UpdateMediaSinks_Params; break; case kMediaRouteProvider_SearchSinks_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_SearchSinks_Params; break; case kMediaRouteProvider_ProvideSinks_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_ProvideSinks_Params; break; case kMediaRouteProvider_CreateMediaRouteController_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_CreateMediaRouteController_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMediaRouteProviderResponse(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaRouteProvider_CreateRoute_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_CreateRoute_ResponseParams; break; case kMediaRouteProvider_JoinRoute_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_JoinRoute_ResponseParams; break; case kMediaRouteProvider_ConnectRouteByRouteId_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_ConnectRouteByRouteId_ResponseParams; break; case kMediaRouteProvider_TerminateRoute_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_TerminateRoute_ResponseParams; break; case kMediaRouteProvider_SearchSinks_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_SearchSinks_ResponseParams; break; case kMediaRouteProvider_CreateMediaRouteController_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_CreateMediaRouteController_ResponseParams; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } var MediaRouteProvider = { name: 'media_router.mojom.MediaRouteProvider', kVersion: 0, ptrClass: MediaRouteProviderPtr, proxyClass: MediaRouteProviderProxy, stubClass: MediaRouteProviderStub, validateRequest: validateMediaRouteProviderRequest, validateResponse: validateMediaRouteProviderResponse, }; MediaRouteProvider.Id = {}; MediaRouteProvider.Id.EXTENSION = 0; MediaRouteProvider.Id.WIRED_DISPLAY = MediaRouteProvider.Id.EXTENSION + 1; MediaRouteProvider.Id.CAST = MediaRouteProvider.Id.WIRED_DISPLAY + 1; MediaRouteProvider.Id.DIAL = MediaRouteProvider.Id.CAST + 1; MediaRouteProvider.Id.MIN_VALUE = 0, MediaRouteProvider.Id.MAX_VALUE = 3, MediaRouteProvider.Id.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: return true; } return false; }; MediaRouteProvider.Id.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaRouteProviderStub.prototype.validator = validateMediaRouteProviderRequest; MediaRouteProviderProxy.prototype.validator = validateMediaRouteProviderResponse; var kMediaRouter_RegisterMediaRouteProvider_Name = 1488862852; var kMediaRouter_OnSinksReceived_Name = 1926251281; var kMediaRouter_OnIssue_Name = 1552938974; var kMediaRouter_OnRoutesUpdated_Name = 2131043604; var kMediaRouter_OnSinkAvailabilityUpdated_Name = 1978357086; var kMediaRouter_OnPresentationConnectionStateChanged_Name = 1938877931; var kMediaRouter_OnPresentationConnectionClosed_Name = 1623948733; var kMediaRouter_OnRouteMessagesReceived_Name = 2027964811; var kMediaRouter_OnMediaRemoterCreated_Name = 937188391; var kMediaRouter_GetMediaSinkServiceStatus_Name = 693890836; var kMediaRouter_GetMirroringServiceHostForTab_Name = 675925530; var kMediaRouter_GetMirroringServiceHostForDesktop_Name = 971745838; var kMediaRouter_GetMirroringServiceHostForOffscreenTab_Name = 595791292; function MediaRouterPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MediaRouter, handleOrPtrInfo); } function MediaRouterAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MediaRouter, associatedInterfacePtrInfo); } MediaRouterAssociatedPtr.prototype = Object.create(MediaRouterPtr.prototype); MediaRouterAssociatedPtr.prototype.constructor = MediaRouterAssociatedPtr; function MediaRouterProxy(receiver) { this.receiver_ = receiver; } MediaRouterPtr.prototype.registerMediaRouteProvider = function() { return MediaRouterProxy.prototype.registerMediaRouteProvider .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.registerMediaRouteProvider = function(providerId, mediaRouterProvider) { var params_ = new MediaRouter_RegisterMediaRouteProvider_Params(); params_.providerId = providerId; params_.mediaRouterProvider = mediaRouterProvider; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouter_RegisterMediaRouteProvider_Name, codec.align(MediaRouter_RegisterMediaRouteProvider_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouter_RegisterMediaRouteProvider_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouter_RegisterMediaRouteProvider_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouterPtr.prototype.onSinksReceived = function() { return MediaRouterProxy.prototype.onSinksReceived .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onSinksReceived = function(providerId, mediaSource, sinks, origins) { var params_ = new MediaRouter_OnSinksReceived_Params(); params_.providerId = providerId; params_.mediaSource = mediaSource; params_.sinks = sinks; params_.origins = origins; var builder = new codec.MessageV0Builder( kMediaRouter_OnSinksReceived_Name, codec.align(MediaRouter_OnSinksReceived_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnSinksReceived_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onIssue = function() { return MediaRouterProxy.prototype.onIssue .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onIssue = function(issue) { var params_ = new MediaRouter_OnIssue_Params(); params_.issue = issue; var builder = new codec.MessageV0Builder( kMediaRouter_OnIssue_Name, codec.align(MediaRouter_OnIssue_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnIssue_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onRoutesUpdated = function() { return MediaRouterProxy.prototype.onRoutesUpdated .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onRoutesUpdated = function(providerId, routes, mediaSource, joinableRouteIds) { var params_ = new MediaRouter_OnRoutesUpdated_Params(); params_.providerId = providerId; params_.routes = routes; params_.mediaSource = mediaSource; params_.joinableRouteIds = joinableRouteIds; var builder = new codec.MessageV0Builder( kMediaRouter_OnRoutesUpdated_Name, codec.align(MediaRouter_OnRoutesUpdated_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnRoutesUpdated_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onSinkAvailabilityUpdated = function() { return MediaRouterProxy.prototype.onSinkAvailabilityUpdated .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onSinkAvailabilityUpdated = function(providerId, availability) { var params_ = new MediaRouter_OnSinkAvailabilityUpdated_Params(); params_.providerId = providerId; params_.availability = availability; var builder = new codec.MessageV0Builder( kMediaRouter_OnSinkAvailabilityUpdated_Name, codec.align(MediaRouter_OnSinkAvailabilityUpdated_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnSinkAvailabilityUpdated_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onPresentationConnectionStateChanged = function() { return MediaRouterProxy.prototype.onPresentationConnectionStateChanged .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onPresentationConnectionStateChanged = function(routeId, state) { var params_ = new MediaRouter_OnPresentationConnectionStateChanged_Params(); params_.routeId = routeId; params_.state = state; var builder = new codec.MessageV0Builder( kMediaRouter_OnPresentationConnectionStateChanged_Name, codec.align(MediaRouter_OnPresentationConnectionStateChanged_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnPresentationConnectionStateChanged_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onPresentationConnectionClosed = function() { return MediaRouterProxy.prototype.onPresentationConnectionClosed .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onPresentationConnectionClosed = function(routeId, reason, message) { var params_ = new MediaRouter_OnPresentationConnectionClosed_Params(); params_.routeId = routeId; params_.reason = reason; params_.message = message; var builder = new codec.MessageV0Builder( kMediaRouter_OnPresentationConnectionClosed_Name, codec.align(MediaRouter_OnPresentationConnectionClosed_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnPresentationConnectionClosed_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onRouteMessagesReceived = function() { return MediaRouterProxy.prototype.onRouteMessagesReceived .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onRouteMessagesReceived = function(routeId, messages) { var params_ = new MediaRouter_OnRouteMessagesReceived_Params(); params_.routeId = routeId; params_.messages = messages; var builder = new codec.MessageV0Builder( kMediaRouter_OnRouteMessagesReceived_Name, codec.align(MediaRouter_OnRouteMessagesReceived_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnRouteMessagesReceived_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onMediaRemoterCreated = function() { return MediaRouterProxy.prototype.onMediaRemoterCreated .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onMediaRemoterCreated = function(tabId, remoter, remotingSource) { var params_ = new MediaRouter_OnMediaRemoterCreated_Params(); params_.tabId = tabId; params_.remoter = remoter; params_.remotingSource = remotingSource; var builder = new codec.MessageV0Builder( kMediaRouter_OnMediaRemoterCreated_Name, codec.align(MediaRouter_OnMediaRemoterCreated_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnMediaRemoterCreated_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.getMediaSinkServiceStatus = function() { return MediaRouterProxy.prototype.getMediaSinkServiceStatus .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.getMediaSinkServiceStatus = function() { var params_ = new MediaRouter_GetMediaSinkServiceStatus_Params(); return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouter_GetMediaSinkServiceStatus_Name, codec.align(MediaRouter_GetMediaSinkServiceStatus_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouter_GetMediaSinkServiceStatus_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouter_GetMediaSinkServiceStatus_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouterPtr.prototype.getMirroringServiceHostForTab = function() { return MediaRouterProxy.prototype.getMirroringServiceHostForTab .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.getMirroringServiceHostForTab = function(targetTabId, receiver) { var params_ = new MediaRouter_GetMirroringServiceHostForTab_Params(); params_.targetTabId = targetTabId; params_.receiver = receiver; var builder = new codec.MessageV0Builder( kMediaRouter_GetMirroringServiceHostForTab_Name, codec.align(MediaRouter_GetMirroringServiceHostForTab_Params.encodedSize)); builder.encodeStruct(MediaRouter_GetMirroringServiceHostForTab_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.getMirroringServiceHostForDesktop = function() { return MediaRouterProxy.prototype.getMirroringServiceHostForDesktop .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.getMirroringServiceHostForDesktop = function(initiatorTabId, desktopStreamId, receiver) { var params_ = new MediaRouter_GetMirroringServiceHostForDesktop_Params(); params_.initiatorTabId = initiatorTabId; params_.desktopStreamId = desktopStreamId; params_.receiver = receiver; var builder = new codec.MessageV0Builder( kMediaRouter_GetMirroringServiceHostForDesktop_Name, codec.align(MediaRouter_GetMirroringServiceHostForDesktop_Params.encodedSize)); builder.encodeStruct(MediaRouter_GetMirroringServiceHostForDesktop_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.getMirroringServiceHostForOffscreenTab = function() { return MediaRouterProxy.prototype.getMirroringServiceHostForOffscreenTab .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.getMirroringServiceHostForOffscreenTab = function(presentationUrl, presentationId, receiver) { var params_ = new MediaRouter_GetMirroringServiceHostForOffscreenTab_Params(); params_.presentationUrl = presentationUrl; params_.presentationId = presentationId; params_.receiver = receiver; var builder = new codec.MessageV0Builder( kMediaRouter_GetMirroringServiceHostForOffscreenTab_Name, codec.align(MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.encodedSize)); builder.encodeStruct(MediaRouter_GetMirroringServiceHostForOffscreenTab_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function MediaRouterStub(delegate) { this.delegate_ = delegate; } MediaRouterStub.prototype.registerMediaRouteProvider = function(providerId, mediaRouterProvider) { return this.delegate_ && this.delegate_.registerMediaRouteProvider && this.delegate_.registerMediaRouteProvider(providerId, mediaRouterProvider); } MediaRouterStub.prototype.onSinksReceived = function(providerId, mediaSource, sinks, origins) { return this.delegate_ && this.delegate_.onSinksReceived && this.delegate_.onSinksReceived(providerId, mediaSource, sinks, origins); } MediaRouterStub.prototype.onIssue = function(issue) { return this.delegate_ && this.delegate_.onIssue && this.delegate_.onIssue(issue); } MediaRouterStub.prototype.onRoutesUpdated = function(providerId, routes, mediaSource, joinableRouteIds) { return this.delegate_ && this.delegate_.onRoutesUpdated && this.delegate_.onRoutesUpdated(providerId, routes, mediaSource, joinableRouteIds); } MediaRouterStub.prototype.onSinkAvailabilityUpdated = function(providerId, availability) { return this.delegate_ && this.delegate_.onSinkAvailabilityUpdated && this.delegate_.onSinkAvailabilityUpdated(providerId, availability); } MediaRouterStub.prototype.onPresentationConnectionStateChanged = function(routeId, state) { return this.delegate_ && this.delegate_.onPresentationConnectionStateChanged && this.delegate_.onPresentationConnectionStateChanged(routeId, state); } MediaRouterStub.prototype.onPresentationConnectionClosed = function(routeId, reason, message) { return this.delegate_ && this.delegate_.onPresentationConnectionClosed && this.delegate_.onPresentationConnectionClosed(routeId, reason, message); } MediaRouterStub.prototype.onRouteMessagesReceived = function(routeId, messages) { return this.delegate_ && this.delegate_.onRouteMessagesReceived && this.delegate_.onRouteMessagesReceived(routeId, messages); } MediaRouterStub.prototype.onMediaRemoterCreated = function(tabId, remoter, remotingSource) { return this.delegate_ && this.delegate_.onMediaRemoterCreated && this.delegate_.onMediaRemoterCreated(tabId, remoter, remotingSource); } MediaRouterStub.prototype.getMediaSinkServiceStatus = function() { return this.delegate_ && this.delegate_.getMediaSinkServiceStatus && this.delegate_.getMediaSinkServiceStatus(); } MediaRouterStub.prototype.getMirroringServiceHostForTab = function(targetTabId, receiver) { return this.delegate_ && this.delegate_.getMirroringServiceHostForTab && this.delegate_.getMirroringServiceHostForTab(targetTabId, receiver); } MediaRouterStub.prototype.getMirroringServiceHostForDesktop = function(initiatorTabId, desktopStreamId, receiver) { return this.delegate_ && this.delegate_.getMirroringServiceHostForDesktop && this.delegate_.getMirroringServiceHostForDesktop(initiatorTabId, desktopStreamId, receiver); } MediaRouterStub.prototype.getMirroringServiceHostForOffscreenTab = function(presentationUrl, presentationId, receiver) { return this.delegate_ && this.delegate_.getMirroringServiceHostForOffscreenTab && this.delegate_.getMirroringServiceHostForOffscreenTab(presentationUrl, presentationId, receiver); } MediaRouterStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaRouter_OnSinksReceived_Name: var params = reader.decodeStruct(MediaRouter_OnSinksReceived_Params); this.onSinksReceived(params.providerId, params.mediaSource, params.sinks, params.origins); return true; case kMediaRouter_OnIssue_Name: var params = reader.decodeStruct(MediaRouter_OnIssue_Params); this.onIssue(params.issue); return true; case kMediaRouter_OnRoutesUpdated_Name: var params = reader.decodeStruct(MediaRouter_OnRoutesUpdated_Params); this.onRoutesUpdated(params.providerId, params.routes, params.mediaSource, params.joinableRouteIds); return true; case kMediaRouter_OnSinkAvailabilityUpdated_Name: var params = reader.decodeStruct(MediaRouter_OnSinkAvailabilityUpdated_Params); this.onSinkAvailabilityUpdated(params.providerId, params.availability); return true; case kMediaRouter_OnPresentationConnectionStateChanged_Name: var params = reader.decodeStruct(MediaRouter_OnPresentationConnectionStateChanged_Params); this.onPresentationConnectionStateChanged(params.routeId, params.state); return true; case kMediaRouter_OnPresentationConnectionClosed_Name: var params = reader.decodeStruct(MediaRouter_OnPresentationConnectionClosed_Params); this.onPresentationConnectionClosed(params.routeId, params.reason, params.message); return true; case kMediaRouter_OnRouteMessagesReceived_Name: var params = reader.decodeStruct(MediaRouter_OnRouteMessagesReceived_Params); this.onRouteMessagesReceived(params.routeId, params.messages); return true; case kMediaRouter_OnMediaRemoterCreated_Name: var params = reader.decodeStruct(MediaRouter_OnMediaRemoterCreated_Params); this.onMediaRemoterCreated(params.tabId, params.remoter, params.remotingSource); return true; case kMediaRouter_GetMirroringServiceHostForTab_Name: var params = reader.decodeStruct(MediaRouter_GetMirroringServiceHostForTab_Params); this.getMirroringServiceHostForTab(params.targetTabId, params.receiver); return true; case kMediaRouter_GetMirroringServiceHostForDesktop_Name: var params = reader.decodeStruct(MediaRouter_GetMirroringServiceHostForDesktop_Params); this.getMirroringServiceHostForDesktop(params.initiatorTabId, params.desktopStreamId, params.receiver); return true; case kMediaRouter_GetMirroringServiceHostForOffscreenTab_Name: var params = reader.decodeStruct(MediaRouter_GetMirroringServiceHostForOffscreenTab_Params); this.getMirroringServiceHostForOffscreenTab(params.presentationUrl, params.presentationId, params.receiver); return true; default: return false; } }; MediaRouterStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaRouter_RegisterMediaRouteProvider_Name: var params = reader.decodeStruct(MediaRouter_RegisterMediaRouteProvider_Params); this.registerMediaRouteProvider(params.providerId, params.mediaRouterProvider).then(function(response) { var responseParams = new MediaRouter_RegisterMediaRouteProvider_ResponseParams(); responseParams.instanceId = response.instanceId; responseParams.config = response.config; var builder = new codec.MessageV1Builder( kMediaRouter_RegisterMediaRouteProvider_Name, codec.align(MediaRouter_RegisterMediaRouteProvider_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouter_RegisterMediaRouteProvider_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouter_GetMediaSinkServiceStatus_Name: var params = reader.decodeStruct(MediaRouter_GetMediaSinkServiceStatus_Params); this.getMediaSinkServiceStatus().then(function(response) { var responseParams = new MediaRouter_GetMediaSinkServiceStatus_ResponseParams(); responseParams.status = response.status; var builder = new codec.MessageV1Builder( kMediaRouter_GetMediaSinkServiceStatus_Name, codec.align(MediaRouter_GetMediaSinkServiceStatus_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouter_GetMediaSinkServiceStatus_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; default: return false; } }; function validateMediaRouterRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaRouter_RegisterMediaRouteProvider_Name: if (message.expectsResponse()) paramsClass = MediaRouter_RegisterMediaRouteProvider_Params; break; case kMediaRouter_OnSinksReceived_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnSinksReceived_Params; break; case kMediaRouter_OnIssue_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnIssue_Params; break; case kMediaRouter_OnRoutesUpdated_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnRoutesUpdated_Params; break; case kMediaRouter_OnSinkAvailabilityUpdated_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnSinkAvailabilityUpdated_Params; break; case kMediaRouter_OnPresentationConnectionStateChanged_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnPresentationConnectionStateChanged_Params; break; case kMediaRouter_OnPresentationConnectionClosed_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnPresentationConnectionClosed_Params; break; case kMediaRouter_OnRouteMessagesReceived_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnRouteMessagesReceived_Params; break; case kMediaRouter_OnMediaRemoterCreated_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnMediaRemoterCreated_Params; break; case kMediaRouter_GetMediaSinkServiceStatus_Name: if (message.expectsResponse()) paramsClass = MediaRouter_GetMediaSinkServiceStatus_Params; break; case kMediaRouter_GetMirroringServiceHostForTab_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_GetMirroringServiceHostForTab_Params; break; case kMediaRouter_GetMirroringServiceHostForDesktop_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_GetMirroringServiceHostForDesktop_Params; break; case kMediaRouter_GetMirroringServiceHostForOffscreenTab_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_GetMirroringServiceHostForOffscreenTab_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMediaRouterResponse(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaRouter_RegisterMediaRouteProvider_Name: if (message.isResponse()) paramsClass = MediaRouter_RegisterMediaRouteProvider_ResponseParams; break; case kMediaRouter_GetMediaSinkServiceStatus_Name: if (message.isResponse()) paramsClass = MediaRouter_GetMediaSinkServiceStatus_ResponseParams; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } var MediaRouter = { name: 'media_router.mojom.MediaRouter', kVersion: 0, ptrClass: MediaRouterPtr, proxyClass: MediaRouterProxy, stubClass: MediaRouterStub, validateRequest: validateMediaRouterRequest, validateResponse: validateMediaRouterResponse, }; MediaRouter.SinkAvailability = {}; MediaRouter.SinkAvailability.UNAVAILABLE = 0; MediaRouter.SinkAvailability.PER_SOURCE = MediaRouter.SinkAvailability.UNAVAILABLE + 1; MediaRouter.SinkAvailability.AVAILABLE = MediaRouter.SinkAvailability.PER_SOURCE + 1; MediaRouter.SinkAvailability.MIN_VALUE = 0, MediaRouter.SinkAvailability.MAX_VALUE = 2, MediaRouter.SinkAvailability.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; MediaRouter.SinkAvailability.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaRouter.PresentationConnectionState = {}; MediaRouter.PresentationConnectionState.CONNECTING = 0; MediaRouter.PresentationConnectionState.CONNECTED = MediaRouter.PresentationConnectionState.CONNECTING + 1; MediaRouter.PresentationConnectionState.CLOSED = MediaRouter.PresentationConnectionState.CONNECTED + 1; MediaRouter.PresentationConnectionState.TERMINATED = MediaRouter.PresentationConnectionState.CLOSED + 1; MediaRouter.PresentationConnectionState.MIN_VALUE = 0, MediaRouter.PresentationConnectionState.MAX_VALUE = 3, MediaRouter.PresentationConnectionState.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: return true; } return false; }; MediaRouter.PresentationConnectionState.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaRouter.PresentationConnectionCloseReason = {}; MediaRouter.PresentationConnectionCloseReason.CONNECTION_ERROR = 0; MediaRouter.PresentationConnectionCloseReason.CLOSED = MediaRouter.PresentationConnectionCloseReason.CONNECTION_ERROR + 1; MediaRouter.PresentationConnectionCloseReason.WENT_AWAY = MediaRouter.PresentationConnectionCloseReason.CLOSED + 1; MediaRouter.PresentationConnectionCloseReason.MIN_VALUE = 0, MediaRouter.PresentationConnectionCloseReason.MAX_VALUE = 2, MediaRouter.PresentationConnectionCloseReason.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; MediaRouter.PresentationConnectionCloseReason.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaRouterStub.prototype.validator = validateMediaRouterRequest; MediaRouterProxy.prototype.validator = validateMediaRouterResponse; exports.SinkIconType = SinkIconType; exports.RouteControllerType = RouteControllerType; exports.RouteRequestResultCode = RouteRequestResultCode; exports.MediaSink = MediaSink; exports.DialMediaSink = DialMediaSink; exports.CastMediaSink = CastMediaSink; exports.MediaRoute = MediaRoute; exports.Issue = Issue; exports.RouteMessage = RouteMessage; exports.SinkSearchCriteria = SinkSearchCriteria; exports.MediaRouteProviderConfig = MediaRouteProviderConfig; exports.RoutePresentationConnection = RoutePresentationConnection; exports.MediaSinkExtraData = MediaSinkExtraData; exports.MediaRouteProvider = MediaRouteProvider; exports.MediaRouteProviderPtr = MediaRouteProviderPtr; exports.MediaRouteProviderAssociatedPtr = MediaRouteProviderAssociatedPtr; exports.MediaRouter = MediaRouter; exports.MediaRouterPtr = MediaRouterPtr; exports.MediaRouterAssociatedPtr = MediaRouterAssociatedPtr; })();// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; if ((typeof mojo === 'undefined') || !mojo.bindingsLibraryInitialized) { loadScript('mojo_bindings'); } mojo.config.autoLoadMojomDeps = false; loadScript('chrome/common/media_router/mojom/media_controller.mojom'); loadScript('chrome/common/media_router/mojom/media_router.mojom'); loadScript('chrome/common/media_router/mojom/media_status.mojom'); loadScript('components/mirroring/mojom/cast_message_channel.mojom'); loadScript('components/mirroring/mojom/mirroring_service_host.mojom'); loadScript('components/mirroring/mojom/session_observer.mojom'); loadScript('components/mirroring/mojom/session_parameters.mojom'); loadScript('extensions/common/mojom/keep_alive.mojom'); loadScript('media/mojo/mojom/mirror_service_remoting.mojom'); loadScript('media/mojo/mojom/remoting_common.mojom'); loadScript('mojo/public/mojom/base/time.mojom'); loadScript('mojo/public/mojom/base/unguessable_token.mojom'); loadScript('net/interfaces/ip_address.mojom'); loadScript('net/interfaces/ip_endpoint.mojom'); loadScript('url/mojom/origin.mojom'); loadScript('url/mojom/url.mojom'); // The following adapter classes preserve backward compatibility for the media // router component extension. // TODO(crbug.com/787128): Remove these adapters. function assignFields(object, fields) { for(var field in fields) { if (object.hasOwnProperty(field)) object[field] = fields[field]; } } /** * Adapter for mediaRouter.mojom.DialMediaSink. * @constructor */ function DialMediaSinkAdapter(fields) { this.ip_address = null; this.model_name = null; this.app_url = null; assignFields(this, fields); } DialMediaSinkAdapter.fromNewVersion = function(other) { return new DialMediaSinkAdapter({ 'ip_address': IPAddressAdapter.fromNewVersion(other.ipAddress), 'model_name': other.modelName, 'app_url': other.appUrl, }); }; DialMediaSinkAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.DialMediaSink({ 'ipAddress' : this.ip_address.toNewVersion(), 'modelName' : this.model_name, 'appUrl' : this.app_url, }); }; /** * Adapter for mediaRouter.mojom.CastMediaSink. * @constructor */ function CastMediaSinkAdapter(fields) { this.ip_endpoint = null; this.model_name = null; this.capabilities = 0; this.cast_channel_id = 0; assignFields(this, fields); } CastMediaSinkAdapter.fromNewVersion = function(other) { return new CastMediaSinkAdapter({ 'ip_endpoint': IPEndpointAdapter.fromNewVersion(other.ipEndpoint), 'model_name': other.modelName, 'capabilities': other.capabilities, 'cast_channel_id': other.castChannelId, }); }; CastMediaSinkAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.CastMediaSink({ 'ipEndpoint': this.ip_endpoint.toNewVersion(), 'modelName': this.model_name, 'capabilities': this.capabilities, 'castChannelId': this.cast_channel_id, }); }; /** * Adapter for net.interfaces.IPAddress. * @constructor */ function IPAddressAdapter(fields) { this.address_bytes = null; assignFields(this, fields); } IPAddressAdapter.fromNewVersion = function(other) { return new IPAddressAdapter({ 'address_bytes': other.addressBytes, }); }; IPAddressAdapter.prototype.toNewVersion = function() { return new net.interfaces.IPAddress({ 'addressBytes': this.address_bytes, }); }; /** * Adapter for net.interfaces.IPEndpoint. * @constructor */ function IPEndpointAdapter(fields) { this.address = null; this.port = 0; assignFields(this, fields); } IPEndpointAdapter.fromNewVersion = function(other) { return new IPEndpointAdapter({ 'address': IPAddressAdapter.fromNewVersion(other.address), 'port': other.port, }); }; IPEndpointAdapter.prototype.toNewVersion = function() { return new net.interfaces.IPEndpoint({ 'address': this.address.toNewVersion(), 'port': this.port, }); }; /** * Adapter for mediaRouter.mojom.MediaStatus. * @constructor */ function MediaStatusAdapter(fields) { this.title = null; this.can_play_pause = false; this.can_mute = false; this.can_set_volume = false; this.can_seek = false; this.can_skip_to_next_track = false; this.can_skip_to_previous_track = false; this.is_muted = false; this.play_state = 0; this.volume = 0; this.duration = null; this.current_time = null; this.images = null; assignFields(this, fields); } MediaStatusAdapter.PlayState = mediaRouter.mojom.MediaStatus.PlayState; MediaStatusAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.MediaStatus({ 'title': this.title, 'canPlayPause': this.can_play_pause, 'canMute': this.can_mute, 'canSetVolume': this.can_set_volume, 'canSeek': this.can_seek, 'canSkipToNextTrack': this.can_skip_to_next_track, 'canSkipToPreviousTrack': this.can_skip_to_previous_track, 'isMuted': this.is_muted, 'playState': this.play_state, 'volume': this.volume, 'duration': this.duration, 'currentTime': this.current_time, 'images': this.images || [], }); }; /** * Adapter for media.mojom.RemotingSinkMetadata. * @constructor */ function RemotingSinkMetadataAdapter(fields) { this.features = null; this.audio_capabilities = null; this.video_capabilities = null; this.friendly_name = null; assignFields(this, fields); } RemotingSinkMetadataAdapter.fromNewVersion = function(other) { return new RemotingSinkMetadataAdapter({ 'features': other.features, 'audio_capabilities': other.audioCapabilities, 'video_capabilities': other.videoCapabilities, 'friendly_name': other.friendlyName, }); }; RemotingSinkMetadataAdapter.prototype.toNewVersion = function() { return new media.mojom.RemotingSinkMetadata({ 'features': this.features, 'audioCapabilities': this.audio_capabilities, 'videoCapabilities': this.video_capabilities, 'friendlyName': this.friendly_name, }); }; /** * Adapter for mediaRouter.mojom.MediaSink. * @constructor */ function MediaSinkAdapter(fields) { this.sink_id = null; this.name = null; this.description = null; this.domain = null; this.icon_type = 0; this.extra_data = null; assignFields(this, fields); } MediaSinkAdapter.fromNewVersion = function(other) { return new MediaSinkAdapter({ 'sink_id': other.sinkId, 'name': other.name, 'description': other.description, 'domain': other.domain, 'icon_type': other.iconType, 'extra_data': other.extraData && MediaSinkExtraDataAdapter.fromNewVersion(other.extraData), }); }; MediaSinkAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.MediaSink({ 'sinkId': this.sink_id, 'name': this.name, 'description': this.description, 'domain': this.domain, 'iconType': this.icon_type, 'extraData': this.extra_data && this.extra_data.toNewVersion(), }); }; /** * Adapter for mediaRouter.mojom.MediaSinkExtraData. * @constructor */ function MediaSinkExtraDataAdapter(value) { this.$data = null; this.$tag = undefined; if (value == undefined) { return; } var keys = Object.keys(value); if (keys.length == 0) { return; } if (keys.length > 1) { throw new TypeError('You may set only one member on a union.'); } var fields = [ 'dial_media_sink', 'cast_media_sink', ]; if (fields.indexOf(keys[0]) < 0) { throw new ReferenceError(keys[0] + ' is not a MediaSinkExtraDataAdapter member.'); } this[keys[0]] = value[keys[0]]; } MediaSinkExtraDataAdapter.Tags = { dial_media_sink: 0, cast_media_sink: 1, }; Object.defineProperty(MediaSinkExtraDataAdapter.prototype, 'dial_media_sink', { get: function() { if (this.$tag != MediaSinkExtraDataAdapter.Tags.dial_media_sink) { throw new ReferenceError( 'MediaSinkExtraDataAdapter.dial_media_sink is not currently set.'); } return this.$data; }, set: function(value) { this.$tag = MediaSinkExtraDataAdapter.Tags.dial_media_sink; this.$data = value; } }); Object.defineProperty(MediaSinkExtraDataAdapter.prototype, 'cast_media_sink', { get: function() { if (this.$tag != MediaSinkExtraDataAdapter.Tags.cast_media_sink) { throw new ReferenceError( 'MediaSinkExtraDataAdapter.cast_media_sink is not currently set.'); } return this.$data; }, set: function(value) { this.$tag = MediaSinkExtraDataAdapter.Tags.cast_media_sink; this.$data = value; } }); MediaSinkExtraDataAdapter.fromNewVersion = function(other) { if (other.$tag == mediaRouter.mojom.MediaSinkExtraData.Tags.dialMediaSink) { return new MediaSinkExtraDataAdapter({ 'dial_media_sink': DialMediaSinkAdapter.fromNewVersion(other.dialMediaSink), }); } else { return new MediaSinkExtraDataAdapter({ 'cast_media_sink': CastMediaSinkAdapter.fromNewVersion(other.castMediaSink), }); } }; MediaSinkExtraDataAdapter.prototype.toNewVersion = function() { if (this.$tag == MediaSinkExtraDataAdapter.Tags.dial_media_sink) { return new mediaRouter.mojom.MediaSinkExtraData({ 'dialMediaSink': this.dial_media_sink.toNewVersion(), }); } else { return new mediaRouter.mojom.MediaSinkExtraData({ 'castMediaSink': this.cast_media_sink.toNewVersion(), }); } }; /** * Adapter for media.mojom.MirrorServiceRemoterPtr. * @constructor */ function MirrorServiceRemoterPtrAdapter(handleOrPtrInfo) { this.ptr = new mojo.InterfacePtrController(MirrorServiceRemoterAdapter, handleOrPtrInfo); } MirrorServiceRemoterPtrAdapter.prototype = Object.create(media.mojom.MirrorServiceRemoterPtr.prototype); MirrorServiceRemoterPtrAdapter.prototype.constructor = MirrorServiceRemoterPtrAdapter; MirrorServiceRemoterPtrAdapter.prototype.startDataStreams = function() { return MirrorServiceRemoterProxy.prototype.startDataStreams .apply(this.ptr.getProxy(), arguments).then(function(response) { return Promise.resolve({ 'audio_stream_id': response.audioStreamId, 'video_stream_id': response.videoStreamId, }); }); }; /** * Adapter for media.mojom.MirrorServiceRemoter.stubclass. * @constructor */ function MirrorServiceRemoterStubAdapter(delegate) { this.delegate_ = delegate; } MirrorServiceRemoterStubAdapter.prototype = Object.create( media.mojom.MirrorServiceRemoter.stubClass.prototype); MirrorServiceRemoterStubAdapter.prototype.constructor = MirrorServiceRemoterStubAdapter; MirrorServiceRemoterStubAdapter.prototype.startDataStreams = function(hasAudio, hasVideo) { return this.delegate_ && this.delegate_.startDataStreams && this.delegate_.startDataStreams(hasAudio, hasVideo).then( function(response) { return { 'audioStreamId': response.audio_stream_id, 'videoStreamId': response.video_stream_id, }; }); }; /** * Adapter for media.mojom.MirrorServiceRemoter. */ var MirrorServiceRemoterAdapter = { name: 'media.mojom.MirrorServiceRemoter', kVersion: 0, ptrClass: MirrorServiceRemoterPtrAdapter, proxyClass: media.mojom.MirrorServiceRemoter.proxyClass, stubClass: MirrorServiceRemoterStubAdapter, validateRequest: media.mojom.MirrorServiceRemoter.validateRequest, validateResponse: media.mojom.MirrorServiceRemoter.validateResponse, }; /** * Adapter for media.mojom.MirrorServiceRemotingSourcePtr. * @constructor */ function MirrorServiceRemotingSourcePtrAdapter(handleOrPtrInfo) { this.ptr = new mojo.InterfacePtrController(MirrorServiceRemotingSourceAdapter, handleOrPtrInfo); } MirrorServiceRemotingSourcePtrAdapter.prototype = Object.create(media.mojom.MirrorServiceRemotingSourcePtr.prototype); MirrorServiceRemotingSourcePtrAdapter.prototype.constructor = MirrorServiceRemotingSourcePtrAdapter; MirrorServiceRemotingSourcePtrAdapter.prototype.onSinkAvailable = function(metadata) { return this.ptr.getProxy().onSinkAvailable(metadata.toNewVersion()); }; /** * Adapter for media.mojom.MirrorServiceRemotingSource. */ var MirrorServiceRemotingSourceAdapter = { name: 'media.mojom.MirrorServiceRemotingSource', kVersion: 0, ptrClass: MirrorServiceRemotingSourcePtrAdapter, proxyClass: media.mojom.MirrorServiceRemotingSource.proxyClass, stubClass: null, validateRequest: media.mojom.MirrorServiceRemotingSource.validateRequest, validateResponse: null, }; /** * Adapter for mediaRouter.mojom.MediaStatusObserver. * @constructor */ function MediaStatusObserverPtrAdapter(handleOrPtrInfo) { this.ptr = new mojo.InterfacePtrController(MediaStatusObserverAdapter, handleOrPtrInfo); } MediaStatusObserverPtrAdapter.prototype = Object.create(mediaRouter.mojom.MediaStatusObserverPtr.prototype); MediaStatusObserverPtrAdapter.prototype.constructor = MediaStatusObserverPtrAdapter; MediaStatusObserverPtrAdapter.prototype.onMediaStatusUpdated = function(status) { return this.ptr.getProxy().onMediaStatusUpdated(status.toNewVersion()); }; /** * Adapter for mediaRouter.mojom.MediaStatusObserver. */ var MediaStatusObserverAdapter = { name: 'mediaRouter.mojom.MediaStatusObserver', kVersion: 0, ptrClass: MediaStatusObserverPtrAdapter, proxyClass: mediaRouter.mojom.MediaStatusObserver.proxyClass, stubClass: null, validateRequest: mediaRouter.mojom.MediaStatusObserver.validateRequest, validateResponse: null, }; /** * Converts a media sink to a MediaSink Mojo object. * @param {!MediaSink} sink A media sink. * @return {!mediaRouter.mojom.MediaSink} A Mojo MediaSink object. */ function sinkToMojo_(sink) { return new mediaRouter.mojom.MediaSink({ 'name': sink.friendlyName, 'description': sink.description, 'domain': sink.domain, 'sinkId': sink.id, 'iconType': sinkIconTypeToMojo(sink.iconType), 'providerId': mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, }); } /** * Converts a media sink's icon type to a MediaSink.IconType Mojo object. * @param {!MediaSink.IconType} type A media sink's icon type. * @return {!mediaRouter.mojom.MediaSink.IconType} A Mojo MediaSink.IconType * object. */ function sinkIconTypeToMojo(type) { switch (type) { case 'cast': return mediaRouter.mojom.SinkIconType.CAST; case 'cast_audio_group': return mediaRouter.mojom.SinkIconType.CAST_AUDIO_GROUP; case 'cast_audio': return mediaRouter.mojom.SinkIconType.CAST_AUDIO; case 'meeting': return mediaRouter.mojom.SinkIconType.MEETING; case 'hangout': return mediaRouter.mojom.SinkIconType.HANGOUT; case 'education': return mediaRouter.mojom.SinkIconType.EDUCATION; case 'generic': return mediaRouter.mojom.SinkIconType.GENERIC; default: console.error('Unknown sink icon type : ' + type); return mediaRouter.mojom.SinkIconType.GENERIC; } } /** * Returns a Mojo MediaRoute object given a MediaRoute and a * media sink name. * @param {!MediaRoute} route * @return {!mediaRouter.mojom.MediaRoute} */ function routeToMojo_(route) { return new mediaRouter.mojom.MediaRoute({ 'mediaRouteId': route.id, 'mediaSource': route.mediaSource, 'mediaSinkId': route.sinkId, 'description': route.description, 'iconUrl': route.iconUrl, 'isLocal': route.isLocal, 'forDisplay': route.forDisplay, 'isIncognito': route.offTheRecord, 'isLocalPresentation': route.isOffscreenPresentation, 'controllerType': route.controllerType, // Begin newly added properties, followed by the milestone they were // added. The guard should be safe to remove N+2 milestones later. 'presentationId': route.presentationId || '' // M64 }); } /** * Converts a route message to a RouteMessage Mojo object. * @param {!RouteMessage} message * @return {!mediaRouter.mojom.RouteMessage} A Mojo RouteMessage object. */ function messageToMojo_(message) { if ("string" == typeof message.message) { return new mediaRouter.mojom.RouteMessage({ 'type': mediaRouter.mojom.RouteMessage.Type.TEXT, 'message': message.message, }); } else { return new mediaRouter.mojom.RouteMessage({ 'type': mediaRouter.mojom.RouteMessage.Type.BINARY, 'data': message.message, }); } } /** * Converts presentation connection state to Mojo enum value. * @param {!string} state * @return {!mediaRouter.mojom.MediaRouter.PresentationConnectionState} */ function presentationConnectionStateToMojo_(state) { var PresentationConnectionState = mediaRouter.mojom.MediaRouter.PresentationConnectionState; switch (state) { case 'connecting': return PresentationConnectionState.CONNECTING; case 'connected': return PresentationConnectionState.CONNECTED; case 'closed': return PresentationConnectionState.CLOSED; case 'terminated': return PresentationConnectionState.TERMINATED; default: console.error('Unknown presentation connection state: ' + state); return PresentationConnectionState.TERMINATED; } } /** * Converts presentation connection close reason to Mojo enum value. * @param {!string} reason * @return {!mediaRouter.mojom.MediaRouter.PresentationConnectionCloseReason} */ function presentationConnectionCloseReasonToMojo_(reason) { var PresentationConnectionCloseReason = mediaRouter.mojom.MediaRouter.PresentationConnectionCloseReason; switch (reason) { case 'error': return PresentationConnectionCloseReason.CONNECTION_ERROR; case 'closed': return PresentationConnectionCloseReason.CLOSED; case 'went_away': return PresentationConnectionCloseReason.WENT_AWAY; default: console.error('Unknown presentation connection close reason : ' + reason); return PresentationConnectionCloseReason.CONNECTION_ERROR; } } /** * Converts string to Mojo origin. * @param {string|!url.mojom.Origin} origin * @return {!url.mojom.Origin} */ function stringToMojoOrigin_(origin) { if (origin instanceof url.mojom.Origin) { return origin; } var originUrl = new URL(origin); var mojoOrigin = {}; mojoOrigin.scheme = originUrl.protocol.replace(':', ''); mojoOrigin.host = originUrl.hostname; var port = originUrl.port ? Number.parseInt(originUrl.port) : 0; switch (mojoOrigin.scheme) { case 'http': mojoOrigin.port = port || 80; break; case 'https': mojoOrigin.port = port || 443; break; default: throw new Error('Scheme must be http or https'); } mojoOrigin.suborigin = ''; return new url.mojom.Origin(mojoOrigin); } /** * Parses the given route request Error object and converts it to the * corresponding result code. * @param {!Error} error * @return {!mediaRouter.mojom.RouteRequestResultCode} */ function getRouteRequestResultCode_(error) { return error.errorCode ? error.errorCode : mediaRouter.mojom.RouteRequestResultCode.UNKNOWN_ERROR; } /** * Creates and returns a successful route response from given route. * @param {!MediaRoute} route * @return {!Object} */ function toSuccessRouteResponse_(route) { return { route: routeToMojo_(route), resultCode: mediaRouter.mojom.RouteRequestResultCode.OK }; } /** * Creates and returns a error route response from given Error object. * @param {!Error} error * @return {!Object} */ function toErrorRouteResponse_(error) { return { errorText: error.message, resultCode: getRouteRequestResultCode_(error) }; } /** * Creates a new MediaRouter. * Converts a route struct to its Mojo form. * @param {!mediaRouter.mojom.MediaRouterPtr} service * @constructor */ function MediaRouter(service) { /** * The Mojo service proxy. Allows extension code to call methods that reside * in the browser. * @type {!mediaRouter.mojom.MediaRouterPtr} */ this.service_ = service; /** * The provider manager service delegate. Its methods are called by the * browser-resident Mojo service. * @type {!MediaRouter} */ this.mrpm_ = new MediaRouteProvider(this); /** * Handle to a KeepAlive service object, which prevents the extension from * being suspended as long as it remains in scope. * @type {boolean} */ this.keepAlive_ = null; /** * The bindings to bind the service delegate to the Mojo interface. * Object must remain in scope for the lifetime of the connection to * prevent the connection from closing automatically. * @type {!mojo.Binding} */ this.mediaRouteProviderBinding_ = new mojo.Binding( mediaRouter.mojom.MediaRouteProvider, this.mrpm_); } /** * Returns definitions of Mojo core and generated Mojom classes that can be * used directly by the component. * @return {!Object} * TODO(imcheng): We should export these along with MediaRouter. This requires * us to modify the component to handle multiple exports. When that logic is * baked in for a couple of milestones, we should be able to remove this * method. * TODO(imcheng): We should stop exporting mojo bindings classes that the * Media Router extension doesn't directly use, such as * mojo.AssociatedInterfacePtrInfo, mojo.InterfacePtrController and * mojo.interfaceControl. */ MediaRouter.prototype.getMojoExports = function() { return { AssociatedInterfacePtrInfo: mojo.AssociatedInterfacePtrInfo, Binding: mojo.Binding, DialMediaSink: DialMediaSinkAdapter, CastMediaSink: CastMediaSinkAdapter, IPAddress: IPAddressAdapter, IPEndpoint: IPEndpointAdapter, InterfacePtrController: mojo.InterfacePtrController, InterfacePtrInfo: mojo.InterfacePtrInfo, InterfaceRequest: mojo.InterfaceRequest, MediaController: mediaRouter.mojom.MediaController, MediaStatus: MediaStatusAdapter, MediaStatusObserverPtr: mediaRouter.mojom.MediaStatusObserverPtr, MirroringCastMessage: mirroring.mojom.CastMessage, MirroringCastMessageChannel: mirroring.mojom.CastMessageChannel, MirroringCastMessageChannelPtr: mirroring.mojom.CastMessageChannelPtr, MirroringServiceHostPtr: mirroring.mojom.MirroringServiceHostPtr, MirroringSessionError: mirroring.mojom.SessionError, MirroringSessionObserver: mirroring.mojom.SessionObserver, MirroringSessionObserverPtr: mirroring.mojom.SessionObserverPtr, MirroringSessionParameters: mirroring.mojom.SessionParameters, MirroringSessionType: mirroring.mojom.SessionType, MirroringRemotingNamespace: mirroring.mojom.REMOTING_NAMESPACE, MirroringWebRtcNamespace: mirroring.mojom.WEB_RTC_NAMESPACE, MirrorServiceRemoter: MirrorServiceRemoterAdapter, MirrorServiceRemoterPtr: MirrorServiceRemoterPtrAdapter, MirrorServiceRemotingSourcePtr: MirrorServiceRemotingSourcePtrAdapter, RemotingStopReason: media.mojom.RemotingStopReason, RemotingStartFailReason: media.mojom.RemotingStartFailReason, RemotingSinkFeature: media.mojom.RemotingSinkFeature, RemotingSinkAudioCapability: media.mojom.RemotingSinkAudioCapability, RemotingSinkVideoCapability: media.mojom.RemotingSinkVideoCapability, RemotingSinkMetadata: RemotingSinkMetadataAdapter, RouteControllerType: mediaRouter.mojom.RouteControllerType, Origin: url.mojom.Origin, Sink: MediaSinkAdapter, SinkExtraData: MediaSinkExtraDataAdapter, TimeDelta: mojoBase.mojom.TimeDelta, Url: url.mojom.Url, interfaceControl: mojo.interfaceControl, makeRequest: mojo.makeRequest, }; }; /** * Registers the Media Router Provider Manager with the Media Router. * @return {!Promise} Instance ID and config for the Media Router. */ MediaRouter.prototype.start = function() { return this.service_.registerMediaRouteProvider( mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, this.mediaRouteProviderBinding_.createInterfacePtrAndBind()).then( function(response) { return { 'instance_id': response.instanceId, 'config': { 'enable_dial_discovery': response.config.enableDialDiscovery, 'enable_cast_discovery': response.config.enableCastDiscovery, 'enable_dial_sink_query': response.config.enableDialSinkQuery, 'enable_cast_sink_query': response.config.enableCastSinkQuery, 'use_mirroring_service': response.config.useMirroringService, } }; }); } /** * Sets the service delegate methods. * @param {Object} handlers */ MediaRouter.prototype.setHandlers = function(handlers) { this.mrpm_.setHandlers(handlers); } /** * The keep alive status. * @return {boolean} */ MediaRouter.prototype.getKeepAlive = function() { return this.keepAlive_ != null; }; /** * Called by the provider manager when a sink list for a given source is * updated. * @param {!string} sourceUrn * @param {!Array} sinks * @param {!Array} origins */ MediaRouter.prototype.onSinksReceived = function(sourceUrn, sinks, origins) { // |origins| is a string array if the Media Router component extension version // is 59 or older. Without the stringToMojoOrigin_() conversion, clients using // those extension versions would see a crash shown in // https://crbug.com/787427. this.service_.onSinksReceived( mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, sourceUrn, sinks.map(sinkToMojo_), origins.map(stringToMojoOrigin_)); }; /** * Called by the provider manager when a sink is found to notify the MR of the * sink's ID. The actual sink will be returned through the normal sink list * update process, so this helps the MR identify the search result in the * list. * @param {string} pseudoSinkId ID of the pseudo sink that started the * search. * @param {string} sinkId ID of the newly-found sink. */ MediaRouter.prototype.onSearchSinkIdReceived = function( pseudoSinkId, sinkId) { this.service_.onSearchSinkIdReceived(pseudoSinkId, sinkId); }; /** * Called by the provider manager to keep the extension from suspending * if it enters a state where suspension is undesirable (e.g. there is an * active MediaRoute.) * If keepAlive is true, the extension is kept alive. * If keepAlive is false, the extension is allowed to suspend. * @param {boolean} keepAlive */ MediaRouter.prototype.setKeepAlive = function(keepAlive) { if (keepAlive === false && this.keepAlive_) { this.keepAlive_.ptr.reset(); this.keepAlive_ = null; } else if (keepAlive === true && !this.keepAlive_) { this.keepAlive_ = new extensions.KeepAlivePtr; Mojo.bindInterface( extensions.KeepAlive.name, mojo.makeRequest(this.keepAlive_).handle, 'context', true); } }; /** * Called by the provider manager to send an issue from a media route * provider to the Media Router, to show the user. * @param {!Object} issue The issue object. */ MediaRouter.prototype.onIssue = function(issue) { function issueSeverityToMojo_(severity) { switch (severity) { case 'fatal': return mediaRouter.mojom.Issue.Severity.FATAL; case 'warning': return mediaRouter.mojom.Issue.Severity.WARNING; case 'notification': return mediaRouter.mojom.Issue.Severity.NOTIFICATION; default: console.error('Unknown issue severity: ' + severity); return mediaRouter.mojom.Issue.Severity.NOTIFICATION; } } function issueActionToMojo_(action) { switch (action) { case 'dismiss': return mediaRouter.mojom.Issue.ActionType.DISMISS; case 'learn_more': return mediaRouter.mojom.Issue.ActionType.LEARN_MORE; default: console.error('Unknown issue action type : ' + action); return mediaRouter.mojom.Issue.ActionType.OK; } } var secondaryActions = (issue.secondaryActions || []).map(issueActionToMojo_); this.service_.onIssue(new mediaRouter.mojom.Issue({ 'routeId': issue.routeId || '', 'severity': issueSeverityToMojo_(issue.severity), 'title': issue.title, 'message': issue.message || '', 'defaultAction': issueActionToMojo_(issue.defaultAction), 'secondaryActions': secondaryActions, 'helpPageId': issue.helpPageId, 'isBlocking': issue.isBlocking, 'sinkId': issue.sinkId || '' })); }; /** * Called by the provider manager when the set of active routes * has been updated. * @param {!Array} routes The active set of media routes. * @param {string=} sourceUrn The sourceUrn associated with this route * query. * @param {Array=} joinableRouteIds The active set of joinable * media routes. */ MediaRouter.prototype.onRoutesUpdated = function( routes, sourceUrn = '', joinableRouteIds = []) { this.service_.onRoutesUpdated( mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, routes.map(routeToMojo_), sourceUrn, joinableRouteIds); }; /** * Called by the provider manager when sink availability has been updated. * @param {!mediaRouter.mojom.MediaRouter.SinkAvailability} availability * The new sink availability. */ MediaRouter.prototype.onSinkAvailabilityUpdated = function(availability) { this.service_.onSinkAvailabilityUpdated( mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, availability); }; /** * Called by the provider manager when the state of a presentation connected * to a route has changed. * @param {string} routeId * @param {string} state */ MediaRouter.prototype.onPresentationConnectionStateChanged = function(routeId, state) { this.service_.onPresentationConnectionStateChanged( routeId, presentationConnectionStateToMojo_(state)); }; /** * Called by the provider manager when the state of a presentation connected * to a route has closed. * @param {string} routeId * @param {string} reason * @param {string} message */ MediaRouter.prototype.onPresentationConnectionClosed = function(routeId, reason, message) { this.service_.onPresentationConnectionClosed( routeId, presentationConnectionCloseReasonToMojo_(reason), message); }; /** * @param {string} routeId * @param {!Array} mesages */ MediaRouter.prototype.onRouteMessagesReceived = function(routeId, messages) { this.service_.onRouteMessagesReceived( routeId, messages.map(messageToMojo_)); }; /** * @param {number} tabId * @param {!media.mojom.MirrorServiceRemoterPtr} remoter * @param {!mojo.InterfaceRequest} remotingSource */ MediaRouter.prototype.onMediaRemoterCreated = function(tabId, remoter, remotingSource) { this.service_.onMediaRemoterCreated( tabId, new media.mojom.MirrorServiceRemoterPtr(remoter.ptr.passInterface()), remotingSource); } /** * Returns current status of media sink service in JSON format. * @return {!Promise} */ MediaRouter.prototype.getMediaSinkServiceStatus = function() { return this.service_.getMediaSinkServiceStatus(); } /** * @param {int32} target_tab_id * @param {!mojo.InterfaceRequest} request */ MediaRouter.prototype.getMirroringServiceHostForTab = function( target_tab_id, request) { this.service_.getMirroringServiceHostForTab(target_tab_id, request); } /** * @param {int32} initiator_tab_id * @param {!string} desktop_stream_id * @param {!mojo.InterfaceRequest} request */ MediaRouter.prototype.getMirroringServiceHostForDesktop = function( initiator_tab_id, desktop_stream_id, request) { this.service_.getMirroringServiceHostForDesktop(initiator_tab_id, desktop_stream_id, request); } /** * @param {!url.mojom.Url} presentation_url * @param {!string} presentation_id * @param {!mojo.InterfaceRequest} request */ MediaRouter.prototype.getMirroringServiceHostForOffscreenTab = function( presentation_url, presentation_id, request) { this.service_.getMirroringServiceHostForOffscreenTab(presentation_url, presentation_id, request); } /** * Object containing callbacks set by the provider manager. * * @constructor * @struct */ function MediaRouterHandlers() { /** * @type {function(!string, !string, !string, !string, !number)} */ this.createRoute = null; /** * @type {function(!string, !string, !string, !number)} */ this.joinRoute = null; /** * @type {function(string): Promise} */ this.terminateRoute = null; /** * @type {function(string)} */ this.startObservingMediaSinks = null; /** * @type {function(string)} */ this.stopObservingMediaSinks = null; /** * @type {function(string, string): Promise} */ this.sendRouteMessage = null; /** * @type {function(string, Uint8Array): Promise} */ this.sendRouteBinaryMessage = null; /** * @type {function(string)} */ this.startListeningForRouteMessages = null; /** * @type {function(string)} */ this.stopListeningForRouteMessages = null; /** * @type {function(string)} */ this.detachRoute = null; /** * @type {function()} */ this.startObservingMediaRoutes = null; /** * @type {function()} */ this.stopObservingMediaRoutes = null; /** * @type {function()} */ this.connectRouteByRouteId = null; /** * @type {function()} */ this.enableMdnsDiscovery = null; /** * @type {function()} */ this.updateMediaSinks = null; /** * @type {function(string, string, !SinkSearchCriteria): string} */ this.searchSinks = null; /** * @type {function()} */ this.provideSinks = null; /** * @type {function(string, !mojo.InterfaceRequest, * !mediaRouter.mojom.MediaStatusObserverPtr): !Promise} */ this.createMediaRouteController = null; }; /** * Routes calls from Media Router to the provider manager extension. * Registered with the MediaRouter stub. * @param {!MediaRouter} MediaRouter proxy to call into the * Media Router mojo interface. * @constructor */ function MediaRouteProvider(mediaRouter) { /** * Object containing JS callbacks into Provider Manager code. * @type {!MediaRouterHandlers} */ this.handlers_ = new MediaRouterHandlers(); /** * Proxy class to the browser's Media Router Mojo service. * @type {!MediaRouter} */ this.mediaRouter_ = mediaRouter; } /* * Sets the callback handler used to invoke methods in the provider manager. * * @param {!MediaRouterHandlers} handlers */ MediaRouteProvider.prototype.setHandlers = function(handlers) { this.handlers_ = handlers; var requiredHandlers = [ 'stopObservingMediaRoutes', 'startObservingMediaRoutes', 'sendRouteMessage', 'sendRouteBinaryMessage', 'startListeningForRouteMessages', 'stopListeningForRouteMessages', 'detachRoute', 'terminateRoute', 'joinRoute', 'createRoute', 'stopObservingMediaSinks', 'startObservingMediaRoutes', 'connectRouteByRouteId', 'enableMdnsDiscovery', 'updateMediaSinks', 'searchSinks', 'provideSinks', 'createMediaRouteController', 'onBeforeInvokeHandler' ]; requiredHandlers.forEach(function(nextHandler) { if (handlers[nextHandler] === undefined) { console.error(nextHandler + ' handler not registered.'); } }); } /** * Starts querying for sinks capable of displaying the media source * designated by |sourceUrn|. Results are returned by calling * OnSinksReceived. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.startObservingMediaSinks = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.startObservingMediaSinks(sourceUrn); }; /** * Stops querying for sinks capable of displaying |sourceUrn|. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.stopObservingMediaSinks = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.stopObservingMediaSinks(sourceUrn); }; /** * Requests that |sinkId| render the media referenced by |sourceUrn|. If the * request is from the Presentation API, then origin and tabId will * be populated. * @param {!string} sourceUrn Media source to render. * @param {!string} sinkId Media sink ID. * @param {!string} presentationId Presentation ID from the site * requesting presentation. TODO(mfoltz): Remove. * @param {!url.mojom.Origin} origin Origin of site requesting presentation. * @param {!number} tabId ID of tab requesting presentation. * @param {!mojo_base.mojom.TimeDelta} timeout If positive, the timeout * duration for the request. Otherwise, the default duration will be used. * @param {!boolean} incognito If true, the route is being requested by * an incognito profile. * @return {!Promise.} A Promise resolving to an object describing * the newly created media route, or rejecting with an error message on * failure. */ MediaRouteProvider.prototype.createRoute = function(sourceUrn, sinkId, presentationId, origin, tabId, timeout, incognito) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.createRoute( sourceUrn, sinkId, presentationId, origin, tabId, Math.floor(timeout.microseconds / 1000), incognito) .then(function(route) { return toSuccessRouteResponse_(route); }, function(err) { return toErrorRouteResponse_(err); }); }; /** * Handles a request via the Presentation API to join an existing route given * by |sourceUrn| and |presentationId|. |origin| and |tabId| are used for * validating same-origin/tab scope. * @param {!string} sourceUrn Media source to render. * @param {!string} presentationId Presentation ID to join. * @param {!url.mojom.Origin} origin Origin of site requesting join. * @param {!number} tabId ID of tab requesting join. * @param {!mojo_base.mojom.TimeDelta} timeout If positive, the timeout * duration for the request. Otherwise, the default duration will be used. * @param {!boolean} incognito If true, the route is being requested by * an incognito profile. * @return {!Promise.} A Promise resolving to an object describing * the newly created media route, or rejecting with an error message on * failure. */ MediaRouteProvider.prototype.joinRoute = function(sourceUrn, presentationId, origin, tabId, timeout, incognito) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.joinRoute( sourceUrn, presentationId, origin, tabId, Math.floor(timeout.microseconds / 1000), incognito) .then(function(route) { return toSuccessRouteResponse_(route); }, function(err) { return toErrorRouteResponse_(err); }); }; /** * Handles a request via the Presentation API to join an existing route given * by |sourceUrn| and |routeId|. |origin| and |tabId| are used for * validating same-origin/tab scope. * @param {!string} sourceUrn Media source to render. * @param {!string} routeId Route ID to join. * @param {!string} presentationId Presentation ID to join. * @param {!url.mojom.Origin} origin Origin of site requesting join. * @param {!number} tabId ID of tab requesting join. * @param {!mojo_base.mojom.TimeDelta} timeout If positive, the timeout * duration for the request. Otherwise, the default duration will be used. * @param {!boolean} incognito If true, the route is being requested by * an incognito profile. * @return {!Promise.} A Promise resolving to an object describing * the newly created media route, or rejecting with an error message on * failure. */ MediaRouteProvider.prototype.connectRouteByRouteId = function(sourceUrn, routeId, presentationId, origin, tabId, timeout, incognito) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.connectRouteByRouteId( sourceUrn, routeId, presentationId, origin, tabId, Math.floor(timeout.microseconds / 1000), incognito) .then(function(route) { return toSuccessRouteResponse_(route); }, function(err) { return toErrorRouteResponse_(err); }); }; /** * Terminates the route specified by |routeId|. * @param {!string} routeId * @return {!Promise} A Promise resolving to an object describing * the result of the terminate operation, or rejecting with an error * message and code if the operation failed. */ MediaRouteProvider.prototype.terminateRoute = function(routeId) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.terminateRoute(routeId).then( () => ({resultCode: mediaRouter.mojom.RouteRequestResultCode.OK}), (err) => toErrorRouteResponse_(err)); }; /** * Posts a message to the route designated by |routeId|. * @param {!string} routeId * @param {!string} message */ MediaRouteProvider.prototype.sendRouteMessage = function( routeId, message) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.sendRouteMessage(routeId, message); }; /** * Sends a binary message to the route designated by |routeId|. * @param {!string} routeId * @param {!Array} data */ MediaRouteProvider.prototype.sendRouteBinaryMessage = function( routeId, data) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.sendRouteBinaryMessage(routeId, new Uint8Array(data)); }; /** * Listen for messages from a route. * @param {!string} routeId */ MediaRouteProvider.prototype.startListeningForRouteMessages = function( routeId) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.startListeningForRouteMessages(routeId); }; /** * @param {!string} routeId */ MediaRouteProvider.prototype.stopListeningForRouteMessages = function( routeId) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.stopListeningForRouteMessages(routeId); }; /** * Indicates that the presentation connection that was connected to |routeId| * is no longer connected to it. * @param {!string} routeId */ MediaRouteProvider.prototype.detachRoute = function( routeId) { this.handlers_.detachRoute(routeId); }; /** * Requests that the provider manager start sending information about active * media routes to the Media Router. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.startObservingMediaRoutes = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.startObservingMediaRoutes(sourceUrn); }; /** * Requests that the provider manager stop sending information about active * media routes to the Media Router. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.stopObservingMediaRoutes = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.stopObservingMediaRoutes(sourceUrn); }; /** * Enables mDNS device discovery. */ MediaRouteProvider.prototype.enableMdnsDiscovery = function() { this.handlers_.onBeforeInvokeHandler(); this.handlers_.enableMdnsDiscovery(); }; /** * Requests that the provider manager update media sinks. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.updateMediaSinks = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.updateMediaSinks(sourceUrn); }; /** * Requests that the provider manager search its providers for a sink matching * |searchCriteria| that is compatible with |sourceUrn|. If a sink is found * that can be used immediately for route creation, its ID is returned. * Otherwise the empty string is returned. * * @param {string} sinkId Sink ID of the pseudo sink generating the request. * @param {string} sourceUrn Media source to be used with the sink. * @param {!SinkSearchCriteria} searchCriteria Search criteria for the route * providers. * @return {!Promise.} A Promise resolving to either the * sink ID of the sink found by the search that can be used for route * creation, or the empty string if no route can be immediately created. */ MediaRouteProvider.prototype.searchSinks = function( sinkId, sourceUrn, searchCriteria) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.searchSinks(sinkId, sourceUrn, searchCriteria).then( sinkId => { return { 'sinkId': sinkId }; }, () => { return { 'sinkId': '' }; }); }; /** * Notifies the provider manager that MediaRouter has discovered a list of * sinks. * @param {string} providerName * @param {!Array} sinks */ MediaRouteProvider.prototype.provideSinks = function(providerName, sinks) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.provideSinks(providerName, sinks.map(MediaSinkAdapter.fromNewVersion)); }; /** * Creates a controller for the given route and binds the given * InterfaceRequest to it, and registers an observer for media status updates * for the route. * @param {string} routeId * @param {!mojo.InterfaceRequest} controllerRequest * @param {!mediaRouter.mojom.MediaStatusObserverPtr} observer * @return {!Promise} Resolves to true if a controller * is created. Resolves to false if a controller cannot be created, or if * the controller is already bound. */ MediaRouteProvider.prototype.createMediaRouteController = function( routeId, controllerRequest, observer) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.createMediaRouteController( routeId, controllerRequest, new MediaStatusObserverPtrAdapter(observer.ptr.passInterface())).then( () => ({success: true}), e => ({success: false})); }; var ptr = new mediaRouter.mojom.MediaRouterPtr; Mojo.bindInterface( mediaRouter.mojom.MediaRouter.name, mojo.makeRequest(ptr).handle, 'context', true); exports.$set('returnValue', new MediaRouter(ptr)); // chrome/common/media_router/mojom/media_status.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'chrome/common/media_router/mojom/media_status.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mediaRouter.mojom'); var time$ = mojo.internal.exposeNamespace('mojoBase.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'mojo/public/mojom/base/time.mojom', '../../../../mojo/public/mojom/base/time.mojom.js'); } var geometry$ = mojo.internal.exposeNamespace('gfx.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'ui/gfx/geometry/mojom/geometry.mojom', '../../../../ui/gfx/geometry/mojom/geometry.mojom.js'); } var url$ = mojo.internal.exposeNamespace('url.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'url/mojom/url.mojom', '../../../../url/mojom/url.mojom.js'); } function MediaImage(values) { this.initDefaults_(); this.initFields_(values); } MediaImage.prototype.initDefaults_ = function() { this.url = null; this.size = null; }; MediaImage.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaImage.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaImage.url err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, url$.Url, false); if (err !== validator.validationError.NONE) return err; // validate MediaImage.size err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, geometry$.Size, true); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaImage.encodedSize = codec.kStructHeaderSize + 16; MediaImage.decode = function(decoder) { var packed; var val = new MediaImage(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.url = decoder.decodeStructPointer(url$.Url); val.size = decoder.decodeStructPointer(geometry$.Size); return val; }; MediaImage.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaImage.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(url$.Url, val.url); encoder.encodeStructPointer(geometry$.Size, val.size); }; function MediaStatus(values) { this.initDefaults_(); this.initFields_(values); } MediaStatus.PlayState = {}; MediaStatus.PlayState.PLAYING = 0; MediaStatus.PlayState.PAUSED = MediaStatus.PlayState.PLAYING + 1; MediaStatus.PlayState.BUFFERING = MediaStatus.PlayState.PAUSED + 1; MediaStatus.PlayState.MIN_VALUE = 0, MediaStatus.PlayState.MAX_VALUE = 2, MediaStatus.PlayState.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; MediaStatus.PlayState.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaStatus.prototype.initDefaults_ = function() { this.title = null; this.canPlayPause = false; this.canMute = false; this.canSetVolume = false; this.canSeek = false; this.canSkipToNextTrack = false; this.canSkipToPreviousTrack = false; this.isMuted = false; this.playState = 0; this.volume = 0; this.duration = null; this.currentTime = null; this.images = null; }; MediaStatus.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaStatus.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 56} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaStatus.title err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaStatus.playState err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 12, MediaStatus.PlayState); if (err !== validator.validationError.NONE) return err; // validate MediaStatus.duration err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; // validate MediaStatus.currentTime err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 32, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; // validate MediaStatus.images err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 40, 8, new codec.PointerTo(MediaImage), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaStatus.encodedSize = codec.kStructHeaderSize + 48; MediaStatus.decode = function(decoder) { var packed; var val = new MediaStatus(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.title = decoder.decodeStruct(codec.String); packed = decoder.readUint8(); val.canPlayPause = (packed >> 0) & 1 ? true : false; val.canMute = (packed >> 1) & 1 ? true : false; val.canSetVolume = (packed >> 2) & 1 ? true : false; val.canSeek = (packed >> 3) & 1 ? true : false; val.canSkipToNextTrack = (packed >> 4) & 1 ? true : false; val.canSkipToPreviousTrack = (packed >> 5) & 1 ? true : false; val.isMuted = (packed >> 6) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.playState = decoder.decodeStruct(codec.Int32); val.volume = decoder.decodeStruct(codec.Float); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.duration = decoder.decodeStructPointer(time$.TimeDelta); val.currentTime = decoder.decodeStructPointer(time$.TimeDelta); val.images = decoder.decodeArrayPointer(new codec.PointerTo(MediaImage)); return val; }; MediaStatus.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaStatus.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.title); packed = 0; packed |= (val.canPlayPause & 1) << 0 packed |= (val.canMute & 1) << 1 packed |= (val.canSetVolume & 1) << 2 packed |= (val.canSeek & 1) << 3 packed |= (val.canSkipToNextTrack & 1) << 4 packed |= (val.canSkipToPreviousTrack & 1) << 5 packed |= (val.isMuted & 1) << 6 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.Int32, val.playState); encoder.encodeStruct(codec.Float, val.volume); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(time$.TimeDelta, val.duration); encoder.encodeStructPointer(time$.TimeDelta, val.currentTime); encoder.encodeArrayPointer(new codec.PointerTo(MediaImage), val.images); }; function MediaStatusObserver_OnMediaStatusUpdated_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaStatusObserver_OnMediaStatusUpdated_Params.prototype.initDefaults_ = function() { this.status = null; }; MediaStatusObserver_OnMediaStatusUpdated_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaStatusObserver_OnMediaStatusUpdated_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaStatusObserver_OnMediaStatusUpdated_Params.status err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaStatus, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaStatusObserver_OnMediaStatusUpdated_Params.encodedSize = codec.kStructHeaderSize + 8; MediaStatusObserver_OnMediaStatusUpdated_Params.decode = function(decoder) { var packed; var val = new MediaStatusObserver_OnMediaStatusUpdated_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.status = decoder.decodeStructPointer(MediaStatus); return val; }; MediaStatusObserver_OnMediaStatusUpdated_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaStatusObserver_OnMediaStatusUpdated_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(MediaStatus, val.status); }; var kMediaStatusObserver_OnMediaStatusUpdated_Name = 1632843672; function MediaStatusObserverPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MediaStatusObserver, handleOrPtrInfo); } function MediaStatusObserverAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MediaStatusObserver, associatedInterfacePtrInfo); } MediaStatusObserverAssociatedPtr.prototype = Object.create(MediaStatusObserverPtr.prototype); MediaStatusObserverAssociatedPtr.prototype.constructor = MediaStatusObserverAssociatedPtr; function MediaStatusObserverProxy(receiver) { this.receiver_ = receiver; } MediaStatusObserverPtr.prototype.onMediaStatusUpdated = function() { return MediaStatusObserverProxy.prototype.onMediaStatusUpdated .apply(this.ptr.getProxy(), arguments); }; MediaStatusObserverProxy.prototype.onMediaStatusUpdated = function(status) { var params_ = new MediaStatusObserver_OnMediaStatusUpdated_Params(); params_.status = status; var builder = new codec.MessageV0Builder( kMediaStatusObserver_OnMediaStatusUpdated_Name, codec.align(MediaStatusObserver_OnMediaStatusUpdated_Params.encodedSize)); builder.encodeStruct(MediaStatusObserver_OnMediaStatusUpdated_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function MediaStatusObserverStub(delegate) { this.delegate_ = delegate; } MediaStatusObserverStub.prototype.onMediaStatusUpdated = function(status) { return this.delegate_ && this.delegate_.onMediaStatusUpdated && this.delegate_.onMediaStatusUpdated(status); } MediaStatusObserverStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaStatusObserver_OnMediaStatusUpdated_Name: var params = reader.decodeStruct(MediaStatusObserver_OnMediaStatusUpdated_Params); this.onMediaStatusUpdated(params.status); return true; default: return false; } }; MediaStatusObserverStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateMediaStatusObserverRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaStatusObserver_OnMediaStatusUpdated_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaStatusObserver_OnMediaStatusUpdated_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMediaStatusObserverResponse(messageValidator) { return validator.validationError.NONE; } var MediaStatusObserver = { name: 'media_router.mojom.MediaStatusObserver', kVersion: 0, ptrClass: MediaStatusObserverPtr, proxyClass: MediaStatusObserverProxy, stubClass: MediaStatusObserverStub, validateRequest: validateMediaStatusObserverRequest, validateResponse: null, }; MediaStatusObserverStub.prototype.validator = validateMediaStatusObserverRequest; MediaStatusObserverProxy.prototype.validator = null; exports.MediaImage = MediaImage; exports.MediaStatus = MediaStatus; exports.MediaStatusObserver = MediaStatusObserver; exports.MediaStatusObserverPtr = MediaStatusObserverPtr; exports.MediaStatusObserverAssociatedPtr = MediaStatusObserverAssociatedPtr; })();// components/mirroring/mojom/mirroring_service_host.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'components/mirroring/mojom/mirroring_service_host.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mirroring.mojom'); var cast_message_channel$ = mojo.internal.exposeNamespace('mirroring.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'components/mirroring/mojom/cast_message_channel.mojom', 'cast_message_channel.mojom.js'); } var session_observer$ = mojo.internal.exposeNamespace('mirroring.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'components/mirroring/mojom/session_observer.mojom', 'session_observer.mojom.js'); } var session_parameters$ = mojo.internal.exposeNamespace('mirroring.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'components/mirroring/mojom/session_parameters.mojom', 'session_parameters.mojom.js'); } function MirroringServiceHost_Start_Params(values) { this.initDefaults_(); this.initFields_(values); } MirroringServiceHost_Start_Params.prototype.initDefaults_ = function() { this.params = null; this.observer = new session_observer$.SessionObserverPtr(); this.outboundChannel = new cast_message_channel$.CastMessageChannelPtr(); this.inboundChannel = new bindings.InterfaceRequest(); }; MirroringServiceHost_Start_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirroringServiceHost_Start_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirroringServiceHost_Start_Params.params err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, session_parameters$.SessionParameters, false); if (err !== validator.validationError.NONE) return err; // validate MirroringServiceHost_Start_Params.observer err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 8, false); if (err !== validator.validationError.NONE) return err; // validate MirroringServiceHost_Start_Params.outboundChannel err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 16, false); if (err !== validator.validationError.NONE) return err; // validate MirroringServiceHost_Start_Params.inboundChannel err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 24, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirroringServiceHost_Start_Params.encodedSize = codec.kStructHeaderSize + 32; MirroringServiceHost_Start_Params.decode = function(decoder) { var packed; var val = new MirroringServiceHost_Start_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.params = decoder.decodeStructPointer(session_parameters$.SessionParameters); val.observer = decoder.decodeStruct(new codec.Interface(session_observer$.SessionObserverPtr)); val.outboundChannel = decoder.decodeStruct(new codec.Interface(cast_message_channel$.CastMessageChannelPtr)); val.inboundChannel = decoder.decodeStruct(codec.InterfaceRequest); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MirroringServiceHost_Start_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirroringServiceHost_Start_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(session_parameters$.SessionParameters, val.params); encoder.encodeStruct(new codec.Interface(session_observer$.SessionObserverPtr), val.observer); encoder.encodeStruct(new codec.Interface(cast_message_channel$.CastMessageChannelPtr), val.outboundChannel); encoder.encodeStruct(codec.InterfaceRequest, val.inboundChannel); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; var kMirroringServiceHost_Start_Name = 19375681; function MirroringServiceHostPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MirroringServiceHost, handleOrPtrInfo); } function MirroringServiceHostAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MirroringServiceHost, associatedInterfacePtrInfo); } MirroringServiceHostAssociatedPtr.prototype = Object.create(MirroringServiceHostPtr.prototype); MirroringServiceHostAssociatedPtr.prototype.constructor = MirroringServiceHostAssociatedPtr; function MirroringServiceHostProxy(receiver) { this.receiver_ = receiver; } MirroringServiceHostPtr.prototype.start = function() { return MirroringServiceHostProxy.prototype.start .apply(this.ptr.getProxy(), arguments); }; MirroringServiceHostProxy.prototype.start = function(params, observer, outboundChannel, inboundChannel) { var params_ = new MirroringServiceHost_Start_Params(); params_.params = params; params_.observer = observer; params_.outboundChannel = outboundChannel; params_.inboundChannel = inboundChannel; var builder = new codec.MessageV0Builder( kMirroringServiceHost_Start_Name, codec.align(MirroringServiceHost_Start_Params.encodedSize)); builder.encodeStruct(MirroringServiceHost_Start_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function MirroringServiceHostStub(delegate) { this.delegate_ = delegate; } MirroringServiceHostStub.prototype.start = function(params, observer, outboundChannel, inboundChannel) { return this.delegate_ && this.delegate_.start && this.delegate_.start(params, observer, outboundChannel, inboundChannel); } MirroringServiceHostStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMirroringServiceHost_Start_Name: var params = reader.decodeStruct(MirroringServiceHost_Start_Params); this.start(params.params, params.observer, params.outboundChannel, params.inboundChannel); return true; default: return false; } }; MirroringServiceHostStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateMirroringServiceHostRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMirroringServiceHost_Start_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirroringServiceHost_Start_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMirroringServiceHostResponse(messageValidator) { return validator.validationError.NONE; } var MirroringServiceHost = { name: 'mirroring.mojom.MirroringServiceHost', kVersion: 0, ptrClass: MirroringServiceHostPtr, proxyClass: MirroringServiceHostProxy, stubClass: MirroringServiceHostStub, validateRequest: validateMirroringServiceHostRequest, validateResponse: null, }; MirroringServiceHostStub.prototype.validator = validateMirroringServiceHostRequest; MirroringServiceHostProxy.prototype.validator = null; exports.MirroringServiceHost = MirroringServiceHost; exports.MirroringServiceHostPtr = MirroringServiceHostPtr; exports.MirroringServiceHostAssociatedPtr = MirroringServiceHostAssociatedPtr; })();// components/mirroring/mojom/cast_message_channel.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'components/mirroring/mojom/cast_message_channel.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mirroring.mojom'); var REMOTING_NAMESPACE = "urn:x-cast:com.google.cast.remoting"; var WEB_RTC_NAMESPACE = "urn:x-cast:com.google.cast.webrtc"; function CastMessage(values) { this.initDefaults_(); this.initFields_(values); } CastMessage.prototype.initDefaults_ = function() { this.messageNamespace = null; this.jsonFormatData = null; }; CastMessage.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; CastMessage.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate CastMessage.messageNamespace err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate CastMessage.jsonFormatData err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; CastMessage.encodedSize = codec.kStructHeaderSize + 16; CastMessage.decode = function(decoder) { var packed; var val = new CastMessage(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.messageNamespace = decoder.decodeStruct(codec.String); val.jsonFormatData = decoder.decodeStruct(codec.String); return val; }; CastMessage.encode = function(encoder, val) { var packed; encoder.writeUint32(CastMessage.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.messageNamespace); encoder.encodeStruct(codec.String, val.jsonFormatData); }; function CastMessageChannel_Send_Params(values) { this.initDefaults_(); this.initFields_(values); } CastMessageChannel_Send_Params.prototype.initDefaults_ = function() { this.message = null; }; CastMessageChannel_Send_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; CastMessageChannel_Send_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate CastMessageChannel_Send_Params.message err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, CastMessage, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; CastMessageChannel_Send_Params.encodedSize = codec.kStructHeaderSize + 8; CastMessageChannel_Send_Params.decode = function(decoder) { var packed; var val = new CastMessageChannel_Send_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.message = decoder.decodeStructPointer(CastMessage); return val; }; CastMessageChannel_Send_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(CastMessageChannel_Send_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(CastMessage, val.message); }; var kCastMessageChannel_Send_Name = 1197333462; function CastMessageChannelPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(CastMessageChannel, handleOrPtrInfo); } function CastMessageChannelAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( CastMessageChannel, associatedInterfacePtrInfo); } CastMessageChannelAssociatedPtr.prototype = Object.create(CastMessageChannelPtr.prototype); CastMessageChannelAssociatedPtr.prototype.constructor = CastMessageChannelAssociatedPtr; function CastMessageChannelProxy(receiver) { this.receiver_ = receiver; } CastMessageChannelPtr.prototype.send = function() { return CastMessageChannelProxy.prototype.send .apply(this.ptr.getProxy(), arguments); }; CastMessageChannelProxy.prototype.send = function(message) { var params_ = new CastMessageChannel_Send_Params(); params_.message = message; var builder = new codec.MessageV0Builder( kCastMessageChannel_Send_Name, codec.align(CastMessageChannel_Send_Params.encodedSize)); builder.encodeStruct(CastMessageChannel_Send_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function CastMessageChannelStub(delegate) { this.delegate_ = delegate; } CastMessageChannelStub.prototype.send = function(message) { return this.delegate_ && this.delegate_.send && this.delegate_.send(message); } CastMessageChannelStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kCastMessageChannel_Send_Name: var params = reader.decodeStruct(CastMessageChannel_Send_Params); this.send(params.message); return true; default: return false; } }; CastMessageChannelStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateCastMessageChannelRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kCastMessageChannel_Send_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = CastMessageChannel_Send_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateCastMessageChannelResponse(messageValidator) { return validator.validationError.NONE; } var CastMessageChannel = { name: 'mirroring.mojom.CastMessageChannel', kVersion: 0, ptrClass: CastMessageChannelPtr, proxyClass: CastMessageChannelProxy, stubClass: CastMessageChannelStub, validateRequest: validateCastMessageChannelRequest, validateResponse: null, }; CastMessageChannelStub.prototype.validator = validateCastMessageChannelRequest; CastMessageChannelProxy.prototype.validator = null; exports.REMOTING_NAMESPACE = REMOTING_NAMESPACE; exports.WEB_RTC_NAMESPACE = WEB_RTC_NAMESPACE; exports.CastMessage = CastMessage; exports.CastMessageChannel = CastMessageChannel; exports.CastMessageChannelPtr = CastMessageChannelPtr; exports.CastMessageChannelAssociatedPtr = CastMessageChannelAssociatedPtr; })();// components/mirroring/mojom/session_observer.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'components/mirroring/mojom/session_observer.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mirroring.mojom'); var SessionError = {}; SessionError.ANSWER_TIME_OUT = 0; SessionError.ANSWER_NOT_OK = SessionError.ANSWER_TIME_OUT + 1; SessionError.ANSWER_MISMATCHED_CAST_MODE = SessionError.ANSWER_NOT_OK + 1; SessionError.ANSWER_MISMATCHED_SSRC_LENGTH = SessionError.ANSWER_MISMATCHED_CAST_MODE + 1; SessionError.ANSWER_SELECT_MULTIPLE_AUDIO = SessionError.ANSWER_MISMATCHED_SSRC_LENGTH + 1; SessionError.ANSWER_SELECT_MULTIPLE_VIDEO = SessionError.ANSWER_SELECT_MULTIPLE_AUDIO + 1; SessionError.ANSWER_SELECT_INVALID_INDEX = SessionError.ANSWER_SELECT_MULTIPLE_VIDEO + 1; SessionError.ANSWER_NO_AUDIO_OR_VIDEO = SessionError.ANSWER_SELECT_INVALID_INDEX + 1; SessionError.AUDIO_CAPTURE_ERROR = SessionError.ANSWER_NO_AUDIO_OR_VIDEO + 1; SessionError.VIDEO_CAPTURE_ERROR = SessionError.AUDIO_CAPTURE_ERROR + 1; SessionError.RTP_STREAM_ERROR = SessionError.VIDEO_CAPTURE_ERROR + 1; SessionError.ENCODING_ERROR = SessionError.RTP_STREAM_ERROR + 1; SessionError.CAST_TRANSPORT_ERROR = SessionError.ENCODING_ERROR + 1; SessionError.MIN_VALUE = 0, SessionError.MAX_VALUE = 12, SessionError.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: return true; } return false; }; SessionError.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; function SessionObserver_OnError_Params(values) { this.initDefaults_(); this.initFields_(values); } SessionObserver_OnError_Params.prototype.initDefaults_ = function() { this.error = 0; }; SessionObserver_OnError_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; SessionObserver_OnError_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate SessionObserver_OnError_Params.error err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, SessionError); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; SessionObserver_OnError_Params.encodedSize = codec.kStructHeaderSize + 8; SessionObserver_OnError_Params.decode = function(decoder) { var packed; var val = new SessionObserver_OnError_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.error = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; SessionObserver_OnError_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(SessionObserver_OnError_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.error); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function SessionObserver_DidStart_Params(values) { this.initDefaults_(); this.initFields_(values); } SessionObserver_DidStart_Params.prototype.initDefaults_ = function() { }; SessionObserver_DidStart_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; SessionObserver_DidStart_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; SessionObserver_DidStart_Params.encodedSize = codec.kStructHeaderSize + 0; SessionObserver_DidStart_Params.decode = function(decoder) { var packed; var val = new SessionObserver_DidStart_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; SessionObserver_DidStart_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(SessionObserver_DidStart_Params.encodedSize); encoder.writeUint32(0); }; function SessionObserver_DidStop_Params(values) { this.initDefaults_(); this.initFields_(values); } SessionObserver_DidStop_Params.prototype.initDefaults_ = function() { }; SessionObserver_DidStop_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; SessionObserver_DidStop_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; SessionObserver_DidStop_Params.encodedSize = codec.kStructHeaderSize + 0; SessionObserver_DidStop_Params.decode = function(decoder) { var packed; var val = new SessionObserver_DidStop_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; SessionObserver_DidStop_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(SessionObserver_DidStop_Params.encodedSize); encoder.writeUint32(0); }; var kSessionObserver_OnError_Name = 1560282092; var kSessionObserver_DidStart_Name = 427876750; var kSessionObserver_DidStop_Name = 1459290989; function SessionObserverPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(SessionObserver, handleOrPtrInfo); } function SessionObserverAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( SessionObserver, associatedInterfacePtrInfo); } SessionObserverAssociatedPtr.prototype = Object.create(SessionObserverPtr.prototype); SessionObserverAssociatedPtr.prototype.constructor = SessionObserverAssociatedPtr; function SessionObserverProxy(receiver) { this.receiver_ = receiver; } SessionObserverPtr.prototype.onError = function() { return SessionObserverProxy.prototype.onError .apply(this.ptr.getProxy(), arguments); }; SessionObserverProxy.prototype.onError = function(error) { var params_ = new SessionObserver_OnError_Params(); params_.error = error; var builder = new codec.MessageV0Builder( kSessionObserver_OnError_Name, codec.align(SessionObserver_OnError_Params.encodedSize)); builder.encodeStruct(SessionObserver_OnError_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; SessionObserverPtr.prototype.didStart = function() { return SessionObserverProxy.prototype.didStart .apply(this.ptr.getProxy(), arguments); }; SessionObserverProxy.prototype.didStart = function() { var params_ = new SessionObserver_DidStart_Params(); var builder = new codec.MessageV0Builder( kSessionObserver_DidStart_Name, codec.align(SessionObserver_DidStart_Params.encodedSize)); builder.encodeStruct(SessionObserver_DidStart_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; SessionObserverPtr.prototype.didStop = function() { return SessionObserverProxy.prototype.didStop .apply(this.ptr.getProxy(), arguments); }; SessionObserverProxy.prototype.didStop = function() { var params_ = new SessionObserver_DidStop_Params(); var builder = new codec.MessageV0Builder( kSessionObserver_DidStop_Name, codec.align(SessionObserver_DidStop_Params.encodedSize)); builder.encodeStruct(SessionObserver_DidStop_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function SessionObserverStub(delegate) { this.delegate_ = delegate; } SessionObserverStub.prototype.onError = function(error) { return this.delegate_ && this.delegate_.onError && this.delegate_.onError(error); } SessionObserverStub.prototype.didStart = function() { return this.delegate_ && this.delegate_.didStart && this.delegate_.didStart(); } SessionObserverStub.prototype.didStop = function() { return this.delegate_ && this.delegate_.didStop && this.delegate_.didStop(); } SessionObserverStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kSessionObserver_OnError_Name: var params = reader.decodeStruct(SessionObserver_OnError_Params); this.onError(params.error); return true; case kSessionObserver_DidStart_Name: var params = reader.decodeStruct(SessionObserver_DidStart_Params); this.didStart(); return true; case kSessionObserver_DidStop_Name: var params = reader.decodeStruct(SessionObserver_DidStop_Params); this.didStop(); return true; default: return false; } }; SessionObserverStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateSessionObserverRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kSessionObserver_OnError_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = SessionObserver_OnError_Params; break; case kSessionObserver_DidStart_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = SessionObserver_DidStart_Params; break; case kSessionObserver_DidStop_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = SessionObserver_DidStop_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateSessionObserverResponse(messageValidator) { return validator.validationError.NONE; } var SessionObserver = { name: 'mirroring.mojom.SessionObserver', kVersion: 0, ptrClass: SessionObserverPtr, proxyClass: SessionObserverProxy, stubClass: SessionObserverStub, validateRequest: validateSessionObserverRequest, validateResponse: null, }; SessionObserverStub.prototype.validator = validateSessionObserverRequest; SessionObserverProxy.prototype.validator = null; exports.SessionError = SessionError; exports.SessionObserver = SessionObserver; exports.SessionObserverPtr = SessionObserverPtr; exports.SessionObserverAssociatedPtr = SessionObserverAssociatedPtr; })();// components/mirroring/mojom/session_parameters.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'components/mirroring/mojom/session_parameters.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mirroring.mojom'); var ip_address$ = mojo.internal.exposeNamespace('network.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'services/network/public/mojom/ip_address.mojom', '../../../services/network/public/mojom/ip_address.mojom.js'); } var SessionType = {}; SessionType.AUDIO_ONLY = 0; SessionType.VIDEO_ONLY = SessionType.AUDIO_ONLY + 1; SessionType.AUDIO_AND_VIDEO = SessionType.VIDEO_ONLY + 1; SessionType.MIN_VALUE = 0, SessionType.MAX_VALUE = 2, SessionType.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; SessionType.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; function SessionParameters(values) { this.initDefaults_(); this.initFields_(values); } SessionParameters.prototype.initDefaults_ = function() { this.type = 0; this.receiverAddress = null; this.receiverModelName = null; }; SessionParameters.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; SessionParameters.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate SessionParameters.type err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, SessionType); if (err !== validator.validationError.NONE) return err; // validate SessionParameters.receiverAddress err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, ip_address$.IPAddress, false); if (err !== validator.validationError.NONE) return err; // validate SessionParameters.receiverModelName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; SessionParameters.encodedSize = codec.kStructHeaderSize + 24; SessionParameters.decode = function(decoder) { var packed; var val = new SessionParameters(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.type = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.receiverAddress = decoder.decodeStructPointer(ip_address$.IPAddress); val.receiverModelName = decoder.decodeStruct(codec.String); return val; }; SessionParameters.encode = function(encoder, val) { var packed; encoder.writeUint32(SessionParameters.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.type); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(ip_address$.IPAddress, val.receiverAddress); encoder.encodeStruct(codec.String, val.receiverModelName); }; exports.SessionType = SessionType; exports.SessionParameters = SessionParameters; })();// mojo/public/mojom/base/time.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'mojo/public/mojom/base/time.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mojoBase.mojom'); function Time(values) { this.initDefaults_(); this.initFields_(values); } Time.prototype.initDefaults_ = function() { this.internalValue = 0; }; Time.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; Time.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; Time.encodedSize = codec.kStructHeaderSize + 8; Time.decode = function(decoder) { var packed; var val = new Time(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.internalValue = decoder.decodeStruct(codec.Int64); return val; }; Time.encode = function(encoder, val) { var packed; encoder.writeUint32(Time.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int64, val.internalValue); }; function TimeDelta(values) { this.initDefaults_(); this.initFields_(values); } TimeDelta.prototype.initDefaults_ = function() { this.microseconds = 0; }; TimeDelta.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; TimeDelta.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; TimeDelta.encodedSize = codec.kStructHeaderSize + 8; TimeDelta.decode = function(decoder) { var packed; var val = new TimeDelta(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.microseconds = decoder.decodeStruct(codec.Int64); return val; }; TimeDelta.encode = function(encoder, val) { var packed; encoder.writeUint32(TimeDelta.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int64, val.microseconds); }; function TimeTicks(values) { this.initDefaults_(); this.initFields_(values); } TimeTicks.prototype.initDefaults_ = function() { this.internalValue = 0; }; TimeTicks.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; TimeTicks.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; TimeTicks.encodedSize = codec.kStructHeaderSize + 8; TimeTicks.decode = function(decoder) { var packed; var val = new TimeTicks(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.internalValue = decoder.decodeStruct(codec.Int64); return val; }; TimeTicks.encode = function(encoder, val) { var packed; encoder.writeUint32(TimeTicks.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int64, val.internalValue); }; exports.Time = Time; exports.TimeDelta = TimeDelta; exports.TimeTicks = TimeTicks; })();// mojo/public/mojom/base/unguessable_token.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'mojo/public/mojom/base/unguessable_token.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mojoBase.mojom'); function UnguessableToken(values) { this.initDefaults_(); this.initFields_(values); } UnguessableToken.prototype.initDefaults_ = function() { this.high = 0; this.low = 0; }; UnguessableToken.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; UnguessableToken.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; UnguessableToken.encodedSize = codec.kStructHeaderSize + 16; UnguessableToken.decode = function(decoder) { var packed; var val = new UnguessableToken(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.high = decoder.decodeStruct(codec.Uint64); val.low = decoder.decodeStruct(codec.Uint64); return val; }; UnguessableToken.encode = function(encoder, val) { var packed; encoder.writeUint32(UnguessableToken.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Uint64, val.high); encoder.encodeStruct(codec.Uint64, val.low); }; exports.UnguessableToken = UnguessableToken; })();// services/network/public/mojom/ip_address.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'services/network/public/mojom/ip_address.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('network.mojom'); function IPAddress(values) { this.initDefaults_(); this.initFields_(values); } IPAddress.prototype.initDefaults_ = function() { this.addressBytes = null; }; IPAddress.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; IPAddress.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate IPAddress.addressBytes err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; IPAddress.encodedSize = codec.kStructHeaderSize + 8; IPAddress.decode = function(decoder) { var packed; var val = new IPAddress(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.addressBytes = decoder.decodeArrayPointer(codec.Uint8); return val; }; IPAddress.encode = function(encoder, val) { var packed; encoder.writeUint32(IPAddress.encodedSize); encoder.writeUint32(0); encoder.encodeArrayPointer(codec.Uint8, val.addressBytes); }; exports.IPAddress = IPAddress; })();// services/network/public/mojom/ip_endpoint.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'services/network/public/mojom/ip_endpoint.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('network.mojom'); var ip_address$ = mojo.internal.exposeNamespace('network.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'services/network/public/mojom/ip_address.mojom', 'ip_address.mojom.js'); } function IPEndPoint(values) { this.initDefaults_(); this.initFields_(values); } IPEndPoint.prototype.initDefaults_ = function() { this.address = null; this.port = 0; }; IPEndPoint.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; IPEndPoint.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate IPEndPoint.address err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, ip_address$.IPAddress, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; IPEndPoint.encodedSize = codec.kStructHeaderSize + 16; IPEndPoint.decode = function(decoder) { var packed; var val = new IPEndPoint(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.address = decoder.decodeStructPointer(ip_address$.IPAddress); val.port = decoder.decodeStruct(codec.Uint16); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; IPEndPoint.encode = function(encoder, val) { var packed; encoder.writeUint32(IPEndPoint.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(ip_address$.IPAddress, val.address); encoder.encodeStruct(codec.Uint16, val.port); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; exports.IPEndPoint = IPEndPoint; })();// url/mojom/origin.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'url/mojom/origin.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('url.mojom'); var unguessable_token$ = mojo.internal.exposeNamespace('mojoBase.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'mojo/public/mojom/base/unguessable_token.mojom', '../../mojo/public/mojom/base/unguessable_token.mojom.js'); } function Origin(values) { this.initDefaults_(); this.initFields_(values); } Origin.prototype.initDefaults_ = function() { this.scheme = null; this.host = null; this.port = 0; this.nonceIfOpaque = null; }; Origin.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; Origin.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate Origin.scheme err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate Origin.host err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate Origin.nonceIfOpaque err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, unguessable_token$.UnguessableToken, true); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; Origin.encodedSize = codec.kStructHeaderSize + 32; Origin.decode = function(decoder) { var packed; var val = new Origin(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.scheme = decoder.decodeStruct(codec.String); val.host = decoder.decodeStruct(codec.String); val.port = decoder.decodeStruct(codec.Uint16); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.nonceIfOpaque = decoder.decodeStructPointer(unguessable_token$.UnguessableToken); return val; }; Origin.encode = function(encoder, val) { var packed; encoder.writeUint32(Origin.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.scheme); encoder.encodeStruct(codec.String, val.host); encoder.encodeStruct(codec.Uint16, val.port); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(unguessable_token$.UnguessableToken, val.nonceIfOpaque); }; exports.Origin = Origin; })();// url/mojom/url.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'url/mojom/url.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('url.mojom'); function Url(values) { this.initDefaults_(); this.initFields_(values); } Url.prototype.initDefaults_ = function() { this.url = null; }; Url.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; Url.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate Url.url err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; Url.encodedSize = codec.kStructHeaderSize + 8; Url.decode = function(decoder) { var packed; var val = new Url(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.url = decoder.decodeStruct(codec.String); return val; }; Url.encode = function(encoder, val) { var packed; encoder.writeUint32(Url.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.url); }; exports.Url = Url; })();// media/mojo/mojom/mirror_service_remoting.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'media/mojo/mojom/mirror_service_remoting.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('media.mojom'); var remoting_common$ = mojo.internal.exposeNamespace('media.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'media/mojo/mojom/remoting_common.mojom', 'remoting_common.mojom.js'); } function MirrorServiceRemoter_Start_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_Start_Params.prototype.initDefaults_ = function() { }; MirrorServiceRemoter_Start_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_Start_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_Start_Params.encodedSize = codec.kStructHeaderSize + 0; MirrorServiceRemoter_Start_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_Start_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MirrorServiceRemoter_Start_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_Start_Params.encodedSize); encoder.writeUint32(0); }; function MirrorServiceRemoter_StartDataStreams_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_StartDataStreams_Params.prototype.initDefaults_ = function() { this.hasAudio = false; this.hasVideo = false; }; MirrorServiceRemoter_StartDataStreams_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_StartDataStreams_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_StartDataStreams_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_StartDataStreams_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_StartDataStreams_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.hasAudio = (packed >> 0) & 1 ? true : false; val.hasVideo = (packed >> 1) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MirrorServiceRemoter_StartDataStreams_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_StartDataStreams_Params.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.hasAudio & 1) << 0 packed |= (val.hasVideo & 1) << 1 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MirrorServiceRemoter_StartDataStreams_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_StartDataStreams_ResponseParams.prototype.initDefaults_ = function() { this.audioStreamId = 0; this.videoStreamId = 0; }; MirrorServiceRemoter_StartDataStreams_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_StartDataStreams_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_StartDataStreams_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_StartDataStreams_ResponseParams.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_StartDataStreams_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.audioStreamId = decoder.decodeStruct(codec.Int32); val.videoStreamId = decoder.decodeStruct(codec.Int32); return val; }; MirrorServiceRemoter_StartDataStreams_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_StartDataStreams_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.audioStreamId); encoder.encodeStruct(codec.Int32, val.videoStreamId); }; function MirrorServiceRemoter_Stop_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_Stop_Params.prototype.initDefaults_ = function() { this.reason = 0; }; MirrorServiceRemoter_Stop_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_Stop_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemoter_Stop_Params.reason err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, remoting_common$.RemotingStopReason); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_Stop_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_Stop_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_Stop_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.reason = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MirrorServiceRemoter_Stop_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_Stop_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.reason); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MirrorServiceRemoter_SendMessageToSink_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_SendMessageToSink_Params.prototype.initDefaults_ = function() { this.message = null; }; MirrorServiceRemoter_SendMessageToSink_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_SendMessageToSink_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemoter_SendMessageToSink_Params.message err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_SendMessageToSink_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_SendMessageToSink_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_SendMessageToSink_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.message = decoder.decodeArrayPointer(codec.Uint8); return val; }; MirrorServiceRemoter_SendMessageToSink_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_SendMessageToSink_Params.encodedSize); encoder.writeUint32(0); encoder.encodeArrayPointer(codec.Uint8, val.message); }; function MirrorServiceRemoter_EstimateTransmissionCapacity_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_EstimateTransmissionCapacity_Params.prototype.initDefaults_ = function() { }; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encodedSize = codec.kStructHeaderSize + 0; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_EstimateTransmissionCapacity_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encodedSize); encoder.writeUint32(0); }; function MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.prototype.initDefaults_ = function() { this.rate = 0; }; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.rate = decoder.decodeStruct(codec.Double); return val; }; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Double, val.rate); }; function MirrorServiceRemotingSource_OnSinkAvailable_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemotingSource_OnSinkAvailable_Params.prototype.initDefaults_ = function() { this.metadata = null; }; MirrorServiceRemotingSource_OnSinkAvailable_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemotingSource_OnSinkAvailable_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemotingSource_OnSinkAvailable_Params.metadata err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, remoting_common$.RemotingSinkMetadata, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemotingSource_OnSinkAvailable_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemotingSource_OnSinkAvailable_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemotingSource_OnSinkAvailable_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.metadata = decoder.decodeStructPointer(remoting_common$.RemotingSinkMetadata); return val; }; MirrorServiceRemotingSource_OnSinkAvailable_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemotingSource_OnSinkAvailable_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(remoting_common$.RemotingSinkMetadata, val.metadata); }; function MirrorServiceRemotingSource_OnMessageFromSink_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemotingSource_OnMessageFromSink_Params.prototype.initDefaults_ = function() { this.message = null; }; MirrorServiceRemotingSource_OnMessageFromSink_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemotingSource_OnMessageFromSink_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemotingSource_OnMessageFromSink_Params.message err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemotingSource_OnMessageFromSink_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemotingSource_OnMessageFromSink_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemotingSource_OnMessageFromSink_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.message = decoder.decodeArrayPointer(codec.Uint8); return val; }; MirrorServiceRemotingSource_OnMessageFromSink_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemotingSource_OnMessageFromSink_Params.encodedSize); encoder.writeUint32(0); encoder.encodeArrayPointer(codec.Uint8, val.message); }; function MirrorServiceRemotingSource_OnStopped_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemotingSource_OnStopped_Params.prototype.initDefaults_ = function() { this.reason = 0; }; MirrorServiceRemotingSource_OnStopped_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemotingSource_OnStopped_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemotingSource_OnStopped_Params.reason err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, remoting_common$.RemotingStopReason); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemotingSource_OnStopped_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemotingSource_OnStopped_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemotingSource_OnStopped_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.reason = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MirrorServiceRemotingSource_OnStopped_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemotingSource_OnStopped_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.reason); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MirrorServiceRemotingSource_OnError_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemotingSource_OnError_Params.prototype.initDefaults_ = function() { }; MirrorServiceRemotingSource_OnError_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemotingSource_OnError_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemotingSource_OnError_Params.encodedSize = codec.kStructHeaderSize + 0; MirrorServiceRemotingSource_OnError_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemotingSource_OnError_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MirrorServiceRemotingSource_OnError_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemotingSource_OnError_Params.encodedSize); encoder.writeUint32(0); }; var kMirrorServiceRemoter_Start_Name = 2026428975; var kMirrorServiceRemoter_StartDataStreams_Name = 1448785961; var kMirrorServiceRemoter_Stop_Name = 1924219678; var kMirrorServiceRemoter_SendMessageToSink_Name = 1873187558; var kMirrorServiceRemoter_EstimateTransmissionCapacity_Name = 1054845002; function MirrorServiceRemoterPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MirrorServiceRemoter, handleOrPtrInfo); } function MirrorServiceRemoterAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MirrorServiceRemoter, associatedInterfacePtrInfo); } MirrorServiceRemoterAssociatedPtr.prototype = Object.create(MirrorServiceRemoterPtr.prototype); MirrorServiceRemoterAssociatedPtr.prototype.constructor = MirrorServiceRemoterAssociatedPtr; function MirrorServiceRemoterProxy(receiver) { this.receiver_ = receiver; } MirrorServiceRemoterPtr.prototype.start = function() { return MirrorServiceRemoterProxy.prototype.start .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.start = function() { var params_ = new MirrorServiceRemoter_Start_Params(); var builder = new codec.MessageV0Builder( kMirrorServiceRemoter_Start_Name, codec.align(MirrorServiceRemoter_Start_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemoter_Start_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemoterPtr.prototype.startDataStreams = function() { return MirrorServiceRemoterProxy.prototype.startDataStreams .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.startDataStreams = function(hasAudio, hasVideo) { var params_ = new MirrorServiceRemoter_StartDataStreams_Params(); params_.hasAudio = hasAudio; params_.hasVideo = hasVideo; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMirrorServiceRemoter_StartDataStreams_Name, codec.align(MirrorServiceRemoter_StartDataStreams_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MirrorServiceRemoter_StartDataStreams_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MirrorServiceRemoter_StartDataStreams_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MirrorServiceRemoterPtr.prototype.stop = function() { return MirrorServiceRemoterProxy.prototype.stop .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.stop = function(reason) { var params_ = new MirrorServiceRemoter_Stop_Params(); params_.reason = reason; var builder = new codec.MessageV0Builder( kMirrorServiceRemoter_Stop_Name, codec.align(MirrorServiceRemoter_Stop_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemoter_Stop_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemoterPtr.prototype.sendMessageToSink = function() { return MirrorServiceRemoterProxy.prototype.sendMessageToSink .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.sendMessageToSink = function(message) { var params_ = new MirrorServiceRemoter_SendMessageToSink_Params(); params_.message = message; var builder = new codec.MessageV0Builder( kMirrorServiceRemoter_SendMessageToSink_Name, codec.align(MirrorServiceRemoter_SendMessageToSink_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemoter_SendMessageToSink_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemoterPtr.prototype.estimateTransmissionCapacity = function() { return MirrorServiceRemoterProxy.prototype.estimateTransmissionCapacity .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.estimateTransmissionCapacity = function() { var params_ = new MirrorServiceRemoter_EstimateTransmissionCapacity_Params(); return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMirrorServiceRemoter_EstimateTransmissionCapacity_Name, codec.align(MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; function MirrorServiceRemoterStub(delegate) { this.delegate_ = delegate; } MirrorServiceRemoterStub.prototype.start = function() { return this.delegate_ && this.delegate_.start && this.delegate_.start(); } MirrorServiceRemoterStub.prototype.startDataStreams = function(hasAudio, hasVideo) { return this.delegate_ && this.delegate_.startDataStreams && this.delegate_.startDataStreams(hasAudio, hasVideo); } MirrorServiceRemoterStub.prototype.stop = function(reason) { return this.delegate_ && this.delegate_.stop && this.delegate_.stop(reason); } MirrorServiceRemoterStub.prototype.sendMessageToSink = function(message) { return this.delegate_ && this.delegate_.sendMessageToSink && this.delegate_.sendMessageToSink(message); } MirrorServiceRemoterStub.prototype.estimateTransmissionCapacity = function() { return this.delegate_ && this.delegate_.estimateTransmissionCapacity && this.delegate_.estimateTransmissionCapacity(); } MirrorServiceRemoterStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMirrorServiceRemoter_Start_Name: var params = reader.decodeStruct(MirrorServiceRemoter_Start_Params); this.start(); return true; case kMirrorServiceRemoter_Stop_Name: var params = reader.decodeStruct(MirrorServiceRemoter_Stop_Params); this.stop(params.reason); return true; case kMirrorServiceRemoter_SendMessageToSink_Name: var params = reader.decodeStruct(MirrorServiceRemoter_SendMessageToSink_Params); this.sendMessageToSink(params.message); return true; default: return false; } }; MirrorServiceRemoterStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMirrorServiceRemoter_StartDataStreams_Name: var params = reader.decodeStruct(MirrorServiceRemoter_StartDataStreams_Params); this.startDataStreams(params.hasAudio, params.hasVideo).then(function(response) { var responseParams = new MirrorServiceRemoter_StartDataStreams_ResponseParams(); responseParams.audioStreamId = response.audioStreamId; responseParams.videoStreamId = response.videoStreamId; var builder = new codec.MessageV1Builder( kMirrorServiceRemoter_StartDataStreams_Name, codec.align(MirrorServiceRemoter_StartDataStreams_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MirrorServiceRemoter_StartDataStreams_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMirrorServiceRemoter_EstimateTransmissionCapacity_Name: var params = reader.decodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_Params); this.estimateTransmissionCapacity().then(function(response) { var responseParams = new MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams(); responseParams.rate = response.rate; var builder = new codec.MessageV1Builder( kMirrorServiceRemoter_EstimateTransmissionCapacity_Name, codec.align(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; default: return false; } }; function validateMirrorServiceRemoterRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMirrorServiceRemoter_Start_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemoter_Start_Params; break; case kMirrorServiceRemoter_StartDataStreams_Name: if (message.expectsResponse()) paramsClass = MirrorServiceRemoter_StartDataStreams_Params; break; case kMirrorServiceRemoter_Stop_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemoter_Stop_Params; break; case kMirrorServiceRemoter_SendMessageToSink_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemoter_SendMessageToSink_Params; break; case kMirrorServiceRemoter_EstimateTransmissionCapacity_Name: if (message.expectsResponse()) paramsClass = MirrorServiceRemoter_EstimateTransmissionCapacity_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMirrorServiceRemoterResponse(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMirrorServiceRemoter_StartDataStreams_Name: if (message.isResponse()) paramsClass = MirrorServiceRemoter_StartDataStreams_ResponseParams; break; case kMirrorServiceRemoter_EstimateTransmissionCapacity_Name: if (message.isResponse()) paramsClass = MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } var MirrorServiceRemoter = { name: 'media.mojom.MirrorServiceRemoter', kVersion: 0, ptrClass: MirrorServiceRemoterPtr, proxyClass: MirrorServiceRemoterProxy, stubClass: MirrorServiceRemoterStub, validateRequest: validateMirrorServiceRemoterRequest, validateResponse: validateMirrorServiceRemoterResponse, }; MirrorServiceRemoterStub.prototype.validator = validateMirrorServiceRemoterRequest; MirrorServiceRemoterProxy.prototype.validator = validateMirrorServiceRemoterResponse; var kMirrorServiceRemotingSource_OnSinkAvailable_Name = 704836746; var kMirrorServiceRemotingSource_OnMessageFromSink_Name = 1562903362; var kMirrorServiceRemotingSource_OnStopped_Name = 1973290239; var kMirrorServiceRemotingSource_OnError_Name = 786894234; function MirrorServiceRemotingSourcePtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MirrorServiceRemotingSource, handleOrPtrInfo); } function MirrorServiceRemotingSourceAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MirrorServiceRemotingSource, associatedInterfacePtrInfo); } MirrorServiceRemotingSourceAssociatedPtr.prototype = Object.create(MirrorServiceRemotingSourcePtr.prototype); MirrorServiceRemotingSourceAssociatedPtr.prototype.constructor = MirrorServiceRemotingSourceAssociatedPtr; function MirrorServiceRemotingSourceProxy(receiver) { this.receiver_ = receiver; } MirrorServiceRemotingSourcePtr.prototype.onSinkAvailable = function() { return MirrorServiceRemotingSourceProxy.prototype.onSinkAvailable .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemotingSourceProxy.prototype.onSinkAvailable = function(metadata) { var params_ = new MirrorServiceRemotingSource_OnSinkAvailable_Params(); params_.metadata = metadata; var builder = new codec.MessageV0Builder( kMirrorServiceRemotingSource_OnSinkAvailable_Name, codec.align(MirrorServiceRemotingSource_OnSinkAvailable_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemotingSource_OnSinkAvailable_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemotingSourcePtr.prototype.onMessageFromSink = function() { return MirrorServiceRemotingSourceProxy.prototype.onMessageFromSink .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemotingSourceProxy.prototype.onMessageFromSink = function(message) { var params_ = new MirrorServiceRemotingSource_OnMessageFromSink_Params(); params_.message = message; var builder = new codec.MessageV0Builder( kMirrorServiceRemotingSource_OnMessageFromSink_Name, codec.align(MirrorServiceRemotingSource_OnMessageFromSink_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemotingSource_OnMessageFromSink_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemotingSourcePtr.prototype.onStopped = function() { return MirrorServiceRemotingSourceProxy.prototype.onStopped .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemotingSourceProxy.prototype.onStopped = function(reason) { var params_ = new MirrorServiceRemotingSource_OnStopped_Params(); params_.reason = reason; var builder = new codec.MessageV0Builder( kMirrorServiceRemotingSource_OnStopped_Name, codec.align(MirrorServiceRemotingSource_OnStopped_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemotingSource_OnStopped_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemotingSourcePtr.prototype.onError = function() { return MirrorServiceRemotingSourceProxy.prototype.onError .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemotingSourceProxy.prototype.onError = function() { var params_ = new MirrorServiceRemotingSource_OnError_Params(); var builder = new codec.MessageV0Builder( kMirrorServiceRemotingSource_OnError_Name, codec.align(MirrorServiceRemotingSource_OnError_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemotingSource_OnError_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function MirrorServiceRemotingSourceStub(delegate) { this.delegate_ = delegate; } MirrorServiceRemotingSourceStub.prototype.onSinkAvailable = function(metadata) { return this.delegate_ && this.delegate_.onSinkAvailable && this.delegate_.onSinkAvailable(metadata); } MirrorServiceRemotingSourceStub.prototype.onMessageFromSink = function(message) { return this.delegate_ && this.delegate_.onMessageFromSink && this.delegate_.onMessageFromSink(message); } MirrorServiceRemotingSourceStub.prototype.onStopped = function(reason) { return this.delegate_ && this.delegate_.onStopped && this.delegate_.onStopped(reason); } MirrorServiceRemotingSourceStub.prototype.onError = function() { return this.delegate_ && this.delegate_.onError && this.delegate_.onError(); } MirrorServiceRemotingSourceStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMirrorServiceRemotingSource_OnSinkAvailable_Name: var params = reader.decodeStruct(MirrorServiceRemotingSource_OnSinkAvailable_Params); this.onSinkAvailable(params.metadata); return true; case kMirrorServiceRemotingSource_OnMessageFromSink_Name: var params = reader.decodeStruct(MirrorServiceRemotingSource_OnMessageFromSink_Params); this.onMessageFromSink(params.message); return true; case kMirrorServiceRemotingSource_OnStopped_Name: var params = reader.decodeStruct(MirrorServiceRemotingSource_OnStopped_Params); this.onStopped(params.reason); return true; case kMirrorServiceRemotingSource_OnError_Name: var params = reader.decodeStruct(MirrorServiceRemotingSource_OnError_Params); this.onError(); return true; default: return false; } }; MirrorServiceRemotingSourceStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateMirrorServiceRemotingSourceRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMirrorServiceRemotingSource_OnSinkAvailable_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemotingSource_OnSinkAvailable_Params; break; case kMirrorServiceRemotingSource_OnMessageFromSink_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemotingSource_OnMessageFromSink_Params; break; case kMirrorServiceRemotingSource_OnStopped_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemotingSource_OnStopped_Params; break; case kMirrorServiceRemotingSource_OnError_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemotingSource_OnError_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMirrorServiceRemotingSourceResponse(messageValidator) { return validator.validationError.NONE; } var MirrorServiceRemotingSource = { name: 'media.mojom.MirrorServiceRemotingSource', kVersion: 0, ptrClass: MirrorServiceRemotingSourcePtr, proxyClass: MirrorServiceRemotingSourceProxy, stubClass: MirrorServiceRemotingSourceStub, validateRequest: validateMirrorServiceRemotingSourceRequest, validateResponse: null, }; MirrorServiceRemotingSourceStub.prototype.validator = validateMirrorServiceRemotingSourceRequest; MirrorServiceRemotingSourceProxy.prototype.validator = null; exports.MirrorServiceRemoter = MirrorServiceRemoter; exports.MirrorServiceRemoterPtr = MirrorServiceRemoterPtr; exports.MirrorServiceRemoterAssociatedPtr = MirrorServiceRemoterAssociatedPtr; exports.MirrorServiceRemotingSource = MirrorServiceRemotingSource; exports.MirrorServiceRemotingSourcePtr = MirrorServiceRemotingSourcePtr; exports.MirrorServiceRemotingSourceAssociatedPtr = MirrorServiceRemotingSourceAssociatedPtr; })();// media/mojo/mojom/remoting_common.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'media/mojo/mojom/remoting_common.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('media.mojom'); var RemotingStopReason = {}; RemotingStopReason.ROUTE_TERMINATED = 0; RemotingStopReason.LOCAL_PLAYBACK = RemotingStopReason.ROUTE_TERMINATED + 1; RemotingStopReason.SOURCE_GONE = RemotingStopReason.LOCAL_PLAYBACK + 1; RemotingStopReason.MESSAGE_SEND_FAILED = RemotingStopReason.SOURCE_GONE + 1; RemotingStopReason.DATA_SEND_FAILED = RemotingStopReason.MESSAGE_SEND_FAILED + 1; RemotingStopReason.UNEXPECTED_FAILURE = RemotingStopReason.DATA_SEND_FAILED + 1; RemotingStopReason.SERVICE_GONE = RemotingStopReason.UNEXPECTED_FAILURE + 1; RemotingStopReason.USER_DISABLED = RemotingStopReason.SERVICE_GONE + 1; RemotingStopReason.MIN_VALUE = 0, RemotingStopReason.MAX_VALUE = 7, RemotingStopReason.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: return true; } return false; }; RemotingStopReason.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RemotingStartFailReason = {}; RemotingStartFailReason.CANNOT_START_MULTIPLE = 0; RemotingStartFailReason.ROUTE_TERMINATED = RemotingStartFailReason.CANNOT_START_MULTIPLE + 1; RemotingStartFailReason.INVALID_ANSWER_MESSAGE = RemotingStartFailReason.ROUTE_TERMINATED + 1; RemotingStartFailReason.MIN_VALUE = 0, RemotingStartFailReason.MAX_VALUE = 2, RemotingStartFailReason.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; RemotingStartFailReason.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RemotingSinkFeature = {}; RemotingSinkFeature.RENDERING = 0; RemotingSinkFeature.CONTENT_DECRYPTION = RemotingSinkFeature.RENDERING + 1; RemotingSinkFeature.MIN_VALUE = 0, RemotingSinkFeature.MAX_VALUE = 1, RemotingSinkFeature.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: return true; } return false; }; RemotingSinkFeature.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RemotingSinkAudioCapability = {}; RemotingSinkAudioCapability.CODEC_BASELINE_SET = 0; RemotingSinkAudioCapability.CODEC_AAC = RemotingSinkAudioCapability.CODEC_BASELINE_SET + 1; RemotingSinkAudioCapability.CODEC_OPUS = RemotingSinkAudioCapability.CODEC_AAC + 1; RemotingSinkAudioCapability.MIN_VALUE = 0, RemotingSinkAudioCapability.MAX_VALUE = 2, RemotingSinkAudioCapability.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; RemotingSinkAudioCapability.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RemotingSinkVideoCapability = {}; RemotingSinkVideoCapability.SUPPORT_4K = 0; RemotingSinkVideoCapability.CODEC_BASELINE_SET = RemotingSinkVideoCapability.SUPPORT_4K + 1; RemotingSinkVideoCapability.CODEC_H264 = RemotingSinkVideoCapability.CODEC_BASELINE_SET + 1; RemotingSinkVideoCapability.CODEC_VP8 = RemotingSinkVideoCapability.CODEC_H264 + 1; RemotingSinkVideoCapability.CODEC_VP9 = RemotingSinkVideoCapability.CODEC_VP8 + 1; RemotingSinkVideoCapability.CODEC_HEVC = RemotingSinkVideoCapability.CODEC_VP9 + 1; RemotingSinkVideoCapability.MIN_VALUE = 0, RemotingSinkVideoCapability.MAX_VALUE = 5, RemotingSinkVideoCapability.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: return true; } return false; }; RemotingSinkVideoCapability.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; function RemotingSinkMetadata(values) { this.initDefaults_(); this.initFields_(values); } RemotingSinkMetadata.prototype.initDefaults_ = function() { this.features = null; this.audioCapabilities = null; this.videoCapabilities = null; this.friendlyName = null; }; RemotingSinkMetadata.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; RemotingSinkMetadata.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate RemotingSinkMetadata.features err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 4, new codec.Enum(RemotingSinkFeature), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate RemotingSinkMetadata.audioCapabilities err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 4, new codec.Enum(RemotingSinkAudioCapability), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate RemotingSinkMetadata.videoCapabilities err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 4, new codec.Enum(RemotingSinkVideoCapability), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate RemotingSinkMetadata.friendlyName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; RemotingSinkMetadata.encodedSize = codec.kStructHeaderSize + 32; RemotingSinkMetadata.decode = function(decoder) { var packed; var val = new RemotingSinkMetadata(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.features = decoder.decodeArrayPointer(new codec.Enum(RemotingSinkFeature)); val.audioCapabilities = decoder.decodeArrayPointer(new codec.Enum(RemotingSinkAudioCapability)); val.videoCapabilities = decoder.decodeArrayPointer(new codec.Enum(RemotingSinkVideoCapability)); val.friendlyName = decoder.decodeStruct(codec.String); return val; }; RemotingSinkMetadata.encode = function(encoder, val) { var packed; encoder.writeUint32(RemotingSinkMetadata.encodedSize); encoder.writeUint32(0); encoder.encodeArrayPointer(new codec.Enum(RemotingSinkFeature), val.features); encoder.encodeArrayPointer(new codec.Enum(RemotingSinkAudioCapability), val.audioCapabilities); encoder.encodeArrayPointer(new codec.Enum(RemotingSinkVideoCapability), val.videoCapabilities); encoder.encodeStruct(codec.String, val.friendlyName); }; exports.RemotingStopReason = RemotingStopReason; exports.RemotingStartFailReason = RemotingStartFailReason; exports.RemotingSinkFeature = RemotingSinkFeature; exports.RemotingSinkAudioCapability = RemotingSinkAudioCapability; exports.RemotingSinkVideoCapability = RemotingSinkVideoCapability; exports.RemotingSinkMetadata = RemotingSinkMetadata; })();PNG  IHDRTTaR PLTEtRNS@f`IDATx^1 0a%˒SdZD (ozm;Ǝ⮙zYE;CQ!bWàۚVU`]-j^қ&j5ʄ< j7)(rJe)IBK(AJnr.RC2$2GCRNUy 0׃C Z%h;o>8ܪ+VMIENDB`PNG  IHDR@(y PLTEjXZWnր_pCʃ6ƴqך8Uρ'L1ŖeӝdD0V,o~#iy4lՂA]Eۊf[)S^u5ƈ&${ٟBɯcӌކa3Byxz?Ƚ(;Ǖ7+èRxT%|fԿ.:zߔvؓ<`җrFPߩ+ܵtׅ܋h!z|-/*b= s@tRNS冽IDATxփv@Y%kֶm׶m۶mթ(a q./py qggn87_~]3eg-oʞCU霪Jjƒ¥:S2:pdVoMSRPEZZ`W땵JtT-[jꚚT-,WO!f,@<\wD>̊DYlon z`K aQlc$n(6mh6 ]&Vm;0p#&$ޞٹr6#%}EeW{Xk9 8|3GIcSѓBOgQ_>Ո|Vi_G*uJn8L|u}!fWp9o[[Bx_c{hyMވō&CZe[}d UԇB5  jDsqy@H,fťepE網UC-6\Pg"m[ZnW{W{X >g3bj {UdUx!ExE;}g2;?=Nz]=WyˀYkv_חľ.(Wv,"әN?ů KP1Uf4Nňi]uap]01M!]\%VWWU -*ng`M\ѵQco!TU0T;:  >tL\B ~│)QjnvG`\s&6`rL9̬wf=.EW`5 ޿vKJaAz!I`Y3Rhn/jvva D4xyabbƼKJݮ/29RSRphjoJ`g=o~$,nFuU3 }hU<ܡQCCʼjϤ\E"̕!1!==ȖYDA7o"&*D:;;׳( )rh>HNLH7?ICDEjr2˾+T(ԪTF&saN<yvP) 5E˭7@Va| iEkokϻwȫpz K^P:?(]0pQ$75 f*F@ںi3E-X"$(A c&  pغMQYQS6:1jjlb)(_NҨDYY755a6zBfY6(|1??- X*LNN100y,..~}hAs1>6^sss t| ~NB. y? ? ;n^F&qΝ>($+.Y' _ Qӱ̤D,s煰.;leU<9! asIDxط`M~`>DprQDp~Ɖ%]}dDH/H}8N8VH* ?VN!B;|& }0H)Ipzifq)j3;qY0blL}NED$Ƶk8w,>t]f9 Bh+`sP4xߴ`)).Fp@ .<=% ̌ Dx!EBBieTU *"}hd:׮\es F;PBJZU-:[eRtd$c]+IpwsCzj*}LQ7N ?a2:TIENDB`PNG  IHDR@(NIDATx횃cMXcm۶m۶m۶m&$c{nWu*o?k^N}=(DTGGG#I H"Y ,1 $HNNnGy$i, K pr////oUvv6|g^999S<%bn%{ ڇ[4mU+V =r{-2ѥc'al2DsÆ!40γ3g@uw;fEMQxŋQJU+U[7o[rr޹ Oo^д-n%OA +dlyE",8 WJJ 0i{v So6o܄=v3mZzƎץ׬Z-0d /?͞_~ r8xЯ4!W 3F1NI*|tL2~HLHiu?~8 8wDWwJѵϨ~q=7i捛K٬foYQ=J uTȚi2g f oW泆=sʕ ZUXW#qeJ^,f*0~*=zJtԮS;4kԘՎ/%XC1 (*dOi,}aZ䃸>xH:wAJYs^"Ъy 17x@ehM P0Lp\ }ӦS ɘZ0Q m`,E _~fHW._f+_ jר NDйCo )T:kA8F 1cXӚ_p*5˘JʳClٴjҋkx>HJQ#K4!YCEj3wl.s(1$5.m/;Q[? <(N,yI^Y1Axϧ)Jh~ o779^1TH(40ȋ  C'B#hԇZ)tC?;S{V+tZ-Sϯ[\8nZt4AF]KdB>\I!MkCYpFg.Dފ+췖!Cmɇ`.8c_"S3~?Heá I[Uags;+Xi)* ncORw}Ctx0u]76y{Ga<=> jy2OxeiIENDB`PNG  IHDR@(y hPLTEUUU~~~&&&888 AAA''' )))>>>GGGͅ~///㨨,,,555ZzvvvQQQ _sm1/".---^p 2uuu???r o rrr̵""" OOO'4ihhh QMƻ ~wjdSSSN¢1tRNSx~IDATxڴS{1Luڶm7}ݟ7 De>$eP!KgF $ ,0F3DRbI/vk{RoSГRR ߤ9܀oSy?ds.^KBZw\.K˔g`o?\<$.pv@+ʪfy%9Y`q u ]}/UOSuTM[Z܀ؖNwt@W@Oo @ GhhɩVh{%<{;VX$KJʉF.v (Lfg(<؊4R UBb j"T |Lq&,P3\Lf3m1pIENDB`PNG  IHDR@(4bIDATx؁f@}\%)(Y Di*uf70dĊF3xsW)I.~GPleg}t=M\ Jjp.+Q aD{%XՍy,+(Jh{R BH9Z-"# H2@8Jp^g@L;@ AP~j$s (u pBk2 -#PIo =rXM A%3U:2`@*d=5x@N9@;[@9LCm F\Im6$A!Tf=(n!Ip MT=`ikU/Y [>> APPJtPyp-@jPwX")A@҇TD 'g^m#g@ge&:@x+2;{9D_ҿ.,5Wڂ/0@ՠ9h}s@ X֋=, 8b2l ,B.l->}Oq9,@1AZ K#઒bi|Uk̑, ɩA+==~8 M^V!=|HHR8?$[8>~+Ε=fh40 9N)Wa>t-*~(0> > > >yPbKv$8)u@HI_ns$I OA[a>Ӕ; LȱB C #;t<ЧjakЏ\v$dH FZ`@eAK′C= PZxe4Πm6tyLq!Nt8xnA"\T09;@& ^_16IENDB`PNG  IHDR@(NIDATxp$[g۶mom۶m۶mۈmgֿ9n3=U/ڵk/::: ..U9HĜKU} -- (1+1W֐wb&v/zRiewNKCeUw >p<o"iP /M %C%X!.p)5_ K58p(=W -etw [aҵWA.# EYv T_Ş!1}1tϨ7~@K_8g>N`#^^¾c>^~@S?I& RPVyT^/]L/dOd78؛KD(T8]cH[(闌܇mТN;LW4)Ƶ`v}O9m;i'ڠ㏺ {IsO $C.g[ ӔM06~p ö>)0a5@#E3@a?N@@L~Lx?0EI;IL/?Xr<3@5~yEPZB=AKLO<cd[wCO=Fh|{;Mp݇=ս 9. Ʒb<4?bKւ_7r"EW ^W2<+,uKTnCڦ/BK}(uxȳTJFN}غ 7j$@I; )`6 ꔜ~M@RR*qf!DUvIBB@P PR @% rB fs0y#m[AqPlUUI}'|Gei:c4M oAy7\EY, Q!cr (b,K$\ׅ$ d(LYalFϒ$ }߃vB(+k3B h! !!~@T<5۝o\8i')꺖Ia( o4@ N9 2qmE낪8S u]a6=eY4,K,#q A4 a&Om;lu]ya4N.*躎(h/P$kY{ H<>"{  1?=Q(IENDB`PNG  IHDR@(y VPLTE;6=8}B>>9٪]YګئIEmi޴HC|ЕiڔΑzvԟ<7޵LHDS]Xץkg`v8PLE@QMEAtqykiԞok~ʫ٩Ӝc_?:Ұۮ˷B=ἼSNVQhdUQea̍yvA<ع߷JEfbҚjgפGBąutRNS-q*cIDATxC@Jն_m۶m{f>0WX]f0$31  sqyw1F;|6R?z\M7DN՞+U3 VODzj (+Yh&R:pG~Z+ M W"(j/PJwtjeC> 6nT ,0w?bf` HSO:B[f gg PJ  DV@rF⒄ !#pK_xx"+}@l/WKI.\sQtدUIENDB`PNG  IHDR@(N7IDATx#g?۶m^۶'m۶i93=6֝ٮ:շ~* t#uuu2f|}}}8^fL&13v eJ)5ΦTrOV5v7jǗgxb?js5]+n11Noڻ6(ho&^)o NiU 75{gptj)/㳅lfXO;~(Ľ\)[k/ޓ˯lN~UKV[ϯ>=N"Q sI_c!_]%@IIƏPk0`:>U+ 3 }hG1|8`bt -O|/cbb#CP%M6j ZP#KVN*+] i /z="1gOxv%)*u|O:_y[?ܤk1 NPHr7x0ʩ/l;jbYLu[̫rZrT2!Pc+>1PJ;ˀitkgʀQWtNVo$`]<>eL?ts1Jk&`Yh4%FѦjc+ dĬ0O6WZ\RyHDa8薂7 V*C]O/dؗbʨbra~1F’89N5%Y AP("muL?6FxI9jDyŔ3B9CQs+zq%< (Y&QZiNק?]A81kg3Q> f%!QLWXj'ō^~k%m:(2:)-;7eH:M_p}Iյ 7$ FP.Rx8fl$@{P-RMN*޲wWŪx3 <v9'{Khh\5K]GtRQ\YFG+<#rBc9<|I&S)Tc?1wpg gIENDB`PNG  IHDR@(y PLTEUUU4~;@0P<65g~Wp~=8NiD`ku8VIdَ–&Gl2Q>\n:Xotrϣ̜͡pi舚.Mݏ>94Sˇ$E_wLgB_`xކVoᦴ)IMh7xf}Uo8[t?\#Dy(H1P%F?'HбA][=T7Ƕ?( Z5o}/[wQu琲z^w0@H g9qJR\\ܔ$A|ȗ()) o_C?2Ɛb>29]u{MIRM{q#>u-G>IENDB`PNG  IHDR szzgAMA a;IDATX c`#=aY d`b4#,E܆_rd 0_HK+飔;Qm٤lKTax(OObddxq #{ >tr31%LDDmq X8w##k&VL/i6=xң B>XzX!'2Դ4tBsB>$V,<O9,GF-n>#& "`SSB=&d``WL=SGM!y&X7IENDB`PNG  IHDR }JbsRGB IDATX W=Q~/qB68HsrXب`g%h%l.v"6 6b'""VUlKsfu |ͼy޾5f]/$Ht1bْs Jʐwu?FҮU OՏ?Ed}VJlT ~Uchϒ'UM!$H~xz3M@NZv}%sp. rͼrk;Qf=P+ cFYݓJ&gRހs Iȕa 8TxDZ@܁0I~ Uj+$9޽08v]Adgɚ[(uCiP%EAI9mVS I*y9ڶ(˞Ŋڣ \ϸzOV$p/OG9'uJ6'qsnO^O@PRաxIGI7sNǍt܄aɹa7ƺmZyU&mNډY]I8&NWZ3Jx0bXi (,}k oSΖMCm||<8Ja;NE9>+E龀8FB۱DlrCǀ[,mvq%ݮ>kZW|!UہTq{>1 |I/PR W|#@x8cPXH[A6$ԡqsqwPTIENDB`PNG  IHDR݈pPLTESSSi'tRNS@fRIDATx^ 0 Cpb Fhh PX  K9]r9Z*znK)RN`ZzIȔ(9ově.W4 vIENDB`PNG  IHDRV@AW_@IDATx{t}wÒ,ۖ.\^.vI)4 )1! BO9-90yjNJhBz*q]~+; XQ(Դu.)=+29>*=db?9Ҿ< BM;M3AHgLbsVu5rV XQ(Դ;&:6S~\~>…*7O?ϼW B4Xo`7+H!0X}aIC}[P+ חv2}QvobKw-}Hm} TR;֛fЭ#YSAG&0eO 5;x=se>B& `^jy/9acI\%/15 %}%?wIt~tƼ0M/9JK Mo&c ` ϼRQ4ݴK9`n!:>qIs^+#=XMRq:c$ O֧c@YHX{:cٵo1j!Av7[:\Q|-`鿩?UZV:\E t 2mF fVjk,F63OyS'3R:괊h$3LҨ|>16mFP)ƺYHZZ!bN]&q\׵>nEc` 2'ZֈԵ_ɾs"shk7oĺ baW $S=Olou o^}b)79u( oz; f!ckKwQzҵظ?sdۑ<;npUƙn9ӫ(:Ùz7NkM659(w#ݿ٩g$)&Xy3iM3g5xpik"KHdEYYz$k~{;"?nl]Z)G,~9[σ̸=z27mfC}bB6=RJLs+;m+pqM!_&W~zi-ET` k\1\uT5/;Ùʆ+"3>Q sf,G^9JqEuʅVX`[·_?/6hÓ{ )[$Y΁dSaE`Ks}CWT9vEGw}KnrgW̑*p5Lx&Th)Zz[T6@=yuJքۑM n1ĽG^wR8050= M޵me/Q8=*<1<{>@K+AQs8/ӼuLMZ}. ˝V\5"XTcc1VsoE]evYx|aCbQTUTmZK\}%fדw amM'ŎW}`Xh5NUc`8sUbum |}w^5(T7sa¤5ifyQxݎ `W#aE-ĊĎ>8m Tߵ ta*u;ۉh*b*FCC/k)!l>D+71am Ӕji'ܰϘ{g1oy7e[c\_ g7J ,I3XIouڰ_q0@[lؿom[B;N$XX =o908IZDyPu77:)`^KF㦲+h..}_@jW伕d({$(Q(>IkZ;t]=}[j;&O~6i& ,~LJb-j.[ʽMz~P`Q{M3Ȁl"*oR 6,gk#Tu@ V VN |"X |` kX(XrN:8 OC@7#TE G>4[x>&l\5?˶ 2\NLZu N BPv!(X<<8^ ><$6\N`^S>1+ُ[KL"hF Er(@sL4*1QۻiA~Lj!/x:A>>_͌ pt3(ư`((`}˫)amh^764__|ar ~}.ҼnYEQ Սe݌M-W)IMQ.qMXm&7ۆ֭iPw+EQ$SSƿb{ݚF@`!j\$oTX9qE`}y&X)z&` o}ru@QVlqNIiG"X)$aSK+kSŠU75(MjR?lj~{DM+OVK5bq ui{eu=b0VOXya|zzy]baaEaXg혚Aa' MNjj.`HR°"J$bV1q /`.'X `h1}ښkXb-qխbÊu+J=r =:yE)0iE5V:kZ+"3O0j&fV}8=&D-5WVlw*:IoŔ>YX>N mN my>6V5kGÚP>."M2lJ/^ #0a׉8jŏBÝ>j9TlTX_V V#W!H "z 9GУ} QA +ZءVzU̥0nv/uF{a~k(xr?~i p:I ۪D jd?j/+aIq?`:+Quº:{c 8=0#@T_lÁQ:fQ!5"Xn؅#]=PzfU vY'"O%Q60S7lkêMXr]ϿPUvI&..ˈw&(924Z][UL*kn(oau:Px+E@YQb?6/ E2ѿ*`M ¨%BHS{@HI].`~*ԟ *v n߳zQ2{dPPb8juQ6(FHwyG, hJ"=.?BX/81ªS9E\!Cdu**3(W~5_X)rxiadՂC%h)KFe=eJX?U-~mT (:QoG*p%kGuN~Zmب*LaM٧UޫXYd2$ UgWZTί# d#g`}Z#Z`bSqZ6qX9Qeamq14_' jRXj}D>`qeP80Xc*L k**J41VzUcIBQ?`B;j{5 ~)Qo[dX[;T+ IBk3*ڒbi8΀Pmɰqʺ`oZ5` 5X<]zѣկJTY B+`Xw]迢` :3V` 1Xf~P`~닝'O`!Peoʨs*uWk ֈ`݊`$XC#c)Z>;TQ*npV['GUs`~@@AVa5 ֐; ˢ|C֡|coyU,7Q]pu`U~U`ԫMXտL q;f/: z40To!w4Gnrk_%>Z\ӏygYl[zAE 3YΚ#yUki Xu>̌%kְ1:53k$G墐3B_zCɳ$uWΣ܏{ %'-RP*VxA4a'f5%P?q=f$XCy{{aᨪE۰nw04}g_||^XEgmctk=f%XbT5'k!+ӑbr\,;\mtQv|m st'{`oy@rXU?F-("e KǓǓA uv8ke(y gՂsv|@h՝5wdE:~P*zQ:z,iV찖?NPYXl [v+un'(u֟;yAŔʛ8Ziv_1 U*[f(`U.s-q8%S^| Qzέu*ABUpڵm;TFQ+[3#/ϯuα-}Qm$X(`eƅ^xr:TcK>QgePo#^۫vj|m%XC""Xa0ea $#@W?#pT V>rFE(6@q;|vEՒRtN6Pu^<e}V'*ҟ* ~k=+EQ+tΑZp*#*PlV{$aス,ʀ/PK~)pʑ3*+EQچUf=7&:L#VW6S>2xU?uJ |>'~(mXfϜނ9[-ηHھ;aZs枰;0x5ԯ`(*ȰREQ+EQJQEREQ+EQT7^ 5IENDB`PNG  IHDR }JbsRGBIDATX W]lTEݖ bmB( D($ڀ @?U(1&(O >`bB b&!$o{͖{ݙB#1&I39s̙3gfkF,Gі!d',ݚ㙨x4YfbQ5\alt(LS3: x`=U4leWo 0cplF[V4lGwJٖ$V@x1ɕ3n?O)DVTR=ƶ5@U\*mvd~q~ I֖t[7͖ lQa̰w[z75kF#6= #AnbTmu3Hv2NY3⇒5F8OhRw)k:{LBG8y5:xIԒFw[g9'1Pxp߬,'' VxŎUTXpuIw>-ى:R|%jB:Xy.bG#xv-}'~ +hƝq+yK T+;9 \?*ޚM厃ԤWbžJX|5 9;,)>f!`[HH?k a 轚nRv*Pz^:URzeB+7J Oz~m,*ZU tRtߠ.3ЇoV*~zy11]J^d&2='4\A1"#{{FzUvQ7IENDB`PNG  IHDRRl9IDATx00%wnkǠ  `0 `0 pw} mx9'צ{MYkb2蓠ĨoO*Š8S!Fvη:T|)t>Nć@i6>(|Q2IoL}{Df7w-ĵPDLjCScG}0UUxYB LfmqtݕL&?p>whm2RorfggCT*/˲~`?]hc~~>V(WVVҊ3z ;;`uyޣh͌gl6D7~:~WW^L??zx? SO/]}w/^V}!@+\8`"L _'os˟F[VOGw)u&Y`j}MNu{ ܑÛNB"H?>< Z}_>vRqv?Ƙg!B܅K.h"}y4DpnY &'psg[_Z= Chps:~16fe.m$zgtS]FzE۴p5 fuN3~Oo #p3p:;qCμ^@3h yV>DOxk58 Y6lFiћH:{vvD7\B\I`3 obJ[:{! V>(vА@V=[v5ڇm._Aorb%ǿ-K@BA,X vfjnk5]=]A!Pggӆo&m R(g  _} &UNچơuhw(w?xvssxwuO~" 5SC} :`,Ɏ]O&9;ݣ;Yߕo{}`^⠸>5 B&]bLhZͷ @!^Ka^zF'qvk \6D e7yW'}Nw=e`\oہ{դ6ʏE-1ouh;|rf"'˓'?̈́2~ C!}}/ e 13Z1&YݢERCB\n(w `:߿{}}}-7b 62{ XR8&xX!?aaL6Xqи~)ԯI~U}=чjed-MFИ!)4w;?odn:- gPcgL@E0,!8\ƭ&L>CR!=`ML<aI}W@mXWAk@'4tյ&- \[n%kY*^Ě0V BF;YI'54{$9X|>oy=MQ;uE)>\U<8x]Bj06P[h_/}:!h%-NYkA]![Oz $nK*"h͠[ !l ~#! ɢ5e`lltk$3l>…䜄a}uӎ}}x݋>uV㤡YV}\fO  ,T?o; N&HSf=\}{ aB!_p7]%Y qE2 ژtZsA _'R[Y9IC>Wh[%[@&NF7Cg:¯B5Nn<:9ߵ/*4FqBšͰ}F}n(l65ɏGp w-dMI;d33Cw d)ghq\CPv91Y0s-W|S{G|[Zi;nhQ,N!Y{7' #ȵ`M?IHE] Pد(N+};?¶53HS[! dfPw$ ^ $Fr/shs1Ԟ,X*!S[Ì:Hl K%}+O&~& 6$Z$^琉o CdQȿ(k6!^[vq6s.H3Z% x8z͖-¨zW 2aWA[d<>Aߞ-PwHd3d9L88ZfgUkyKIgT_;`@ 1HC`2 ; (ມ%b$WY*v@>~eZbE^x5eZ,!߼>EA? }y.s?3YDl` Wgm_\B'^c@8v EAE6ċ+F"VJ.bX3DPg{ sǹ>@o?~ape9(?]ODPdYl ]$e0=RG]Xw2a hyXձE*pA.`M5WZog?qQ1YWE"ԾI*jC2j'eXw{)2(bD_"wm?*o'/_+To =)~Ui_@\ͧ?=-'>`0 DyW7S_eeY^L^D`$e{E]$>vB}#~ȃ9.g~xxصSc<'z- o=>Mc[½HI8<a-˒ e&uEz࿳ k"= j<=~5%\{0 ("*j?:ɀ'ID3"Lr1 $D8ᒽ?s:憅lz@# +0 6ɧ's|=,7A6:Nhk,v2C"-sω}'R=`BTL{Pc)R3)σ%`ꃝhתY,o&_w*}@Hf=p6x%`r$k y+7H,<TR7X"|2u>Ok{>p>!C>L_.# X"Y5K kf ]@OB.v}և} ~!2TթohM#@cp@Q".!# u|}hPŭ֔"A^L\v$SBYNz\\hP(`3 v{2Wm_mW'vn屸]Ayw|& )$SGuHwjbFާE `w~@na:cP]%냾b}l`ib,n<]wGkp]>x^ ݵkm6w`!#L,B48@ $`^ ~Mz|],`YV&t XJ-ϞV:KdiT)O̳an}65By Œ CfЛBvvDY1'ۏN$oi;,ՙߣox*J>M/9&f6ͬhC>/oifE$T#ZE1Y!,Ԭ OVM"k}bI#26q7/n?(S "(Z'C) @G7h"f*_jds/U ןa) ;]"}P3Boղ֕R# 4Za6tPCHI'QQC,¤ʃccHa#GW8Dz"d<.>_e*Q@{ /Ogk8Ww]mY1lCRHݦfB!`fOXعRSfٳH9c y$uw>4q۪1G'g?N/RV !8b҂ 2c܃ ߺk4cRR䛊W R+ OZ+c V,,+gz .{&z2!E._x*TzdT j,O 0?j2߬xAj<@λ+'ԑc&oN!;obsC$dY,ӗ|{x}t\x|?q.@ͣ~%nѽ柯??X\^TY(6MПJ1Vl۶uӠ6 .0-@ ϧ^М$86YJ5\q+B]|jyhY/%>e8? o/.garc:ƑE>DǪQqiT=%@T́'°xFMO"|n0]`wgT$`8MeA (Tƈ_xb8~R"@33cW;b)o\o+/DR Ow>.8ֲ\/ q2}/}NC\OQm`$T%k JTiFQƘUo_L~99y[)%~P4`@~m?}||T_K ߗ b(0}<.^^"qPUj;xhН&^mˠb 0^,zXlrрє@.dՔ yD+ʸ?,_O''?TJ*b Oe"U1R7''6@(c\qnO؄aTߣ8ڈw|_WD;Yƒ.O"$T*Nq,4B-*RR&ExOu8­+@wh,Xa=]Yyk4$aRpd%#G1X-EIpF8;;#~-wJ@p׃Ni rP,#oJHڪ %~&=~-5`߇Af)5{pS<JbKYՊ}5j|B%8ͭE8|@VZ[P&ArfxUEMC!8OvhH8 KЂntG֗CߋE80EN~(pXdk%_Ib 9Y5_-]5<?ՙ/(cXEp!}Y?&(M"~_B<{ aH{8xdOE TE dr(9rp}~q)iK59|u}yag|ΫKYJt@Ѳ$? |P'&ϠW?T Gǽ], >|0gYhF`q9g(` Ygqz~޾-lU9JPP(C*<c'i 2H:!<>ɦ[0fXv VGEiP5է1P#E(`0bZ&`: ™YfJVhXڈ+ˣbM\B.8Aɦ(*0ˋF*.>X AjWxiˬW0,, e**hhS\j5LJ`1 H7˼Li^z uj[YߍQ7y.xaaiFhxIB[[CeiΥ3kht}S -E`Bjб= sˑH.]?;d!OzC;F]%@_#}~~n%1/QaOyZ7Ga:$= P?g 7/>{_LJt3YGa;O8֩;d3:G9D0P%qzz}?mj t^.z&e{|j,Y- c1K.aF~hZAI/*n@8d0Ik,L=5 [F=:QS/!@=RA SQ0A9˽LT ߑLZlN#r@$Ԁ .eXx\A;_MPF;k!ܗd >['b"^]P>VY2\ڌ&RmN'׺.ZvH-iJi sia2ڂ5Azep ^^Tʿ:˂a%$̟_M'W"a kSSܨɢ/]scI¸TV\w[49Ǚgg'օ; <7" *=eZ*D u i}ZU-ؿdOI7%OϢg0pSXe5L v)vh?!tBz0WaÂd ~h1ޚc1b]b{[78Ń!@+#OΌ͇]_u}~Jݠ ]DsWyZS#8ւ"dL T~+Tދs@ IQ$+Q|ݗ?u5gP:[#,"hp7}ߥI ͂ td֟';AX}-ꇞ :YNSEM[1zAzu+(SD e=nZ]UڷҞG;4<#h4G[/c@>{l, bۿK!2vA1<x0ZHYlTq]L_uy)}l,:|:ԷA<@rT,7{նC=~tN-)hP(PJK 6#]h>i:YjV-rx`0Q@C@2 Ј \ڪڀ 1VAKz\wGq#G59#!:, ףC!Sei͝ackr=l%'-9z"xG8]bɧۏ7Mۣ4I3HjLѸEWZA0\5ۓ- VN-0$҈B9k=Z,nv7o4/z6ez޿݊ z0E_ m$4 / [/ 7'~B2 !R=@#:BgR,~w;״,{轨i.+\rFg>@_o* iiX#j{J'~k!>F#%=% jEV.`CG+$sa}W+YC`cƁ&*d'$#!L0ڥqIb׳bͥ\&ow λfA$Ϳo}(3̾4r/HUmN_z;f+ I|&1.}8ϐ 'C#{un- 4  emEoŒ~u=Y}ߛM&dRP,$@xi-+ڧ%C~$ߓ$ 5qgw֯*?Ԡq9ܔ륕yOyKQBw$`{M]DH3$Wm"B({{k"Lя:,dp$9*Pxp WUDW<{$FY^zD Lg= "\] ѫV @* I'G9B;H,VoWt2AH&H#'6<߫Z\I?>ryY^$%k F$b«E`#Cmxb|0$2 iS-2Gb. zMBX}9AD~ӇD`E'}y лCKOߟͦǃ꯵qb{oU$&^YRtX>!f`IkUBj0HH< }kfEuzv1{uj6!(B2Bi}>x[z:ܪ=8_56˾D$u?n/F_GXɀ #'9x~S@r桟$AlU(a˄IV'4:>922x3p]m<.?::>ft|z>^'T|a,m$ c gժtHz>!#WO_v+&BȢ4FU'է3ϟTۜEb$xyAףӱIR~5c>D|wa9Mt Eš~wH: 81VoJBh-&)"$ 5D#;tkg^vޞW٨~^[FTǏS0G G6W{Dž^S?:HI  z4jHFq6 w)*jNv|k$41 yo=Fٌ*:Ysn -cS>/_?ùr%I<@# T"!ϻODM'-}y#`%b|חOwTPO+B'` ? ,H" uNY:BMiAe9D&&؍izrYQBd$qeaޒMaI.w99ŧ#1HB@##GvIimaom(-ISڦ!M/=|KrIa( D aE'C8d " lq^NhxޖZ qk^_~.J v:65\ $X MYwmzAСI6T^rbV@a:x\?_=i9k[ދ7273U%`ktRAz/J / %ۀ>?n U!;B7T4K F!#Ay,B&[ 14{^nlj|6@߀B, MBwNή; p5>X|yD'$ AA/JYU\cQӣEH`|}Vh9+/?H|HP5D AWą11&nt3Z|!3a3>ϱ9;6\g\g_NTuW0|22jԾ¾NOE,"E1A#4F a}` !21XץcאƧm߉fApR%Բ8rt~7S/pO n@`FY9Kt!\H "a `%:M'n8iG$Eay 5_0=Ҭ>ɡj`UCqs,]&6!馹G[367Usӫhv` uxyz#A#`̘1/%D2R;FgS},ӭ|ɺk#ާ} coGͩ=@=7A+'?pcX 5ch^@0(c!:hh!` ۨm  3>~d;RksZ_k0Ԝ r@U{/?7 .FGIJ@d_ۆe]%F^6a4)7; ivn'߰[FpM[jL9{p\E& _z[[S$(v걬Qk@$u!6&L1K I{|"//ƄupF je5SF2% 5Լ Crl,r39~h}vCíu - w17x? %v!ݾX351cr,ԚGzޡf9֯\KYw_gO޽z{n MhIɐS05H #Ӟm)@N |q0hFh=E*J3Sӵ[s~ujw+ Cr /_sfFpo}>X)[A Il<r$=@H&#:0оkZiI!_}N;0 Z(r.n ͞|Kɫ{x$};> ҷp4O's.H ~\1M3zU X,s]2::&PM 6V 6Z2lxmH$Bj?`#Z e{Q^[[{y߅qF- F؊hf/n~ pZLs<v+?9=` lmXlGA{:Zi>O\ 8ԑN閎 6ዟ;?_AzuiirNNNrQxJ 0 K;R ݳ&@JlF&u]YXXxFW#,+u5XHpQ!])1\,..f ;==&߲d2 D333+7ࢠCScFhaH@wУ'86 4piӭp<(pWCvHh0,; 됚PE N?^h-q&*: Q#VMܑN /` ņpn->IaۧAփ\     @5ZaIENDB`PNG  IHDR>aIDATx^I[[k|!ui` !V2)BIV=/&̇}c`ZX:gmMv^m=KvZ}؞iBA'@&Yy^w>Y^?cUQ\kejpe✷vmB>+NuNTr׷N9J{FJ*ޝm Yx|bh/(mt*3qPV~Uۛu0F"ѻX(gaaƹ]flW#p\]^7W7.i]> E=r x"du07{\SU7W%,ΑSm#Ⱦ-}H@ =hic8ܬ×:gv-4Uuh`~a#Èc;us L]:|Uh[5/s<$/ ]~[Wdnm.k|uZiv!` FFn^l~]91:Ww5>ls_ Q* /zS=}fݚD}>zeE% 5yvdt>)PXb߫06@}h-9w q~߼dlsv o}IX^MQi$tē(zomE]cYH {GRȩOtHg}ǀE+ 힗. yP)%Kyݛ7rךmR م&ZXbY޳U`g u)ZG?>x'/7 to4z- CuDmfu3e3m t/W7<>͓(2pױH%JyO ʊMp;7k޶uL+ɇ3o>llF?5ԸROL' @YldKk,kB3ʝF/9mDՃ@DK=GjYk-~+EK}V[sl>,r:vJ۷_lmL~^m:jl?NL.Oapɟ󫨩 fn6ŀb_Xr_[WZ7+k:8G}1|㚼z盘\o{{'msuB4pmy,+;QJ0KHE>1T1HcnەoտO×oF~K:dS<րDP:&0b@[~W}c`c ^qﹶqB ۈ4Pƞ'$ZO/"$iX0>qe F ^ψXˆumf`bj9NvM~/'a%S`%1 %svV/(%@k/LB #+OL_~I4Q*ĽҦ5\S<2,s6M=wo}š3BFK(dHxXlU8'l-nV zD6.ÂT.C@ C6T,(uLK3 rWcr^2Q+0Rb_0:/h wOkFS"EShp̴H9u=.~xמ  Er F[hiy%tbBT!+hi"lIyda^Iv $CefRϙy%%2+ м)a`s B3_Rԙ];F|sd{3אdHP,gN')PWmns^5GElEM6k'bY{c䬷o5~n#sH8- dS|N D-k:'$ inb{۰/l8.㪆JʪHÉS䕉%:HzXD<$'=׊pU m ڷ3MVPܲ^ ?O-[br xjPIeR7I'c`\0۸5e6Į;mm'͘׹k 93ވYAFwMO A-rhXTQvsrJVPV`2*>]NbB5Mc(idq{na3U\hmseҡ<DF"(ƿa0%'O$`+_ U jZeY۸,SD|=a$-JA~IxU\y '] f=ؙT$~>a/5iJ "s҈O+3'xUФYxm(2(#IJg(jQVt\hHvWN6"jLKQ2ȴc'Fd#d ݳH ʀ)E|6a0FB"Èg/WMNF*z.:y>MU&D'7m9X <2S2EdE_._?{ݟa((:K77AqF=TVd*̗,h$U^Yx`%5px)~J.?ĺIZBawg'{`oWuoe&u+ @j5,Wx~]e,\F˨}c84h5~KvyI.}ϴ{2iL-r;5/.l.z;=-,D#KOvWB73fČ R_ X<\G_W+128n'gV#)'ͷ"oĔ0.0#g \L{Ҍ9OP/L)E3rVWVE'r6C/EBXEj;/Z6ǐ K]VbϔI|m0XILT0<$ $Y6r' 0,:L$9|UĈ$x 2&ʗZ=b%HQS8!*&A(*T`_rr LqhaJQ›b/nE=9@B^'"@%<jaTb܉Cĕ%vI1Ƀ 74d2C"ђTXI'ђ6Yp% U٦HTQlz^@*Vr ̖>V#Xl[bbu|Y{{'~x;U}zV OӾVcNFY&?- ze<^X(vq`++ߗ/=KᩪϏcJ ]nn&w wW7#;>CXb)<+Q6ҜhqݤMeRXHwRY օڥUkYnXbH8IG19LԤ0M<3pIgdSb9>ՄAL ~bܼƓK_ԓs$~{O:8[<)cd<IXbG2gEB-W[J&A֐r+|״%:Xe  &WHpr]4A@3{X^St 0dzrGJ6W De*W~}MbBP:?1%L]& Oe5TCGKďbq}es{]Sdžd1+ ]s4a\pvqoh؝|[mGw<'D_446Y!>@ _\\~4{ǞAdlj%7 >iaDˆ;2t! Hے0& zlgT* T9/ -W^ə!K~Q;ǂ ;)tMxm8`2wȸ˯sLy?,ۉ4j y~mjm$rv !+mp); \V/>(guh "ߺ )_&Hؑy xtCj@P㢽|mbIT'B.pr)(-0B)/Hlr2HRb+RM2 p!qc `FjnwC Y/}DxsRӾXzqit`(bI.]0rg: Ḙt&7{4B(k82yL5c j;"aK@תj/29YO S-E<. $eC'%.<9Xg u#3CcCLI5imX%c V-vIENDB`PNG  IHDR&&4!%UIDATxֱ 0 A-i9+(AFH #Bsf!_ k?#e̘1cƌ3v &]*ڪ  ޮSIENDB`PNG  IHDR``j PLTEjjjgggiiijjjfffjjjiiiiiikkk5! tRNS*WS sIDATxء58dTDp4$3W-'w;,yT LX2F@ @P/~L81'EOkIENDB`PNG  IHDR**9i pHYs   cHRMz%u0`:o_FPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~?1tRNS@fXIDATxA@@r; HK[veN 6) uts r& ԫ([):>))W e*Ą 7S,IENDB`PNG  IHDR BIDATx^kQw2IZk- q'+uԊEq… MJpa)*iQ|mMҦ4LÝIp!ΜK"„fΞ Xxd3L*ΫǽH&T%"2L8aGMgZ%mu«CzS*D U- = %t%pؑHU ;ط;PXy"CD B+ICcnPP=fO BOOh^g wlVXR |$_ /ndnTj*5gLc+pï$r2g|* h sBXװ+ȲUT(_ J1ٺ*AB={?F 0;,'vKIB?Y~-RK2 4#uz(B]Uz,@&Ș)L#gEPޚ_w ZW0=|@\$>&Ж سS&{X?%xp2Ub!qBNX7&b-LAku Z,[bXaKB8+oKfm^GobI?U^cP/93󗠛"d6c99XpI-H<@TRƑ`9G3ya_)eb8~úh'|6s &%|M a\ =^i%ɐ TT V83IENDB`PNG  IHDRr ߔcsCl0`MIDATx^QgPw3Weo! /0|,"S~zW0a6ɾL^)3)r\B@Č_6Rz#Q8cnY{}D|zc}5 >t,5& QaLiөoHHQAT]#_T! )j2Ȱim5JW?JuO v۶BB(ETsX4Ě%D_@qoFIENDB`PNG  IHDRr ߔcsCl0`MIDATx^Ag\Q{7!RB(a(eha4UV颺(2dJB em>5^s2ͳsN@8@ b<#( )A/0u N 7Q }5_D F|N1%bgT0TP"9piJ& XPXHgHKEY`YPհX8kG22pғmiZzAbF+<0:{Aڱ"E=ʫ8A `'cFs;segiÁ-\5=٠bCL  e[` Pq {+ +c.hJIcGu K۾<~ :{}vg_viT? M|2N}i c9:wqΎnrqg;&wp @`Wbs"<^o2Ϋ^kk."Qm__^3d H8QE씝`*1w60nQ9\r$Bљ}DjZ}PDKJF^ޥ܈Bj -5ry(Ɲ]3}SeDsu{SG/]IENDB`PNG  IHDR``w8csCl0`MIDATxShHo3ƞֶm۶m۶=l}e1o kM)RJ)RJK2\\,!Uޗ>Ϧyϟو>A#8N7sRW}NS%F%u3Q*}Iog, 9$ց/Q4r(Y0WOu]z.uɸu+] 4@4@4@zf&h&h&hLf-GWn@yu-ô_ tp2w|/૽&@fw$c=.@ &9it>5.9]qvq0c9!)!IIMkrGNMG8cg؇7I}ҧuN0DTm@U* c|V;q˙s+tVV_c6me녱nR#^HgZ  +#c|Jra ƆMiuOxyZ(1F$`֚}o5 &XEg?f !QCҍ2|HyIlʶYN~cMCVc4ҋXhQҽ,1^.#Gq{z^KTweQ(+>urdw}ۇOD@7 Lg:[I=Ho͒0 >E&g,,x7A찬H e^ibl"ݥ¿#7cc} RJYR -sFOMg"sT azơͧAAb?]ݹnmpw{)N⾗{`taxޙuSGz{KLvGzٞj2# H! R>D*jLJYR?|<`1WM 0>q6 .BkH`C|zk uXJNzz+Ɖ-B2}AFk 2e\,2J] UgK7%e[vi."Mnׯ ;'M 0 {ϮVAx]\ -,çV?2p~hRG!}D$vHFTqE0LŎ| F ܭs7vdxKםmP7/w?bIZPOF" /½iJ0uW*Y}EDEwDIE{=FZjiUsvB1eddDvkӘoËigڵa0wcL\Ϭu__otoLfw 榟p 4܍vt-3eLE>3T JQ'3QK37ts=V̴??Qwq^Lꪡ;Au#z-u:V\Zb7էK3x)`3A elemΏtѳZa'<M pOK=a'q nM-q]ѭC5z2%Lq(T ֮Ozu<6܏ ,׊LD),3ס zrĬuK M<1'g)GpRNY 0Slӂ0?g!$}* 1,ElP$Aw4RLy0?x<o xWw6LPֺ`ŷߟ%{ zsZ2EkEWe(tp[$/" ^\x*#z@Z<O4ׁ`S7BkM_ɴ> }59#]hL pCB.]075Tߛ7;g{1RqPBG[wb?71d6Ps?/A? *X## J$µ?4%P~rc>U|@}7JZuå?Aفinz +\ޠri=ωE=nR1k0KX&oApPs&bןևl;0{Gsl63Tsb6fmlք/׬Yf80Zh ni gg1;6]j*hI\_ݛS-um ٞazU/}j[޳I3li6ޢ?*80VǕfx=weÖ/6jը֠ySכ׫XCzc:~ofq㥬7dQnԠ,{ m3 lnf`^[c m {Q1׽e_ AtNoSi1o:!y}nݑ暨5*GҖZDjM:] 5$#,THwK:lJ 訴u讻[_;[S$2Q' [Krnb`52-q\ؕZӫS:5UqoZ~MYi Z wˊvr:@U]/&Zֵz-٬ϱrv{w*NMbkp`oӺVӼ;Z3(v_i3hjFG+ۤA؝NTki?D&16,-Fͳ+o{텙crbPLyQc.,Dɛ. RkӚ\ຣt\K˘&+ ϮM0|ѷDAhQ*bEuش3'(HeʱTk t&0,nASˌV4uahj['31\OvS+c2HAyCݫ)wV-#RY{'X~W z[&ʑO'A!e/f+RU-[rAX\ sUyV%~^V4Y5 c̺E+\.`E7Ί! ,'!lI8Wjb}FhY\Xn!7=C-Fnn\ bdMl])|q86aMylbͦ/ñ+]!hSZTf|G+b >oNEټŴگWD!pŰZmz[1iZp\5W+Y>M++Ϙۇ,7 rJJQ3{O~[ ܭL\t4iV1Ӭ-MBf5MZ׹~~k_o} ZXIm_LwB@[yfqW9 Vdddd|D<8ר IA9aiS\0).cƥbnNƏ悡 }=):ud;p3dE@zIFSKAό9C%fԁvAߏkݴ`jen<6ccH3OӃm抹2ܓ "ei;WU_Ljs4ݏIW,'jqjrɪ}* }V5ҡܹEؽ&3sgx-`x@=Ozd*1~|"٫VӢ/j~gWZUAaV_oGuNTx TKa\wWZ>0׻[Vt Ah[4wX?o ?~M囅R"QoM^ɉ,")DthiF,K,, F8:q4IԌR&Pz|e(i=)Ps+>ORn3HQ 'qi_Lf0o0"n*ɰ4T-lZzlCACBK $&ƃٿ[,G&>|2[hӪ2e_ųg`yӼ܉_2/ ;vkcF3$ ߮A-砃|) w% :av'IZ&v?9|?Q/A' $<>t_q&xOփNājU-h.kFC1S cq`:J$QBel h":83CPҟM')z2.~8HltMouڏ?HUaZ+ː}͜pv;nuxkOKϝs0T_lZ m/}"L<}~:d_3g_J٧Kd }%*;uq&B]ig2;H[ls:a?{q?+xz? ggpĞrS`M'Sxn?r?xK~q ;zmo 6*9qv<\[bW ^rG}>pM>-LA\˔fc\ orG3oaq ?MT{jm`1&UU30E¹,j/T-!_xخCmyrL4>޳P5( r;ev࠽ɂ7)#R`Pg"M@;CmW*>?ԍ#C}\U : E $@yl/ -9ǩ'g3G]{L*f$xOCHG%ZH-` WU^@}[v/mlBa!B@z mC/@(um,@΋4;zs{1Df|X@kR6ߑCH &[&#@DpL 1-TǶW!aG#'XBT,[(&#xxHE #d<|_&l# D}6"K)|< 's3uYXԩ16]5ZwV7I3% nK`-3&O.1Wj{_0TJED_%^֓٫E@25n ͖w*am DcMma3[dܯ"]$#aS`$ou .{b!E¨B]%:i>@tKuoJP@ ϬQ=j 0*cjݴ7nxi K9)㲌I,ZQQ7Dğ'>[7aduŦN:&CaB=Qz(Cц呡0GZ 0kD4a!1H9c057'p9S<ӧ9\#ebwS 3|`V ?&'Wq)Le 0-n#=/$_5v{u 1vXF Xy-AcI6 sdK)4>\跋ߡp n-ɕz$bU&k&l@mwykL*Ua( B̂,\(Cv\Wlܖ$L6ET2#? ;Znӓ7s1kO(H'ZVdYqy!s"(lT]\>w:leM1jɋ9Bg[lcv_Q|>?Q~WM7<ƫWj»O! 5oxW\~HwӨwx?g\Ok,a[CE1%׶VrcX-u`~s;Ho2xgJ%";E$ԁRNj dŽ@=8)ñ{Kc CdsP؏:D8P}{aIal9I^ؑTT7lx`˧u VRFՁ\4n /ltc4j{?HcdutPv~ l^^hHA6xG&L+:sեU0m'6e"!>H`lОHȎ"mXzwT,-XMDuJ@"0BԴg1VB/&'|,%vo>SN#Q0mЛ4fJg^?Ov8nyqiC` '` I ҀQ\l_"F 2H .$'3;R"%_TL\J@bpTO/z؃mW^ o`UB\,6 .)V!:-OG0PVk?r=.#?}b ħhLb I" $jbzXb ?\$$4םi}qzFLFͽ2, p M?Yj{%<3a~ mZ혥 "ێodW:2&rXrQAy-F| LOOv͜خ-BMI9Tp2H"#iKHEu-a :ZDXO"Vz|yXwc11aDd{cě1&Rge!'Jq⨻ŊNk 负A;fPX&'窹ABa6:ëuMBî82T{UqD `_{7z<~ <.-eZLTƑa(vhLzlޭo9 f,Qoةu jt$ cXR&q^c*b.bYW1ԫuo†jWxAq4Ha@v u~#)twW$Vu>Rgaۿο_)3ͷi[P|5n2,ՙXO (v@1! 87yߎ抆,($Ok`q#v_5CVg f'G^:tҥqȔ)~>v5H$5PiuG4/'?`Cw0JqX1-X&@h|pξԩj>IWLk[$9Ŷs33( RJ^u%B5_~!?-/7>?w%+4>p8^F@K1x:,30!$ f5lPW qWẗ6=]6n'^رNECP3O4g}k,f yxL>K WL `;ئMu< .$ӡl!i{:P[ J}Yx_>St==]y(؈ 9d&zЧ ?!qq6)'\OwlIG*/ii EM?qe /l$fS; a|Wo7tp㴋d˛J`{=Lt65;zf'{eϬSsg!=gYg#_y/;{qd쟽p{{?x~lO*}Q,DגN+CH wȻ A/@vVLfkdC'g.ϝh/V+SchVE̥8ggɷ&Wk 䜌%_*f'd?6{,0l+0ov \ck)Ѵ8 `k2ޚo`ʔ 5҃rN{`C%j$R)mٛ{, r[ծT2ٷ:X z=uw&-kF|UA3;gQBZIJ+]8ۑ6c"pTO^ajq(zw\5L(Xƾ=0aXg4FAP|JBu Ekq =9>/CE^,}J6FQim~^> j k  ][%6|GM >=JU_K*}wh^uð]<^^@$M\'{qEww$TU#@(4LJYqqCF!X =t \ ;x"lTǑPŤK(|v8=h  p)\)ӑ hGFQ `X`0KT<{}I2Ǧט?_C|“^q:; =~^rމ X~zsp9ٗ\_.g\ލW7nuz0TgY֯>^3i#Ndi'?m@KZ:ćdW` UF0_nӵo?˜./QH?1e|~pC+צ˵V5 ?I(/ PjN/=/J{(͛T[lgIO[wc3~:ˤ0'ϐ Ȥ?nqo:[M8szS {~C2w /._cD%A*>ɞ;:KoGswL5Q~u)|Xb:hP|ZY"œ'6ы/fӝP]? m_*{C0Slӂ}wC_7Bڜ$`Ɂ[pGafٖ<צKo|yoB/:^̕E?U-}I}0.m PޒrWLosǷn!9Fzt~Q&ON[Dս,\J.,'pn:=]a}49Mӹ6||"ݴm8[3?40K?80 PJ@+H≜7+Mu%"e,T^ezkr PhxE0K=􂮅╙E<~,Hd@Ov>%#~L0MIg73x4/+'M#'rĭq_=l+M/7nar_;Wpkؔ~ӽFk0~ Y;7]~8x=!VTrr̈t/񵈑RDPRd{aA(H@)3FIcSř4CS(я0~XڋXΊF72`]s#9|$KνP5hNi>~J/I^9ftS~~Z@r86㡰͍6/;vv)x9"N'9vmƤG1תbC̋@vH,}^K Q`wmj?ɧ5&Jrgڮ]bUh/P|M㔽=)dc@rI{8u@ =w/3RM]OCQu\/120(];ɉ(FP1mɁx4'#3L1ɑ`^6n|/b(YrP:>"ҿ$Gc=`<z`|gӏnP=4#럿}`gm-. gv өG˃fu5n;e5Fqh7Ct7q,{PO"kwN{[V3GTk8ϏSGy'+v=8^REng=' `-ǃp)w' @fs=[cLT#u} & c%A.Iڥ$ ?!S&C-ZrO/E6[$TqR륁wXSxO[$PR1>4bI9ܴܲ4-ơ Y~[~GmQڃ0 [Ն %㱙J̍$6t{G֩Vy#n_mq ީov[a#Y/$NɰzGB|Zxى% g@-ߓ#3k e{^niY]hzBנxѧ쮯|CA/rQ^_{]B5][|rڔ1пbxB5әk3Hvcg^Kokonjr]_t}awav*}9`ULU7qW=-~ד]O`3w:-y#I}ڝPO/1TK'JR Q既Z74-½p?f!j\ݵGxf=/ +F)lߤE3+w`m>XEw'{ûwA,$0ܨ\/Ct_N/Fkbo< D%͓m}cZB"Vv%2-mS׺Cgd"GЄϫg΂zy MzPQCMӧ7^{}soʕNK8gf1d}@O 1^Z쳵.R 5YUFNG$CFƈ1z23;+i؅ʵvnNb6ޏ`'e"oT/CuS.ؼOZ0v>9 &4GAW4M3;[6yR?q#</j%{?qb^݌r(}&zT{anqRM]0\wV =ŒYU Yv&Y}`kO|UTK86fI[ YoOս7J9 v3:简 M[TDzW +,Ζ0ƮȤ+%k;@Tըߡ5c*.?V^)Ŧ;8尨es*mw ޲:1^S}55r )6sWoxwhCfWe5wb@'l l$,[ -t]t|)pa[9)C1](h\̆hŚL^{>L/]ׯI^)nXf|DOGg]_\VvgWC 7.%UH޷9_VZ5,nD)vPmV^'害g mͬ#fb2-7+O[++XҬ+YVt6{3Jksr6qĝ ,pfd6]yOeW`*5v ڬ`fNk/gspvulk@ U?;3fuG7i|NGVd '|ьюl`ҡA\\B˝F5mZKat4ý6l⨉My:kcζNr5(WVL: ^۪.˻p-Og:"zSuԵۗPa[E JQJ`aOϗ{gȄ]F&юA+5;x*XQ14%5kz.]iPœV-̪)|iֳ>[A5+zV.+6 e}S~QS= hv{3Bm: 9ޔv}qdYSE- z5 lYE:[q=7Pp*[rG.Xm*3BxoYGR)b %Bs\a:if4km&lwm-8i60r02{k%쎦bXghFʢM+e4]N|qZbk%e|ź1J{Y4&~Νꦶs[9K%4;>Vv(qea~>˗#kZ@."V"~sm&I21r*ZtvQ3G33tR:AN#vE! VJBUjhfJ/wBJ"5(vev͗yl~=VXO< cF=&0IʎoH4<^6 4l5iu]u@7i -u=H‹0'϶!j{X{zyV}xԤ ]?Z䥺6) 4iƽn , VWNtnЪ4JJ{a䐪kaRf{/VhɲiD̳h?tL?nCfntuE ٦aFl*:2XORd\Ժ0)bh☮۹cRszwp׫F+b{S*򌾻sA]^1G7M{eTpm%abBۨzպShWmo^XPܖ;Bv9PaEBLl=iH0P概ۛ?Aoȕ&K^ jSh 4a&/aYH]^Pѣ8mb![lJ0l^] 7nnfM{^[FIܲH{Ղ(uIq;+*Ƹ^  {쾃cv* FaYnT$ӛݎea/k+J+]#zll=4YVq:Tݐ\cfV p+ʝ KRgχ~D۲A7e=hFl.j䝩F9bH ۜa0ֲf[i7 m>Rؾ*K:#PTJRiW8b\[Zk? m#׫7zubX ĨTxVVbL(=r7 2%ZS+m`DjgYnXLӹ@ &RJ-fgoh;.j9)5|{b~JܶFZa:[ٳMǫJ} e]~'t%)6Ő]JV U ]ՠRI~UTIɔac٢/HfZ0%^~)4Y0T(&l{qvU-;>>G"";Й\ۤ%wv+0L-D\`ПF2+= xL (ҼEg`ȁh*X佰pW,iɮ?oA6_4[EF=PZ.P=,f6ٜj+}ɭ%6Xip]8o̚; }Ӫ2fAWc,5;X=_jn-aWi;gee%~'{{k[ǤNȫkcJ<D "TveN۽6r݁5\z̶hsB!H sNs٨՟sa~cZbKCO,SB޹yC `9Xt%p{,9d뉲a&1T qy˾DvaA"[ p.(b|{]6eM.@+m̰CV`nlLX4\WZlPv v"U\715l` iOAܯRٔ&uLfmX-2̘㞟:NA+x lJ8׏.|/#=9)o*4>DАODĪ=IcRgCRH{sECh^#N 8h/d-5 0vb#mQ[@[ };Ft$V "]w/hMQ bQ\ghǻ<6Ҷ 38H4OepPP s4Gh|qm2 "] >-OG0PVk%I\قY-踽?ֻj1165 > cWsw\׃N]nr>&bFbĉXa@ E Dp˘P  LjN l*Pw1 e T!׺ ;/o&T :>x{Pdڶ͍YdޑM&>=fr(Noq&/ @U+XяL)"vY/E0;GY AKgP1QQĮ D192Q58&֡4{ eW״c?Lxmj=Rx`=GIш.N,J5i}GdhҞ&fY*gkeFiQqV 4:!5]*`0!~{G\Z5Bh)EUy\*t4{;䨅<*eeaﯜdeYrЄMdגai)P[CoQR;11&;KZYmӒMkڑW զ\I[mmII ib #-V8 Sg| fӰ:+Kꬰ}g,ZʹÕ:\);G/8'EX\9Yre LJ֤9\sx,.*cvXdAyIJ‡r'쪓S,QʭI{V jN~@:lXŸHs߇%-H\$Q:_RR " >o/ӄ̿]˦L|C Qn*Vew%R&GQ7/\ā=X , iueݽnnĻvx:Y(<4{Rݯ,uQA{ 'uo\;`ܘ(mHiG |y蹙C 5u>5L%("C D>'z9rR+ mj6Л儐1LhIill16B1{՘s;S@z z]z=Y\^s[١;QAnUMZ+K\Q~Anjeei@쇖6sCcie(VKtmnۊ-OFףR2֦’;ʠ]z-aaV*StΡ~K72'b}0SVvrEme]WSiZ4i7a ˭Lx{<6%C e//9y0dzA[ f`YylupǺu-5cm5+[,.AVm=m LXH&v&*6eY0lo wQ.|UUgڸfĕjՄA&rhr^Ϋ{;76Qs>vfo5ʋըY_m ֖&VE0 2dԲ9]įrL]h>uV&![5Ikt!9Ġtݤ_g NW~(!+v 瞼uc$<j7mYAJZ-rq0t91S~{o(adk`)95b%raEtXx%VB04tY UG^sQޮ} }Ōs"?r@"Es&4nxB>ϐuգ  eymP 'ͧ5Wb]$#Iuy]/˕ v7c_77xv9(OX@0-pa~{C m/(LOF-+/gj% 9q)cI )LW[\\7JWPAN w .;g8h+ s/%2u@Qv#uow.2 U|r˿2P^6?X[}ȺWd6/ދf@v}Nzי_$wqYU~͖;φ(X ΏlKc0/ })69۹*c](F{A3.z#zURJTx=|.V>T(߾ed_-RGx@YkjV58'8Y1et+C:)AٱLP k6.@-ӲMבB|-驷ϼjC\:( nJ%HX)C50O:(O9;^Mŋn4fÕ&ڙ]ӥ?92xу[Ua?&'vLj_Mc5J?k&p6V;Iy+N7-Tk sc1mfr Gk{ri [,V 2oZLLJS-nQz^;Ɓ3iEo )&?ja$iU3{kwt*6G }#vciH&PQ.1cxghE^_i.?=Rf(tGE'}=+`mhv"Rͦ[>kBNıuR 3FEԫ}K7rltSqATa4v#M h _l/x.׻"Qi9NςmG*EjI baNQ1Unl2'pyi }&taOk7 , $48X⣈xãa41wQvbʝfŹ$&Ӽ =}=rNU@$p6<e26tkΠ5;VdP ZˇC.̈́aAGK>nE+r"e? sþ[8۲3zJJJEm =F[m'r_6x>-Ccfgpkp LmzIhe6_21q9lmWTX}dц:U:xp%C5mMc<ެ󼯰ظAY̎ >2L;Iҥ6b)XEQT&]_ASM&t΅@w QåX[2a( DIC ,V$p1ݕ` 3<-ŚƦ!ʥ5 LDaਬ@BM16mԔ}cwI{hP#NXewOy-%Ns*wGB\J Q}ՓwB5 |t 5c.BpTl>gܓf&ކ8ɨ!tF񚺎A32q*kH8c(+&/i&\cm,)ɐqJʘ(jJ;caNOLBlTyM=c`FHMg`o$zX\WmU3{K0W(_Zʷ7]OjfpFQ9ps{O f  sPtiY -bTbb-Guk5Ų~`jNJ*3'et<2 {QqEeOAPNG  IHDR226@:jIDATx^_heO4]׮跑]Wl*xU !0U"(ƉQo'nNJ?l/4R*N^tkeh.X=>yyM}@~9I>x\PXTP&]x)]E;q*Y*C9HQ2Tp 7ƭ9mrX@$(N)"'s{!҃_&h 9to5S,D _u[uh@4P13KLCU T%_$H܆C1']eE@?gCAո"Dtr6^R112*NElѼC~U->D9H?qVBƀ(E>qЀ)IdMu%" QJM!\Qֳ+XJطe@-vc#gIl饜C^ `q%[xg k<эbxVܨDZMHz1Lrfȱד3 A6]A4yP1PA6jC+OKysil!"BhFsّ^l1 AR@qǮO/B,%{1H/9/dԘA.R@T/}5a >XjQfK[<Ȇ(-09y(*e)"wίIVrJ+%A6g鋣ץ=Rlu?d)חЅ,{"|v-fΏ糔C:r+SCzKV)DKRw}4Ÿ vR cC2FC، :h'{ن3}+?)Bt0̻  h4x+ 𓾺44者o9Dy'1at x =ُGmhA9Dr5نF;:hF=jP!Nhz_AM.ԄFW!? ?A0z!* /䃗BuUK %y B LcIENDB`PNG  IHDR@@`UcsCl0`MIDATx^kpU@sr;B\$$@*XiXX"8tढ़*Qkۿ࠶b BwEp[H9'ifɚ='0g޽]u/?s}OL? or;p)^yI0z8źp/`۵6a >u?/CřDPYQno#ֹD2vyE6e#'$ZoW!fQ L=sCNa> \nE-:/WҌQX$033 J!8HI3{a72t`n( kP f;F/`vG)pki`/9|?n\ "Y+i <3O3D'`# tn7meMw U2ނV6 fycr3[J,e`zMoYLV&΀ rm. W|&d hbX ˕jKمRY |,K `L˫TTɑMWZ8p2 c E|XdƧ l)E6?؂,`b* #\,@@3hjTMՌ5}-e*~k%@lŪQUrUzu_/d[ʮl!Vm6W 7R%2A`pt}WBQHX,hۮ|ip !,F 2fj}pq=1pBNSh@9&9O6YyJQJG<,t-$ҰR^|y8GICNh|K H_vJt#,l! FxvJt!`&Dt8r @&[HnlywͬPi΅Dn8:/BLQ)*S*߼ L\l mM v7#Bޕ5BEIUG4yU{Y/'pⱑBr%` r6\:IО[iL_r=G^9x@![qRutQrƻL\T*USwf["Gw3JS8'e!ZUkJU~ƪ"Kצѥn40W1bH TdYHAAgѽw0Bxhg^TL_hȲٽsN|YVVR |Sr8{XJR9'4eV nB~S4%*A LpUGsN|xYV_-za]W=5I) s:;wt @g)Q 8ı[A=r|x4Te(8*yB[#܆vpr{|ق .p Xe{ҋT JA*l h4eA BoTJok)v4^>xBJ4Qտaݡ-m_v>~q_?GvB㔯,ȫX3yg%T MRj5p/NV&DSl %)MP*Q.\e*xk 4RJ<*|MLPҔɯ|_#k~0{#i..nrWJOJSҔ*_?JR¹O ;kDtͣ]+=D,âIENDB`PNG  IHDR@@`UcsCl0`MIDATx^Q@FeIȀPMEA O-x6}.Leύy|x@oĈqgA{ 1c! /-B"b1q Y`u B%+bI0fFB2frcP(b<<\D:J=<<r=5|u%_S!W;5ϩ  NM_NuMLyIENDB`PNG  IHDR@@`UcsCl0`MIDATx^=K#QNތ/F#ɺA [,)Y_-+a]A?ZY[m/"kgc{3NFb3ȝp<H) @gFl}7r~ !fd6] ! :" c Y\9 #$yn ;:[(AB@w H@1HE#<e" q'AtG,0V9 @5L (p $@绀9^(a4:ou_ 7 @4:o*!pHL4 y,`% bFPB""oD>1@o| "7?nw,vl ۶|doD:oEHNЄ2hB/4$?͘] KqO%7&4xy:>;XDS U̢[ n1@1 qh`:oeM(1ʉqI3^N5ӹ8t>AĸMHx;-O) m tIENDB`PNG  IHDR@@`UcsCl0`MIDATx^͘mUgޛ!$-X-`/ R PF LmWWK`-E`A,TDQ:st8 Nw{.Os>}sv<ŃH@a53gP^W[uVq!o(d7jxW!qxy]U]L*3uǿw:NL3exT|r?uߙTP֞ ;@=NL}e xB&gJ"e|tܯx7@ i}MAJ٫GZH d tr&C@ @ @ @ @ @ @ @ @P@P %P8O h}&蔀XAӀiXAF@VsjZ4.9jv"XbԨP"8.%*Ԩ[T!GLHc+a(S'r+14SnejĮrY^DԩRɤ@a% Iy} fu@f  ^ BzK*N gGY#Ft^0 A \lLR8dSݧUwcg6E 8en?NH-vh6Z <̮VPv{\%t_kM̭SߚM hh* Z(";PsG 4x~MHjz!$9pV 7;`C1iΚĄ&)/yv~ے>JQϰF;X7"H"x XKytq &S9E(> kGgP)4x;I]NDԨP8ɣʯe9S?v=chҠ,!Qyp$p':ذb -MwxvwktǡkH*F<CdOCЁWѱϫ9(R%$w'h=ޟ)FL@EځF+N*E.spΕ/Rh+8 aK2/ 4l\5M/֊H:oZ>WIENDB`PNG  IHDR@@iqcsCl0`M 4IDATx^[}lVW[BS*Z1AK"$$ؒjĎ!  I# ! FeP *J%Ӝ֛޼7'r99<<}y'(l?]$ ј= ALd2<~a_gsGj3Nã0nڵɛ7ov޽]?xxxx@{c^0>B!Bx}0{Lb7Ç q}< R 't\A;PF`#ZGqS@?|z3#s$͈c> q2, '$rKe X1?<1K`OI@;0}Oƣk'$d^To޼;wt8kEy0W;kJ]x衾)f=H8o.]i#GL=ʃcr]+BؓI$$IBwfyy}m@V=(xvCY!zݶt6[՝lZ'O}Wq|J隣8} )JeḸOAYt$ Hy4> GT_J: Oh{NW@@I>53Bh"e)L3Z׶P(.\l'Uz6mRju)HooP2*xIjW_f~?in93H`ذaҲw^>8 HBE,j9g_"H, ]رCV|Ne+^|ˊN,׏k׮f+++P[l[,sN'tC3 Yf#minnܾ}[qW< Y(|qcNB@]]6^IY^,F+: +Wt%@KON:FUUAN8ĊL5wh;sh!GUܹs`&WLpŊ#)f Y ,YY];w+ "{ |aƪkʕ+]gϞQC?VݻwR"H4hgo7ku(l***r%Iqü@' /xrv=gK2;++($ÒBW3N 0׵;$,@89?jH<|jnI"q]ٕf;KwLώ| 5f,5;$Q+:$DKʌ&슟h(Y!ÅS'~nJ)N1{s8T$*C@$TqlOpٕطlIkA=m "MaLEGc+la%up$Tפy%a'T)PBIIDRD^ɂJFtGմ`+{ ~fNzv#jZOk;[]XL*ѫpj聙~`n;?wL@Qv}D5 t./&Y+>T@Q1aU[G2A{1:&"{X@T(4ff"OfvwA9OvS0dS Z)zVXrPP "8@e٦٦.yH+|a]2T>sxݘHV%ɏ/)V>o:K1&pJ-`k_)QRT\]e:)JÀH{}X&mJGu [߾GxWٹgF' : ڌFDl^&Cb֘uN߷ȯdtqLI5_d-]1(A !3J nOYkp/fl|) <'44 SD-Gkڜ|Èj+O@iGn<OT#H\4 +$ROsʐv1b]8>ծwSNvl RPRE˝`xpEڜf_X#  6=hM,ZyKq!xmt.Z} \!jpY >ˠ\cqaCq7Cފ]kpvccp8 : c,,C4h(V|9^/_)[0(41 GqǺ݀)hЅbo5p $ɨU٭X݀,1,Ur8jmaO._@P6-k-RۡO#0 QaW՗?Qa ((k{JǏO@^0h J7X*?PR)IENDB`PNG  IHDR@@`UcsCl0`M@IDATx^TWϹ3˲%PjڠZM)EDŨMcVcKBB"B@465ؔhզj",eؚA ڄ$twgg_$Lv/{{~3 %KU7%  E51F#ۂT>S5Ϸm3h GU[?cTeBH|E*T}7,S@Ck Ʈ[5Z1Ӱ#~'s+,kwb3fm8n QA4Po|0 n0պf/)DQS |643V{p=dN:唃!i6:H xcL[Mv[Nbg*)t>$sFU@nVF<NO &72;ѣ" %}6 {54EQlh)%Sz׀Zw9YkUT]>ڃWOrjGmsY̛ m{T0|嘤$[oPC6'{+NR7kJ; ST=7BzýJXda0<˕VW U fTLDoo)*^nrLTe޾gu8d V4v%*24&­@!@TLn1OsNS2@fq3Z -s@cYMNA!fjA*kxȑ-s1I>H(P}WᠳRdһMØ֎X?-3jvOU4P7fԨuNF٣Q`! U3M?<2JFmm]sڋIHUAݘ~#5u0& *@ Owa39fjQ/ ٭[Iw.(El~b Tא-Xn3𠽺AVFI/ƬVdYIrP&azf=V&ƨ8[2yC=ibls]%u6~m (GmU.8n$3PSnم}M~a,mb9ku<ԀeO,oU(W1ePq]υ6.cHs N_6K)u{lUSO׶@92RL}RF$^JZbh?D䈢LH ]u$4Td~7I!הbD4Bg!&w.( .R.w|I?ylNIENDB`PNG  IHDR@@`UcsCl0`M/IDATx^}gu98YE؆2F7Xp4 Lة | k^d:QQsjli#8* W0.9p{E8{~/u z"Q2AQb k!r Q=>_. YzNAɽcr:/ 7|٘ӆAk5dB3*6W-s5qW1/0 dJoxAfUhf>T*O0 d gbH'D "5-FE+]k]!lwyfif\:owRGuom6i+DĺA@ĩoR 6Vp%ih:fuPJ .HgeS P(K|| '>-DQ \cf뻆> xG[:Oi2J d=g.̿_bȰ[`[,s5dB%}0}V horj2 (k.i?t@r[;o+lAY sBw駇V |Š~NKJ}2j}L ytqT"*, а>!@$6VJݠ$x6U^ 2. sz)crUgvZr7E<  t3wڣ]78 m-ϺSdD7opވ2o Q2kk'|\79!E)PM`҄ []X~uJ2(^VUZsQ&2h0=M[]8F=Ɉ DIƼ`!G\(~~mmE5 *;jݘ Ga Eﰟ R;v=`jRaGQl_k ?恨GZvqﵧHZCڒM?gaIUՕG^r_? *PUhCgFM휶_;)΄S>N۸V*@bRh^4]]eJh:cKǨxZI@,ׁ85'x\3 t3E4(v;'qi[@~\Q}Z5C@[⦡yCΓ9(-@WL>euF5YYb x7>j GO.ԩ/ݩ-qi.I) PsoBG&j& IH7!}ubpu=cP,IENDB`PNG  IHDR@@`UcsCl0`MIDATx^kWﳷaŠ[VKTӆvA[nj( ZkS_5!ƘTIl$ o- A757ʂ\2?83q 'Dx~9y8|RtďbyOA9ʮBa"D"Dm~4y+  NDZ)|s#\"y!=\xSUmb0% D$iF @xp@.j6kRIIk#)Rd,yX]b,a4c9C JyIzp0ɟ U 訤SO$*@Z% Gic/JCB1s҃5I_);t!u V~1f,12$ai>Hoc{T;L#EԀN"A6Jxc/'m^3øfn`^;# !Ш7p'{H; _tݖ9]N3!Ec;J z*isщ'f2_="=jYUR/3; n]Κ'JGaɘBPi5MooKF3i1@3z e14ЮKLyNU; c+ڦ骤׿I+v`q?$*PZ/]pAd.^I׏'PM؂%T~N:lk%]>8|tKҰ^$<B(kckxZ@au{X&,e1, IIe.HڳXBX`3ya&djR vJ:s2L頝Vd`)_~OiGK7oMN&Kiq"5_5_ź_Kg.#Q撧DؤWYɚe%n@E&>O th% pkTL6+zSa[gO$-)#l4~d)S.覓t)Vb2^w $ !I)F,|'EPsaH:i /˔o"EF:O|\z2U,#N$it7 l$"$ VvH:]1+iک#d>\ly3,B]_DQ`|$Ϭ@M5(QkP=~7WްGۑWb4 KN܇; wtOX?^g#^o`Kt]U?98ѫIENDB`PNG  IHDR@@`UcsCl0`MUIDATx^_OiVX ?&-AaC GoֽMz<1bVwP3=PO;s2!'y~̼s&֧~/T׀> +< w0/ۗG?#߯K~1KŃAT@8xJpCx<%xOxKxbx <pw"ll?<>fCm;0ZX)uP:(5;6k>,{\ƲԒ2VzpX {?}>9,s 䑓}|}[Xrz:6J3HaN 򑀼U_,~uj5 +਄D_BqH@J>,:*),n0q^q$#I1go/`; @j6ޜTMm:h(@*]%7+}*. ]:<pBa) g!I;=i>>E|y.? 7z0$rm%e@OBbJTC0q?[Q Q= cF BX+ƏX}#ۦclHZx `,~{( / ,EKi_WB[¶%D$Y76xAq_:\@ bގHB[%skvtP>T_^ԟ7?l5:}0aѬE {Nj6'^ ΅ $aiBiLx`1!#_ܦ;c^c].<O''! Gwx||8apw8h||'N \YrDZ*)k~_\bhp~uFm/1(a=ъ7qØIENDB`PNG  IHDR@@`UcsCl0`MIDATx^ٻoUeY|Yvm+KDbPHHD(nґ*e7(E@J4q$ IlCj3Gc>r2srymGs9Y>N#8 QQ5TqxRL)FX~s@eÇƀA|µM(_!Sh4K[BF{e<1uζRM8OCa\/!ڄx9C !&,)@uFb@4h2O#@nƑϗ!*7wK}ޗ9wOs ouU_P8N?wa6&]%) 7lt(yL\?'` : FM~^kγ">}?&+Rc$r3!88IKt,^[]I1OJ%S&i2N3<-ܜP?Ma 2&)J_1w?SKx PG Wh-cv7'÷## 3.m+8 l Ą;^/_251K[P3 LyEL (`^/*~J 4X#T`Sr7!yc 5NZ =xizBI RŎ5@/ޢIE 2C8rѷK Ȓ#@dj {@[zR9n79V"Ujzߣ9.3F "]$ħ=2>!/3 =RcL2[@ӄQxnQZ3BH$dQ'̔54R0،RoC>_#:E{IENDB`PNG  IHDR@@`UcsCl0`MIDATx^OKbQn?WMYX)%6Zͬi5ML+׽@ i{8nj|Co{3 >`B`SL)L{=v:s߇xD]'#*@oOT^c` ] r^&Xy` 'yp @0%@LBޔ`0!rޜ WjG}Y'K8@D=c:Y"aQR(Q:lMv{ӤN)8&,E, `-ؠ-lF K,RH 1MCG$9*B$WO7C(Ǒƀ1` ƀ1`_#>HBdO(0{kxߜ = v7,7{\}yVӇ$0GQ|C9fHY)iTY: reIi9>Eh] 1yN&s`7QK߇f*"o E9o [9o ļ}0xy&F#B:@ȐD5X<!o i|%'D?@eլIENDB`PNG  IHDR@@`UcsCl0`MIDATx^MoU=db';-qj4IEP6HH "6l+D+|nUb^T$+M[5͛fp|S sѵ'Ds& `=9 y Q@(C1ft*n ! tRNK1= OAwncc8*q^ ԀG`2K{}2 ţHz505V3G G -\ST`R07Р*Gw_b SR@|ɼ|2aS Ą߾<53э!hB1rAyi=Z7!.(n7o'KBTG~kI ysu|;p~{ovv*i1@ _6%?tG&q^_9,++#{0OtH}3,H2M֌6SzwOdJ@<73Tc?v,Qn_,t,Sxx„p/.z?\*,LMVen`o«Cۇ>)=teW9_/&|\>1uR$ Wp>)qƖL o1+!=:dCBHs,Ӻr(nd <<*w_t1\#kR!@֎g) X8ݎIB-%@VKC,.:rTK\M*ei2g9GΈY "GKyYR?55Bk r6Ӕe27i2Y\?RCc L?Yrt>ĊIENDB`PNG  IHDR@@iqcsCl0`M IDATx^[}LT)32"b T]-KYݏVݦJMvuUiMMhHmq7Q0.d5Y?¢Dc4l"ongrdy#Iړ}wι_j b1BLz،0R>|؁o2WQP000' 3%fӵ3>}###mpttghh mѽ˗/ϖd!”6چ?~ \k xs&]DL >FW- 5"AST[wr'220 *X4/*>'g${ZJ=:$ %_9!eu "HcANml4= r2B6ȖB)`"V?uF$h Ҳ"ōsRo~-V{P_A$ 20j/X@Wd腕', WYBmtB!ACee-s$ \ ټB@ZOoVھ@Z=8W-N{Ɇԭ ۀC|$ 2D?~z<_sH0QbzWnߞ%HCmGVnjp M HI*?O:4& >|x3/$H@4( ,]ٷo懀D~S}Tb<τ%7|ދ8Ì 56= @s=zT;VGٞ =ͣj$ۚ`nZ`ӹjժw H2HuB $Ipo VGԁ7. kw"֓!V`= `= Oʒ!'! Xd>LhlAE m6y>K #@dfflڴI<|p8**jr7E+>~>IDeNo=۶mRarh]^Ccv% U0HIN2AG-[SBhRL2P{r!$xv>RZKƍ;v(Ne}M{5OMM;vڵm/rbxv7QNt" _S~L X$9sF]C, gfNeKSyq…Bev}'O[Xdggˍʑt&`~Lx,"`մ*HT&g\}AW^$޾}[\~C^Јuʕ+744rØtvIFF! 7o$I-7+˗{v|:o_ȹsNogYqXr IIcc<!960EBB! 0o21r|0nܸ/=Kc9Hf%$F1RLĆ`ijj"_Tw3luWycijgJe<Rgܞl5}5;yt99lRe˖mDJ"*,}n{w!VؘU34b།apH!n]{ N>JZǹ$ZM@(̢xiw2b:n䙓#oN$X:ބ>O\PD/FlCxABcҥK\`F-~嶚Wƃo&0Iq3\l/g(%8D?xt4-l1f?ESO|pH_fZl[0?r/ް`'f|'x*/,^cDJxYF Wy:+[f$ {d<0Q&[.U "@j$? !<R/IENDB`PNG  IHDR@@`UcsCl0`MIDATx^͘]h\E 4V1^ *ЪP(6*j+"*("*5B( MJJj"BբV"Es=0v؅p3sW~J_$x$  Xp biYEb\@",>D LFA6\Fp|($@@ >x*$' H\|" Ps*$y Z $ E SJ *H  *H  *H ?+Y$»%UWA_ ~$UWA_ ~$UWAs^@{%Fƒ>9Y8-Hg#xC0q[%ǬkEM*n"s4-dUӄ(RJ l =, DȲh!KHD25v>;b7 S熍.3BтjSIFЦO>!7!/߳ %,fe*jC Fp sM0tn[)QBBc 7$f{N G:N,nhg8@;&kB-˸bG4w*$ߍ#o(H2eYj# \ ( @DE4SC.#붓"@8}q|p#)S4Oc>Wrpn|FW*8 ;⊧'45s|Dq|Y)ᯙe<dߔvр7x)o3^Ə#4QY2E q:^郊* sq6A=]_xu<@pAnpq3/ntozFW5驗{n$@L: J̾掝}sa) (15^c@ag ɚxU'ЪP @&o/ޑ"DMX#P3- $b\(C[_[w/HIENDB`PNG  IHDR@@`UcsCl0`M[IDATxױN"QV[Yz#XآbLԇ) >%X0(|$@u903Θv`p,/m XJ/¼ C0Da?!ލ B!+t 11jbL?Qh@PO[E8֛\_ìB UImj."Ig#,gZXRy.y,@7XCuDazT!Ęm;+t5? Ѹl'8 }O3)66 WJ߇mic#? {U|C-Η={5eEp:ou FD|yBTZ7ǤR$&@M@, /&9&+r)C6qx(`GI 6yR,ՉVa|HϔƜHS s㸖pGcП6nqH=ڀR 2 E`#KǚMNMѦ3nBğ-ݖI(O.39 1썻Mݣ{:A;k|T`C%)t;ΗvC{slyMxrwpZf Y:~߸'I1s:>skUZtifYdܥaÝtpթ[fowwjZ=X~e1[]@< I15N3i+7=іd/X@rj,۰@ʤ$&0'ƞ6w)⌻)^R%Ūl%xeP qOSsEN-BB!KB %. WRmf\  =vj]Zm,=-{wfI$NZCV4Ǝn$-#NёPGdHx2Dg?izbw sdbϭz*U %438Lqg@sp~ Re%yET( ^OzG2V<Ï%=с!͋,R"ղ|Ȝs"$^ڰrdX߶X^m}0gN|\"cIENDB`PNG  IHDR@@`UcsCl0`MIDATx^{pT޻]!<" "i vCSe:V T )#vZP_V( J #nv=_3sf!܌o=|sX`R#D^>( u`S+T.nI+,Mn]#2ᔻGuN!D] VO:BQ(hl]彯BҴ A# ^Kt.`LJ<1|U yש##ڃaR&o}0wP(\7:/޹{X#p~SM &Ws?}U:Eţ}ko>Ne(}~o|顅!̊q nhl"v;{3w pPXQͅÍZ=ƬTE|\ԠxTOhw݄g"GܲV,.72X,0'џ>pOj2 /(+K_k, @ێYaOWO~bNoS1jvʂLҏ CgkvXѐDϽXaVQK zzvd\ij=9#K n^F%_VT॑AXe6l* A'/hbXVH4 h٧R}e5)DBXe }:7Lh/pu47 rߴ 6luE釛8vahS:""M&}An?JBp.Izr>B^~aPB2 Q >yR!8! ڄAX \ HB _X2S2!ς-PEӆV*Y%"'XzAч -APSH_od*Zy>Crp!iE8nIkX Q+ 4}uKyoKHy(߉`ﰜMsw0"V@Wqݓ>c`.H TMكPA[ Xm81+:˭}FdWɣ$Վ`(IF=k$MHI(hu<Y2Uzt"Pne U!a3E,ಂblz)?]! xTQY@.,a:c[F1S]&VQ@޽?jQGW&c˳fT0 ʝP vռiD[\ (Dw| Io>齡lZPjc43&zLݼ"iN" ɒ!MWΪ]WL0Hr2 D(@m+׌=$^aIṳ?ppK<9?)͌#h@:(2j+/_N-G4h3GʙYЩIDh|̲_shV5 UJ6ڼTS-j6u11t e< *Knqکe"-{3NŃ&639OFhy&TtwD*J%<d.ŅտeR#^..* A"Ѐ(ﬖAV1Á q\lj0&qM8v9Y\vO0mցj6["j1HE׳imBmZDGMHMHMHMHzM]2xU5X˥OB΍EÓ/^_<)IЍ#́95g)DRpʹs"a}18Ĥd\Dr!#%nE 1˨YaMӰeGL&[LÆde@?e$6ʦDf7Un 4ըiZQ6$IK_LW$1'XbIENDB`PNG  IHDR226@:IDATx^NQ2Jf Sb|Tl ,o 4XhZݱ &@p)/15qazM'/y ?H>&ɍDD$E@@F8q tyzA 9"<p(9%-L2 oIY C $ At';ID4]2A v!.䥽:.+Ǝh < 5g$ )1J O!Av!Y MшpIKpT !F}km]I5Q__h( +!9O1qD=E3q-iwfkG(:,: ?ox8H,vzӎ1,HeEM'fԩ3D}3B#ҤA* Uj4h #T䱠oAT )H 0R1F@Y 9 Lg#,^3J$>uaA4l]·Vh/5aG434o{y4Ϥ&fB??NS%ԄL17UۑQԄ Ì0b;ܙa5 a'; Z `@]2I.c=4᝱_m JCIENDB`PNG  IHDR226@:IDATx^[hU3{ EXRS55 Z V0``B(^W/4KҒX>*"Zں;gݏ}7=g{<\-=C;SE2KhV ίE Dc@%f[H$u8ק3^x:;oҖPЦ'ox¡46TЦ2ҼcWj<thvїF$52ķFӺZ#"ʲw-ME+X5Zq8$q8&)('{w*P!qӸiUo ˑ+Dd'HԐQjLS`LP.M.)СK@DxPKshXOˆK.ĤIjʓD$dAP^!&%!.!1XH5.+%3hkmh5e-KK$y6i OI,rZX+I\$8Lgjז]jݔ`V$D > c}ۮ$oI\^Z81ۥLmH;$dQdXv=`թ-ĮFHDJm!gZ|XnϞ=|% ɓSWS#Ŕk=O|='q*!` 6G" ߠ5yQ:GExV%G<&` _d~G-XKzN8$/o2qxήw^̩R߿\PP 9bUD>ПL׮]#,@>ܹˀwjnnV26HuttDwRbyw\-7*nEDec΄1x, /$TRReddСCق{^@ 4^kgjo*,b=gE :N:{,ݺu^JO|tRO~ѣGwmmm !\$rA軓l0d&ba@ KۼR||^[)xe` oN#za bH^^FCCC OT[[K^WɼBdIq{KH"m۶h=Qyfңhbbjxs>QHaGf D"<3gΐ15$3f9;,’,yP"RiDEN[ڵTTT`XL,E(rκ2tz}B˒5!%6S`Rq:`<55z{{8;[.K}dHm8F$er|C$sBXIb{·}Td֭Jdzސ8ݴFRd4 o L!զ\⭈7I=IVjm߾l U ݪB)~owTUU)jo8?VECriÇm)..f Pʪ~0.p raŋU6ZA t!`;v6tJdoâHփBn+ԧ;IԲzۮe=+ZBs,y<y]`.-+% Y,ӗ]"Z _RKCP[VYIu\zV,p| B (jZVvYE$VU5Pn\R>R"c6x.vBY,( ĎYtI6lC둃2]Nl)֠r]ܗfpx{Ee\ Q)d \KBd-$΃ϥcXEaA?S_n/`IENDB`PNG  IHDR226@:IDATx^핱 @ E JzZz@,k\1!I\'ˇ1 ÈC>@IJEҬ\Pm{TW:"fO .Dád!:ƋBɮ:&!4@ B*!t o(Im:sHLۚ5gvstW$xLjƬ׿F szG+ka7k‘0IENDB`PNG  IHDR226@:IDATx^m\W߹sw1ټTֶAH FDQԨXXV), b*HTT|*Ii%VcJYJ[ll^nc۽G\p`~Xs[l%*-TRJI]oA?C*i_is'M[-x۫ZӀfR {lYk,cv9Ho5k)=l45Mھ;reja\#<9EiJJ2,wah+B!"-]ur[]Xʴ٣.1u*i >w>F!:D@ >;|Kyu Di`O;2>w3pzZ" ='\#0k<刳J%tu,8k?e/azR D-xNw<_=FG10H/rZ%k]7k=kv@Nf>?߆_WJM-vm g>NO?]T"F1D6|Ɨ O/TRB ޴"[7>Q'*V[ >Ȍydt\7==;^JcrYBh]5kneY XfJH]Cڧ *$9mma94{XP* |{iSaqE [>KDq.&3T(kR1}}um.LDI3zmo4fDuduMz4"qKZY}6x V휲aiw1DmcH+1gԘQ)M@ѾIe').;&ГC$T$4uDJ.: J]T(Cl$R*P$=R1 )) $ D 2j sqIENDB`PNG  IHDR226@:IDATx^]Te;KV^H)D E \EXX`E!QAa?E$Ja.Bi%*JA,l7;{~찡'{Gd@@#qB$(}(*6&R5/SqT"`\ɪ ׼ܣxڊ>H,ӆjTn-jRmr2 ENa"TSD7I"p8$'$Aza2K(BO82&SmrEh *H"Ihζ| P(ġI2Tڽg54l!xV8ljrhKf8 f0ɂ+orHH]ogg,8B"3e[ xjO`OҼaFdfh`0j~&qPOBT1[$8ظ'!HdÅo2Y@¼. aaZ~aIč>XxBY; BP$3P@TsǍkB_^C6,OD"fAfudKEQoQԷ_x}cFu峲n3Fh x1eCNG7^{vӲ/ c>Om6q-1wTQG꼒kpMoRD|1$tV"BDu$.D%fB"8ga%_>w)IENDB`PNG  IHDR226@:IDATx=@ x)XRh7& +hwvcͬ +|(mvp(8ӍZ ~zb)Q&[{q/ۇ&cXZv&Xd"ncߢrg(q|⿃H H $&5?/9WNLKгXRs瓤RE-m~HXIENDB`PNG  IHDR226@:IDATx^JbQ{EoD+"eX ZвlS~ z_w, zCZpwz39,;pa~pAGW̥Ckψd/3Adϗ..ΗE^!1g ;a&21㫄H&2Sx"LBa<D'tffMq#:0&8Wq DP$qϊ"|@znTg4GK~mB830a4ZǎMJ-|GTP83Q :xNS/Di /u ^4$*!k&K?.OW""̣y𻆂tΤ;2%FãmHyDXox5b!o?  (ZcID[b*(b~䰈`޵Qnfҩ%yf]\gbIwQgv]4 3UW=3"*aftCSyzO7{m&af 2UBGiLq넎7J6n7f܄q3UB܌p#nF%ݎ0f30Ska5"fJ`8ƚJiafED(KFrZPGA2/!A"ļd,^3  #$:h.MIENDB`PNG  IHDR226@:IDATx^AkAwd7MM" I7mlU[^z1z"" ؃'R`zJA ccXABaf   IΑ@/j B`a$!Il,4!.:5|;CKq&YVF!}@+L'$ #GtBC,Rd 0HOJƔdvjN=)"@·Jm!F-s2")̝s^^(Zjl'JiE;QɽUJ56/"!+^1,ظddOd=v'b퓇roD@0WHoԗ7sg80} &I?a>\ïW∯9a/7>.IQ_̻[kq)f8~jJ 4^1AZ#d*!cT&(2+ bTS8A@doH9BPN>x (/gX_ND$6Tgdp踙jX )݄[  %OAIENDB`PNG  IHDR226@:IDATx^NA" b-B(6/WO> <Z=`6쬉]&3 3 ","^ 6Bc\\#oG$1iOaL2$㹗>)}D f,&,""#}DI>&"&&<族A@Ԅ xz7g'= x#L0@hO! 2G93Yz/O~~rg5Z0>KP$ )*c׏`-Y,D!GT j2?B"_H , (beTHeYeuq  $"5Cr46 dCE,M" 4g-VYM"&B 1&( g ƭ0!/-2X"G-o# o^x[x-l2̫[8C40$;w|͇ORZ09B/sXQH핞/Vف"|WB S{$P!_)Q} ?77PbLS8 Lz1[XF!$rXHz}!!fԄ)`Ԅ٥bd\bmK>"-ZHfѼo߷M"",Pi6 TPd&1YY&=" "2XI""3a1wA 1.@"< ?=<IENDB`PNG  IHDR226@:IDATx^kpwIݲU Ҳƶ`ŋ(a^,0Ao!8^vy/S Tc,KI41+ˋI>BHIyI{$%l2ƒNqD#Bx=Ea! Nj rv 4Bl,1FRĠHE!A珵8#&T$Vo1(XdI'Cr8+wh2N92{AjA%^}buFzM~j:e /Ma[&ֺo/Zu,t~ i؈Z[b?;] EM|'$A~U.m%a"}wd%Ml'^4,_‹_6/OY0G|cZuW:]A%5 c;mh24Oy!*C CTj2I1̜8dd18I^k18B0F81F6pM<%3Z}zJV)c1Ĉ0*mbO VRxwUDaIG s_{N6bpd"r2 Ѥ8LpscWaC4iP(U8̰ݑnG%= FlPVutRIU6%C3H t"?8x_<05IENDB`PNG  IHDR22?dIDATx^ݙmHgǧxR1|stlsƂ ɾKi [ؚ1@1C'1hSږ542ͷ떛xd!%aE Dzhw V\ jAL8ᛚ֌6777@D+ccc{ ʡX. ݻwNLL7?۷/ މ4N> 9ʦMt.#gn|?aX;N @lٲ%_xw7]Z*` # J9 y<رDOMO? ~, ђ>@ 0pTZ:i}2mft~ݸ0Xl`?=X_[ϩS 0aؽ;w( a}# ┧:99ܘǏp`2L3.f}0}#"a%1홝ȹtDoo`'r 糲}faȁHX8?QĆ-a@\.Ro$AbYɬg7<`0H@{vaߠ6 #ǟFs`0%=GxVgHT8ʬZJ0T)T`̪}#5HcZDq,7+gϞ'zw ܿr$;FBcUC kuuU*bXW٩9gzgzXww)x>d,',r8M E. RG^ѣG֬ ?~|#??UU}*n@bb"uN< rt]* 544(x׋k;::ڱuwJuv+ +%G ph$''L)t.GDKfJJJdRRCZ@򦰼$2 t:(tM:{,q֎]~}4{C @Ú~53sV5k(ǃܢRtt[~gXX% p>"f&{N3$77hhh@EEEoTSSC }V% !^ܹΜ9CB5ZmFsyB4J|šg>eKb'wpkr Dkx"VWW' >zzzj:H0 W`aX-Ƿn; XfXlO: 1T7A=1(q\ _ ɴaA$[8Vv^?%sXtu7Xe$JAgY1e.+fPTPuAs3g珇y3}{/.7]mB{~ώu?ё1OzY{Ÿ?`nvg/g8;ѿ Z%gG_k![g3h#`(ёcUh⏢mVd3g^ܠdʧ/X֑OI-I| U4lK~{OA-S6Fvw_w3Lbh֠SI>?[; @#|x`dQys_KNwFmYe:sbp1:j}dd/֟e Z6;ȀKmBT)((((((#ڶ /[(&]g>.߸+E,UtI3n FG]?QX wk~S *_N[k]?QWK(a&'[??ke2_JZȧM݆zq$a>,JmE⏶ȑhG%* NbEOס#df wȕ$o=v[ySXc4OS⾜gEr7"\|TB=*npJuOf8OAc}GG䚎G?vV⟌0穬ϐ7| :?r~vtߥ}2{3- h7x] I%,&5{q$͈y@O‚e?r!FM10hB?$9tLYpni%X?`tWOiX'@,Z?y&]в9yZb%#~9Uqh :t8Qd 0A:8g52"U"j¹@Qy6t >i>"m;Nah'zl# 5D~/5:o ߴG ;KzptWUh eP%_>m]gP;4e1sP/ρba'OHm%,cNn?JDŽa_%+rKIǿ*~'^? 8 z:@}]sz1tM?)1-&A-ӶϵToƿm~d4/=C&7cK s]m!b?1G?i?݄1| ی>\}7M gЖFD -@UG[HL%c C5 FVgmlO oA+;k*+6_F/Ya_MdZAAAAAAҪ^mBm;/J-ƕ\qI\6y63ͧ%U3ݧA] _ P/Qsp&EZMi\w't3Ijo ]ؿ.U%)4.Hq @?oʿ^r_U|;ZA||8~w.hA릋/ZJ`|m(s%M0K>K,ރv+ib;Z&?M[yLKō(4_C9TzsFG@{vob1 RdACەX/GCGqa>+o5k6 ϱ6i2,3)OCu  |$vwߙ>{ag,S`a)&A·٦s8 5mt>bng}$3|?{G9:sjnxQ΃\~ß " tﲟO&hRLu}{5y!:%ypgsG|>gr;x5OMg:KB1tL房[/O6@6 ȗnF;g}!(& _8̨b}ӛ>;A螃OgMP[f'c14!]O~ސmƟc` \c[tD >c;Vl+ : Wheg BF:jg}(4kQ*g6'ocBدW̞ZV1?`_]'J ݁WWȲU==9Koo{ؗg>df`LHdm/[lgxɎEGϘ}/|ĸmTTw^I4GعeMoߟ~v*`]k6z~i[>}Me:|gWbĜ"C鍆g@ͿӲͲ]Ɵ]m??+>oZQ ,.Ǘ8K)szbf >X|3)4jBezk|c3j/E~fm?'2+1_ʘω@ؿ5_qb@6Y7mKfHl,yÏZϜȶD)K2Rkv3 SO+s#Jb-t1b+<6G n #;/VbO|/9f?.:#ţ ->_s4(ٟS(0UnסPu]?1ua! wڏVl/+?3..˰_k vEgS~t]t]6+9gSzV}<ĭ.Y|߲? |&_?t~&Yga%GA2kq3׈?'YwşFW`#s_̙hisq{aiX^N5[ȥRXh?}ʿ&n6V^1vo9_s>55_?9 ȼN8M׺;` |Nܓ,B7ƕ.>&wGn.-&\of$+mh?$((,TX`hKdȾ ]Yk@HȲ.>P >w>4;g>?w'M7?k\ f|?s&ӷ+,t-OyKllJI}syc9CO'\]ߤR%vqG-WWUE_\R__yA5_s{w=D)}د&$W+ti+h#J߆qD<_j :Q}^Ͽ+ 70x]WV=$d֡[P0+݁,\I[jVWUP|wawO~ ?ߧWU W~i8f!K_A]-vG>TJ tFaMZCU|,n^[pQ1O8U{Ցlj*PW2c jAuQIј|_kOIMu/g|Ќ?_|6'l+ô@u&&5oa+Ij (lb"c'd0x ֆ#TL@  5|>xsq-WeO_wG?t [x0YU?$x7oWPȯ7:y5vۢL+'זJeEUG oC_W}W<ű_ߧK 0{_YouH7Tچs<Wr<5c  -_v@Cd;0b55gs uj`Wv`q|ϙ(>= :i/;ϒ:t]`;TOh|u= {??]O>oaM,BG> J݂֠c*NAZY,CZQ!]ZT|#kEӛkۏU-so&OISt3-bɏh>~<% @oZ1|lVǍx6c]9Ǻ`Vh_^kq ;,5jǬ?S~F3kdk^88(((.^8氾_7bqڇ.B9OF_E~`jH0l~I?Ua?(N? Յ!/+7>X%%i÷yy%0Tm/<ߕc4h 1~(^QGv鳡u 5bZDgV+_{?\3߬S*|گ4.9oz?xυQ_^̜Kox8< USPPPv ,0`?nڄNf/Z|Jg[=ixH{3cw" ~DK H86kOwv8o߫Ϲ[̞~~g*9WH@O'ƿw֟F]mnG"Casr"O_AAAlY~rZ`e,tꂸNM3_˒& 3ԭ f?c_%39mOCl˺p۶/+G'_ n`g*Ǎ?*nYd] M]PtI dw-vc^@~}FцV`=֞ 7~a6Kـ-6>8c>"sj -OOGuh&;̞1w cIP= _^Ë2Tvo < _⯵϶_ Ōo8qmA뗮f>E6-|4c}qoEVoC~d#WK;U*ْ[d3O'1A?0h` ].ɘ|_$U,`sLcw;ض-D_NA i?gG>m9v.Vv&Z5Gcp5EB`vq-pO>c7nMF7`pLe їPYUk3a+%,+&jӅ`䏉Jןn5( jtYTe||V*1BHi^<4?wrպ`!?Z|'v3>:GXV|ߣ?J5(" [:\@Ÿ"AU|{B $?A2Eb_o|zA,D^nܤKVS6 G{P~ ;YECv"]_xt vn9c_&NJ *EϿ?&&]|@[j$Jf>7X$1Cu=rԺ~򹖋oWm^6>XՈۭ'3AQϓ/jPwdmi;1|vOѿR;#̶WB\>^/ePsU/iH-Q,fAAAAA_f3{@'VWH|ʛ53){+F ` =i Z2 rd=-r\#"kf_:ߟp ] u\ ˱mOw/c8ڎ1e7@c|?wUv,6`Kߧ2]|9ӗ<E;'Ó>mO{\gLrlX ⣓54Hl߁ H"~7??q,L8gDш$,Os69H"Ŝ\hW⥔;2_>TX ̥; AVY[jdQPPPPP(eb#8vďBGzVΗmWn9˽JubS^koy6 -ihvyڊխ_7\¤fɊ}of_a K^%lc?~%?|$."lc? Dow\n7b[n4h%7&T?er[okBdbq| c{ŧoy>c63!h?77pQF#W"ߌ?cc@~1Ⱥ3߉]m~#o=53ƿ=Ǔ֚glF|n[4ʡ&p?7qfE?q^OeE_DLQMo|2/yoZYH!҉9AAAAAA 񼋟氕D엥y(/gonZ[^ ._@LȳU3|+KCHxS#Qoˤin߬ &w!l$9ѤдE ~4_~}eP>A~'X8F䷁qE$)h%ܢssofSP]YnL̵Z\iY{U`;jZ]b?ڊBйv=hG-._,"@ZrnY-(((((HĎ;SU"~&6Y-o6/Ϫ I#_6 Y=貹N]%<W$bV p9a"~-A~%_ΌZL71|tE$c"M_l6ܪ%1pO7]ͮ?s̄_Jh*E/+̌!W&?OK>cVlX+Ub/cT;QNlMEh%P|ʪڎ4:v 1X4?v]AAAAAAl!)ZU+/I9L[fmy9{::Y9X&ʹoG'96`H~$Ķ-Jw/7oxvH0J-NBm_<ܶ; 67\ \Z>cv^X;]hC6 i?!+boU%Q. YùN- ג` 06tI|Tڏ-3M7;<4&kȖ-_ MoZfCwcʋﭢkK)]qM;T쏮?sakZL;vE,ס(z nQdq/b~pIENDB`PNG  IHDR226@:IDATx= @񩬴׳(譴W3G7k$]y&4k+87#8#?66E F ,FBNTdC0r =cZ1 !$ 0 #cbUqYBadR,//AJMuxԕ׵~ߴ³ Z@GGqđ!Wϫn IENDB`PNG  IHDR226@:IDATx^[hUs&ِ65ِ4iLҤ`4E(XE-M)> $hLGeݤU,酴ݐIpgI23'v]8CO9˜s۬@!ېCdCm6?$'RU^.eGZ_ٱ6R@`[c0VrSʡ(t̎q 5F>h:&E*[H Q &\bqF1}Sb C\AT-mUnQ(ӆ4DYU eNr^ 0.HG2eUaQlXa&ޣb~N)Q90]´l.UnC}XPCF%Хz >vF qt](=fGy(aA}јogSGhx{'FF M0_ Q/]bKcϏ+|-JoN/iu,Sr:(󙽎g/f3V4_+kS|IZS;&Jṭ9)<..wR"UZ/5_n|2ؑwl.4˜|RA4H|Ra[pbhN GPXqfS\b SͿ#⧥Sx-R4Q gϻR,z "_ *4#*?3-(6YȟIENDB`PNG  IHDR226@:IDATx^]H[w'Fv1fj*MN]`;- v`W^aSevcCA֏dqRcγ?2' ܜ8{|y$r$${o{#٘ǐ|8Ph!GyPF @~QM/qG&g?kW&} ȃ#д3sPI cspΟշ8n6 $um,|lV ZgȉH2XCTQB,b?c+FJY8[t0b7{$teUH+j6U%(i$*Gv"]C 2LY`$)IG!$jBx`$OH>xPh)Cu"L6(epcљw6vح:0QfY ~QޟFOE1uD,s r;sKFno&O u_~^OgnAa4F6WV"7c2 ϡJ)vK0+ߓmg0mILzh7Inϝ찆7#j1M^Z xAqRjQ²/~D=]c|swj2KALû<O)^1ɾ*cK=m(OYģ|#bS0Zh{{']gΦ'<`L=~Q&L=+تL'bg^;vjmj7Jc7"VO:%'Q YE(Tf%8/jG#"iFJ ?TI|ȟƭVdC=-7JAăRGQfa'=d7R>_վKJXIaMOnQr/Pb3tbP ֵwS6KZ|(3(uK([){ V<T nˢKpabY U3b_lo>IENDB`PNG  IHDR sIDATx^ԱjP讆8ƈSF@,[ri򛿳?/JDzx:ǀ/]䉻Z.N浓8B]t[D?D+hyF3ȣ@HTABP򗀹\ngo*rUpzH*\&+TZ qOLƁ01`!a3|yHvpf%!ĿHtIENDB`PNG  IHDR sIDATx핱jA@_PD;=APHVT-NN@IaD D76s9n.aa=֝// XK.ABL3"|6Wy6$p< +^V}%K BgVJ8+\ "L{-|R:5:\Ax#`m|ZMy%x )L3%yj:T͞= H Lo|IOb*s;OWs^Ŭ0^e3pI!FG>#(#)6{n"cR1 |CP`W #q^ֻ?1P0bԼpv5< 1ȻF&)q7]l,nS\FwN5΂B\Fz#c+׻<2YR+.Sm,݉׬^7".L+u|eI2ŲAYXO ڞ4UW +8HA,yvmAIENDB`PNG  IHDR sIDATx^1 ѽh#D._eLCd- >9 8T`FS sT3|a#?Hx', & $F %h6BA]IENDB`PNG  IHDR sIDATx^ԱjPƔh [rv(w"(j`T A}s|r 0RYB8qppypU 2k[lejMIP6fDODXl7KP< @H{M3+2L3 d%Ďr+sSSs+{K+ y>m%!<ΤyHWaF[!΍R0ȡc+8> 4y%IENDB`PNG  IHDRqIDATx^A @@ߜmO(Rm-0 "Z~\=t${HCM lJP).!YȆGL7hHV5rǐ;n ̓e\:.q%,'yhWD*ET%/ ~l5Vg& 0;`<Y?*MAV &rCeQ {5GY" a(0J YC"KW"wj"HaB-H f`_58V@sǑWas3>2͐`Lx `SQp;^?7O3 yᨙcQ3 yN= g_!o7 v6^IENDB`PNG  IHDRMIDATx^ձ@%H&i$.H8!U4lj>֜+z w!IQ!Ӊ:AtkuЉh˸%+͈l"ݴEY~t߮LOfnAurlƣ%vO :P` UC*ׄ"'Z"HaB+H fh`h_59V@sQas:OuJ#nFnt 0~x `}uyr:6뿮͚VǃS9нllh`!/.}h/d:Q:NutUޣIENDB`PNG  IHDR s4IDATx^ݒ۪0EWNV⩈wTir|uq2+3d0"`1>²9;2E-'%B=GFqa7t$L84I-.`Vc~;C-sF_bj %=k ThRRFjBDaTkTl %SP;+$Br)X0Vƒˡ<9`"R2 3)*WqRH!Uk^ŵdJDjw΄\ذdIS; V}JF 9gOsAYQR`[:gIENDB`PNG  IHDR s_IDATx^ݓ?k@@`Z2EAP"EpQuQAmpGKn}w3B>r֍%xa=daĊ*qj?OHRg"߫|B7P$GSْǻݔhJGcb):^ [-4*r$avhph#1 P 4>pGh8B FN^:D$J2h_5ɈTxsC“K?_(b!K^+5B*eM%j%3`\|85N#ECGh v, `D$_IENDB`PNG  IHDR sIDATx^ݒKrQšE6UE7'q٥\Ї}`c`Xtpp=V=?쑣Fu'X:k>wl|Έ$f8b'#Rɒs V^@Bc8?W\m:k m7qLTݤȶ=ūQ1݋{mhd 4Ш Qq#rhFKO`P"@tȋpE,b& \K } u0(l!hdM qމAR󊊧–">KC2Pp̽, Q]pK6T`H)cS$44g@3* #UlIENDB`PNG  IHDR DPLTEXEtRNSX=nf֪ij .[fxFͨP\~0L?7p4ftwGIDATxڬr0D63{xfy}+ŶJ8 V;膆1MgZLt+Qϗ湝 ɲQI!i}az$ - LHj?^,~)jv@R d_vid]j:B?lSQs-;T|r=/?gǨ<;_r/Wonֈ: rHnScB 6۞J҆L IT\`QAY:t>n0"9A^To<a#13GMaewIENDB`PNG  IHDR@@wPLTE_ch`ci`ci_diiii_ch_ch_djUU_dh_cg_ci_cg_dh_dj_fg_cgajj`chaei`di`ciUUU`cjaeh_dh_cj_chchh_ch`dhffpaciajj_ch`ch_ch`di_ch`ppmmm_dh`di_dj`di_ci_dh_ch^dh`dh`ci`dlhhh`eiaehbvv`di`ci_ci_ch`diddd`ej_ci`di_dhffbeiddm_ci_ciadjccqafk`dh`ej`dhddi`eh`ci_dhbgk`hp`ci`eh_di`ciff`dhadhffmaejffsadj`dhccm`flkkkbei_di`di`ej`ch_dh`di_di_di`diadj`cj_ej_dj_ch_di`dh_dh`ci_ch h|tRNSU{ ^:Mv,ֺyǝpΤ@rL oz Dތ2e.X9 b#:T6(N0=k[c3ѷhc ~IDATxS%M ෷m۶>hMU>=}e7NAI &UWċCe pȉEc$/,=L>RIXXKk?^wb;H'-6*i~Xp4R?7DXu\賧8LH`$fNJa;E2?& sEI2 EqcMb1'X!>:MVQ_ZIV,YCU/=B!8봏4.5Y}_vMLU*[92Յ&At 2Mf"OyyAh$JuY8vͅD5C r.TwIu(RHȭy|iy!t +VrBS$Q1^$Y(`Fx#dFcҟS%s,>~;ҁ[7o?p9}w;N|#V>|IENDB`PNG  IHDR@@PLTE̚?TtRNSU^{ :Mvyֺ,p rͤ@LoX 9D2 .eb:T6(cN0=kz[#3ѷeIDATxbJKm۶m۶wS5]ut%|^`; 77Cӽ@;3d(JCK:FdsyjsYI Y:%\*R~knj*ЕXvpE&m:AوVt3(xxQ,HV5"63яk/NCInMj$席Ǩ$mX\USi&i-u@t&-mp 48mY`D?Dh m O[$k,m9QZhQ8BL@* ]% G3-}к8G+4Hn=ܘ ]\ݧt;wVm=:%1O.}_YZ| &5Ԫ$h Σƀz4@.*h=T G(& ?UOMz|HS3$C=¢ʰTX\96[A-6W6IEL+" u05#wI~nVGа1```Gܘ}PtA?ea t-'AS.?uN$Gqc>]t>cmHOoo9[6soIENDB`PNG  IHDRPLTE`dk`di_dh`di`eh_ch`dh`ch_di`flff_ch`dhbii`ej`ch_ci`dibeiajj`ch`cjbfj`ciacj_chaeh`dh`dj`dibvv`di`di_ciadjhhh`dieek_ci_di_ci`dj`dh`ejccm`ehddm_ch_dhadhqqq_ci`ci_di`dh`chbgl_ch`di_ej`dj`ci`ei_dh_dh`di`ci`ci_diiii`diadhchhbek_fi`_ci`diaci`dh`diaeiffmadi_di`di_eickk_dh`dibiimmm`fi_dh`ej`ch`dh_di`ciddo`ch`di`hphhq`dk`ci`cj_ch_dh`dh`jj`ch`ciacj`dh_di`di_di_di_ciammadjbfj`gn`di_di_cjbei_diffp_di_ci_dhaci`diadj`diccqbeicgkagm`ej_dibdj_ciafkff_di`ej_eh`ci`di`ci_di`eibgk_diafk`dhaei`ci_ch՝7tRNSJūX͚( "oIHAgƉR p+γ~j6B 􍛺4˔[huUi1QKd?#\φz'Pn5xХ Eݝէl}޸YF%vNyTD>*0^2eS3r9k7|ZbIDATx6cneff|̏̌wv:ә:Yږy;@Ė,Hp2XyuƩZ]vhwme 5ݥq/nO0D- vcZY_ %J-IBjS0VSO50SהtS T94TA=LZzcniesm]}Z}p 9ZbT@tVΌZYG?Calh#VcP;-.@i!4 4eCd/>1\P曝n!&qG \ӄjۂ,9CJ P' > ~ jnAe6FלFr1hfr~i92SPi>lNBPsT'́R-s,ZPNP駗1Bw^cPLn+WlJh*W/&L/tkgh3V4m zAp?$H@w:(G`+hn[\$ >vz [ȗ ޶FEJzFd_2JG:lFс|=@t*1B^-AAuY+# _5=6!9AFrzA#/ Cu*VaY.?w&|\^| XA5#: vz+x!KadֹNJ< jx8v)_Gcż|'G~5gN{勳kCuPk'?ǕԄpXdib 7X8 8(E"k;hE]"M]l^9= nNH]? Pe#8襮$;!јq(W\ljT&B-rjVhew 5LRV܈K ɘܺLk}o^VLѾ5WoQY9!X HfvM Mx͂LIcyLlI>4| լOq>@#_-FgV5A~?å2 ?*q͕vucl.L+{Kk>{S^{|ݯH^ vIENDB`PNG  IHDRPLTE̛x"ItRNSJūX͚( "oIHAgƉR p+γ~j6B 􍛺4˔[huUi1QKd?#\φz'Pn5xХ Eݝէl}޸YF%vNyTD>*0^2eS3r9k7|ZbIDATx6cneff|̏̌wv:ә:Yږy;@Ė,Hp2XyuƩZ]vhwme 5ݥq/nO0D- vcZY_ %J-IBjS0VSO50SהtS T94TA=LZzcniesm]}Z}p 9ZbT@tVΌZYG?Calh#VcP;-.@i!4 4eCd/>1\P曝n!&qG \ӄjۂ,9CJ P' > ~ jnAe6FלFr1hfr~i92SPi>lNBPsT'́R-s,ZPNP駗1Bw^cPLn+WlJh*W/&L/tkgh3V4m zAp?$H@w:(G`+hn[\$ >vz [ȗ ޶FEJzFd_2JG:lFс|=@t*1B^-AAuY+# _5=6!9AFrzA#/ Cu*VaY.?w&|\^| XA5#: vz+x!KadֹNJ< jx8v)_Gcż|'G~5gN{勳kCuPk'?ǕԄpXdib 7X8 8(E"k;hE]"M]l^9= nNH]? Pe#8襮$;!јq(W\ljT&B-rjVhew 5LRV܈K ɘܺLk}o^VLѾ5WoQY9!X HfvM Mx͂LIcyLlI>4| լOq>@#_-FgV5A~?å2 ?*q͕vucl.L+{Kk>{S^{|ݯH^ vIENDB`PNG  IHDR66Ej&IDATx^ԱjPvtfgߡkVw'w7ǂK@G:>@Q\Ԃ>4dx9G?DDDO5LE$y ay?$%gD* ףثoav{\9&lW.-Tg}].$/)s9\xa K#c؀yY2,cIeb;e1a æ pg(a?`YQ`1 cc:˰Űna%A[9> 8בSIENDB`PNG  IHDR66Ej$IDATx^/QuwtѦ`ڍb]lvA'SA?b4? Wx#x;xrCDDf~ T3/QuXy`Eu&l:ijBЂhRŅt={C&ja5mվrBbjp9l'Qg/awư;2 ș$0I,\S~0l yFe%F9sIQ+f2a c%$úúImDDDDD|*:}YIENDB`PNG  IHDR66Ej%IDATx^ԭQqFfjb^Ŵ{^F5,,FXw.awpÜxS|^Lm& aY.Q ؀aEF7DnЁg= G5/"Le>M!|a+V`4aB}Ʉ|%.0ߑ1@dg @ 8 xܟ01aT`'}W61I ;Wb1;D1a ۂ820eXaĠGo\F֗6IENDB`PNG  IHDR66Ej$IDATx^ԱNAaAВk4t&5Ґ^d{Fu苐G:EӎpfEQFOk=HFԣ"#s. +j@w:?0{Aܧ6%H.A)- ,S ;sXy9Dڳ3lDd3l0lڙ g0iE*Kaϸ,akžXgLqZW,e!Y̰AA̰ A YC_<6wIENDB`PNG  IHDR66Ej&IDATx^ԱNAFaQԒ +4t&`s0q|| 1(La{L}Za}X "VV1{?La S3 QlKY–-k}_^X0)LaX "úúEUpYA3߳]?j{lIENDB`PNG  IHDR66Ej%IDATx^ԽjAa--mD\B.R xZjk喋Ԁ)>+Tp9~eBRQm؁y`Т  BUlo[wQu8 0S#}O(>VK>mT{}G7>$ ;fnl0=#SHH"g\X2wvvN?301a4a 'y6v\pV#301,cI2, _3(?RIENDB`PNG  IHDR66&LVIDATx^ohU9`#]~#?2gzL3c!#l4AX,I'"lɹrHldJn"~m`5bVRvƝ$s!N胵?vs13Y0% B*%"zo-a-|sP=M )yyT/dYhd{iwP]B Es0wd-pX{vZ.KD|-gR}1fX"\FbIܻ߳ԏ$09um2y#Nlb1 j؈ 80B. cM#2yvzMc k#:1WEqDXIC$4lDUp5/H}Auu pSȣ4(5^kU)V# 衮X=A # XFfaqrs`G4zaidB4{azV|d:{Y9Ҭ^+4X_ RчwAX1,"aCq0F!ȃ#b/R `-eI!Ґ=D,h_bܖ|9Se#>̓م YF*E,rJ)a[#eGƒ E&bDC#1Ғ'r0q\G\ & !N,&$#Q`^M850%.VG[\8le j#M."(ԹG4ZG!bccl^N1ƬŎO8;VIENDB`PNG  IHDR66&LVIDATx^}hUs6os4X j6+`i6h b$Ӌnm"P'H4hmDopxg|pyrʱNVl?SOF#^`=hF^63HES8 ,bI6Wr4E>=kP}0F :8mANQkuT4@x;%PAȳ/´f؊LbۖzUfs|v̽W lB*k2Tt4`?RbGІ :MKTvtl?̏F3f[\ɴY?7IfRy|f<WJ,a/:{RߙQU,f ؍`~yPlbhp9U#l ݳ.U49k֖G.bbS,&B7j1dݎ؈;NVkNI#1tY}Buuq8p$h @뉰؋=QT,~X,l5˜0d"\SbWfA]k3V$lqDؠɱ!Dجc=3_٣N͹J?qu7 8ϙ ҀfYe'3"BE؞y9<}WuSgG 5 b f3 -F&("}ly'ěp [m |JTѾE o-"Q4>X3"e9^ GЀT-X/Ҽ=0mY6J;l@M{*7C,GHtPC:G l-Ksܥ ^-1\@[ʬzy`Ͳq#L!8F;C*j~7Av"L_؋0 !g`cL3a1#lA9&rg!IqgnNT%3O{@HG iV+VTN"tN-/VA]WѯL"Z)l„ԔK 4U`fA V)~`P1SqekDOB6g?փNge 0’P^#@.Z9t2no̶Kt&E\DLRify_rb#E1'O,Z:4Uka C?ǀ=IENDB`PNG  IHDR66Ej$IDATx^ԿjAaGl }4E>`eب^Oq[baf7gcA?d,!""g~J`s5*YB rC ݬE F7D 1+xzD% ={5!M'S56QaKֹc2䰝FtǾnv!a+l@dg}@ ;: ;xܟ01a4a}7b|%b~4G-+2a cđϰðϰ" aYC S,0lIAY¶`(k_R1a ۃd2lb1l2 op|`Qά """"jCIENDB`PNG  IHDR66Ej&IDATx^1jAq5kRZS{~K )zRD;Bfv} ?9G""';y C|d5+07I"NVBUZPmXBߣWQ_P{s@E%a sPawj9l'Q'(ݱawư; 0)șaK"aGaG301 L Z^~(Ӽ('b1s01l ƒ˰Ű˰"`bV,>@DDDD ?eIENDB`PNG  IHDR ~6ze gIDATx^ ]yHEH#4}Cj$$yffF!6Ɖ7Lql ۀ ωc9߱.i#)&$B $ OՙSo}snۙ:xyߞ?IJU&ukյY]]az.1ݸ }4:[Ik&E\Zq3 (\=pw`竫ZWF^xm%sD\czh,DɑmW8l՛Aձopgzi}>Bp4`k@ob>?׋|0<.*|/%i^&ߨ 7D<0߭šy٠ax>/1?k |[7|> >ox%}LX|^o}^WM,?4%a[a C1vPh~2Q>/k~,nc S}<{5?o<7yz> Zî\y߹ZZӺE'mn8JΔ yWCtq>iNtO7E2'Mk =Kg^zSr.kAV)^^R\+; vڛUv5BXsbx sހ^n|kݺSzệRe{T}_Sx\ 46J?{XTw΅^iUa@F eh^ 7`>͘^g! W0&}H[b>"|>NDz`LBk}D>8W\//=oǸ1Xw|^Jߡg8?rhڮoa>̌(9\ :|BiF=䠄{7I/H; t[}73zYp߶GUWs8H=to߶yVo؏/j{41IV[Pi 6W(ag\YJ~8a(zP|Q+5N3/J蹲5B75>W.\o=@A9VzjOCy4PQǽu %Ut\w)?i|z%a- \52h~>oz .xO٨{rbދL)=Ã>x ,ΰ4Ƭz)cqsOa|ÿ|70.yof5V\>CypS2pœ4:ZYHoo&ʭt +V*\J.) c\c%n#^\<:G^3Z9|vJ\r)quE=ڡv䘫3E}ѥ^)/p )>?:8vW) z >yU 1.׈Ϗ++pCoC.6#C!z їSP|=1Nq{vJp $a']kWjG\zs4|p\:^=Wꅱԕ^Hcz]_Dzƕƨ"ao9P_Oz5SZy3B/` Z`.Z<a7 e[27̿n^. U,ГRz k!6^+o˥A/ϕSvyo\s;bq^Ǽ\z 5A]sHZ#QkU/}1;a sv6$s<뗦Ue^{d.SUη^Xk"ۖn>鉶!jMY59r5FgW2J"Wk,є&15%*eqX Xm֬i;EËL!J^1rh¯w2ך}\3pUF1Ɂ1WwtuѽW0҈kJ|c+^9\.|s*1\BwWWzi*!^ۛ^<7Z" z!6e+]|'y6*zF\ HH۞r+L!Ƥz3? :0GEËr |)m+y~8îHZ{l^zM^pM5>o7Ø 5q8Jov99kf^yFV!laUyT:EC65,?d(G9QKFMLuQR=u gRf۰|u5rQS3NUt%3|kCf`8nOYv|hfwtDY \JFsE z!F_~^oT ү z<⃴\kq1f?_w?CSBą{ŮtC5MjFylVMKCӢ$>>;8\nw.,؊V^{wǴ9y2M.)dta|aXoxhM_my_!6`rJj~ l!\=w7ݝi <W%zu \ p Djjݣ{zٔp ^lɵv4:8~R7p-MFmq/jյZf"![rM6pUo̥ p-o%55?EpbbO7\Q?^l^NCGzkż\h^O9P|ͣٸ3_rT.RpdÈC}% +P}=C>oٻhK6M+M}Xr0FuDKl/"4ׂ,z-)ּ\dZkA}ޔ Su!_#a ~8U>)p-@/p Mxs H캰]kA\*G3RWS lazOAo= ۤKf~azRIX S^wf:GzXz Ss=8ۙϟozC-?L3_h ;^wK/xЁaB/7dVOgLF;v.q-K , ^xa.~;N_F?ͱn䂷FNgB u,g =VIˈiL\svѽVi{Zú^Wiqpqz_Jd뇉q9%ri<+~X^j*6 MItpВW5׊ \Kqu(Y*Rܾ|>4 *ßw DM?tĒ4 W;4gdlSm:ԫ=g#* UwUOQY*RZKR+ 2Ċ5< c7KL+}Cحpp6r35jvܑ0Ɨ|cEZ 4p$ _Rs2<2Ls^{qoے~B_}Ņ9ɳZpniraLqr)CpipY1YrIġ `Lq|-wqe<.lZu^b-[?ՈD] r-jO7+^WKg\+2p)[Е,$6:bԦbrl|׬"rUD@aq*^s#&Q &\}FI ):,:\<> s!7+Mx!\CeU?^"bJ >?zm24D懆yY^~h px0J?o8G sGCk?+>?tGJr^F yC԰tMXo#9?T?FDžrwy}QR97l|s iN+>&+?4^EKQ(@_>A*G;]-4?zq|^/uqzWy0// k.:?Fmly~X\jN0>3gHf[y[О(H>/;G'9ƴa=z/r 7,:=W#O'̵u 9@":Xkun~Z].Wה|Jt۵Dխ<>qArQKVzA][\K3UUl5n+=1!6kBѐkj-S\tWբ, ۞@];"+I1׻g"VI"B"!2 .8OjX/v-Ihh"X]^I_խ6Vzݣh^vnH9E-${AO}=|f:ktY_y-,6bD_Vn-kY\_=:hvwyx0N^uz]a]UE?E3_ 2nSyE]WWI>[<4[=~.: z\j}sa%_z}<<8G\of–yp͞~c?Y^U׵˸5*sŅ= I_$ !bZ8\o$ϭk^X6/2W]=je?aZϼZgyy>bBri$CyTYzՙ~?߰e8 5?tUϣش<|ҼJUJ#3-gޠKbz+=FNz.úu(p!WխKˏuDu+uDg#X.VfPp`b7m5ZU[|kγ4p՜:km6.둁!Y/^X 8H&KF\z^< p'6\0?~t =Y1w+NŹpuLop!vr?v.U&]FZk6/[0jGY N(|J#?mێZw>CCyTB>^^IԸ= />P;ǿ8]'`^6r-9HcPzTMԶQ2j:ƹP[m{6Kq=NZm q"ϟ+!E>\f2axuqz4-NGo%/l^>D Jm8T{ ϣSCuQ$M¯rbp}7Qf.upḽ4|>p-Ï_2zc8^EI7 3kr7yFx~6z\^Qf:}=sݦ1P4W}s 2}8د߸BzCz_B=Q^7=j˧<#2 aPy՝1 k" t_l X}2p2v_i*s4S*L! Dcu7XrQ/pmd\myrׯuM\v8-tr4fLERk7VXp}=Mw=pJA\u%׊zm- m}=otx<:r_c4\mf1?lMc\J9zF>Bϻ 84Zg! o~Bx`j#.e{߀^5d vc~!j:q.U/(?^ct\<UM砶ȸKȣop\/OVMq3CeFfg _E 'z\}CRCL=CsӴBP}"32{r `pZf,oOfKܚ:RrWzk+5fv{`8ܴn|NS.ķjńkzQŸփ8{jGW׫8<9jG7k>R/ε0ll/ZzC/O\=>[#.L7K[KA5yq䇑^\ŷ^nqX MFka ziuz _4[7ZWk6x~W. ߰>?B/wy[o_7Q|ì8߸o8/W8CK7ǡM\<78T5/GG ?ͫn2P`G.ڈ[_C4<ʜ"{PG( ?4ፌҫYXݦQ73Lz@e_Am/uU^7r%'s)jU;-A0Cpɬc)lzyYXɢ- 7| x?._gcJ s[Gt>FPwve'[T`9OE?)~}'6n+Yq-vJ/ + z5I*^D%z\{ 紛Ђ ?ypO g24\^!Gu|ݏ̠iƁuaڂ S잻"]/xˠ\i/ܣK˞S ׅ;s_ p]`~Aׂb |7Q}ޞl=9K z]('2H~hCO ಘxvFfy:*j"ne)Υj" \Z-QA-'Υj,9eKq.Ԉm^Źw Uš><륙rufюX(Tzc:ځpf\UGh|ᥜ o\\ݣ^kUn_K 5mߘ,=?W2|C7/KuyO$Uz#\LL='XgVއ6ZAzz9h6/\/gʟpћ1-!QDm6u6:aK(u};X#02L/ ۘmd`jVkߦ+z~~+zq!bgb-9F ҃͸m2pU za@"*ZZd\PW(l|p%bq5LW,H^Ÿ6r.Kߠ"ZW8'+4?/C >_#E/xwĒk*o 7sPdv}1KseTkJ\,/qC~(&ߨGbzmyp )|:,4~|:oeȣD7gYåwdz8CpV ϣJT+Sq.Uk\/:KiA^zGz ÚLPT[Q|J 5TauRx>4 }G5FB{}z6 \SzIy\cIƵZc(ݒ`*sx<= ^ҹ0؃E:߀IQ\cz2\WUs2>< eyz||׵^ri1CGOpќc^yIq%qQ_ Sv*@/UBmX2pU 5|ġ |^P/b|I`qtq6|uIoZ/(s~(gkzP-}\$Vw}toOeQ˚uDC ٞ-4G[/G_!&Ֆk>pᘶ8W^3Viz`[G7B/q4q99s1͖3..w5|\,Wk>_||y6Mpp.~f5Ou@:@]W\ЪY\e_M!1^Mpi=/j䇲OQҗP0͓5_/U2;"a0`kgk{!j7kwyTŽ˸KMz([o(r@|=ƵC(~(??l nӨH2?WʯG|Ge=/s#u)")u肳>snדX%cMpy՝ѫN^X X`.\z2.]T חxqWW4 9p5 5q sa^W_ӧ?;hK!ҹ<4h. ̋4Ћso|C&y| a|5ejsj `oΊGCo.;DWզFFq.vM!B4\fחȣ'6AC5zB~/Bhk7گx>>D[*ҋE\溍:+B7zrڡʑ~ j /*U+l|9Ƶ7UM~{Bϱ#ՌF WOA:kp.Hz-9H!.W\815qcu1Zv5_ k%=5|iMzp M8\T_SkrV5KŸa.7#Bq k \S^D G%??DMj!|hz^jay~&U'\9\ p_g ~X5H?eaz][ ~Άg|7ם^! laQt!˸k&uBU)mAWCzm Ѩp+5;< Ђ1ti ` Ъ'D@׸*rUp_rCzo|d|j\9z"s!a^Fsx kF\Y||q0-DC CTWj7o;!7C\g ^F6CoK/Yo6FIxJJ\x4wGq{,U"kk8\{?s3K:WU0ѫT׺SFzaobz7(6^t071>~C6?|^%AK~r|?׀A/>K~o-|c9s3v"¨xfqg|~37 B $Pk+TrsBU&o 7 Qkz8/C\/q5 nbPW PH=j _?45*P/y9}=Nzv4r^I"~27\JײpIBs/\k@2Wz(/9\ʼ eX& Tq m.PfBoUC\ 5^e߈EMG&yA[\B;KC ,bk8?_0rqxZ^GG0p¯oWw\#'h^ɣx>mD4]]+j?*|Ğ4.E[)(-+!HD~tt.a 5!#GyACϛ|]}aKs>^|d7s y[.'?7C#dơ@^ o ]}c|vOV$!#Y{|CCepl=BȸFoh,!q(4?,1y9/4zo }?Kmi^'*y7|<|\W[ސl7zrU|yz/k{w1nf^sW.Ov"ZøHZz&mG4zM8Hc+8׹tzIeu4 m価ѫz$^sy; n퇜Kz"Ú hVkP>暢_kɁ5UõfD/9\s5rerA\ 9d(ӫ/D! #Qoz:>+!(GDՁmjUC^C}_OoC1@SkbC7 MP3 x [3V\w Ҹ/fDƸ^ҹ\3w^` z}qp 亞qmtob\38.=!t +="Csj 9]?/_p50jG[2|EmFwj|! r8! a^FN W j!!r_%\&3u ~}PCd\ׅ0/sL-a>YiSڟXq.iz"u,Emv)v1 \\f>YK㚡| lXވUDE q$ jZ_3Ë8|Е>} $rƥyl !?o5z|r+0m9E7kSZjS@l͜+a L!e6q$$]b EW| eڵk(:&T)\`=F5cQ( OԺSY4r{t,oTKBƸrS5pEqQ^]RBaWҹچh׫}*o10/|)C\`y4.>Ҹo&-_\/,oRdWϯoSTK (ʑ:kL.sV2gC/0/^#Ӗ-lI*k5w7ͷgzI広m+^Krq:2A\#b\j^zQK*ל]q@/pmcX߸0rݕEV]Dr]Kz3t){C;<7$P Z^qdj,}]GGѳNA\fBb.c\ LG#GWϷg³`.qa-݌IWzXף8林"b5 ,q*Y/^2kIqDr#ߧipլNE!\c{Kb}@p ] vO4Y,\}XW)Z|B:4Cqa\o&C\G|^^o;L\8+Dyp <r5 >|=|cyY apR!S ^!O0L6/5]hş^ak}Jx're!\r蕉  sŹ¹VBfq3tG3 QzLC:/q8#of0f>e>#TWlшCu+|~z}=03s!f˅Lz ÙơO$;?_2Ź_Ӥr7F<*o^p/b72g %k!?,zGw;HOoc7)C}^u9 qt_I2:Kh_6Ci)2z:s䇞Qpz WZW Cdߕjv=`м\D{^]pYUj%Եupl L`׬];^R1p= ̝<&"R뤭^/oLI^'99F~ik _e wE~&2?@\/j/F\Jx 213[\"J s\9W^fz2O2ŸazM^blz3"bz88y^/p&΅ٟ<ʬ.?\uo %%! EOߊys]fe~՝QJf'9?9fPRy&?3fꛛ+%\#V䪗<q-^Į 0*:c*j>볼NyEeU&\ٚlzx5b*D5Y r.<@Aa*rm{lp-C  zy짫8}oHB^o}^yħ4z}!'4:|Q \5y\.O\1OߘKCvyoOe v\S0xy^ |a8rLꅜE^ Y^Y/Y gِk>cr|7J:Ɨ YSz~gΥjZWJ.;r.?Yg3Eg%6/K~_.*9Wz^pY4:Y}=1:R?t1Kzz-|$zor5ߺm+&jf=2;WG\4[A5-&zε@ >q-n] 1p]ĸ6h!?Jj =1 J֫c#  ôY5HA>a!jGMN4>Ϸ||;HGsg!Z^WOWq|wGM1jUzuT^C//7&q(70Z4z=.󲊹gRKk5q|} wŠ/(q8L !d^^]^>ׯ\k %?[`}~B" sݦs5%gG^r|^.@m֊pPzN5? t|U:/h~XO~&]R]p~!qu2p*kFؿ^8췈NOx'V=m\\*rZO|GίYLZzz r?;f ɇB=%w 0 +>Q^!& zUxWR]~h1/y2/šȾ9+˓^U%g{^- 4lnLQ^zbc.iJV¥^qm7墯 ׺+%! p{hQ\8YRl3gi1|q+קGk.,}~/FŽ|^~lG0络_'`]K7oX&h[.,.བj=ѶlݚYV θz--བ6lZA:\]+> "ŋsw]-vJZA*~aW Dz:o70!v3KF;.~^U.A4e(WbkK>?K([|q oG9.^s{+bsGBhvi(_Zݜ :Йi:skIzan+<&&Uܠzs# ;1yĵ4 GN퐫3 {e.4%좭<ȣap|%q$ą2ߐZg'vUe7DR_U"Cs_Jl>r׫ Ǯe qwه p%bq>Ù;izR^ӄ]NJqx a.5q#t~( ;1`~(2UF1/'o[#$}yl3g]^ AzBCh PqE>3z.zMq/pK9xd*WuZ͕)"\Irs4zQz}҃:@G\3zh?]A=j^C񅹲({8AYV\su?2k\e=yRsC:6G̣}sud'QC}Śpm2ġؾ^ZJq8IQ  ~ؑBqu_Gd6E&*gۙ<ҋ]]:rW/҈*p-g\6I)s4J*gU;iiZ1~=a1@yJ"M!:{aMyJzw\\XTB1,c2EXPzUx<4Lw!$$+ЫP`~fuC eCI'~Yh8MP/ .[]34tݼ~`"ąIY ~qN3wZxm'u/ԫ82hb\/[,z =WvreC2W`L9ZV׌z"׸|z;YsyN7vWYv^ߞˊP?,7<Ӗ!gKx>6 yNp%)ƥ<[ We(zsr }"w6Jz=/ "M?tk7%C8ׇ*ˁo,wo,Oy^to8J˺yeۮ<_]c bdZk!%A2Ҥ6t|"05&2|沄J^YZZ$Kcٸ)ʒujV웱c_!Շ4ׂ}UMg$XV {韰{Y%yZ^Fip$T:^{蟳Ek^T]4\KVK 򫱣?|r!1A% :.m!ܼW|ޞ \gɘs/N eRz}Sڔ^+_~A/71&RGASy^Hz(SͅYX>F4l)aϗKce_%foIe&͵ ^KҪ:@Z`.5գ{uxX/CzTYyTZR̾^D{ԇ#Teb_ ZV̾!Xr^v_7<M~^ei5E8|$/or۟3jA\YCפ5/Z^\SesЫ:ER"p-5a}zbd 5.bEC5ْkm)h?}ȾVk(fۂ}tmx[ir5h1gO-V\/puR]bQXбp}27l")ep->HיLQ =^Ga׬] (Weu_,=H=5 .9He_ǏcŶ \襾,XUϫL CS]BƗks]4kJsm߮wø|}\xmw1U*ۼܴRYY :/cAŰ^91+/؇^ġϾA sz]S%8=Z}ES/Z@gq[pR9epYΆgi&тn܌s-6S.צw )6CTjȥkQߨa>_a޻,VǶ>-I͡n3&Mzŕ̓m¿ ޢƗ\|ws[j娯7σ^~Wa||ÒM~hCo2ϣu}=39?tכf~ J,ZQeVpԵ} z"ASWD dcxO|MRZ=t-20hVBGAmכWU\fA59b(azUF1G5&Ww,k4ݔ&5W[L 884+WOsW..hiRѫ\m8{>mhVǾ\\/W<:NǛRii\9qiJczG5< 5i;=zڬexv|oZ4_T<;* :^er0Ue&#e,jtn+B' 뱔q^ B9DIcٔ^/QczV` 81y.I^buu'wXˏX{#ʇ˜ ,ABZy(nח^^<.}k:,,1|X?H6@/78Z1ǕϬLK!+AK8n 1{G%5Z}M xm~X5HO1{G! \|>< m3u_R\}`X{?<4|xn^Nf?>Xc9Q~].,VDcRsݵ+s!ODz]nCh_! 1by:z#u-&?]+M7J5V󘗑o y=ʥ^ji72}-Vkr՞4}#>#=Ahz7ׄ::Ht12KFS~Þ++4uq1|Wu6pMP?MMz9r.5,l󲋺MG~Xnv6 Q-uߡ|ya-C}=pU ]W@ j1?9p?/eY?A~h\5[og|9fo9~; gs%ǖXz } Q 0yz~1D篴> 'Ə+ׅhJpaW3Fz8)s%|¼ =||%?[wgϕ\k z+<^]GG)7UW8|}o>W֛^#uU`ݦzmL/~㰶.0m78Wwq"wh(b_s)˛EF}z >_?}ϕ^|?.pV&uu՘WWޥJWHz!; \NSw6Wsa6p|U5`'|Ch 20݈V$PWͨ@/ >_g8C&.WW*Wz|?m<Z/K5n+=׼˕o?CPЕo3wzv?{5\ƪ#T>wu>3D \[gԸ:\!>xO8<clRϕ.[<ن冣%+v\3vR/a.\}ez0TB.0 B=46k#1)ֱS3-.yIQr|#>>?c7_#}=!KopP}uݮ+f\7_V䚎{20qiq^mj,>ݿBWm5aOx)3/ Iٚ8\>㙮k8bK{<ӫcm8>݂nтk/{@(J#0Խ|ߵ^Qѥp/3 Wj>/82_wK%2e]8B@ Uc7yނÇ8\㥴=Wr{s_o%.TqxEQ.x-4ƿ|d\/0>i~1opG]Gn%z"kcuB㹑Zbyo_:^?R?l^[-֖'Ǹjè Ṓ镱6뽸zX}^^>9!Tfayp2ϋ C\W-7 }=CHo%>7ژo0dW}QC^C'^Po0?oZvCi/IENDB`PNG  IHDR66EjIDATx^/Pqq6F_`|{F7,6b p@a㳇'/ADDaFB[DY֨VXA`[T ][pЁhRA˖D͠ c-e[__-n[3.Z޵:a {TJrO?˰ (C&Y z>c QWbP+aGP 1 Nrdư (C6Y `vrO"""""w; B IENDB`PNG  IHDR66EjIDATx^ԡjP&[7H"~jBo0UNjb B!GJ½qO8ݘIڇ1,K,[֨b0'B%M*mzZ$0';WË-q3{Tq`K;<6F]z5*lR@z. 3 ce;+AaK0-YvVV::0!܇o(] [Q֮`=;9G| ciIeXbXeXf_1(;{gq{QKٴWIENDB`PNG  IHDR66EjIDATx^/A[X/"yv`|Vf.YlXq|Od[,N!Ԡ#ѓ{Q1,AeYZTΠgDU~DuW:5' =]kCs-Wia;ua {a*'36efXj0,|qo01 2 kٗfK.7K(7^1a [2dm3e0e3,ls ʞDDDDDTvdIENDB`PNG  IHDRnnacTLd! PLTE2S֮4TNkHeУUq۸6V3Tس4Up‡9Y]wQmB`8X=\˙JgzƐ^xDb8XfWrb{Ysܻ>]ԫ5V<\IgvČ7WUpKh˘uċ{ƐϡFd߂ʖ`yڸLiȭܺݽݺŬۺҧ޾_yrˆٵ[u͞<[͝~ȓk:ZGee}gOkiФmϡլosÊToh۷‡̛mܼ}ǒɕѥ̄ʘ̛Ԫ;Z@^azөXs@_Ec?^DcCaSoøzƏ̜Ѧװ޾Zuc|ڶݼسPlqˆʗڷ͌ΟMine~ѥȔwōٴ֯xŎA`i۹IfrÉ؎ΠjխtÊΟMj\vיөRnϢɖױزױۆ˚Ğխ|ǑȔYtd}]wУݗҨ~ǒ޿֯lpծVq۸6WNj[vϠ0tRNS@ffcTLnndsIDAThձ 0@QpR1);x -hh-Q2aX]_'y p8p8Keu%gԅp%;Fp}n\^1}M!ehڰX{n1k>_o;G]ײp8p8p8g=1p?1,>ՃfcTL,,dP:fdAThe1 0t*vPz=A Њ.8Qq*xԶO7>:ʘ :,>D1qTE1XbR|B"e+s*yF=sߒjMG-Uc>zNf5IZjr 0EX2e))Ӱe 7\<<3y?M$#(%:fcTL&&$$dLafdATh}+DQ̰񘅐ƌy䑔ِL ik& EQaAM)+fǙ;|:XpC"JM9P#yCDA8ֈ˜֪-!qhP[-a\Ue%:" EHffEӲ4&D1ʢNXe,j;x<0 $QkOS݂Z6TkÆ5Td6*UsT R &^; >y;8/v"xq,hy ;*ZķT+g.lڨpHng aJA^Zdk546& ,{ .İlZ@aշkӳlu9*j4d|q.ܻQݷzD.4-"("JBiyϬ~W39̐׹^FJ\KQŵ(M:0$Äh-YsD{,ރR25 [a'd)$ Sƙƒ u=`ebV)>8{[=Tm%]o н)q @wtЍ33SAR,!,tplSuV^F7 ʶHg!qn-+Q$nj}~Y66exNke)bZ:EKjYOYxډT+J`y˧ X< XXxg]⬈hg.^Ze'f;y-; SVkв AY솖5;7WYz4g?`BXY4K-\>&mU9~AhnC7iVMBu tSo+I1 >rBWv"C4jv1dg#l/΄'gf eH"d72TyبI' /aq9٨}&պȞm6KnJ@RQDuwВk& RfcTLDDdfdAThޥOUu:vv4dPAprs#ћA ?Z!M,)-YͭbmbsvkV&6g /{|/yϽr[7}0xN}Wy[CW9˴7C϶n[r:QޟRZh!-EԲ*LMcWjS-\wT]ULK"B5WB/>ۻ;F8Rxu ]fﳑ{ieCHSk|Qna@3_!Yshۜ ix}7|WNV5*V8Tdg VLe2!SetP\.^g\HF5yTM1Z?/n4SbI$򝍘Dpb).EQ&sM,Q=a52QbA1IM#(bCȣ#2@B?Lu0e5cKH;Iw҂b!ӈ> JnS $z̢h6L9ώL#p,N`Yd+0b8&ZL~r/L۱""v75P9IR)R+:(:E*u:$(9uTܦѸʻv<4.hGFv n[Vs=_m/#:?w}if#JiңyiCc{g3@O{:Sn\ QE 5GȤu+ݷB0'XV0ZJ_KmQQv.i@Xc\[3?ӻQfcTL RRdn-@fdAT hޭ{LuOCh\ ܁ICG&.M &@ Y9ٺYkBd& jĶ?p /3eH?Z+<_۳$=rV.۔+lMl`}΁93cop0{u$Z .ҡK^J0I`)Qld'* L-pb2Դ{4!*`׬!W@՘Sy6z{#04?+H]9SABRŧ9D1wP0r !?Qy!lxzKvjJ@ | PARP3'kwJV v5,(u x{Je 2s.r(P6\w66[R).L)2>(ֻ%q7hma2YMȣl6)qmzNS|6AW8'Jp ^O"_St[ISLvdZd,vXI% ֒(bp7kn?OZbQ [K:|K~MF`-RlQդ|166@\V. +)Iyw^=x#SdnkO:k>FŨb ޥ趖F ŷ֒Ps]˭$~|z+>_R$ZI.8EҸl XAɏ(^U`.M(敇> 28 Ha@>'u/ wr|̀a!~v"kLJ'"9Ja'`$]C34̀ivEصL*C@ɈI\S?—%n2!m:>8G yܣhAJzoR,uX<{ 3t[(6bȼɩ+oS\LvKI<}.ԗo{{b4ۣ/L?&o*}ydJttXgDw>Й賰Cg^%2UWH+f~eڠ3_}[weCg>CuxI:;.}V{H8M9uX$c LhЖK(/ ` e]{7ymW$S䇇P֓F*8tuYԑOQ'/S9h=x:W(iVC逘B%RfȚ KH8 7߻5HOw03U0jH_PM|+s`Nv'J --Mʹ mdU-bT2ꓓmh%Vi=8/GQS㫗gNvכ3 nfcTL hjd) +lfdATh޽yPuOUT  vf=tbpXevΠkԤ7Ga%-Z\|oWBJWѨ#|JR .4+ L;9>zXBfTd\ڱ3+aʗ,`ckÄm[莗L/m0ּ]' !'ɡcE^fy ]d,hޥk(Nr'>tR^!BfkQLt= p#Ѥ {S1MPidQzUNǴBrˀG"(uB{P@V}e L&=I}ȶYVQ3 CGM (4XAaRiAu leE LA$oyΚևa5 -N8kMh5?a 51քfRs)DZЀ^"BPȷ"5QcE.5m:9 6 BE~gN9VP_} [`7Zա*P8:tj2g ŦRXGQhPjK4{)B׹Oү}Xk(dAeAZ]LaJ!t-(m"RT Dy 2ePa,$R9Eif,\.~Fi%|@)~J.Tw)_aޕlU՘ P%mA?jW̠Wg1J_I"=ˎQ\Z+=4 GD&vKdI4AlȄ9袱&$ELd4M/C`ICx/taBBp,.Z[`|2ޥ:1*:RO+9RuVΥCkB`Giiˣтh);F-!Ҟt >FR7?!Sosԥi"ua\uCKZ )ށe7{)τuQw" PK(R ca) ibs} #aA!p//|sNQ( Q SGfTI0=^U+'H0#&U9n.qUrɉ"D9}!C$3B* czA] WB\]4zr)"G (O0WeC 2\/lrT"r*s^9Mex(Uzjs76F\\W.[enW.Ge\%U~;0!"\iSRD~Ф.ȡܗ..3NP3N{UZE" f'Aሪ\? D5PP{{Ci,|@a\)υ=gZ ۡ% Qx3W=,KM!1 J `F A0B9,2{n1 ۜv꿕;MQauwbkM ȈB>;B K,M];<%wP 9kv"YPI(|M-Z3| (EAHtbr !hEVXO^}Oikx Sҍ4)4T7!\kЩKۣ]k#|sEtqqEK&fx]=Ӗ+RPΛ >,0vsЅ̙n f n7c~.#i36sZ=D.tEŹICo YsoS?E0NNbҮ"HQf0@Yy-B) ntaU#U,dٯ`ֿi(O fcTLnndufdATh޵{lSeǧcl2RM2(rsPıpB$tc\*܅kd( k&41B Q aAMv;moaŇ۲q5 Ӕ Chs<@hCKmk)m͆0kL mf%<[vzkUyN$j4mo#Fg֝KQnVtAT*3I].\YhB+*0# S3zϥքZF0gEv]5B45Dg̎P}QBפ&j)08 ڪOR3[sh/Kզ*}"߾BרLG@TADw5۝@>jjAU RUldnϼTwBT$LTT΁D*F^+*6$GR :j(4@kYKE/h2M̧P:RJCT| R1)lK)(㹩Np VSX |Oa)@!,PQJa ȣp{[(t%v*'i P"LA0):AU9Vvx)ò\AXC!ٺ\::٬ˡRD2A,= #2Xm9t7Z7&ZfjmC.~%:s㜿O^5"l1Wɖrr`$I-Aэ*+wOˇmE69|]n,tP&%7VT搑X_j]zn bJtF[dXg8^lTttsf5pvWuJ'@Bn.rIAFn.Nj>l2r/S냀 0Zmؐom!d2bq4[".Y{B9ZR8j]b!7SHSx9@!?y`\ `:xvXvI<1[ ÝU"zăKbR \@Xn΅"*CJ*`PMń8Hf#U='B RTCFRUA5o)($ 퉥*a""-}ڞ> L/'%ALϲKz.}v[蓽؃9n'igkboFKQ j_&ֽA5ԊIG*!]'/Z+L-I=&t>1s̤^hʩ7dLk~)Bg\KAyo8F`r]4J@h3WWpvìe du!BfkUǰFXrf2du<WF$v"qvM;ӃHV* E7@_8VbGWq E-m>*0 #- B}&)2W$e!P(ї~ #BrE1Jߥ#a\+Sj\`L @jeHu1HM+¥OC8K.k(RGqŏaQ e JFC7-[FZ1 Cݧ1vLB-St0:F#.wi"*.8W=(Xs2-ЗV%ez=4%цP7et  RƵiSBE=XP%y^ +jaٵ)z,5PMzSUԣ>N}_GL& ZHDO7GPR`I {6~N WON?zi_k16Jymh ö5-;ex"4+pWN]a^],u)ufcTLnnd).fdATh޵}LUuwD \A"H$"x]T40#d5)+V jH *Jer3RLaTG{νn9 DπkYƠipk}+u}U#b)i5D"z-MWgȃcQmo"W>)~u\hKjOn -uw4+YW[I'}Ѫ!TDk')9Hv:WV1-`| bG:j  ]Ar[뎇,6b rn"7!ӡ[b@.'6:ڭ,pz?<4`S\Fʵzx,Wike6x#M>KN];WBݓk[୿FMm{sMjYaR/+*4Z HU\U=  R$O0̳;Q''1` H>Hy/§10>#poD-^`|JSn> fYȧ|]0\^ LB*\6L0WyUkI@|[)L7á"jnO待Iz=+IBˆ,4[Vor 0u|\乽0$B8D Hjusmq= ."9]ym(6I+Aֆ] 0pZm 7+jsro=;rmL4/f4+?}&תbv=y(V;A$<1/.PG$p><pA⻞9jqwk_XAJtz+]>Q[dlԇХAV *ɁT#EɝPϽ!m38Db 6-p¬TbU0~kcO*6 ¢7Cäregz *c?~:JQ⡁o2,Љ3]}rʱO6hصhm',!`*_yp[Šp @IC.tߒjs.n;tR$?jo9(AUaJ(Bݪ5^˗{ܘ;J!._tVBH@KM`TTY C4֐a0F[ PL1j;`'ӰІXh(2,%x.X{vXf als9;ɹ9mG}O\a `X d`|Q<%-mm^n]Xb,daXTƹw`EX N{`7ml9r/cL5%[xʀ*4F]L f2:&0QXtBBNi"iBdLҔ&.wtD SZM3.b`"!uQR-ЁT3V(c7Ձ.q%I *O.^# (R/ K^ @4SF$j#I0`sH[>45{eI]^KnMEh؛(e6BO vk%@fE}Hr="Pߠ ܂8OO+@aQA+j S凪CBPlV|.fon¨ܒ|AЅljA&Ozw$Vf ChI]&T P`~z "|R޿1@Aw]EM#=;uE0QmQ:5?LC8Pdѻ\Z[ QfcTLnnd.&fdAThkPTu߳ -lI 1.drbxTJcΘh*yG% ihhԛ^4={?{<<΁Ԉt)=mqUYÓboVT]/^[KVz{$OݮBRkNu:3UG~`z-J&{Sd`"}pQc ŧ&loɁ f9!Jߛ;ovaF:‘ X08eߪ,s+jb,[Mp4t[ ,v =xh=G;O-4=l )r\ 1xȻ=*ƾJ ^ɛ'sǴj{&~\ ({aIkiB "/+ƒX V;9¦uMerN~-xEgoۼc< !~ב.xȅݨ}^ӃsP\ar{)5MPOo9hY UIef(VɊ UVAv M%1Z(XCM"e0EnS=ٸy-> x0ۙȧfbnkP< ̙{0 Ò!:\.k@Nxd607*\k:Q{ouC&1没JMiJZ}:kTjcnsq^ ly]ÝZ'g+w&PͻpބBh4M7̙ekh7֓Gh2Z3|a)2c͓^EZ ^P}mk\]{W?/ĭ?yPčpX*ĝ!p28+7 krK;TlR5*+5`c. jd PoeV2,!XoTk.@m VZK@6T\ JR !^~!T\Ti9wM'ybB D^l5D SЯP؅|Jo^a(ܯ6E ^a>IwNЮ};F2P6A BpnBڡ@gm^(M &¿N۴+Dw¯}dӂ /3mr n{"!2Ni8WʫiqZt03WjDXy^]ػe" q=MyЇ4b^!Abx=K4 i7jA}Cu3AR4@C/7!rlĨhAM٥AZ]fƸEQRwN_c-:Zh&5=qeϗ&]c6 wc̆tC{-Lj>y^AFd )L`A~?c)$14HD?fnǪ3xΐv@AE^yh#Doz%[T{! mfcTLnndZ\fdATh޽Su{WU\BBCS@d%1FTL1I(@0S k,M1R/~~~> y9c---Z|ޖ# ^04 Κ/Kʗ$[A _T${( 'X{CH )Aŵ)Z|j%3?#?j]d͜[<:d#Υ^U}޴ Bzן^9@>J˜z.<"|}6'tyhibgĪoDl>gae;55S[+H?ګյHUY=k*) >=*U8~h\kGU6BGphگ2Zo;zmu|$7G3t h)zg]l$؜f7&. 52G.j3p`{AD-R: wAAC7u^ܕe ICB w8n\ ̓D)b;=zW%!Qb-Sp U90h9BBvp[!Y<%* ٮroqbe0BѼPwh"%@ !n7- 2zzͽI!Ӂpw`E 1 `$&}5}%r/oo\9˹<KWLi.B@4H5 &P UW3G\Em@'5ዷ͟@/w5dq/C/w5@L\ 4" AΝ-eCp+sG~0Nvb<I0 "WҗK_έO*m0ua*MP:5a\kpn s5ĹD~@KC! zc0(zhsm0qb-| Pι0qM.苷( "BHs|X{YAp R-vŒMb>_ DF_A+UJZJ ,Ec,W[ XJ8$"ڱyI&Zrt՟ϖه,N~S+KfcTLnndm+fdATh޵ls])mm'k"o ;*?C3 [1"E~L+J\&@$ Ae.&8' 7O޹}>z}zȷ[]Dz!Hfbul3:ENDId];+Ne^bͯ|R$x'=[H˛k,h/)+~I;֌;W$X.;+i^ƉTu.w*p`Cʭ᭕Wd_0Y\vܝ{QO~ޚb!\_ך$Uo-zxX?g3 bO*~TT ּ$)Ֆ+;TU njc;*m)iT(6KSo^OsLo{8CZ j!n)MŠ:I*<&m $+u!^4{G: z9Gk (S{~ =8Ԯ:6ΏPxtsu-i"42O FaIW{j'㛌r]ۅX٥Xf7>z$,׵r-> *D2 ѵi?raO5&j1+&R6,w1X+4k1Vz|JXO2^"ĝFo(ք*XU|[UL]swuJ@ktmW׌ӟIv2W!\WG\X.X>~wUWaZ OǡqVTF|pEq!AT[6et^ .EKuRp ߠ^ƗuYpzM<^@??mcA 6PLzAg I~PZiXb@M+N\k5Z Y?*ĕp0 (pCCTXaX0R>[ 1FR(Lk5)ط]BjZ쏼 |G/"eҰ'.ĻӏόuM\ʣ15ln8EO^lV l'15[9T~a1īy k{NLNwn!kIHWy2o摪#WRv)m&7w|7Rj-^X] Ldk]j׊PӚ H-Ѥ>fcTLnndTfdAT h޽klU9lhE[UA$"HA  ~EEQ0Q"r "*I@CA~&훝ݖ3>=f͞3;9ggZ=8Z\X)ĦSg~v¸A}}9yo}0A7*/`m8_YYxjbR6óä$DJYHg֫WWg5D٤` }j )1 zqTRz-zwC8Ӌ̵j`UԠ.=)Q$3Q4B!+ Ia -<=Œ_AR;YR8mgcL{8Y'\,u\& *+i6y >$fjo?$°Z1,Oҷ$La^O~`] t| e\-I=,5J(˿IkS1 uQ1!Of+|X $wx7CH& zNK5:)9Ļ_&Wy9t{tO- J@~CZӭ^/F>yGl欤)P,}B.k>K*"O=O`(TWnm0$0l\%ojYXUFaPYe\A#n#)?1奒"e8طCj#v!Y!CgH$݌WjII[1`oNY;9Elwbz|z86wpINF`ӊ^XS@XM ZRRvXK ^ RM1GCaՕ^S=zh41L*4 _ڜ#Tp!w%v Jx:+ph׼l\R[ pX½,_/ܯqZ'-# gU4h̝8kH]!=nڡfDђ7Mq&QU»p%uK,ģ{H*Sg2E_KcCW0$gֱ1jjsZ]_W&lmIEZ0OM<ji ebEjTf{=Jտ5fcTL!lndNfdAT"h޽ilUE_YZh--T lZ- >- HhbiP@b ]eH 6JY*@"o~[w߽˝ɝ=s`{`'M긋N )iKi?F߰a\9)m /RC(jVbO܄ZBiJP+>a;5 W楄e,H%ӣN| Z~Z 7>] ޭlӨ+ & &Ie;[Ʉ$Eִ'`hB05 R %D`0V ``,59tXR/k6ƺĎ2hAB):o_&:΢OAW<`>GԢ9@5/5oF/Ev铍GHsv;8!==Hk8bRʑ Hm1냰e  a)4#Ћ6ƠF#OFچT7EGa9O=$ۊ'pn']"_:zG4FFcJ]Ta9›@žDb^R,e A82++m6:w1B m ++ƪk$22* !%Ġ +Q(+(I:aEֈgR#]O^p/y@Ay~8O.FP>h=j=Z<= SҖA9-#lez\2U!VV<Ze$5S:ǣHdB/~iF)("]Q#dl+z ᤓ(quA~j| N=Ɗ3( %s27pbR Ai-|a:EU1JpPU1h֡$$pL^Nο,q,i G:C" lW!GLEJxpf1:\ۊL +]*>+fyoW XSˇ@qO,+O’]E_&l',KR Q3\ZVx㕖#؈|qtE}E.ycH>\J Yn`IuKh*Ӹhn䑰yK,јT4-fbwiD^6 %:f.,Bqhɲ}&qEϰAHWhY28B+"}4 j!hMr#d$HgMQ 3d(C[MFWFe|):Ӆa[0nOpZwkQ)}L˝kbཉ0S-X3#P& h?/ݼXZɇE?-cY-|,CX%Z9ʼn[,]N"B%"0YmD=r"Erd9:!+h>E>@P"&'Dh"Y+́ 2 71n=Q;S ڔ!Q#v:i4eEr!es:}0 QPL">2 @qUom2 +]_D{pқElj 7TOA%}Pd8&ӎT/xKeux+Jx2*Rŷ'^T|F @yUY(K !,8VR`(BGl/ ̩ i\lGK@'IHgUva":Qy()Ha׈}Ul{8ˆFt&HDXT{:k?Y摇Fe;#!477 XnOPikKI613Mv<{ o{'=A7qh{ś gg5avG$:'̶-_ӄĄ7uFGa9D L?0pܥwG(SYw/ńoك>ttL ~4<ҁIm"q9L%[5sSpvֽSXɓ9'b篟UWޮ"S59([rf~4FnF)P}N- -^fcTL%nndOfdAT&h޽ilev6vԺ5HerBAR )J$J4P !- `Z( aE4%'3nfvidcWVVoH4sv_Cqslyk{ނ#j^"+y̝/x#F#b ~?Xjۈ#mKq̻̝NTLpt}m|/rg9F!TyeiJ3^B# Tjtf޴ӣ:WmɫȮCd,jv`S>R+lؒz6iLz$LƁ%N+݌Cy͎7OsiG&'pDt%fK cO*;d ~@KbWP36B $H%RK5c/++ĬĖ:\xL%RS0H F.THf9cwTG63ЭEφ\+iFm?=oFW˳\u%nCTJtOe R R$$ƦWxcH.ERÇb.ڊxG9R9~,~A\M%_^ݴR_F o 7#z_VQ=+(*bֵ؃0#r b(^AXF6HWvwܙ:4 V &:FT<3A"w0,m$ rQAqXqIk/M#mSb2`[<bvu4âfo 'Iő.D4R,/kWYytbѰfV-8xP.Ekj[NMBGT>bR]>B D{}љ N}2~'|3!}ؔM^lkiV#%gMku'K3 Q b}@x^JU.U}x, fa(WEfcTL'nnd(wfdAT(h޽oe̖n([`[!*[jRB)BPT**"ȡoAQ4 QcC11"+x 5}vμ~~f훙y86wo*S3Yqh2l̙ zTkҶSG 2NAWtq/dV[;\O:~2 7U#HU]8gU^rxrޞ\jp\gY J߭>: R}_oR}UIHY7]$ʁNNxՄ^Sd7 \Dd-3\qxRk-ĩ^-'̓[@?$Ĩ͖G;˗QgzZ͜,gP }3%nu嘄J?ntNGyP8*pϴW$QQ)4_IwşJ㱥5 JdSWΓ%K%耘` U))Uր͈x؉A=DXCAD%M,&zDx`N#?2 vµhlMT~V~FT@۪H٭UZHvS Rci#(M nG[GC\c^D:jvxidWc i$DcU$* Ii&fƻi 1 e՝f8 O]ys+fy0?1jxl4ohf:;tzɕ݈4)os ;plWq5N[ pV$e+½RwJ:ި9Rڵzl5_>dҦW,{ (lajptZPTCjp?d.n(fcTL)nnd[FfdAT*h޽ylUNVXZ  ܴ`PQ(E-FDTh4Z(Q"Ђ"AZA3٣<>y}YJ^w`I{eG.8v+K? m*^K# ?&N ℉8!靎(9hU!lƜƪ齱'$f97s'HFC}{'!ס7?7ulD6ZGv%+Z- `CFXw=RI<{m"TOʦ=Oф)/ nQ"V_',uXܺ᪛ER°>%1~6&F1Ь^ﱩjTݲBq&ŦdNHT=B&W]t$S3Lz3Jn7QpWJ }j :e3>qM\Y2qy6Q&`〤Z6QR#-!8';lJzڃS0N o?{Jj%~HA,AyaQNueJQ3QK\Bj=8;ހ*Httx%RJ\)ck$N&:#$[\/Iu2`ڃc >aZ3ZQeC Y)8Z|%1BXLcuu)AkrL4i#;&K< cBi~<8 m,'٢ss$Y-Pi*ڼ/#G6Y"CptQ.!fE9\f6kv<7k%.pwѦy]AW:TkR!1,!1@>܅#dwG$TͤJ&o `ZyehkqaFF FPDSeuX|,K*$2JpT (Kup X#z⠓)R#ZU U[cҤ2sB N8Ŀ8"l|dH܉# X(X SC0aVD݈a} "QJ0&g PYzFN]LUuHW,-P]0&e\FxI(}-*JNxu%;f^Elh ®XݘEfjX!a?Shko\A/bMJ~c[`(e9~-y T<>n(+)aGo,->on]+'0"2ZcDS-eD%a㻄8؋}7aH3>r&enMAK=Eh)kFr㼜F㽪{4tioL0tvUfcTL+nnd͕fdAT,h޽ylUv(ԶlR)sr_\P9Z9 P9Z# "@ h"*`_nٝ6뼙5:yjI'=;ǃ6 VUvw`Y[S 'ءp]B2 Dj_:$=%`EnE72]’5˒O=x9︇5`>L$P\|e->ڇuGԓ-kFܩքƬBm  -0b|ÄX JʒLsNL\HQ?فRJu$Rݮo~GbV2Q09.K&**SNTvĥx"ݕJ8/"6%FtQdXD+%RCob*69nRe%=H L6ͳ91(J;lt1JIKj<[:]َ[K M}" DW+6#އxS "^5DQH4# ;ǻ)!0 >NM:!F 3~vauXelj8ɾs<-zJ,cy*EŅ-]*03`$߼,a;M< F,V'RgRdD[e.r"tGfB&[Z" vhA"T;hsJ"D+t1:.U wm:I栋HKCR8ռEVx8hkheZvvGy81ā.`144Iؠ}&ܑ cX&%^h ,GƶU sbˈgyQ Ti.# nI7 .mK[!(~TyjJCm p UA[(y:w &[j&fy^ZsM bJfhx%g "_\W!5"::+-x "81p$XҀHuTy _ 3꺵MN#٪k'lsVNPT{oKT{QQ Ch =҅Ͱ>&-CG,EIJvI^X=LR.Y0AcOBR3weBZYrB#.^J9M_NpD|[R%dN214|,9@ٗ?q~Qޣ狻u$,'Xa_:K>$ϝD~Y!h.{ԘE:\; E_|sY$ w){;GwK")@犴x,w)%fcTL-nndi4fdAT.h޽STWB\]d)R(*- *V`C$K4n-j4&j[b5Iɤ޻wwYwY>ٻ9^ b9Hg#QQ0rG1<ǨjfRi1lXo[. =cγ V*aN-u`%X4D& q0d[q45lb!1K Ϗ~s0Fa҄>Kui|-9 /+POU'߀+a,<9'p/0hv?:+e6J]Nh,tۂf9ݢq{ DŽ4Wl4iD{4EӄS .%@!hR6Wy"5nm5"8D&nJ"4 h A نX^aX 1JR} ,b$uJK2 q Ow%z`R cbDz%ڱҧe6Jz ,C& Nb%yw$cDb,7NlYlF(0F׵tE2%@XWbD J@ 8 sڬi0{XQ$J"W EzHd~qH݃g.!݄$I(#C @f̗2DC$b(2Kd@ګ(Sdb(n-Kr NWTF 2r pANPfl* }eN Ub(t9 EIl{u$*@{xL (ME4xإߴs6I4HENtWBwMv5~eGSٍeI@:s+?e|sm>/-vӞE>Z)IW$ ʱ0qXKV(M[Ύ_?ۑ\3|pPQ19?*E,fcTL/d3fdAT0h5=fcTL1dH29fdAT2h[efcTL3dcfdAT4hfcTL5dHnfdAT6hv~fcTL7dKfdAT8h+l#fcTL9dHzfdAT:hSfcTL;dEfdAThӮhHfcTL?dAfdAT@hZfcTLAdNonfdATBh4J fcTLCdyfdATDhfcTLEdN3 fdATFh ;fcTLGdfdATHhfcTLIdNHfdATJh mTfcTLKd@:fdATLhدfcTLMdNHfdATNh9 fcTLOd2fdATPhfcTLQdO,"fdATRhuvLfcTLSdfdATThD=fcTLUdOAfdATVhl*WfcTLWd^XfdATXhfcTLYdOofdATZhFhzfcTL[d2fdAT\h#fcTL]dOΗfdAT^h_safcTL_dn~fdAT`h?>UfcTLadLfdATbhP2fcTLcdufdATdh&yNfcTLedLefdATfhfcTLgd@ԌfdAThh gcfcTLidL3fdATjh ,fcTLkd69fdATlhgxfcTLmdLoDCfdATnhfcTLodfdATphY9fcTLqdM fdATrhfcTLsdnSfdATth@ E"fcTLudM)fdATvhNfcTLwd2RfdATxhjfcTLydMAcfdATzhfcTL{dװufdAT|hsy[fcTL}dMfdAT~hfcTLdfdATh0fcTLd@1>fdAThR3fcTLdRfdATh)<fcTLd@m fdAThR(fcTLdDfdAThɈfcTLd@fdAThLfcTLdfdAThefcTLd@cfdATh fcTLdBbfdAThV"fcTLdACrfdAThLn_fcTLdԛfdAThO%fcTLdAfdAThDfcTLdufdAThe{fcTLdADTfdAThpifcTLdlfdATh|;fcTLdAfdAThrfcTLd06.fdAThFfcTLdBԍfdATh*fcTLdB^OfdAThXa]fcTLdB,5fdATh6fcTLdfdAThέpfcTLdBm΀fdATh/4fcTLdifdAThkfcTLdB1ofdATh6ofcTLdfdAThF*fcTLdC fdAThz(fcTLd0fdATh]1fcTLdCyfdAThcfcTLdlyfdAThfcTLdCHfdAThIqfcTLd%fdAThCfcTLdCC_fdAThP݇fcTLd:fdAThq)aofcTLdEfdAThGfcTLdmKfdAThhtfcTLdE9fdATh*IENDB`PNG  IHDRr acTLLNuXvPLTE|rS|tU}[z銃|Ñiwنsꂬڔ̥b钋ꙓ~v͕Ʃ|ۑ쪥ĕӳүrޙ로ɋɞǚˢ͚ϪȜƘ齲ڿնػ׸٘ܦ֊߲迾ѽչޢϰlFtRNS@ffcTLd^ IDATxݝr㺮p<˲*\~Plr:>mwEfӪX/<,e5ax7;"||h YUg"TwvD8薕e2 gD4yw7?LV6)s=1ѰJ{6-Pށf2~7maYEN) lT\qq’PZ˸ݟh76:E҄`}[0Z+hLLpe3hDWbUbKk?Km 3]:VHVcMՇa1e, 8 {o"|oԁ_V~eu,)I~/ԗP;g>Xb?`Mَ?; u6K?T| ,~94u͚9É:؟y5SJ1>"k[4Iޘzi?qldXM>`3`wQ?S m'&|+$Rr8ڙ)⤳. l}Z? d.I1;j";X7r*߳2Uôp񲿆eyN;`I?YUfyZߌe}h{z67ջ|VDߘ]`]_ǘ˿ lU,^g}'{8{e(<sGl7 %zp<}-+8mLmJX2'sw 2r,wPگq`sb$Z+˂G~)KOW-UEz.쭃W4TJpL8ԢjtQ0;zĘDe:6GMW~LtVN>-KʹM zdK~uOǾɉX'$DtO7Z+m0IX6PjCw C~CSN:!3+V+U]1|qj+@јNj7]NDXaYՈ8Eukt!u oQү׭횜Vr)XZ &Nnjc<ƵQ+y}?W/&/ t(ҼYP_Ϭ+jI,9ݛm omUzOY}IF*1q{x}wK{?ute -[cpoAKݬ4JR8|{g#/VgZpz]Ɇ!3<.wTws K<!S…ΕJm=Cu([8V 4#B6)oy>1KP>.u vBkCh66[W{_T>8t-OU:Sp|u7{mn6{")irc=HpvgL+n09uSLKP.i:ԞzZm_u5kj}"TuKgׅ c~ ~,I U$V'CȱPYϤtZ퉇k'7[a0|bد~@ӎHi2Dl0>+16NF{2V4)sި3sv˹o5 \W 'U9\9jS9G({I1 i[RoۨF*^$`<9m6-^.^jO܏(I|Fe= {cFԡ,[w|۰݃p9*l&! ^o`'Ȯy* j}lM %ˢƬa-dU3tXR9t7uF]YXn+oF;=QҰs9XjJ<>hguV7b}JKsr9KCr~ù 샡uƮO|2:9_8|B"¸\,T?U1]$Ju'%ג7k"6X;,¿`TxLsu*0RAk bqGnuG?roZ~h:\Kڣ=#e \[Fe>:\Kq#y@mAnxxt\DbtV~ oeL2r0PGԳj5kK}1E^,`6Bq>`ifxkZ56^e#^rҝG}fNCQEleÙa߯ձD,R0<8WJǰԗF`H5x6Qnc7C'z`O5 + לTeQŮ5&3fL{ h,Wq$c8S*[9^?_+|*RePvZwKCYNCm_NRÝ:R '&[d ZV1le i ;ЭstxUDz!wVZëdKjTyʻ&R'85+\3zVI=$}[11 U,ż|X ŰeSQSq5;^`Y6{X2W38> &x* Z=MaT?RIhRv-sk[Wggg -В{in#EqҊG꭬QW{R ^5̠zS& kҌ:,LO!T?857`YC:\dLi-CT XRy-0āqVV  |π6Vj`IHQ:ATWWK"S.yc !{iӪkjK1Ar35 UݣXj҂z\Kَ&ԽKŕXVjBo4RTX` SeY8VBnKte1Uj1ۣɊ=`qrxDH:P&!FܱJJef UUJJ07IiӓBA $Wņd1܍GNΐ41<^B!i,E<gO 0r#6C7o Ad;5HQwl}JbA(CX;){uIywG~X8NsS*MkTaWyX=RԑfU60\'g»±^RH|$:g䌭08S_tgQuӣ-=Zbu7%% 16<#z8@+ 7S̏PǺ*X n~f>c}Ms}khA5|qD6oqC[4:S`~qw>7E$V#bHmɧ ;>R_uWW*՞ KD-0 ]8 hJ20q]4ZUuuR|Aa~ 1C1m);⣖n9EcO(윢K瓇K8RANT_?v{@|hGbک*2SHIz o'sՖPi;ZTV! U;Ŝ$tԲgŠZ{p%Bl#Bmܣ&>)2nH[;ژk'ujFΘF\13sLoӎvlKcOzO? $I)[JijߘY7iGԅ.ҕ/!k:e.Cp 97#7 "$5FWqN>iV_DN[~ ba{lbFRWjgu<8\X'TdGnfʥ NZyp!|RE^1 W Õ fEmcrq^FhG;9hpr/l-G0WTW[W'r AG Tv?9cg \mIKc=6r[L*R<8Gah=?uڪGO=S? aT"mrv,@ڗ^gIbD;)NEZRa+( |Im`H|bO\CN.c7YON[mFF&@fhܾ (+oM#Snpi4G_O C &tMFw&r 1D6EhȦHK\WNfI&5ՒjIftQ\ud߼9R3G1pJ8.g/vj",t +Z}jzy=tE71Z":6W Kf9mw l=Opɺր>pɚuScc3_K{k2Y-vvGސ}˸#yk?WpD ϸ/i[=%!͟Z5%w~ج\3ߖuI)yJ.ʺjd_˝VlL|kzcy/~$75ٗ?=66\=wd&|yG+ćXb{NW |he][>eh1_,LLѨ2~@?~OMM2[e.6VOGT̳IYZd>U3C(\*1-)-^)\+%][tKRs%9{T 3_R}F)#_z\Ew3U)r1)7 Si/K) wʪY]90fcTL dfdATxKSqm'22R,|@mK]YB3׬(*+z "THĵ0TQDtџOێW:|;@ rH6^C!lFbݪzyIv=E߃># }@ wCR8<PO!Zy Ε`9:+s 1c1c1c1ƘtF E}~ :c&;&1ȶ̕},b5oqwQ}<1{!jQR8碈a:Y@-q0[ 8ې%Cp#p^!rjr@ĠWG3~'f1c1c1c1@R322Ե_ö} [FQ/ 1\0UF~>vW*"SXFңr.;Ց9LP w֥v$s~~0m2 w"YHXQw!DXCzf!qL$U.3GC9~9[=2::Zc2!\Gga~:*3̞XGKOPSմ>W90NG&?OO /]ǂ]׋Cq: tSSe3{mgb cxƧW8-^DzMەH}euKRPMP {aUG 9eXGq>gt4nXfp\ݰ-:aJ lXMK7%VvЫ}ZQaѨE<7R% v VQS 95jBN rHKpO ES$H:\!fcTL d2fdATxKSa_-ͨ40uNKS;njԹ1LQgQRT**K{bFt! f Üy'+ _ln;KI=;|Yz@; ZW`ݐH7xJ\XA iQրs0n1/ (m%Wp 7= 8       t{;|$Siu%n;v&Z\CSvm{XZ-|\-|&|㟵 hBTgG#ohIgqn8!i.^kO I-l Z;5 >3~Eۀh"iZZTU sYT{(Gw٫ .$_ Gw#eӫ#HHoQvH-(yLrK[5B`7a:}1Auc:Bʘnfi1DƄE AdSPǂ_ ,>_idP*{@?6PdzJ2a1q})qV "&LUܺ8Ͱ3qf4*nOƫ~J ܴ;eb3I<~v.fcTL d2PfdATxOWmuc˖K2BkR-+sR( DGQ3Dzel\Dq_ڻ}^;B@[P*}^0NPq"N+ЅZUEWQXjx $n^Dj X/Pc!ڜD8Z ]B0 ;dtﵠ+`H_r"wAAAAAAh> ;+/oV81;)Z=J-UWa:hH ;`6DпP—HZ\PL5g{6H9h#O&W _08vzC$/A*n/A*6FG u)Y<# @(V   w?_(ϗ'oUxCbj l_ZVq m`NTߓPM6xL9z@Z */?tǓPJ4-h?|޻jkQ%LLt!?r)!=nt AO<׻̖KŴ(pR4Q-NhٽAAl_5.zi!h?RfL)Q41RjJiϱ1 glVBy$)nȳTN/$vS!dD^x/P/\` T5] ׬qE_fq=Ƌع<__tq=.M^p!1%5 ]DNh%.@v;V aG5oeM8u[IcHs)8=5Keș^QWi43]iְd$`%V:]BJKXa?ͰX "sn`;"P $le0+k vb&[.Lʼn#Ԕ͜(؉63( %l޳ 0)F7`?Bfa-D=v_]{z|{y<`}ޖ(tsp^~T/mLv</jbX~ىk60U ^/4D8vF X|D"-@k?}{ v*Д(z#YeijwۓP><}buHQd<@yfcTL dQ+gfdATx흋O[U}65F3$h܅)hyICe<qEy:: 6t8p epX$.Q6mァ787CH~Ru&2n?si@r+j[Eݳ>ʏ__`';P)*!-sCqJ@q}"I g |E.VjAi|lﻏdBV.DRYFAAAA0,zAگg**NN~Xᗯ3U*\z;P)VWX.Z_q UpqTV]Z+5 P+8qށܸu!GekquųWVt.m3pݵE`i>||?+ q ޔV5 ;x Ax'%E ?7mzA[ ۜFg/D)or~ &VKnttvt?(LόǕm2qp)\9.̀M\V|JQ#t7Evܝ.z|@szP{Q pE+q:L:!_Tzq場4=4,I' F![zy)Z,(wK܋t^r+ܫ$,vFH5-(1¦DW3і/Ԃ2KTGa8 ̸wzV ZD@-Ѷ<vJa@_.^!s0 q9Tc} %wtH-*: K⒨M/Xkd(LC4&FJ<:za(/f+1n++bgfq ?h2Z|qQLt2$(!/QZ bvD7%Ȧ:t Tt6\ 8Ȧ,Xf6dž.&d=H 17 -ӥ1E 7>(]_wq 1oA·0*VƏ1R-#ZšRS '> T= nmV=3Pit#TӪeod%w  \qPAM/piO@¾.!8vo]-nj^KBkӖ & qprcJ⋦NSU\NyDp{w> /հH׶jp>ZR(tHxIݪ3my>6W4*" ¿By[fcTL difdATxSGלX:2_҉TL3J9 D#€XP:?ԎŊNgW5 }"Gvw! >&E#2s66N#,0&05I/Jʲ' zO&l``<pSi 1( } GuX>LlLIcSSXPC%=S ʸxPMR%])J5E'ȩK? 9ިΩ+M%܍!&&y4 &<2.`bbbbbbbb~^O`ye їV\K(ޫ<ʗ6EPiX(W*x_)@]S~^l)|n\pQ ^H"/O B $ݡН8qm#a@36A E4%9[jgDž)AqLC)BN$5ɡhn!0)/yֿ黑܍pD@p˃Jz5zRוs)¸&Bz8FFcRM/c.E (@eT4?Xa Va/OT?tܺ4M>q:Yr(&Fܪ&E"{1~teD)P}JryyOJU{$A]N& k P,/PfcTL d 86fdATxOgs3LlVK\qEZ mm%BE*TjqlL HTq cӅLi9IkC}ޞ>|}^!(WjjVWL"jBq@Q]k L&aFnk'0/jůA3ߡXqXBG)a-y MuPd ӡ޸0{Tg6᪒UA͝?/ L!N}tQPDL2TH@ / ӎ L29~ 5ߩL}2qfSPZ)`Me<%TrFQAwRuT@-p2j4M?M-dr(Db eq%ttrB Rg#VNeƕS2m?I) VrCjM/N_ڲ~Nagn=j@-R =M^퉞j{$eg$T7q Ey-?x(_%Ľ T?tۋ$,'9Xb`a5㐜P/8 $@O$\{qmflg@~6 tZ 9-~ TAI,G[!]}Йݼ^B!6ř#z%ϴ6R< cfB9y΋@gau ΀9n@-86{lKtڡhG,nvIb?K}cfl1i+w2'S#3jRRK&md"t>ԧ0hzg9WXǹhA)es~4<;)I$vD+6(1Ô<+Q!>h&s(iO{ U2sSi&Gx.ɜˤo28h8%m}Hom>. c›h5}E0,>,>1hk6hFʷx_xUh,Zҹ'K:MQ` mR $ADqo9xM.LvQel$xFA Ef2h,nOUfd! "/!A%;~ .;V|03Kr@ @3y/l0ХeBȦDǺ?Ẑ[/U0:D =S6OCЂ"Oc̤ u'LHp==8*,5gĻ~CA.r{9_۪H!˓/gȏ>Ms0Xn )Jk ]ϐ_7,M ۋv<)Z3=}`g;,.Dۨ'vE|Y, /(atQvJL-?STJBxiap젤>5cgxhǖ޵¬ /,gcl&fcTL d[LafdATxSWZgi|hf !-&$2y%P0(/ O(HQ(EJPZTƑ)j /MC²圻.@H=^&UTTdTYlQdEOu=.V6La|oiޔڶX`ȡ'>-o.Q\7X@ZH*es(aծHW /\kٮR35X|&SƺOw IeVd(s ӳtsv%Z&P$LȀ#py/6M}3^%]o!/g~}w*|)R5։AGM΀tb DJn`x>)pXyt*/RP`}Yk|>V?-<[8W9\VN+c}z,o>=ţzk5S񉳧ǟzq_ ],?+[,+[s,~)JyQǘ %\Hw_!բsVݐjb/ه [*F.rޱkV&?, +z'q@}w1K~$LnD:gSBIg ;0 !3ᐐ0%kOY+s(`rJVFFio֐(Zn? cUͺq0, f2ɔm,_1ї#^5T !Sv7XNϵ7aAC!o{]S"%6`c(bmխ##$q?͎U&7h4|lhT@A{h _7~DP`Iѻ#Ngԛ8ÛG,-Mr}9DLhY*8?DD[xJDpTX!Rװj칪vNW06 ij/o7na2$ʇj}Xg5``^?j17PCiF`Dp.plbAE1:zȂ$#F8X=)|"@'t$0 g 'AE!"FnEd>nwih<{LJAj妡N4yvb:q T4HxΌsc|amt@bMg1[w=d¤p_(л\ͤ ޖDmA༿ڮf7y%{`h$%4DJ.3)NH5#~Bzx^4^R/ eu4;E!FבJ_}@Y6?LqQ78#ܾEd 2lYxGPlG_Ȥ1ƍ8sZfkk<''^!/&3uT,`alDv*avPJ8b7@H9[ N^.lO^ȬMؑP)ϱv--"Kpj$h;@>H i(LO46DW >^!aRPdlMuhn_t OByNϰNOl`SKΆm0Q(9Fj (䉉rBaTO sS~xV$arP bJ|bpV% k7 u&m>,n,3Df~{EW"n횡nY8 6gB`Z,rOoHxUUAJLbe@ HD$>f(^Kl@f*|1ºG‡n8 T[%O1BZ>rK _yw#l(4 R"'c6̊aւihughEz6,,s@ !~>xt}4%9Fq*DmfcTL! dh,fdAT"xSUt-SiLrㄐ ZJ RA(VHBBi#:-Ze:tE_?rH$o=99n !49%w8NqhewVnʂ~Y ۱% | CiR]0,Q'ݟK<X`3bk|g/QkL*?@B]aYv {љ@"^KRGu$V ;d|PԘͽmcg&@5r!EΡh%P(/i *lc!Ga="ڢ8g1 1J6Ek31K({^Dv"-b>y5oUx0uώ̊3Si;q=sw6Q_D'm"}j!dE{\)@.Wy/zz4Im8κ) ?KvUXwxP#$;PԵ4 @jMiAfM$BҨz9-Xʂڋ?ogķe!QGBDY ^B(JKD: FENMФ,Q~Ƚi3՟F;{htP١Dx02e# $7"k4@Xj凞-"]rxhXsJ#?*RuuU8 JCV0Q d!.5C)q`&8\P:U4|MᶄuD[ÅϸFG~"/QPz1_t$#/VWhxve U*YCMօ+`+(VkzP"z#Y㺠\o7JGtK0E0j((ϋ]7g %8&f꾼*tT0n:CJ: {5וt\h}DhlV[yP]=Sz rCC[        $c8ٔ> ݰ_Jqa{2tu }==fiLٙCqQ8MOd~bJ ֐uU2%j琭 pR?߾nշ`~j=5UpY;¬v2uqY+W)/}R7ecMA@ 8^;eJF9~tYfRc2٬P Ɂm~ekjZ L |ؓhٹ)*42'O,Kes%HK[Nw S°<!Jt9e #9MdG]./ؐrmkpLc]A=2e]ZzKFVO(pO4$fcTL# dESfdAT$xOSWO[.,[&5 tX#/ h)fqshBwi}2Il|Fs"E0C?*ڊl*~%`n@+Z{R՝cPh#-H):6-"P䒘mlZ}~&5Ɔ6{BB:T+|:pdxѨ`1-}.:F<&3 ]if`_feÑFUNV/9l*ߺ>0F !:u[&|.D-\ 8K_ TZg$$HH$?FuO-8L&PMeWSgC J _gNDivc88wD3ef2+ \ta"ۘ>D1ߙ#ʘ*3R&O2̛B#@68N## +ϐm6i~骙a9{ɈdлlJ 33:#cDVBmg2rcsӸYBӵtbmRb,Oad]e, h^g1~kA699}P( BP( BP( mRlb3$P_`BL)]nj[g[om.lNwMJh6~G߬ ֶX~Ee' ڀk>md#+%nHW?eNpwt:tmgrJUsnGߗIm|lb\Φ𰼌|o*ٱI͐ '-dBhC##VY"%(2 eG2;r əAŪ+E|&!ٸP5MQõҀJNbWl6+tdtQ(ːl`*ocY")6M6p"T/nݫVpGxȧcY&?>(]8GLvb8VI/08G 9}hgfcTL% d f}3ՖCGB1O7̬`a+ѡb< aC1h#L{U@hk4ZVfn"@x7oΌ{<3S|!#l$lclyqA5lTh ~TWhj 9s7% m^kG@/fׅLt?Ggdشƴ6eoТKKKblpd`@2}x F3 BTyeD8H'Yj5j%foߞ 0.ħ;9 ą  ZC  ;$R$^a2"8Kk(hoie3 *Z@ @4vȦN'72;d:z7=M5K#._#1ːuA@6 5QY`BYF]qh&k :XȄr ɱ_WpInԦX5OdLZ߿)@::=FB>t>rJyk|:y8u y:I)2"Pg7meİ;ϵqݸٓM#H6sM< ТPgu[`{ht'x[4өLmzkZ;@sh5CHYEm η]OKhěX-2"TiÜ2'78MJeJ9"ӑ !m-7_sy. j?NW#.C W? k+cګw"Efe,\;kž44/)⍒vI]0.$Ǚ~kK@`P   jnt)?ܣ>a)'wsD4o+5r7|$qWMOs%4m,-Gp6jcuU"){jJc :6ɜiV>:q!Gss@:6cK#91P*]RŃL M \ a.zð(+i̱]ؐ}YB.+У,'$! "}V4Vtw6?$Y:F4xaTJM?' :z HjPǐ"uZR0q =A}S6n)q 1OɃaI5> 6iTfPh}5]͓ .*f _Fo6k".*OYoi4*D(y'ϓ\g`>fcTL' diqfdAT(xSW+d%ԣ3r2JAPA&shc%+j;8vkYy {p]уB7= UuV]<,JKYMhFdzJd3NnXųYb@$MTOi@MNE0(fcTL) d==7%fdAT*x흋SGǗ< A*PN0Z:A4A#)*D@2@iZ^∣Lv/5!]v3eo>o,e;~*!!?,r4SOH(HaPXTp&d/LdihdP(6M-dlݺ[^[Lir5^xmӜ>=1z#7}팽|s42?k45merhv$DT"2`&4q\bpu#辅鹹Bp<.kK'j`SЧO&ORQ3)QWPp:_W*bl :m =~Mh&`CN!"أS8qq g\[w7|E2H\|~PcXu~E5 ܦzm, 4p !!!!Q HH/uKDNS_%$*E0ptݖ{ 92Iy :8A|W1`!<4qX2l<+'NA;i8WcYkc5One+篯| hbw(ݕsrGѬ X-)RQI/Y;#gĄzdqo8m(a;G+847sNhh|=ש2$99w$YPÔ1Zߵ'_9hն*'U|u8wT}PY%)L߻ 4L27dC^g7e nȈUꪺ;耖fx͓ʁpNpd=f,{pFH0dkk ަygsx[rF?jHt)ձP&-6R;tK&wڜrM-i4Q@jq_Y"qj45IWP&/8L GQ]s&cYCzFuI4g7> t%57ҘiaR\O˛;p7mmHCH#qroH}hx6S`Wfݞ#n"zl?4عCXc#9bu;Ш4L<$AKQE6 qzNdeKYe1c mhb-v60c(D @ 2zNs@ q[K's.)gTACf;M,gU}p%X( 3 "]FDD24!M-K,zt4? W6H-M䄧}Gb _xczx-4#'K\KK4ۭ4[-/^x M:*fiIV-XiXVOde 4_} %38uu&KBY[Dǧsii36è# l҄RHa!~O.3Ɓ#M8W03F{$:$jX auԾ#{Y~6`c`"3l CH>9l.Biv?5:;cpJQ&? l16/. &4 xEYk{-_UcI.Ѐ<,V|GK‘GDw܎r0CÙVC]oI:y-A\s{ؐVAe '}M ߹V.0u4@w1e5m5:iTf;Sɧj˒RPKYVD"XKva8 D5@BBB ɣ 3C3CD#f#8>h҆Ed/Lm02|&DhӨox$r^~ߔ]=GQV{83fcTL+ d6-]fdAT,x흋SWo6$ hʫ64)ƶ<5^JD@(ED[4Z@PZ` 2 ࣖZhǙG M d{7{ߌ/sϹx!Uެ_:Po꫌{b#RiD̰C#OO#N"D3=u|eԂcT`$K0F2͵`I"])UG/:vyl2-ei!S; ugU+5{c5ݯU"6U䪢 RXUQR)(`tA%"r ôG!c0Z!Ef!A3ZQ̊ϬIcO <ɕ:>('VJ܈1ܝ&K$l9rm !ѻdW3תI[M67Str}HM2I'ڿa*;OTFů}J \ۮ csE96EIO7Qwu{h Phh]8u&z 71].-->(3f]j9f.aa.?ij]YWH;勾{E "'-лglWoTv6LLai9jQ_ab :3ݎ%8\>}?6b0w^o2eF{Β@㸳(E?cKJg&8Y0a$V:HkRQ'"IQMX p&&<벲ۥxNvONh *XNT"&HQXgX"8-(bVz|Jv"!Z1qo(a&1'6$'\pN˄c<>KuϾ( B, H A %/ 5ʃHEF@F;5$c!G&1J0X")DbQN"caeZ(r_\&EkӴNc(fcTL- dW~fdAT.x흋SG7AL;Qe0A@b(Dhj(`:>E"Q|Z h) QvRw2!wlnwdž﷿ ė"0 v7K5^7RY3( Za#; 2 "1(ځ0f$q%(C]PB"t0fk\V<@[ɮUOI\4nȦᬢG}0 ʡm`V}($-W(䣝F(Fs0;(25wQo ʠN";Bz&RNrG~o]rOO0꼊+0Ok7e9|D黤-$kW1Β$I$IҜr%kJߺy Y:RMʇ3%vҁ[/}v(7XJw%Яy,b`K/2V{0rc> G.#t=M0FagnPmbɬ{7yAHsj;R-]_vc9aabx!3#H҇"9 Jt1/dINKpPT]i@ PsQ"/?.3UEnKͶ r6o3r7.j۶iO3ryTTh.OkߒBY&bm4^e$\EX=J`)'(tKJ_b{WtWI^l$b qx|xSq.BأhwfcY.5'h0Ɨ&$̉Iid/פ]<[h $iAp(%I$IҢ61}╕j,J¢PGށak4X(ʺHC`bbP*H)mh\[Pjѿ S #VU3,fcTL/ d(4|fdAT0x흋SGǗ @(eZQ;F"T"$RdZ-:-Ul3&P"GJL70:_Xuk/ vMl,HTB¬FmU@AAgD` 0i=52!Q28Fz%9<#.כ]/GJdmZm $5RǘN2|[+)6RC8Qdq+3lܙ~13tQQx{(ZO豌(0::tzD4Qa`0c=pے]렓q0U x:{#W(:HHp!ail;a|.zH1+@Z>: ڻm_zi38{tMQt"#jH_Y}}+"[З`о_8ung08"al{^3 }`^a$umh=~n+I ~!&]wq` E0v1lX-v` :oZԟ H)*Q1 sa0ڝ/gtQKEǭY*ǃ>FɊ" Җ)Y" +<:W5Y!y|CyV Ea._A^&!N>1 JļT*2YY]]uc_)*~ku-zzEK۞JC~ݓxQX"|8SJ꤁ cv=t+rbe7(j+ 8j5RAHbU,ͪx0ɒRʞ%kNȒ.E Z,9}(K:e#  E;h04 $`ð(ް4q,ۆ;[Jb\ObMaa5qMy8T@|fcTL1d LfdAT2x흍SG7CUXKmR˧L$6%#A"4Zkeҩ֏񨃚TDmtTZmmG&  ݽqpLno!,BhndEw;dBE }y 4F˅gx?U&o-ܖ'ka\.= A>raq#0ą9t; k.|ީӉ^cni.}9# 4^l^O`˄eNm]3ڼ.|o"g.)\􀆇>u%Ʋ)ʂR#P6*F6İ5m`3/ 0cRb>0Zv7ECOӨ9gu;iEuhMѵ4+}huIZ؁vB`^0y ,cf\4a}Bvǁ2tBZK71\׬.\hC.4k1 ƒ EįN*ǡ 2(L8曺fxAk58U=}N=/;*Ut%kQ#M ]>Bڀ35& Fpԓ>&HD(Vm;PtVq"\`a:ח ޚX^/Eqڔ̅ѴZO*H:7=8C<Y&ԩA"nA>3$ž'~IJ$.9Uv< te``Xfhhs_ߦii}qXf !@g$javk_o\)Gb3 `,&|Vm򧽉e o* ZKEP& "vųLp#}V7݊6CȀ KAS#CT hmbZuJzO=dzq26KË&ŔO'vuRaqE+##2# ‚dz}[KxZDPiȄq0,i!%Y$U:f Ep(V**]M, /""1(xp"Q %2T#i". aw\ RAVe @FM ݲCmQ-jks[[Ʃ4(]Mü4*=::N5uWEM|KvP~c:&00E!a)x'tv<rnso V }z`n~U0öu RbG@Kؗd[3H$+d;c)2Ɣȍ8;6z&͖#c&&ƞo8Z Ż Rxl6e2Y@vŏJj8 B},V"OAnĶFhmWo1!lmˆ9D P)96|WΎ.0fLWl"(qs\v9 !s,[Lftz 21๷Կrd/;&i$nē){\K"l0!]02EV_( ,f!(Jf N:(28MM|'itTX:}_+ĖtGRst "4%Oi#.q3޳&ID%;3[;BTW:tnX i#-l AU>H6#a/WSXĶC=R*!A^^^NA_vfcTL3dFlfdAT4xSW/KŠ`QMBԈA$(%Ц"Fڨh)(6VԊXD1(>"TL;?y6$dfw?{s{w!ڀy73wБL. ;xvl;<97p< å ~B 3 2}3lz.r`7QW8kЋG@ j*QM8v`>z&V)vT%#]2ϗ f5`u ${jxI|Dc+ 4}X< =%L/)9@ǭ٪vaSsu\֧,7)QPFɫBC۽nU6pPjQi+jZu}1ߝE?uqB807"׆^Bqݧ^;4Fk$@h-L-AO1&^Vʾ˨_"bVkRhcwGt7H3&EL ' jfntqwOLrK\Yڨ q"+v S[+пt{mpo0/p&RĒwNkZoW7;{ TT4D6lEa=7᫕m?؍4(g {*lPpOڹ¥wH:xmwqiDWnK7.gYRn%½m s,6)$?wK"&CɟƹÐ7 UV}fc+))=?PIߜn1A_^89Mwp75TY'/7K]^/O;(dW<|ɞwu:%i[ e$}*s!o&$r(vڰЋVBpm0Dgk›KpZQ#B=Nx=P1}GxIGe?/m|`{ϛ|T6o^9d w\v\l>`cwz|.a 0L=n50ev}-Ohz)0E+[tvs]iCO_-)i3ui4ll_,/o1UTiV/\ teK/X6QLjށ=$g=ʲ'k' u_jHSkm+q1.iK:2l7?y%2[ g u|MǼU>Go.0t"3uT _₡)ۚEYlnYvw@Y}^f3}a~x/yǟ wtozf|v4y+ɸNK6BY9u̝<+}uX5:H3:ԝR3g`S86quU[x.{fʛ^Bܚ^N$f~ԁ̰~.}!>rڻ@P βEvu$@wk?u}_ԽeSp;.Ca[e--uJWE\i<ƛneO_y,3 Ke ߞ3]AnsouZWfpMl-^]~}E):\{irO}3MD"+ F1 *B: {@#1\^9 ^ׄxk* o^U9|l\Ag\_wBAL/e~o<};}0'XGg^5en f^kyq0gw;eC@ʠVi'Q!{^efcTL5ddfdAT6xSW/PJAQ)`&C<2"/FQ"Zb#Fat*NRyq'g=>¡B2^GUw;TzZªĘ2DO8\raT!["-v r+tw%`bY-fovi"RZWlWŐD3 ;^ H\B;NeҀ\MH. zX)xa^9-}@'6:I ؖ&:yӱ}:e?޳n~-7є=DT*2 +QJ]cdnWk>'u=ȕQ;OÖ5z+.,qg&Y 9K4 H}>(O%AiR%ZEn !ztK4_8yVn# LO֭!H?ba9ET&#;R <Ų;܇jw <^@wQ;7@؇ozy\)oS:lvF%4Iӛ$IMl0Pp-7m e]c#4#EAF;Ǎ67nd|m5@jxݫ߰UPG繤Iuꫬ 9|,y~SG$c62l`jn/&p jc&:T|E`|( QBo~Z5UGfb*zz!s]aԂci Wx6ElJFzN1$ I}íe %07o#z;h=mpq; t qwb1/yX_n3x/FTQ6HlSiH ތ@r\5!6#ASp ݂灺7$qގ.Zۮܡj>ݾ6Zk&] Iвӳssӏ]^h"tP廹((*wCYQIVd`[ovtsjOsEZqzu6Bl]/񩚉$;xNP)ՋaAfq7>{޾`B QLRAe2w] wG_ HG.ٷIQGUsb38j9=q4*&9nE{\I2u\{2i&/`'%%F4G>:Weq櫣%vw7SҢF,usVri} 'S%0?.PyFJv !e]"/@\I'KMJF0役[3˞DKΝ{זdsfPI?]^D#H m̠GHVUxo#3 )wPl@0u [Px!%d?_:(Ğ AVR++mɵC# [,e l> etD!r˵]%ĺ[ZO*vr92Q2F2֩@z[=A:vj@_K0Fd &\=J3+S8o<RXjfcTL7 dyufdAT8xSGǗMQ6ZERGL$P RhՎJka:buN;RK8]my>|v6wpneM=N* *Q ebbcq0ϙ7.DTY+3y.pkuNFUNjGxZ҄- 0 o[iUFFRƪb?wuFЗ N=Vg73׸U/rj14*XEhEXUeO8}VqWHV 0mjuV'b6+;>%hBvQ\#ZM0C^ {@bzH|Uf <g`^װ۬ZtGZ9_/BTe܈ eb금[NqI0r;N,Z͆\Nm>:yߐ`Uը2z1ifBbaZqLZpPnͱݮxjvM7t a4bnH׳\åehr5 .A[NIc.15d6g$F Ln?߀dm?ud/7gM:Cٕ!|H[;.kfI0_b~{?:7&v ^f仝BKʝνpQ"xh6Oj;wtn pɩGr'mPԙ %gR#0*>`L%poAO,`}PvpoDAa& K(-|reͰ' 0}89_U8ɾ=0R Bg9]c/,Bwuɷ Ge;ahNlSD_rIbU9 w =B%l݂r%r*v0cG#BUdH5 *?4)@DhB؟-U$+QPBX:g_N*܅!)l4z&%ݤ[(_l1,=ᤰKq^禥7 .;" )nмw|2+t LғD-F^h 1<|~zL<\8vuQ3%dhС e &k9|)YRd|!p`%HqI;1lw}nyg;r?mmg{aC=W pMsrwj^b&+gX~3~VЄx--;X8N&v]ZA(S.yh@G⿊Ej|qmc"8ŅҞm?iRYzæH5>/ҧTFX >߰뼒":0`M,.|AۮQk?A=Z*#`%\eik5L_qx =\g$CDHrY,YdɚeQ+m.V`Cs}/F[ =ۍ w ێU,X ֱr >h7L N0ӋBxVi_uA0=wŃiTFcfcTL9!dvfdAT:xSSGǗK&*Q( jR(0bL,DXQ2hE d|:RC">r$nsN@}Ctp`^0x}mz"rdS# s#v KX{R&B[bbΎWX_s P߷yD5OzCڠ18!j;0^Jc^)u%jt_琣Q ! .v2Zoo0 +=G1G!.-).GP)O3@6 P3vܬ.K>=]YBF`3YX' ƫA%ĈF8Pk< ^p;U-#N[GA!,y`W GWMlg%>P<< 'WFXGF;W nօ_圕ͻTiV,9kj-;g\+2&,.4&D &DKR@S~gETh19Ġ7A 5tts֔O6K@.k?|%ֺH~7uNКc#@kg_ާQ5l-}J))0ӻ^ rk4և|GŏeG Pѫ*DF."U9֛>s,@M-`dPWP{E;w| 懶IVJy#6?u:u5k8>vUW&|4~H%M @$)r˻=+1ɇ"ifL-&)^MN|3׆ %yBOu~]H7㏉&Zҟo*\U4]/wH!7'7=Ǩԗ7a YV7Q7%Ų p}VM_8@:ԷљeI@ uҍ>>ri>W`Dj~Q=ijKzۧ׆SienMh)A r51kO_*^XM$vyY5O1#2+]'J=hh-.>Ц=aҵ!5Bl|Iΐdl-VBƤ@HhGHLTdfYk[ )#>Wb:d9EYm Nח7fl-}pv?\ʗ!8 9 6VûCgXQb橨6$Lc 2()ǫvXx֧!a#.tWq;q)4bVA̝F.Si\ 9W2w*wX8o'Us㱱O (fig_!3<>Icga**zZV 9mh%L~9izm C )lX=FD#eʷcu+U9}.ShY,Mz`ZkCO6=EKa۶[n<~3ݱQADt$WT7:t_lRlz:M#!i{܂z']@fY ,Md&n)W_Ozm`"/gׅX4bcEiX[h_ޛZ"F-@5of8 ք@F@(ΰC2x ~b{1E{{԰R~!=)C>.v` iR^?R"ːk 5vPWC;;!Ą]8yUz\g6}YKKIeV*>k7 VI Vk\8mtmjwz{?*jD񱑓;vHQb3@T)^^銢M`NTbޓNsw`(=j5C$6Ϟ(Q>+ ^$iߒe(Fr>{w] fblVƠyܼ1nG-zǚ GY?*ѵ?.: t?1wy\M5kQhYK^ UzX ?}\3z N^b>ԡDFbQ^vXs aSZ(i?F5GF%<*˒8Q%2? ݣg%'$(O[ĩw ͲLڰqGhNf M͞F7:k@^?|81 RKsh5= )DNŌJef90Cdv`MffX +fDcjh2!;M3 u}+󻾸[+Qm/٤XgC@3Mkl۞ S:bEIfcTL=d.fdAT>xSGǗMKBˋьMD0* ŀ&F͠PwđioZ+jm%W h۱v:K%@xϽ.n͇=Ͼq7@\@T8EUFٺ'3FW1I+ÄveLb 'liU0Xoa0^GC$V Bar9z&g`k>ݯmrwv%vy{HT]!M=W8m&F̸3-ëxs~6*# E!-5NE:R{DC#@F?ڶ0 uܕ]-m_A{rֻyUdGBr\ԯĝH~ z8 [sVM[on@nqXz4#u3% & _E5Gc+o8c'ÊfZBGxlDg_TVp5R`W0}|(ؽ"`Nq h '^gh3!t k1Xak Ut,Sێ%R" 斚E[h_Z}of[Wg+6k,ЯԋYjA¤f7f7Ԍ,g`~ 6dU}h Qj1tiɃuB]uk pIf֨mEEAHK"J FPanb61.69Faک>_EPzV+m)h´e_,,v im5 Ƥ s:5u~BD`#5qr@7B 1 Y;YqQB%w^#-4D6C v;V4퇜To0Z~y/*#5(!ـN$U?NaInWghzLUݴRnK1 iU,SXLݕe)h$ʍo>UFV`ӣe=ДBֳ8%SX}`~6ɺJ>X[ aBk-D#l~ :Vde\@uzY6pV$oY4Rqb;iG`WYS 7꠴E5BKYjAki5swSGRB^[33s$P ҴY>1]@EEEEEEEEEEEEEyP̰nCQ6J쓎%H8tD+›@U9։wU{ǩ j??Φe՞Z5lmXW\tW.e`l]uxB^8䧝W⬴lWhgKKhI=|&:lv{ÐGȴ)Vae{zT)P0u9pqMCib(^X6iU\m${7yOp.hߞfB= BW:՜ڀ@ckd&},\uv{tDWP~X:խg“/[#g8;DXyE=h-r؝avěV 3SUtLzUJG KTհ)6|~ɰænP}z.Y}v.ǁpSǬIN|eW"@+ꒆ;XG'"iТWdZüs(*ٝ!,̐^zq"fIKSҞ-dUEJ scYYΛC9OQߍ302m=kR#Y5㚨ltvhKW@ p>}GKq#jyETKG3r:&g:wAtsr^>ruۛv"[Z]ܛ $#jNbGgǓ:W>Tؽ)Va)Zq2i"W\-+0nRizn~ uzcqZ>'!-G]A8v*Ph\ Z ߗs 7 SP KkkK ^WjYAL\ @̬jTc`_Q'In:cU*5-E_ K[Cl.fa8ЫP]_<5-cG(+F*Y+OtU jjϡ<{suuJ<Lf y`odY [jJ~O>4] rz`J2 Pt6`z]_nz E- {`nEc26EwJ{na?DG=M 0w*H!vl79X2``qMߩ ]nW ` +i{;Me22l;1u}n s_I&`IxR }JvT{,=3|!˖ӽ,(j;oQ [ ;zRđŷjZvfJ_P8dڀô=`lXQ(Q/s :$Rg9δ>u;]Dd[Aam"eW&2 \{ +djJc&|w. 4rɨ;KfcTLAdrfdATBx흏SG7K A1A%) F~F2ZSE :@)NŎEtK܍(v;LHdw?o.9*¥;@=`ylyC{A/W)64<*ٷ0Io(ܟ`!U-6)mN>U:ȢMI`vyo˸hޘa);:V:hV;ϼ'񬜰rde-[qJ`h'/5TvF$V@*YެE|VB`W9}|>n!u'"UB>H6&Ev[B p嘌ڄbe'OQn񶅔%Nye_툹@Jq#D&A uY V"1u0'$u *b}dR\P4pz'4'-zvEf˩ӇTT)S@39cKjU.xΫK]g]'5פ+kŗ:Ba?\ЬJL7S~eXW$U 6oP¬R)cBG &@,W-,hPy u=TӠ+\T&rh֬\=d4 L!7(۷-j["ɉ^WokRunRŧIa ~zzrnM  3^"*ϡH%d5\n4S3˶κ>E:>K(ِΐ #ԳÃjpIC1{HEEEԊ\6NqWA2t t,\*~crX Ok=D Er9˼/`` ˰lY yaE|*>I`0g3ޡOYQ.6&' @x% ĠeԠCJ%W;A-G bojA~3)iԤQ =fbXwՄU—"Pa}xk8듏)ֱ5{P Q}Z5; s5kN z(Xh6afp3D }m EwNX[#uإK)uHʢ&B-[ ]D9x֍ҵ%ALՇ75ꢠ- ݀aN](6ܰS#.'/I"'Xu==%Bd=pKS)Y@\"h^wіj4*i{>Z1KtuzqF@ќEGJ S%V͢OG|wޓ#gkY^X*`i@(a=>`ZJkGųV6caf]ڧ̵K qrXWG 1ىt mr27u4eE@fcTLCd!0fdATDx흋SG7@:6-9J* hk>*u E#jTGEL!H8Vm;OPInﲫ %w{﷏܆Vf4-l>F k^Mchm&"n!.,@7.]j$rBSL{6ѝB2Yd~!;IDjkm+:kE9yRhI =mP/\1 P r`7Le[ f?+ۼpXU"]pЈt1Q/K 3? s[M Y$:6/ a b'b+>풂 +"MQDDPzMc>h+٨q&)FYCqHJTTll1[pw&RWp aR^DeG|ʃc̥qHF;[rwD"+m%{*R^U~NSԌK -ьE3丶֤ڞD g$[^ ^xʵ%$~y kIS3X!|ft>Zzt_ONMWv|=+lo5;qqE-Vev>)EW]<*$73oЫgEhnDu6IW΃bt 1jW<bX$(AҺ)o`7 HٙMh{a`*HQ^X&Y?Y@ 9@_U[Qw%U`=aBnxuIAY}ygxq2kM->֤|Qaq!+a@?ŢNMZ~E)b 3Rn/-c+4TYE4ʒNR 9:U 4)֞a=!XtYA㗊JLCEEEJpz\vk'O-~2b.a_Ԋ>aEKٔŘ}l:9e5?ǪӐM#H -5BH-YsSU$⍪95k0zoԳsT kQݦ^E)ZmpB=VB ˴""WQPQQjIQDT/:/ۛ E[Ґ+'UXkvb}<*%ƨr?\^Uɺcԟ>=Zs.7IU'?ڪ֍X>Ygp‘}Ժf}9J-a#fcTLEdfdATFxSG7(L:BQ1N"`I@FF^*`і5jEF|UG[ ƗP ") 3Ngig'd$vu?Kɳϳ/-bP_<) ;)iY8t5<$v{};ʔiW)$daԜLZ\R3OL8E;da}z>[5@MSc Te}|@'js Gl'ZeT' JMU874/R!ۧIMOy-*1M<‰vwtU`4Rïʁ >צΓ4=i{qFKrN :ﵺOsUՀHtQ|/֥|#-eլ[80 ) PyB5p6‰QY\~QIAX!G'/oAx6ٌ߿u-\JTw@ڄ/YW+_:&401=xx >,z ikzfC6&J1Zk:=thКb_Ԗɽ^Io/QE}CST..D+]@f,_q_̜, |xY|ԣL?NOg*OCK5STByN'aOE@ot"`RK$*دZuZ]mJʹizs<]q&hP.E 2Vn8?4=(:KtVPLtJjY%4^?f\ *fԶh 󅂒Nհ&U47[{z-N 9eA5cWL0}V+5]Kp|SwH[2/t\ 5 <mq8-V}"-8SHۥ!fϴgEZߜ~ɁI !䓃4,p6AzT3󪢰b~n4,Ūgnz9;[_#9*2'CMv52eߠ(=9m_bojq`!^tf2!tfI,yw*d+^2| wL/b_tM B4P""u1r_a={`7'^"&"4ҘSQ"01Pil2ւ t&AT"&@A咜n=|H5.\\˴&8c2Š t?jI&svVD3Q&YlLִLߎ\$(V|tW~;*4Ak+mSaf8&MK+ANEtY^"^tA 49PpRZ4BnѤ^ZZf~mxmfZ`h5c0D+hu0q=GH)8YfcTLGdLW fdATHx흋SG7G т63$bS(:B*PÛjC!CtR[:*ZS Z;IG#ޞ7kow>ooH*7H`l~z*aMFY!]'P! H.L8m_OD*:Axkmeyl%zeO=K'*Kd'ݾ^ ԛ_7/D*8)ѯUaeM(7ݣ3Xح$&' A9$-ŤaC}6$$b(1{wMh1[ԙ(Re%+m;k?™BHŔP}@ЦGQ۹i3tOWˇ^05g@VNz@=!>=ր0b :C =3 KZ:s;\sOBC݀I95|{:w:7&)xMeGͨ@nK*>.hfGTb^CZN}01&-Ai5: B#N똭EBNWp}?\9`b|npp< ,=?3KՋR\%ipLzLOaAQMvf~!s$wc9Z9-Ȋ"kY&pOk ҬcFe`tn'G-8sf)JT;Y [墤ĴsrgU0{OGC$Vyeb["9ow 'wSG"AgaX3oa8QJOO&hz 瓲F729E3=}YbRmƪ@jaq8ҨII+⟤)rSS R+/AwA9ԩȚ+5͈cұ PcBW)mFQ?iW,V) WM؂*l*G]To~2!uL&׭8c.y*8[[89Fh8 <ohVQVpJlt'c :3&y Td.#VȖԊS4'mȟDS+`~KC :b`}"r1Tͻ@yʎ}G͓ژ u2<?T[3hOPAI+o^ӽrWaRdLFm7eJd9w+mF`Prr*3ʦ_|| wG|//epd$9M7ztE %KCkLzJxYߢ=rdF=Z&nl-cȈf'/b{)t٩֐[=]K_/a!U-UQ'nzKUJg(y2h ҔmJ\ytJm|чO :u8 YK\;a-fltXXdbGiBX##$}̱&Aq nةWynmJPiQW͕==-B?aUz]ܯ¸BL^a.p@ꮃrɝ4UA$+|8y Y8ø˽ט?T;R)Up0I;/Vfic(S}aPs38vxjz(|η^t6o6ߍ3A@ -,d'kfcTLI d=rfdATJxSGǗM`C@mUI$H@A_xy Z :`2Zv2#:ZFM6EQARVZ*m_jKHȋ\n<'繽MrO2# ^ 43Fr/0ibb{omFC=%es[L"qLUyԻr՘=.)dIF26!d󟑕9b80#5l0}Đ +;ٷVsY7^iRĶIܗa8}¢|LN%sskHv|N̋^R ;ef՜\3eѡ*$ՐJ v+^+65H倃k/Kʩ c0}:pjƳ4(HE=P'tԑݨ rQf' YD90TۣJ trP7l3&)ԧq,NLwLRpuϙfjff'` լ 0J5 1 N=8=A0q_6ía;]I`YI !t{vsL]"} 1A岢 ph\%/BcLx`8PВX{53~5 _g\:\ l%G77H+쨭z8usl9c0} rIhۺi'/y\6Ν/ڡ> Xjcm' ǘ=_ثـ-\|?7.8մYhZ;un1d1rkrd)A͞Z[}(3?pk'i%y)`b29w cѧfUm`ՁR#Dכ*;j  PT'·CeEoR8!wKQ7U;t~tbb PuU~.տ[Sgaz1J)̺[2]eP,3nalcVK9|ގV\-K?$@ @ @ @ PTpێwߌi\vdM)3w)} طr2$.JIyߔfZI~ʼnЕdR3<+hLv`/;s\⦛;L,Un Y;'^ÓS4 zs !9y{BUq3HZEvrgvFT|,wKq$gA' }pR$lfUEҘk:Q/P@" J <9 5N.P5'?N*QZ,z!W9x٫b0 r#M΢" 5YpSm}˾>QS* Xl4%Յ?¾%$\klBHt {F<.)·!Ip8&l h?!úɱDZ X3Hu6V-P-9zW<؜F*1u#dEgH*V i-cEdFs3EL*9ƄӭߙuFLuD39PZ}oU<6# im\"amk~vuuu}4gzVdؔ*)ɰ;sGIGC cTà/vB35=qERUO dq:v]wU,3luA(#6j @iIo6SN0JI~K6⃐Fc`Μ6e~\Fk2q"+%BAqW<Ĝd$ dgXSSdir TW=2,-k]P0JBNIR&VŮ:O76zy&kQk1x.pIRǩ=Z\u8T)8XB"^~g%JN,K=B 9! Dq "V]CG)`eJw|7ԗM8 8 Ӹy9_"ɶBO\˒<0 }R$r8ZZ|Pz{C}Sz&3{[~ȅGV&y- Rej/%vsROV[>ed',I1a5 2#=t߹"E/L^8y|4~U7f v;(P_Pl9m-4ݢiFg.ds;] '_WQ tM:_,ޞotdn vćPp斞?ld g!t; At ;Q!5`Qr5ำbUϮ.%+W/&ue{X0H;54Pr*7i]ԝz L~;@;\677eg2 gN[&k~H}),\g0s,@ꩣbY^p2v!e Jd\${Ag^!ˋf`&Տ1lvH7${̡fcTLM d_[fdATNxSGǗMmI"Ah8(ʋA L-b_:vӪb+*izI K;ݽ=d ȢDB8 &ۜ ~y.ϳ  V%,3Gfz.So!:iq=Ux 69ش|ՆƯSdk|aNe1~|#ɹJ;Jq NBHW1Dpjw:+{3?TG-V;>+}>uP՝zPq[f]gs|DiIzNzKC*D#wΒd"P$ԖX0=4D'I;~&rjO[MU?kxnxA-*þ mC:׌ Iaͯu1}Z*3 \?bt6P.] ^ u 8Z/e7&:GFzaQp۝ %J%>,i%' 0ȕӾ۾qe̖ɩI9t=ޜQ^7ǖ?e,MwOnUw^S]^tW.mcˢ+Όm] tqwYvc˜BfʥIS\f+x EUoqYbrPp`*_b;pBDM\Z<-%8o8 ],MZLʞFjm6ԤYEAxs\]smi75qm_+J)y{ lGf8V|EoE ;FןW R-\of$G-hMt2 (:PtecJD"FlT\żb 1Gn~65gDtpk3F4{\[w'X%lal+{DOj Mhizdi5FxG6T%$:,Ba0џxWheVvcP+bɪ?& c=fH1x z m}Bl߽E8qb| Nrm_\yʏ!0ԝ [0dP|h1SXC@|p{jA:x>9*JuenA#~yP s/Fg s"OC؝]t).Y3w{SZ˥)9Dg~eTcƒtdhXj:_jB1o!{^6ﷷKy)X IPbR*Q'_iG&Zpqo0M۷R&rߡw6&b ` _@ÿ^LpT}-/% 0ׄJ= 4m}&CYʒ`] ޡ}nJѫTk՟T3}dm+`SZv7SODhj(Moahl6CR@&) w]%Oe3DxN2U#/6W|hF$(s p5|-klDTT9 ;HP,H :j[1 CpK_ѝ\p[vr9vDq5l0Kbx`$ȕ_P =2E)΋Uцno s;t: OOYs3-0SH6]QgƠϵRWћWCu 0mXr3* ӨK~_jѼc;ԸTPM%o (354߶ρOP,H@J ;O؉Fg.rKRc~7 IOV :{nNHW`NX&½N{y;r:CO#,ϧ 0RDEP0Y$Pp8aficp \ gKU pS(X\6cXs _{33O^;f3 )kÄ-q*e1D1V;yE[+P/8o>fÆC+lW^.;VjmH\䘇y@-X^ώ= OP%{ǒ{#]EzG%m1\|C̑1ş/ȉ4[8@})fFd}]AVT!;0ȳ:'.b hPQQQQQRm?$"8mzbQD%AAmPEZi'PWN }1*a&!1n>J]%clپd^0=w_xftJۢ@{BT^Ӿo . OdR fH`8p6#1aݽXL|vOJW/[cf~?kAHF5y>.ƏpDHF*@0~ }848Nf-3df 4*/_e e@O`W?O9aum%G[@zR:pFEhu!r 3buy4Z9ȞҷͶ1qߩq 8"#Z[&{zOd?IʇahrVY|a2> &raHX $cvV5naw -'^rr{R51'I1^*P+e# >H LPV?qZ 1(PǪʐ*]|B3eee뽐Zcou/3z^,V}[fcTLSdOlfdATTxSG/{Kx` # wF)iF^A2E"[KKHyA;jCX;mu@-Rfv'5$`]nq3$]no?gwocy{gHӻ oޗ&Mf1\j*\\eZcbJwV8s6…r!Pܟ(h*^%1[[beQZ R c3OCʕ-0 S.iB'qcXmk-Aş$W@b{/CE%%/˷ ۿɀ0yB0#`@WB3 ^0Q/IGȎGϺL'<̹u[c46?PH-}7ccuڔx1 ^rt!C~GH L8RGq8`}:mmOāl2ބ bx \ bt#phuTś]_KXg0E)Kq!.rpCӹyS5 Bh}h򆬬c*zKcz-CU i6żyNYK#ֵhc tQJO@h9BhƐϑ<T˂p]PCU"Pc Lu1T2>|L I(ޣEȡN\UI*)⬜9ARH' 0LVRI+0>WUL|t\%oFܕ F92k-*****L |Uh'ToX@*`a܏l\[3J >l7SI~.?x=ǻN!EgqG&=e&,|zL ukhp;/_qKK&R+tǧX'F1I7rag0FR1΂eS 8b9 ` ŗHsek/T,[ruQl~fmn߶<}wX`"H`cU!LUS)>3^:pŵe9=H*d9/a.}tզ(j&%u^-f& 3%_(/[xD|ږݐmsFCN0>Z*urnFrSK֝"wO0Q6!_Ç!cӌQv|0 `9 ,]rSt"Q\\zECb= $9눋#Ѝ#) 0bV3,1fqq"crݨDd%NtR(:~~䘈:Rjc؎J~2x23ċǃI7fcTLUdy'bfdATVx흏SGǗKΣ % E/+VJ@B13Zj#(Zk:jKk+Ae"#Xۙ:C(?ܽ:K>\6SLL+&7_{:u "&H1OW'H-#8_`%A7@wy][o:)0Hpf4JqɉDncǀ![dL; Jv6)WGcIo_ =-tR5LT;?3! _g<;I82 w8}8Jbd 7y G<_AyI=qF0(Dm&o{4ߦ_k/9vsTsYWq8rf_E+`v'X:gs<DZV Kq!#p䴣p<z[⍛O8GĘ9u1.Gc2V53y6漢#kUsZyx4HP@PjĹпhܸ&Pxzj˻١?JaFqYvέO}j w<%00ڞgI 0ٚ8ctԼ?Iq`x_?Qqر6?5_ȷj1WFRJy4 8;Lde_ȎFBj)W9śk4~"g[z>P^U!$WEx;Rn<27]0^kwG:繥6GƽOtGLhX[K6 а VW䰆z_LOĈ1L+09(XAQ>4 FjabUP-Go*,"Pn  /uU808ŒCGjkyYps%9 g-gEAb*+g,\)2&`bbbHQ`2O21E{P11O216!ipQP\|}/w^ΜBٚLbR4v H1)|ч B```` Ozc;S$ $7 LgtE͏[PLE~ϵ7 擩G4~3E^{+=܄i6j 0 Wn@8,G=hn43փؙ)J C֭#[Q)ޢQLF;z62V&P:3rG( +ب5!_ZXo0! Vz!I5aB;S AQ-Î"ks֕%kfTEX=(ϒ!6ܧ|/uu;RwUʮŕ;CB@ "tK*$d5>E[;l Q_eԙd^R6 :ҍb?cM2H?Q{݂Z?TNh;byKO :q_qT- in96\S;쇞l~V"Al6fcTLWd^<fdATXxOSWOO[-VۡP"C@ , M%F3f EeHa# l?5 T4z{'>y=%$*$eE.qpO`0m1x죔 SЏ)Fv $~\)& ӅD20Dhu:|OwnY~ Ɏ : RʑSی>2(Uۿ`v EuN0`HH8$H $a[;+4,гI[~_&Gz8e3b>R'Ҷz kS3Ro)T&[aZZ_\moH]BR0wG:o]B}kJJcx͎{E?HAU~}M1"q{}/F׮=+ɍ;ۛI Sb2Wb2 4O[hiujQ!E8Kt#TQɂk8G2IGOׇvKL{տgcƺzq5^Wb5޶,Ԕc\_ Â%" ,(4"Icƨp'َ~9asvNVVV ú@AnGF XWۇ  1kq 1|<  F7~<Z։ î{1iӋP1tӊHc+v(G!.#!v(Dd-bCqpEL aSq\y >2+ ލ<:ę}hW8{U޽$Uƨ(i#ǡ.?ɪ0CY΅Q@l>Po`U9%f0 i 5ÛL Q,V/SsNg7j8Q^^֮ 9":_2C f O޶|y9X$R1V[ 4'[׿yGq^G 84c6SeebpӮ0 9 ~f29xѵ6E֌*i3^JSrLJ[rp#Gpq„`@Ad!I'IK;8>)a :8@f%jL[7ԶHɳu@_05|M m#Zی 65'Dp|s=:rm0Ը=칰K kp uMIi$ eoȭP7xp|)9I>@l<6 AZR&;ǡޅQtf.@Oχ)ʖ?9w*[hmvwkRQU]ɌDZ{DE$^ݢ. 6P-iFڌcHqUӯ]ĤiQ$k$۬BEH~wl@TÐښ8 H@L p4ő8$c,<EW\\sWPm;S5\BrJ|jtIMM| !2I'~Ȅ%˖y K` .IA'W=`A~ 5ƞ!_=H@恁8q8r H# K> Bs/,c_$uD"H$vd_;9X@x$W* &y- GliC@V^N0K IkIfJHle-}ADx/7<^II>,9XRY>n7Wf\>6Υٲ#pC:I!xQWv OD>. Ef#d&D"z H$$XK+ nۿ{ D""v8k~ <:qAEe*}Qf!Ν Uh*  Bz1i`O(ъDŽ 9QGe^"o=Ӈ9SZg#J GhĢF s44bq{dX 2SSQ}c.cyppy1NCۗ*p8MP#$'"#xSYS_ٶee/9m#pqSٿE(.6DaᱨШQ1XSEe79q Mob#J&}1*( ]cB:t#Q<    9VDa1#7T*\~dxO$*jO O^=rcQ%ydVTTᩒp)hlkyx |}=˄"SskM:ҡWW$*kEU[u)UV3a:=*m+eɐU^ѵA%X5f>bBLTuT `Q);MIИC&ScD2%)`HxTR4=NB=.B„֔}2&qeD\7_q-veC;pŸU!xHJ>B"g_603w$Yq.M/%i&XOlIFw>d#C\JJ%u yA#[O&ԕ^y5XrBbF!qQZдUmϼEjpWa?Z]>pWMBtE[!@"? T=|lRE kE?{BE/t?/`+ 4}BTJN A,q%X*C2|ßaV%Fsq(<)ko"Ïpk3SUYYYsH(1R _5i{djo.tx_];~TLnز K@,,*#+>TT$, v,mR9PJ'+HLձwm2Uo )fcTL]d}^fdAT^xOSWB  TtP A`BS3fFɺ2 ȚB  H6aVkjF{Y'!{{9={znalLjhz=_dٝx0v!@$dB`¹dA!¹ӍpyUhTfs)# ODSd$a\hw.`Zt,;/UGڸ"W,A Fe9_ǥ(ۈE%N ts hq£u*o kw=9N,mq}RČbMOy1.gYMB֋sڬ]W<%Ja.7%;A/2K"f6_|Tiٶ$vi(,M]lB4#s$*9"*t⑹1]}Լt I-w]{㣕Xidb @Joh]xK5B(*@L=tPR%((&`bPDT5PTx&`>ȗNQ)h"2qa KJ~ &  ]  +|o0&]bpգki"X6a%= K'YPLp0Tp,5:"z uUH4pN:cKGG([wl bupSVI:,-[1f1__2h'CacĕքPd@xľ iٟplUl[+8BXEli>gJl+K:8C<׳B1 "Ϯ({zU_nn^oRd$6ܤyd΍")5J }~&b!7یed5k~$|ݒ[F$P~nu5&'7@a(.[ jgl/C>nxM@G&+$\&BvJQuwƳ#o)d>t7!Jǿ\fcTLad/jfdATbx\ O[U>ۖ/E` m qHEбY:h5"\n3XC"M YZ 1F7Ba{y͹s=}ϹB"Dr"Nyo?/ެDLk 4@ Y _p/䣀Qpx;}ȕW-&R/*I1BAhԠ+괁+Pxd5 1m+AW­exվ oS'b5ę̣M|^L12?w*Poq2 }mȿ= "5R'o&y >H0y_~8t{!lDIg,àWzl*>^&?M/p]۾cZ[3+F{*hPPPPЌ 9_QgFhPqz'V,[foBͺ=^z.`\xV0L@ LmÌhԖbb6-A qԔ3z#-&#FzM$Ae/ qcWk /LSA1+оvR@mA@g|qOweFBWհ/Cs2\D}(A̟w@^MtAo;P sׁ?  PK `o6 h ?o&׵Bjjѝmt7z\NHN|ΧԆ41%cM2BNQEb׸B4~ \@0Hcݴ @A/$dOjdC+%4UGYbvٔ F&=( ^8: xB8plwZ`ŏ4>?O)ǜ >?Iz?}&/2*[ 5=Eg&Nxk[`W}>MKg).%-\^1ؑΧB}tr4F pO#GmnL^~W;UB*Y<п̘\΅“tl]wc :#2T㫇nrt̜.J>K- ƎnIU > =79guEX ΄E@V(jsߖp4Bfw&=T#.( } 5f~G/ 5ƢOTzg'&5ξȇ`f"QNI*r& ZfT@Q>)[( lWKR @'Uuo}HT[۶qyMh -3 ͭ~꩜9bNRNj ˫ O&qT2|x%$ݰq nUbΌ9V%\R԰@2g29Ǎ96V:\`fcTLcd*qfdATdxSU†"P4"P U 0VZ@Kq xC88Hơ'H;h3U`kO2 I%^~pvϾ@0( p:IxNaǼ;.mm1n]1DqֲH gfPe#5Uc;kCiu6kCw̭xm'q~>(!zCOA3zA͍ˠiA *pE65V!ZtXoF.O3vZt~ӮQHV(5}}ӔS2_fĉ,l2y[ Ԝ&`%)!wC'2r*Ns#:Ԁ:8oIp_s,0Ѿ"7B w BP`:xDC@P{+ mO4 ɻQ1o瀚aj+9a%wwaqrg3RG\.OyXU-}yaaay"ĥk- v|f2ۡ|iP(! zE&".UĤ0K}Q*4e\ѨC>i޹& f~wEEXϚKa|&|`)^Ѱ,xχ;CkN)~Ra i`m^3櫒/wiG琿 xxGD|RD"."bP{YȀSRV;ۢ-(m9Yq/3!/VgccVJhRRC0r$h4&Ir@qϕsl}壤634 {ڲ2ٻcż1%>=y] 1" k7Ռ($a9eY7JR/""\`X,O '5Wpq3(#4w1 8&`ǰ~eʊ`$|ăKnZs۬"Ak)̝ rbj7=/j&$9!޲_$wud瀰LNt/mwo ۵.mV풭t߽j}M ~4t|9ٛt菇6"ABGמ{媉J82v@Ъu,*%O{l4ɉ6Mf_Iez"fcTLedYh,fdATfxSGƗK.ޒZ[1 :H0"R,R:e8je|*Nvd( XPةvz@m r@ns_$~ur[Nҋ͉r?pZeI܏S{LmH{6Hn˨?t=gyQLn̷K'fG@yJ1-}Vy`wĠ7vi5abr0!2..ZO66tsssWŘ6'}}|elBkfff+OsdaUVu0$7<{drip҂a'LPow= -&&&&&&&&&&&&&&|*} 3ӫlU_.-pA`)Lȴ@rWdtaj&wlg5$.e7j.LXƳ^<>{UsUA[ƻ\OOxlIdJ\@4gu : 4{16yXJјq'7l=X=w.;C<wcᳵasbWY=-\k^猺xe7j65QM*z Sp: Pbtw+0}9I}Oa1}YS-^tN vgbD*\e^Z8;m̳~kYy< >ۢluwݠ|RU գva/*Wͩcbقyliɥ3/V\YRRVt&|R"G'{}mskcS""6P ~'tn0o͉"@*+Jo>wPz{7/R*/ ^o86eyS<κ¢&XME׽r䨵&C\j4 h!uSY@橋]źO%L-*5YE@{t{Um[#.ٕ1oR RJ;ڦbqa "pZhR72 WޡfcTLgd;POfdAThxSE7H D $P "H*P BEJ(RjqTgZRSS #2 RŊ$@Kh/~a?Ðrٽ]noBXBXX&qv2iNKkJƇ0K@5 7lsSRЈ_UмQ9 vI{cr_\N_gdsTTo  `0 ;zͤv:֝eł OWtq :|J*SY2vKo'Q1pUfF3I)E1h)v0Ω7xXefB,%O{W͓+Zk~~~I%7%2^977.͕ۯiE45. `0{e񐳒Ht4pgm8D).yH󈃃V+ϣGW5b4d[1~N!~pY;^I\ *x^piL rRP "+1y-1a0 G/pX˽ @ oݴ-o8} ؼfeݨP:-oGQ#Q٫ۼ䚿y:uش> 3;&{t`-ΣcsGLuldw\,8;2gEjH [b9 1'xpQzQyլHL"䒈i1nxKvL=D4<8 1]{BԐ)N/\)N1<$#ٯf]oa!`0 ;3P^8==5a25 yO6B&v2қŬP):p~d.n|[x[zh#|8d@Y4XgǃB^7&\xZ05v{bQVUL!-b5>V>ƹ0zUq[tVd%̮q6#A5=\VrezΖwmr7=7D|;h,#5B6J`te.qẈW&c/~K U.;a\!| R V*8*NhS5A§W8i y d=(Y[Ye&A-UsCZzBm}f6O;^? ]9[J{wiJz}>yVqU050'///'kފ6LKCa׽AaI?C &dfcTLidy`cfdATjxSWp7rE 2 EQPg2eXuU[J:)z02&Tr "hPp#Av1// |}o}oCs)8Rt8keg[M?R lcNcxwLpf`5Lr#msDPr֚/l d}nD {ǩofA#@%7ԟF5=y]?JYג$#yS!wkjjY(, .)`+چ`]%'mI/ U;@RX^aR|6A͞}Hyu_8'RY_uՈCI}PQmTTTTTT;AǛ *GE36.*(8lRNBAU4wIT&9PeB jŲKns'|see!5+~PG+ʞKqGSySuZ3YXyIXLArSQQQQQQQQQQQQ b'f9sMOe@gEΝc`su˱أ5 &:6.a4xssJJfbT('vr <"C!,XycL9] ŸheMh9Hi! KJ=(@)*R<`pXdG @:Qitk3U nP kҭJh;H ߢezUh6o2yPk~^t/kv tFGIV&yqg{+"$>=oaXqw2z$`^Ma#\ZQ*A/E.Zڱb>7ݫ{+5JbÂp:\318IWa@p+Qɉ (8ч⑟=9tx5#\w(E}>HM@}PQQJTTTT;RFjs:%ha÷x)m&G7>3><|-)L 1 cm,L¸mQ3LbMLmh]ɂ|\V` x#CZv'[f$'W+#tҎ ?d/x~fٽ^"o7+ϋsn |Q&"FLoXR4&@ޕb#cfWo旫rktdYilO ?%S‘09QvpH!QsGߕ h(>o,:xB+q u?O͏Y@'wJS`jVPuz2wsK*ZܺrjG5o}ZԗpdzB& *8jX[%7ƖJݴ);E*}8?pRBfcTLkdcfdATlxSUo%P@@@HqG( Q*B 0X- 8cЁZ)j[W2(t:K&<:+&4;/'{CNVƪT9j8E4E'-K7rzw30gXsqnB`MtH#GûlZ*ط0Nd'.zz;Vmm*3A/ 1lP@ 03l0Caw :V)*e܁4*eWҗ|ƓG#x`]~Onn9n`da SsAA:ۡnPX3=ȗef ^YP ?eWD\*> 7[ P)~qj~?ĴjԻ['6- u'X[Bqu1ʜ,s@|6   Bӭ#D 0vjBzL# !EJݙ퐈r8> 90wy:GŜ>&!QhKUyFt0O,i/xz)vsy>j?vg-"W?]ޠ*.&*>9.N(*6'=\Z󚯞NV($?Χf>-{2?KKGGeXe5۩G)SZ\H2ZԷ1T%L/)ݒa1/|에²u:.(K7KI\Ql6/x[Z7L0];p'ΒyV5c`FwyB*,ݞ WH*c .f&$pȍYY/Z露:fcTLmdfdfdATnx흍OgCZ>Jp4!¬@A0`i"6BP7P6ۈ¦ f$[?j|۾{~ >z<~\abVPU1gY?za.b9 ^̿@l}`͙:EF[ݳ 3a`Q 齎@$bre  ƳPulڃ~^ #s+a~"LB{q [I@]m0uF+~ėVeBgjDz?b׀d^bȁQoڬNO+ޅJ ԼC(sd5[*j( _'nɫRwK[|dgtf~ 5IdhC D0`c]~*-ty B/t]-"SP/(`7O@͔/?Lb!M@=vB6re-P76)Ckc1\xd ͬkv}" dpAAAA(p,BD jHLr{5GZC:TOB)W դ52̸Q#U'OWFd~{BxcBΘ*ըiX2浆lݝdCŖar<7S"yڳ(|`~_Rz{DIly1 yR7tisvŝ4WMz1jHOhyay89'ϸTtR%p_TYqopgw1:dQ͕'"^4o,,ԦdgH{o}S6%.A앫}5<@\*/{S5-; DN2Ƒg;Uc$.|l>J{  2vXxD=X`ͱ G`?CA‚!@D.d b`F._ {ѹW*OgO׻0S=freK#7k^λs^ghIO:F-ܼCth TsioSG +R(۾"{9!L ys6%\a{ $hvbq)Mi#bJUd b~yhWμNT`6*vǪp[S#pY*Wx *.nDצ oR aԴ0ZIAsgo؊*hnZbdonIϵ/pdURǛВ$mvǛIMR_m懽v^^[SS^kz3c:E[{n켡=EJ6)"Q?F_ "=% fcTLodEfdATpxSW/IHh@AM%ACy D,B(T ViӔNaJM ZP(h[ዶda1<,ܳw/a,1LR+A \58q'i(. 0W1 Ņ9D9=vs4o٤%l+vq>5Ve 6H2ĄQ0E\W.AT«ld߾뤰M6*եUdisi "Ds[FLoey쀋X$qj(`iv_z&"e(@YɬcZ_}5#勇DP̙)PsoR[P_P9xV[ܵEO{ܻzo&k(֦^5>gm̉˰gm  YLؿ|S qT?}@8K1|)AfUSw 57 _Q04R.;Y_@55mc-;;WvE}BK:}V? 9jjqAAAADuNח_eLUX{iQ̙̆QZ^>pÛ5hٲ}:-,Ib,tš:PVCRנxK:߾VΊ˯_/l@dRA&ˣc,-i9S_w G4sObz`E\E F xb Jb uTTl!:Qxh}xq4FþO\:h5#? Y'H$qƎ-*k맞&JzP P_zpzAAA> A  x H! (SQG'񚟚@qI9\]ٲf@ O5ljZ;[6=CWG;巿UgYv[5567wy6Jjn Ιy$zLƔtE֏L7$%tJ'GGQ;+=[K^^Cs "|=}-Clv/{m2CVCtϵy}/!#'6WNnN>O%sZ. R!,:>>$qs}ļ*}e^5[+0_7޼ϿZ4_xƘ)g#[@1<#>zeݼ#y|tУFd eNTsB襝?C#r/eȯ4͵C_ [ʿ IzzksrdufcTLqdQ Z)fdATrx흋STUwѻ# CEwx +A <I4H3JT@TfGd34S-].܅}/>3:{=s9{.c% 1$!Tu8o-0m%2@!DU'wwqqgc,OѢg<.!4c!mWf-/m ǩo u|˥u[lk`7ygguGQ/ A1gWqe,{ι]`xK -4,"|< u|tL̀d})nd~ Qqx L92ziƜe<@u!g9,7CFpqha 33睶0ٱ;8- Emhm`_=_;wy̐bIt[AſsG85 d*x;=*PsXvP^MwiiO^S{?U-{AAAAb;/E`8Xw8'(̹ׄ/>Y \˽O'Uq W(4Rq.(W[-NՏUfO~e)^6 ]b}L wIdxhh֞(''ljupDP&4AL:ePkAL`9.vEۺRzG<~J,xYR(FsvK 8◥k*xP9+ܕhK(kjM?O6ƇZ9C څ㥭t6S9$/b8KQOQŁƤB1sUq{3݅e> +aLָ Þ#c1;Rxh|Uy L[ty5u}~s[{X77ѵޘ|.p1gǧ6\̐GŁzsԣL딷; x#s3{/9tonY&P[fCD7zf9OFMgy&GY5`ih *R\:=3qؓ\ΦF^xu؃h2T+-}jomCfȅ5?:O~mdUPcݵ7Yox ^~և.۫$ Mn$r%4ٕ\DjHJU5'r ^P>ϸxZC\|Q%Ws!T*+݉8c5N5wZd]V*aJwoUÌA WAd(ζWzwv2]^^Ӈdn6,!|w{{׼ +_@3(R}mAh3QX sΈsBu_uJ=H.E@Ul1S' ~7P~bǤR=E?TOЦ6.1cюWSvE/ј'In=.5W5tF.:u<}ygAT#ÓTZ,yY$6,.Oߚ!Qm]\faQ*dxk30J呿D*{(K]rb.9[}%}u_b>eMf0d1-uy\"6kcVvc*]ӹ_ .Yc s7_bkD m=E4fcTLudJRfdATvxOes>hGLJಅ/SW'#t:QaƐuCLg !XTB4eƟlY׮뽻+!s=r/>y{ƴ錥9f>83 ] ;T]Ɖwv{>d5Edk ՠC-1LX{QW俇n4ϕ-%bOhI<j~.OkBG=#s v!A)!Ȋ7e&І A'?379:Qi,k[eyĠ_1?>'0cT׸Gv O=/0Ń1GtsQe([ͦctĽs:! xeBឌA#Y'r ?ov35p y@a-ڨttCvf1RP`fJ tv2n-ktkajD FQiiF5\,˧:y?I|AAAAF&+\b/2Y! r~6sDu.C[PGAC>ߔJq3g˵2[f@ʨ<Ǡ(ʗ߭j?gĨΚJ?׳dG?k|j`9M2}d+((D3]P!S[ k^,GRmvɺ AAs8w?d"!MJm sMad4B༰\o{ťb d^bbZz s9/]۳YbҬaouOC5>2vP ygRҐ_ }8RRW6ca)]~LF<G< z) c \x"dUHiҐ}U}fJ \vyٕssA˚~W7TGpDYu=1'ABC>3XO1Xg^ȐͅH,,T <'6!b1vJ{A7}#TM 1KyU]}ΈG~x7ybۓ\԰W1"Y[Y_Eν|PGRN-'G?*hK>T*gm w5o$<|ŗanwْ~bq+䛏]x'W7.I7k9޶E5o$n7#vIۛ=8>zmgAv~s_O$<fcTLwdA.AfdATxxKSQǟw|f|M*֋eZJAVPdYQPDdȢ,) YY5vKTls_ (~Y>)& ىI3L3Yo VȠӞ5CekcAH6L7%p.Ú5R:n1 >[q#vZ9}a&cjVIpD^#@{Q^ۏVe6s#FMjF^P3:5(35aeɵ;(Rf_2#4bbzѳ=-EC,3wNb6lUq6Ü9ZJa| uqi%^&a&H<0 Uf{vaaaaaaBoGŢ@τ P tL3M8)b`T,0fY)ebq8bUT0kaHwF^D=Zid`M- )GLe3zb 5S%5#zGS]B MPaeDLQńIL1q,uY@f/#t@%vJss$@IgȜ wtEʷsv֯HntR_@fa1_N 5hG'jGc6󗫊Rcsa{ǸS0W/qD7qbu7׎|,eVrIb !A|Zbrw,X?#)Oڇ=<:b&ۊ*fȝgu}Z`7'-@w"kF&ͤ`aS=:z8hoX/X,nT&9v; F۠4n_\!XQ٘jFm<:|+]KfcP3FX3;݌:*; F,P27d8rڴ#^ms}D| #8 6N?IfcTLydT D.fdATzxOSIǧC6C[@" _Ȃh͊X](Q#ccv5+&c4,XT)e'"P5Ε 4K93sܶ\!pȱ8O^RFQnaxMzR~qDoq~!])=CSR,O E)x@V(TDKZCE-ێPX KK􆆪k8KDu`6ihZtݱ4D0 0 E)$ml)%eZjA6ͱY".i /zSlsG4Ɩ@O!<}4< ϲ>2P{:=ѼgZGgle-;xK),¥`yoy WNQ 1(j8gMG7QTVDS*VY;>0 0 0 0 0 0 0 0 0 0/vwYxQ—e<Xlf!n<)RpWOG1g3j./tO׳bST7njYd{y>Txak=Z?v~w[/y{W._Ɗ[ r?khxfqrfy);-c8a')Д62w5/iTZ'? w5Y ʅeDށuBt;h=<)6. \V^p"a̢gn&`:_E̿z|^V=ug/sDDp},GnoQ"_|R!?,{y&^ /W?)nݸco;wkz!-ׁ`Ҕ&~]:N7s=.? Q-ӧ騨nDO{*GfaJ#(QMg_Ͻ"D&-kJ?^!zyj _"t ) j+,VA%_Dռ/tM$-8մL *s=K4y aʙ<Q\t(_'MTj| cUɽr&8qfcTL{dwZhfdAT|xOKSʹ@j)`7hx;&^`c1h1#jIx1'9Ɠ&Z+uWOBi7̼ۧ3-BfQ3QM]Ujהg6P F;WQA#A|TpToz)!9>}1$RR.fi"yskkkE&ƒALENTԓSxPtk*[pgdyg7`!ۘ의wߞ?yChP3*PU, M&zv FMdqgM$,YtNӛG3sqYg\9:OUBӵXQT;l@=Ĵ%|bRJ.̥###Zr|=R&W ?+t3kTMsG[>Nn&@mkY!.B,2z.)C|cryJ>Z_^Hg踒N8LSVtˤł*?1vJ~2υjJGquT8~=FuS<'j}h> 'n -# 95=;teiioo̼}>3EF+ޤ6>|iNbmCP_}%3Y:ۻR‹e7=.!Hߢ_@߮y} vFsݼ1oh,heE@C&UFL!_^kfkS"ZӽITO;5m;PfCG?5 pHI$0fcTL}dEgfdAT~xOSWO/N;,-J)PEaFƦ!Y|Z&"&jQqf˒A03DvmDڥ\/ ߓ}? /}'!PA(u hJEeu[rjPCA $XO ft4gV]d!B!B!B!B!B!B!iIٷB` $@\edRVV_RE\~^^`5[Jh0W|Ӳe/WJIbjOqy6|;e`14'f˗y0"o(ſŘWgFlH+VYr49[lH} PN!e:hIM2JRZAѫfFnOZ▝<ǞLL<͚G\3A- <^}g1YfJ=ݽt~[,1p {!zw8?Ay\jǾ9r9Mvv}3Q٦kjlZS9bXbXf xkjz̉rpͣowZjy2Ȍ6\H TE^m5I|C{_z ;W/͹Lt)+vSw뉏EҫGV͞ۻO8c{|-!Mf=veE4hEQ>MsN^ۗz":4L-/,OH\oP_F(ck0NtM5\3ձuGU%zoZ?`%>O+xfcTL dFfdATxKSQ=+֖n6Ws ZSPzC2D,M~hI.zFaV*jXDIGi:lWyi޳{?<{ιgw> d,pεZN C-}g n 1 lxT\DQ&FۆfվU4ebt6E;ۮfgOa5gGBy9=rǧTV^{VS>ȝbf6̴.MV)?l:ןlӈ',h_w+n~}suaLDsAJ [έ#>A*fLjmutN3Cc&1Btӭ.efn}_BGwc[B<ïߔ|uAFNۈb*朓-ʝ~&KCFg!`+fmoEA0Z9x q}gJ@gv~rWӺ(L.&+5w-0F9;O=G7ZCB>a"N o%[v$^i8ɗnuU{E:zO*jsD-ƍZrJ+E-XߖlQK;;-繙 gYlwtyqZ+u}ujbY_U)#3 Ïs"<ނ0˹7V4msIk$fq^⪽oIV9}q=5AƖ9[ǹ m]VOU=4r3g&:#*ɜ-c/ldEqe\~ ^Jt>Z(|n庬('0Y<{_n0nt+DG + GVLVlTChLa^_&ۍ* fU⽒MgOrИ-UWB*l+ap9+s|uw]t:{Z|B'5)2K5۷F>b)+o~d_ZY_N"z-J&g}mA4nMoIgm+{F=9'IujMKݱZCo2YT5tAJ6I”mMK}7<t: /\wfcTL dYX fdATxKQt50gn5M DEYXIWae Khj $zQR4K7}yu~v=(cBIL|kbL.I>aJ gL3sN;#03NF!dFCIM\3N%uF")[:DaFo 5ui$?kY;u;C Y94i=˼Sr 795Ec==_9DO=֐ssA9k_6Ot hA4~_Kܛ)d7F zL/d7AK"~229T^?& g?.46aL$٢1JGFjndSlT3Uv8O/*$ԟS}L|򤜏/:YXZ%sQx“tl ZxaɹN+_k 3&g>)|PdF?hZGG[<F%(i%QDC/,Sym\9라jsRokK7ͽw"?\4f7|-ݱ&.UdnWr>ͫ9Hu|LFRf5lZs+L6ڎܢ%V 姾>kTX֥zU;W T<*YZ}AWjYۙ-S?6epkqf%TcPmѺ>eYy0?E],2Sڒrndma"?ȁ0=O_9;ɜj:JDV@[}DTUݼە.oL޽P D8k 4RMq ]3\f^(,,>vYvUhEfcTL daEczfdATxKSq]3wqҥSs.r@˕)J$*]d҃V h*f˿6o<[s;_@7dcLɸXW;F-?Nh+i}Tb[mt1B7jE2ͥUKht":f>GJURo䫂@ rIɕWbIJXٹ9H-3޳$1 Ao;hppO8bߺ=.0 ٕ^{˱xꨜ~!^F&u2yB9BGO ]>| f'lFjPi5L <щ}r0S\`j }vSƇ38UH껓YeN[*IZQ_%-Mej)dd6j7u;B ZmH: qkZgcYZx&)[d4c}0ڒ/n7-Ɋ\[\ PW_Ve^j_ɬ|VUIƼ'o-]U;S8<՘sLF헑 Uiv6yrt!^lNgX{xήtj+Jj?w?'a:Bvcl.oݯ4XmVּ_ծhmy⇧&k-#&;*{l4E]I&9r겤齡[BAMina <[~(ёWTRӐWīx`., 9EQ.q 6~.?fLg.6k-a"m3 T:k&bud'}Y'cO^4vH57'7W!]DǛ,q#LL2S ?B6dy6 *?fd9ֻljqqjh:dTj3߮m/Lk;"vn4IVo\Lر{n %?zR)[3"M|s{hRM%|"K]MFy?;YN- N;{bѺ\Nj.$1+8-#)wAwc?ufcTLdŜfdATxOs0q$ DJg={ޗmGp{Pg<;oH"F"mTHDg۠^@Gks^!Y {eZ.E .UZhWrÖ[^O.h*Z"͢*^$gZ߶Z2 !\A6}^=֭iTxxc2%tw@Pf1rixf̧W0[~RѸq WvT3zQţyqt4>>c5iږ ]8""""""""""""""""""""""""""""""""""""""qs+sMa M fx(r)bpYP[nzm蔏u ާrY-ܒ+J]i Y 6_ v5f~6/s\uGf֛x_Ҙ+\}N ץZ*6sT].]73/^_-y1n%|h9 Mv7ew˻t֓~ݿ:璫{<·|80][s?D56ϋq˯!ov=bήD>JVRfN!޶@Ӫ¾y]Zƽ{ 6ˇol"{/6fcTLd"^QfdATxc`.fcTLdϔ+fdATxc`KfcTLd"EfdATxc`"fcTLdfdATxc`MufcTLd#!;fdATxc`נfcTLd_SAfdATxc`naIENDB`PNG  IHDR TgPLTEILUIOIQ}otRNSIJW-WR2IDATxc A0@*T`& ! 9 NRz`'XoIENDB`PNG  IHDR szzsRGBIDATX N@) FƍF/4&ƅ>H;w1IEAJ[ӌёJEbt63gz._Oδg>ɚi*eBpE$l2zN$qoĐi`G _7 "9&ueA}H7?d+jE}ώP5j~:5:!šӂTsUMap ξy(Iէk!X$z~=3wB2P=EEsx ݓLz? k *XC$ kH0 lʭ_ U}u_-|^ zUD^Gp)[<^YZo'iGKNQ\BHhBIENDB`PNG  IHDR`` PLTEuuuuuuuuu5FtRNSK&QFIDATx^1 0:Nd'|ī]1AKck'HD"D$"HD"D$"HD"D$"HD"D$"HD"D$"HD"D$"HD"D$"HD"D$"HD"D$"HDsM?lbIENDB`PNG  IHDR``j PLTEuuuuuuuuuuuuuuu1_tRNSK&$WIDATx^AmC/LES)hNd}~/{:::::::::H A A A A A A A A A A|og2.2UIENDB`PNG  IHDR``j PLTEuuuuuuuuuuuuuuu1_tRNSK&IDATx^AmC/L*(ǟJ Ds%{}|߃#::::::: A A A A A A A A A A A A<*IENDB`PNG  IHDR``j PLTEuuuuuuuuuuuuuuu1_tRNSK&IDATx^1C/< P00*0Ul?:׃Ntp:8Ntp:8 A2E!( Ad CP"A2E!( Ad CP"A2E!( Ad CP"A2E!( Adhw"'IENDB`PNG  IHDR`` PLTEuuuuuuuuu4ptRNSGIDATx^1 "5] Y3ܼ Z[``\ oK X攬 hpbn. O1x08ү kp jL0`wsY1pX@&YT8`j(PXp|OH"odsʏw`y58TOvrY \/-//G76;hXúY&{ (cg%bFL@om"0 sQGκd̿[@+ͧaIENDB`PNG  IHDR00W{IDATx^=NA) 1<j%5 `m*J WPY$j6;>oc ~d?ޙq'1L"zLqh#3,kFn[?IENDB`PNG  IHDR00WqIDATx^?N`.6TWL$$l`N^U; +(&] |:7ӯ5{ AS+ ؄=4;-G)(+fW9\DL[=`O94z |s<&PpqG} p(oL(I3#ezOUZ[Y.[Ї;/Y`ʈURWyx۟lhLD87yv l[k: [LW|5X&B$KC4 ET!c.TQ7főIENDB`