From 070caad672ff312217aecf34901de9a821ef820a Mon Sep 17 00:00:00 2001 From: danielweck Date: Tue, 15 Sep 2015 12:09:21 +0100 Subject: [PATCH 1/7] Debounce (tail, not head) event trigger on CURRENT_VIEW_PAGINATION_CHANGED to avoid multiple PAGINATION_CHANGED callbacks (messes up with Media Overlays playback, amongst other things). --- js/views/reflowable_view.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/views/reflowable_view.js b/js/views/reflowable_view.js index 16f4ec61a..a80cc6b38 100644 --- a/js/views/reflowable_view.js +++ b/js/views/reflowable_view.js @@ -457,13 +457,15 @@ var ReflowableView = function(options, reader){ return false; } - function onPaginationChanged(initiator, paginationRequest_spineItem, paginationRequest_elementId) { + function onPaginationChanged_(initiator, paginationRequest_spineItem, paginationRequest_elementId) { _paginationInfo.pageOffset = (_paginationInfo.columnWidth + _paginationInfo.columnGap) * _paginationInfo.visibleColumnCount * _paginationInfo.currentSpreadIndex; redraw(); + self.emit(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, { paginationInfo: self.getPaginationInfo(), initiator: initiator, spineItem: paginationRequest_spineItem, elementId: paginationRequest_elementId } ); } + var onPaginationChanged = _.debounce(onPaginationChanged_, 100); this.openPagePrev = function (initiator) { From b3844436aad555517f0413bd60c7ae1499b5b584 Mon Sep 17 00:00:00 2001 From: danielweck Date: Tue, 15 Sep 2015 12:14:45 +0100 Subject: [PATCH 2/7] support for navigation history, taking into account non-linear spine items (no UI yet, just backend API). Note: only back-navigation is implemented, not forward. --- js/models/navigation_history.js | 128 ++++++++++++++++++++++++++++++++ js/models/spine.js | 2 +- js/views/reader_view.js | 80 +++++++++++++++++--- 3 files changed, 199 insertions(+), 11 deletions(-) create mode 100644 js/models/navigation_history.js diff --git a/js/models/navigation_history.js b/js/models/navigation_history.js new file mode 100644 index 000000000..028ea81df --- /dev/null +++ b/js/models/navigation_history.js @@ -0,0 +1,128 @@ +// Created by Boris Schneiderman. +// Modified by Daniel Weck +// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// 3. Neither the name of the organization nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. + +define([ + //"jquery", "underscore" + ], + function ( + //$, _ + ) { + + +var NavigationHistory = function (readerview) { + + var _DEBUG = true; + + var self = this; + + var _readerView = readerview; + + var _breadcrumb = []; + + var _skipNext = false; + + this.flush = function () { + if (_DEBUG) { + console.error("NavigationHistory FLUSH."); + } + + _breadcrumb = []; + }; + this.flush(); + + this.push = function (bookMark) { + + if (_skipNext) { + + if (_DEBUG) { + console.error("NavigationHistory PUSH SKIP: "); + console.debug(bookMark); + } + + _skipNext = false; + return; + } + + if (_DEBUG) { + console.error("NavigationHistory PUSH: "); + console.debug(bookMark); + } + + if (_breadcrumb.length) { + var lastBookMark = _breadcrumb[_breadcrumb.length-1]; + + var bookMark_contentCFI = bookMark.contentCFI; + // TODO bookmark spatial @x:y! (should be charcter offset) + // if (bookMark_contentCFI) { + // var i = bookMark_contentCFI.lastIndexOf("@"); + // if (i > 1) { + // bookMark_contentCFI = bookMark_contentCFI.substr(0, i); + // } + // } + + var lastBookMark_contentCFI = lastBookMark.contentCFI; + // TODO bookmark spatial @x:y! (should be charcter offset) + // if (lastBookMark_contentCFI) { + // i = lastBookMark_contentCFI.lastIndexOf("@"); + // if (i > 1) { + // lastBookMark_contentCFI = lastBookMark_contentCFI.substr(0, i); + // } + // } + + if (bookMark.idref == lastBookMark.idref + && bookMark_contentCFI == lastBookMark_contentCFI) { + + if (_DEBUG) { + console.log("--- NavigationHistory skipping duplicate bookmark: " + bookMark.idref + " -- " + bookMark_contentCFI); + } + return; + } + } + + _breadcrumb.push(bookMark); + }; + + this.pop = function () { + var bookMark = _breadcrumb.pop(); + + if (_DEBUG) { + console.error("NavigationHistory POP: "); + console.debug(bookMark); + } + + return bookMark; + }; + + this.skipNext = function() { + if (_DEBUG) { + console.error("NavigationHistory SKIP NEXT."); + } + _skipNext = true; + }; +}; +return NavigationHistory; + +}); \ No newline at end of file diff --git a/js/models/spine.js b/js/models/spine.js index 58c07f26b..606abcf0f 100644 --- a/js/models/spine.js +++ b/js/models/spine.js @@ -55,7 +55,7 @@ var Spine = function(epubPackage, spineDTO) { */ this.package = epubPackage; - var _handleLinear = false; + var _handleLinear = true; this.handleLinear = function(handleLinear) { _handleLinear = handleLinear; diff --git a/js/views/reader_view.js b/js/views/reader_view.js index 895353788..aaa9a09d7 100644 --- a/js/views/reader_view.js +++ b/js/views/reader_view.js @@ -27,11 +27,11 @@ define(["jquery", "underscore", "eventEmitter", "./fixed_view", "../helpers", "./iframe_loader", "./internal_links_support", "./media_overlay_data_injector", "./media_overlay_player", "../models/package", "../models/page_open_request", "./reflowable_view", "./scroll_view", "../models/style_collection", "../models/switches", "../models/trigger", - "../models/viewer_settings", "../globals"], + "../models/viewer_settings", "../globals", "../models/navigation_history"], function ($, _, EventEmitter, FixedView, Helpers, IFrameLoader, InternalLinksSupport, MediaOverlayDataInjector, MediaOverlayPlayer, Package, PageOpenRequest, ReflowableView, ScrollView, StyleCollection, Switches, Trigger, - ViewerSettings, Globals) { + ViewerSettings, Globals, NavigationHistory) { /** * Options passed on the reader from the readium loader/initializer * @@ -51,6 +51,9 @@ var ReaderView = function (options) { $.extend(this, new EventEmitter()); var self = this; + + var _navigationHistory = new NavigationHistory(self); + var _currentView = undefined; var _package = undefined; var _spine = undefined; @@ -189,7 +192,7 @@ var ReaderView = function (options) { return ReaderView.VIEW_TYPE_COLUMNIZED; } - // returns true is view changed + // callback is passed true parameter is view changed function initViewForItem(spineItem, callback) { var desiredViewType = deduceDesiredViewType(spineItem); @@ -197,6 +200,7 @@ var ReaderView = function (options) { if (_currentView) { if (self.getCurrentViewType() == desiredViewType) { + callback(false); return; } @@ -246,7 +250,6 @@ var ReaderView = function (options) { }); _currentView.on(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, function (pageChangeData) { - //we call on onPageChanged explicitly instead of subscribing to the Globals.Events.PAGINATION_CHANGED by //mediaOverlayPlayer because we hve to guarantee that mediaOverlayPlayer will be updated before the host //application will be notified by the same Globals.Events.PAGINATION_CHANGED event @@ -266,7 +269,6 @@ var ReaderView = function (options) { setTimeout(function () { callback(true); - }, 50); } @@ -352,12 +354,14 @@ var ReaderView = function (options) { */ this.openBook = function (openBookData) { + _navigationHistory.flush(); + var packageData = openBookData.package ? openBookData.package : openBookData; _package = new Package(packageData); _spine = _package.spine; - _spine.handleLinear(true); + //_spine.handleLinear(false); if (_mediaOverlayPlayer) { _mediaOverlayPlayer.reset(); @@ -430,9 +434,7 @@ var ReaderView = function (options) { pageOpenRequest.setFirstPage(); openPage(pageOpenRequest, 0); } - } - }; function onMediaPlayerStatusChanged(status) { @@ -554,6 +556,8 @@ var ReaderView = function (options) { var spineItem = _spine.getItemById(bookMark.idref); + _navigationHistory.skipNext(); + initViewForItem(spineItem, function (isViewChanged) { if (!isViewChanged) { @@ -570,8 +574,10 @@ var ReaderView = function (options) { } self.emit(Globals.Events.SETTINGS_APPLIED); - return; }); + + // Otherwise, twice SETTINGS_APPLIED event trigger! + return; } } @@ -612,6 +618,8 @@ var ReaderView = function (options) { var openPageRequest = new PageOpenRequest(nextSpineItem, self); openPageRequest.setFirstPage(); + _navigationHistory.skipNext(); + openPage(openPageRequest, 2); }; @@ -649,6 +657,8 @@ var ReaderView = function (options) { var openPageRequest = new PageOpenRequest(prevSpineItem, self); openPageRequest.setLastPage(); + _navigationHistory.skipNext(); + openPage(openPageRequest, 1); }; @@ -732,9 +742,48 @@ var ReaderView = function (options) { return true; }; + // this.navigationHistoryForward = function() { + // // Not implemented + // }; + this.navigationHistoryBack = function(forceLinear) { + + console.log("back nav request ..."); + + while (true) { + var bookMark = _navigationHistory.pop(); + if (bookMark && bookMark.idref) { + var spineItem = _spine.getItemById(bookMark.idref); + + if (forceLinear) { + var isLinear = _spine.isValidLinearItem(spineItem.index); + if (!isLinear) { + console.log("back nav, skipping non-linear " + bookMark.idref); + continue; + } + } + + console.log("back nav: "); + console.debug(bookMark); + + initViewForItem(spineItem, function (isViewChanged) { + + if (!isViewChanged) { + _currentView.setViewSettings(_viewerSettings); + } + + self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self); + }); + } + + break; + } + }; + // dir: 0 => new or same page, 1 => previous, 2 => next function openPage(pageRequest, dir) { + if (_currentView) _navigationHistory.push(_currentView.bookmarkCurrentPage()); + initViewForItem(pageRequest.spineItem, function (isViewChanged) { if (!isViewChanged) { @@ -929,6 +978,11 @@ var ReaderView = function (options) { return false; } } + + if (initiator && initiator instanceof MediaOverlayPlayer) + { + _navigationHistory.skipNext(); + } return self.openSpineItemElementId(spineItem.idref, elementId, initiator); }; @@ -1164,9 +1218,15 @@ var ReaderView = function (options) { if (_currentView.isReflowable && _currentView.isReflowable() && bookMark && bookMark.idref) { var spineItem = _spine.getItemById(bookMark.idref); + _navigationHistory.skipNext(); + initViewForItem(spineItem, function (isViewChanged) { + + // if (!isViewChanged) { + // _currentView.setViewSettings(_viewerSettings); + // } + self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self); - return; }); } else { From f82734091252384cb9c4dba01cad696bef26a97e Mon Sep 17 00:00:00 2001 From: danielweck Date: Wed, 16 Sep 2015 06:58:33 +0100 Subject: [PATCH 3/7] nav history canPop --- js/models/navigation_history.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/js/models/navigation_history.js b/js/models/navigation_history.js index 028ea81df..fbf223d4f 100644 --- a/js/models/navigation_history.js +++ b/js/models/navigation_history.js @@ -115,6 +115,10 @@ var NavigationHistory = function (readerview) { return bookMark; }; + + this.canPop = function() { + return _breadcrumb.length > 0; + }; this.skipNext = function() { if (_DEBUG) { From c329a074e748a978492dc5143149480b7db5e0b5 Mon Sep 17 00:00:00 2001 From: danielweck Date: Thu, 17 Sep 2015 21:55:38 +0100 Subject: [PATCH 4/7] navigation history (breadcrumb) API updated to support non-linear spine items (return to primary reading flow) --- js/models/navigation_history.js | 17 +++++++++++++++++ js/views/reader_view.js | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/js/models/navigation_history.js b/js/models/navigation_history.js index fbf223d4f..1c6395388 100644 --- a/js/models/navigation_history.js +++ b/js/models/navigation_history.js @@ -53,6 +53,23 @@ var NavigationHistory = function (readerview) { }; this.flush(); + this.containsLinear = function() { + + for (var i = 0; i < _breadcrumb.length; i++) { + var bookMark = _breadcrumb[i]; + if (bookMark && bookMark.idref) { + var spineItem = readerview.spine().getItemById(bookMark.idref); + + var isLinear = spineItem && readerview.spine().isValidLinearItem(spineItem.index); + if (isLinear) { + return true; + } + } + } + + return false; + }; + this.push = function (bookMark) { if (_skipNext) { diff --git a/js/views/reader_view.js b/js/views/reader_view.js index 6dab86fbf..aa248b024 100644 --- a/js/views/reader_view.js +++ b/js/views/reader_view.js @@ -764,6 +764,8 @@ var ReaderView = function (options) { console.log("back nav: "); console.debug(bookMark); + _navigationHistory.skipNext(); + initViewForItem(spineItem, function (isViewChanged) { if (!isViewChanged) { @@ -772,12 +774,26 @@ var ReaderView = function (options) { self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self); }); + + return; } - break; + console.error("no valid back history?"); + return; } }; + this.navigationHistoryCanBack = function(forceLinear) { + + if (!_navigationHistory.canPop()) return false; + + if (!forceLinear) { + return true; + } + + return _navigationHistory.containsLinear(); + }; + // dir: 0 => new or same page, 1 => previous, 2 => next function openPage(pageRequest, dir) { From 89e9801db0e96c0f4217a6272deff1572b8bbcce Mon Sep 17 00:00:00 2001 From: danielweck Date: Thu, 17 Sep 2015 23:28:39 +0100 Subject: [PATCH 5/7] pagination can-go-next/previous now sensitive to non-linear context --- js/models/current_pages_info.js | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/js/models/current_pages_info.js b/js/models/current_pages_info.js index 0a78c92a1..1f0a8720d 100644 --- a/js/models/current_pages_info.js +++ b/js/models/current_pages_info.js @@ -64,15 +64,11 @@ var CurrentPagesInfo = function(spine, isFixedLayout) { var lastOpenPage = this.openPages[this.openPages.length - 1]; - // TODO: handling of non-linear spine items ("ancillary" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs "go back" feature to navigate to source hyperlink location that led to the non-linear document. - // See https://github.com/readium/readium-shared-js/issues/26 - - // Removed, needs to be implemented properly as per above. - // See https://github.com/readium/readium-shared-js/issues/108 - // if(!spine.isValidLinearItem(lastOpenPage.spineItemIndex)) - // return false; - - return lastOpenPage.spineItemIndex < spine.last().index || lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1; + if(spine.isValidLinearItem(lastOpenPage.spineItemIndex)) + return lastOpenPage.spineItemIndex < spine.last().index || lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1; + else + return lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1; + }; this.canGoPrev = function() { @@ -82,15 +78,10 @@ var CurrentPagesInfo = function(spine, isFixedLayout) { var firstOpenPage = this.openPages[0]; - // TODO: handling of non-linear spine items ("ancillary" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs "go back" feature to navigate to source hyperlink location that led to the non-linear document. - // See https://github.com/readium/readium-shared-js/issues/26 - - // Removed, needs to be implemented properly as per above. - // //https://github.com/readium/readium-shared-js/issues/108 - // if(!spine.isValidLinearItem(firstOpenPage.spineItemIndex)) - // return false; - - return spine.first().index < firstOpenPage.spineItemIndex || 0 < firstOpenPage.spineItemPageIndex; + if(spine.isValidLinearItem(firstOpenPage.spineItemIndex)) + return spine.first().index < firstOpenPage.spineItemIndex || 0 < firstOpenPage.spineItemPageIndex; + else + return 0 < firstOpenPage.spineItemPageIndex; }; this.sort = function() { From 7057d6ffc9b0e05891e0c20fb0162b3a5feac204 Mon Sep 17 00:00:00 2001 From: danielweck Date: Mon, 28 Sep 2015 10:00:00 +0100 Subject: [PATCH 6/7] updated build --- .../_multiple-bundles/readium-shared-js.js | 307 +++++++++++++++--- .../readium-shared-js.js.bundles.js | 2 +- .../readium-shared-js.js.map | 14 +- .../_single-bundle/readium-shared-js_all.js | 307 +++++++++++++++--- .../readium-shared-js_all.js.bundles.js | 2 +- .../readium-shared-js_all.js.map | 14 +- 6 files changed, 544 insertions(+), 102 deletions(-) diff --git a/build-output/_multiple-bundles/readium-shared-js.js b/build-output/_multiple-bundles/readium-shared-js.js index d9d5b74df..0ecf3563c 100644 --- a/build-output/_multiple-bundles/readium-shared-js.js +++ b/build-output/_multiple-bundles/readium-shared-js.js @@ -556,15 +556,11 @@ var CurrentPagesInfo = function(spine, isFixedLayout) { var lastOpenPage = this.openPages[this.openPages.length - 1]; - // TODO: handling of non-linear spine items ("ancillary" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs "go back" feature to navigate to source hyperlink location that led to the non-linear document. - // See https://github.com/readium/readium-shared-js/issues/26 - - // Removed, needs to be implemented properly as per above. - // See https://github.com/readium/readium-shared-js/issues/108 - // if(!spine.isValidLinearItem(lastOpenPage.spineItemIndex)) - // return false; - - return lastOpenPage.spineItemIndex < spine.last().index || lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1; + if(spine.isValidLinearItem(lastOpenPage.spineItemIndex)) + return lastOpenPage.spineItemIndex < spine.last().index || lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1; + else + return lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1; + }; this.canGoPrev = function() { @@ -574,15 +570,10 @@ var CurrentPagesInfo = function(spine, isFixedLayout) { var firstOpenPage = this.openPages[0]; - // TODO: handling of non-linear spine items ("ancillary" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs "go back" feature to navigate to source hyperlink location that led to the non-linear document. - // See https://github.com/readium/readium-shared-js/issues/26 - - // Removed, needs to be implemented properly as per above. - // //https://github.com/readium/readium-shared-js/issues/108 - // if(!spine.isValidLinearItem(firstOpenPage.spineItemIndex)) - // return false; - - return spine.first().index < firstOpenPage.spineItemIndex || 0 < firstOpenPage.spineItemPageIndex; + if(spine.isValidLinearItem(firstOpenPage.spineItemIndex)) + return spine.first().index < firstOpenPage.spineItemIndex || 0 < firstOpenPage.spineItemPageIndex; + else + return 0 < firstOpenPage.spineItemPageIndex; }; this.sort = function() { @@ -1235,9 +1226,9 @@ Helpers.UpdateHtmlFontSize = function ($epubHtml, fontSize) { originalLineHeight = 0; } - ele.style.fontSize = (originalFontSize * factor) + 'px'; + $(ele).css("font-size", (originalFontSize * factor) + 'px'); if (originalLineHeight) { - ele.style.lineHeight = (originalLineHeight * factor) + 'px'; + $(ele).css("line-height", (originalLineHeight * factor) + 'px'); } } @@ -10268,7 +10259,7 @@ var Spine = function(epubPackage, spineDTO) { */ this.package = epubPackage; - var _handleLinear = false; + var _handleLinear = true; this.handleLinear = function(handleLinear) { _handleLinear = handleLinear; @@ -13070,9 +13061,6 @@ var Switches = function() { // cases that are not supported Switches.apply = function(dom) { - - // helper method, returns true if a given case node - // is supported, false otherwise function isSupported(caseNode) { var ns = caseNode.attributes["required-namespace"]; @@ -13085,31 +13073,39 @@ Switches.apply = function(dom) { // all the xmlns that readium is known to support // TODO this is going to require maintenance var supportedNamespaces = ["http://www.w3.org/1998/Math/MathML"]; - return _.include(supportedNamespaces, ns); + return _.include(supportedNamespaces, ns.value); } - $('switch', dom).each( function() { + var getQuery = ((window.navigator.userAgent.indexOf("Trident") > 0) || (window.navigator.userAgent.indexOf("Edge") > 0)) + ? function (elementName) { return 'epub\\:' + elementName; } + : function (elementName) { return elementName; }; + + _.each(dom.querySelectorAll(getQuery('switch')), function(switchNode) { // keep track of whether or now we found one var found = false; - $('case', this).each(function() { + _.each(switchNode.querySelectorAll(getQuery('case')), function(caseNode) { - if( !found && isSupported(this) ) { + if( !found && isSupported(caseNode) ) { found = true; // we found the node, don't remove it } else { - $(this).remove(); // remove the node from the dom -// $(this).prop("hidden", true); + $(caseNode).remove(); // remove the node from the dom } + }); - if(found) { + if (found) { + // if we found a supported case, remove the default - $('default', this).remove(); -// $('default', this).prop("hidden", true); + _.each(switchNode.querySelectorAll(getQuery('default')), function(defaultNode) { + $(defaultNode).remove(); + }); + } - }) + + }); }; return Switches; }); @@ -13232,14 +13228,163 @@ Trigger.prototype.execute = function(dom) { // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // OF THE POSSIBILITY OF SUCH DAMAGE. +define('readium_shared_js/models/navigation_history',[ + //"jquery", "underscore" + ], + function ( + //$, _ + ) { + + +var NavigationHistory = function (readerview) { + + var _DEBUG = true; + + var self = this; + + var _readerView = readerview; + + var _breadcrumb = []; + + var _skipNext = false; + + this.flush = function () { + if (_DEBUG) { + console.error("NavigationHistory FLUSH."); + } + + _breadcrumb = []; + }; + this.flush(); + + this.containsLinear = function() { + + for (var i = 0; i < _breadcrumb.length; i++) { + var bookMark = _breadcrumb[i]; + if (bookMark && bookMark.idref) { + var spineItem = readerview.spine().getItemById(bookMark.idref); + + var isLinear = spineItem && readerview.spine().isValidLinearItem(spineItem.index); + if (isLinear) { + return true; + } + } + } + + return false; + }; + + this.push = function (bookMark) { + + if (_skipNext) { + + if (_DEBUG) { + console.error("NavigationHistory PUSH SKIP: "); + console.debug(bookMark); + } + + _skipNext = false; + return; + } + + if (_DEBUG) { + console.error("NavigationHistory PUSH: "); + console.debug(bookMark); + } + + if (_breadcrumb.length) { + var lastBookMark = _breadcrumb[_breadcrumb.length-1]; + + var bookMark_contentCFI = bookMark.contentCFI; + // TODO bookmark spatial @x:y! (should be charcter offset) + // if (bookMark_contentCFI) { + // var i = bookMark_contentCFI.lastIndexOf("@"); + // if (i > 1) { + // bookMark_contentCFI = bookMark_contentCFI.substr(0, i); + // } + // } + + var lastBookMark_contentCFI = lastBookMark.contentCFI; + // TODO bookmark spatial @x:y! (should be charcter offset) + // if (lastBookMark_contentCFI) { + // i = lastBookMark_contentCFI.lastIndexOf("@"); + // if (i > 1) { + // lastBookMark_contentCFI = lastBookMark_contentCFI.substr(0, i); + // } + // } + + if (bookMark.idref == lastBookMark.idref + && bookMark_contentCFI == lastBookMark_contentCFI) { + + if (_DEBUG) { + console.log("--- NavigationHistory skipping duplicate bookmark: " + bookMark.idref + " -- " + bookMark_contentCFI); + } + return; + } + } + + _breadcrumb.push(bookMark); + }; + + this.pop = function () { + var bookMark = _breadcrumb.pop(); + + if (_DEBUG) { + console.error("NavigationHistory POP: "); + console.debug(bookMark); + } + + return bookMark; + }; + + this.canPop = function() { + return _breadcrumb.length > 0; + }; + + this.skipNext = function() { + if (_DEBUG) { + console.error("NavigationHistory SKIP NEXT."); + } + _skipNext = true; + }; +}; +return NavigationHistory; + +}); +// Created by Boris Schneiderman. +// Modified by Daniel Weck +// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// 3. Neither the name of the organization nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. + define('readium_shared_js/views/reader_view',["jquery", "underscore", "eventEmitter", "./fixed_view", "../helpers", "./iframe_loader", "./internal_links_support", "./media_overlay_data_injector", "./media_overlay_player", "../models/package", "../models/page_open_request", "./reflowable_view", "./scroll_view", "../models/style_collection", "../models/switches", "../models/trigger", - "../models/viewer_settings", "../globals"], + "../models/viewer_settings", "../globals", "../models/navigation_history"], function ($, _, EventEmitter, FixedView, Helpers, IFrameLoader, InternalLinksSupport, MediaOverlayDataInjector, MediaOverlayPlayer, Package, PageOpenRequest, ReflowableView, ScrollView, StyleCollection, Switches, Trigger, - ViewerSettings, Globals) { + ViewerSettings, Globals, NavigationHistory) { /** * Options passed on the reader from the readium loader/initializer * @@ -13259,6 +13404,9 @@ var ReaderView = function (options) { $.extend(this, new EventEmitter()); var self = this; + + var _navigationHistory = new NavigationHistory(self); + var _currentView = undefined; var _package = undefined; var _spine = undefined; @@ -13397,7 +13545,7 @@ var ReaderView = function (options) { return ReaderView.VIEW_TYPE_COLUMNIZED; } - // returns true is view changed + // callback is passed true parameter is view changed function initViewForItem(spineItem, callback) { var desiredViewType = deduceDesiredViewType(spineItem); @@ -13405,6 +13553,7 @@ var ReaderView = function (options) { if (_currentView) { if (self.getCurrentViewType() == desiredViewType) { + callback(false); return; } @@ -13454,7 +13603,6 @@ var ReaderView = function (options) { }); _currentView.on(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, function (pageChangeData) { - //we call on onPageChanged explicitly instead of subscribing to the Globals.Events.PAGINATION_CHANGED by //mediaOverlayPlayer because we hve to guarantee that mediaOverlayPlayer will be updated before the host //application will be notified by the same Globals.Events.PAGINATION_CHANGED event @@ -13476,7 +13624,6 @@ var ReaderView = function (options) { setTimeout(function () { callback(true); - }, 50); } @@ -13562,12 +13709,14 @@ var ReaderView = function (options) { */ this.openBook = function (openBookData) { + _navigationHistory.flush(); + var packageData = openBookData.package ? openBookData.package : openBookData; _package = new Package(packageData); _spine = _package.spine; - _spine.handleLinear(true); + //_spine.handleLinear(false); if (_mediaOverlayPlayer) { _mediaOverlayPlayer.reset(); @@ -13640,9 +13789,7 @@ var ReaderView = function (options) { pageOpenRequest.setFirstPage(); openPage(pageOpenRequest, 0); } - } - }; function onMediaPlayerStatusChanged(status) { @@ -13764,6 +13911,8 @@ var ReaderView = function (options) { var spineItem = _spine.getItemById(bookMark.idref); + _navigationHistory.skipNext(); + initViewForItem(spineItem, function (isViewChanged) { if (!isViewChanged) { @@ -13781,7 +13930,7 @@ var ReaderView = function (options) { self.emit(Globals.Events.SETTINGS_APPLIED); }); - + return; } } @@ -13823,6 +13972,8 @@ var ReaderView = function (options) { var openPageRequest = new PageOpenRequest(nextSpineItem, self); openPageRequest.setFirstPage(); + _navigationHistory.skipNext(); + openPage(openPageRequest, 2); }; @@ -13860,6 +14011,8 @@ var ReaderView = function (options) { var openPageRequest = new PageOpenRequest(prevSpineItem, self); openPageRequest.setLastPage(); + _navigationHistory.skipNext(); + openPage(openPageRequest, 1); }; @@ -13943,9 +14096,64 @@ var ReaderView = function (options) { return true; }; + // this.navigationHistoryForward = function() { + // // Not implemented + // }; + this.navigationHistoryBack = function(forceLinear) { + + console.log("back nav request ..."); + + while (true) { + var bookMark = _navigationHistory.pop(); + if (bookMark && bookMark.idref) { + var spineItem = _spine.getItemById(bookMark.idref); + + if (forceLinear) { + var isLinear = _spine.isValidLinearItem(spineItem.index); + if (!isLinear) { + console.log("back nav, skipping non-linear " + bookMark.idref); + continue; + } + } + + console.log("back nav: "); + console.debug(bookMark); + + _navigationHistory.skipNext(); + + initViewForItem(spineItem, function (isViewChanged) { + + if (!isViewChanged) { + _currentView.setViewSettings(_viewerSettings); + } + + self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self); + }); + + return; + } + + console.error("no valid back history?"); + return; + } + }; + + this.navigationHistoryCanBack = function(forceLinear) { + + if (!_navigationHistory.canPop()) return false; + + if (!forceLinear) { + return true; + } + + return _navigationHistory.containsLinear(); + }; + // dir: 0 => new or same page, 1 => previous, 2 => next function openPage(pageRequest, dir) { + if (_currentView) _navigationHistory.push(_currentView.bookmarkCurrentPage()); + initViewForItem(pageRequest.spineItem, function (isViewChanged) { if (!isViewChanged) { @@ -14140,6 +14348,11 @@ var ReaderView = function (options) { return false; } } + + if (initiator && initiator instanceof MediaOverlayPlayer) + { + _navigationHistory.skipNext(); + } return self.openSpineItemElementId(spineItem.idref, elementId, initiator); }; @@ -14375,9 +14588,15 @@ var ReaderView = function (options) { if (_currentView.isReflowable && _currentView.isReflowable() && bookMark && bookMark.idref) { var spineItem = _spine.getItemById(bookMark.idref); + _navigationHistory.skipNext(); + initViewForItem(spineItem, function (isViewChanged) { + + // if (!isViewChanged) { + // _currentView.setViewSettings(_viewerSettings); + // } + self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self); - return; }); } else { diff --git a/build-output/_multiple-bundles/readium-shared-js.js.bundles.js b/build-output/_multiple-bundles/readium-shared-js.js.bundles.js index c75dadfda..b4b95472d 100644 --- a/build-output/_multiple-bundles/readium-shared-js.js.bundles.js +++ b/build-output/_multiple-bundles/readium-shared-js.js.bundles.js @@ -1 +1 @@ -require.config({bundles: {"readium-shared-js":["readium_js_plugins","readium_shared_js/globals","readium_shared_js/globalsSetup","readium_shared_js/helpers","readium_shared_js/models/bookmark_data","readium_shared_js/models/current_pages_info","readium_shared_js/models/fixed_page_spread","readium_shared_js/models/media_overlay","readium_shared_js/models/package","readium_shared_js/models/package_data","readium_shared_js/models/page_open_request","readium_shared_js/models/smil_iterator","readium_shared_js/models/smil_model","readium_shared_js/models/spine","readium_shared_js/models/spine_item","readium_shared_js/models/style","readium_shared_js/models/style_collection","readium_shared_js/models/switches","readium_shared_js/models/trigger","readium_shared_js/models/viewer_settings","readium_shared_js/views/audio_player","readium_shared_js/views/cfi_navigation_logic","readium_shared_js/views/fixed_view","readium_shared_js/views/font_loader","readium_shared_js/views/iframe_loader","readium_shared_js/views/internal_links_support","readium_shared_js/views/media_overlay_data_injector","readium_shared_js/views/media_overlay_element_highlighter","readium_shared_js/views/media_overlay_player","readium_shared_js/views/one_page_view","readium_shared_js/views/reader_view","readium_shared_js/views/reflowable_view","readium_shared_js/views/scroll_view"]}}); \ No newline at end of file +require.config({bundles: {"readium-shared-js":["readium_js_plugins","readium_shared_js/globals","readium_shared_js/globalsSetup","readium_shared_js/helpers","readium_shared_js/models/bookmark_data","readium_shared_js/models/current_pages_info","readium_shared_js/models/fixed_page_spread","readium_shared_js/models/media_overlay","readium_shared_js/models/navigation_history","readium_shared_js/models/package","readium_shared_js/models/package_data","readium_shared_js/models/page_open_request","readium_shared_js/models/smil_iterator","readium_shared_js/models/smil_model","readium_shared_js/models/spine","readium_shared_js/models/spine_item","readium_shared_js/models/style","readium_shared_js/models/style_collection","readium_shared_js/models/switches","readium_shared_js/models/trigger","readium_shared_js/models/viewer_settings","readium_shared_js/views/audio_player","readium_shared_js/views/cfi_navigation_logic","readium_shared_js/views/fixed_view","readium_shared_js/views/font_loader","readium_shared_js/views/iframe_loader","readium_shared_js/views/internal_links_support","readium_shared_js/views/media_overlay_data_injector","readium_shared_js/views/media_overlay_element_highlighter","readium_shared_js/views/media_overlay_player","readium_shared_js/views/one_page_view","readium_shared_js/views/reader_view","readium_shared_js/views/reflowable_view","readium_shared_js/views/scroll_view"]}}); \ No newline at end of file diff --git a/build-output/_multiple-bundles/readium-shared-js.js.map b/build-output/_multiple-bundles/readium-shared-js.js.map index 226a178f4..dd4907447 100644 --- a/build-output/_multiple-bundles/readium-shared-js.js.map +++ b/build-output/_multiple-bundles/readium-shared-js.js.map @@ -34,19 +34,20 @@ "../../js/models/style_collection.js", "../../js/models/switches.js", "../../js/models/trigger.js", + "../../js/models/navigation_history.js", "../../js/views/reader_view.js" ], "names": [], - "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1LA,AD2LA;AC1LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnPA,ADoPA;ACnPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxxBA,ADyxBA;ACxxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACp5BA,ADq5BA;ACp5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClOA,ADmOA;AClOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnjBA,ADojBA;ACnjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3gBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/2CA,ADg3CA;AC/2CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnlEA,ADolEA;ACnlEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxOA,ADyOA;ACxOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtvBA,ADuvBA;ACtvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvEA,ADwEA;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC35BA,AD45BA;AC35BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA", + "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1LA,AD2LA;AC1LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnPA,ADoPA;ACnPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxxBA,ADyxBA;ACxxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACp5BA,ADq5BA;ACp5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClOA,ADmOA;AClOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnjBA,ADojBA;ACnjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3gBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/2CA,ADg3CA;AC/2CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnlEA,ADolEA;ACnlEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxOA,ADyOA;ACxOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtvBA,ADuvBA;ACtvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvEA,ADwEA;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC35BA,AD45BA;AC35BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3FA,AD4FA;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA", "sourcesContent": [ "//\r\n// Created by Juan Corona\r\n// Based on original proposal by Mickaël Menu\r\n// Portions adapted from Rangy's Module system: Copyright (c) 2014 Tim Down\r\n//\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_js_plugins',[\"jquery\", \"underscore\", \"eventEmitter\"], function ($, _, EventEmitter) {\r\n\r\n var _registeredPlugins = {};\r\n\r\n /**\r\n * A plugins controller used to easily add plugins from the host app, eg.\r\n * ReadiumSDK.Plugins.register(\"footnotes\", function(api){ ... });\r\n *\r\n * @constructor\r\n */\r\n var PluginsController = function () {\r\n var self = this;\r\n\r\n\r\n this.initialize = function (reader) {\r\n var apiFactory = new PluginApiFactory(reader);\r\n\r\n if (!reader.plugins) {\r\n //attach an object to the reader that will be\r\n // used for plugin namespaces and their extensions\r\n reader.plugins = {};\r\n } else {\r\n throw new Error(\"Already initialized on reader!\");\r\n }\r\n _.each(_registeredPlugins, function (plugin) {\r\n plugin.init(apiFactory);\r\n });\r\n };\r\n\r\n this.getLoadedPlugins = function() {\r\n return _registeredPlugins;\r\n };\r\n\r\n // Creates a new instance of the given plugin constructor.\r\n this.register = function (name, optDependencies, initFunc) {\r\n\r\n if (_registeredPlugins[name]) {\r\n throw new Error(\"Duplicate registration for plugin with name: \" + name);\r\n }\r\n\r\n var dependencies;\r\n if (typeof optDependencies === 'function') {\r\n initFunc = optDependencies;\r\n } else {\r\n dependencies = optDependencies;\r\n }\r\n\r\n _registeredPlugins[name] = new Plugin(name, dependencies, function(plugin, api) {\r\n if (!plugin.initialized || !api.host.plugins[plugin.name]) {\r\n plugin.initialized = true;\r\n try {\r\n var pluginContext = {};\r\n $.extend(pluginContext, new EventEmitter());\r\n\r\n initFunc.call(pluginContext, api.instance);\r\n plugin.supported = true;\r\n\r\n api.host.plugins[plugin.name] = pluginContext;\r\n } catch (ex) {\r\n plugin.fail(ex);\r\n }\r\n }\r\n });\r\n };\r\n };\r\n\r\n function PluginApi(reader, plugin) {\r\n this.reader = reader;\r\n this.plugin = plugin;\r\n }\r\n\r\n function PluginApiFactory(reader) {\r\n this.create = function (plugin) {\r\n return {\r\n host: reader,\r\n instance: new PluginApi(reader, plugin)\r\n };\r\n };\r\n }\r\n\r\n//\r\n// The following is adapted from Rangy's Module class:\r\n//\r\n// Copyright (c) 2014 Tim Down\r\n//\r\n// The MIT License (MIT)\r\n// Permission is hereby granted, free of charge, to any person obtaining a copy\r\n// of this software and associated documentation files (the \"Software\"), to deal\r\n// in the Software without restriction, including without limitation the rights\r\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n// copies of the Software, and to permit persons to whom the Software is\r\n// furnished to do so, subject to the following conditions:\r\n//\r\n// The above copyright notice and this permission notice shall be included in all\r\n// copies or substantial portions of the Software.\r\n//\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n// SOFTWARE.\r\n\r\n function Plugin(name, dependencies, initializer) {\r\n this.name = name;\r\n this.dependencies = dependencies;\r\n this.initialized = false;\r\n this.supported = false;\r\n this.initializer = initializer;\r\n }\r\n\r\n Plugin.prototype = {\r\n init: function (apiFactory) {\r\n var requiredPluginNames = this.dependencies || [];\r\n for (var i = 0, len = requiredPluginNames.length, requiredPlugin, PluginName; i < len; ++i) {\r\n PluginName = requiredPluginNames[i];\r\n\r\n requiredPlugin = _registeredPlugins[PluginName];\r\n if (!requiredPlugin || !(requiredPlugin instanceof Plugin)) {\r\n throw new Error(\"required Plugin '\" + PluginName + \"' not found\");\r\n }\r\n\r\n requiredPlugin.init(apiFactory);\r\n\r\n if (!requiredPlugin.supported) {\r\n throw new Error(\"required Plugin '\" + PluginName + \"' not supported\");\r\n }\r\n }\r\n\r\n // Now run initializer\r\n this.initializer(this, apiFactory.create(this));\r\n },\r\n\r\n fail: function (reason) {\r\n this.initialized = true;\r\n this.supported = false;\r\n throw new Error(\"Plugin '\" + this.name + \"' failed to load: \" + reason);\r\n },\r\n\r\n warn: function (msg) {\r\n console.warn(\"Plugin \" + this.name + \": \" + msg);\r\n },\r\n\r\n deprecationNotice: function (deprecated, replacement) {\r\n console.warn(\"DEPRECATED: \" + deprecated + \" in Plugin \" + this.name + \"is deprecated. Please use \"\r\n + replacement + \" instead\");\r\n },\r\n\r\n createError: function (msg) {\r\n return new Error(\"Error in \" + this.name + \" Plugin: \" + msg);\r\n }\r\n };\r\n\r\n var instance = new PluginsController();\r\n return instance;\r\n});\r\n\n", "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/globals',['jquery','eventEmitter'], function($, EventEmitter) {\r\n/**\r\n * Top level ReadiumSDK namespace\r\n * @namespace\r\n */\r\nvar Globals = {\r\n\r\n /**\r\n * Current version of the JS SDK\r\n * @static\r\n * @return {string} version\r\n */\r\n version: function () {\r\n return \"0.8.0\";\r\n },\r\n /**\r\n * @namespace\r\n */\r\n Views: {\r\n /**\r\n * Landscape Orientation\r\n */\r\n ORIENTATION_LANDSCAPE: \"orientation_landscape\",\r\n /**\r\n * Portrait Orientation\r\n */\r\n ORIENTATION_PORTRAIT: \"orientation_portrait\"\r\n },\r\n /**\r\n * @namespace\r\n */\r\n Events: {\r\n /**\r\n * @event\r\n */\r\n READER_INITIALIZED: \"ReaderInitialized\",\r\n /**\r\n * This gets triggered on every page turnover. It includes spine information and such.\r\n * @event\r\n */\r\n PAGINATION_CHANGED: \"PaginationChanged\",\r\n /**\r\n * @event\r\n */\r\n SETTINGS_APPLIED: \"SettingsApplied\",\r\n /**\r\n * @event\r\n */\r\n FXL_VIEW_RESIZED: \"FXLViewResized\",\r\n /**\r\n * @event\r\n */\r\n READER_VIEW_CREATED: \"ReaderViewCreated\",\r\n /**\r\n * @event\r\n */\r\n READER_VIEW_DESTROYED: \"ReaderViewDestroyed\",\r\n /**\r\n * @event\r\n */\r\n CONTENT_DOCUMENT_LOAD_START: \"ContentDocumentLoadStart\",\r\n /**\r\n * @event\r\n */\r\n CONTENT_DOCUMENT_LOADED: \"ContentDocumentLoaded\",\r\n /**\r\n * @event\r\n */\r\n MEDIA_OVERLAY_STATUS_CHANGED: \"MediaOverlayStatusChanged\",\r\n /**\r\n * @event\r\n */\r\n MEDIA_OVERLAY_TTS_SPEAK: \"MediaOverlayTTSSpeak\",\r\n /**\r\n * @event\r\n */\r\n MEDIA_OVERLAY_TTS_STOP: \"MediaOverlayTTSStop\",\r\n /**\r\n * @event\r\n */\r\n PLUGINS_LOADED: \"PluginsLoaded\"\r\n },\r\n /**\r\n * Internal Events\r\n *\r\n * @desc Should not be triggered outside of {@link Views.ReaderView}.\r\n * @namespace\r\n */\r\n InternalEvents: {\r\n /**\r\n * @event\r\n */\r\n CURRENT_VIEW_PAGINATION_CHANGED: \"CurrentViewPaginationChanged\",\r\n }\r\n\r\n};\r\n$.extend(Globals, new EventEmitter());\r\n\r\nreturn Globals;\r\n\r\n});\r\n\r\n//This is default implementation of reading system object that will be available for the publication's javascript to analyze at runtime\r\n//To extend/modify/replace this object reading system should subscribe Globals.Events.READER_INITIALIZED and apply changes in reaction to this event\r\nnavigator.epubReadingSystem = {\r\n name: \"\",\r\n version: \"0.0.0\",\r\n layoutStyle: \"paginated\",\r\n\r\n hasFeature: function (feature, version) {\r\n\r\n // for now all features must be version 1.0 so fail fast if the user has asked for something else\r\n if (version && version !== \"1.0\") {\r\n return false;\r\n }\r\n\r\n if (feature === \"dom-manipulation\") {\r\n // Scripts may make structural changes to the document???s DOM (applies to spine-level scripting only).\r\n return true;\r\n }\r\n if (feature === \"layout-changes\") {\r\n // Scripts may modify attributes and CSS styles that affect content layout (applies to spine-level scripting only).\r\n return true;\r\n }\r\n if (feature === \"touch-events\") {\r\n // The device supports touch events and the Reading System passes touch events to the content.\r\n return false;\r\n }\r\n if (feature === \"mouse-events\") {\r\n // The device supports mouse events and the Reading System passes mouse events to the content.\r\n return true;\r\n }\r\n if (feature === \"keyboard-events\") {\r\n // The device supports keyboard events and the Reading System passes keyboard events to the content.\r\n return true;\r\n }\r\n\r\n if (feature === \"spine-scripting\") {\r\n //Spine-level scripting is supported.\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n};\n", "// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n\r\n//'text!empty:'\r\ndefine('readium_shared_js/globalsSetup',['jquery', 'console_shim', 'eventEmitter', 'URIjs', 'readium_cfi_js', 'readium_js_plugins', './globals'], function ($, console_shim, EventEmitter, URI, epubCfi, PluginsController, Globals) {\r\n\r\n console.log(\"Globals...\");\r\n\r\n if (window[\"ReadiumSDK\"]) {\r\n console.log(\"ReadiumSDK extend.\");\r\n $.extend(Globals, window.ReadiumSDK);\r\n } else {\r\n console.log(\"ReadiumSDK set.\");\r\n }\r\n\r\n window.ReadiumSDK = Globals;\r\n\r\n // TODO: refactor client code to use emit instead of trigger?\r\n EventEmitter.prototype.trigger = EventEmitter.prototype.emit;\r\n\r\n // TODO pass as dependency injection define() function parameter, not window global!\r\n window.EventEmitter = EventEmitter;\r\n\r\n // TODO pass as dependency injection define() function parameter, not window global!\r\n window.URI = URI;\r\n\r\n // window.URL accessor to window.webkitURL (Safari 6 support)\r\n if ('URL' in window === false) {\r\n if ('webkitURL' in window === false) {\r\n throw Error('Browser does not support window.URL');\r\n }\r\n\r\n window.URL = window.webkitURL;\r\n }\r\n // Plugins bootstrapping begins\r\n Globals.Plugins = PluginsController;\r\n Globals.on(Globals.Events.READER_INITIALIZED, function(reader) {\r\n try {\r\n PluginsController.initialize(reader);\r\n } catch (ex) {\r\n console.error(\"Plugins failed to initialize:\", ex);\r\n }\r\n\r\n _.defer(function() {\r\n console.log(\"Plugins loaded.\");\r\n Globals.emit(Globals.Events.PLUGINS_LOADED, reader);\r\n });\r\n });\r\n\r\n if (window._RJS_isBrowser) {\r\n // If under a browser env and using RequireJS, dynamically require all plugins\r\n var pluginsList = window._RJS_pluginsList;\r\n console.log(\"Plugins included: \", pluginsList.map(function(v) {\r\n // To stay consistent with bundled output\r\n return v.replace('readium_plugin_', '');\r\n }));\r\n\r\n require(pluginsList);\r\n } else {\r\n // Else list which plugins were included when using almond and bundle(s)\r\n setTimeout(function() {\r\n // Assume that in the next callback all the plugins have been registered\r\n var pluginsList = Object.keys(PluginsController.getLoadedPlugins());\r\n console.log(\"Plugins included: \", pluginsList);\r\n }, 0);\r\n }\r\n // Plugins bootstrapping ends\r\n});\r\n\ndefine('readium_shared_js', ['readium_shared_js/globalsSetup'], function (main) { return main; });\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/bookmark_data',[],function() {\r\n/**\r\n * @class Models.BookmarkData\r\n */\r\nvar BookmarkData = function(idref, contentCFI) {\r\n\r\n /**\r\n * spine item idref\r\n * @property idref\r\n * @type {string}\r\n */\r\n this.idref = idref;\r\n\r\n /**\r\n * cfi of the first visible element\r\n * @property contentCFI\r\n * @type {string}\r\n */\r\n this.contentCFI = contentCFI;\r\n\r\n this.toString = function () {\r\n return JSON.stringify(this);\r\n }\r\n};\r\n\r\nreturn BookmarkData;\r\n});\n", - "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/current_pages_info',[],function() {\r\n\r\n/**\r\n * Used to report pagination state back to the host application\r\n *\r\n * @class Models.CurrentPagesInfo\r\n *\r\n * @constructor\r\n *\r\n * @param {Models.Spine} spine\r\n * @param {boolean} isFixedLayout is fixed or reflowable spine item\r\n*/\r\nvar CurrentPagesInfo = function(spine, isFixedLayout) {\r\n\r\n\r\n this.isRightToLeft = spine.isRightToLeft();\r\n this.isFixedLayout = isFixedLayout;\r\n this.spineItemCount = spine.items.length\r\n this.openPages = [];\r\n\r\n this.addOpenPage = function(spineItemPageIndex, spineItemPageCount, idref, spineItemIndex) {\r\n this.openPages.push({spineItemPageIndex: spineItemPageIndex, spineItemPageCount: spineItemPageCount, idref: idref, spineItemIndex: spineItemIndex});\r\n\r\n this.sort();\r\n };\r\n\r\n this.canGoLeft = function () {\r\n return this.isRightToLeft ? this.canGoNext() : this.canGoPrev();\r\n };\r\n\r\n this.canGoRight = function () {\r\n return this.isRightToLeft ? this.canGoPrev() : this.canGoNext();\r\n };\r\n\r\n this.canGoNext = function() {\r\n\r\n if(this.openPages.length == 0)\r\n return false;\r\n\r\n var lastOpenPage = this.openPages[this.openPages.length - 1];\r\n\r\n // TODO: handling of non-linear spine items (\"ancillary\" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs \"go back\" feature to navigate to source hyperlink location that led to the non-linear document.\r\n // See https://github.com/readium/readium-shared-js/issues/26\r\n\r\n // Removed, needs to be implemented properly as per above.\r\n // See https://github.com/readium/readium-shared-js/issues/108\r\n // if(!spine.isValidLinearItem(lastOpenPage.spineItemIndex))\r\n // return false;\r\n\r\n return lastOpenPage.spineItemIndex < spine.last().index || lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1;\r\n };\r\n\r\n this.canGoPrev = function() {\r\n\r\n if(this.openPages.length == 0)\r\n return false;\r\n\r\n var firstOpenPage = this.openPages[0];\r\n\r\n // TODO: handling of non-linear spine items (\"ancillary\" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs \"go back\" feature to navigate to source hyperlink location that led to the non-linear document.\r\n // See https://github.com/readium/readium-shared-js/issues/26\r\n\r\n // Removed, needs to be implemented properly as per above.\r\n // //https://github.com/readium/readium-shared-js/issues/108\r\n // if(!spine.isValidLinearItem(firstOpenPage.spineItemIndex))\r\n // return false;\r\n\r\n return spine.first().index < firstOpenPage.spineItemIndex || 0 < firstOpenPage.spineItemPageIndex;\r\n };\r\n\r\n this.sort = function() {\r\n\r\n this.openPages.sort(function(a, b) {\r\n\r\n if(a.spineItemIndex != b.spineItemIndex) {\r\n return a.spineItemIndex - b.spineItemIndex;\r\n }\r\n\r\n return a.pageIndex - b.pageIndex;\r\n\r\n });\r\n\r\n };\r\n\r\n};\r\n\r\nreturn CurrentPagesInfo;\r\n});\n", + "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/current_pages_info',[],function() {\r\n\r\n/**\r\n * Used to report pagination state back to the host application\r\n *\r\n * @class Models.CurrentPagesInfo\r\n *\r\n * @constructor\r\n *\r\n * @param {Models.Spine} spine\r\n * @param {boolean} isFixedLayout is fixed or reflowable spine item\r\n*/\r\nvar CurrentPagesInfo = function(spine, isFixedLayout) {\r\n\r\n\r\n this.isRightToLeft = spine.isRightToLeft();\r\n this.isFixedLayout = isFixedLayout;\r\n this.spineItemCount = spine.items.length\r\n this.openPages = [];\r\n\r\n this.addOpenPage = function(spineItemPageIndex, spineItemPageCount, idref, spineItemIndex) {\r\n this.openPages.push({spineItemPageIndex: spineItemPageIndex, spineItemPageCount: spineItemPageCount, idref: idref, spineItemIndex: spineItemIndex});\r\n\r\n this.sort();\r\n };\r\n\r\n this.canGoLeft = function () {\r\n return this.isRightToLeft ? this.canGoNext() : this.canGoPrev();\r\n };\r\n\r\n this.canGoRight = function () {\r\n return this.isRightToLeft ? this.canGoPrev() : this.canGoNext();\r\n };\r\n\r\n this.canGoNext = function() {\r\n\r\n if(this.openPages.length == 0)\r\n return false;\r\n\r\n var lastOpenPage = this.openPages[this.openPages.length - 1];\r\n\r\n if(spine.isValidLinearItem(lastOpenPage.spineItemIndex))\r\n return lastOpenPage.spineItemIndex < spine.last().index || lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1;\r\n else\r\n return lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1;\r\n \r\n };\r\n\r\n this.canGoPrev = function() {\r\n\r\n if(this.openPages.length == 0)\r\n return false;\r\n\r\n var firstOpenPage = this.openPages[0];\r\n\r\n if(spine.isValidLinearItem(firstOpenPage.spineItemIndex))\r\n return spine.first().index < firstOpenPage.spineItemIndex || 0 < firstOpenPage.spineItemPageIndex;\r\n else\r\n return 0 < firstOpenPage.spineItemPageIndex;\r\n };\r\n\r\n this.sort = function() {\r\n\r\n this.openPages.sort(function(a, b) {\r\n\r\n if(a.spineItemIndex != b.spineItemIndex) {\r\n return a.spineItemIndex - b.spineItemIndex;\r\n }\r\n\r\n return a.pageIndex - b.pageIndex;\r\n\r\n });\r\n\r\n };\r\n\r\n};\r\n\r\nreturn CurrentPagesInfo;\r\n});\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/fixed_page_spread',[],function() {\r\n/**\r\n *\r\n * @param {Models.Spine} spine\r\n * @constructor\r\n */\r\nvar Spread = function(spine, isSyntheticSpread) {\r\n\r\n var self = this;\r\n\r\n this.spine = spine;\r\n\r\n this.leftItem = undefined;\r\n this.rightItem = undefined;\r\n this.centerItem = undefined;\r\n\r\n var _isSyntheticSpread = isSyntheticSpread;\r\n\r\n this.setSyntheticSpread = function(isSyntheticSpread) {\r\n _isSyntheticSpread = isSyntheticSpread;\r\n };\r\n\r\n this.isSyntheticSpread = function() {\r\n return _isSyntheticSpread;\r\n };\r\n\r\n this.openFirst = function() {\r\n\r\n if( this.spine.items.length == 0 ) {\r\n resetItems();\r\n }\r\n else {\r\n this.openItem(this.spine.first());\r\n }\r\n };\r\n\r\n this.openLast = function() {\r\n\r\n if( this.spine.items.length == 0 ) {\r\n resetItems();\r\n }\r\n else {\r\n this.openItem(this.spine.last());\r\n }\r\n };\r\n\r\n this.openItem = function(item) {\r\n\r\n resetItems();\r\n\r\n var position = getItemPosition(item);\r\n setItemToPosition(item, position);\r\n\r\n if(position != Spread.POSITION_CENTER && this.spine.isValidLinearItem(item.index)) { // && item.isRenditionSpreadAllowed() not necessary, see getItemPosition() below\r\n var neighbour = getNeighbourItem(item);\r\n if(neighbour) {\r\n var neighbourPos = getItemPosition(neighbour);\r\n if(neighbourPos != position\r\n && neighbourPos != Spread.POSITION_CENTER\r\n && !neighbour.isReflowable()\r\n && neighbour.isRenditionSpreadAllowed()) {\r\n setItemToPosition(neighbour, neighbourPos);\r\n }\r\n }\r\n }\r\n };\r\n\r\n function resetItems() {\r\n\r\n self.leftItem = undefined;\r\n self.rightItem = undefined;\r\n self.centerItem = undefined;\r\n }\r\n\r\n function setItemToPosition(item, position) {\r\n\r\n if(position == Spread.POSITION_LEFT) {\r\n self.leftItem = item;\r\n }\r\n else if (position == Spread.POSITION_RIGHT) {\r\n self.rightItem = item;\r\n }\r\n else {\r\n\r\n if(position != Spread.POSITION_CENTER) {\r\n console.error(\"Unrecognized position value\");\r\n }\r\n\r\n self.centerItem = item;\r\n }\r\n }\r\n\r\n function getItemPosition(item) {\r\n \r\n // includes !item.isRenditionSpreadAllowed() (\"rendition:spread-none\") ==> force center position\r\n if(!_isSyntheticSpread) {\r\n return Spread.POSITION_CENTER;\r\n }\r\n\r\n if(item.isLeftPage()) {\r\n return Spread.POSITION_LEFT;\r\n }\r\n\r\n if (item.isRightPage()) {\r\n return Spread.POSITION_RIGHT;\r\n }\r\n\r\n return Spread.POSITION_CENTER;\r\n }\r\n\r\n this.openNext = function() {\r\n\r\n var items = this.validItems();\r\n\r\n if(items.length == 0) {\r\n\r\n this.openFirst();\r\n }\r\n else {\r\n\r\n var nextItem = this.spine.nextItem(items[items.length - 1]);\r\n if(nextItem) {\r\n\r\n this.openItem(nextItem);\r\n }\r\n }\r\n };\r\n\r\n this.openPrev = function() {\r\n\r\n var items = this.validItems();\r\n\r\n if(items.length == 0) {\r\n this.openLast();\r\n }\r\n else {\r\n\r\n var prevItem = this.spine.prevItem(items[0]);\r\n if(prevItem) {\r\n\r\n this.openItem(prevItem);\r\n\r\n }\r\n }\r\n };\r\n\r\n this.validItems = function() {\r\n\r\n var arr = [];\r\n\r\n if(this.leftItem) arr.push(this.leftItem);\r\n if(this.rightItem) arr.push(this.rightItem);\r\n if(this.centerItem) arr.push(this.centerItem);\r\n\r\n arr.sort(function(a, b) {\r\n return a.index - b.index;\r\n });\r\n\r\n return arr;\r\n };\r\n\r\n function getNeighbourItem(item) {\r\n\r\n if(item.isLeftPage()) {\r\n return self.spine.isRightToLeft() ? self.spine.prevItem(item) : self.spine.nextItem(item);\r\n }\r\n\r\n if(item.isRightPage()) {\r\n return self.spine.isRightToLeft() ? self.spine.nextItem(item) : self.spine.prevItem(item);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n};\r\n\r\nSpread.POSITION_LEFT = \"left\";\r\nSpread.POSITION_RIGHT = \"right\";\r\nSpread.POSITION_CENTER = \"center\";\r\n\r\nreturn Spread;\r\n});\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/spine_item',[], function() {\r\n\r\n/**\r\n * Wrapper of the SpineItem object received from the host application\r\n *\r\n * @class Models.SpineItem\r\n *\r\n * @param itemData spine item properties container\r\n * @param {Number} index\r\n * @param {Models.Spine} spine\r\n *\r\n */\r\nvar SpineItem = function(itemData, index, spine){\r\n\r\n var self = this;\r\n\r\n this.idref = itemData.idref;\r\n this.href = itemData.href;\r\n\r\n this.linear = itemData.linear ? itemData.linear.toLowerCase() : itemData.linear;\r\n\r\n this.page_spread = itemData.page_spread;\r\n \r\n this.rendition_viewport = itemData.rendition_viewport;\r\n \r\n this.rendition_spread = itemData.rendition_spread;\r\n \r\n //TODO: unused yet!\r\n this.rendition_orientation = itemData.rendition_orientation;\r\n\r\n this.rendition_layout = itemData.rendition_layout;\r\n \r\n this.rendition_flow = itemData.rendition_flow;\r\n \r\n \r\n \r\n this.media_overlay_id = itemData.media_overlay_id;\r\n\r\n this.media_type = itemData.media_type;\r\n\r\n this.index = index;\r\n this.spine = spine;\r\n\r\n validateSpread();\r\n\r\n this.setSpread = function(spread) {\r\n this.page_spread = spread;\r\n\r\n validateSpread();\r\n };\r\n\r\n this.isRenditionSpreadAllowed = function() {\r\n \r\n var rendition_spread = self.getRenditionSpread();\r\n return !rendition_spread || rendition_spread != SpineItem.RENDITION_SPREAD_NONE;\r\n };\r\n\r\n function validateSpread() {\r\n\r\n if(!self.page_spread) {\r\n return;\r\n }\r\n\r\n if( self.page_spread != SpineItem.SPREAD_LEFT &&\r\n self.page_spread != SpineItem.SPREAD_RIGHT &&\r\n self.page_spread != SpineItem.SPREAD_CENTER ) {\r\n\r\n console.error(self.page_spread + \" is not a recognized spread type\");\r\n }\r\n\r\n }\r\n\r\n this.isLeftPage = function() {\r\n return self.page_spread == SpineItem.SPREAD_LEFT;\r\n };\r\n\r\n this.isRightPage = function() {\r\n return self.page_spread == SpineItem.SPREAD_RIGHT;\r\n };\r\n\r\n this.isCenterPage = function() {\r\n return self.page_spread == SpineItem.SPREAD_CENTER;\r\n };\r\n\r\n this.isReflowable = function() {\r\n return !self.isFixedLayout();\r\n };\r\n\r\n this.isFixedLayout = function() {\r\n \r\n // cannot use isPropertyValueSetForItemOrPackage() here!\r\n\r\n var isLayoutExplicitlyDefined = self.getRenditionLayout();\r\n\r\n if(isLayoutExplicitlyDefined) {\r\n\r\n if (self.rendition_layout)\r\n {\r\n if (self.rendition_layout === SpineItem.RENDITION_LAYOUT_PREPAGINATED) return true;\r\n if (self.rendition_layout === SpineItem.RENDITION_LAYOUT_REFLOWABLE) return false;\r\n }\r\n\r\n return self.spine.package.isFixedLayout();\r\n }\r\n\r\n // if image or svg use fixed layout\r\n return self.media_type.indexOf(\"image/\") >= 0;\r\n\r\n };\r\n\r\n this.getRenditionFlow = function() {\r\n\r\n if(self.rendition_flow) {\r\n return self.rendition_flow;\r\n }\r\n\r\n return self.spine.package.rendition_flow;\r\n };\r\n \r\n this.getRenditionViewport = function() {\r\n\r\n if(self.rendition_viewport) {\r\n return self.rendition_viewport;\r\n }\r\n\r\n return self.spine.package.rendition_viewport;\r\n };\r\n\r\n this.getRenditionSpread = function() {\r\n\r\n if(self.rendition_spread) {\r\n return self.rendition_spread;\r\n }\r\n\r\n return self.spine.package.rendition_spread;\r\n };\r\n\r\n this.getRenditionOrientation = function() {\r\n\r\n if(self.rendition_orientation) {\r\n return self.rendition_orientation;\r\n }\r\n\r\n return self.spine.package.rendition_orientation;\r\n };\r\n\r\n this.getRenditionLayout = function() {\r\n\r\n if(self.rendition_layout) {\r\n return self.rendition_layout;\r\n }\r\n\r\n return self.spine.package.rendition_layout;\r\n };\r\n\r\n function isPropertyValueSetForItemOrPackage(propName, propValue) {\r\n\r\n if(self[propName]) {\r\n return self[propName] === propValue;\r\n }\r\n\r\n if(self.spine.package[propName]) {\r\n return self.spine.package[propName] === propValue;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n this.isFlowScrolledContinuous = function() {\r\n\r\n return isPropertyValueSetForItemOrPackage(\"rendition_flow\", SpineItem.RENDITION_FLOW_SCROLLED_CONTINUOUS);\r\n };\r\n\r\n this.isFlowScrolledDoc = function() {\r\n\r\n return isPropertyValueSetForItemOrPackage(\"rendition_flow\", SpineItem.RENDITION_FLOW_SCROLLED_DOC);\r\n };\r\n};\r\n\r\nSpineItem.RENDITION_LAYOUT_REFLOWABLE = \"reflowable\";\r\nSpineItem.RENDITION_LAYOUT_PREPAGINATED = \"pre-paginated\";\r\n\r\nSpineItem.RENDITION_ORIENTATION_LANDSCAPE = \"landscape\";\r\nSpineItem.RENDITION_ORIENTATION_PORTRAIT = \"portrait\";\r\nSpineItem.RENDITION_ORIENTATION_AUTO = \"auto\";\r\n\r\nSpineItem.SPREAD_LEFT = \"page-spread-left\";\r\nSpineItem.SPREAD_RIGHT = \"page-spread-right\";\r\nSpineItem.SPREAD_CENTER = \"page-spread-center\";\r\n\r\nSpineItem.RENDITION_SPREAD_NONE = \"none\";\r\nSpineItem.RENDITION_SPREAD_LANDSCAPE = \"landscape\";\r\nSpineItem.RENDITION_SPREAD_PORTRAIT = \"portrait\";\r\nSpineItem.RENDITION_SPREAD_BOTH = \"both\";\r\nSpineItem.RENDITION_SPREAD_AUTO = \"auto\";\r\n\r\nSpineItem.RENDITION_FLOW_PAGINATED = \"paginated\";\r\nSpineItem.RENDITION_FLOW_SCROLLED_CONTINUOUS = \"scrolled-continuous\";\r\nSpineItem.RENDITION_FLOW_SCROLLED_DOC = \"scrolled-doc\";\r\nSpineItem.RENDITION_FLOW_AUTO = \"auto\";\r\n\r\nSpineItem.alternateSpread = function(spread) {\r\n\r\n if(spread === SpineItem.SPREAD_LEFT) {\r\n return SpineItem.SPREAD_RIGHT;\r\n }\r\n\r\n if(spread === SpineItem.SPREAD_RIGHT) {\r\n return SpineItem.SPREAD_LEFT;\r\n }\r\n\r\n return spread;\r\n\r\n};\r\n return SpineItem;\r\n});\r\n\r\n\r\n\n", - "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\ndefine('readium_shared_js/helpers',['underscore', \"jquery\", \"jquerySizes\", \"./models/spine_item\", \"./globals\"], function(_, $, JQuerySizes, SpineItem, Globals) {\r\n\r\nvar Helpers = {};\r\n\r\n/**\r\n *\r\n * @param ebookURL URL string, or Blob (possibly File)\r\n * @returns string representing the file path / name from which the asset referenced by this URL originates\r\n */\r\nHelpers.getEbookUrlFilePath = function(ebookURL) {\r\n \r\n if (!window.Blob || !window.File) return ebookURL;\r\n \r\n var ebookURL_filepath = (ebookURL instanceof Blob) ? ((ebookURL instanceof File) ? ebookURL.name : \"readium-ebook.epub\") : ebookURL;\r\n return ebookURL_filepath;\r\n};\r\n\r\n/**\r\n *\r\n * @returns object (map between URL query parameter names and corresponding decoded / unescaped values)\r\n */\r\nHelpers.getURLQueryParams = function() {\r\n var params = {};\r\n\r\n var query = window.location.search;\r\n if (query && query.length) {\r\n query = query.substring(1);\r\n var keyParams = query.split('&');\r\n for (var x = 0; x < keyParams.length; x++)\r\n {\r\n var keyVal = keyParams[x].split('=');\r\n if (keyVal.length > 1) {\r\n params[keyVal[0]] = decodeURIComponent(keyVal[1]);\r\n }\r\n }\r\n }\r\n\r\n return params;\r\n};\r\n\r\n\r\n/**\r\n *\r\n * @param left\r\n * @param top\r\n * @param width\r\n * @param height\r\n * @constructor\r\n */\r\nHelpers.Rect = function (left, top, width, height) {\r\n\r\n this.left = left;\r\n this.top = top;\r\n this.width = width;\r\n this.height = height;\r\n\r\n this.right = function () {\r\n return this.left + this.width;\r\n };\r\n\r\n this.bottom = function () {\r\n return this.top + this.height;\r\n };\r\n\r\n this.isOverlap = function (rect, tolerance) {\r\n\r\n if (tolerance == undefined) {\r\n tolerance = 0;\r\n }\r\n\r\n return !(rect.right() < this.left + tolerance ||\r\n rect.left > this.right() - tolerance ||\r\n rect.bottom() < this.top + tolerance ||\r\n rect.top > this.bottom() - tolerance);\r\n }\r\n};\r\n\r\n/**\r\n *\r\n * @param $element\r\n * @returns {Helpers.Rect}\r\n */\r\n//This method treats multicolumn view as one long column and finds the rectangle of the element in this \"long\" column\r\n//we are not using jQuery Offset() and width()/height() function because for multicolumn rendition_layout it produces rectangle as a bounding box of element that\r\n// reflows between columns this is inconstant and difficult to analyze .\r\nHelpers.Rect.fromElement = function ($element) {\r\n\r\n var e;\r\n if (_.isArray($element) || $element instanceof jQuery)\r\n e = $element[0];\r\n else\r\n e = $element;\r\n // TODODM this is somewhat hacky. Text (range?) elements don't have a position so we have to ask the parent.\r\n if (e.nodeType === 3) {\r\n e = $element.parent()[0];\r\n }\r\n\r\n\r\n var offsetLeft = e.offsetLeft;\r\n var offsetTop = e.offsetTop;\r\n var offsetWidth = e.offsetWidth;\r\n var offsetHeight = e.offsetHeight;\r\n\r\n while (e = e.offsetParent) {\r\n offsetLeft += e.offsetLeft;\r\n offsetTop += e.offsetTop;\r\n }\r\n\r\n return new Helpers.Rect(offsetLeft, offsetTop, offsetWidth, offsetHeight);\r\n};\r\n\r\nHelpers.UpdateHtmlFontSize = function ($epubHtml, fontSize) {\r\n\r\n\r\n var factor = fontSize / 100;\r\n var win = $epubHtml[0].ownerDocument.defaultView;\r\n var $textblocks = $('p, div, span, h1, h2, h3, h4, h5, h6, li, blockquote, td, pre', $epubHtml);\r\n var originalLineHeight;\r\n\r\n\r\n // need to do two passes because it is possible to have nested text blocks.\r\n // If you change the font size of the parent this will then create an inaccurate\r\n // font size for any children.\r\n for (var i = 0; i < $textblocks.length; i++) {\r\n var ele = $textblocks[i],\r\n fontSizeAttr = ele.getAttribute('data-original-font-size');\r\n\r\n if (!fontSizeAttr) {\r\n var style = win.getComputedStyle(ele);\r\n var originalFontSize = parseInt(style.fontSize);\r\n originalLineHeight = parseInt(style.lineHeight);\r\n\r\n ele.setAttribute('data-original-font-size', originalFontSize);\r\n // getComputedStyle will not calculate the line-height if the value is 'normal'. In this case parseInt will return NaN\r\n if (originalLineHeight) {\r\n ele.setAttribute('data-original-line-height', originalLineHeight);\r\n }\r\n }\r\n }\r\n\r\n // reset variable so the below logic works. All variables in JS are function scoped.\r\n originalLineHeight = 0;\r\n for (var i = 0; i < $textblocks.length; i++) {\r\n var ele = $textblocks[i],\r\n fontSizeAttr = ele.getAttribute('data-original-font-size'),\r\n lineHeightAttr = ele.getAttribute('data-original-line-height'),\r\n originalFontSize = Number(fontSizeAttr);\r\n\r\n if (lineHeightAttr) {\r\n originalLineHeight = Number(lineHeightAttr);\r\n }\r\n else {\r\n originalLineHeight = 0;\r\n }\r\n\r\n ele.style.fontSize = (originalFontSize * factor) + 'px';\r\n if (originalLineHeight) {\r\n ele.style.lineHeight = (originalLineHeight * factor) + 'px';\r\n }\r\n\r\n }\r\n $epubHtml.css(\"font-size\", fontSize + \"%\");\r\n};\r\n\r\n\r\n/**\r\n *\r\n * @param contentRef\r\n * @param sourceFileHref\r\n * @returns {string}\r\n * @constructor\r\n */\r\nHelpers.ResolveContentRef = function (contentRef, sourceFileHref) {\r\n\r\n if (!sourceFileHref) {\r\n return contentRef;\r\n }\r\n\r\n var sourceParts = sourceFileHref.split(\"/\");\r\n sourceParts.pop(); //remove source file name\r\n\r\n var pathComponents = contentRef.split(\"/\");\r\n\r\n while (sourceParts.length > 0 && pathComponents[0] === \"..\") {\r\n\r\n sourceParts.pop();\r\n pathComponents.splice(0, 1);\r\n }\r\n\r\n var combined = sourceParts.concat(pathComponents);\r\n\r\n return combined.join(\"/\");\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param str\r\n * @param suffix\r\n * @returns {boolean}\r\n * @static\r\n */\r\nHelpers.EndsWith = function (str, suffix) {\r\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\r\n};\r\n\r\n/**\r\n *\r\n * @param str\r\n * @param suffix\r\n * @returns {boolean}\r\n * @static\r\n */\r\nHelpers.BeginsWith = function (str, suffix) {\r\n\r\n return str.indexOf(suffix) === 0;\r\n};\r\n\r\n/**\r\n *\r\n * @param str\r\n * @param toRemove\r\n * @returns {string}\r\n * @static\r\n */\r\nHelpers.RemoveFromString = function (str, toRemove) {\r\n\r\n var startIx = str.indexOf(toRemove);\r\n\r\n if (startIx == -1) {\r\n return str;\r\n }\r\n\r\n return str.substring(0, startIx) + str.substring(startIx + toRemove.length);\r\n};\r\n\r\n/**\r\n *\r\n * @param margin\r\n * @param border\r\n * @param padding\r\n * @constructor\r\n */\r\nHelpers.Margins = function (margin, border, padding) {\r\n\r\n this.margin = margin;\r\n this.border = border;\r\n this.padding = padding;\r\n\r\n this.left = this.margin.left + this.border.left + this.padding.left;\r\n this.right = this.margin.right + this.border.right + this.padding.right;\r\n this.top = this.margin.top + this.border.top + this.padding.top;\r\n this.bottom = this.margin.bottom + this.border.bottom + this.padding.bottom;\r\n\r\n this.width = function () {\r\n return this.left + this.right;\r\n };\r\n\r\n this.height = function () {\r\n return this.top + this.bottom;\r\n }\r\n};\r\n\r\n/**\r\n *\r\n * @param $iframe\r\n */\r\nHelpers.triggerLayout = function ($iframe) {\r\n\r\n var doc = $iframe[0].contentDocument;\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n var ss = undefined;\r\n try {\r\n ss = doc.styleSheets && doc.styleSheets.length ? doc.styleSheets[0] : undefined;\r\n if (!ss) {\r\n var style = doc.createElement('style');\r\n doc.head.appendChild(style);\r\n style.appendChild(doc.createTextNode(''));\r\n ss = style.sheet;\r\n }\r\n\r\n if (ss) {\r\n var cssRule = 'body:first-child::before {content:\\'READIUM\\';color: red;font-weight: bold;}';\r\n if (ss.cssRules) {\r\n ss.insertRule(cssRule, ss.cssRules.length);\r\n } else {\r\n ss.insertRule(cssRule, 0);\r\n }\r\n }\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n }\r\n\r\n try {\r\n var el = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"style\");\r\n el.appendChild(doc.createTextNode(\"*{}\"));\r\n doc.body.appendChild(el);\r\n doc.body.removeChild(el);\r\n\r\n if (ss) {\r\n if (ss.cssRules) {\r\n ss.deleteRule(ss.cssRules.length - 1);\r\n } else {\r\n ss.deleteRule(0);\r\n }\r\n }\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n }\r\n\r\n if (doc.body) {\r\n var val = doc.body.offsetTop; // triggers layout\r\n }\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param $viewport\r\n * @param spineItem\r\n * @param settings\r\n * @returns {boolean}\r\n */\r\n//Based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 doc\r\n// Returns falsy and truthy\r\n// true and false mean that the synthetic-spread or single-page is \"forced\" (to be respected whatever the external conditions)\r\n// 1 and 0 mean that the synthetic-spread or single-page is \"not forced\" (is allowed to be overriden by external conditions, such as optimum column width / text line number of characters, etc.)\r\nHelpers.deduceSyntheticSpread = function ($viewport, spineItem, settings) {\r\n\r\n if (!$viewport || $viewport.length == 0) {\r\n return 0; // non-forced\r\n }\r\n\r\n //http://www.idpf.org/epub/fxl/#property-spread-values\r\n\r\n var rendition_spread = spineItem ? spineItem.getRenditionSpread() : undefined;\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_NONE) {\r\n return false; // forced\r\n\r\n //\"Reading Systems must not incorporate this spine item in a synthetic spread.\"\r\n }\r\n\r\n if (settings.syntheticSpread == \"double\") {\r\n return true; // forced\r\n }\r\n else if (settings.syntheticSpread == \"single\") {\r\n return false; // forced\r\n }\r\n\r\n if (!spineItem) {\r\n return 0; // non-forced\r\n }\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_BOTH) {\r\n return true; // forced\r\n\r\n //\"Reading Systems should incorporate this spine item in a synthetic spread regardless of device orientation.\"\r\n }\r\n\r\n var orientation = Helpers.getOrientation($viewport);\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_LANDSCAPE) {\r\n return orientation === Globals.Views.ORIENTATION_LANDSCAPE; // forced\r\n\r\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in landscape orientation.\"\r\n }\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_PORTRAIT) {\r\n return orientation === Globals.Views.ORIENTATION_PORTRAIT; // forced\r\n\r\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in portrait orientation.\"\r\n }\r\n\r\n if (!rendition_spread || rendition_spread === SpineItem.RENDITION_SPREAD_AUTO) {\r\n // if no spread set in document and user didn't set in in setting we will do double for landscape\r\n var landscape = orientation === Globals.Views.ORIENTATION_LANDSCAPE;\r\n return landscape ? 1 : 0; // non-forced\r\n\r\n //\"Reading Systems may use synthetic spreads in specific or all device orientations as part of a display area utilization optimization process.\"\r\n }\r\n\r\n console.warn(\"Helpers.deduceSyntheticSpread: spread properties?!\");\r\n return 0; // non-forced\r\n};\r\n\r\n/**\r\n *\r\n * @param $element\r\n * @returns {Helpers.Rect}\r\n */\r\nHelpers.Margins.fromElement = function ($element) {\r\n return new this($element.margin(), $element.border(), $element.padding());\r\n};\r\n\r\n/**\r\n * @returns {Helpers.Rect}\r\n */\r\nHelpers.Margins.empty = function () {\r\n\r\n return new this({left: 0, right: 0, top: 0, bottom: 0}, {left: 0, right: 0, top: 0, bottom: 0}, {\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n bottom: 0\r\n });\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param name\r\n * @param params\r\n * @returns {Helpers.loadTemplate.cache}\r\n */\r\nHelpers.loadTemplate = function (name, params) {\r\n return Helpers.loadTemplate.cache[name];\r\n};\r\n\r\n/**\r\n *\r\n * @type {{fixed_book_frame: string, single_page_frame: string, scrolled_book_frame: string, reflowable_book_frame: string, reflowable_book_page_frame: string}}\r\n */\r\nHelpers.loadTemplate.cache = {\r\n \"fixed_book_frame\": '
',\r\n\r\n \"single_page_frame\": '
',\r\n //\"single_page_frame\" : '
',\r\n\r\n \"scrolled_book_frame\": '
',\r\n \"reflowable_book_frame\": '
',\r\n \"reflowable_book_page_frame\": '
'\r\n};\r\n\r\n/**\r\n *\r\n * @param styles\r\n * @param $element\r\n */\r\nHelpers.setStyles = function (styles, $element) {\r\n\r\n var count = styles.length;\r\n\r\n if (!count) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < count; i++) {\r\n var style = styles[i];\r\n if (style.selector) {\r\n $(style.selector, $element).css(style.declarations);\r\n }\r\n else {\r\n $element.css(style.declarations);\r\n }\r\n }\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param iframe\r\n * @returns {boolean}\r\n */\r\nHelpers.isIframeAlive = function (iframe) {\r\n var w = undefined;\r\n var d = undefined;\r\n try {\r\n w = iframe.contentWindow;\r\n d = iframe.contentDocument;\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n return false;\r\n }\r\n\r\n return w && d;\r\n};\r\n\r\n/**\r\n *\r\n * @param $viewport\r\n * @returns {Globals.Views.ORIENTATION_LANDSCAPE|Globals.Views.ORIENTATION_PORTRAIT}\r\n */\r\nHelpers.getOrientation = function ($viewport) {\r\n\r\n var viewportWidth = $viewport.width();\r\n var viewportHeight = $viewport.height();\r\n\r\n if (!viewportWidth || !viewportHeight) {\r\n return undefined;\r\n }\r\n\r\n return viewportWidth >= viewportHeight ? Globals.Views.ORIENTATION_LANDSCAPE : Globals.Views.ORIENTATION_PORTRAIT;\r\n};\r\n\r\n/**\r\n *\r\n * @param item\r\n * @param orientation\r\n * @returns {boolean}\r\n */\r\nHelpers.isRenditionSpreadPermittedForItem = function (item, orientation) {\r\n\r\n var rendition_spread = item.getRenditionSpread();\r\n\r\n return !rendition_spread\r\n || rendition_spread == SpineItem.RENDITION_SPREAD_BOTH\r\n || rendition_spread == SpineItem.RENDITION_SPREAD_AUTO\r\n || (rendition_spread == SpineItem.RENDITION_SPREAD_LANDSCAPE\r\n && orientation == Globals.Views.ORIENTATION_LANDSCAPE)\r\n || (rendition_spread == SpineItem.RENDITION_SPREAD_PORTRAIT\r\n && orientation == Globals.Views.ORIENTATION_PORTRAIT );\r\n};\r\n\r\nHelpers.CSSTransition = function ($el, trans) {\r\n\r\n // does not work!\r\n //$el.css('transition', trans);\r\n\r\n var css = {};\r\n // empty '' prefix FIRST!\r\n _.each(['', '-webkit-', '-moz-', '-ms-'], function (prefix) {\r\n css[prefix + 'transition'] = prefix + trans;\r\n });\r\n $el.css(css);\r\n}\r\n\r\n//scale, left, top, angle, origin\r\nHelpers.CSSTransformString = function (options) {\r\n var enable3D = options.enable3D ? true : false;\r\n\r\n var translate, scale, rotation,\r\n origin = options.origin;\r\n\r\n if (options.left || options.top) {\r\n var left = options.left || 0,\r\n top = options.top || 0;\r\n\r\n translate = enable3D ? (\"translate3D(\" + left + \"px, \" + top + \"px, 0)\") : (\"translate(\" + left + \"px, \" + top + \"px)\");\r\n }\r\n if (options.scale) {\r\n scale = enable3D ? (\"scale3D(\" + options.scale + \", \" + options.scale + \", 0)\") : (\"scale(\" + options.scale + \")\");\r\n }\r\n if (options.angle) {\r\n rotation = enable3D ? (\"rotate3D(0,0,\" + options.angle + \"deg)\") : (\"rotate(\" + options.angle + \"deg)\");\r\n }\r\n\r\n if (!(translate || scale || rotation)) {\r\n return {};\r\n }\r\n\r\n var transformString = (translate && scale) ? (translate + \" \" + scale) : (translate ? translate : scale); // the order is important!\r\n if (rotation) {\r\n transformString = transformString + \" \" + rotation;\r\n //transformString = rotation + \" \" + transformString;\r\n }\r\n\r\n var css = {};\r\n css['transform'] = transformString;\r\n css['transform-origin'] = origin ? origin : (enable3D ? '0 0 0' : '0 0');\r\n return css;\r\n};\r\n\r\nHelpers.extendedThrottle = function (startCb, tickCb, endCb, tickRate, waitThreshold, context) {\r\n if (!tickRate) tickRate = 250;\r\n if (!waitThreshold) waitThreshold = tickRate;\r\n\r\n var first = true,\r\n last,\r\n deferTimer;\r\n\r\n return function () {\r\n var ctx = context || this,\r\n now = (Date.now && Date.now()) || new Date().getTime(),\r\n args = arguments;\r\n\r\n if (!(last && now < last + tickRate)) {\r\n last = now;\r\n if (first) {\r\n startCb.apply(ctx, args);\r\n first = false;\r\n } else {\r\n tickCb.apply(ctx, args);\r\n }\r\n }\r\n\r\n clearTimeout(deferTimer);\r\n deferTimer = setTimeout(function () {\r\n last = now;\r\n first = true;\r\n endCb.apply(ctx, args);\r\n }, waitThreshold);\r\n };\r\n};\r\n\r\n\r\n//TODO: consider using CSSOM escape() or polyfill\r\n//https://github.com/mathiasbynens/CSS.escape/blob/master/css.escape.js\r\n//http://mathiasbynens.be/notes/css-escapes\r\n/**\r\n *\r\n * @param sel\r\n * @returns {string}\r\n */\r\nHelpers.escapeJQuerySelector = function (sel) {\r\n //http://api.jquery.com/category/selectors/\r\n //!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~\r\n // double backslash escape\r\n\r\n if (!sel) return undefined;\r\n\r\n var selector = sel.replace(/([;&,\\.\\+\\*\\~\\?':\"\\!\\^#$%@\\[\\]\\(\\)<=>\\|\\/\\\\{}`])/g, '\\\\$1');\r\n\r\n // if (selector !== sel)\r\n // {\r\n // console.debug(\"---- SELECTOR ESCAPED\");\r\n // console.debug(\"1: \" + sel);\r\n // console.debug(\"2: \" + selector);\r\n // }\r\n // else\r\n // {\r\n // console.debug(\"---- SELECTOR OKAY: \" + sel);\r\n // }\r\n\r\n return selector;\r\n};\r\n\r\n\r\nreturn Helpers;\r\n});\r\n\n", + "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\ndefine('readium_shared_js/helpers',['underscore', \"jquery\", \"jquerySizes\", \"./models/spine_item\", \"./globals\"], function(_, $, JQuerySizes, SpineItem, Globals) {\r\n\r\nvar Helpers = {};\r\n\r\n/**\r\n *\r\n * @param ebookURL URL string, or Blob (possibly File)\r\n * @returns string representing the file path / name from which the asset referenced by this URL originates\r\n */\r\nHelpers.getEbookUrlFilePath = function(ebookURL) {\r\n \r\n if (!window.Blob || !window.File) return ebookURL;\r\n \r\n var ebookURL_filepath = (ebookURL instanceof Blob) ? ((ebookURL instanceof File) ? ebookURL.name : \"readium-ebook.epub\") : ebookURL;\r\n return ebookURL_filepath;\r\n};\r\n\r\n/**\r\n *\r\n * @returns object (map between URL query parameter names and corresponding decoded / unescaped values)\r\n */\r\nHelpers.getURLQueryParams = function() {\r\n var params = {};\r\n\r\n var query = window.location.search;\r\n if (query && query.length) {\r\n query = query.substring(1);\r\n var keyParams = query.split('&');\r\n for (var x = 0; x < keyParams.length; x++)\r\n {\r\n var keyVal = keyParams[x].split('=');\r\n if (keyVal.length > 1) {\r\n params[keyVal[0]] = decodeURIComponent(keyVal[1]);\r\n }\r\n }\r\n }\r\n\r\n return params;\r\n};\r\n\r\n\r\n/**\r\n *\r\n * @param left\r\n * @param top\r\n * @param width\r\n * @param height\r\n * @constructor\r\n */\r\nHelpers.Rect = function (left, top, width, height) {\r\n\r\n this.left = left;\r\n this.top = top;\r\n this.width = width;\r\n this.height = height;\r\n\r\n this.right = function () {\r\n return this.left + this.width;\r\n };\r\n\r\n this.bottom = function () {\r\n return this.top + this.height;\r\n };\r\n\r\n this.isOverlap = function (rect, tolerance) {\r\n\r\n if (tolerance == undefined) {\r\n tolerance = 0;\r\n }\r\n\r\n return !(rect.right() < this.left + tolerance ||\r\n rect.left > this.right() - tolerance ||\r\n rect.bottom() < this.top + tolerance ||\r\n rect.top > this.bottom() - tolerance);\r\n }\r\n};\r\n\r\n/**\r\n *\r\n * @param $element\r\n * @returns {Helpers.Rect}\r\n */\r\n//This method treats multicolumn view as one long column and finds the rectangle of the element in this \"long\" column\r\n//we are not using jQuery Offset() and width()/height() function because for multicolumn rendition_layout it produces rectangle as a bounding box of element that\r\n// reflows between columns this is inconstant and difficult to analyze .\r\nHelpers.Rect.fromElement = function ($element) {\r\n\r\n var e;\r\n if (_.isArray($element) || $element instanceof jQuery)\r\n e = $element[0];\r\n else\r\n e = $element;\r\n // TODODM this is somewhat hacky. Text (range?) elements don't have a position so we have to ask the parent.\r\n if (e.nodeType === 3) {\r\n e = $element.parent()[0];\r\n }\r\n\r\n\r\n var offsetLeft = e.offsetLeft;\r\n var offsetTop = e.offsetTop;\r\n var offsetWidth = e.offsetWidth;\r\n var offsetHeight = e.offsetHeight;\r\n\r\n while (e = e.offsetParent) {\r\n offsetLeft += e.offsetLeft;\r\n offsetTop += e.offsetTop;\r\n }\r\n\r\n return new Helpers.Rect(offsetLeft, offsetTop, offsetWidth, offsetHeight);\r\n};\r\n\r\nHelpers.UpdateHtmlFontSize = function ($epubHtml, fontSize) {\r\n\r\n\r\n var factor = fontSize / 100;\r\n var win = $epubHtml[0].ownerDocument.defaultView;\r\n var $textblocks = $('p, div, span, h1, h2, h3, h4, h5, h6, li, blockquote, td, pre', $epubHtml);\r\n var originalLineHeight;\r\n\r\n\r\n // need to do two passes because it is possible to have nested text blocks.\r\n // If you change the font size of the parent this will then create an inaccurate\r\n // font size for any children.\r\n for (var i = 0; i < $textblocks.length; i++) {\r\n var ele = $textblocks[i],\r\n fontSizeAttr = ele.getAttribute('data-original-font-size');\r\n\r\n if (!fontSizeAttr) {\r\n var style = win.getComputedStyle(ele);\r\n var originalFontSize = parseInt(style.fontSize);\r\n originalLineHeight = parseInt(style.lineHeight);\r\n\r\n ele.setAttribute('data-original-font-size', originalFontSize);\r\n // getComputedStyle will not calculate the line-height if the value is 'normal'. In this case parseInt will return NaN\r\n if (originalLineHeight) {\r\n ele.setAttribute('data-original-line-height', originalLineHeight);\r\n }\r\n }\r\n }\r\n\r\n // reset variable so the below logic works. All variables in JS are function scoped.\r\n originalLineHeight = 0;\r\n for (var i = 0; i < $textblocks.length; i++) {\r\n var ele = $textblocks[i],\r\n fontSizeAttr = ele.getAttribute('data-original-font-size'),\r\n lineHeightAttr = ele.getAttribute('data-original-line-height'),\r\n originalFontSize = Number(fontSizeAttr);\r\n\r\n if (lineHeightAttr) {\r\n originalLineHeight = Number(lineHeightAttr);\r\n }\r\n else {\r\n originalLineHeight = 0;\r\n }\r\n\r\n $(ele).css(\"font-size\", (originalFontSize * factor) + 'px');\r\n if (originalLineHeight) {\r\n $(ele).css(\"line-height\", (originalLineHeight * factor) + 'px');\r\n }\r\n\r\n }\r\n $epubHtml.css(\"font-size\", fontSize + \"%\");\r\n};\r\n\r\n\r\n/**\r\n *\r\n * @param contentRef\r\n * @param sourceFileHref\r\n * @returns {string}\r\n * @constructor\r\n */\r\nHelpers.ResolveContentRef = function (contentRef, sourceFileHref) {\r\n\r\n if (!sourceFileHref) {\r\n return contentRef;\r\n }\r\n\r\n var sourceParts = sourceFileHref.split(\"/\");\r\n sourceParts.pop(); //remove source file name\r\n\r\n var pathComponents = contentRef.split(\"/\");\r\n\r\n while (sourceParts.length > 0 && pathComponents[0] === \"..\") {\r\n\r\n sourceParts.pop();\r\n pathComponents.splice(0, 1);\r\n }\r\n\r\n var combined = sourceParts.concat(pathComponents);\r\n\r\n return combined.join(\"/\");\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param str\r\n * @param suffix\r\n * @returns {boolean}\r\n * @static\r\n */\r\nHelpers.EndsWith = function (str, suffix) {\r\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\r\n};\r\n\r\n/**\r\n *\r\n * @param str\r\n * @param suffix\r\n * @returns {boolean}\r\n * @static\r\n */\r\nHelpers.BeginsWith = function (str, suffix) {\r\n\r\n return str.indexOf(suffix) === 0;\r\n};\r\n\r\n/**\r\n *\r\n * @param str\r\n * @param toRemove\r\n * @returns {string}\r\n * @static\r\n */\r\nHelpers.RemoveFromString = function (str, toRemove) {\r\n\r\n var startIx = str.indexOf(toRemove);\r\n\r\n if (startIx == -1) {\r\n return str;\r\n }\r\n\r\n return str.substring(0, startIx) + str.substring(startIx + toRemove.length);\r\n};\r\n\r\n/**\r\n *\r\n * @param margin\r\n * @param border\r\n * @param padding\r\n * @constructor\r\n */\r\nHelpers.Margins = function (margin, border, padding) {\r\n\r\n this.margin = margin;\r\n this.border = border;\r\n this.padding = padding;\r\n\r\n this.left = this.margin.left + this.border.left + this.padding.left;\r\n this.right = this.margin.right + this.border.right + this.padding.right;\r\n this.top = this.margin.top + this.border.top + this.padding.top;\r\n this.bottom = this.margin.bottom + this.border.bottom + this.padding.bottom;\r\n\r\n this.width = function () {\r\n return this.left + this.right;\r\n };\r\n\r\n this.height = function () {\r\n return this.top + this.bottom;\r\n }\r\n};\r\n\r\n/**\r\n *\r\n * @param $iframe\r\n */\r\nHelpers.triggerLayout = function ($iframe) {\r\n\r\n var doc = $iframe[0].contentDocument;\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n var ss = undefined;\r\n try {\r\n ss = doc.styleSheets && doc.styleSheets.length ? doc.styleSheets[0] : undefined;\r\n if (!ss) {\r\n var style = doc.createElement('style');\r\n doc.head.appendChild(style);\r\n style.appendChild(doc.createTextNode(''));\r\n ss = style.sheet;\r\n }\r\n\r\n if (ss) {\r\n var cssRule = 'body:first-child::before {content:\\'READIUM\\';color: red;font-weight: bold;}';\r\n if (ss.cssRules) {\r\n ss.insertRule(cssRule, ss.cssRules.length);\r\n } else {\r\n ss.insertRule(cssRule, 0);\r\n }\r\n }\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n }\r\n\r\n try {\r\n var el = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"style\");\r\n el.appendChild(doc.createTextNode(\"*{}\"));\r\n doc.body.appendChild(el);\r\n doc.body.removeChild(el);\r\n\r\n if (ss) {\r\n if (ss.cssRules) {\r\n ss.deleteRule(ss.cssRules.length - 1);\r\n } else {\r\n ss.deleteRule(0);\r\n }\r\n }\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n }\r\n\r\n if (doc.body) {\r\n var val = doc.body.offsetTop; // triggers layout\r\n }\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param $viewport\r\n * @param spineItem\r\n * @param settings\r\n * @returns {boolean}\r\n */\r\n//Based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 doc\r\n// Returns falsy and truthy\r\n// true and false mean that the synthetic-spread or single-page is \"forced\" (to be respected whatever the external conditions)\r\n// 1 and 0 mean that the synthetic-spread or single-page is \"not forced\" (is allowed to be overriden by external conditions, such as optimum column width / text line number of characters, etc.)\r\nHelpers.deduceSyntheticSpread = function ($viewport, spineItem, settings) {\r\n\r\n if (!$viewport || $viewport.length == 0) {\r\n return 0; // non-forced\r\n }\r\n\r\n //http://www.idpf.org/epub/fxl/#property-spread-values\r\n\r\n var rendition_spread = spineItem ? spineItem.getRenditionSpread() : undefined;\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_NONE) {\r\n return false; // forced\r\n\r\n //\"Reading Systems must not incorporate this spine item in a synthetic spread.\"\r\n }\r\n\r\n if (settings.syntheticSpread == \"double\") {\r\n return true; // forced\r\n }\r\n else if (settings.syntheticSpread == \"single\") {\r\n return false; // forced\r\n }\r\n\r\n if (!spineItem) {\r\n return 0; // non-forced\r\n }\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_BOTH) {\r\n return true; // forced\r\n\r\n //\"Reading Systems should incorporate this spine item in a synthetic spread regardless of device orientation.\"\r\n }\r\n\r\n var orientation = Helpers.getOrientation($viewport);\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_LANDSCAPE) {\r\n return orientation === Globals.Views.ORIENTATION_LANDSCAPE; // forced\r\n\r\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in landscape orientation.\"\r\n }\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_PORTRAIT) {\r\n return orientation === Globals.Views.ORIENTATION_PORTRAIT; // forced\r\n\r\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in portrait orientation.\"\r\n }\r\n\r\n if (!rendition_spread || rendition_spread === SpineItem.RENDITION_SPREAD_AUTO) {\r\n // if no spread set in document and user didn't set in in setting we will do double for landscape\r\n var landscape = orientation === Globals.Views.ORIENTATION_LANDSCAPE;\r\n return landscape ? 1 : 0; // non-forced\r\n\r\n //\"Reading Systems may use synthetic spreads in specific or all device orientations as part of a display area utilization optimization process.\"\r\n }\r\n\r\n console.warn(\"Helpers.deduceSyntheticSpread: spread properties?!\");\r\n return 0; // non-forced\r\n};\r\n\r\n/**\r\n *\r\n * @param $element\r\n * @returns {Helpers.Rect}\r\n */\r\nHelpers.Margins.fromElement = function ($element) {\r\n return new this($element.margin(), $element.border(), $element.padding());\r\n};\r\n\r\n/**\r\n * @returns {Helpers.Rect}\r\n */\r\nHelpers.Margins.empty = function () {\r\n\r\n return new this({left: 0, right: 0, top: 0, bottom: 0}, {left: 0, right: 0, top: 0, bottom: 0}, {\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n bottom: 0\r\n });\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param name\r\n * @param params\r\n * @returns {Helpers.loadTemplate.cache}\r\n */\r\nHelpers.loadTemplate = function (name, params) {\r\n return Helpers.loadTemplate.cache[name];\r\n};\r\n\r\n/**\r\n *\r\n * @type {{fixed_book_frame: string, single_page_frame: string, scrolled_book_frame: string, reflowable_book_frame: string, reflowable_book_page_frame: string}}\r\n */\r\nHelpers.loadTemplate.cache = {\r\n \"fixed_book_frame\": '
',\r\n\r\n \"single_page_frame\": '
',\r\n //\"single_page_frame\" : '
',\r\n\r\n \"scrolled_book_frame\": '
',\r\n \"reflowable_book_frame\": '
',\r\n \"reflowable_book_page_frame\": '
'\r\n};\r\n\r\n/**\r\n *\r\n * @param styles\r\n * @param $element\r\n */\r\nHelpers.setStyles = function (styles, $element) {\r\n\r\n var count = styles.length;\r\n\r\n if (!count) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < count; i++) {\r\n var style = styles[i];\r\n if (style.selector) {\r\n $(style.selector, $element).css(style.declarations);\r\n }\r\n else {\r\n $element.css(style.declarations);\r\n }\r\n }\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param iframe\r\n * @returns {boolean}\r\n */\r\nHelpers.isIframeAlive = function (iframe) {\r\n var w = undefined;\r\n var d = undefined;\r\n try {\r\n w = iframe.contentWindow;\r\n d = iframe.contentDocument;\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n return false;\r\n }\r\n\r\n return w && d;\r\n};\r\n\r\n/**\r\n *\r\n * @param $viewport\r\n * @returns {Globals.Views.ORIENTATION_LANDSCAPE|Globals.Views.ORIENTATION_PORTRAIT}\r\n */\r\nHelpers.getOrientation = function ($viewport) {\r\n\r\n var viewportWidth = $viewport.width();\r\n var viewportHeight = $viewport.height();\r\n\r\n if (!viewportWidth || !viewportHeight) {\r\n return undefined;\r\n }\r\n\r\n return viewportWidth >= viewportHeight ? Globals.Views.ORIENTATION_LANDSCAPE : Globals.Views.ORIENTATION_PORTRAIT;\r\n};\r\n\r\n/**\r\n *\r\n * @param item\r\n * @param orientation\r\n * @returns {boolean}\r\n */\r\nHelpers.isRenditionSpreadPermittedForItem = function (item, orientation) {\r\n\r\n var rendition_spread = item.getRenditionSpread();\r\n\r\n return !rendition_spread\r\n || rendition_spread == SpineItem.RENDITION_SPREAD_BOTH\r\n || rendition_spread == SpineItem.RENDITION_SPREAD_AUTO\r\n || (rendition_spread == SpineItem.RENDITION_SPREAD_LANDSCAPE\r\n && orientation == Globals.Views.ORIENTATION_LANDSCAPE)\r\n || (rendition_spread == SpineItem.RENDITION_SPREAD_PORTRAIT\r\n && orientation == Globals.Views.ORIENTATION_PORTRAIT );\r\n};\r\n\r\nHelpers.CSSTransition = function ($el, trans) {\r\n\r\n // does not work!\r\n //$el.css('transition', trans);\r\n\r\n var css = {};\r\n // empty '' prefix FIRST!\r\n _.each(['', '-webkit-', '-moz-', '-ms-'], function (prefix) {\r\n css[prefix + 'transition'] = prefix + trans;\r\n });\r\n $el.css(css);\r\n}\r\n\r\n//scale, left, top, angle, origin\r\nHelpers.CSSTransformString = function (options) {\r\n var enable3D = options.enable3D ? true : false;\r\n\r\n var translate, scale, rotation,\r\n origin = options.origin;\r\n\r\n if (options.left || options.top) {\r\n var left = options.left || 0,\r\n top = options.top || 0;\r\n\r\n translate = enable3D ? (\"translate3D(\" + left + \"px, \" + top + \"px, 0)\") : (\"translate(\" + left + \"px, \" + top + \"px)\");\r\n }\r\n if (options.scale) {\r\n scale = enable3D ? (\"scale3D(\" + options.scale + \", \" + options.scale + \", 0)\") : (\"scale(\" + options.scale + \")\");\r\n }\r\n if (options.angle) {\r\n rotation = enable3D ? (\"rotate3D(0,0,\" + options.angle + \"deg)\") : (\"rotate(\" + options.angle + \"deg)\");\r\n }\r\n\r\n if (!(translate || scale || rotation)) {\r\n return {};\r\n }\r\n\r\n var transformString = (translate && scale) ? (translate + \" \" + scale) : (translate ? translate : scale); // the order is important!\r\n if (rotation) {\r\n transformString = transformString + \" \" + rotation;\r\n //transformString = rotation + \" \" + transformString;\r\n }\r\n\r\n var css = {};\r\n css['transform'] = transformString;\r\n css['transform-origin'] = origin ? origin : (enable3D ? '0 0 0' : '0 0');\r\n return css;\r\n};\r\n\r\nHelpers.extendedThrottle = function (startCb, tickCb, endCb, tickRate, waitThreshold, context) {\r\n if (!tickRate) tickRate = 250;\r\n if (!waitThreshold) waitThreshold = tickRate;\r\n\r\n var first = true,\r\n last,\r\n deferTimer;\r\n\r\n return function () {\r\n var ctx = context || this,\r\n now = (Date.now && Date.now()) || new Date().getTime(),\r\n args = arguments;\r\n\r\n if (!(last && now < last + tickRate)) {\r\n last = now;\r\n if (first) {\r\n startCb.apply(ctx, args);\r\n first = false;\r\n } else {\r\n tickCb.apply(ctx, args);\r\n }\r\n }\r\n\r\n clearTimeout(deferTimer);\r\n deferTimer = setTimeout(function () {\r\n last = now;\r\n first = true;\r\n endCb.apply(ctx, args);\r\n }, waitThreshold);\r\n };\r\n};\r\n\r\n\r\n//TODO: consider using CSSOM escape() or polyfill\r\n//https://github.com/mathiasbynens/CSS.escape/blob/master/css.escape.js\r\n//http://mathiasbynens.be/notes/css-escapes\r\n/**\r\n *\r\n * @param sel\r\n * @returns {string}\r\n */\r\nHelpers.escapeJQuerySelector = function (sel) {\r\n //http://api.jquery.com/category/selectors/\r\n //!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~\r\n // double backslash escape\r\n\r\n if (!sel) return undefined;\r\n\r\n var selector = sel.replace(/([;&,\\.\\+\\*\\~\\?':\"\\!\\^#$%@\\[\\]\\(\\)<=>\\|\\/\\\\{}`])/g, '\\\\$1');\r\n\r\n // if (selector !== sel)\r\n // {\r\n // console.debug(\"---- SELECTOR ESCAPED\");\r\n // console.debug(\"1: \" + sel);\r\n // console.debug(\"2: \" + selector);\r\n // }\r\n // else\r\n // {\r\n // console.debug(\"---- SELECTOR OKAY: \" + sel);\r\n // }\r\n\r\n return selector;\r\n};\r\n\r\n\r\nreturn Helpers;\r\n});\r\n\n", "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n/**\r\n * CFI navigation helper class\r\n *\r\n * @param $viewport\r\n * @param $iframe\r\n * @param options Additional settings for NavigationLogic object\r\n * - rectangleBased If truthy, clientRect-based geometry will be used\r\n * - paginationInfo Layout details, used by clientRect-based geometry\r\n * @constructor\r\n */\r\ndefine('readium_shared_js/views/cfi_navigation_logic',[\"jquery\", \"underscore\", \"../helpers\", 'readium_cfi_js'], function($, _, Helpers, epubCfi) {\r\n\r\nvar CfiNavigationLogic = function($viewport, $iframe, options){\r\n\r\n options = options || {};\r\n\r\n this.getRootElement = function(){\r\n\r\n return $iframe[0].contentDocument.documentElement;\r\n };\r\n \r\n // FIXED LAYOUT if (!options.rectangleBased) alert(\"!!!options.rectangleBased\");\r\n \r\n var visibilityCheckerFunc = options.rectangleBased\r\n ? checkVisibilityByRectangles\r\n : checkVisibilityByVerticalOffsets;\r\n\r\n /**\r\n * @private\r\n * Checks whether or not pages are rendered right-to-left\r\n *\r\n * @returns {boolean}\r\n */\r\n function isPageProgressionRightToLeft() {\r\n return options.paginationInfo && !!options.paginationInfo.rightToLeft;\r\n }\r\n\r\n /**\r\n * @private\r\n * Checks whether or not pages are rendered with vertical writing mode\r\n *\r\n * @returns {boolean}\r\n */\r\n function isVerticalWritingMode() {\r\n return options.paginationInfo && !!options.paginationInfo.isVerticalWritingMode;\r\n }\r\n\r\n\r\n /**\r\n * @private\r\n * Checks whether or not a (fully adjusted) rectangle is at least partly visible\r\n *\r\n * @param {Object} rect\r\n * @param {Object} frameDimensions\r\n * @param {boolean} [isVwm] isVerticalWritingMode\r\n * @returns {boolean}\r\n */\r\n function isRectVisible(rect, frameDimensions, isVwm) {\r\n if (isVwm) {\r\n return rect.top >= 0 && rect.top < frameDimensions.height;\r\n }\r\n return rect.left >= 0 && rect.left < frameDimensions.width;\r\n }\r\n\r\n /**\r\n * @private\r\n * Retrieves _current_ full width of a column (including its gap)\r\n *\r\n * @returns {number} Full width of a column in pixels\r\n */\r\n function getColumnFullWidth() {\r\n \r\n if (!options.paginationInfo || isVerticalWritingMode())\r\n {\r\n return $iframe.width();\r\n }\r\n \r\n return options.paginationInfo.columnWidth + options.paginationInfo.columnGap;\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * Retrieves _current_ offset of a viewport\r\n * (related to the beginning of the chapter)\r\n *\r\n * @returns {Object}\r\n */\r\n function getVisibleContentOffsets() {\r\n if(isVerticalWritingMode()){\r\n return {\r\n top: (options.paginationInfo ? options.paginationInfo.pageOffset : 0)\r\n };\r\n }\r\n return {\r\n left: (options.paginationInfo ? options.paginationInfo.pageOffset : 0)\r\n * (isPageProgressionRightToLeft() ? -1 : 1)\r\n };\r\n }\r\n\r\n // Old (offsetTop-based) algorithm, useful in top-to-bottom layouts\r\n function checkVisibilityByVerticalOffsets(\r\n $element, visibleContentOffsets, shouldCalculateVisibilityOffset) {\r\n\r\n var elementRect = Helpers.Rect.fromElement($element);\r\n if (_.isNaN(elementRect.left)) {\r\n // this is actually a point element, doesnt have a bounding rectangle\r\n elementRect = new Helpers.Rect(\r\n $element.position().top, $element.position().left, 0, 0);\r\n }\r\n var topOffset = visibleContentOffsets.top || 0;\r\n var isBelowVisibleTop = elementRect.bottom() > topOffset;\r\n var isAboveVisibleBottom = visibleContentOffsets.bottom !== undefined\r\n ? elementRect.top < visibleContentOffsets.bottom\r\n : true; //this check always passed, if corresponding offset isn't set\r\n\r\n var percentOfElementHeight = 0;\r\n if (isBelowVisibleTop && isAboveVisibleBottom) { // element is visible\r\n if (!shouldCalculateVisibilityOffset) {\r\n return 100;\r\n }\r\n else if (elementRect.top <= topOffset) {\r\n percentOfElementHeight = Math.ceil(\r\n 100 * (topOffset - elementRect.top) / elementRect.height\r\n );\r\n\r\n // below goes another algorithm, which has been used in getVisibleElements pattern,\r\n // but it seems to be a bit incorrect\r\n // (as spatial offset should be measured at the first visible point of the element):\r\n //\r\n // var visibleTop = Math.max(elementRect.top, visibleContentOffsets.top);\r\n // var visibleBottom = Math.min(elementRect.bottom(), visibleContentOffsets.bottom);\r\n // var visibleHeight = visibleBottom - visibleTop;\r\n // var percentVisible = Math.round((visibleHeight / elementRect.height) * 100);\r\n }\r\n return 100 - percentOfElementHeight;\r\n }\r\n return 0; // element isn't visible\r\n }\r\n\r\n /**\r\n * New (rectangle-based) algorithm, useful in multi-column layouts\r\n *\r\n * Note: the second param (props) is ignored intentionally\r\n * (no need to use those in normalization)\r\n *\r\n * @param {jQuery} $element\r\n * @param {Object} _props\r\n * @param {boolean} shouldCalculateVisibilityPercentage\r\n * @returns {number|null}\r\n * 0 for non-visible elements,\r\n * 0 < n <= 100 for visible elements\r\n * (will just give 100, if `shouldCalculateVisibilityPercentage` => false)\r\n * null for elements with display:none\r\n */\r\n function checkVisibilityByRectangles(\r\n $element, _props, shouldCalculateVisibilityPercentage) {\r\n\r\n var elementRectangles = getNormalizedRectangles($element);\r\n var clientRectangles = elementRectangles.clientRectangles;\r\n if (clientRectangles.length === 0) { // elements with display:none, etc.\r\n return null;\r\n }\r\n\r\n var isRtl = isPageProgressionRightToLeft();\r\n var isVwm = isVerticalWritingMode();\r\n var columnFullWidth = getColumnFullWidth();\r\n var frameDimensions = {\r\n width: $iframe.width(),\r\n height: $iframe.height()\r\n };\r\n\r\n if (clientRectangles.length === 1) {\r\n // because of webkit inconsistency, that single rectangle should be adjusted\r\n // until it hits the end OR will be based on the FIRST column that is visible\r\n adjustRectangle(clientRectangles[0], frameDimensions, columnFullWidth,\r\n isRtl, isVwm, true);\r\n }\r\n\r\n // for an element split between several CSS columns,\r\n // both Firefox and IE produce as many client rectangles;\r\n // each of those should be checked\r\n var visibilityPercentage = 0;\r\n for (var i = 0, l = clientRectangles.length; i < l; ++i) {\r\n if (isRectVisible(clientRectangles[i], frameDimensions, isVwm)) {\r\n visibilityPercentage = shouldCalculateVisibilityPercentage\r\n ? measureVisibilityPercentageByRectangles(clientRectangles, i)\r\n : 100;\r\n break;\r\n }\r\n }\r\n return visibilityPercentage;\r\n }\r\n\r\n /**\r\n * Finds a page index (0-based) for a specific element.\r\n * Calculations are based on rectangles retrieved with getClientRects() method.\r\n *\r\n * @param {jQuery} $element\r\n * @param {number} spatialVerticalOffset\r\n * @returns {number|null}\r\n */\r\n function findPageByRectangles($element, spatialVerticalOffset) {\r\n var visibleContentOffsets = getVisibleContentOffsets();\r\n var elementRectangles = getNormalizedRectangles($element, visibleContentOffsets);\r\n var clientRectangles = elementRectangles.clientRectangles;\r\n if (clientRectangles.length === 0) { // elements with display:none, etc.\r\n return null;\r\n }\r\n\r\n var isRtl = isPageProgressionRightToLeft();\r\n var isVwm = isVerticalWritingMode();\r\n var columnFullWidth = getColumnFullWidth();\r\n\r\n var frameHeight = $iframe.height();\r\n var frameWidth = $iframe.width();\r\n\r\n if (spatialVerticalOffset) {\r\n trimRectanglesByVertOffset(clientRectangles, spatialVerticalOffset,\r\n frameHeight, columnFullWidth, isRtl, isVwm);\r\n }\r\n\r\n var firstRectangle = _.first(clientRectangles);\r\n if (clientRectangles.length === 1) {\r\n adjustRectangle(firstRectangle, {\r\n height: frameHeight, width: frameWidth\r\n }, columnFullWidth, isRtl, isVwm);\r\n }\r\n\r\n var pageIndex;\r\n\r\n if (isVwm) {\r\n var topOffset = firstRectangle.top;\r\n pageIndex = Math.floor(topOffset / frameHeight);\r\n } else {\r\n var leftOffset = firstRectangle.left;\r\n if (isRtl) {\r\n leftOffset = (columnFullWidth * (options.paginationInfo ? options.paginationInfo.visibleColumnCount : 1)) - leftOffset;\r\n }\r\n pageIndex = Math.floor(leftOffset / columnFullWidth);\r\n }\r\n\r\n if (pageIndex < 0) {\r\n pageIndex = 0;\r\n }\r\n else if (pageIndex >= (options.paginationInfo ? options.paginationInfo.columnCount : 1)) {\r\n pageIndex = (options.paginationInfo ? (options.paginationInfo.columnCount - 1) : 0);\r\n }\r\n\r\n return pageIndex;\r\n }\r\n\r\n /**\r\n * @private\r\n * Calculates the visibility offset percentage based on ClientRect dimensions\r\n *\r\n * @param {Array} clientRectangles (should already be normalized)\r\n * @param {number} firstVisibleRectIndex\r\n * @returns {number} - visibility percentage (0 < n <= 100)\r\n */\r\n function measureVisibilityPercentageByRectangles(\r\n clientRectangles, firstVisibleRectIndex) {\r\n\r\n var heightTotal = 0;\r\n var heightVisible = 0;\r\n\r\n if (clientRectangles.length > 1) {\r\n _.each(clientRectangles, function(rect, index) {\r\n heightTotal += rect.height;\r\n if (index >= firstVisibleRectIndex) {\r\n // in this case, all the rectangles after the first visible\r\n // should be counted as visible\r\n heightVisible += rect.height;\r\n }\r\n });\r\n }\r\n else {\r\n // should already be normalized and adjusted\r\n heightTotal = clientRectangles[0].height;\r\n heightVisible = clientRectangles[0].height - Math.max(\r\n 0, -clientRectangles[0].top);\r\n }\r\n return heightVisible === heightTotal\r\n ? 100 // trivial case: element is 100% visible\r\n : Math.floor(100 * heightVisible / heightTotal);\r\n }\r\n\r\n /**\r\n * @private\r\n * Retrieves the position of $element in multi-column layout\r\n *\r\n * @param {jQuery} $el\r\n * @param {Object} [visibleContentOffsets]\r\n * @returns {Object}\r\n */\r\n function getNormalizedRectangles($el, visibleContentOffsets) {\r\n\r\n visibleContentOffsets = visibleContentOffsets || {};\r\n var leftOffset = visibleContentOffsets.left || 0;\r\n var topOffset = visibleContentOffsets.top || 0;\r\n\r\n // union of all rectangles wrapping the element\r\n var wrapperRectangle = normalizeRectangle(\r\n $el[0].getBoundingClientRect(), leftOffset, topOffset);\r\n\r\n // all the separate rectangles (for detecting position of the element\r\n // split between several columns)\r\n var clientRectangles = [];\r\n var clientRectList = $el[0].getClientRects();\r\n for (var i = 0, l = clientRectList.length; i < l; ++i) {\r\n if (clientRectList[i].height > 0) {\r\n // Firefox sometimes gets it wrong,\r\n // adding literally empty (height = 0) client rectangle preceding the real one,\r\n // that empty client rectanle shouldn't be retrieved\r\n clientRectangles.push(\r\n normalizeRectangle(clientRectList[i], leftOffset, topOffset));\r\n }\r\n }\r\n\r\n if (clientRectangles.length === 0) {\r\n // sometimes an element is either hidden or empty, and that means\r\n // Webkit-based browsers fail to assign proper clientRects to it\r\n // in this case we need to go for its sibling (if it exists)\r\n $el = $el.next();\r\n if ($el.length) {\r\n return getNormalizedRectangles($el, visibleContentOffsets);\r\n }\r\n }\r\n\r\n return {\r\n wrapperRectangle: wrapperRectangle,\r\n clientRectangles: clientRectangles\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * Converts TextRectangle object into a plain object,\r\n * taking content offsets (=scrolls, position shifts etc.) into account\r\n *\r\n * @param {TextRectangle} textRect\r\n * @param {number} leftOffset\r\n * @param {number} topOffset\r\n * @returns {Object}\r\n */\r\n function normalizeRectangle(textRect, leftOffset, topOffset) {\r\n\r\n var plainRectObject = {\r\n left: textRect.left,\r\n right: textRect.right,\r\n top: textRect.top,\r\n bottom: textRect.bottom,\r\n width: textRect.right - textRect.left,\r\n height: textRect.bottom - textRect.top\r\n };\r\n offsetRectangle(plainRectObject, leftOffset, topOffset);\r\n return plainRectObject;\r\n }\r\n\r\n /**\r\n * @private\r\n * Offsets plain object (which represents a TextRectangle).\r\n *\r\n * @param {Object} rect\r\n * @param {number} leftOffset\r\n * @param {number} topOffset\r\n */\r\n function offsetRectangle(rect, leftOffset, topOffset) {\r\n\r\n rect.left += leftOffset;\r\n rect.right += leftOffset;\r\n rect.top += topOffset;\r\n rect.bottom += topOffset;\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * When element is spilled over two or more columns,\r\n * most of the time Webkit-based browsers\r\n * still assign a single clientRectangle to it, setting its `top` property to negative value\r\n * (so it looks like it's rendered based on the second column)\r\n * Alas, sometimes they decide to continue the leftmost column - from _below_ its real height.\r\n * In this case, `bottom` property is actually greater than element's height and had to be adjusted accordingly.\r\n *\r\n * Ugh.\r\n *\r\n * @param {Object} rect\r\n * @param {Object} frameDimensions\r\n * @param {number} columnFullWidth\r\n * @param {boolean} isRtl\r\n * @param {boolean} isVwm isVerticalWritingMode\r\n * @param {boolean} shouldLookForFirstVisibleColumn\r\n * If set, there'll be two-phase adjustment\r\n * (to align a rectangle with a viewport)\r\n\r\n */\r\n function adjustRectangle(rect, frameDimensions, columnFullWidth, isRtl, isVwm,\r\n shouldLookForFirstVisibleColumn) {\r\n\r\n // Rectangle adjustment is not needed in VWM since it does not deal with columns\r\n if (isVwm) {\r\n return;\r\n }\r\n\r\n if (isRtl) {\r\n columnFullWidth *= -1; // horizontal shifts are reverted in RTL mode\r\n }\r\n\r\n // first we go left/right (rebasing onto the very first column available)\r\n while (rect.top < 0) {\r\n offsetRectangle(rect, -columnFullWidth, frameDimensions.height);\r\n }\r\n\r\n // ... then, if necessary (for visibility offset checks),\r\n // each column is tried again (now in reverse order)\r\n // the loop will be stopped when the column is aligned with a viewport\r\n // (i.e., is the first visible one).\r\n if (shouldLookForFirstVisibleColumn) {\r\n while (rect.bottom >= frameDimensions.height) {\r\n if (isRectVisible(rect, frameDimensions, isVwm)) {\r\n break;\r\n }\r\n offsetRectangle(rect, columnFullWidth, -frameDimensions.height);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * Trims the rectangle(s) representing the given element.\r\n *\r\n * @param {Array} rects\r\n * @param {number} verticalOffset\r\n * @param {number} frameHeight\r\n * @param {number} columnFullWidth\r\n * @param {boolean} isRtl\r\n * @param {boolean} isVwm isVerticalWritingMode\r\n */\r\n function trimRectanglesByVertOffset(\r\n rects, verticalOffset, frameHeight, columnFullWidth, isRtl, isVwm) {\r\n\r\n //TODO: Support vertical writing mode\r\n if (isVwm) {\r\n return;\r\n }\r\n \r\n var totalHeight = _.reduce(rects, function(prev, cur) {\r\n return prev + cur.height;\r\n }, 0);\r\n\r\n var heightToHide = totalHeight * verticalOffset / 100;\r\n if (rects.length > 1) {\r\n var heightAccum = 0;\r\n do {\r\n heightAccum += rects[0].height;\r\n if (heightAccum > heightToHide) {\r\n break;\r\n }\r\n rects.shift();\r\n } while (rects.length > 1);\r\n }\r\n else {\r\n // rebase to the last possible column\r\n // (so that adding to top will be properly processed later)\r\n if (isRtl) {\r\n columnFullWidth *= -1;\r\n }\r\n while (rects[0].bottom >= frameHeight) {\r\n offsetRectangle(rects[0], columnFullWidth, -frameHeight);\r\n }\r\n\r\n rects[0].top += heightToHide;\r\n rects[0].height -= heightToHide;\r\n }\r\n }\r\n\r\n //we look for text and images\r\n this.findFirstVisibleElement = function (props) {\r\n\r\n if (typeof props !== 'object') {\r\n // compatibility with legacy code, `props` is `topOffset` actually\r\n props = { top: props };\r\n }\r\n\r\n var $elements;\r\n var $firstVisibleTextNode = null;\r\n var percentOfElementHeight = 0;\r\n\r\n $elements = $(\"body\", this.getRootElement()).find(\":not(iframe)\").contents().filter(function () {\r\n return isValidTextNode(this) || this.nodeName.toLowerCase() === 'img';\r\n });\r\n\r\n // Find the first visible text node\r\n $.each($elements, function() {\r\n\r\n var $element;\r\n\r\n if(this.nodeType === Node.TEXT_NODE) { //text node\r\n $element = $(this).parent();\r\n }\r\n else {\r\n $element = $(this); //image\r\n }\r\n\r\n var visibilityResult = visibilityCheckerFunc($element, props, true);\r\n if (visibilityResult) {\r\n $firstVisibleTextNode = $element;\r\n percentOfElementHeight = 100 - visibilityResult;\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n return {$element: $firstVisibleTextNode, percentY: percentOfElementHeight};\r\n };\r\n\r\n this.getFirstVisibleElementCfi = function(topOffset) {\r\n\r\n var foundElement = this.findFirstVisibleElement(topOffset);\r\n\r\n if(!foundElement.$element) {\r\n console.log(\"Could not generate CFI no visible element on page\");\r\n return undefined;\r\n }\r\n\r\n //noinspection JSUnresolvedVariable\r\n var cfi = EPUBcfi.Generator.generateElementCFIComponent(foundElement.$element[0]);\r\n\r\n if(cfi[0] == \"!\") {\r\n cfi = cfi.substring(1);\r\n }\r\n\r\n return cfi + \"@0:\" + foundElement.percentY;\r\n };\r\n\r\n this.getPageForElementCfi = function(cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n var cfiParts = splitCfi(cfi);\r\n\r\n var $element = getElementByPartialCfi(cfiParts.cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n\r\n if(!$element) {\r\n return -1;\r\n }\r\n\r\n return this.getPageForPointOnElement($element, cfiParts.x, cfiParts.y);\r\n };\r\n\r\n function getElementByPartialCfi(cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n var contentDoc = $iframe[0].contentDocument;\r\n\r\n var wrappedCfi = \"epubcfi(\" + cfi + \")\";\r\n //noinspection JSUnresolvedVariable\r\n var $element = EPUBcfi.getTargetElementWithPartialCFI(wrappedCfi, contentDoc, classBlacklist, elementBlacklist, idBlacklist);\r\n\r\n if(!$element || $element.length == 0) {\r\n console.log(\"Can't find element for CFI: \" + cfi);\r\n return undefined;\r\n }\r\n\r\n return $element;\r\n }\r\n\r\n this.getElementByCfi = function(cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n var cfiParts = splitCfi(cfi);\r\n return getElementByPartialCfi(cfiParts.cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n };\r\n\r\n this.getPageForElement = function($element) {\r\n\r\n return this.getPageForPointOnElement($element, 0, 0);\r\n };\r\n\r\n this.getPageForPointOnElement = function($element, x, y) {\r\n\r\n var pageIndex;\r\n if (options.rectangleBased) {\r\n pageIndex = findPageByRectangles($element, y);\r\n if (pageIndex === null) {\r\n console.warn('Impossible to locate a hidden element: ', $element);\r\n return 0;\r\n }\r\n return pageIndex;\r\n }\r\n\r\n var posInElement = this.getVerticalOffsetForPointOnElement($element, x, y);\r\n return Math.floor(posInElement / $viewport.height());\r\n };\r\n\r\n this.getVerticalOffsetForElement = function($element) {\r\n\r\n return this.getVerticalOffsetForPointOnElement($element, 0, 0);\r\n };\r\n\r\n this.getVerticalOffsetForPointOnElement = function($element, x, y) {\r\n\r\n var elementRect = Helpers.Rect.fromElement($element);\r\n return Math.ceil(elementRect.top + y * elementRect.height / 100);\r\n };\r\n\r\n this.getElementById = function(id) {\r\n\r\n var contentDoc = $iframe[0].contentDocument;\r\n\r\n var $element = $(contentDoc.getElementById(id));\r\n //$(\"#\" + Helpers.escapeJQuerySelector(id), contentDoc);\r\n \r\n if($element.length == 0) {\r\n return undefined;\r\n }\r\n\r\n return $element;\r\n };\r\n\r\n this.getPageForElementId = function(id) {\r\n\r\n var $element = this.getElementById(id);\r\n if(!$element) {\r\n return -1;\r\n }\r\n\r\n return this.getPageForElement($element);\r\n };\r\n\r\n function splitCfi(cfi) {\r\n\r\n var ret = {\r\n cfi: \"\",\r\n x: 0,\r\n y: 0\r\n };\r\n\r\n var ix = cfi.indexOf(\"@\");\r\n\r\n if(ix != -1) {\r\n var terminus = cfi.substring(ix + 1);\r\n\r\n var colIx = terminus.indexOf(\":\");\r\n if(colIx != -1) {\r\n ret.x = parseInt(terminus.substr(0, colIx));\r\n ret.y = parseInt(terminus.substr(colIx + 1));\r\n }\r\n else {\r\n console.log(\"Unexpected terminating step format\");\r\n }\r\n\r\n ret.cfi = cfi.substring(0, ix);\r\n }\r\n else {\r\n\r\n ret.cfi = cfi;\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n // returns raw DOM element (not $ jQuery-wrapped)\r\n this.getFirstVisibleMediaOverlayElement = function(visibleContentOffsets)\r\n {\r\n var docElement = this.getRootElement();\r\n if (!docElement) return undefined;\r\n\r\n var $root = $(\"body\", docElement);\r\n if (!$root || !$root.length || !$root[0]) return undefined;\r\n\r\n var that = this;\r\n\r\n var firstPartial = undefined;\r\n\r\n function traverseArray(arr)\r\n {\r\n if (!arr || !arr.length) return undefined;\r\n\r\n for (var i = 0, count = arr.length; i < count; i++)\r\n {\r\n var item = arr[i];\r\n if (!item) continue;\r\n\r\n var $item = $(item);\r\n\r\n if($item.data(\"mediaOverlayData\"))\r\n {\r\n var visible = that.getElementVisibility($item, visibleContentOffsets);\r\n if (visible)\r\n {\r\n if (!firstPartial) firstPartial = item;\r\n\r\n if (visible == 100) return item;\r\n }\r\n }\r\n else\r\n {\r\n var elem = traverseArray(item.children);\r\n if (elem) return elem;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n var el = traverseArray([$root[0]]);\r\n if (!el) el = firstPartial;\r\n return el;\r\n\r\n // var $elements = this.getMediaOverlayElements($root);\r\n // return this.getVisibleElements($elements, visibleContentOffsets);\r\n };\r\n\r\n this.getElementVisibility = function($element, visibleContentOffsets) {\r\n return visibilityCheckerFunc($element, visibleContentOffsets, true);\r\n };\r\n\r\n\r\n\r\n this.isElementVisible = visibilityCheckerFunc;\r\n\r\n this.isElementCfiVisible = function (partialCfi) {\r\n var pageIndex = this.getPageForElementCfi(partialCfi,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n var paginationInfo = options.paginationInfo || null;\r\n if (paginationInfo) {\r\n var openPages = [paginationInfo.currentSpreadIndex * paginationInfo.visibleColumnCount];\r\n if (paginationInfo.visibleColumnCount == 2) {\r\n openPages.push(openPages[0] + 1);\r\n }\r\n return _.contains(openPages, pageIndex);\r\n }\r\n return undefined;\r\n };\r\n\r\n\r\n function isValidTextNode(node) {\r\n\r\n if(node.nodeType === Node.TEXT_NODE) {\r\n\r\n // Heuristic to find a text node with actual text\r\n var nodeText = node.nodeValue.replace(/\\n/g, \"\");\r\n nodeText = nodeText.replace(/ /g, \"\");\r\n\r\n return nodeText.length > 0;\r\n }\r\n\r\n return false;\r\n\r\n }\r\n\r\n this.getElement = function(selector) {\r\n\r\n var $element = $(selector, this.getRootElement());\r\n\r\n if($element.length > 0) {\r\n return $element;\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n};\r\nreturn CfiNavigationLogic;\r\n});\r\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/viewer_settings',[], function() {\r\n/**\r\n *\r\n * @param settingsData\r\n * @constructor\r\n */\r\nvar ViewerSettings = function(settingsData) {\r\n\r\n var self = this;\r\n\r\n this.syntheticSpread = \"auto\";\r\n this.fontSize = 100;\r\n this.columnGap = 20;\r\n\r\n this.mediaOverlaysPreservePlaybackWhenScroll = false;\r\n\r\n this.mediaOverlaysSkipSkippables = false;\r\n this.mediaOverlaysEscapeEscapables = true;\r\n\r\n this.mediaOverlaysSkippables = [];\r\n this.mediaOverlaysEscapables = [];\r\n \r\n this.mediaOverlaysEnableClick = true;\r\n this.mediaOverlaysRate = 1;\r\n this.mediaOverlaysVolume = 100;\r\n \r\n this.mediaOverlaysSynchronizationGranularity = \"\";\r\n\r\n this.mediaOverlaysAutomaticPageTurn = true;\r\n\r\n this.enableGPUHardwareAccelerationCSS3D = false;\r\n\r\n // -1 ==> disable\r\n // [0...n] ==> index of transition in pre-defined array\r\n this.pageTransition = -1;\r\n \r\n this.scroll = \"auto\";\r\n\r\n function buildArray(str)\r\n {\r\n var retArr = [];\r\n var arr = str.split(/[\\s,;]+/); //','\r\n for (var i = 0; i < arr.length; i++)\r\n {\r\n var item = arr[i].trim();\r\n if (item !== \"\")\r\n {\r\n retArr.push(item);\r\n }\r\n }\r\n return retArr;\r\n }\r\n\r\n function mapProperty(propName, settingsData, functionToApply) {\r\n\r\n if(settingsData[propName] !== undefined) {\r\n if(functionToApply) {\r\n\r\n self[propName] = functionToApply(settingsData[propName]);\r\n }\r\n else {\r\n self[propName] = settingsData[propName];\r\n }\r\n }\r\n\r\n }\r\n\r\n this.update = function(settingsData) {\r\n\r\n mapProperty(\"columnGap\", settingsData);\r\n mapProperty(\"fontSize\", settingsData);\r\n mapProperty(\"mediaOverlaysPreservePlaybackWhenScroll\", settingsData);\r\n mapProperty(\"mediaOverlaysSkipSkippables\", settingsData);\r\n mapProperty(\"mediaOverlaysEscapeEscapables\", settingsData);\r\n mapProperty(\"mediaOverlaysSkippables\", settingsData, buildArray);\r\n mapProperty(\"mediaOverlaysEscapables\", settingsData, buildArray);\r\n mapProperty(\"mediaOverlaysEnableClick\", settingsData);\r\n mapProperty(\"mediaOverlaysRate\", settingsData);\r\n mapProperty(\"mediaOverlaysVolume\", settingsData);\r\n mapProperty(\"mediaOverlaysSynchronizationGranularity\", settingsData);\r\n mapProperty(\"mediaOverlaysAutomaticPageTurn\", settingsData);\r\n mapProperty(\"scroll\", settingsData);\r\n mapProperty(\"syntheticSpread\", settingsData);\r\n mapProperty(\"pageTransition\", settingsData);\r\n mapProperty(\"enableGPUHardwareAccelerationCSS3D\", settingsData);\r\n };\r\n\r\n this.update(settingsData);\r\n};\r\n return ViewerSettings;\r\n});\r\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n\r\ndefine('readium_shared_js/views/one_page_view',[\"jquery\", \"underscore\", \"eventEmitter\", \"./cfi_navigation_logic\", \"../helpers\", \"../models/viewer_settings\"],\r\n function ($, _, EventEmitter, CfiNavigationLogic, Helpers, ViewerSettings) {\r\n\r\n/**\r\n * Renders one page of fixed layout spread\r\n *\r\n * @param options\r\n * @param classes\r\n * @param enableBookStyleOverrides\r\n * @constructor\r\n */\r\nvar OnePageView = function (options, classes, enableBookStyleOverrides, reader) {\r\n\r\n $.extend(this, new EventEmitter());\r\n\r\n var self = this;\r\n\r\n var _$epubHtml;\r\n var _$el;\r\n var _$iframe;\r\n var _currentSpineItem;\r\n var _spine = options.spine;\r\n var _iframeLoader = options.iframeLoader;\r\n var _bookStyles = options.bookStyles;\r\n\r\n var _$viewport = options.$viewport;\r\n\r\n var _isIframeLoaded = false;\r\n\r\n var _$scaler;\r\n\r\n var PageTransitionHandler = function (opts) {\r\n var PageTransition = function (begin, end) {\r\n this.begin = begin;\r\n this.end = end;\r\n };\r\n\r\n var _pageTransition_OPACITY = new PageTransition(\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"0\");\r\n },\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"transform\", \"none\");\r\n\r\n Helpers.CSSTransition($el, \"opacity 150ms ease-out\");\r\n\r\n $el.css(\"opacity\", \"1\");\r\n }\r\n );\r\n\r\n var _pageTransition_TRANSLATE = new PageTransition(\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"0\");\r\n\r\n var elWidth = Math.ceil(meta_width * scale);\r\n\r\n var initialLeft = elWidth * 0.8 * (pageSwitchDir === 2 ? 1 : -1);\r\n var move = Helpers.CSSTransformString({\r\n left: Math.round(initialLeft),\r\n origin: \"50% 50% 0\",\r\n enable3D: _enable3D\r\n });\r\n $el.css(move);\r\n },\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"1\");\r\n\r\n Helpers.CSSTransition($el, \"transform 150ms ease-out\");\r\n\r\n $el.css(\"transform\", \"none\");\r\n }\r\n );\r\n\r\n var _pageTransition_ROTATE = new PageTransition(\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"0\");\r\n\r\n var elWidth = Math.ceil(meta_width * scale);\r\n\r\n var initialLeft = elWidth * 1.7 * (pageSwitchDir === 2 ? 1 : -1);\r\n var trans = Helpers.CSSTransformString({\r\n left: Math.round(initialLeft),\r\n angle: (pageSwitchDir === 2 ? -1 : 1) * 30,\r\n origin: \"50% 50% 0\",\r\n enable3D: _enable3D\r\n }); //(pageSwitchDir === 2 ? '0% 0%' : '100% 0%')\r\n $el.css(trans);\r\n },\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"1\");\r\n\r\n Helpers.CSSTransition($el, \"transform 300ms ease-in-out\");\r\n\r\n $el.css(\"transform\", \"none\");\r\n }\r\n );\r\n\r\n var _pageTransition_SWING = new PageTransition(\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"0\");\r\n\r\n // SUPER HACKY!! (just for demo)\r\n var isLeft = false;\r\n var isCenter = false;\r\n var isRight = false;\r\n for (var i = 0; i < classes.length; i++) {\r\n var c = classes[i].toLowerCase();\r\n if (c.indexOf(\"left\") >= 0) {\r\n isLeft = true;\r\n break;\r\n }\r\n if (c.indexOf(\"right\") >= 0) {\r\n isRight = true;\r\n break;\r\n }\r\n if (c.indexOf(\"center\") >= 0) {\r\n isCenter = true;\r\n break;\r\n }\r\n }\r\n\r\n var elWidth = Math.ceil(meta_width * scale);\r\n\r\n var initialLeft = elWidth * 0.5 * ((isLeft || isCenter && pageSwitchDir === 1) ? 1 : -1);\r\n var trans = Helpers.CSSTransformString({\r\n scale: 0.2,\r\n left: Math.round(initialLeft),\r\n angle: ((isLeft || isCenter && pageSwitchDir === 1) ? 1 : -1) * 30,\r\n origin: '50% 50% 0',\r\n enable3D: _enable3D\r\n });\r\n $el.css(trans);\r\n },\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"1\");\r\n\r\n Helpers.CSSTransition($el, \"transform 400ms ease-out\");\r\n\r\n $el.css(\"transform\", \"none\");\r\n }\r\n );\r\n\r\n var _pageTransitions = [];\r\n _pageTransitions.push(_pageTransition_OPACITY); // 0\r\n _pageTransitions.push(_pageTransition_TRANSLATE); // 1\r\n _pageTransitions.push(_pageTransition_ROTATE); // 2\r\n _pageTransitions.push(_pageTransition_SWING); // 3\r\n\r\n var _disablePageTransitions = opts.disablePageTransitions || false;\r\n\r\n var _pageTransition = -1;\r\n\r\n var _enable3D = new ViewerSettings({}).enableGPUHardwareAccelerationCSS3D;\r\n\r\n var _viewerSettings = undefined;\r\n this.updateOptions = function (o) {\r\n _viewerSettings = o;\r\n\r\n var settings = _viewerSettings;\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n _enable3D = true;\r\n }\r\n\r\n if (o.pageTransition !== null && typeof o.pageTransition !== \"undefined\") {\r\n _pageTransition = o.pageTransition;\r\n }\r\n };\r\n this.updateOptions(opts);\r\n\r\n var _pageSwitchDir = 0;\r\n var _pageSwitchActuallyChanged = false;\r\n var _pageSwitchActuallyChanged_IFRAME_LOAD = false;\r\n\r\n // dir: 0 => new or same page, 1 => previous, 2 => next\r\n this.updatePageSwitchDir = function (dir, hasChanged) {\r\n if (_pageSwitchActuallyChanged_IFRAME_LOAD) {\r\n return;\r\n }\r\n\r\n _pageSwitchDir = dir;\r\n _pageSwitchActuallyChanged = hasChanged;\r\n };\r\n\r\n this.onIFrameLoad = function () {\r\n _pageSwitchActuallyChanged_IFRAME_LOAD = true; // second pass, but initial display for transition\r\n };\r\n\r\n this.transformContentImmediate_BEGIN = function ($el, scale, left, top) {\r\n var pageSwitchActuallyChanged = _pageSwitchActuallyChanged || _pageSwitchActuallyChanged_IFRAME_LOAD;\r\n _pageSwitchActuallyChanged_IFRAME_LOAD = false;\r\n\r\n if (_disablePageTransitions || _pageTransition === -1) return;\r\n\r\n Helpers.CSSTransition($el, \"all 0 ease 0\");\r\n\r\n if (!pageSwitchActuallyChanged) return;\r\n\r\n var pageTransition = (_pageTransition >= 0 && _pageTransition < _pageTransitions.length) ? _pageTransitions[_pageTransition] : undefined;\r\n\r\n if (_pageSwitchDir === 0 || !pageTransition) {\r\n $el.css(\"opacity\", \"0\");\r\n }\r\n else {\r\n pageTransition.begin(scale, left, top, $el, self.meta_width(), self.meta_height(), _pageSwitchDir);\r\n }\r\n };\r\n\r\n this.transformContentImmediate_END = function ($el, scale, left, top) {\r\n if (_disablePageTransitions || _pageTransition === -1) {\r\n $el.css(\"transform\", \"none\");\r\n return;\r\n }\r\n\r\n setTimeout(function () {\r\n var pageTransition = (_pageTransition >= 0 && _pageTransition < _pageTransitions.length) ? _pageTransitions[_pageTransition] : undefined;\r\n\r\n if (_pageSwitchDir === 0 || !pageTransition) {\r\n $el.css(\"transform\", \"none\");\r\n\r\n Helpers.CSSTransition($el, \"opacity 250ms linear\");\r\n\r\n $el.css(\"opacity\", \"1\");\r\n }\r\n else {\r\n pageTransition.end(scale, left, top, $el, self.meta_width(), self.meta_height(), _pageSwitchDir);\r\n }\r\n\r\n }, 10);\r\n };\r\n };\r\n var _pageTransitionHandler = new PageTransitionHandler(options);\r\n\r\n\r\n // fixed layout does not apply user styles to publisher content, but reflowable scroll view does\r\n var _enableBookStyleOverrides = enableBookStyleOverrides || false;\r\n\r\n var _meta_size = {\r\n width: 0,\r\n height: 0\r\n };\r\n\r\n this.element = function () {\r\n return _$el;\r\n };\r\n\r\n this.meta_height = function () {\r\n return _meta_size.height;\r\n };\r\n\r\n this.meta_width = function () {\r\n return _meta_size.width;\r\n };\r\n\r\n this.isDisplaying = function () {\r\n\r\n return _isIframeLoaded;\r\n };\r\n\r\n this.render = function () {\r\n\r\n var template = Helpers.loadTemplate(\"single_page_frame\", {});\r\n\r\n _$el = $(template);\r\n\r\n _$scaler = $(\"#scaler\", _$el);\r\n\r\n Helpers.CSSTransition(_$el, \"all 0 ease 0\");\r\n\r\n _$el.css(\"transform\", \"none\");\r\n\r\n var settings = reader.viewerSettings();\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n\r\n // This fixes rendering issues with WebView (native apps), which crops content embedded in iframes unless GPU hardware acceleration is enabled for CSS rendering.\r\n _$el.css(\"transform\", \"translateZ(0)\");\r\n }\r\n\r\n _$el.css(\"height\", \"100%\");\r\n _$el.css(\"width\", \"100%\");\r\n\r\n for (var i = 0, count = classes.length; i < count; i++) {\r\n _$el.addClass(classes[i]);\r\n }\r\n\r\n _$iframe = $(\"iframe\", _$el);\r\n\r\n return this;\r\n };\r\n\r\n\r\n this.decorateIframe = function () {\r\n if (!_$iframe || !_$iframe.length) return;\r\n\r\n _$iframe.css(\"border-bottom\", \"1px dashed silver\");\r\n _$iframe.css(\"border-top\", \"1px dashed silver\");\r\n };\r\n\r\n this.remove = function () {\r\n _isIframeLoaded = false;\r\n _currentSpineItem = undefined;\r\n _$el.remove();\r\n };\r\n\r\n this.clear = function () {\r\n _isIframeLoaded = false;\r\n _$iframe[0].src = \"\";\r\n };\r\n\r\n this.currentSpineItem = function () {\r\n\r\n return _currentSpineItem;\r\n };\r\n\r\n function onIFrameLoad(success) {\r\n\r\n if (success) {\r\n _isIframeLoaded = true;\r\n var epubContentDocument = _$iframe[0].contentDocument;\r\n _$epubHtml = $(\"html\", epubContentDocument);\r\n if (!_$epubHtml || _$epubHtml.length == 0) {\r\n _$epubHtml = $(\"svg\", epubContentDocument);\r\n }\r\n\r\n //_$epubHtml.css(\"overflow\", \"hidden\");\r\n\r\n if (_enableBookStyleOverrides) {\r\n self.applyBookStyles();\r\n }\r\n\r\n updateMetaSize();\r\n\r\n _pageTransitionHandler.onIFrameLoad();\r\n }\r\n }\r\n\r\n var _viewSettings = undefined;\r\n this.setViewSettings = function (settings) {\r\n\r\n _viewSettings = settings;\r\n\r\n if (_enableBookStyleOverrides) {\r\n self.applyBookStyles();\r\n }\r\n\r\n updateMetaSize();\r\n\r\n _pageTransitionHandler.updateOptions(settings);\r\n };\r\n\r\n function updateHtmlFontSize() {\r\n\r\n if (!_enableBookStyleOverrides) return;\r\n\r\n if (_$epubHtml && _viewSettings) {\r\n Helpers.UpdateHtmlFontSize(_$epubHtml, _viewSettings.fontSize);\r\n }\r\n }\r\n\r\n this.applyBookStyles = function () {\r\n\r\n if (!_enableBookStyleOverrides) return;\r\n\r\n if (_$epubHtml) {\r\n Helpers.setStyles(_bookStyles.getStyles(), _$epubHtml);\r\n updateHtmlFontSize();\r\n }\r\n };\r\n\r\n //this is called by scroll_view for fixed spine item\r\n this.scaleToWidth = function (width) {\r\n\r\n if (_meta_size.width <= 0) return; // resize event too early!\r\n\r\n var scale = width / _meta_size.width;\r\n self.transformContentImmediate(scale, 0, 0);\r\n };\r\n\r\n //this is called by scroll_view for reflowable spine item\r\n this.resizeIFrameToContent = function () {\r\n var contHeight = getContentDocHeight();\r\n //console.log(\"resizeIFrameToContent: \" + contHeight);\r\n\r\n self.setHeight(contHeight);\r\n\r\n self.showIFrame();\r\n };\r\n\r\n this.setHeight = function (height) {\r\n\r\n _$scaler.css(\"height\", height + \"px\");\r\n _$el.css(\"height\", height + \"px\");\r\n\r\n// _$iframe.css(\"height\", height + \"px\");\r\n };\r\n\r\n var _useCSSTransformToHideIframe = true;\r\n\r\n this.showIFrame = function () {\r\n\r\n _$iframe.css(\"visibility\", \"visible\");\r\n\r\n if (_useCSSTransformToHideIframe) {\r\n _$iframe.css(\"transform\", \"none\");\r\n\r\n var enable3D = false;\r\n var settings = _viewSettings;\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n enable3D = true;\r\n _$iframe.css(\"transform\", \"translateZ(0)\");\r\n }\r\n }\r\n else {\r\n _$iframe.css({left: \"0px\", top: \"0px\"});\r\n }\r\n };\r\n\r\n this.hideIFrame = function () {\r\n\r\n _$iframe.css(\"visibility\", \"hidden\");\r\n\r\n // With some books, despite the iframe and its containing div wrapper being hidden,\r\n // the iframe's contentWindow / contentDocument is still visible!\r\n // Thus why we translate the iframe out of view instead.\r\n\r\n if (_useCSSTransformToHideIframe) {\r\n var enable3D = false;\r\n var settings = _viewSettings;\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n enable3D = true;\r\n }\r\n\r\n var css = Helpers.CSSTransformString({left: \"10000\", top: \"10000\", enable3D: enable3D});\r\n _$iframe.css(css);\r\n }\r\n else {\r\n _$iframe.css({left: \"10000px\", top: \"10000px\"});\r\n }\r\n };\r\n\r\n function getContentDocHeight() {\r\n\r\n if (!_$iframe || !_$iframe.length) {\r\n return 0;\r\n }\r\n\r\n if (Helpers.isIframeAlive(_$iframe[0])) {\r\n var win = _$iframe[0].contentWindow;\r\n var doc = _$iframe[0].contentDocument;\r\n\r\n var height = Math.round(parseFloat(win.getComputedStyle(doc.documentElement).height)); //body can be shorter!\r\n return height;\r\n }\r\n else if (_$epubHtml) {\r\n console.error(\"getContentDocHeight ??\");\r\n\r\n var jqueryHeight = _$epubHtml.height();\r\n return jqueryHeight;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n // dir: 0 => new or same page, 1 => previous, 2 => next\r\n this.updatePageSwitchDir = function (dir, hasChanged) {\r\n _pageTransitionHandler.updatePageSwitchDir(dir, hasChanged);\r\n };\r\n\r\n\r\n this.transformContentImmediate = function (scale, left, top) {\r\n\r\n var elWidth = Math.ceil(_meta_size.width * scale);\r\n var elHeight = Math.floor(_meta_size.height * scale);\r\n\r\n _pageTransitionHandler.transformContentImmediate_BEGIN(_$el, scale, left, top);\r\n\r\n _$el.css(\"left\", left + \"px\");\r\n _$el.css(\"top\", top + \"px\");\r\n _$el.css(\"width\", elWidth + \"px\");\r\n _$el.css(\"height\", elHeight + \"px\");\r\n\r\n if (!_$epubHtml) {\r\n// debugger;\r\n return;\r\n }\r\n\r\n var enable3D = false;\r\n var settings = _viewSettings;\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n enable3D = true;\r\n }\r\n\r\n if (reader.needsFixedLayoutScalerWorkAround()) {\r\n var css1 = Helpers.CSSTransformString({scale: scale, enable3D: enable3D});\r\n _$epubHtml.css(css1);\r\n\r\n var css2 = Helpers.CSSTransformString({scale : 1, enable3D: enable3D});\r\n css2[\"width\"] = _meta_size.width * scale;\r\n css2[\"height\"] = _meta_size.height * scale;\r\n\r\n _$scaler.css(css2);\r\n }\r\n else {\r\n var css = Helpers.CSSTransformString({scale: scale, enable3D: enable3D});\r\n css[\"width\"] = _meta_size.width;\r\n css[\"height\"] = _meta_size.height;\r\n _$scaler.css(css);\r\n }\r\n\r\n // Chrome workaround: otherwise text is sometimes invisible (probably a rendering glitch due to the 3D transform graphics backend?)\r\n //_$epubHtml.css(\"visibility\", \"hidden\"); // \"flashing\" in two-page spread mode is annoying :(\r\n _$epubHtml.css(\"opacity\", \"0.999\");\r\n\r\n self.showIFrame();\r\n\r\n setTimeout(function () {\r\n //_$epubHtml.css(\"visibility\", \"visible\");\r\n _$epubHtml.css(\"opacity\", \"1\");\r\n }, 0);\r\n\r\n _pageTransitionHandler.transformContentImmediate_END(_$el, scale, left, top);\r\n };\r\n\r\n this.getCalculatedPageHeight = function () {\r\n return _$el.height();\r\n };\r\n\r\n this.transformContent = _.bind(_.debounce(this.transformContentImmediate, 50), self);\r\n\r\n function updateMetaSize() {\r\n\r\n _meta_size.width = 0;\r\n _meta_size.height = 0;\r\n\r\n var size = undefined;\r\n\r\n var isFallbackDimension = false;\r\n var widthPercent = undefined;\r\n var heightPercent = undefined;\r\n\r\n var contentDocument = _$iframe[0].contentDocument;\r\n\r\n // first try to read viewport size\r\n var content = $('meta[name=viewport]', contentDocument).attr(\"content\");\r\n\r\n // if not found try viewbox (used for SVG)\r\n if (!content) {\r\n content = $('meta[name=viewbox]', contentDocument).attr(\"content\");\r\n }\r\n\r\n if (content) {\r\n size = parseMetaSize(content);\r\n }\r\n\r\n if (!size) {\r\n\r\n //var $svg = $(contentDocument).find('svg');\r\n // if($svg.length > 0) {\r\n if (contentDocument && contentDocument.documentElement && contentDocument.documentElement.nodeName && contentDocument.documentElement.nodeName.toLowerCase() == \"svg\") {\r\n\r\n var width = undefined;\r\n var height = undefined;\r\n\r\n var wAttr = contentDocument.documentElement.getAttribute(\"width\");\r\n var isWidthPercent = wAttr && wAttr.length >= 1 && wAttr[wAttr.length - 1] == '%';\r\n if (wAttr) {\r\n try {\r\n width = parseInt(wAttr, 10);\r\n }\r\n catch (err) {}\r\n }\r\n if (width && isWidthPercent) {\r\n widthPercent = width;\r\n width = undefined;\r\n }\r\n\r\n var hAttr = contentDocument.documentElement.getAttribute(\"height\");\r\n var isHeightPercent = hAttr && hAttr.length >= 1 && hAttr[hAttr.length - 1] == '%';\r\n if (hAttr) {\r\n try {\r\n height = parseInt(hAttr, 10);\r\n }\r\n catch (err) {}\r\n }\r\n if (height && isHeightPercent) {\r\n heightPercent = height;\r\n height = undefined;\r\n }\r\n\r\n if (width && height) {\r\n size = {\r\n width: width,\r\n height: height\r\n }\r\n }\r\n else {\r\n /// DISABLED (not a satisfactory fallback)\r\n // content = $svg.attr('viewBox');\r\n // if(content) {\r\n // size = parseViewBoxSize(content);\r\n // }\r\n //\r\n // if (size) {\r\n // console.warn(\"Viewport SVG: using viewbox!\");\r\n // }\r\n }\r\n }\r\n }\r\n\r\n if (!size && _currentSpineItem) {\r\n content = _currentSpineItem.getRenditionViewport();\r\n\r\n if (content) {\r\n size = parseMetaSize(content);\r\n if (size) {\r\n console.log(\"Viewport: using rendition:viewport dimensions\");\r\n }\r\n }\r\n }\r\n\r\n if (!size) {\r\n // Image fallback (auto-generated HTML template when WebView / iFrame is fed with image media type)\r\n var $img = $(contentDocument).find('img');\r\n if ($img.length > 0) {\r\n size = {\r\n width: $img.width(),\r\n height: $img.height()\r\n };\r\n\r\n var isImage = _currentSpineItem && _currentSpineItem.media_type && _currentSpineItem.media_type.length && _currentSpineItem.media_type.indexOf(\"image/\") == 0;\r\n if (!isImage) {\r\n console.warn(\"Viewport: using img dimensions!\");\r\n }\r\n }\r\n else {\r\n $img = $(contentDocument).find('image');\r\n if ($img.length > 0) {\r\n var width = undefined;\r\n var height = undefined;\r\n\r\n var wAttr = $img[0].getAttribute(\"width\");\r\n if (wAttr) {\r\n try {\r\n width = parseInt(wAttr, 10);\r\n }\r\n catch (err) {}\r\n }\r\n var hAttr = $img[0].getAttribute(\"height\");\r\n if (hAttr) {\r\n try {\r\n height = parseInt(hAttr, 10);\r\n }\r\n catch (err) {}\r\n }\r\n\r\n\r\n if (width && height) {\r\n size = {\r\n width: width,\r\n height: height\r\n };\r\n\r\n isFallbackDimension = true;\r\n\r\n console.warn(\"Viewport: using image dimensions!\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!size) {\r\n // Not a great fallback, as it has the aspect ratio of the full window, but it is better than no display at all.\r\n width = _$viewport.width();\r\n height = _$viewport.height();\r\n\r\n // hacky method to determine the actual available horizontal space (half the two-page spread is a reasonable approximation, this means that whatever the size of the other iframe / one_page_view, the aspect ratio of this one exactly corresponds to half the viewport rendering surface)\r\n var isTwoPageSyntheticSpread = $(\"iframe.iframe-fixed\", _$viewport).length > 1;\r\n if (isTwoPageSyntheticSpread) width *= 0.5;\r\n\r\n // the original SVG width/height might have been specified as a percentage of the containing viewport\r\n if (widthPercent) {\r\n width *= (widthPercent / 100);\r\n }\r\n if (heightPercent) {\r\n height *= (heightPercent / 100);\r\n }\r\n\r\n size = {\r\n width: width,\r\n height: height\r\n };\r\n\r\n isFallbackDimension = true;\r\n\r\n console.warn(\"Viewport: using browser / e-reader viewport dimensions!\");\r\n }\r\n\r\n if (size) {\r\n _meta_size.width = size.width;\r\n _meta_size.height = size.height;\r\n\r\n // Not strictly necessary, let's preserve the percentage values\r\n // if (isFallbackDimension && contentDocument && contentDocument.documentElement && contentDocument.documentElement.nodeName && contentDocument.documentElement.nodeName.toLowerCase() == \"svg\") {\r\n // contentDocument.documentElement.setAttribute(\"width\", size.width + \"px\");\r\n // contentDocument.documentElement.setAttribute(\"height\", size.height + \"px\");\r\n // }\r\n }\r\n }\r\n\r\n //expected callback signature: function(success, $iframe, spineItem, isNewlyLoaded, context)\r\n this.loadSpineItem = function (spineItem, callback, context) {\r\n\r\n if (_currentSpineItem != spineItem) {\r\n\r\n _currentSpineItem = spineItem;\r\n var src = _spine.package.resolveRelativeUrl(spineItem.href);\r\n\r\n //if (spineItem && spineItem.isFixedLayout())\r\n if (true) // both fixed layout and reflowable documents need hiding due to flashing during layout/rendering\r\n {\r\n //hide iframe until content is scaled\r\n self.hideIFrame();\r\n }\r\n\r\n self.emit(OnePageView.SPINE_ITEM_OPEN_START, _$iframe, _currentSpineItem);\r\n _iframeLoader.loadIframe(_$iframe[0], src, function (success) {\r\n\r\n if (success && callback) {\r\n var func = function () {\r\n callback(success, _$iframe, _currentSpineItem, true, context);\r\n };\r\n\r\n if (Helpers.isIframeAlive(_$iframe[0])) {\r\n onIFrameLoad(success); // applies styles\r\n\r\n func();\r\n }\r\n else {\r\n console.error(\"onIFrameLoad !! doc && win + TIMEOUT\");\r\n console.debug(spineItem.href);\r\n\r\n onIFrameLoad(success);\r\n\r\n setTimeout(func, 500);\r\n }\r\n }\r\n else {\r\n onIFrameLoad(success);\r\n }\r\n\r\n }, self, {spineItem: _currentSpineItem});\r\n }\r\n else {\r\n if (callback) {\r\n callback(true, _$iframe, _currentSpineItem, false, context);\r\n }\r\n }\r\n };\r\n //\r\n // function parseViewBoxSize(viewBoxString) {\r\n //\r\n // var parts = viewBoxString.split(' ');\r\n //\r\n // if(parts.length < 4) {\r\n // console.warn(viewBoxString + \" value is not valid viewBox size\")\r\n // return undefined;\r\n // }\r\n //\r\n // var width = parseInt(parts[2]);\r\n // var height = parseInt(parts[3]);\r\n //\r\n // if(!isNaN(width) && !isNaN(height)) {\r\n // return { width: width, height: height} ;\r\n // }\r\n //\r\n // return undefined;\r\n // }\r\n\r\n function parseMetaSize(content) {\r\n\r\n var pairs = content.replace(/\\s/g, '').split(\",\");\r\n\r\n var dict = {};\r\n\r\n for (var i = 0; i < pairs.length; i++) {\r\n var nameVal = pairs[i].split(\"=\");\r\n if (nameVal.length == 2) {\r\n\r\n dict[nameVal[0]] = nameVal[1];\r\n }\r\n }\r\n\r\n var width = Number.NaN;\r\n var height = Number.NaN;\r\n\r\n if (dict[\"width\"]) {\r\n width = parseInt(dict[\"width\"]);\r\n }\r\n\r\n if (dict[\"height\"]) {\r\n height = parseInt(dict[\"height\"]);\r\n }\r\n\r\n if (!isNaN(width) && !isNaN(height)) {\r\n return {width: width, height: height};\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n this.getFirstVisibleElementCfi = function () {\r\n\r\n var navigation = new CfiNavigationLogic(_$el, _$iframe);\r\n return navigation.getFirstVisibleElementCfi(0);\r\n\r\n };\r\n\r\n this.getNavigator = function () {\r\n\r\n return new CfiNavigationLogic(_$el, _$iframe);\r\n };\r\n\r\n this.getElementByCfi = function (spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n if (spineItem != _currentSpineItem) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n var navigation = new CfiNavigationLogic(_$el, _$iframe);\r\n return navigation.getElementByCfi(cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n };\r\n\r\n this.getElementById = function (spineItem, id) {\r\n\r\n if (spineItem != _currentSpineItem) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n var navigation = new CfiNavigationLogic(_$el, _$iframe);\r\n return navigation.getElementById(id);\r\n };\r\n\r\n this.getElement = function (spineItem, selector) {\r\n\r\n if (spineItem != _currentSpineItem) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n var navigation = new CfiNavigationLogic(_$el, _$iframe);\r\n return navigation.getElement(selector);\r\n };\r\n\r\n this.getFirstVisibleMediaOverlayElement = function () {\r\n var navigation = new CfiNavigationLogic(_$el, _$iframe);\r\n return navigation.getFirstVisibleMediaOverlayElement({top: 0, bottom: _$iframe.height()});\r\n };\r\n\r\n this.offset = function () {\r\n if (_$iframe) {\r\n return _$iframe.offset();\r\n }\r\n return undefined;\r\n }\r\n};\r\n\r\nOnePageView.SPINE_ITEM_OPEN_START = \"SpineItemOpenStart\";\r\nreturn OnePageView;\r\n});\r\n\n", @@ -60,7 +61,7 @@ "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/views/media_overlay_element_highlighter',['jquery', 'rangy', 'readium_cfi_js'], function($, rangy, epubCfi) {\r\n/**\r\n *\r\n * @param reader\r\n * @constructor\r\n */\r\nvar MediaOverlayElementHighlighter = function(reader) {\r\n\r\n this.includeParWhenAdjustingToSeqSyncGranularity = true;\r\n\r\n var DEFAULT_MO_ACTIVE_CLASS = \"mo-active-default\";\r\n var DEFAULT_MO_SUB_SYNC_CLASS = \"mo-sub-sync\";\r\n \r\n //var BACK_COLOR = \"#99CCCC\";\r\n\r\n var _highlightedElementPar = undefined;\r\n this.isElementHighlighted = function(par)\r\n {\r\n return _highlightedElementPar && par === _highlightedElementPar;\r\n };\r\n \r\n var _highlightedCfiPar = undefined;\r\n this.isCfiHighlighted = function(par)\r\n {\r\n return _highlightedCfiPar && par === _highlightedCfiPar;\r\n };\r\n\r\n var _activeClass = \"\";\r\n var _playbackActiveClass = \"\";\r\n\r\n var _reader = reader;\r\n \r\n var USE_RANGY = true && (typeof rangy !== \"undefined\");\r\n var _rangyCSS = undefined;\r\n var _rangyRange = undefined;\r\n \r\n var HIGHLIGHT_ID = \"MO_SPEAK\";\r\n \r\n var self = this;\r\n\r\n var $userStyle = undefined;\r\n \r\n this.reDo = function()\r\n {\r\n //this.reset();\r\n \r\n if ($userStyle)\r\n {\r\n $userStyle.remove();\r\n }\r\n $userStyle = undefined;\r\n\r\n var he = _highlightedElementPar;\r\n var hc = _highlightedCfiPar;\r\n var c1 = _activeClass;\r\n var c2 = _playbackActiveClass;\r\n \r\n if (_highlightedElementPar)\r\n {\r\n this.reset();\r\n\r\n this.highlightElement(he, c1, c2);\r\n }\r\n else if (_highlightedCfiPar)\r\n {\r\n this.reset();\r\n\r\n this.highlightCfi(hc, c1, c2);\r\n }\r\n };\r\n\r\n function ensureUserStyle($element, hasAuthorStyle, overrideWithUserStyle)\r\n {\r\n if ($userStyle)\r\n {\r\n try\r\n {\r\n if ($userStyle[0].ownerDocument === $element[0].ownerDocument)\r\n {\r\n return;\r\n }\r\n }\r\n catch (e)\r\n {\r\n \r\n }\r\n }\r\n\r\n\r\n $head = $(\"head\", $element[0].ownerDocument.documentElement);\r\n\r\n $userStyle = $(\"\");\r\n\r\n $userStyle.append(\".\" + DEFAULT_MO_ACTIVE_CLASS + \" {\");\r\n \r\n var fallbackUserStyle = \"background-color: yellow !important; color: black !important; border-radius: 0.4em;\";\r\n \r\n var style = overrideWithUserStyle; //_reader.userStyles().findStyle(\".\" + DEFAULT_MO_ACTIVE_CLASS);\r\n if (style)\r\n {\r\n var atLeastOne = false;\r\n for(var prop in style.declarations)\r\n {\r\n if(!style.declarations.hasOwnProperty(prop))\r\n {\r\n continue;\r\n }\r\n\r\n atLeastOne = true;\r\n $userStyle.append(prop + \": \" + style.declarations[prop] + \"; \");\r\n }\r\n \r\n if (!atLeastOne && !hasAuthorStyle)\r\n {\r\n $userStyle.append(fallbackUserStyle);\r\n }\r\n }\r\n else if (!hasAuthorStyle)\r\n {\r\n $userStyle.append(fallbackUserStyle);\r\n }\r\n \r\n $userStyle.append(\"}\");\r\n \r\n \r\n // ---- CFI\r\n //$userStyle.append(\" .highlight {background-color: blue; border: 2x solid green;}\"); //.hover-highlight\r\n \r\n \r\n $userStyle.appendTo($head);\r\n\r\n//console.debug($userStyle[0].textContent);\r\n };\r\n \r\n this.highlightElement = function(par, activeClass, playbackActiveClass) {\r\n\r\n if(!par || par === _highlightedElementPar) {\r\n return;\r\n }\r\n\r\n this.reset();\r\n\r\n _highlightedElementPar = par;\r\n _highlightedCfiPar = undefined;\r\n \r\n _activeClass = activeClass;\r\n _playbackActiveClass = playbackActiveClass;\r\n\r\n var seq = this.adjustParToSeqSyncGranularity(_highlightedElementPar);\r\n var element = seq.element;\r\n \r\n if (_playbackActiveClass && _playbackActiveClass !== \"\")\r\n {\r\n //console.debug(\"MO playbackActiveClass: \" + _playbackActiveClass);\r\n $(element.ownerDocument.documentElement).addClass(_playbackActiveClass);\r\n //console.debug(\"MO playbackActiveClass 2: \" + element.ownerDocument.documentElement.classList);\r\n }\r\n\r\n var $hel = $(element);\r\n\r\n var hasAuthorStyle = _activeClass && _activeClass !== \"\";\r\n var overrideWithUserStyle = _reader.userStyles().findStyle(\".\" + DEFAULT_MO_ACTIVE_CLASS);\r\n\r\n ensureUserStyle($hel, hasAuthorStyle, overrideWithUserStyle);\r\n \r\n if (overrideWithUserStyle || !hasAuthorStyle)\r\n {\r\n //console.debug(\"MO active NO CLASS: \" + _activeClass);\r\n\r\n if (hasAuthorStyle)\r\n {\r\n $hel.addClass(_activeClass);\r\n }\r\n \r\n $hel.addClass(DEFAULT_MO_ACTIVE_CLASS);\r\n\r\n //$(element).css(\"background\", BACK_COLOR);\r\n }\r\n else\r\n {\r\n //console.debug(\"MO activeClass: \" + _activeClass);\r\n $hel.addClass(_activeClass);\r\n }\r\n \r\n if (this.includeParWhenAdjustingToSeqSyncGranularity || _highlightedElementPar !== seq)\r\n {\r\n $(_highlightedElementPar.element).addClass(DEFAULT_MO_SUB_SYNC_CLASS);\r\n }\r\n \r\n// ---- CFI\r\n// try\r\n// {\r\n// // //noinspection JSUnresolvedVariable\r\n// // var cfi = EPUBcfi.Generator.generateElementCFIComponent(element); //$hel[0]\r\n// // if(cfi[0] == \"!\") {\r\n// // cfi = cfi.substring(1);\r\n// // }\r\n// \r\n// //console.log(element);\r\n// \r\n// var firstTextNode = getFirstTextNode(element);\r\n// var txtFirst = firstTextNode.textContent;\r\n// //console.log(txtFirst);\r\n// \r\n// var lastTextNode = getLastTextNode(element);\r\n// var txtLast = lastTextNode.textContent;\r\n// //console.log(txtLast);\r\n// \r\n// var cfi = EPUBcfi.Generator.generateCharOffsetRangeComponent(\r\n// firstTextNode, \r\n// 0, \r\n// lastTextNode, \r\n// txtLast.length,\r\n// [\"cfi-marker\"],\r\n// [],\r\n// [\"MathJax_Message\"]\r\n// );\r\n// \r\n// var id = $hel.data(\"mediaOverlayData\").par.getSmil().spineItemId;\r\n// _reader.addHighlight(id, cfi, HIGHLIGHT_ID,\r\n// \"highlight\", //\"underline\"\r\n// undefined // styles\r\n// );\r\n// }\r\n// catch(error)\r\n// {\r\n// console.error(error);\r\n// \r\n// removeHighlight();\r\n// }\r\n };\r\n \r\n this.highlightCfi = function(par, activeClass, playbackActiveClass) {\r\n\r\n if(!par || par === _highlightedCfiPar) {\r\n return;\r\n }\r\n\r\n this.reset();\r\n\r\n _highlightedElementPar = undefined;\r\n _highlightedCfiPar = par;\r\n \r\n _activeClass = activeClass;\r\n _playbackActiveClass = playbackActiveClass;\r\n\r\n var $hel = $(_highlightedCfiPar.cfi.cfiTextParent);\r\n\r\n var hasAuthorStyle = _activeClass && _activeClass !== \"\";\r\n var overrideWithUserStyle = _reader.userStyles().findStyle(\".\" + DEFAULT_MO_ACTIVE_CLASS); // TODO: performance issue?\r\n\r\n ensureUserStyle($hel, hasAuthorStyle, overrideWithUserStyle);\r\n\r\n var clazz = (overrideWithUserStyle || !hasAuthorStyle) ? ((hasAuthorStyle ? (_activeClass + \" \") : \"\") + DEFAULT_MO_ACTIVE_CLASS) : _activeClass;\r\n\r\n if (USE_RANGY)\r\n {\r\n var doc = _highlightedCfiPar.cfi.cfiTextParent.ownerDocument;\r\n\r\n _rangyRange = rangy.createRange(doc); //createNativeRange\r\n\r\n var startCFI = \"epubcfi(\" + _highlightedCfiPar.cfi.partialStartCfi + \")\";\r\n var infoStart = EPUBcfi.getTextTerminusInfoWithPartialCFI(startCFI, doc,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n//console.log(infoStart);\r\n\r\n var endCFI = \"epubcfi(\" + _highlightedCfiPar.cfi.partialEndCfi + \")\";\r\n var infoEnd = EPUBcfi.getTextTerminusInfoWithPartialCFI(endCFI, doc,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n//console.log(infoEnd);\r\n \r\n _rangyRange.setStartAndEnd(\r\n infoStart.textNode[0], infoStart.textOffset,\r\n infoEnd.textNode[0], infoEnd.textOffset\r\n );\r\n \r\n if (false && // we use CssClassApplier instead, because surroundContents() has no trivial undoSurroundContents() function (inc. text nodes normalisation, etc.)\r\n _rangyRange.canSurroundContents())\r\n {\r\n _rangyRange.MO_createCssClassApplier = false;\r\n \r\n var span = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", 'span');\r\n span.id = HIGHLIGHT_ID;\r\n span.setAttribute(\"id\", span.id);\r\n span.setAttribute(\"class\", clazz + \" mo-cfi-highlight\");\r\n \r\n _rangyRange.surroundContents(span);\r\n }\r\n else\r\n {\r\n _rangyRange.MO_createCssClassApplier = true;\r\n \r\n if (!_rangyCSS || _rangyCSS.cssClass !== clazz)\r\n {\r\n _rangyCSS = rangy.createCssClassApplier(clazz,\r\n {\r\n elementTagName: \"span\",\r\n elementProperties: {className: \"mo-cfi-highlight\"},\r\n ignoreWhiteSpace: true,\r\n applyToEditableOnly: false,\r\n normalize: true\r\n },\r\n [\"span\"]);\r\n }\r\n\r\n _rangyCSS.applyToRange(_rangyRange);\r\n }\r\n }\r\n else if (_reader.plugins.annotations)\r\n {\r\n try\r\n {\r\n //var id = $hel.data(\"mediaOverlayData\").par.getSmil().spineItemId;\r\n var id = par.getSmil().spineItemId;\r\n _reader.plugins.annotations.addHighlight(id, par.cfi.partialRangeCfi, HIGHLIGHT_ID,\r\n \"highlight\", //\"underline\"\r\n undefined // styles\r\n );\r\n }\r\n catch(error)\r\n {\r\n console.error(error);\r\n }\r\n }\r\n };\r\n \r\n// ---- CFI\r\n// \r\n// function getFirstTextNode(node)\r\n// {\r\n// if (node.nodeType === Node.TEXT_NODE)\r\n// {\r\n// if (node.textContent.trim().length > 0)\r\n// return node;\r\n// }\r\n// \r\n// for (var i = 0; i < node.childNodes.length; i++)\r\n// {\r\n// var child = node.childNodes[i];\r\n// var first = getFirstTextNode(child);\r\n// if (first)\r\n// {\r\n// return first;\r\n// }\r\n// }\r\n// \r\n// return undefined;\r\n// }\r\n// \r\n// function getLastTextNode(node)\r\n// {\r\n// if (node.nodeType === Node.TEXT_NODE)\r\n// {\r\n// if (node.textContent.trim().length > 0)\r\n// return node;\r\n// }\r\n// \r\n// for (var i = node.childNodes.length-1; i >= 0; i--)\r\n// {\r\n// var child = node.childNodes[i];\r\n// var last = getLastTextNode(child);\r\n// if (last)\r\n// {\r\n// return last;\r\n// }\r\n// }\r\n// \r\n// return undefined;\r\n// }\r\n// \r\n\r\n this.reset = function() {\r\n \r\n if (_highlightedCfiPar)\r\n {\r\n var doc = _highlightedCfiPar.cfi.cfiTextParent.ownerDocument;\r\n if (USE_RANGY)\r\n {\r\n if (_rangyCSS && _rangyRange.MO_createCssClassApplier)\r\n {\r\n _rangyCSS.undoToRange(_rangyRange);\r\n }\r\n else\r\n {\r\n var toRemove = undefined;\r\n while ((toRemove = doc.getElementById(HIGHLIGHT_ID)) !== null)\r\n {\r\n var txt = toRemove.textContent; // TODO: innerHTML? or better: hasChildNodes loop + detach and re-attach\r\n var txtNode = doc.createTextNode(txt);\r\n \r\n toRemove.parentNode.replaceChild(txtNode, toRemove);\r\n txtNode.parentNode.normalize();\r\n }\r\n }\r\n \r\n //_rangyCSS = undefined;\r\n _rangyRange = undefined;\r\n }\r\n else if (_reader.plugins.annotations)\r\n {\r\n try\r\n {\r\n _reader.plugins.annotations.removeHighlight(HIGHLIGHT_ID);\r\n \r\n var toRemove = undefined;\r\n while ((toRemove = doc.getElementById(\"start-\" + HIGHLIGHT_ID)) !== null)\r\n {\r\n console.log(\"toRemove START\");\r\n console.log(toRemove);\r\n toRemove.parentNode.removeChild(toRemove);\r\n }\r\n while ((toRemove = doc.getElementById(\"end-\" + HIGHLIGHT_ID)) !== null)\r\n {\r\n console.log(\"toRemove END\");\r\n console.log(toRemove);\r\n toRemove.parentNode.removeChild(toRemove);\r\n }\r\n }\r\n catch(error)\r\n {\r\n console.error(error);\r\n }\r\n }\r\n \r\n _highlightedCfiPar = undefined;\r\n }\r\n \r\n \r\n \r\n\r\n if(_highlightedElementPar) {\r\n\r\n var seq = this.adjustParToSeqSyncGranularity(_highlightedElementPar);\r\n var element = seq.element;\r\n if (this.includeParWhenAdjustingToSeqSyncGranularity || _highlightedElementPar !== seq)\r\n {\r\n $(_highlightedElementPar.element).removeClass(DEFAULT_MO_SUB_SYNC_CLASS);\r\n }\r\n \r\n if (_playbackActiveClass && _playbackActiveClass !== \"\")\r\n {\r\n //console.debug(\"MO RESET playbackActiveClass: \" + _playbackActiveClass);\r\n $(element.ownerDocument.documentElement).removeClass(_playbackActiveClass);\r\n }\r\n\r\n if (_activeClass && _activeClass !== \"\")\r\n {\r\n //console.debug(\"MO RESET activeClass: \" + _activeClass);\r\n $(element).removeClass(_activeClass);\r\n }\r\n //else\r\n //{\r\n //console.debug(\"MO RESET active NO CLASS: \" + _activeClass);\r\n $(element).removeClass(DEFAULT_MO_ACTIVE_CLASS);\r\n //$(element).css(\"background\", '');\r\n //}\r\n\r\n _highlightedElementPar = undefined;\r\n }\r\n\r\n _activeClass = \"\";\r\n _playbackActiveClass = \"\";\r\n };\r\n\r\n this.adjustParToSeqSyncGranularity = function(par)\r\n {\r\n if (!par) return undefined;\r\n \r\n var sync = _reader.viewerSettings().mediaOverlaysSynchronizationGranularity;\r\n if (sync && sync.length > 0)\r\n {\r\n var element = par.element || (par.cfi ? par.cfi.cfiTextParent : undefined);\r\n if (!element)\r\n {\r\n console.error(\"adjustParToSeqSyncGranularity !element ???\");\r\n return par; // should never happen!\r\n }\r\n\r\n var seq = par.getFirstSeqAncestorWithEpubType(sync, this.includeParWhenAdjustingToSeqSyncGranularity);\r\n if (seq && seq.element)\r\n {\r\n return seq;\r\n }\r\n }\r\n \r\n return par;\r\n };\r\n};\r\n return MediaOverlayElementHighlighter;\r\n});\r\n\n", "// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\ndefine('readium_shared_js/views/scroll_view',[\"jquery\", \"underscore\", \"eventEmitter\", \"../models/bookmark_data\", \"../models/current_pages_info\", \"../helpers\",\r\n \"./one_page_view\", \"../models/page_open_request\", \"../globals\", \"../models/viewer_settings\"],\r\n function ($, _, EventEmitter, BookmarkData, CurrentPagesInfo, Helpers,\r\n OnePageView, PageOpenRequest, Globals, ViewerSettings) {\r\n/**\r\n * Renders content inside a scrollable view port\r\n * @param options\r\n * @param isContinuousScroll\r\n * @param reader\r\n * @constructor\r\n */\r\nvar ScrollView = function (options, isContinuousScroll, reader) {\r\n\r\n var _DEBUG = false;\r\n\r\n $.extend(this, new EventEmitter());\r\n\r\n var SCROLL_MARGIN_TO_SHOW_LAST_VISBLE_LINE = 5;\r\n var ITEM_LOAD_SCROLL_BUFFER = 2000;\r\n var ON_SCROLL_TIME_DALAY = 300;\r\n\r\n var self = this;\r\n\r\n var _$viewport = options.$viewport;\r\n var _spine = options.spine;\r\n var _userStyles = options.userStyles;\r\n var _deferredPageRequest;\r\n var _$contentFrame;\r\n var _$el;\r\n\r\n var _stopTransientViewUpdate = false;\r\n\r\n //this flags used to prevent onScroll event triggering pagination changed when internal layout modifications happens\r\n //if we trigger pagination change without reference to the original request that started the change - we brake the\r\n //Media Overlay bechaviyour\r\n //We can't reuse same flag for all of this action because this actions mey happen in parallel\r\n var _isPerformingLayoutModifications = false; //performing asynch actions that may trigger onScroll;\r\n var _isSettingScrollPosition = false; //this happens when we set scroll position based on open element request\r\n var _isLoadingNewSpineItemOnPageRequest = false; //\r\n\r\n this.isContinuousScroll = function () {\r\n return isContinuousScroll;\r\n };\r\n\r\n this.render = function () {\r\n\r\n var template = Helpers.loadTemplate(\"scrolled_book_frame\", {});\r\n\r\n _$el = $(template);\r\n _$viewport.append(_$el);\r\n\r\n _$contentFrame = $(\"#scrolled-content-frame\", _$el);\r\n _$contentFrame.css(\"overflow\", \"\");\r\n _$contentFrame.css(\"overflow-y\", \"auto\");\r\n _$contentFrame.css(\"overflow-x\", \"hidden\");\r\n _$contentFrame.css(\"-webkit-overflow-scrolling\", \"touch\");\r\n _$contentFrame.css(\"width\", \"100%\");\r\n _$contentFrame.css(\"height\", \"100%\");\r\n _$contentFrame.css(\"position\", \"relative\");\r\n\r\n var settings = reader.viewerSettings();\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\")\r\n {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n // This is a necessary counterpart for the same CSS GPU hardware acceleration trick in one_page_view.js\r\n // This affects the stacking order and re-enables the scrollbar in Safari (works fine in Chrome otherwise)\r\n _$contentFrame.css(\"transform\", \"translateZ(0)\");\r\n }\r\n\r\n // _$contentFrame.css(\"box-sizing\", \"border-box\");\r\n // _$contentFrame.css(\"border\", \"20px solid red\");\r\n\r\n self.applyStyles();\r\n\r\n var lazyScroll = _.debounce(onScroll, ON_SCROLL_TIME_DALAY);\r\n\r\n _$contentFrame.on('scroll', function (e) {\r\n lazyScroll(e);\r\n onScrollDirect();\r\n });\r\n\r\n return self;\r\n };\r\n\r\n function updateLoadedViewsTop(callback, assertScrollPosition) {\r\n\r\n if (_stopTransientViewUpdate) {\r\n callback();\r\n return;\r\n }\r\n\r\n var viewPage = firstLoadedView();\r\n if (!viewPage) {\r\n callback();\r\n return;\r\n }\r\n\r\n var viewPortRange = getVisibleRange(0);\r\n var firstViewRange = getPageViewRange(viewPage);\r\n\r\n if ((viewPortRange.top - firstViewRange.bottom) > ITEM_LOAD_SCROLL_BUFFER) {\r\n var scrollPos = scrollTop();\r\n removePageView(viewPage);\r\n scrollTo(scrollPos - (firstViewRange.bottom - firstViewRange.top), undefined);\r\n assertScrollPosition(\"updateLoadedViewsTop 1\");\r\n updateLoadedViewsTop(callback, assertScrollPosition); //recursion\r\n }\r\n else if ((viewPortRange.top - firstViewRange.top) < ITEM_LOAD_SCROLL_BUFFER) {\r\n addToTopOf(viewPage, function (isElementAdded) {\r\n if (isElementAdded) {\r\n assertScrollPosition(\"updateLoadedViewsTop 2\");\r\n updateLoadedViewsTop(callback, assertScrollPosition); //recursion\r\n }\r\n else {\r\n callback();\r\n }\r\n });\r\n }\r\n else {\r\n callback();\r\n }\r\n\r\n }\r\n\r\n function updateLoadedViewsBottom(callback, assertScrollPosition) {\r\n\r\n if (_stopTransientViewUpdate) {\r\n callback();\r\n return;\r\n }\r\n\r\n var viewPage = lastLoadedView();\r\n if (!viewPage) {\r\n callback();\r\n return;\r\n }\r\n\r\n var viewPortRange = getVisibleRange(0);\r\n var lastViewRange = getPageViewRange(viewPage);\r\n\r\n if ((lastViewRange.top - viewPortRange.bottom) > ITEM_LOAD_SCROLL_BUFFER) {\r\n removePageView(viewPage);\r\n assertScrollPosition(\"updateLoadedViewsBottom 1\");\r\n updateLoadedViewsBottom(callback, assertScrollPosition); //recursion\r\n }\r\n else if ((lastViewRange.bottom - viewPortRange.bottom) < ITEM_LOAD_SCROLL_BUFFER) {\r\n addToBottomOf(viewPage, function (newPageLoaded) {\r\n assertScrollPosition(\"updateLoadedViewsBottom 2\");\r\n if (newPageLoaded) {\r\n updateLoadedViewsBottom(callback, assertScrollPosition); //recursion\r\n }\r\n else {\r\n callback();\r\n }\r\n });\r\n }\r\n else {\r\n callback();\r\n }\r\n\r\n }\r\n\r\n function updateTransientViews(pageView) {\r\n\r\n if (!isContinuousScroll) {\r\n return;\r\n }\r\n\r\n var scrollPosBefore = undefined;\r\n if (_DEBUG)\r\n {\r\n if (pageView)\r\n {\r\n var offset = pageView.offset();\r\n if (offset) scrollPosBefore = offset.top;\r\n }\r\n }\r\n\r\n // This function double-checks whether the browser has shifted the scroll position because of unforeseen rendering issues.\r\n // (this should never happen because we handle scroll adjustments during iframe height resizes explicitely in this code)\r\n var assertScrollPosition = function(msg)\r\n {\r\n if (_DEBUG)\r\n {\r\n if (!scrollPosBefore) return;\r\n var scrollPosAfter = undefined;\r\n\r\n var offset = pageView.offset();\r\n if (offset) scrollPosAfter = offset.top;\r\n\r\n if (!scrollPosAfter) return;\r\n\r\n var diff = scrollPosAfter - scrollPosBefore;\r\n if (Math.abs(diff) > 1)\r\n {\r\n console.debug(\"@@@@@@@@@@@@@@@ SCROLL ADJUST (\" + msg + \") \" + diff + \" -- \" + pageView.currentSpineItem().href);\r\n //_$contentFrame[0].scrollTop = _$contentFrame[0].scrollTop + diff;\r\n }\r\n }\r\n };\r\n\r\n _isPerformingLayoutModifications = true;\r\n updateLoadedViewsBottom(function () {\r\n updateLoadedViewsTop(function () {\r\n setTimeout(function () {\r\n _isPerformingLayoutModifications = false;\r\n }, ON_SCROLL_TIME_DALAY + 100);\r\n }, assertScrollPosition);\r\n }, assertScrollPosition);\r\n }\r\n\r\n var _mediaOverlaysWasPlayingLastTimeScrollStarted = false;\r\n\r\n function onScrollDirect(e)\r\n {\r\n var settings = reader.viewerSettings();\r\n if (!settings.mediaOverlaysPreservePlaybackWhenScroll)\r\n {\r\n if (!_mediaOverlaysWasPlayingLastTimeScrollStarted && reader.isMediaOverlayAvailable())\r\n {\r\n _mediaOverlaysWasPlayingLastTimeScrollStarted = reader.isPlayingMediaOverlay();\r\n if (_mediaOverlaysWasPlayingLastTimeScrollStarted)\r\n {\r\n reader.pauseMediaOverlay();\r\n }\r\n }\r\n }\r\n }\r\n\r\n function onScroll(e)\r\n {\r\n if ( !_isPerformingLayoutModifications\r\n && !_isSettingScrollPosition\r\n && !_isLoadingNewSpineItemOnPageRequest) {\r\n\r\n updateTransientViews();\r\n onPaginationChanged(self);\r\n\r\n var settings = reader.viewerSettings();\r\n if (!settings.mediaOverlaysPreservePlaybackWhenScroll)\r\n {\r\n if (_mediaOverlaysWasPlayingLastTimeScrollStarted)\r\n {\r\n setTimeout(function()\r\n {\r\n reader.playMediaOverlay();\r\n _mediaOverlaysWasPlayingLastTimeScrollStarted = false;\r\n }, 100);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function scrollTo(offset, pageRequest) {\r\n\r\n _$contentFrame[0].scrollTop = offset;\r\n\r\n if (pageRequest) {\r\n onPaginationChanged(pageRequest.initiator, pageRequest.spineItem, pageRequest.elementId);\r\n }\r\n }\r\n\r\n function updatePageViewSizeAndAdjustScroll(pageView)\r\n {\r\n var scrollPos = scrollTop();\r\n var rangeBeforeResize = getPageViewRange(pageView);\r\n\r\n updatePageViewSize(pageView);\r\n\r\n var rangeAfterResize = getPageViewRange(pageView);\r\n\r\n var heightAfter = rangeAfterResize.bottom - rangeAfterResize.top;\r\n var heightBefore = rangeBeforeResize.bottom - rangeBeforeResize.top;\r\n\r\n var delta = heightAfter - heightBefore;\r\n\r\n if (Math.abs(delta) > 0)\r\n {\r\n if (_DEBUG)\r\n {\r\n console.debug(\"IMMEDIATE SCROLL ADJUST: \" + pageView.currentSpineItem().href + \" == \" + delta);\r\n }\r\n scrollTo(scrollPos + delta);\r\n }\r\n }\r\n\r\n function reachStableContentHeight(updateScroll, pageView, iframe, href, fixedLayout, metaWidth, msg, callback)\r\n {\r\n if (!Helpers.isIframeAlive(iframe))\r\n {\r\n if (_DEBUG)\r\n {\r\n console.log(\"reachStableContentHeight ! win && doc (iFrame disposed?)\");\r\n }\r\n\r\n if (callback) callback(false);\r\n return;\r\n }\r\n\r\n var MAX_ATTEMPTS = 10;\r\n var TIME_MS = 300;\r\n\r\n var w = iframe.contentWindow;\r\n var d = iframe.contentDocument;\r\n\r\n var previousPolledContentHeight = parseInt(Math.round(parseFloat(w.getComputedStyle(d.documentElement).height))); //body can be shorter!;\r\n\r\n var initialContentHeight = previousPolledContentHeight;\r\n\r\n if (updateScroll === 0)\r\n {\r\n updatePageViewSizeAndAdjustScroll(pageView);\r\n }\r\n else\r\n {\r\n updatePageViewSize(pageView);\r\n }\r\n\r\n var tryAgainFunc = function(tryAgain)\r\n {\r\n if (_DEBUG && tryAgain !== MAX_ATTEMPTS)\r\n {\r\n console.log(\"tryAgainFunc - \" + tryAgain + \": \" + href + \" <\" + initialContentHeight +\" -- \"+ previousPolledContentHeight + \">\");\r\n }\r\n\r\n tryAgain--;\r\n if (tryAgain < 0)\r\n {\r\n if (_DEBUG)\r\n {\r\n console.error(\"tryAgainFunc abort: \" + href);\r\n }\r\n\r\n if (callback) callback(true);\r\n return;\r\n }\r\n\r\n setTimeout(function()\r\n {\r\n try\r\n {\r\n if (Helpers.isIframeAlive(iframe))\r\n {\r\n var win = iframe.contentWindow;\r\n var doc = iframe.contentDocument;\r\n\r\n var iframeHeight = parseInt(Math.round(parseFloat(window.getComputedStyle(iframe).height)));\r\n\r\n var docHeight = parseInt(Math.round(parseFloat(win.getComputedStyle(doc.documentElement).height))); //body can be shorter!\r\n\r\n if (previousPolledContentHeight !== docHeight)\r\n {\r\n previousPolledContentHeight = docHeight;\r\n\r\n tryAgainFunc(tryAgain);\r\n return;\r\n }\r\n\r\n // CONTENT HEIGHT IS NOW STABILISED\r\n\r\n var diff = iframeHeight - docHeight;\r\n if (Math.abs(diff) > 4)\r\n {\r\n if (_DEBUG)\r\n {\r\n console.log(\"$$$ IFRAME HEIGHT ADJUST: \" + href + \" [\" + diff + \"]<\" + initialContentHeight + \" -- \" + previousPolledContentHeight + \">\");\r\n console.log(msg);\r\n }\r\n\r\n if (updateScroll === 0)\r\n {\r\n updatePageViewSizeAndAdjustScroll(pageView);\r\n }\r\n else\r\n {\r\n updatePageViewSize(pageView);\r\n }\r\n\r\n if (Helpers.isIframeAlive(iframe))\r\n {\r\n var win = iframe.contentWindow;\r\n var doc = iframe.contentDocument;\r\n\r\n var docHeightAfter = parseInt(Math.round(parseFloat(win.getComputedStyle(doc.documentElement).height))); //body can be shorter!\r\n var iframeHeightAfter = parseInt(Math.round(parseFloat(window.getComputedStyle(iframe).height)));\r\n\r\n var newdiff = iframeHeightAfter - docHeightAfter;\r\n if (Math.abs(newdiff) > 4)\r\n {\r\n if (_DEBUG)\r\n {\r\n console.error(\"## IFRAME HEIGHT ADJUST: \" + href + \" [\" + newdiff + \"]<\" + initialContentHeight + \" -- \"+ previousPolledContentHeight + \">\");\r\n console.log(msg);\r\n }\r\n\r\n tryAgainFunc(tryAgain);\r\n return;\r\n }\r\n else\r\n {\r\n if (_DEBUG)\r\n {\r\n console.log(\">> IFRAME HEIGHT ADJUSTED OKAY: \" + href + \" [\"+diff+\"]<\" + initialContentHeight + \" -- \" + previousPolledContentHeight + \">\");\r\n // console.log(msg);\r\n }\r\n }\r\n }\r\n else\r\n {\r\n if (_DEBUG)\r\n {\r\n console.log(\"tryAgainFunc ! win && doc (iFrame disposed?)\");\r\n }\r\n\r\n if (callback) callback(false);\r\n return;\r\n }\r\n }\r\n else\r\n {\r\n //if (_DEBUG)\r\n // console.debug(\"IFRAME HEIGHT NO NEED ADJUST: \" + href);\r\n // console.log(msg);\r\n }\r\n }\r\n else\r\n {\r\n if (_DEBUG)\r\n {\r\n console.log(\"tryAgainFunc ! win && doc (iFrame disposed?)\");\r\n }\r\n\r\n if (callback) callback(false);\r\n return;\r\n }\r\n }\r\n catch(ex)\r\n {\r\n console.error(ex);\r\n\r\n if (callback) callback(false);\r\n return;\r\n }\r\n\r\n if (callback) callback(true);\r\n\r\n }, TIME_MS);\r\n };\r\n\r\n tryAgainFunc(MAX_ATTEMPTS);\r\n }\r\n\r\n\r\n function addToTopOf(topView, callback) {\r\n\r\n var prevSpineItem = _spine.prevItem(topView.currentSpineItem(), true);\r\n if (!prevSpineItem) {\r\n callback(false);\r\n return;\r\n }\r\n\r\n var tmpView = createPageViewForSpineItem(true);\r\n\r\n // add to the end first to avoid scrolling during load\r\n var lastView = lastLoadedView();\r\n tmpView.element().insertAfter(lastView.element());\r\n\r\n tmpView.loadSpineItem(prevSpineItem, function (success, $iframe, spineItem, isNewlyLoaded, context) {\r\n if (success) {\r\n\r\n updatePageViewSize(tmpView);\r\n var range = getPageViewRange(tmpView);\r\n\r\n removePageView(tmpView);\r\n\r\n\r\n var scrollPos = scrollTop();\r\n\r\n var newView = createPageViewForSpineItem();\r\n var originalHeight = range.bottom - range.top;\r\n\r\n\r\n newView.setHeight(originalHeight);\r\n // iframe is loaded hidden here\r\n //this.showIFrame();\r\n //===> not necessary here (temporary iframe)\r\n\r\n newView.element().insertBefore(topView.element());\r\n\r\n scrollPos = scrollPos + originalHeight;\r\n\r\n scrollTo(scrollPos, undefined);\r\n\r\n newView.loadSpineItem(prevSpineItem, function (success, $iframe, spineItem, isNewlyLoaded, context) {\r\n if (success) {\r\n\r\n var continueCallback = function (successFlag)\r\n {\r\n onPageViewLoaded(newView, success, $iframe, spineItem, isNewlyLoaded, context);\r\n\r\n callback(successFlag);\r\n };\r\n\r\n reachStableContentHeight(0, newView, $iframe[0], spineItem.href, spineItem.isFixedLayout(), spineItem.isFixedLayout() ? newView.meta_width() : 0, \"addToTopOf\", continueCallback); // //onIFrameLoad called before this callback, so okay.\r\n }\r\n else {\r\n console.error(\"Unable to open 2 \" + prevSpineItem.href);\r\n removePageView(newView);\r\n callback(false);\r\n }\r\n\r\n });\r\n }\r\n else {\r\n console.error(\"Unable to open 1 \" + prevSpineItem.href);\r\n removePageView(tmpView);\r\n callback(false);\r\n }\r\n\r\n });\r\n }\r\n\r\n function updatePageViewSize(pageView) {\r\n\r\n if (pageView.currentSpineItem().isFixedLayout()) {\r\n pageView.scaleToWidth(_$contentFrame.width());\r\n }\r\n else {\r\n pageView.resizeIFrameToContent();\r\n }\r\n }\r\n\r\n function addToBottomOf(bottomView, callback) {\r\n\r\n var nexSpineItem = _spine.nextItem(bottomView.currentSpineItem(), true);\r\n if (!nexSpineItem) {\r\n callback(false);\r\n return;\r\n }\r\n\r\n var scrollPos = scrollTop();\r\n\r\n var newView = createPageViewForSpineItem();\r\n newView.element().insertAfter(bottomView.element());\r\n\r\n newView.loadSpineItem(nexSpineItem, function (success, $iframe, spineItem, isNewlyLoaded, context) {\r\n if (success) {\r\n\r\n var continueCallback = function (successFlag)\r\n {\r\n onPageViewLoaded(newView, success, $iframe, spineItem, isNewlyLoaded, context);\r\n\r\n callback(successFlag);\r\n };\r\n\r\n reachStableContentHeight(2, newView, $iframe[0], spineItem.href, spineItem.isFixedLayout(), spineItem.isFixedLayout() ? newView.meta_width() : 0, \"addToBottomOf\", continueCallback); // //onIFrameLoad called before this callback, so okay.\r\n }\r\n else {\r\n console.error(\"Unable to load \" + nexSpineItem.href);\r\n callback(false);\r\n }\r\n\r\n });\r\n }\r\n\r\n function removeLoadedItems() {\r\n\r\n var loadedPageViews = [];\r\n\r\n forEachItemView(function (pageView) {\r\n loadedPageViews.push(pageView);\r\n }, false);\r\n\r\n for (var i = 0, count = loadedPageViews.length; i < count; i++) {\r\n removePageView(loadedPageViews[i]);\r\n }\r\n }\r\n\r\n function removePageView(pageView) {\r\n\r\n pageView.element().remove();\r\n\r\n }\r\n\r\n\r\n function setFrameSizesToRectangle(rectangle) {\r\n\r\n _$contentFrame.css(\"left\", rectangle.left);\r\n _$contentFrame.css(\"top\", rectangle.top);\r\n _$contentFrame.css(\"right\", rectangle.right);\r\n _$contentFrame.css(\"bottom\", rectangle.bottom);\r\n\r\n }\r\n\r\n this.remove = function () {\r\n _$el.remove();\r\n };\r\n\r\n this.onViewportResize = function () {\r\n\r\n if (!_$contentFrame) {\r\n return;\r\n }\r\n\r\n forEachItemView(function (pageView) {\r\n\r\n updatePageViewSize(pageView);\r\n }, false);\r\n\r\n onPaginationChanged(self);\r\n\r\n updateTransientViews();\r\n };\r\n\r\n var _viewSettings = undefined;\r\n this.setViewSettings = function (settings) {\r\n\r\n _viewSettings = settings;\r\n\r\n forEachItemView(function (pageView) {\r\n\r\n pageView.setViewSettings(settings);\r\n\r\n }, false);\r\n };\r\n\r\n function createPageViewForSpineItem(isTemporaryView) {\r\n\r\n options.disablePageTransitions = true; // force\r\n\r\n var pageView = new OnePageView(\r\n options,\r\n [\"content-doc-frame\"],\r\n true, //enableBookStyleOverrides\r\n reader);\r\n\r\n pageView.on(OnePageView.SPINE_ITEM_OPEN_START, function($iframe, spineItem) {\r\n\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOAD_START, $iframe, spineItem);\r\n });\r\n\r\n pageView.render();\r\n if (_viewSettings) pageView.setViewSettings(_viewSettings);\r\n\r\n if (!isTemporaryView) {\r\n pageView.element().data(\"pageView\", pageView);\r\n }\r\n\r\n\r\n if (isContinuousScroll)\r\n {\r\n pageView.decorateIframe();\r\n }\r\n\r\n return pageView;\r\n }\r\n\r\n function findPageViewForSpineItem(spineItem, reverse) {\r\n\r\n var retView = undefined;\r\n\r\n forEachItemView(function (pageView) {\r\n if (pageView.currentSpineItem() == spineItem) {\r\n retView = pageView;\r\n //brake the iteration\r\n return false;\r\n }\r\n else {\r\n return true;\r\n }\r\n\r\n }, reverse);\r\n\r\n return retView;\r\n }\r\n\r\n function forEachItemView(func, reverse) {\r\n\r\n var pageNodes = _$contentFrame.children();\r\n\r\n var count = pageNodes.length;\r\n var iter = reverse ? function(ix) { return ix - 1}\r\n : function(ix) { return ix + 1};\r\n\r\n var compare = reverse ? function(ix) { return ix >= 0}\r\n : function(ix) { return ix < count };\r\n\r\n var start = reverse ? count - 1 : 0;\r\n\r\n for (var i = start; compare(i); i = iter(i)) {\r\n\r\n var $element = pageNodes.eq(i);\r\n var curView = $element.data(\"pageView\");\r\n\r\n if (curView) {\r\n\r\n if (func(curView) === false) {\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function firstLoadedView() {\r\n\r\n var firstView = undefined;\r\n\r\n forEachItemView(function (pageView) {\r\n\r\n firstView = pageView;\r\n return false;\r\n\r\n }, false);\r\n\r\n return firstView;\r\n }\r\n\r\n function lastLoadedView() {\r\n\r\n var lastView = undefined;\r\n\r\n forEachItemView(function (pageView) {\r\n lastView = pageView;\r\n return false;\r\n\r\n }, true);\r\n\r\n return lastView;\r\n }\r\n\r\n function onPageViewLoaded(pageView, success, $iframe, spineItem, isNewlyLoaded, context) {\r\n\r\n if (success && isNewlyLoaded) {\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOADED, $iframe, spineItem);\r\n }\r\n\r\n }\r\n\r\n function loadSpineItem(spineItem, callback) {\r\n\r\n removeLoadedItems();\r\n\r\n var scrollPos = scrollTop();\r\n\r\n var loadedView = createPageViewForSpineItem();\r\n\r\n _$contentFrame.append(loadedView.element());\r\n\r\n loadedView.loadSpineItem(spineItem, function (success, $iframe, spineItem, isNewlyLoaded, context) {\r\n\r\n if (success) {\r\n\r\n var continueCallback = function(successFlag)\r\n {\r\n onPageViewLoaded(loadedView, success, $iframe, spineItem, isNewlyLoaded, context);\r\n\r\n callback(loadedView);\r\n\r\n //successFlag should always be true as loadedView iFrame cannot be dead at this stage.\r\n };\r\n\r\n reachStableContentHeight(1, loadedView, $iframe[0], spineItem.href, spineItem.isFixedLayout(), spineItem.isFixedLayout() ? loadedView.meta_width() : 0, \"openPage\", continueCallback); // //onIFrameLoad called before this callback, so okay.\r\n }\r\n else {\r\n console.error(\"Unable to load \" + spineItem.href);\r\n\r\n removePageView(loadedView);\r\n loadedView = undefined;\r\n }\r\n\r\n callback(loadedView);\r\n\r\n });\r\n\r\n }\r\n\r\n this.applyStyles = function () {\r\n\r\n Helpers.setStyles(_userStyles.getStyles(), _$el.parent());\r\n\r\n //because left, top, bottom, right setting ignores padding of parent container\r\n //we have to take it to account manually\r\n var elementMargins = Helpers.Margins.fromElement(_$el);\r\n\r\n setFrameSizesToRectangle(elementMargins.padding);\r\n\r\n };\r\n\r\n this.applyBookStyles = function () {\r\n\r\n forEachItemView(function (pageView) {\r\n pageView.applyBookStyles();\r\n }, false);\r\n };\r\n\r\n\r\n this.openPage = function (pageRequest) {\r\n\r\n _stopTransientViewUpdate = true;\r\n\r\n //local helper function\r\n var doneLoadingSpineItem = function (pageView, pageRequest) {\r\n\r\n _deferredPageRequest = undefined;\r\n openPageViewElement(pageView, pageRequest);\r\n _stopTransientViewUpdate = false;\r\n updateTransientViews(pageView);\r\n };\r\n\r\n if (pageRequest.spineItem) {\r\n\r\n var pageView = findPageViewForSpineItem(pageRequest.spineItem);\r\n if (pageView) {\r\n doneLoadingSpineItem(pageView, pageRequest);\r\n }\r\n else {\r\n _deferredPageRequest = pageRequest;\r\n _isLoadingNewSpineItemOnPageRequest = true;\r\n\r\n loadSpineItem(pageRequest.spineItem, function (pageView) {\r\n\r\n setTimeout(function () {\r\n _isLoadingNewSpineItemOnPageRequest = false;\r\n }, ON_SCROLL_TIME_DALAY + 100);\r\n\r\n if (pageView && _deferredPageRequest) {\r\n if (pageView.currentSpineItem() === _deferredPageRequest.spineItem) {\r\n doneLoadingSpineItem(pageView, _deferredPageRequest);\r\n }\r\n else { //while we where waiting for load new request come\r\n self.openPage(_deferredPageRequest); //recursion\r\n }\r\n }\r\n else {\r\n onPaginationChanged(pageRequest.initiator, pageRequest.spineItem, pageRequest.elementId);\r\n }\r\n\r\n });\r\n }\r\n }\r\n else {\r\n doneLoadingSpineItem(undefined, pageRequest);\r\n }\r\n };\r\n\r\n function openPageViewElement(pageView, pageRequest) {\r\n\r\n var topOffset = 0;\r\n var pageCount;\r\n var $element;\r\n var sfiNav;\r\n var pageRange;\r\n\r\n if (pageRequest.scrollTop !== undefined) {\r\n\r\n topOffset = pageRequest.scrollTop;\r\n }\r\n else if (pageRequest.spineItemPageIndex !== undefined) {\r\n\r\n var pageIndex;\r\n pageCount = calculatePageCount();\r\n if (pageRequest.spineItemPageIndex < 0) {\r\n pageIndex = 0;\r\n }\r\n else if (pageRequest.spineItemPageIndex >= pageCount) {\r\n pageIndex = pageCount - 1;\r\n }\r\n else {\r\n pageIndex = pageRequest.spineItemPageIndex;\r\n }\r\n\r\n topOffset = pageIndex * viewHeight();\r\n }\r\n else if (pageView && pageRequest.elementId) {\r\n\r\n pageRange = getPageViewRange(pageView);\r\n sfiNav = pageView.getNavigator();\r\n $element = sfiNav.getElementById(pageRequest.elementId);\r\n\r\n if (!$element || !$element.length) {\r\n console.warn(\"Element id=\" + pageRequest.elementId + \" not found!\");\r\n return;\r\n }\r\n\r\n if (isElementVisibleOnScreen(pageView, $element, 60)) {\r\n //TODO refactoring required\r\n // this is artificial call because MO player waits for this event to continue playing.\r\n onPaginationChanged(pageRequest.initiator, pageRequest.spineItem, pageRequest.elementId);\r\n return;\r\n }\r\n\r\n topOffset = sfiNav.getVerticalOffsetForElement($element) + pageRange.top;\r\n\r\n }\r\n else if (pageView && pageRequest.elementCfi) {\r\n\r\n pageRange = getPageViewRange(pageView);\r\n sfiNav = pageView.getNavigator();\r\n $element = sfiNav.getElementByCfi(pageRequest.elementCfi);\r\n\r\n if (!$element || !$element.length) {\r\n console.warn(\"Element cfi=\" + pageRequest.elementCfi + \" not found!\");\r\n return;\r\n }\r\n\r\n if (isElementVisibleOnScreen(pageView, $element, 60)) {\r\n //TODO refactoring required\r\n // this is artificial call because MO player waits for this event to continue playing.\r\n onPaginationChanged(pageRequest.initiator, pageRequest.spineItem, pageRequest.elementId);\r\n return;\r\n }\r\n\r\n topOffset = sfiNav.getVerticalOffsetForElement($element) + pageRange.top;\r\n\r\n }\r\n else if (pageRequest.firstPage) {\r\n\r\n topOffset = 0;\r\n }\r\n else if (pageRequest.lastPage) {\r\n pageCount = calculatePageCount();\r\n\r\n if (pageCount === 0) {\r\n return;\r\n }\r\n\r\n topOffset = scrollHeight() - viewHeight() - 5;\r\n }\r\n else if (pageView) {\r\n\r\n pageRange = getPageViewRange(pageView);\r\n topOffset = pageRange.top;\r\n }\r\n else {\r\n topOffset = 0;\r\n }\r\n\r\n if (scrollTop() != topOffset) {\r\n\r\n _isSettingScrollPosition = true;\r\n scrollTo(topOffset, pageRequest);\r\n\r\n setTimeout(function () {\r\n _isSettingScrollPosition = false;\r\n }, ON_SCROLL_TIME_DALAY + 100); //we have to wait more than scroll delay to make sure that we don't react on onScroll\r\n\r\n }\r\n else {\r\n onPaginationChanged(pageRequest.initiator, pageRequest.spineItem, pageRequest.elementId);\r\n }\r\n }\r\n\r\n function calculatePageCount() {\r\n\r\n return Math.ceil(scrollHeight() / viewHeight());\r\n }\r\n\r\n function onPaginationChanged(initiator, paginationRequest_spineItem, paginationRequest_elementId) {\r\n self.emit(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, {\r\n paginationInfo: self.getPaginationInfo(),\r\n initiator: initiator,\r\n spineItem: paginationRequest_spineItem,\r\n elementId: paginationRequest_elementId\r\n });\r\n }\r\n\r\n function scrollTop() {\r\n return _$contentFrame[0].scrollTop;\r\n }\r\n\r\n function scrollBottom() {\r\n return scrollHeight() - (scrollTop() + viewHeight());\r\n }\r\n\r\n function viewHeight() {\r\n return _$contentFrame.height();\r\n }\r\n\r\n function scrollHeight() {\r\n return _$contentFrame[0].scrollHeight;\r\n }\r\n\r\n this.openPageNext = function (initiator) {\r\n\r\n var pageRequest;\r\n\r\n if (scrollBottom() > 0) {\r\n\r\n pageRequest = new PageOpenRequest(undefined, initiator);\r\n pageRequest.scrollTop = scrollTop() + Math.min(scrollBottom(), viewHeight() - SCROLL_MARGIN_TO_SHOW_LAST_VISBLE_LINE);\r\n openPageViewElement(undefined, pageRequest);\r\n }\r\n\r\n };\r\n\r\n this.openPagePrev = function (initiator) {\r\n\r\n var pageRequest;\r\n\r\n if (scrollTop() > 0) {\r\n\r\n pageRequest = new PageOpenRequest(undefined, initiator);\r\n pageRequest.scrollTop = scrollTop() - (viewHeight() - SCROLL_MARGIN_TO_SHOW_LAST_VISBLE_LINE);\r\n if (pageRequest.scrollTop < 0) {\r\n pageRequest.scrollTop = 0;\r\n }\r\n\r\n openPageViewElement(undefined, pageRequest);\r\n }\r\n };\r\n\r\n function getVisiblePageViews() {\r\n\r\n var views = [];\r\n\r\n var range = getVisibleRange(-SCROLL_MARGIN_TO_SHOW_LAST_VISBLE_LINE);\r\n\r\n forEachItemView(function (pageView) {\r\n\r\n if (isPageViewVisibleInRange(pageView, range)) {\r\n\r\n views.push(pageView);\r\n }\r\n else if (views.length > 0) {\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n\r\n }, false);\r\n\r\n return views;\r\n\r\n }\r\n\r\n\r\n function getFirstVisiblePageView() {\r\n\r\n var visibleViews = getVisiblePageViews();\r\n\r\n return visibleViews[0];\r\n }\r\n\r\n function isPageViewVisibleInRange(pageView, range) {\r\n var pageViewRange = getPageViewRange(pageView);\r\n return rangeLength(intersectRanges(pageViewRange, range)) > 0;\r\n }\r\n\r\n function getPageViewRange(pageView) {\r\n var range = {top: 0, bottom: 0};\r\n\r\n range.top = pageView.element().position().top + scrollTop();\r\n range.bottom = range.top + pageView.getCalculatedPageHeight();\r\n\r\n return range;\r\n }\r\n\r\n this.getFirstVisibleElementCfi = function () {\r\n var visibleViewPage = getFirstVisiblePageView();\r\n if (visibleViewPage) {\r\n return visibleViewPage.getNavigator().getFirstVisibleElementCfi(scrollTop());\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n this.getPaginationInfo = function () {\r\n var spineItem;\r\n var pageCount;\r\n var pageView;\r\n var pageViewRange;\r\n var heightAboveViewport;\r\n var heightBelowViewport;\r\n var pageCountAbove;\r\n var pageCountBelow;\r\n\r\n var viewPortRange = getVisibleRange();\r\n var viewPortHeight = viewPortRange.bottom - viewPortRange.top;\r\n\r\n var paginationInfo = new CurrentPagesInfo(_spine, false);\r\n\r\n var visibleViews = getVisiblePageViews();\r\n\r\n for (var i = 0, count = visibleViews.length; i < count; i++) {\r\n\r\n pageView = visibleViews[i];\r\n spineItem = pageView.currentSpineItem();\r\n pageViewRange = getPageViewRange(pageView);\r\n\r\n heightAboveViewport = Math.max(viewPortRange.top - pageViewRange.top, 0);\r\n heightBelowViewport = Math.max(pageViewRange.bottom - viewPortRange.bottom, 0);\r\n\r\n pageCountAbove = Math.ceil(heightAboveViewport / viewPortHeight);\r\n pageCountBelow = Math.ceil(heightBelowViewport / viewPortHeight);\r\n pageCount = pageCountAbove + pageCountBelow + 1;\r\n\r\n paginationInfo.addOpenPage(pageCountAbove, pageCount, spineItem.idref, spineItem.index);\r\n }\r\n\r\n return paginationInfo;\r\n };\r\n\r\n this.bookmarkCurrentPage = function () {\r\n var pageView = getFirstVisiblePageView();\r\n\r\n if (!pageView) {\r\n\r\n return new BookmarkData(\"\", \"\");\r\n }\r\n\r\n return new BookmarkData(pageView.currentSpineItem().idref, self.getFirstVisibleElementCfi());\r\n };\r\n\r\n\r\n this.getLoadedSpineItems = function () {\r\n var spineItems = [];\r\n\r\n forEachItemView(function (pageView) {\r\n spineItems.push(pageView.currentSpineItem());\r\n }, false);\r\n\r\n return spineItems;\r\n };\r\n\r\n this.getElement = function (spineItem, selector) {\r\n var element = undefined;\r\n\r\n forEachItemView(function (pageView) {\r\n if (pageView.currentSpineItem() == spineItem) {\r\n\r\n element = pageView.getNavigator().getElement(selector);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n\r\n }, false);\r\n\r\n return element;\r\n };\r\n\r\n this.getElementByCfi = function (spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n var found = undefined;\r\n\r\n forEachItemView(function (pageView) {\r\n if (pageView.currentSpineItem() == spineItem) {\r\n\r\n found = pageView.getElementByCfi(spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n return false;\r\n }\r\n\r\n return true;\r\n\r\n }, false);\r\n\r\n if (!found) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n return found;\r\n };\r\n\r\n this.getElementById = function (spineItem, id) {\r\n\r\n var found = undefined;\r\n\r\n forEachItemView(function (pageView) {\r\n if (pageView.currentSpineItem() == spineItem) {\r\n\r\n found = pageView.getNavigator().getElementById(id);\r\n return false;\r\n }\r\n\r\n return true;\r\n\r\n }, false);\r\n\r\n if (!found) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n return found;\r\n };\r\n\r\n this.getFirstVisibleMediaOverlayElement = function () {\r\n var viewPortRange = getVisibleRange();\r\n\r\n var moElement = undefined;\r\n var normalizedRange = {top: 0, bottom: 0};\r\n var pageViewRange;\r\n\r\n var steppedToVisiblePage = false;\r\n\r\n forEachItemView(function (pageView) {\r\n pageViewRange = getPageViewRange(pageView);\r\n\r\n normalizedRange.top = Math.max(pageViewRange.top, viewPortRange.top) - pageViewRange.top;\r\n normalizedRange.bottom = Math.min(pageViewRange.bottom, viewPortRange.bottom) - pageViewRange.top;\r\n\r\n if (rangeLength(normalizedRange) > 0) {\r\n steppedToVisiblePage = true;\r\n\r\n moElement = pageView.getNavigator().getFirstVisibleMediaOverlayElement(normalizedRange);\r\n if (moElement) {\r\n return false;\r\n }\r\n }\r\n else if (steppedToVisiblePage) {\r\n return false;\r\n }\r\n\r\n return true; //continue iteration\r\n\r\n }, false);\r\n\r\n return moElement;\r\n };\r\n\r\n // /**\r\n // * @deprecated\r\n // */\r\n // this.getVisibleMediaOverlayElements = function() {\r\n // var viewPortRange = getVisibleRange();\r\n //\r\n // var pageMoElements;\r\n // var moElements = [];\r\n // var normalizedRange = {top: 0, bottom: 0};\r\n // var pageViewRange;\r\n //\r\n // forEachItemView(function(pageView){\r\n // pageViewRange = getPageViewRange(pageView);\r\n //\r\n // normalizedRange.top = Math.max(pageViewRange.top, viewPortRange.top) - pageViewRange.top;\r\n // normalizedRange.bottom = Math.min(pageViewRange.bottom, viewPortRange.bottom) - pageViewRange.top;\r\n //\r\n // if(rangeLength(normalizedRange) > 0) {\r\n // pageMoElements = pageView.getNavigator().getVisibleMediaOverlayElements(normalizedRange);\r\n // moElements.push.apply(moElements, pageMoElements);\r\n // }\r\n // }, false);\r\n //\r\n // return moElements;\r\n // };\r\n\r\n function getVisibleRange(expand) {\r\n if (expand !== 0 && !expand) {\r\n expand = 0;\r\n }\r\n\r\n var range = {\r\n\r\n top: scrollTop() - expand,\r\n bottom: scrollTop() + viewHeight() + expand\r\n };\r\n\r\n if (range.top < 0) {\r\n range.top = 0;\r\n }\r\n\r\n if (range.bottom > scrollHeight()) {\r\n range.bottom = scrollHeight();\r\n }\r\n\r\n return range;\r\n\r\n }\r\n\r\n function intersectRanges(r1, r2) {\r\n return {\r\n\r\n top: Math.max(r1.top, r2.top),\r\n bottom: Math.min(r1.bottom, r2.bottom)\r\n };\r\n }\r\n\r\n function rangeLength(range) {\r\n if (range.bottom < range.top) {\r\n return 0;\r\n }\r\n\r\n return range.bottom - range.top;\r\n }\r\n\r\n function isElementVisibleOnScreen(pageView, $element, percentVisible) {\r\n\r\n var elementRange = getElementRange(pageView, $element);\r\n\r\n return isRangeIsVisibleOnScreen(elementRange, percentVisible);\r\n }\r\n\r\n function isRangeIsVisibleOnScreen(range, percentVisible) {\r\n\r\n var visibleRange = getVisibleRange();\r\n\r\n var smallestVisibleLength = Math.min(rangeLength(visibleRange), rangeLength(range));\r\n if (smallestVisibleLength === 0) {\r\n smallestVisibleLength = 5; // if element is 0 height we will set it to arbitrary 5 pixels - not to divide by 0\r\n }\r\n\r\n var intersectionRange = intersectRanges(visibleRange, range);\r\n\r\n var visiblePercent = (rangeLength(intersectionRange) / smallestVisibleLength) * 100;\r\n\r\n return visiblePercent >= percentVisible;\r\n }\r\n\r\n function getElementRange(pageView, $element) {\r\n\r\n var pageRange = getPageViewRange(pageView);\r\n\r\n var elementRange = {top: 0, bottom: 0};\r\n elementRange.top = $element.offset().top + pageRange.top;\r\n elementRange.bottom = elementRange.top + $element.height();\r\n\r\n return elementRange;\r\n }\r\n\r\n this.insureElementVisibility = function (spineItemId, element, initiator) {\r\n var pageView = undefined;\r\n\r\n forEachItemView(function (pv) {\r\n if (pv.currentSpineItem().idref === spineItemId) {\r\n\r\n pageView = pv;\r\n return false;\r\n }\r\n\r\n return true;\r\n }, false);\r\n\r\n if (!pageView) {\r\n console.warn(\"Page for element \" + element + \" not found\");\r\n return;\r\n }\r\n\r\n var $element = $(element);\r\n\r\n var elementRange = getElementRange(pageView, $element);\r\n\r\n if (!isRangeIsVisibleOnScreen(elementRange, 60)) {\r\n\r\n var spineItem = _spine.getItemById(spineItemId);\r\n var openPageRequest = new PageOpenRequest(spineItem, initiator);\r\n openPageRequest.scrollTop = elementRange.top;\r\n\r\n self.openPage(openPageRequest);\r\n }\r\n\r\n };\r\n\r\n this.isElementCfiVisible = function (spineIdRef, contentCfi) {\r\n // TODO: implement this for scrollable views\r\n return false;\r\n };\r\n\r\n};\r\nreturn ScrollView;\r\n});\r\n\n", "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/views/media_overlay_player',[\"jquery\", \"../helpers\", \"./audio_player\", \"./media_overlay_element_highlighter\", \"../globals\", \"../models/smil_iterator\", \"rangy\", 'readium_cfi_js', './scroll_view'],\r\n function($, Helpers, AudioPlayer, MediaOverlayElementHighlighter, Globals, SmilIterator, rangy, epubCfi, ScrollView) {\r\n/**\r\n *\r\n * @param reader\r\n * @param onStatusChanged\r\n * @constructor\r\n */\r\nvar MediaOverlayPlayer = function(reader, onStatusChanged) {\r\n\r\n\r\n var _smilIterator = undefined;\r\n\r\n var _audioPlayer = new AudioPlayer(onStatusChanged, onAudioPositionChanged, onAudioEnded, onPlay, onPause);\r\n\r\n var _ttsIsPlaying = false;\r\n var _currentTTS = undefined;\r\n var _enableHTMLSpeech = true && typeof window.speechSynthesis !== \"undefined\" && speechSynthesis != null; // set to false to force \"native\" platform TTS engine, rather than HTML Speech API\r\n \r\n var _SpeechSynthesisUtterance = undefined;\r\n //var _skipTTSEndEvent = false;\r\n var TOKENIZE_TTS = false;\r\n\r\n var _embeddedIsPlaying = false;\r\n var _currentEmbedded = undefined;\r\n\r\n\r\n this.isPlaying = function()\r\n {\r\n return _audioPlayer.isPlaying() || _ttsIsPlaying || _embeddedIsPlaying || _blankPagePlayer;\r\n }\r\n\r\n //var _currentPagination = undefined;\r\n var _package = reader.package();\r\n var _settings = reader.viewerSettings();\r\n var self = this;\r\n var _elementHighlighter = new MediaOverlayElementHighlighter(reader);\r\n\r\n reader.on(Globals.Events.READER_VIEW_DESTROYED, function(){\r\n\r\n self.reset();\r\n\r\n });\r\n\r\n\r\n this.applyStyles = function()\r\n {\r\n _elementHighlighter.reDo();\r\n };\r\n\r\n//\r\n// should use this.onSettingsApplied() instead!\r\n// this.setRate = function(rate) {\r\n// _audioPlayer.setRate(rate);\r\n// };\r\n// this.setVolume = function(volume) {\r\n// _audioPlayer.setVolume(volume);\r\n// };\r\n\r\n\r\n this.onSettingsApplied = function() {\r\n//console.debug(_settings);\r\n _audioPlayer.setRate(_settings.mediaOverlaysRate);\r\n _audioPlayer.setVolume(_settings.mediaOverlaysVolume / 100.0);\r\n };\r\n self.onSettingsApplied();\r\n //Globals.\r\n reader.on(Globals.Events.SETTINGS_APPLIED, this.onSettingsApplied, this);\r\n\r\n /*\r\n var lastElement = undefined;\r\n var lastElementColor = \"\";\r\n */\r\n\r\n var _wasPlayingAtDocLoadStart = false;\r\n this.onDocLoadStart = function() {\r\n // 1) Globals.Events.CONTENT_DOCUMENT_LOAD_START\r\n // (maybe 2-page fixed-layout or reflowable spread == 2 documents == 2x events)\r\n // MOPLayer.onDocLoad()\r\n \r\n // 2) Globals.Events.CONTENT_DOCUMENT_LOADED\r\n // (maybe 2-page fixed-layout or reflowable spread == 2 documents == 2x events)\r\n //_mediaOverlayDataInjector.attachMediaOverlayData($iframe, spineItem, _viewerSettings);\r\n \r\n // 3) Globals.Events.PAGINATION_CHANGED (layout finished, notified before rest of app, just once)\r\n // MOPLayer.onPageChanged()\r\n\r\n var wasPlaying = self.isPlaying();\r\n if (wasPlaying)\r\n {\r\n _wasPlayingAtDocLoadStart = true;\r\n self.pause();\r\n }\r\n };\r\n \r\n var _lastPaginationData = undefined;\r\n \r\n this.onPageChanged = function(paginationData) {\r\n \r\n _lastPaginationData = paginationData;\r\n \r\n var wasPausedBecauseNoAutoNextSmil = _wasPausedBecauseNoAutoNextSmil;\r\n _wasPausedBecauseNoAutoNextSmil = false;\r\n \r\n var wasPlayingAtDocLoadStart = _wasPlayingAtDocLoadStart;\r\n _wasPlayingAtDocLoadStart = false;\r\n\r\n if(!paginationData) {\r\n self.reset();\r\n return;\r\n }\r\n\r\n// if (paginationData.paginationInfo)\r\n// {\r\n// _currentPagination = paginationData.paginationInfo;\r\n// }\r\n\r\n /*\r\n if (lastElement)\r\n {\r\n $(lastElement).css(\"background-color\", lastElementColor);\r\n lastElement = undefined;\r\n }\r\n */\r\n\r\n var element = undefined;\r\n var isCfiTextRange = false;\r\n \r\n var fakeOpfRoot = \"/99!\";\r\n var epubCfiPrefix = \"epubcfi\";\r\n \r\n if (paginationData.elementId || paginationData.initiator == self)\r\n {\r\n var spineItems = reader.getLoadedSpineItems();\r\n\r\n var rtl = reader.spine().isRightToLeft();\r\n\r\n for(var i = (rtl ? (spineItems.length - 1) : 0); rtl && i >=0 || !rtl && i < spineItems.length; i += (rtl ? -1: 1))\r\n {\r\n var spineItem = spineItems[i];\r\n if (paginationData.spineItem && paginationData.spineItem != spineItem)\r\n {\r\n continue;\r\n }\r\n \r\n if (paginationData.elementId && paginationData.elementId.indexOf(epubCfiPrefix) === 0)\r\n {\r\n _elementHighlighter.reset(); // ensure clean DOM (no CFI span markers)\r\n \r\n var partial = paginationData.elementId.substr(epubCfiPrefix.length + 1, paginationData.elementId.length - epubCfiPrefix.length - 2);\r\n \r\n if (partial.indexOf(fakeOpfRoot) === 0)\r\n {\r\n partial = partial.substr(fakeOpfRoot.length, partial.length - fakeOpfRoot.length);\r\n }\r\n//console.log(partial);\r\n var parts = partial.split(\",\");\r\n if (parts && parts.length === 3)\r\n {\r\n try\r\n {\r\n var cfi = parts[0] + parts[1];\r\n var $element = reader.getElementByCfi(spineItem, cfi,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n\r\n element = ($element && $element.length > 0) ? $element[0] : undefined;\r\n if (element)\r\n {\r\n if (element.nodeType === Node.TEXT_NODE)\r\n {\r\n element = element.parentNode;\r\n }\r\n break;\r\n }\r\n }\r\n catch (error)\r\n {\r\n console.error(error);\r\n }\r\n }\r\n else\r\n {\r\n try\r\n {\r\n //var cfi = \"epubcfi(\" + partial + \")\";\r\n //var $element = EPUBcfi.getTargetElementWithPartialCFI(cfi, DOC);\r\n var $element = reader.getElementByCfi(spineItem, partial,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n \r\n element = ($element && $element.length > 0) ? $element[0] : undefined;\r\n if (element)\r\n {\r\n if (element.nodeType === Node.TEXT_NODE)\r\n {\r\n element = element.parentNode;\r\n }\r\n break;\r\n }\r\n }\r\n catch (error)\r\n {\r\n console.error(error);\r\n }\r\n }\r\n }\r\n\r\n if (!element)\r\n {\r\n if (paginationData.initiator == self && !paginationData.elementId)\r\n {\r\n var $element = reader.getElement(spineItem, \"body\");\r\n element = ($element && $element.length > 0) ? $element[0] : undefined;\r\n }\r\n else\r\n {\r\n var $element = reader.getElementById(spineItem, paginationData.elementId);\r\n element = ($element && $element.length > 0) ? $element[0] : undefined;\r\n //(\"#\" + Globals.Helpers.escapeJQuerySelector(paginationData.elementId))\r\n }\r\n \r\n if (element)\r\n {\r\n /*\r\n console.error(\"GREEN: \" + paginationData.elementId);\r\n lastElement = element;\r\n lastElementColor = $(element).css(\"background-color\");\r\n $(element).css(\"background-color\", \"green\");\r\n */\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!element)\r\n {\r\n console.error(\"paginationData.elementId BUT !element: \" + paginationData.elementId);\r\n }\r\n }\r\n\r\n var wasPlaying = self.isPlaying() || wasPlayingAtDocLoadStart;\r\n\r\n if(!_smilIterator || !_smilIterator.currentPar) {\r\n if(paginationData.initiator !== self) {\r\n clipBeginOffset = 0.0;\r\n self.reset();\r\n\r\n if (paginationData.elementId && element)\r\n {\r\n if (wasPlaying || wasPausedBecauseNoAutoNextSmil)\r\n {\r\n paginationData.elementIdResolved = element;\r\n self.toggleMediaOverlayRefresh(paginationData);\r\n }\r\n }\r\n else if (wasPlaying || wasPausedBecauseNoAutoNextSmil)\r\n {\r\n self.toggleMediaOverlay();\r\n }\r\n return;\r\n }\r\n\r\n //paginationData.initiator === self\r\n//\r\n// if (!paginationData.elementId)\r\n// {\r\n// console.error(\"!paginationData.elementId\");\r\n// clipBeginOffset = 0.0;\r\n// return;\r\n// }\r\n\r\n if(!element)\r\n {\r\n console.error(\"!element: \" + paginationData.elementId);\r\n clipBeginOffset = 0.0;\r\n return;\r\n }\r\n\r\n var moData = $(element).data(\"mediaOverlayData\");\r\n if(!moData) {\r\n console.error(\"!moData: \" + paginationData.elementId);\r\n clipBeginOffset = 0.0;\r\n return;\r\n }\r\n\r\n var parToPlay = moData.par ? moData.par : moData.pars[0];\r\n\r\n if (moData.pars)\r\n {\r\n for (var iPar = 0; iPar < moData.pars.length; iPar++)\r\n {\r\n var p = moData.pars[iPar];\r\n \r\n if (paginationData.elementId === p.cfi.smilTextSrcCfi)\r\n {\r\n parToPlay = p;\r\n break;\r\n }\r\n }\r\n }\r\n \r\n playPar(parToPlay);\r\n return;\r\n }\r\n\r\n var noReverseData = !_smilIterator.currentPar.element && !_smilIterator.currentPar.cfi;\r\n if(noReverseData) {\r\n console.error(\"!! _smilIterator.currentPar.element ??\");\r\n }\r\n\r\n//console.debug(\"+++> paginationData.elementId: \" + paginationData.elementId + \" /// \" + _smilIterator.currentPar.text.srcFile + \" # \" + _smilIterator.currentPar.text.srcFragmentId); //PageOpenRequest.elementId\r\n\r\n\r\n if(paginationData.initiator == self)\r\n {\r\n var notSameTargetID = paginationData.elementId && paginationData.elementId !== _smilIterator.currentPar.text.srcFragmentId;\r\n\r\n if(notSameTargetID) {\r\n console.error(\"!! paginationData.elementId !== _smilIterator.currentPar.text.srcFragmentId\");\r\n }\r\n\r\n if(notSameTargetID || noReverseData) {\r\n clipBeginOffset = 0.0;\r\n return;\r\n }\r\n\r\n if(wasPlaying)\r\n {\r\n highlightCurrentElement();\r\n }\r\n else\r\n {\r\n playCurrentPar();\r\n }\r\n }\r\n else\r\n {\r\n if(!wasPlaying && !wasPausedBecauseNoAutoNextSmil)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n if(!paginationData.elementId)\r\n {\r\n //self.reset();\r\n }\r\n\r\n if(paginationData.elementId && !element)\r\n {\r\n //self.reset();\r\n return;\r\n }\r\n\r\n if(paginationData.elementId)\r\n {\r\n paginationData.elementIdResolved = element;\r\n }\r\n \r\n self.toggleMediaOverlayRefresh(paginationData);\r\n }\r\n };\r\n\r\n function playPar(par) {\r\n\r\n var parSmil = par.getSmil();\r\n if(!_smilIterator || _smilIterator.smil != parSmil)\r\n {\r\n _smilIterator = new SmilIterator(parSmil);\r\n }\r\n else {\r\n _smilIterator.reset();\r\n }\r\n\r\n _smilIterator.goToPar(par);\r\n\r\n if(!_smilIterator.currentPar) {\r\n console.error(\"playPar !_smilIterator.currentPar\");\r\n return;\r\n }\r\n\r\n playCurrentPar();\r\n }\r\n\r\n var clipBeginOffset = 0.0;\r\n\r\n var _blankPagePlayer = undefined;\r\n\r\n function initBlankPagePlayer()\r\n {\r\n self.resetBlankPage();\r\n\r\n _blankPagePlayer = setTimeout(function() {\r\n\r\n if (!_blankPagePlayer)\r\n {\r\n return;\r\n }\r\n\r\n self.resetBlankPage();\r\n\r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n audioCurrentTime = 0.0;\r\n//console.log(\"BLANK END.\");\r\n //nextSmil(true);\r\n onAudioPositionChanged(_smilIterator.currentPar.audio.clipEnd + 0.1, 2);\r\n\r\n }, 2000);\r\n\r\n onStatusChanged({isPlaying: true});\r\n }\r\n\r\n function playCurrentPar() {\r\n _wasPlayingScrolling = false;\r\n \r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n console.error(\"playCurrentPar !_smilIterator || !_smilIterator.currentPar ???\");\r\n return;\r\n }\r\n\r\n if (!_smilIterator.smil.id)\r\n {\r\n _audioPlayer.reset();\r\n\r\n self.resetTTS();\r\n self.resetEmbedded();\r\n\r\n setTimeout(function()\r\n {\r\n initBlankPagePlayer();\r\n }, 100);\r\n\r\n return;\r\n }\r\n else if (!_smilIterator.currentPar.audio.src)\r\n {\r\n clipBeginOffset = 0.0;\r\n\r\n// if (_currentTTS)\r\n// {\r\n// _skipTTSEnded = true;\r\n// }\r\n\r\n _audioPlayer.reset();\r\n\r\n var element = _smilIterator.currentPar.element;\r\n if (element)\r\n {\r\n audioCurrentTime = 0.0;\r\n\r\n var name = element.nodeName ? element.nodeName.toLowerCase() : undefined;\r\n\r\n if (name === \"audio\" || name === \"video\")\r\n {\r\n self.resetTTS();\r\n self.resetBlankPage();\r\n\r\n if (_currentEmbedded)\r\n {\r\n self.resetEmbedded();\r\n }\r\n\r\n _currentEmbedded = element;\r\n\r\n _currentEmbedded.pause();\r\n\r\n // DONE at reader_view.attachMO()\r\n //$(_currentEmbedded).attr(\"preload\", \"auto\");\r\n\r\n _currentEmbedded.currentTime = 0;\r\n\r\n _currentEmbedded.play();\r\n\r\n $(_currentEmbedded).on(\"ended\", self.onEmbeddedEnd);\r\n\r\n _embeddedIsPlaying = true;\r\n \r\n // gives the audio player some dispatcher time to raise the onPause event\r\n setTimeout(function(){\r\n onStatusChanged({isPlaying: true});\r\n }, 80);\r\n\r\n// $(element).on(\"seeked\", function()\r\n// {\r\n// $(element).off(\"seeked\", onSeeked);\r\n// });\r\n }\r\n else\r\n {\r\n self.resetEmbedded();\r\n self.resetBlankPage();\r\n\r\n _currentTTS = element.textContent; //.innerText (CSS display sensitive + script + style tags)\r\n if (!_currentTTS || _currentTTS == \"\")\r\n {\r\n _currentTTS = undefined;\r\n }\r\n else\r\n {\r\n speakStart(_currentTTS);\r\n }\r\n }\r\n }\r\n \r\n var cfi = _smilIterator.currentPar.cfi;\r\n if (cfi)\r\n {\r\n audioCurrentTime = 0.0;\r\n self.resetEmbedded();\r\n self.resetBlankPage();\r\n\r\n _elementHighlighter.reset(); // ensure clean DOM (no CFI span markers)\r\n \r\n var doc = cfi.cfiTextParent.ownerDocument;\r\n\r\n var startCFI = \"epubcfi(\" + cfi.partialStartCfi + \")\";\r\n var infoStart = EPUBcfi.getTextTerminusInfoWithPartialCFI(startCFI, doc,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n//console.log(infoStart);\r\n\r\n var endCFI = \"epubcfi(\" + cfi.partialEndCfi + \")\";\r\n var infoEnd = EPUBcfi.getTextTerminusInfoWithPartialCFI(endCFI, doc,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n//console.log(infoEnd);\r\n\r\n if (rangy)\r\n {\r\n //infoStart.textNode[0].parentNode.ownerDocument\r\n var range = rangy.createRange(doc); //createNativeRange\r\n range.setStartAndEnd(\r\n infoStart.textNode[0], infoStart.textOffset,\r\n infoEnd.textNode[0], infoEnd.textOffset\r\n );\r\n _currentTTS = range.toString(); //.text()\r\n }\r\n else\r\n {\r\n _currentTTS = undefined;\r\n }\r\n\r\n if (!_currentTTS || _currentTTS == \"\")\r\n {\r\n _currentTTS = undefined;\r\n }\r\n else\r\n {\r\n speakStart(_currentTTS);\r\n }\r\n }\r\n }\r\n else\r\n {\r\n self.resetTTS();\r\n self.resetEmbedded();\r\n self.resetBlankPage();\r\n\r\n var dur = _smilIterator.currentPar.audio.clipEnd - _smilIterator.currentPar.audio.clipBegin;\r\n if (dur <= 0 || clipBeginOffset > dur)\r\n {\r\n console.error(\"### MO XXX PAR OFFSET: \" + clipBeginOffset + \" / \" + dur);\r\n clipBeginOffset = 0.0;\r\n }\r\n else\r\n {\r\n//console.debug(\"### MO PAR OFFSET: \" + clipBeginOffset);\r\n }\r\n\r\n var audioContentRef = Helpers.ResolveContentRef(_smilIterator.currentPar.audio.src, _smilIterator.smil.href);\r\n\r\n var audioSource = _package.resolveRelativeUrlMO(audioContentRef);\r\n\r\n var startTime = _smilIterator.currentPar.audio.clipBegin + clipBeginOffset;\r\n\r\n//console.debug(\"PLAY START TIME: \" + startTime + \"(\"+_smilIterator.currentPar.audio.clipBegin+\" + \"+clipBeginOffset+\")\");\r\n\r\n _audioPlayer.playFile(_smilIterator.currentPar.audio.src, audioSource, startTime); //_smilIterator.currentPar.element ? _smilIterator.currentPar.element : _smilIterator.currentPar.cfi.cfiTextParent\r\n }\r\n\r\n clipBeginOffset = 0.0;\r\n\r\n highlightCurrentElement();\r\n }\r\n\r\n function nextSmil(goNext)\r\n {\r\n self.pause();\r\n\r\n//console.debug(\"current Smil: \" + _smilIterator.smil.href + \" /// \" + _smilIterator.smil.id);\r\n\r\n var nextSmil = goNext ? _package.media_overlay.getNextSmil(_smilIterator.smil) : _package.media_overlay.getPreviousSmil(_smilIterator.smil);\r\n if(nextSmil) {\r\n\r\n//console.debug(\"nextSmil: \" + nextSmil.href + \" /// \" + nextSmil.id);\r\n\r\n _smilIterator = new SmilIterator(nextSmil);\r\n if(_smilIterator.currentPar) {\r\n if (!goNext)\r\n {\r\n while (!_smilIterator.isLast())\r\n {\r\n _smilIterator.next();\r\n }\r\n }\r\n\r\n//console.debug(\"openContentUrl (nextSmil): \" + _smilIterator.currentPar.text.src + \" -- \" + _smilIterator.smil.href);\r\n\r\n reader.openContentUrl(_smilIterator.currentPar.text.src, _smilIterator.smil.href, self);\r\n }\r\n }\r\n else\r\n {\r\n console.log(\"No more SMIL\");\r\n self.reset();\r\n }\r\n }\r\n\r\n\r\n var _skipAudioEnded = false;\r\n// var _skipTTSEnded = false;\r\n\r\n var audioCurrentTime = 0.0;\r\n\r\n var DIRECTION_MARK = -999;\r\n\r\n// var _letPlay = false;\r\n\r\n//from\r\n//1 = audio player\r\n//2 = blank page\r\n//3 = video/audio embbeded\r\n//4 = TTS\r\n//5 = audio end\r\n//6 = user previous/next/escape\r\n function onAudioPositionChanged(position, from, skipping) { //noLetPlay\r\n\r\n audioCurrentTime = position;\r\n\r\n// if (_letPlay)\r\n// {\r\n// return;\r\n// }\r\n\r\n _skipAudioEnded = false;\r\n// _skipTTSEnded = false;\r\n\r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n return;\r\n }\r\n\r\n var parFrom = _smilIterator.currentPar;\r\n \r\n var audio = _smilIterator.currentPar.audio;\r\n\r\n //var TOLERANCE = 0.05;\r\n if(\r\n //position >= (audio.clipBegin - TOLERANCE) &&\r\n position > DIRECTION_MARK &&\r\n position <= audio.clipEnd) {\r\n\r\n//console.debug(\"onAudioPositionChanged: \" + position);\r\n return;\r\n }\r\n\r\n _skipAudioEnded = true;\r\n\r\n//console.debug(\"PLAY NEXT: \" + \"(\" + audio.clipBegin + \" -- \" + audio.clipEnd + \") [\" + from + \"] \" + position);\r\n//console.debug(_smilIterator.currentPar.text.srcFragmentId);\r\n\r\n var isPlaying = _audioPlayer.isPlaying();\r\n if (isPlaying && from === 6)\r\n {\r\n console.debug(\"from userNav _audioPlayer.isPlaying() ???\");\r\n }\r\n\r\n var goNext = position > audio.clipEnd;\r\n\r\n var doNotNextSmil = !_autoNextSmil && from !== 6 && goNext;\r\n\r\n var spineItemIdRef = (_smilIterator && _smilIterator.smil && _smilIterator.smil.spineItemId) ? _smilIterator.smil.spineItemId : ((_lastPaginationData && _lastPaginationData.spineItem && _lastPaginationData.spineItem.idref) ? _lastPaginationData.spineItem.idref : undefined);\r\n if (doNotNextSmil && spineItemIdRef && _lastPaginationData && _lastPaginationData.paginationInfo && _lastPaginationData.paginationInfo.openPages && _lastPaginationData.paginationInfo.openPages.length > 1)\r\n {\r\n //var iPage = _lastPaginationData.paginationInfo.isRightToLeft ? _lastPaginationData.paginationInfo.openPages.length - 1 : 0;\r\n var iPage = 0;\r\n \r\n var openPage = _lastPaginationData.paginationInfo.openPages[iPage];\r\n if (spineItemIdRef === openPage.idref)\r\n {\r\n doNotNextSmil = false;\r\n }\r\n }\r\n \r\n if (goNext)\r\n {\r\n _smilIterator.next();\r\n }\r\n else //position <= DIRECTION_MARK\r\n {\r\n _smilIterator.previous();\r\n }\r\n\r\n if(!_smilIterator.currentPar)\r\n {\r\n //\r\n // if (!noLetPlay)\r\n // {\r\n // _letPlay = true;\r\n // setTimeout(function()\r\n // {\r\n // _letPlay = false;\r\n // nextSmil(goNext);\r\n // }, 200);\r\n // }\r\n // else\r\n // {\r\n // nextSmil(goNext);\r\n // }\r\n\r\n//console.debug(\"NEXT SMIL ON AUDIO POS\");\r\n \r\n if (doNotNextSmil)\r\n {\r\n _wasPausedBecauseNoAutoNextSmil = true;\r\n self.reset();\r\n //self.pause();\r\n }\r\n else\r\n {\r\n nextSmil(goNext);\r\n }\r\n return;\r\n }\r\n\r\n//console.debug(\"ITER: \" + _smilIterator.currentPar.text.srcFragmentId);\r\n\r\n if(!_smilIterator.currentPar.audio) {\r\n self.pause();\r\n return;\r\n }\r\n \r\n if(_settings.mediaOverlaysSkipSkippables)\r\n {\r\n var skip = false;\r\n var parent = _smilIterator.currentPar;\r\n while (parent)\r\n {\r\n if (parent.isSkippable && parent.isSkippable(_settings.mediaOverlaysSkippables))\r\n {\r\n skip = true;\r\n break;\r\n }\r\n parent = parent.parent;\r\n }\r\n\r\n if (skip)\r\n {\r\n console.log(\"MO SKIP: \" + parent.epubtype);\r\n\r\n self.pause();\r\n\r\n var pos = goNext ? _smilIterator.currentPar.audio.clipEnd + 0.1 : DIRECTION_MARK - 1;\r\n\r\n onAudioPositionChanged(pos, from, true); //noLetPlay\r\n return;\r\n }\r\n }\r\n\r\n // _settings.mediaOverlaysSynchronizationGranularity\r\n if (!isPlaying && (_smilIterator.currentPar.element || _smilIterator.currentPar.cfi && _smilIterator.currentPar.cfi.cfiTextParent))\r\n {\r\n var scopeTo = _elementHighlighter.adjustParToSeqSyncGranularity(_smilIterator.currentPar);\r\n if (scopeTo && scopeTo !== _smilIterator.currentPar)\r\n {\r\n var scopeFrom = _elementHighlighter.adjustParToSeqSyncGranularity(parFrom);\r\n if (scopeFrom && (scopeFrom === scopeTo || !goNext))\r\n {\r\n if (scopeFrom === scopeTo)\r\n {\r\n do\r\n {\r\n if (goNext) _smilIterator.next();\r\n else _smilIterator.previous();\r\n } while (_smilIterator.currentPar && _smilIterator.currentPar.hasAncestor(scopeFrom));\r\n\r\n if (!_smilIterator.currentPar)\r\n {\r\n //console.debug(\"adjustParToSeqSyncGranularity nextSmil(goNext)\");\r\n\r\n if (doNotNextSmil)\r\n {\r\n _wasPausedBecauseNoAutoNextSmil = true;\r\n self.reset();\r\n //self.pause();\r\n }\r\n else\r\n {\r\n nextSmil(goNext);\r\n }\r\n \r\n return;\r\n }\r\n }\r\n \r\n//console.debug(\"ADJUSTED: \" + _smilIterator.currentPar.text.srcFragmentId);\r\n if (!goNext)\r\n {\r\n var landed = _elementHighlighter.adjustParToSeqSyncGranularity(_smilIterator.currentPar);\r\n if (landed && landed !== _smilIterator.currentPar)\r\n {\r\n var backup = _smilIterator.currentPar;\r\n \r\n var innerPar = undefined;\r\n do\r\n {\r\n innerPar = _smilIterator.currentPar;\r\n _smilIterator.previous();\r\n }\r\n while (_smilIterator.currentPar && _smilIterator.currentPar.hasAncestor(landed));\r\n \r\n if (_smilIterator.currentPar)\r\n {\r\n _smilIterator.next();\r\n \r\n if (!_smilIterator.currentPar.hasAncestor(landed))\r\n {\r\n console.error(\"adjustParToSeqSyncGranularity !_smilIterator.currentPar.hasAncestor(landed) ???\");\r\n }\r\n //assert \r\n }\r\n else\r\n {\r\n//console.debug(\"adjustParToSeqSyncGranularity reached begin\");\r\n\r\n _smilIterator.reset();\r\n \r\n if (_smilIterator.currentPar !== innerPar)\r\n {\r\n console.error(\"adjustParToSeqSyncGranularity _smilIterator.currentPar !=== innerPar???\");\r\n }\r\n }\r\n\r\n if (!_smilIterator.currentPar)\r\n {\r\n console.error(\"adjustParToSeqSyncGranularity !_smilIterator.currentPar ?????\");\r\n _smilIterator.goToPar(backup);\r\n }\r\n \r\n//console.debug(\"ADJUSTED PREV: \" + _smilIterator.currentPar.text.srcFragmentId);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n if(_audioPlayer.isPlaying()\r\n && _smilIterator.currentPar.audio.src\r\n && _smilIterator.currentPar.audio.src == _audioPlayer.currentSmilSrc()\r\n && position >= _smilIterator.currentPar.audio.clipBegin\r\n && position <= _smilIterator.currentPar.audio.clipEnd)\r\n {\r\n//console.debug(\"ONLY highlightCurrentElement\");\r\n highlightCurrentElement();\r\n return;\r\n }\r\n\r\n //position <= DIRECTION_MARK goes here (goto previous):\r\n\r\n// if (!noLetPlay && position > DIRECTION_MARK\r\n// && _audioPlayer.isPlaying() && _audioPlayer.srcRef() != _smilIterator.currentPar.audio.src)\r\n// {\r\n// _letPlay = true;\r\n// setTimeout(function()\r\n// {\r\n// _letPlay = false;\r\n// playCurrentPar();\r\n// }, 100);\r\n//\r\n// playCurrentPar();\r\n//\r\n// return;\r\n// }\r\n\r\n playCurrentPar();\r\n }\r\n\r\n this.touchInit = function()\r\n {\r\n var todo = _audioPlayer.touchInit();\r\n if (todo)\r\n {\r\n if (_enableHTMLSpeech)\r\n {\r\n speakStart(\"o\", 0);\r\n }\r\n }\r\n };\r\n\r\n var tokeniseTTS = function(element)\r\n {\r\n var BLOCK_DELIMITERS = ['p', 'div', 'pagenum', 'td', 'table', 'li', 'ul', 'ol'];\r\n var BOUNDARY_PUNCTUATION = [',', ';', '.', '-', '??', '??', '?', '!'];\r\n var IGNORABLE_PUNCTUATION = ['\"', '\\'', '??', '??', '??', '??'];\r\n\r\n var flush = function(t, r)\r\n {\r\n if (t.word.length <= 0)\r\n {\r\n return;\r\n }\r\n\r\n var pos = t.text.length;\r\n r.spanMap[pos] = t.counter;\r\n t.text += t.word;\r\n t.markup += t.html.substring(0, t.wordStart) +\r\n '' +\r\n t.html.substring(t.wordStart, t.wordEnd) +\r\n '' + t.html.substring(t.wordEnd, t.html.length);\r\n t.word = \"\";\r\n t.html = \"\";\r\n t.wordStart = -1;\r\n t.wordEnd = -1;\r\n t.counter++;\r\n };\r\n\r\n var r =\r\n {\r\n element : element,\r\n innerHTML_tts : \"\",\r\n spanMap : {},\r\n text : \"\",\r\n lastCharIndex : undefined\r\n };\r\n r.element.innerHTML_original = element.innerHTML;\r\n\r\n var t =\r\n {\r\n inTag : false,\r\n counter : 0,\r\n wordStart : -1,\r\n wordEnd : -1,\r\n text : '',\r\n markup : '',\r\n word : '',\r\n html : ''\r\n };\r\n\r\n var limit = r.element.innerHTML_original.length;\r\n var i = 0;\r\n while (i <= limit)\r\n {\r\n if (t.inTag)\r\n {\r\n t.html += r.element.innerHTML_original[i];\r\n if (r.element.innerHTML_original[i] == \">\") {\r\n t.inTag = false;\r\n // if it's a block element delimiter, flush\r\n var blockCheck = t.html.match(/<\\/(.*?)>$/);\r\n if (blockCheck && BLOCK_DELIMITERS.indexOf(blockCheck[1]) > -1)\r\n {\r\n flush(t, r);\r\n t.text += ' ';\r\n }\r\n }\r\n }\r\n else\r\n {\r\n if (i == limit || r.element.innerHTML_original[i].match(/\\s/))\r\n {\r\n flush(t, r);\r\n\r\n // append the captured whitespace\r\n if (i < limit)\r\n {\r\n t.text += r.element.innerHTML_original[i];\r\n t.markup += r.element.innerHTML_original[i];\r\n }\r\n }\r\n else if (BOUNDARY_PUNCTUATION.indexOf(r.element.innerHTML_original[i]) > -1)\r\n {\r\n flush(t, r);\r\n\r\n t.wordStart = t.html.length;\r\n t.wordEnd = t.html.length + 1;\r\n t.word += r.element.innerHTML_original[i];\r\n t.html += r.element.innerHTML_original[i];\r\n\r\n flush(t, r);\r\n }\r\n else if (r.element.innerHTML_original[i] == \"<\")\r\n {\r\n t.inTag = true;\r\n t.html += r.element.innerHTML_original[i];\r\n }\r\n else\r\n {\r\n if (t.word.length == 0)\r\n {\r\n t.wordStart = t.html.length;\r\n }\r\n t.wordEnd = t.html.length + 1;\r\n t.word += r.element.innerHTML_original[i];\r\n t.html += r.element.innerHTML_original[i];\r\n }\r\n }\r\n i++;\r\n }\r\n//\r\n//console.debug(t.text);\r\n// console.debug(\"----\");\r\n//console.debug(t.markup);\r\n\r\n r.text = t.text;\r\n r.innerHTML_tts = t.markup;\r\n r.element.innerHTML = r.innerHTML_tts;\r\n\r\n return r;\r\n };\r\n\r\n var $ttsStyle = undefined;\r\n function ensureTTSStyle($element)\r\n {\r\n if ($ttsStyle && $ttsStyle[0].ownerDocument === $element[0].ownerDocument)\r\n {\r\n return;\r\n }\r\n\r\n var style = \".tts_on{background-color:red;color:white;} .tts_off{}\";\r\n\r\n $head = $(\"head\", $element[0].ownerDocument.documentElement);\r\n\r\n $ttsStyle = $(\"\").appendTo($head);\r\n\r\n $ttsStyle.append(style);\r\n }\r\n\r\n var speakStart = function(txt, volume)\r\n {\r\n var tokenData = undefined;\r\n var curPar = (_smilIterator && _smilIterator.currentPar) ? _smilIterator.currentPar : undefined;\r\n var element = curPar ? curPar.element : undefined;\r\n var cfi = curPar ? curPar.cfi : undefined;\r\n\r\n if (!volume || volume > 0)\r\n {\r\n // gives the audio player some dispatcher time to raise the onPause event\r\n setTimeout(function(){\r\n onStatusChanged({isPlaying: true});\r\n }, 80);\r\n \r\n _ttsIsPlaying = true;\r\n\r\n if (TOKENIZE_TTS && element)\r\n {\r\n var $el = $(element);\r\n ensureTTSStyle($el);\r\n\r\n\r\n if (element.innerHTML_original)\r\n {\r\n element.innerHTML = element.innerHTML_original;\r\n element.innerHTML_original = undefined;\r\n }\r\n tokenData = tokeniseTTS(element);\r\n }\r\n }\r\n\r\n if (!_enableHTMLSpeech)\r\n {\r\n reader.emit(Globals.Events.MEDIA_OVERLAY_TTS_SPEAK, {tts: txt}); // resume if txt == undefined\r\n return;\r\n }\r\n\r\n if (!txt && window.speechSynthesis.paused)\r\n {\r\n//console.debug(\"TTS resume\");\r\n window.speechSynthesis.resume();\r\n\r\n return;\r\n }\r\n\r\n var text = txt || _currentTTS;\r\n\r\n if (text)\r\n {\r\n if (_SpeechSynthesisUtterance)\r\n {\r\n//console.debug(\"_SpeechSynthesisUtterance nullify\");\r\n\r\n if (TOKENIZE_TTS)\r\n {\r\n if (_SpeechSynthesisUtterance.onend)\r\n {\r\n _SpeechSynthesisUtterance.onend({forceSkipEnd: true, target: _SpeechSynthesisUtterance});\r\n }\r\n \r\n _SpeechSynthesisUtterance.tokenData = undefined;\r\n \r\n _SpeechSynthesisUtterance.onboundary = undefined;\r\n // _SpeechSynthesisUtterance.onboundary = function(event)\r\n // {\r\n // console.debug(\"OLD TTS boundary\");\r\n // \r\n // event.target.tokenData = undefined;\r\n // \r\n // };\r\n }\r\n\r\n _SpeechSynthesisUtterance.onend = undefined;\r\n// _SpeechSynthesisUtterance.onend = function(event)\r\n// {\r\n// console.debug(\"OLD TTS ended\");\r\n// if (TOKENIZE_TTS)\r\n// {\r\n// event.target.tokenData = undefined;\r\n// }\r\n// };\r\n \r\n _SpeechSynthesisUtterance.onerror = undefined;\r\n// _SpeechSynthesisUtterance.onerror = function(event)\r\n// {\r\n// console.debug(\"OLD TTS error\");\r\n// //console.debug(event);\r\n// if (TOKENIZE_TTS)\r\n// {\r\n// event.target.tokenData = undefined;\r\n// }\r\n// };\r\n\r\n _SpeechSynthesisUtterance = undefined;\r\n }\r\n//\r\n// if (window.speechSynthesis.pending ||\r\n// window.speechSynthesis.speaking)\r\n// {\r\n// _skipTTSEndEvent = true;\r\n// }\r\n \r\nconsole.debug(\"paused: \"+window.speechSynthesis.paused);\r\nconsole.debug(\"speaking: \"+window.speechSynthesis.speaking);\r\nconsole.debug(\"pending: \"+window.speechSynthesis.pending);\r\n\r\n// if (!window.speechSynthesis.paused)\r\n// {\r\n// console.debug(\"TTS pause before speak\");\r\n// window.speechSynthesis.pause();\r\n// }\r\n \r\n function cancelTTS(first)\r\n {\r\n if (first || window.speechSynthesis.pending)\r\n {\r\n console.debug(\"TTS cancel before speak\");\r\n window.speechSynthesis.cancel();\r\n\r\n setTimeout(function()\r\n {\r\n cancelTTS(false);\r\n }, 5);\r\n }\r\n else\r\n {\r\n updateTTS();\r\n }\r\n }\r\n cancelTTS(true);\r\n \r\n function updateTTS()\r\n {\r\n // setTimeout(function()\r\n // {\r\n\r\n _SpeechSynthesisUtterance = new SpeechSynthesisUtterance();\r\n\r\n if (TOKENIZE_TTS && tokenData)\r\n {\r\n _SpeechSynthesisUtterance.tokenData = tokenData;\r\n \r\n _SpeechSynthesisUtterance.onboundary = function(event)\r\n //_SpeechSynthesisUtterance.addEventListener(\"boundary\", function(event)\r\n {\r\n if (!_SpeechSynthesisUtterance)\r\n {\r\n return;\r\n }\r\n\r\n console.debug(\"TTS boundary: \" + event.name + \" / \" + event.charIndex);\r\n //console.debug(event);\r\n\r\n var tokenised = event.target.tokenData;\r\n if (!tokenised || !tokenised.spanMap.hasOwnProperty(event.charIndex))\r\n {\r\n return;\r\n }\r\n\r\n if (false && tokenised.lastCharIndex)\r\n {\r\n //console.debug(\"TTS lastCharIndex: \" + tokenised.lastCharIndex);\r\n var id = 'tts_' + tokenised.spanMap[tokenised.lastCharIndex];\r\n //console.debug(\"TTS lastCharIndex ID: \" + id);\r\n var spanPrevious = tokenised.element.querySelector(\"#\"+id);\r\n if (spanPrevious)\r\n {\r\n //console.debug(\"TTS OFF\");\r\n spanPrevious.className = 'tts_off';\r\n //spanPrevious.style.backgroundColor = \"white\";\r\n }\r\n }\r\n else\r\n {\r\n [].forEach.call(\r\n tokenised.element.querySelectorAll(\".tts_on\"),\r\n function(el)\r\n {\r\n console.debug(\"TTS OFF \" + el.id);\r\n el.className = 'tts_off';\r\n }\r\n );\r\n }\r\n\r\n var id = 'tts_' + tokenised.spanMap[event.charIndex];\r\n console.debug(\"TTS charIndex ID: \" + id);\r\n var spanNew = tokenised.element.querySelector(\"#\"+id);\r\n if (spanNew)\r\n {\r\n console.debug(\"TTS ON\");\r\n spanNew.className = 'tts_on';\r\n //spanNew.style.backgroundColor = \"transparent\";\r\n }\r\n\r\n tokenised.lastCharIndex = event.charIndex;\r\n };\r\n }\r\n\r\n _SpeechSynthesisUtterance.onend = function(event)\r\n //_SpeechSynthesisUtterance.addEventListener(\"end\", function(event)\r\n {\r\n if (!_SpeechSynthesisUtterance)\r\n {\r\n //_skipTTSEndEvent = false;\r\n return;\r\n }\r\n //\r\n // if (_skipTTSEndEvent)\r\n // {\r\n // _skipTTSEndEvent = false;\r\n // return;\r\n // }\r\n\r\nconsole.debug(\"TTS ended\");\r\n //console.debug(event);\r\n\r\n if (TOKENIZE_TTS)\r\n {\r\n var tokenised = event.target.tokenData;\r\n\r\n var doEnd = !event.forceSkipEnd && (_SpeechSynthesisUtterance === event.target) && (!tokenised || tokenised.element.innerHTML_original);\r\n\r\n if (tokenised)\r\n {\r\n if (tokenised.element.innerHTML_original)\r\n {\r\n tokenised.element.innerHTML = tokenised.element.innerHTML_original;\r\n }\r\n else\r\n {\r\n [].forEach.call(\r\n tokenised.element.querySelectorAll(\".tts_on\"),\r\n function(el)\r\n {\r\n console.debug(\"TTS OFF (end)\" + el.id);\r\n el.className = 'tts_off';\r\n }\r\n );\r\n }\r\n\r\n tokenised.element.innerHTML_original = undefined;\r\n }\r\n\r\n\r\n if (doEnd)\r\n {\r\n self.onTTSEnd();\r\n }\r\n else\r\n {\r\n console.debug(\"TTS end SKIPPED\");\r\n }\r\n }\r\n else\r\n {\r\n self.onTTSEnd();\r\n }\r\n };\r\n\r\n _SpeechSynthesisUtterance.onerror = function(event)\r\n //_SpeechSynthesisUtterance.addEventListener(\"error\", function(event)\r\n {\r\n if (!_SpeechSynthesisUtterance)\r\n {\r\n return;\r\n }\r\n\r\nconsole.error(\"TTS error\");\r\n//console.debug(event);\r\nconsole.debug(_SpeechSynthesisUtterance.text);\r\nconsole.debug(window.speechSynthesis.paused);\r\nconsole.debug(window.speechSynthesis.pending);\r\nconsole.debug(window.speechSynthesis.speaking);\r\n\r\n if (TOKENIZE_TTS)\r\n {\r\n var tokenised = event.target.tokenData;\r\n if (tokenised)\r\n {\r\n if (tokenised.element.innerHTML_original)\r\n {\r\n tokenised.element.innerHTML = tokenised.element.innerHTML_original;\r\n }\r\n else\r\n {\r\n [].forEach.call(\r\n tokenised.element.ownerDocument.querySelectorAll(\".tts_on\"),\r\n function(el)\r\n {\r\n console.debug(\"TTS OFF (error)\" + el.id);\r\n el.className = 'tts_off';\r\n }\r\n );\r\n }\r\n tokenised.element.innerHTML_original = undefined;\r\n }\r\n }\r\n };\r\n\r\n var vol = volume || _audioPlayer.getVolume();\r\n _SpeechSynthesisUtterance.volume = vol;\r\n\r\n _SpeechSynthesisUtterance.rate = _audioPlayer.getRate();\r\n _SpeechSynthesisUtterance.pitch = 1;\r\n\r\n //_SpeechSynthesisUtterance.lang = \"en-US\";\r\n\r\n _SpeechSynthesisUtterance.text = text;\r\n\r\n //console.debug(\"TTS speak: \" + text);\r\n window.speechSynthesis.speak(_SpeechSynthesisUtterance);\r\n\r\n if (window.speechSynthesis.paused)\r\n {\r\nconsole.debug(\"TTS resume\");\r\n window.speechSynthesis.resume();\r\n }\r\n\r\n //}, 5);\r\n }\r\n }\r\n };\r\n\r\n var speakStop = function()\r\n {\r\n onStatusChanged({isPlaying: false});\r\n _ttsIsPlaying = false;\r\n\r\n if (!_enableHTMLSpeech)\r\n {\r\n reader.emit(Globals.Events.MEDIA_OVERLAY_TTS_STOP, undefined);\r\n return;\r\n }\r\n\r\n//console.debug(\"TTS pause\");\r\n window.speechSynthesis.pause();\r\n };\r\n\r\n var _timerTick = undefined;\r\n\r\n function onPlay() {\r\n onPause();\r\n\r\n var func = function() {\r\n\r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n return;\r\n }\r\n\r\n var smil = _smilIterator.smil; //currentPar.getSmil();\r\n if (!smil.mo)\r\n {\r\n return;\r\n }\r\n\r\n// if (!_smilIterator.currentPar.audio.src)\r\n// {\r\n// return;\r\n// }\r\n\r\n var playPosition = audioCurrentTime - _smilIterator.currentPar.audio.clipBegin;\r\n if (playPosition <= 0)\r\n {\r\n return;\r\n }\r\n\r\n var smilIndex = smil.mo.smil_models.indexOf(smil);\r\n\r\n var smilIterator = new SmilIterator(smil);\r\n var parIndex = -1;\r\n while (smilIterator.currentPar)\r\n {\r\n parIndex++;\r\n if (smilIterator.currentPar == _smilIterator.currentPar)\r\n {\r\n break;\r\n }\r\n smilIterator.next();\r\n }\r\n\r\n onStatusChanged({playPosition: playPosition, smilIndex: smilIndex, parIndex: parIndex});\r\n };\r\n\r\n setTimeout(func, 500);\r\n\r\n _timerTick = setInterval(func, 1500);\r\n }\r\n\r\n function onPause() {\r\n\r\n audioCurrentTime = 0.0;\r\n if (_timerTick !== undefined)\r\n {\r\n clearInterval(_timerTick);\r\n }\r\n _timerTick = undefined;\r\n }\r\n\r\n\r\n this.onEmbeddedEnd = function()\r\n {\r\n audioCurrentTime = 0.0;\r\n\r\n _embeddedIsPlaying = false;\r\n //_currentEmbedded = undefined;\r\n\r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n onAudioPositionChanged(_smilIterator.currentPar.audio.clipEnd + 0.1, 3);\r\n };\r\n\r\n this.onTTSEnd = function()\r\n {\r\n audioCurrentTime = 0.0;\r\n\r\n _ttsIsPlaying = false;\r\n //_currentTTS = undefined;\r\n\r\n// if(_skipTTSEnded)\r\n// {\r\n// _skipTTSEnded = false;\r\n// return;\r\n// }\r\n\r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n onAudioPositionChanged(_smilIterator.currentPar.audio.clipEnd + 0.1, 4);\r\n };\r\n\r\n function onAudioEnded() {\r\n\r\n onPause();\r\n//\r\n// if (_letPlay)\r\n// {\r\n// return;\r\n// }\r\n\r\n if(_skipAudioEnded)\r\n {\r\n _skipAudioEnded = false;\r\n return;\r\n }\r\n\r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n onAudioPositionChanged(_smilIterator.currentPar.audio.clipEnd + 0.1, 5);\r\n }\r\n\r\n function highlightCurrentElement() {\r\n\r\n if(!_smilIterator) {\r\n return;\r\n }\r\n\r\n if(!_smilIterator.currentPar) {\r\n return;\r\n }\r\n\r\n if (_smilIterator.currentPar.text.srcFragmentId && _smilIterator.currentPar.text.srcFragmentId.length > 0)\r\n {\r\n if (_smilIterator.currentPar.element) {\r\n //console.error(_smilIterator.currentPar.element.id + \": \" + _smilIterator.currentPar.audio.clipBegin + \" / \" + _smilIterator.currentPar.audio.clipEnd);\r\n\r\n if (!_elementHighlighter.isElementHighlighted(_smilIterator.currentPar))\r\n {\r\n _elementHighlighter.highlightElement(_smilIterator.currentPar, _package.media_overlay.activeClass, _package.media_overlay.playbackActiveClass);\r\n\r\n if (!_wasPlayingScrolling)\r\n {\r\n reader.insureElementVisibility(_smilIterator.currentPar.getSmil().spineItemId, _smilIterator.currentPar.element, self);\r\n }\r\n }\r\n \r\n return;\r\n \r\n } else if (_smilIterator.currentPar.cfi) {\r\n\r\n if (!_elementHighlighter.isCfiHighlighted(_smilIterator.currentPar))\r\n {\r\n _elementHighlighter.highlightCfi(_smilIterator.currentPar, _package.media_overlay.activeClass, _package.media_overlay.playbackActiveClass);\r\n\r\n if (!_wasPlayingScrolling)\r\n {\r\n reader.insureElementVisibility(_smilIterator.currentPar.getSmil().spineItemId, _smilIterator.currentPar.cfi.cfiTextParent, self);\r\n }\r\n }\r\n \r\n return;\r\n }\r\n }\r\n \r\n // body (not FRAG ID)\r\n if (_smilIterator.currentPar.element) {\r\n return;\r\n }\r\n \r\n //else: single SMIL per multiple XHTML? ==> open new spine item\r\n \r\n /*\r\n var textRelativeRef = Globals.Helpers.ResolveContentRef(_smilIterator.currentPar.text.srcFile, _smilIterator.smil.href);\r\nconsole.debug(\"textRelativeRef: \" + textRelativeRef);\r\n if (textRelativeRef)\r\n {\r\n var textAbsoluteRef = _package.resolveRelativeUrl(textRelativeRef);\r\nconsole.debug(\"textAbsoluteRef: \" + textAbsoluteRef);\r\n }\r\n */\r\n\r\n var src = _smilIterator.currentPar.text.src;\r\n var base = _smilIterator.smil.href;\r\n\r\n //self.pause();\r\n //self.reset();\r\n _smilIterator = undefined;\r\n\r\n reader.openContentUrl(src, base, self);\r\n }\r\n\r\n this.escape = function() {\r\n \r\n if(!_smilIterator || !_smilIterator.currentPar) {\r\n\r\n this.toggleMediaOverlay();\r\n return;\r\n }\r\n\r\n if(!self.isPlaying())\r\n {\r\n //playCurrentPar();\r\n self.play();\r\n return;\r\n }\r\n\r\n if(_settings.mediaOverlaysEscapeEscapables)\r\n {\r\n var parent = _smilIterator.currentPar;\r\n while (parent)\r\n {\r\n if (parent.isEscapable && parent.isEscapable(_settings.mediaOverlaysEscapables))\r\n {\r\n do\r\n {\r\n _smilIterator.next();\r\n } while (_smilIterator.currentPar && _smilIterator.currentPar.hasAncestor(parent));\r\n\r\n if (!_smilIterator.currentPar)\r\n {\r\n nextSmil(true);\r\n return;\r\n }\r\n\r\n //_smilIterator.goToPar(_smilIterator.currentPar);\r\n playCurrentPar();\r\n return;\r\n }\r\n\r\n parent = parent.parent;\r\n }\r\n }\r\n\r\n this.nextMediaOverlay(true);\r\n };\r\n\r\n\r\n this.playUserPar = function(par) {\r\n if(self.isPlaying())\r\n {\r\n self.pause();\r\n }\r\n\r\n if (par.element || par.cfi && par.cfi.cfiTextParent)\r\n {\r\n var seq = _elementHighlighter.adjustParToSeqSyncGranularity(par);\r\n if (seq && seq !== par)\r\n {\r\n var findFirstPar = function(smilNode)\r\n {\r\n if (smilNode.nodeType && smilNode.nodeType === \"par\") return smilNode;\r\n \r\n if (!smilNode.children || smilNode.children.length <= 0) return undefined;\r\n \r\n for (var i = 0; i < smilNode.children.length; i++)\r\n {\r\n var child = smilNode.children[i];\r\n var inPar = findFirstPar(child);\r\n if (inPar) return inPar;\r\n }\r\n };\r\n var firstPar = findFirstPar(seq);\r\n if (firstPar) par = firstPar;\r\n }\r\n }\r\n\r\n playPar(par);\r\n };\r\n\r\n this.resetTTS = function() {\r\n _currentTTS = undefined;\r\n// _skipTTSEnded = false;\r\n speakStop();\r\n };\r\n\r\n this.resetBlankPage = function() {\r\n if (_blankPagePlayer)\r\n {\r\n var timer = _blankPagePlayer;\r\n _blankPagePlayer = undefined;\r\n clearTimeout(timer);\r\n }\r\n _blankPagePlayer = undefined;\r\n\r\n onStatusChanged({isPlaying: false});\r\n };\r\n\r\n this.resetEmbedded = function() {\r\n if (_currentEmbedded)\r\n {\r\n $(_currentEmbedded).off(\"ended\", self.onEmbeddedEnd);\r\n _currentEmbedded.pause();\r\n }\r\n _currentEmbedded = undefined;\r\n onStatusChanged({isPlaying: false});\r\n _embeddedIsPlaying = false;\r\n };\r\n\r\n this.reset = function() {\r\n clipBeginOffset = 0.0;\r\n _audioPlayer.reset();\r\n self.resetTTS();\r\n self.resetEmbedded();\r\n self.resetBlankPage();\r\n _elementHighlighter.reset();\r\n _smilIterator = undefined;\r\n _skipAudioEnded = false;\r\n };\r\n\r\n this.play = function ()\r\n {\r\n if (_smilIterator && _smilIterator.smil && !_smilIterator.smil.id)\r\n {\r\n initBlankPagePlayer();\r\n return;\r\n }\r\n else if (_currentEmbedded)\r\n {\r\n _embeddedIsPlaying = true;\r\n _currentEmbedded.play();\r\n onStatusChanged({isPlaying: true});\r\n }\r\n else if (_currentTTS)\r\n {\r\n speakStart(undefined);\r\n }\r\n else\r\n {\r\n if (!_audioPlayer.play())\r\n {\r\n console.log(\"Audio player was dead, reactivating...\");\r\n\r\n this.reset();\r\n this.toggleMediaOverlay();\r\n return;\r\n }\r\n }\r\n\r\n highlightCurrentElement();\r\n }\r\n\r\n this.pause = function()\r\n {\r\n _wasPlayingScrolling = false;\r\n \r\n if (_blankPagePlayer)\r\n {\r\n this.resetBlankPage();\r\n }\r\n else if (_embeddedIsPlaying)\r\n {\r\n _embeddedIsPlaying = false;\r\n if (_currentEmbedded)\r\n {\r\n _currentEmbedded.pause();\r\n }\r\n onStatusChanged({isPlaying: false});\r\n }\r\n else if (_ttsIsPlaying)\r\n {\r\n speakStop();\r\n }\r\n else\r\n {\r\n _audioPlayer.pause();\r\n }\r\n\r\n _elementHighlighter.reset();\r\n }\r\n\r\n this.isMediaOverlayAvailable = function() {\r\n\r\n// console.debug(\"isMediaOverlayAvailable()\");\r\n//\r\n// var now1 = window.performance && window.performance.now ? window.performance.now() : Date.now();\r\n//\r\n// if (console.time)\r\n// {\r\n// console.time(\"MO\");\r\n// }\r\n\r\n var visibleMediaElement = reader.getFirstVisibleMediaOverlayElement();\r\n\r\n// if (console.timeEnd)\r\n// {\r\n// console.timeEnd(\"MO\");\r\n// }\r\n//\r\n// var now2 = window.performance && window.performance.now ? window.performance.now() : Date.now();\r\n//\r\n// console.debug(now2 - now1);\r\n\r\n return typeof visibleMediaElement !== \"undefined\";\r\n };\r\n\r\n this.nextOrPreviousMediaOverlay = function(previous) {\r\n if(self.isPlaying())\r\n {\r\n self.pause();\r\n }\r\n else\r\n {\r\n if (_smilIterator && _smilIterator.currentPar)\r\n {\r\n //playCurrentPar();\r\n self.play();\r\n return;\r\n }\r\n }\r\n\r\n if(!_smilIterator)\r\n {\r\n this.toggleMediaOverlay();\r\n return;\r\n }\r\n\r\n var position = previous ? DIRECTION_MARK - 1 : _smilIterator.currentPar.audio.clipEnd + 0.1;\r\n\r\n onAudioPositionChanged(position, 6);\r\n // setTimeout(function(){\r\n // \r\n // }, 1);\r\n\r\n //self.play();\r\n //playCurrentPar();\r\n };\r\n\r\n this.nextMediaOverlay = function() {\r\n this.nextOrPreviousMediaOverlay(false);\r\n };\r\n\r\n this.previousMediaOverlay = function() {\r\n this.nextOrPreviousMediaOverlay(true);\r\n };\r\n\r\n /*\r\n this.setMediaOverlaySkippables = function(items) {\r\n\r\n };\r\n\r\n this.setMediaOverlayEscapables = function(items) {\r\n\r\n };\r\n */\r\n\r\n this.mediaOverlaysOpenContentUrl = function(contentRefUrl, sourceFileHref, offset)\r\n {\r\n clipBeginOffset = offset;\r\n\r\n //self.pause();\r\n //self.reset();\r\n _smilIterator = undefined;\r\n\r\n reader.openContentUrl(contentRefUrl, sourceFileHref, self);\r\n\r\n /*\r\n if (_currentPagination && _currentPagination.isFixedLayout && _currentPagination.openPages && _currentPagination.openPages.length > 0)\r\n {\r\n var combinedPath = Globals.Helpers.ResolveContentRef(contentRefUrl, sourceFileHref);\r\n\r\n var hashIndex = combinedPath.indexOf(\"#\");\r\n var hrefPart;\r\n var elementId;\r\n if(hashIndex >= 0) {\r\n hrefPart = combinedPath.substr(0, hashIndex);\r\n elementId = combinedPath.substr(hashIndex + 1);\r\n }\r\n else {\r\n hrefPart = combinedPath;\r\n elementId = undefined;\r\n }\r\n\r\n var spineItem = reader.spine.getItemByHref(hrefPart);\r\n var spineItemIndex = _currentPagination.openPages[0].spineItemIndex;\r\n\r\n //var idref = _currentPagination.openPages[0].idref;\r\n //spineItem.idref === idref\r\n //var currentSpineItem = reader.spine.getItemById(idref);\r\n //currentSpineItem == spineItem\r\n if (spineItem.index === spineItemIndex)\r\n {\r\n self.onPageChanged({\r\n paginationInfo: _currentPagination,\r\n elementId: elementId,\r\n initiator: self\r\n });\r\n }\r\n }\r\n */\r\n };\r\n\r\n this.toggleMediaOverlay = function() {\r\n if(self.isPlaying()) {\r\n self.pause();\r\n return;\r\n }\r\n\r\n //if we have position to continue from (reset wasn't called)\r\n if(_smilIterator) {\r\n self.play();\r\n return;\r\n }\r\n\r\n this.toggleMediaOverlayRefresh(undefined);\r\n };\r\n\r\n var _wasPlayingScrolling = false;\r\n\r\n this.toggleMediaOverlayRefresh = function(paginationData)\r\n {\r\n//console.debug(\"moData SMIL: \" + moData.par.getSmil().href + \" // \" + + moData.par.getSmil().id);\r\n\r\n var spineItems = reader.getLoadedSpineItems();\r\n\r\n //paginationData.isRightToLeft\r\n var rtl = reader.spine().isRightToLeft();\r\n\r\n //paginationData.spineItemCount\r\n //paginationData.openPages\r\n //{spineItemPageIndex: , spineItemPageCount: , idref: , spineItemIndex: }\r\n\r\n var playingPar = undefined;\r\n var wasPlaying = self.isPlaying();\r\n if(wasPlaying && _smilIterator)\r\n {\r\n var isScrollView = paginationData.initiator && paginationData.initiator instanceof ScrollView;\r\n if (isScrollView && _settings.mediaOverlaysPreservePlaybackWhenScroll)\r\n {\r\n _wasPlayingScrolling = true;\r\n return;\r\n }\r\n \r\n playingPar = _smilIterator.currentPar;\r\n self.pause();\r\n }\r\n \r\n _wasPlayingScrolling = false;\r\n\r\n //paginationData && paginationData.elementId\r\n //paginationData.initiator != self\r\n\r\n //_package.isFixedLayout()\r\n\r\n var element = (paginationData && paginationData.elementIdResolved) ? paginationData.elementIdResolved : undefined;\r\n\r\n var id = (paginationData && paginationData.elementId) ? paginationData.elementId : undefined;\r\n\r\n if (!element)\r\n {\r\n if (id)\r\n {\r\n console.error(\"[WARN] id did not resolve to element?\");\r\n }\r\n \r\n for(var i = (rtl ? (spineItems.length - 1) : 0); (rtl && i >=0) || (!rtl && i < spineItems.length); i += (rtl ? -1: 1))\r\n {\r\n var spineItem = spineItems[i];\r\n if (!spineItem)\r\n {\r\n console.error(\"spineItems[i] is undefined??\");\r\n continue;\r\n }\r\n \r\n if (paginationData && paginationData.spineItem && paginationData.spineItem != spineItem)\r\n {\r\n continue;\r\n }\r\n\r\n if (id)\r\n {\r\n var $element = reader.getElementById(spineItem, id);\r\n //var $element = reader.getElement(spineItem, \"#\" + Globals.Helpers.escapeJQuerySelector(id));\r\n element = ($element && $element.length > 0) ? $element[0] : undefined;\r\n }\r\n else if (spineItem.isFixedLayout())\r\n {\r\n if (paginationData && paginationData.paginationInfo && paginationData.paginationInfo.openPages)\r\n {\r\n // openPages are sorted by spineItem index, so the smallest index on display is the one we need to play (page on the left in LTR, or page on the right in RTL progression)\r\n var index = 0; // !paginationData.paginationInfo.isRightToLeft ? 0 : paginationData.paginationInfo.openPages.length - 1;\r\n \r\n if (paginationData.paginationInfo.openPages[index] && paginationData.paginationInfo.openPages[index].idref && paginationData.paginationInfo.openPages[index].idref === spineItem.idref)\r\n {\r\n var $element = reader.getElement(spineItem, \"body\");\r\n element = ($element && $element.length > 0) ? $element[0] : undefined;\r\n }\r\n }\r\n }\r\n\r\n if (element)\r\n {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!element)\r\n {\r\n element = reader.getFirstVisibleMediaOverlayElement();\r\n }\r\n\r\n if (!element)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n var moData = $(element).data(\"mediaOverlayData\");\r\n\r\n if (!moData)\r\n {\r\n var foundMe = false;\r\n var depthFirstTraversal = function(elements)\r\n {\r\n if (!elements)\r\n {\r\n return false;\r\n }\r\n\r\n for (var i = 0; i < elements.length; i++)\r\n {\r\n if (element === elements[i]) foundMe = true;\r\n \r\n if (foundMe)\r\n {\r\n var d = $(elements[i]).data(\"mediaOverlayData\");\r\n if (d)\r\n {\r\n moData = d;\r\n return true;\r\n }\r\n }\r\n\r\n var found = depthFirstTraversal(elements[i].children);\r\n if (found)\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n var root = element;\r\n while (root && root.nodeName.toLowerCase() !== \"body\")\r\n {\r\n root = root.parentNode;\r\n }\r\n\r\n if (!root)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n depthFirstTraversal([root]);\r\n }\r\n\r\n if (!moData)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n var zPar = moData.par ? moData.par : moData.pars[0];\r\n var parSmil = zPar.getSmil();\r\n if(!_smilIterator || _smilIterator.smil != parSmil)\r\n {\r\n _smilIterator = new SmilIterator(parSmil);\r\n }\r\n else\r\n {\r\n _smilIterator.reset();\r\n }\r\n \r\n _smilIterator.goToPar(zPar);\r\n \r\n if (!_smilIterator.currentPar && id)\r\n {\r\n _smilIterator.reset();\r\n _smilIterator.findTextId(id);\r\n }\r\n \r\n if (!_smilIterator.currentPar)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n if (wasPlaying && playingPar && playingPar === _smilIterator.currentPar)\r\n {\r\n self.play();\r\n }\r\n else\r\n {\r\n playCurrentPar();\r\n //playPar(zPar);\r\n }\r\n };\r\n\r\n this.isPlayingCfi = function()\r\n {\r\n return _smilIterator && _smilIterator.currentPar && _smilIterator.currentPar.cfi;\r\n };\r\n \r\n var _wasPausedBecauseNoAutoNextSmil = false;\r\n var _autoNextSmil = true;\r\n this.setAutomaticNextSmil = function(autoNext)\r\n {\r\n _autoNextSmil = autoNext;\r\n };\r\n};\r\n return MediaOverlayPlayer;\r\n});\r\n\n", - "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/spine',[\"./spine_item\"], function(SpineItem) {\r\n/**\r\n * Wrapper of the spine object received from hosting application\r\n *\r\n * @class Models.Spine\r\n */\r\n\r\nvar Spine = function(epubPackage, spineDTO) {\r\n\r\n var self = this;\r\n\r\n /*\r\n * Collection of spine items\r\n * @property items\r\n * @type {Array}\r\n */\r\n this.items = [];\r\n\r\n /*\r\n * Page progression direction ltr|rtl|default\r\n * @property direction\r\n * @type {string}\r\n */\r\n this.direction = \"ltr\";\r\n\r\n /*\r\n * @property package\r\n * @type {Models.Package}\r\n *\r\n */\r\n this.package = epubPackage;\r\n\r\n var _handleLinear = false;\r\n\r\n this.handleLinear = function(handleLinear) {\r\n _handleLinear = handleLinear;\r\n };\r\n\r\n function isValidLinearItem(item) {\r\n return !_handleLinear || item.linear !== \"no\";\r\n }\r\n\r\n\r\n this.isValidLinearItem = function(index) {\r\n \r\n if(!isValidIndex(index)) {\r\n return undefined;\r\n }\r\n\r\n return isValidLinearItem(this.item(index));\r\n };\r\n\r\n this.prevItem = function(item) {\r\n\r\n return lookForPrevValidItem(item.index - 1);\r\n };\r\n\r\n function lookForNextValidItem(ix) {\r\n\r\n if(!isValidIndex(ix)) {\r\n return undefined;\r\n }\r\n\r\n var item = self.items[ix];\r\n\r\n if(isValidLinearItem(item)) {\r\n return item;\r\n }\r\n\r\n return lookForNextValidItem(item.index + 1);\r\n }\r\n\r\n function lookForPrevValidItem(ix) {\r\n\r\n if(!isValidIndex(ix)) {\r\n return undefined;\r\n }\r\n\r\n var item = self.items[ix];\r\n\r\n if(isValidLinearItem(item)) {\r\n return item;\r\n }\r\n\r\n return lookForPrevValidItem(item.index - 1);\r\n }\r\n\r\n this.nextItem = function(item){\r\n\r\n return lookForNextValidItem(item.index + 1);\r\n };\r\n\r\n this.getItemUrl = function(item) {\r\n\r\n return self.package.resolveRelativeUrl(item.href);\r\n\r\n };\r\n\r\n function isValidIndex(index) {\r\n\r\n return index >= 0 && index < self.items.length;\r\n }\r\n\r\n this.first = function() {\r\n\r\n return lookForNextValidItem(0);\r\n };\r\n\r\n this.last = function() {\r\n\r\n return lookForPrevValidItem(this.items.length - 1);\r\n };\r\n\r\n this.isFirstItem = function(item) {\r\n\r\n return self.first() === item;\r\n };\r\n\r\n this.isLastItem = function(item) {\r\n\r\n return self.last() === item;\r\n };\r\n\r\n this.item = function(index) {\r\n\t\t\r\n\t\tif (isValidIndex(index))\r\n \treturn self.items[index];\r\n\t\t\t\r\n\t\treturn undefined;\r\n };\r\n\r\n this.isRightToLeft = function() {\r\n\r\n return self.direction == \"rtl\";\r\n };\r\n\r\n this.isLeftToRight = function() {\r\n\r\n return !self.isRightToLeft();\r\n };\r\n\r\n this.getItemById = function(idref) {\r\n\r\n var length = self.items.length;\r\n\r\n for(var i = 0; i < length; i++) {\r\n if(self.items[i].idref == idref) {\r\n\r\n return self.items[i];\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n this.getItemByHref = function(href) {\r\n\r\n var length = self.items.length;\r\n\r\n for(var i = 0; i < length; i++) {\r\n if(self.items[i].href == href) {\r\n\r\n return self.items[i];\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n function updateSpineItemsSpread() {\r\n\r\n var len = self.items.length;\r\n\r\n var isFirstPageInSpread = false;\r\n var baseSide = self.isLeftToRight() ? SpineItem.SPREAD_LEFT : SpineItem.SPREAD_RIGHT;\r\n\r\n for(var i = 0; i < len; i++) {\r\n\r\n var spineItem = self.items[i];\r\n if( !spineItem.page_spread) {\r\n\r\n var spread = spineItem.isRenditionSpreadAllowed() ? (isFirstPageInSpread ? baseSide : SpineItem.alternateSpread(baseSide)) : SpineItem.SPREAD_CENTER;\r\n spineItem.setSpread(spread);\r\n }\r\n\r\n isFirstPageInSpread = !spineItem.isRenditionSpreadAllowed() || spineItem.page_spread != baseSide;\r\n }\r\n }\r\n\r\n if(spineDTO) {\r\n\r\n if(spineDTO.direction) {\r\n this.direction = spineDTO.direction;\r\n }\r\n\r\n var length = spineDTO.items.length;\r\n for(var i = 0; i < length; i++) {\r\n var item = new SpineItem(spineDTO.items[i], i, this);\r\n this.items.push(item);\r\n }\r\n\r\n updateSpineItemsSpread();\r\n }\r\n\r\n};\r\n return Spine;\r\n});\r\n\n", + "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/spine',[\"./spine_item\"], function(SpineItem) {\r\n/**\r\n * Wrapper of the spine object received from hosting application\r\n *\r\n * @class Models.Spine\r\n */\r\n\r\nvar Spine = function(epubPackage, spineDTO) {\r\n\r\n var self = this;\r\n\r\n /*\r\n * Collection of spine items\r\n * @property items\r\n * @type {Array}\r\n */\r\n this.items = [];\r\n\r\n /*\r\n * Page progression direction ltr|rtl|default\r\n * @property direction\r\n * @type {string}\r\n */\r\n this.direction = \"ltr\";\r\n\r\n /*\r\n * @property package\r\n * @type {Models.Package}\r\n *\r\n */\r\n this.package = epubPackage;\r\n\r\n var _handleLinear = true;\r\n\r\n this.handleLinear = function(handleLinear) {\r\n _handleLinear = handleLinear;\r\n };\r\n\r\n function isValidLinearItem(item) {\r\n return !_handleLinear || item.linear !== \"no\";\r\n }\r\n\r\n\r\n this.isValidLinearItem = function(index) {\r\n \r\n if(!isValidIndex(index)) {\r\n return undefined;\r\n }\r\n\r\n return isValidLinearItem(this.item(index));\r\n };\r\n\r\n this.prevItem = function(item) {\r\n\r\n return lookForPrevValidItem(item.index - 1);\r\n };\r\n\r\n function lookForNextValidItem(ix) {\r\n\r\n if(!isValidIndex(ix)) {\r\n return undefined;\r\n }\r\n\r\n var item = self.items[ix];\r\n\r\n if(isValidLinearItem(item)) {\r\n return item;\r\n }\r\n\r\n return lookForNextValidItem(item.index + 1);\r\n }\r\n\r\n function lookForPrevValidItem(ix) {\r\n\r\n if(!isValidIndex(ix)) {\r\n return undefined;\r\n }\r\n\r\n var item = self.items[ix];\r\n\r\n if(isValidLinearItem(item)) {\r\n return item;\r\n }\r\n\r\n return lookForPrevValidItem(item.index - 1);\r\n }\r\n\r\n this.nextItem = function(item){\r\n\r\n return lookForNextValidItem(item.index + 1);\r\n };\r\n\r\n this.getItemUrl = function(item) {\r\n\r\n return self.package.resolveRelativeUrl(item.href);\r\n\r\n };\r\n\r\n function isValidIndex(index) {\r\n\r\n return index >= 0 && index < self.items.length;\r\n }\r\n\r\n this.first = function() {\r\n\r\n return lookForNextValidItem(0);\r\n };\r\n\r\n this.last = function() {\r\n\r\n return lookForPrevValidItem(this.items.length - 1);\r\n };\r\n\r\n this.isFirstItem = function(item) {\r\n\r\n return self.first() === item;\r\n };\r\n\r\n this.isLastItem = function(item) {\r\n\r\n return self.last() === item;\r\n };\r\n\r\n this.item = function(index) {\r\n\t\t\r\n\t\tif (isValidIndex(index))\r\n \treturn self.items[index];\r\n\t\t\t\r\n\t\treturn undefined;\r\n };\r\n\r\n this.isRightToLeft = function() {\r\n\r\n return self.direction == \"rtl\";\r\n };\r\n\r\n this.isLeftToRight = function() {\r\n\r\n return !self.isRightToLeft();\r\n };\r\n\r\n this.getItemById = function(idref) {\r\n\r\n var length = self.items.length;\r\n\r\n for(var i = 0; i < length; i++) {\r\n if(self.items[i].idref == idref) {\r\n\r\n return self.items[i];\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n this.getItemByHref = function(href) {\r\n\r\n var length = self.items.length;\r\n\r\n for(var i = 0; i < length; i++) {\r\n if(self.items[i].href == href) {\r\n\r\n return self.items[i];\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n function updateSpineItemsSpread() {\r\n\r\n var len = self.items.length;\r\n\r\n var isFirstPageInSpread = false;\r\n var baseSide = self.isLeftToRight() ? SpineItem.SPREAD_LEFT : SpineItem.SPREAD_RIGHT;\r\n\r\n for(var i = 0; i < len; i++) {\r\n\r\n var spineItem = self.items[i];\r\n if( !spineItem.page_spread) {\r\n\r\n var spread = spineItem.isRenditionSpreadAllowed() ? (isFirstPageInSpread ? baseSide : SpineItem.alternateSpread(baseSide)) : SpineItem.SPREAD_CENTER;\r\n spineItem.setSpread(spread);\r\n }\r\n\r\n isFirstPageInSpread = !spineItem.isRenditionSpreadAllowed() || spineItem.page_spread != baseSide;\r\n }\r\n }\r\n\r\n if(spineDTO) {\r\n\r\n if(spineDTO.direction) {\r\n this.direction = spineDTO.direction;\r\n }\r\n\r\n var length = spineDTO.items.length;\r\n for(var i = 0; i < length; i++) {\r\n var item = new SpineItem(spineDTO.items[i], i, this);\r\n this.items.push(item);\r\n }\r\n\r\n updateSpineItemsSpread();\r\n }\r\n\r\n};\r\n return Spine;\r\n});\r\n\n", "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\ndefine ('readium_shared_js/models/smil_model',[\"../helpers\"], function(Helpers) {\r\n\r\n/**\r\n *\r\n * @param parent\r\n * @constructor\r\n */\r\nvar Smil = {};\r\n\r\nSmil.SmilNode = function(parent) {\r\n\r\n this.parent = parent;\r\n \r\n this.id = \"\";\r\n \r\n //root node is a smil model\r\n this.getSmil = function() {\r\n\r\n var node = this;\r\n while(node.parent) {\r\n node = node.parent;\r\n }\r\n\r\n return node;\r\n };\r\n \r\n this.hasAncestor = function(node)\r\n {\r\n var parent = this.parent;\r\n while(parent)\r\n {\r\n if (parent == node)\r\n {\r\n return true;\r\n }\r\n\r\n parent = parent.parent;\r\n }\r\n\r\n return false;\r\n };\r\n};\r\n\r\nSmil.TimeContainerNode = function(parent) {\r\n\r\n this.parent = parent;\r\n \r\n this.children = undefined;\r\n this.index = undefined;\r\n \r\n this.epubtype = \"\";\r\n\r\n this.isEscapable = function(userEscapables)\r\n {\r\n if (this.epubtype === \"\")\r\n {\r\n return false;\r\n }\r\n\r\n var smilModel = this.getSmil();\r\n if (!smilModel.mo)\r\n {\r\n return false;\r\n }\r\n\r\n var arr = smilModel.mo.escapables;\r\n if (userEscapables.length > 0)\r\n {\r\n arr = userEscapables;\r\n }\r\n\r\n for (var i = 0; i < arr.length; i++)\r\n {\r\n if (this.epubtype.indexOf(arr[i]) >= 0)\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n this.isSkippable = function(userSkippables)\r\n {\r\n if (this.epubtype === \"\")\r\n {\r\n return false;\r\n }\r\n \r\n var smilModel = this.getSmil();\r\n if (!smilModel.mo)\r\n {\r\n return false;\r\n }\r\n\r\n var arr = smilModel.mo.skippables;\r\n if (userSkippables.length > 0)\r\n {\r\n arr = userSkippables;\r\n }\r\n\r\n for (var i = 0; i < arr.length; i++)\r\n {\r\n if (this.epubtype.indexOf(arr[i]) >= 0)\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n};\r\n\r\nSmil.TimeContainerNode.prototype = new Smil.SmilNode();\r\n\r\n//////////////////////////\r\n//MediaNode\r\n\r\nSmil.MediaNode = function(parent) {\r\n\r\n this.parent = parent;\r\n \r\n this.src = \"\";\r\n};\r\n\r\nSmil.MediaNode.prototype = new Smil.SmilNode();\r\n\r\n////////////////////////////\r\n//SeqNode\r\n\r\nSmil.SeqNode = function(parent) {\r\n\r\n this.parent = parent;\r\n \r\n this.children = [];\r\n this.nodeType = \"seq\";\r\n this.textref = \"\";\r\n \r\n this.durationMilliseconds = function()\r\n {\r\n var smilData = this.getSmil();\r\n \r\n var total = 0;\r\n \r\n for (var i = 0; i < this.children.length; i++)\r\n {\r\n var container = this.children[i];\r\n if (container.nodeType === \"par\")\r\n {\r\n if (!container.audio)\r\n {\r\n continue;\r\n }\r\n if (container.text && (!container.text.manifestItemId || container.text.manifestItemId != smilData.spineItemId))\r\n {\r\n// console.log(container.text);\r\n// console.log(smilData.spineItemId);\r\n continue;\r\n }\r\n \r\n var clipDur = container.audio.clipDurationMilliseconds();\r\n total += clipDur;\r\n }\r\n else if (container.nodeType === \"seq\")\r\n {\r\n total += container.durationMilliseconds();\r\n }\r\n }\r\n\r\n return total;\r\n };\r\n \r\n this.clipOffset = function(offset, par)\r\n {\r\n var smilData = this.getSmil();\r\n \r\n for (var i = 0; i < this.children.length; i++)\r\n {\r\n var container = this.children[i];\r\n if (container.nodeType === \"par\")\r\n {\r\n if (container == par)\r\n {\r\n return true;\r\n }\r\n\r\n if (!container.audio)\r\n {\r\n continue;\r\n }\r\n\r\n if (container.text && (!container.text.manifestItemId || container.text.manifestItemId != smilData.spineItemId))\r\n {\r\n continue;\r\n }\r\n\r\n var clipDur = container.audio.clipDurationMilliseconds();\r\n offset.offset += clipDur;\r\n }\r\n else if (container.nodeType === \"seq\")\r\n {\r\n var found = container.clipOffset(offset, par);\r\n if (found)\r\n {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n this.parallelAt = function(timeMilliseconds)\r\n {\r\n var smilData = this.getSmil();\r\n \r\n var offset = 0;\r\n\r\n for (var i = 0; i < this.children.length; i++)\r\n {\r\n var timeAdjusted = timeMilliseconds - offset;\r\n\r\n var container = this.children[i];\r\n \r\n if (container.nodeType === \"par\")\r\n {\r\n if (!container.audio)\r\n {\r\n continue;\r\n }\r\n\r\n if (container.text && (!container.text.manifestItemId || container.text.manifestItemId != smilData.spineItemId))\r\n {\r\n continue;\r\n }\r\n\r\n var clipDur = container.audio.clipDurationMilliseconds();\r\n\r\n if (clipDur > 0 && timeAdjusted <= clipDur)\r\n {\r\n return container;\r\n }\r\n\r\n offset += clipDur;\r\n }\r\n else if (container.nodeType === \"seq\")\r\n {\r\n var para = container.parallelAt(timeAdjusted);\r\n if (para)\r\n {\r\n return para;\r\n }\r\n\r\n offset += container.durationMilliseconds();\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n this.nthParallel = function(index, count)\r\n {\r\n for (var i = 0; i < this.children.length; i++)\r\n {\r\n var container = this.children[i];\r\n \r\n if (container.nodeType === \"par\")\r\n {\r\n count.count++;\r\n\r\n if (count.count == index)\r\n {\r\n return container;\r\n }\r\n }\r\n else if (container.nodeType === \"seq\")\r\n {\r\n var para = container.nthParallel(index, count);\r\n if (para)\r\n {\r\n return para;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n \r\n};\r\n\r\nSmil.SeqNode.prototype = new Smil.TimeContainerNode();\r\n\r\n//////////////////////////\r\n//ParNode\r\n\r\nSmil.ParNode = function(parent) {\r\n\r\n this.parent = parent;\r\n \r\n this.children = [];\r\n this.nodeType = \"par\";\r\n this.text = undefined;\r\n this.audio = undefined;\r\n this.element = undefined;\r\n \r\n\r\n this.getFirstSeqAncestorWithEpubType = function(epubtype, includeSelf) {\r\n if (!epubtype) return undefined;\r\n \r\n var parent = includeSelf ? this : this.parent;\r\n while (parent)\r\n {\r\n if (parent.epubtype && parent.epubtype.indexOf(epubtype) >= 0)\r\n {\r\n return parent; // assert(parent.nodeType === \"seq\")\r\n }\r\n \r\n parent = parent.parent;\r\n }\r\n \r\n return undefined;\r\n };\r\n};\r\n\r\nSmil.ParNode.prototype = new Smil.TimeContainerNode();\r\n\r\n//////////////////////////\r\n//TextNode\r\n\r\nSmil.TextNode = function(parent) {\r\n\r\n this.parent = parent;\r\n\r\n this.nodeType = \"text\";\r\n this.srcFile = \"\";\r\n this.srcFragmentId = \"\";\r\n \r\n \r\n this.manifestItemId = undefined;\r\n this.updateMediaManifestItemId = function()\r\n {\r\n var smilData = this.getSmil();\r\n \r\n if (!smilData.href || !smilData.href.length)\r\n {\r\n return; // Blank MO page placeholder, no real SMIL\r\n }\r\n \r\n // var srcParts = item.src.split('#');\r\n// item.srcFile = srcParts[0];\r\n// item.srcFragmentId = (srcParts.length === 2) ? srcParts[1] : \"\";\r\n \r\n var src = this.srcFile ? this.srcFile : this.src;\r\n// console.log(\"src: \" + src);\r\n// console.log(\"smilData.href: \" + smilData.href);\r\n var ref = Helpers.ResolveContentRef(src, smilData.href);\r\n//console.log(\"ref: \" + ref);\r\n var full = smilData.mo.package.resolveRelativeUrlMO(ref);\r\n// console.log(\"full: \" + full);\r\n// console.log(\"---\");\r\n for (var j = 0; j < smilData.mo.package.spine.items.length; j++)\r\n {\r\n var item = smilData.mo.package.spine.items[j];\r\n//console.log(\"item.href: \" + item.href);\r\n var url = smilData.mo.package.resolveRelativeUrl(item.href);\r\n//console.log(\"url: \" + url);\r\n if (url === full)\r\n {\r\n//console.error(\"FOUND: \" + item.idref);\r\n this.manifestItemId = item.idref;\r\n return;\r\n }\r\n }\r\n \r\n console.error(\"Cannot set the Media ManifestItemId? \" + this.src + \" && \" + smilData.href);\r\n \r\n// throw \"BREAK\";\r\n };\r\n \r\n};\r\n\r\nSmil.TextNode.prototype = new Smil.MediaNode();\r\n\r\n///////////////////////////\r\n//AudioNode\r\n\r\nSmil.AudioNode = function(parent) {\r\n\r\n this.parent = parent;\r\n\r\n this.nodeType = \"audio\";\r\n\r\n this.clipBegin = 0;\r\n\r\n this.MAX = 1234567890.1; //Number.MAX_VALUE - 0.1; //Infinity;\r\n this.clipEnd = this.MAX;\r\n \r\n\r\n this.clipDurationMilliseconds = function()\r\n {\r\n var _clipBeginMilliseconds = this.clipBegin * 1000;\r\n var _clipEndMilliseconds = this.clipEnd * 1000;\r\n \r\n if (this.clipEnd >= this.MAX || _clipEndMilliseconds <= _clipBeginMilliseconds)\r\n {\r\n return 0;\r\n }\r\n\r\n return _clipEndMilliseconds - _clipBeginMilliseconds;\r\n }; \r\n};\r\n\r\nSmil.AudioNode.prototype = new Smil.MediaNode();\r\n\r\n//////////////////////////////\r\n//SmilModel\r\n\r\nvar SmilModel = function() {\r\n\r\n this.parent = undefined;\r\n \r\n \r\n \r\n this.children = []; //collection of seq or par smil nodes\r\n this.id = undefined; //manifest item id\r\n this.href = undefined; //href of the .smil source file\r\n this.duration = undefined;\r\n this.mo = undefined;\r\n \r\n this.parallelAt = function(timeMilliseconds)\r\n {\r\n return this.children[0].parallelAt(timeMilliseconds);\r\n };\r\n\r\n this.nthParallel = function(index)\r\n {\r\n var count = {count: -1};\r\n return this.children[0].nthParallel(index, count);\r\n };\r\n\r\n this.clipOffset = function(par)\r\n {\r\n var offset = {offset: 0};\r\n if (this.children[0].clipOffset(offset, par))\r\n {\r\n return offset.offset;\r\n }\r\n\r\n return 0;\r\n };\r\n \r\n this.durationMilliseconds_Calculated = function()\r\n {\r\n return this.children[0].durationMilliseconds();\r\n };\r\n \r\n\r\n var _epubtypeSyncs = [];\r\n // \r\n // this.clearSyncs = function()\r\n // {\r\n // _epubtypeSyncs = [];\r\n // };\r\n\r\n this.hasSync = function(epubtype)\r\n {\r\n for (var i = 0; i < _epubtypeSyncs.length; i++)\r\n {\r\n if (_epubtypeSyncs[i] === epubtype)\r\n {\r\n//console.debug(\"hasSync OK: [\"+epubtype+\"]\");\r\n return true;\r\n }\r\n }\r\n \r\n//console.debug(\"hasSync??: [\"+epubtype+\"] \" + _epubtypeSyncs);\r\n return false;\r\n };\r\n \r\n this.addSync = function(epubtypes)\r\n {\r\n if (!epubtypes) return;\r\n \r\n//console.debug(\"addSyncs: \"+epubtypes);\r\n\r\n var parts = epubtypes.split(' ');\r\n for (var i = 0; i < parts.length; i++)\r\n {\r\n var epubtype = parts[i].trim();\r\n\r\n if (epubtype.length > 0 && !this.hasSync(epubtype))\r\n {\r\n _epubtypeSyncs.push(epubtype);\r\n\r\n//console.debug(\"addSync: \"+epubtype);\r\n }\r\n }\r\n };\r\n \r\n};\r\n\r\nSmilModel.fromSmilDTO = function(smilDTO, mo) {\r\n\r\n if (mo.DEBUG)\r\n {\r\n console.debug(\"Media Overlay DTO import...\");\r\n }\r\n\r\n var indent = 0;\r\n var getIndent = function()\r\n {\r\n var str = \"\";\r\n for (var i = 0; i < indent; i++)\r\n {\r\n str += \" \";\r\n }\r\n return str;\r\n }\r\n\r\n var smilModel = new SmilModel();\r\n smilModel.id = smilDTO.id;\r\n smilModel.spineItemId = smilDTO.spineItemId;\r\n smilModel.href = smilDTO.href;\r\n \r\n smilModel.smilVersion = smilDTO.smilVersion;\r\n \r\n smilModel.duration = smilDTO.duration;\r\n if (smilModel.duration && smilModel.duration.length && smilModel.duration.length > 0)\r\n {\r\n console.error(\"SMIL duration is string, parsing float... (\" + smilModel.duration + \")\");\r\n smilModel.duration = parseFloat(smilModel.duration);\r\n }\r\n \r\n smilModel.mo = mo; //Models.MediaOverlay\r\n\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(\"JS MO smilVersion=\" + smilModel.smilVersion);\r\n console.log(\"JS MO id=\" + smilModel.id);\r\n console.log(\"JS MO spineItemId=\" + smilModel.spineItemId);\r\n console.log(\"JS MO href=\" + smilModel.href);\r\n console.log(\"JS MO duration=\" + smilModel.duration);\r\n }\r\n\r\n var safeCopyProperty = function(property, from, to, isRequired) {\r\n\r\n if((property in from))\r\n { // && from[property] !== \"\"\r\n\r\n if( !(property in to) ) {\r\n console.debug(\"property \" + property + \" not declared in smil node \" + to.nodeType);\r\n }\r\n\r\n to[property] = from[property];\r\n\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO: [\" + property + \"=\" + to[property] + \"]\");\r\n }\r\n }\r\n else if(isRequired) {\r\n console.log(\"Required property \" + property + \" not found in smil node \" + from.nodeType);\r\n }\r\n };\r\n\r\n var createNodeFromDTO = function(nodeDTO, parent) {\r\n\r\n var node;\r\n\r\n if(nodeDTO.nodeType == \"seq\") {\r\n\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO seq\");\r\n }\r\n\r\n node = new Smil.SeqNode(parent);\r\n\r\n safeCopyProperty(\"textref\", nodeDTO, node, ((parent && parent.parent) ? true : false));\r\n safeCopyProperty(\"id\", nodeDTO, node);\r\n safeCopyProperty(\"epubtype\", nodeDTO, node);\r\n\r\n if (node.epubtype)\r\n {\r\n node.getSmil().addSync(node.epubtype);\r\n }\r\n \r\n indent++;\r\n copyChildren(nodeDTO, node);\r\n indent--;\r\n }\r\n else if (nodeDTO.nodeType == \"par\") {\r\n\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO par\");\r\n }\r\n\r\n node = new Smil.ParNode(parent);\r\n\r\n safeCopyProperty(\"id\", nodeDTO, node);\r\n safeCopyProperty(\"epubtype\", nodeDTO, node);\r\n\r\n if (node.epubtype)\r\n {\r\n node.getSmil().addSync(node.epubtype);\r\n }\r\n\r\n indent++;\r\n copyChildren(nodeDTO, node);\r\n indent--;\r\n\t\t\t\r\n for(var i = 0, count = node.children.length; i < count; i++) {\r\n var child = node.children[i];\r\n\r\n if(child.nodeType == \"text\") {\r\n node.text = child;\r\n }\r\n else if(child.nodeType == \"audio\") {\r\n node.audio = child;\r\n }\r\n else {\r\n console.error(\"Unexpected smil node type: \" + child.nodeType);\r\n }\r\n }\r\n\r\n////////////////\r\nvar forceTTS = false; // for testing only!\r\n////////////////\r\n\r\n if (forceTTS || !node.audio)\r\n {\r\n // synthetic speech (playback using TTS engine), or embedded media, or blank page\r\n var fakeAudio = new Smil.AudioNode(node);\r\n\r\n fakeAudio.clipBegin = 0;\r\n fakeAudio.clipEnd = fakeAudio.MAX;\r\n fakeAudio.src = undefined;\r\n\r\n node.audio = fakeAudio;\r\n }\r\n }\r\n else if (nodeDTO.nodeType == \"text\") {\r\n\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO text\");\r\n }\r\n\r\n node = new Smil.TextNode(parent);\r\n\r\n safeCopyProperty(\"src\", nodeDTO, node, true);\r\n safeCopyProperty(\"srcFile\", nodeDTO, node, true);\r\n safeCopyProperty(\"srcFragmentId\", nodeDTO, node, false);\r\n safeCopyProperty(\"id\", nodeDTO, node);\r\n \r\n node.updateMediaManifestItemId();\r\n }\r\n else if (nodeDTO.nodeType == \"audio\") {\r\n\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO audio\");\r\n }\r\n\r\n node = new Smil.AudioNode(parent);\r\n\r\n safeCopyProperty(\"src\", nodeDTO, node, true);\r\n safeCopyProperty(\"id\", nodeDTO, node);\r\n\r\n safeCopyProperty(\"clipBegin\", nodeDTO, node);\r\n if (node.clipBegin && node.clipBegin.length && node.clipBegin.length > 0)\r\n {\r\n console.error(\"SMIL clipBegin is string, parsing float... (\" + node.clipBegin + \")\");\r\n node.clipBegin = parseFloat(node.clipBegin);\r\n }\r\n if (node.clipBegin < 0)\r\n {\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO clipBegin adjusted to ZERO\");\r\n }\r\n node.clipBegin = 0;\r\n }\r\n\r\n safeCopyProperty(\"clipEnd\", nodeDTO, node);\r\n if (node.clipEnd && node.clipEnd.length && node.clipEnd.length > 0)\r\n {\r\n console.error(\"SMIL clipEnd is string, parsing float... (\" + node.clipEnd + \")\");\r\n node.clipEnd = parseFloat(node.clipEnd);\r\n }\r\n if (node.clipEnd <= node.clipBegin)\r\n {\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO clipEnd adjusted to MAX\");\r\n }\r\n node.clipEnd = node.MAX;\r\n }\r\n \r\n //node.updateMediaManifestItemId(); ONLY XHTML SPINE ITEMS \r\n }\r\n else {\r\n console.error(\"Unexpected smil node type: \" + nodeDTO.nodeType);\r\n return undefined;\r\n }\r\n\r\n return node;\r\n\r\n };\r\n\r\n var copyChildren = function(from, to) {\r\n\r\n var count = from.children.length;\r\n\r\n for(var i = 0; i < count; i++) {\r\n var node = createNodeFromDTO(from.children[i], to);\r\n node.index = i;\r\n to.children.push(node);\r\n }\r\n\r\n };\r\n\r\n copyChildren(smilDTO, smilModel);\r\n\r\n return smilModel;\r\n\r\n};\r\n\r\nreturn SmilModel;\r\n});\r\n\n", "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/media_overlay',[\"./smil_model\"], function(SmilModel) {\r\n/**\r\n *\r\n * @param package\r\n * @constructor\r\n */\r\nvar MediaOverlay = function(package) {\r\n\r\n this.package = package;\r\n \r\n\r\n this.parallelAt = function(timeMilliseconds)\r\n {\r\n var offset = 0;\r\n \r\n for (var i = 0; i < this.smil_models.length; i++)\r\n {\r\n var smilData = this.smil_models[i];\r\n \r\n var timeAdjusted = timeMilliseconds - offset;\r\n\r\n var para = smilData.parallelAt(timeAdjusted);\r\n if (para)\r\n {\r\n return para;\r\n }\r\n\r\n offset += smilData.durationMilliseconds_Calculated();\r\n }\r\n\r\n return undefined;\r\n };\r\n \r\n this.percentToPosition = function(percent, smilData, par, milliseconds)\r\n {\r\n if (percent < 0.0 || percent > 100.0)\r\n {\r\n percent = 0.0;\r\n }\r\n \r\n var total = this.durationMilliseconds_Calculated();\r\n\r\n var timeMs = total * (percent / 100.0);\r\n\r\n par.par = this.parallelAt(timeMs);\r\n if (!par.par)\r\n {\r\n return;\r\n }\r\n \r\n var smilDataPar = par.par.getSmil();\r\n if (!smilDataPar)\r\n {\r\n return;\r\n }\r\n \r\n var smilDataOffset = 0;\r\n \r\n for (var i = 0; i < this.smil_models.length; i++)\r\n {\r\n smilData.smilData = this.smil_models[i];\r\n if (smilData.smilData == smilDataPar)\r\n {\r\n break;\r\n }\r\n smilDataOffset += smilData.smilData.durationMilliseconds_Calculated();\r\n }\r\n\r\n milliseconds.milliseconds = timeMs - (smilDataOffset + smilData.smilData.clipOffset(par.par));\r\n };\r\n\r\n this.durationMilliseconds_Calculated = function()\r\n {\r\n var total = 0;\r\n \r\n for (var i = 0; i < this.smil_models.length; i++)\r\n {\r\n var smilData = this.smil_models[i];\r\n\r\n total += smilData.durationMilliseconds_Calculated();\r\n }\r\n \r\n return total;\r\n };\r\n \r\n this.smilAt = function(smilIndex)\r\n {\r\n if (smilIndex < 0 || smilIndex >= this.smil_models.length)\r\n {\r\n return undefined;\r\n }\r\n \r\n return this.smil_models[smilIndex];\r\n }\r\n \r\n this.positionToPercent = function(smilIndex, parIndex, milliseconds)\r\n {\r\n// console.log(\">>>>>>>>>>\");\r\n// console.log(milliseconds);\r\n// console.log(smilIndex);\r\n// console.log(parIndex);\r\n// console.log(\"-------\");\r\n \r\n if (smilIndex >= this.smil_models.length)\r\n {\r\n return -1.0;\r\n }\r\n\r\n var smilDataOffset = 0;\r\n for (var i = 0; i < smilIndex; i++)\r\n {\r\n var sd = this.smil_models[i];\r\n smilDataOffset += sd.durationMilliseconds_Calculated();\r\n }\r\n\r\n//console.log(smilDataOffset);\r\n \r\n var smilData = this.smil_models[smilIndex];\r\n\r\n var par = smilData.nthParallel(parIndex);\r\n if (!par)\r\n {\r\n return -1.0;\r\n }\r\n\r\n var offset = smilDataOffset + smilData.clipOffset(par) + milliseconds;\r\n\r\n//console.log(offset);\r\n \r\n var total = this.durationMilliseconds_Calculated();\r\n\r\n///console.log(total);\r\n\r\n var percent = (offset / total) * 100;\r\n\r\n//console.log(\"<<<<<<<<<<< \" + percent);\r\n \r\n return percent;\r\n };\r\n \r\n this.smil_models = [];\r\n\r\n this.skippables = [];\r\n this.escapables = [];\r\n\r\n this.duration = undefined;\r\n this.narrator = undefined;\r\n\r\n\r\n this.activeClass = undefined;\r\n this.playbackActiveClass = undefined;\r\n\r\n this.DEBUG = false;\r\n\r\n\r\n this.getSmilBySpineItem = function (spineItem) {\r\n if (!spineItem) return undefined;\r\n\r\n for(var i = 0, count = this.smil_models.length; i < count; i++)\r\n {\r\n var smil = this.smil_models[i];\r\n if(smil.spineItemId === spineItem.idref) {\r\n if (spineItem.media_overlay_id !== smil.id)\r\n {\r\n console.error(\"SMIL INCORRECT ID?? \" + spineItem.media_overlay_id + \" /// \" + smil.id);\r\n }\r\n return smil;\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /*\r\n this.getSmilById = function (id) {\r\n\r\n for(var i = 0, count = this.smil_models.length; i < count; i++) {\r\n\r\n var smil = this.smil_models[i];\r\n if(smil.id === id) {\r\n return smil;\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n */\r\n\r\n this.getNextSmil = function(smil) {\r\n\r\n var index = this.smil_models.indexOf(smil);\r\n if(index == -1 || index == this.smil_models.length - 1) {\r\n return undefined;\r\n }\r\n\r\n return this.smil_models[index + 1];\r\n }\r\n\r\n this.getPreviousSmil = function(smil) {\r\n\r\n var index = this.smil_models.indexOf(smil);\r\n if(index == -1 || index == 0) {\r\n return undefined;\r\n }\r\n\r\n return this.smil_models[index - 1];\r\n }\r\n};\r\n\r\nMediaOverlay.fromDTO = function(moDTO, package) {\r\n\r\n var mo = new MediaOverlay(package);\r\n\r\n if(!moDTO) {\r\n console.debug(\"No Media Overlay.\");\r\n return mo;\r\n }\r\n\r\n console.debug(\"Media Overlay INIT...\");\r\n\r\n // if (mo.DEBUG)\r\n // console.debug(JSON.stringify(moDTO));\r\n \r\n mo.duration = moDTO.duration;\r\n if (mo.duration && mo.duration.length && mo.duration.length > 0)\r\n {\r\n console.error(\"SMIL total duration is string, parsing float... (\" + mo.duration + \")\");\r\n mo.duration = parseFloat(mo.duration);\r\n }\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay Duration (TOTAL): \" + mo.duration);\r\n\r\n mo.narrator = moDTO.narrator;\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay Narrator: \" + mo.narrator);\r\n\r\n mo.activeClass = moDTO.activeClass;\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay Active-Class: \" + mo.activeClass);\r\n\r\n mo.playbackActiveClass = moDTO.playbackActiveClass;\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay Playback-Active-Class: \" + mo.playbackActiveClass);\r\n\r\n var count = moDTO.smil_models.length;\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay SMIL count: \" + count);\r\n\r\n for(var i = 0; i < count; i++) {\r\n var smilModel = SmilModel.fromSmilDTO(moDTO.smil_models[i], mo);\r\n mo.smil_models.push(smilModel);\r\n\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay Duration (SPINE ITEM): \" + smilModel.duration);\r\n }\r\n\r\n count = moDTO.skippables.length;\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay SKIPPABLES count: \" + count);\r\n\r\n for(var i = 0; i < count; i++) {\r\n mo.skippables.push(moDTO.skippables[i]);\r\n\r\n //if (mo.DEBUG)\r\n // console.debug(\"Media Overlay SKIPPABLE: \" + mo.skippables[i]);\r\n }\r\n\r\n count = moDTO.escapables.length;\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay ESCAPABLES count: \" + count);\r\n\r\n for(var i = 0; i < count; i++) {\r\n mo.escapables.push(moDTO.escapables[i]);\r\n\r\n //if (mo.DEBUG)\r\n // console.debug(\"Media Overlay ESCAPABLE: \" + mo.escapables[i]);\r\n }\r\n\r\n return mo;\r\n};\r\n\r\nreturn MediaOverlay;\r\n});\r\n\r\n\r\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n\r\ndefine('readium_shared_js/models/package_data',[],function() {\r\n/**\r\n * This object is not instantiated directly but provided by the host application to the DOMAccess layer in the\r\n * Views.ReaderView.openBook function\r\n *\r\n * Provided for reference only\r\n *\r\n * @class Models.PackageData\r\n */\r\nvar PackageData = {\r\n\r\n /**\r\n * @property rootUrl Url of the package file\r\n * @type {string}\r\n *\r\n */\r\n rootUrl: \"\",\r\n /**\r\n * @property rootUrl Url of the package file, to prefix Media Overlays SMIL audio references\r\n * @type {string}\r\n *\r\n */\r\n rootUrlMO: \"\",\r\n /**\r\n *\r\n * @property rendering_layout expected values \"reflowable\"|rendering_layout=\"pre-paginated\"\r\n * @type {string}\r\n */\r\n rendering_layout: \"\",\r\n\r\n spine: {\r\n\r\n direction: \"ltr\",\r\n items: [\r\n {\r\n href:\"\",\r\n idref:\"\",\r\n page_spread:\"\", //\"page-spread-left\"|\"page-spread-right\"|\"page-spread-center\"\r\n rendering_layout:\"\" //\"reflowable\"|\"pre-paginated\"\r\n }\r\n ]\r\n }\r\n};\r\n\r\nreturn PackageData;\r\n});\n", @@ -69,8 +70,9 @@ "\r\n// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/views/reflowable_view',[\"jquery\", \"underscore\", \"eventEmitter\", \"../models/bookmark_data\", \"./cfi_navigation_logic\",\r\n \"../models/current_pages_info\", \"../helpers\", \"../models/page_open_request\", \"../globals\",\r\n \"../models/viewer_settings\", \"./font_loader\"],\r\n function($, _, EventEmitter, BookmarkData, CfiNavigationLogic,\r\n CurrentPagesInfo, Helpers, PageOpenRequest, Globals,\r\n ViewerSettings, FontLoader) {\r\n/**\r\n * Renders reflowable content using CSS columns\r\n * @param options\r\n * @constructor\r\n */\r\nvar ReflowableView = function(options, reader){\r\n\r\n $.extend(this, new EventEmitter());\r\n\r\n var self = this;\r\n\r\n var _$viewport = options.$viewport;\r\n var _spine = options.spine;\r\n var _userStyles = options.userStyles;\r\n var _bookStyles = options.bookStyles;\r\n var _iframeLoader = options.iframeLoader;\r\n\r\n var _currentSpineItem;\r\n var _isWaitingFrameRender = false;\r\n var _deferredPageRequest;\r\n var _fontSize = 100;\r\n var _$contentFrame;\r\n var _navigationLogic;\r\n var _$el;\r\n var _$iframe;\r\n var _$epubHtml;\r\n\r\n var _$htmlBody;\r\n\r\n var _htmlBodyIsVerticalWritingMode;\r\n var _htmlBodyIsLTRDirection;\r\n var _htmlBodyIsLTRWritingMode;\r\n\r\n\r\n var _currentOpacity = -1;\r\n\r\n var _lastViewPortSize = {\r\n width: undefined,\r\n height: undefined\r\n };\r\n\r\n var _paginationInfo = {\r\n\r\n visibleColumnCount : 2,\r\n columnGap : 20,\r\n spreadCount : 0,\r\n currentSpreadIndex : 0,\r\n columnWidth : undefined,\r\n pageOffset : 0,\r\n columnCount: 0\r\n };\r\n\r\n this.render = function(){\r\n\r\n var template = Helpers.loadTemplate(\"reflowable_book_frame\", {});\r\n\r\n _$el = $(template);\r\n _$viewport.append(_$el);\r\n\r\n var settings = reader.viewerSettings();\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\")\r\n {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n // This fixes rendering issues with WebView (native apps), which clips content embedded in iframes unless GPU hardware acceleration is enabled for CSS rendering.\r\n _$el.css(\"transform\", \"translateZ(0)\");\r\n }\r\n\r\n // See ReaderView.handleViewportResize\r\n // var lazyResize = _.debounce(self.onViewportResize, 100);\r\n // $(window).on(\"resize.ReadiumSDK.reflowableView\", _.bind(lazyResize, self));\r\n renderIframe();\r\n\r\n return self;\r\n };\r\n\r\n function setFrameSizesToRectangle(rectangle) {\r\n _$contentFrame.css(\"left\", rectangle.left + \"px\");\r\n _$contentFrame.css(\"top\", rectangle.top + \"px\");\r\n _$contentFrame.css(\"right\", rectangle.right + \"px\");\r\n _$contentFrame.css(\"bottom\", rectangle.bottom + \"px\");\r\n\r\n }\r\n\r\n this.remove = function() {\r\n\r\n //$(window).off(\"resize.ReadiumSDK.reflowableView\");\r\n _$el.remove();\r\n\r\n };\r\n\r\n this.isReflowable = function() {\r\n return true;\r\n };\r\n\r\n this.onViewportResize = function() {\r\n\r\n if(updateViewportSize()) {\r\n updatePagination();\r\n }\r\n };\r\n\r\n var _viewSettings = undefined;\r\n this.setViewSettings = function(settings) {\r\n\r\n _viewSettings = settings;\r\n\r\n _paginationInfo.columnGap = settings.columnGap;\r\n _fontSize = settings.fontSize;\r\n\r\n updateHtmlFontSize();\r\n updateColumnGap();\r\n\r\n updateViewportSize();\r\n updatePagination();\r\n };\r\n\r\n function renderIframe() {\r\n if (_$contentFrame) {\r\n //destroy old contentFrame\r\n _$contentFrame.remove();\r\n }\r\n\r\n var template = Helpers.loadTemplate(\"reflowable_book_page_frame\", {});\r\n var $bookFrame = $(template);\r\n $bookFrame = _$el.append($bookFrame);\r\n\r\n _$contentFrame = $(\"#reflowable-content-frame\", $bookFrame);\r\n\r\n _$iframe = $(\"#epubContentIframe\", $bookFrame);\r\n\r\n _$iframe.css(\"left\", \"\");\r\n _$iframe.css(\"right\", \"\");\r\n _$iframe.css(\"position\", \"relative\");\r\n //_$iframe.css(_spine.isLeftToRight() ? \"left\" : \"right\", \"0px\");\r\n _$iframe.css(\"overflow\", \"hidden\");\r\n\r\n _navigationLogic = new CfiNavigationLogic(\r\n _$contentFrame, _$iframe,\r\n { rectangleBased: true, paginationInfo: _paginationInfo });\r\n }\r\n\r\n function loadSpineItem(spineItem) {\r\n\r\n if(_currentSpineItem != spineItem) {\r\n\r\n //create & append iframe to container frame\r\n renderIframe();\r\n\r\n _paginationInfo.pageOffset = 0;\r\n _paginationInfo.currentSpreadIndex = 0;\r\n _currentSpineItem = spineItem;\r\n _isWaitingFrameRender = true;\r\n\r\n var src = _spine.package.resolveRelativeUrl(spineItem.href);\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOAD_START, _$iframe, spineItem);\r\n\r\n _$iframe.css(\"opacity\", \"0.01\");\r\n\r\n _iframeLoader.loadIframe(_$iframe[0], src, onIFrameLoad, self, {spineItem : spineItem});\r\n }\r\n }\r\n\r\n function updateHtmlFontSize() {\r\n\r\n if(_$epubHtml) {\r\n Helpers.UpdateHtmlFontSize(_$epubHtml, _fontSize);\r\n }\r\n }\r\n\r\n function updateColumnGap() {\r\n\r\n if(_$epubHtml) {\r\n\r\n _$epubHtml.css(\"column-gap\", _paginationInfo.columnGap + \"px\");\r\n }\r\n }\r\n\r\n function onIFrameLoad(success) {\r\n if (!success) {\r\n applyIFrameLoad(success);\r\n return;\r\n }\r\n var fontLoader = new FontLoader(_$iframe);\r\n fontLoader.waitForFonts(function () {\r\n applyIFrameLoad(success);\r\n });\r\n }\r\n\r\n function applyIFrameLoad(success) {\r\n\r\n _isWaitingFrameRender = false;\r\n\r\n //while we where loading frame new request came\r\n if(_deferredPageRequest && _deferredPageRequest.spineItem != _currentSpineItem) {\r\n loadSpineItem(_deferredPageRequest.spineItem);\r\n return;\r\n }\r\n\r\n if(!success) {\r\n _$iframe.css(\"opacity\", \"1\");\r\n _deferredPageRequest = undefined;\r\n return;\r\n }\r\n\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOADED, _$iframe, _currentSpineItem);\r\n\r\n var epubContentDocument = _$iframe[0].contentDocument;\r\n _$epubHtml = $(\"html\", epubContentDocument);\r\n _$htmlBody = $(\"body\", _$epubHtml);\r\n\r\n // TODO: how to address this correctly across all the affected platforms?!\r\n // Video surface sometimes (depends on the video codec) disappears from CSS column (i.e. reflow page) during playback\r\n // (audio continues to play normally, but video canvas is invisible).\r\n // https://github.com/readium/readium-js-viewer/issues/265#issuecomment-73018762\r\n // ...Meanwhile, reverting https://github.com/readium/readium-js-viewer/issues/239\r\n // by commenting the code below (which unfortunately only works with some GPU / codec configurations,\r\n // but actually fails on several other machines!!)\r\n /*\r\n if(window.chrome\r\n && window.navigator.vendor === \"Google Inc.\") // TODO: Opera (WebKit) sometimes suffers from this rendering bug too (depends on the video codec), but unfortunately GPU-accelerated rendering makes the video controls unresponsive!!\r\n {\r\n $(\"video\", _$htmlBody).css(\"transform\", \"translateZ(0)\");\r\n }\r\n */\r\n\r\n _htmlBodyIsVerticalWritingMode = false;\r\n _htmlBodyIsLTRDirection = true;\r\n _htmlBodyIsLTRWritingMode = undefined;\r\n\r\n var win = _$iframe[0].contentDocument.defaultView || _$iframe[0].contentWindow;\r\n\r\n //Helpers.isIframeAlive\r\n var htmlBodyComputedStyle = win.getComputedStyle(_$htmlBody[0], null);\r\n if (htmlBodyComputedStyle)\r\n {\r\n _htmlBodyIsLTRDirection = htmlBodyComputedStyle.direction === \"ltr\";\r\n\r\n var writingMode = undefined;\r\n if (htmlBodyComputedStyle.getPropertyValue)\r\n {\r\n writingMode = htmlBodyComputedStyle.getPropertyValue(\"-webkit-writing-mode\") || htmlBodyComputedStyle.getPropertyValue(\"-moz-writing-mode\") || htmlBodyComputedStyle.getPropertyValue(\"-ms-writing-mode\") || htmlBodyComputedStyle.getPropertyValue(\"-o-writing-mode\") || htmlBodyComputedStyle.getPropertyValue(\"-epub-writing-mode\") || htmlBodyComputedStyle.getPropertyValue(\"writing-mode\");\r\n }\r\n else\r\n {\r\n writingMode = htmlBodyComputedStyle.webkitWritingMode || htmlBodyComputedStyle.mozWritingMode || htmlBodyComputedStyle.msWritingMode || htmlBodyComputedStyle.oWritingMode || htmlBodyComputedStyle.epubWritingMode || htmlBodyComputedStyle.writingMode;\r\n }\r\n\r\n if (writingMode)\r\n {\r\n _htmlBodyIsLTRWritingMode = writingMode.indexOf(\"-lr\") >= 0; // || writingMode.indexOf(\"horizontal-\") >= 0; we need explicit!\r\n\r\n if (writingMode.indexOf(\"vertical\") >= 0 || writingMode.indexOf(\"tb-\") >= 0 || writingMode.indexOf(\"bt-\") >= 0)\r\n {\r\n _htmlBodyIsVerticalWritingMode = true;\r\n }\r\n }\r\n }\r\n\r\n if (_htmlBodyIsLTRDirection)\r\n {\r\n if (_$htmlBody[0].getAttribute(\"dir\") === \"rtl\" || _$epubHtml[0].getAttribute(\"dir\") === \"rtl\")\r\n {\r\n _htmlBodyIsLTRDirection = false;\r\n }\r\n }\r\n\r\n // Some EPUBs may not have explicit RTL content direction (via CSS \"direction\" property or @dir attribute) despite having a RTL page progression direction. Readium consequently tweaks the HTML in order to restore the correct block flow in the browser renderer, resulting in the appropriate CSS columnisation (which is used to emulate pagination).\r\n if (!_spine.isLeftToRight() && _htmlBodyIsLTRDirection && !_htmlBodyIsVerticalWritingMode)\r\n {\r\n _$htmlBody[0].setAttribute(\"dir\", \"rtl\");\r\n _htmlBodyIsLTRDirection = false;\r\n _htmlBodyIsLTRWritingMode = false;\r\n }\r\n\r\n _paginationInfo.isVerticalWritingMode = _htmlBodyIsVerticalWritingMode;\r\n\r\n hideBook();\r\n _$iframe.css(\"opacity\", \"1\");\r\n\r\n updateViewportSize();\r\n _$epubHtml.css(\"height\", _lastViewPortSize.height + \"px\");\r\n\r\n _$epubHtml.css(\"position\", \"relative\");\r\n _$epubHtml.css(\"margin\", \"0\");\r\n _$epubHtml.css(\"padding\", \"0\");\r\n\r\n _$epubHtml.css(\"column-axis\", (_htmlBodyIsVerticalWritingMode ? \"vertical\" : \"horizontal\"));\r\n\r\n //\r\n // /////////\r\n // //Columns Debugging\r\n //\r\n // _$epubHtml.css(\"column-rule-color\", \"red\");\r\n // _$epubHtml.css(\"column-rule-style\", \"dashed\");\r\n // _$epubHtml.css(\"column-rule-width\", \"1px\");\r\n // _$epubHtml.css(\"background-color\", '#b0c4de');\r\n //\r\n // ////\r\n\r\n self.applyBookStyles();\r\n resizeImages();\r\n\r\n updateHtmlFontSize();\r\n updateColumnGap();\r\n\r\n\r\n self.applyStyles();\r\n }\r\n\r\n this.applyStyles = function() {\r\n\r\n Helpers.setStyles(_userStyles.getStyles(), _$el.parent());\r\n\r\n //because left, top, bottom, right setting ignores padding of parent container\r\n //we have to take it to account manually\r\n var elementMargins = Helpers.Margins.fromElement(_$el);\r\n setFrameSizesToRectangle(elementMargins.padding);\r\n\r\n\r\n updateViewportSize();\r\n updatePagination();\r\n };\r\n\r\n this.applyBookStyles = function() {\r\n\r\n if(_$epubHtml) {\r\n Helpers.setStyles(_bookStyles.getStyles(), _$epubHtml);\r\n }\r\n };\r\n\r\n function openDeferredElement() {\r\n\r\n if(!_deferredPageRequest) {\r\n return;\r\n }\r\n\r\n var deferredData = _deferredPageRequest;\r\n _deferredPageRequest = undefined;\r\n self.openPage(deferredData);\r\n\r\n }\r\n\r\n this.openPage = function(pageRequest) {\r\n\r\n if(_isWaitingFrameRender) {\r\n _deferredPageRequest = pageRequest;\r\n return;\r\n }\r\n\r\n // if no spine item specified we are talking about current spine item\r\n if(pageRequest.spineItem && pageRequest.spineItem != _currentSpineItem) {\r\n _deferredPageRequest = pageRequest;\r\n loadSpineItem(pageRequest.spineItem);\r\n return;\r\n }\r\n\r\n var pageIndex = undefined;\r\n\r\n\r\n if(pageRequest.spineItemPageIndex !== undefined) {\r\n pageIndex = pageRequest.spineItemPageIndex;\r\n }\r\n else if(pageRequest.elementId) {\r\n pageIndex = _navigationLogic.getPageForElementId(pageRequest.elementId);\r\n }\r\n else if(pageRequest.elementCfi) {\r\n try\r\n {\r\n pageIndex = _navigationLogic.getPageForElementCfi(pageRequest.elementCfi,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n }\r\n catch (e)\r\n {\r\n pageIndex = 0;\r\n console.error(e);\r\n }\r\n }\r\n else if(pageRequest.firstPage) {\r\n pageIndex = 0;\r\n }\r\n else if(pageRequest.lastPage) {\r\n pageIndex = _paginationInfo.columnCount - 1;\r\n }\r\n else {\r\n console.debug(\"No criteria in pageRequest\");\r\n pageIndex = 0;\r\n }\r\n\r\n if(pageIndex >= 0 && pageIndex < _paginationInfo.columnCount) {\r\n _paginationInfo.currentSpreadIndex = Math.floor(pageIndex / _paginationInfo.visibleColumnCount) ;\r\n onPaginationChanged(pageRequest.initiator, pageRequest.spineItem, pageRequest.elementId);\r\n }\r\n else {\r\n console.log('Illegal pageIndex value: ', pageIndex, 'column count is ', _paginationInfo.columnCount);\r\n }\r\n };\r\n\r\n function redraw() {\r\n\r\n var offsetVal = -_paginationInfo.pageOffset + \"px\";\r\n\r\n if (_htmlBodyIsVerticalWritingMode)\r\n {\r\n _$epubHtml.css(\"top\", offsetVal);\r\n }\r\n else\r\n {\r\n var ltr = _htmlBodyIsLTRDirection || _htmlBodyIsLTRWritingMode;\r\n\r\n _$epubHtml.css(\"left\", ltr ? offsetVal : \"\");\r\n _$epubHtml.css(\"right\", !ltr ? offsetVal : \"\");\r\n }\r\n\r\n showBook(); // as it's no longer hidden by shifting the position\r\n }\r\n\r\n function updateViewportSize() {\r\n\r\n var newWidth = _$contentFrame.width();\r\n var newHeight = _$contentFrame.height();\r\n\r\n if(_lastViewPortSize.width !== newWidth || _lastViewPortSize.height !== newHeight){\r\n\r\n _lastViewPortSize.width = newWidth;\r\n _lastViewPortSize.height = newHeight;\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function onPaginationChanged_(initiator, paginationRequest_spineItem, paginationRequest_elementId) {\r\n\r\n _paginationInfo.pageOffset = (_paginationInfo.columnWidth + _paginationInfo.columnGap) * _paginationInfo.visibleColumnCount * _paginationInfo.currentSpreadIndex;\r\n\r\n redraw();\r\n\r\n _.defer(function () {\r\n self.emit(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, {\r\n paginationInfo: self.getPaginationInfo(),\r\n initiator: initiator,\r\n spineItem: paginationRequest_spineItem,\r\n elementId: paginationRequest_elementId\r\n });\r\n });\r\n }\r\n var onPaginationChanged = _.debounce(onPaginationChanged_, 100);\r\n\r\n this.openPagePrev = function (initiator) {\r\n\r\n if(!_currentSpineItem) {\r\n return;\r\n }\r\n\r\n if(_paginationInfo.currentSpreadIndex > 0) {\r\n _paginationInfo.currentSpreadIndex--;\r\n onPaginationChanged(initiator);\r\n }\r\n else {\r\n\r\n var prevSpineItem = _spine.prevItem(_currentSpineItem, true);\r\n if(prevSpineItem) {\r\n\r\n var pageRequest = new PageOpenRequest(prevSpineItem, initiator);\r\n pageRequest.setLastPage();\r\n self.openPage(pageRequest);\r\n }\r\n }\r\n };\r\n\r\n this.openPageNext = function (initiator) {\r\n\r\n if(!_currentSpineItem) {\r\n return;\r\n }\r\n\r\n if(_paginationInfo.currentSpreadIndex < _paginationInfo.spreadCount - 1) {\r\n _paginationInfo.currentSpreadIndex++;\r\n onPaginationChanged(initiator);\r\n }\r\n else {\r\n\r\n var nextSpineItem = _spine.nextItem(_currentSpineItem, true);\r\n if(nextSpineItem) {\r\n\r\n var pageRequest = new PageOpenRequest(nextSpineItem, initiator);\r\n pageRequest.setFirstPage();\r\n self.openPage(pageRequest);\r\n }\r\n }\r\n };\r\n\r\n\r\n function updatePagination() {\r\n\r\n // At 100% font-size = 16px (on HTML, not body or descendant markup!)\r\n var MAXW = 550; //TODO user/vendor-configurable?\r\n var MINW = 400;\r\n\r\n var isDoublePageSyntheticSpread = Helpers.deduceSyntheticSpread(_$viewport, _currentSpineItem, _viewSettings);\r\n\r\n var forced = (isDoublePageSyntheticSpread === false) || (isDoublePageSyntheticSpread === true);\r\n // excludes 0 and 1 falsy/truthy values which denote non-forced result\r\n\r\n// console.debug(\"isDoublePageSyntheticSpread: \" + isDoublePageSyntheticSpread);\r\n// console.debug(\"forced: \" + forced);\r\n//\r\n if (isDoublePageSyntheticSpread === 0)\r\n {\r\n isDoublePageSyntheticSpread = 1; // try double page, will shrink if doesn't fit\r\n// console.debug(\"TRYING SPREAD INSTEAD OF SINGLE...\");\r\n }\r\n\r\n _paginationInfo.visibleColumnCount = isDoublePageSyntheticSpread ? 2 : 1;\r\n\r\n if (_htmlBodyIsVerticalWritingMode)\r\n {\r\n MAXW *= 2;\r\n isDoublePageSyntheticSpread = false;\r\n forced = true;\r\n _paginationInfo.visibleColumnCount = 1;\r\n// console.debug(\"Vertical Writing Mode => single CSS column, but behaves as if two-page spread\");\r\n }\r\n\r\n if(!_$epubHtml) {\r\n return;\r\n }\r\n\r\n hideBook(); // shiftBookOfScreen();\r\n\r\n var borderLeft = parseInt(_$viewport.css(\"border-left-width\"));\r\n var borderRight = parseInt(_$viewport.css(\"border-right-width\"));\r\n var adjustedGapLeft = _paginationInfo.columnGap/2;\r\n adjustedGapLeft = Math.max(0, adjustedGapLeft-borderLeft)\r\n var adjustedGapRight = _paginationInfo.columnGap/2;\r\n adjustedGapRight = Math.max(0, adjustedGapRight-borderRight)\r\n\r\n var filler = 0;\r\n\r\n// var win = _$iframe[0].contentDocument.defaultView || _$iframe[0].contentWindow;\r\n// var htmlBodyComputedStyle = win.getComputedStyle(_$htmlBody[0], null);\r\n// if (htmlBodyComputedStyle)\r\n// {\r\n// var fontSize = undefined;\r\n// if (htmlBodyComputedStyle.getPropertyValue)\r\n// {\r\n// fontSize = htmlBodyComputedStyle.getPropertyValue(\"font-size\");\r\n// }\r\n// else\r\n// {\r\n// fontSize = htmlBodyComputedStyle.fontSize;\r\n// }\r\n// console.debug(fontSize);\r\n// }\r\n\r\n if (_viewSettings.fontSize)\r\n {\r\n var fontSizeAdjust = (_viewSettings.fontSize*0.8)/100;\r\n MAXW = Math.floor(MAXW * fontSizeAdjust);\r\n MINW = Math.floor(MINW * fontSizeAdjust);\r\n }\r\n\r\n var availableWidth = _$viewport.width();\r\n var textWidth = availableWidth - borderLeft - borderRight - adjustedGapLeft - adjustedGapRight;\r\n if (isDoublePageSyntheticSpread)\r\n {\r\n textWidth = (textWidth - _paginationInfo.columnGap) * 0.5;\r\n }\r\n\r\n if (textWidth > MAXW)\r\n {\r\n// console.debug(\"LIMITING WIDTH\");\r\n filler = Math.floor((textWidth - MAXW) * (isDoublePageSyntheticSpread ? 1 : 0.5));\r\n }\r\n else if (!forced && textWidth < MINW && isDoublePageSyntheticSpread)\r\n {\r\n//console.debug(\"REDUCING SPREAD TO SINGLE\");\r\n isDoublePageSyntheticSpread = false;\r\n _paginationInfo.visibleColumnCount = 1;\r\n\r\n textWidth = availableWidth - borderLeft - borderRight - adjustedGapLeft - adjustedGapRight;\r\n if (textWidth > MAXW)\r\n {\r\n filler = Math.floor((textWidth - MAXW) * 0.5);\r\n }\r\n }\r\n\r\n _$el.css({\"left\": (filler+adjustedGapLeft + \"px\"), \"right\": (filler+adjustedGapRight + \"px\")});\r\n updateViewportSize(); //_$contentFrame ==> _lastViewPortSize\r\n\r\n\r\n _$iframe.css(\"width\", _lastViewPortSize.width + \"px\");\r\n _$iframe.css(\"height\", _lastViewPortSize.height + \"px\");\r\n\r\n _$epubHtml.css(\"height\", _lastViewPortSize.height + \"px\");\r\n\r\n // below min- max- are required in vertical writing mode (height is not enough, in some cases...weird!)\r\n _$epubHtml.css(\"min-height\", _lastViewPortSize.height + \"px\");\r\n _$epubHtml.css(\"max-height\", _lastViewPortSize.height + \"px\");\r\n\r\n //normalise spacing to avoid interference with column-isation\r\n _$epubHtml.css('margin', 0);\r\n _$epubHtml.css('padding', 0);\r\n _$epubHtml.css('border', 0);\r\n _$htmlBody.css('margin', 0);\r\n _$htmlBody.css('padding', 0);\r\n\r\n _paginationInfo.rightToLeft = _spine.isRightToLeft();\r\n\r\n _paginationInfo.columnWidth = Math.round(((_htmlBodyIsVerticalWritingMode ? _lastViewPortSize.height : _lastViewPortSize.width) - _paginationInfo.columnGap * (_paginationInfo.visibleColumnCount - 1)) / _paginationInfo.visibleColumnCount);\r\n\r\n var useColumnCountNotWidth = _paginationInfo.visibleColumnCount > 1; // column-count == 1 does not work in Chrome, and is not needed anyway (HTML width is full viewport width, no Firefox video flickering)\r\n if (useColumnCountNotWidth) {\r\n _$epubHtml.css(\"width\", _lastViewPortSize.width + \"px\");\r\n _$epubHtml.css(\"column-width\", \"auto\");\r\n _$epubHtml.css(\"column-count\", _paginationInfo.visibleColumnCount);\r\n } else {\r\n _$epubHtml.css(\"width\", (_htmlBodyIsVerticalWritingMode ? _lastViewPortSize.width : _paginationInfo.columnWidth) + \"px\");\r\n _$epubHtml.css(\"column-count\", \"auto\");\r\n _$epubHtml.css(\"column-width\", _paginationInfo.columnWidth + \"px\");\r\n }\r\n\r\n _$epubHtml.css(\"column-fill\", \"auto\");\r\n\r\n _$epubHtml.css({left: \"0\", right: \"0\", top: \"0\"});\r\n\r\n Helpers.triggerLayout(_$iframe);\r\n\r\n _paginationInfo.columnCount = ((_htmlBodyIsVerticalWritingMode ? _$epubHtml[0].scrollHeight : _$epubHtml[0].scrollWidth) + _paginationInfo.columnGap) / (_paginationInfo.columnWidth + _paginationInfo.columnGap);\r\n _paginationInfo.columnCount = Math.round(_paginationInfo.columnCount);\r\n\r\n var totalGaps = (_paginationInfo.columnCount-1) * _paginationInfo.columnGap;\r\n var colWidthCheck = ((_htmlBodyIsVerticalWritingMode ? _$epubHtml[0].scrollHeight : _$epubHtml[0].scrollWidth) - totalGaps) / _paginationInfo.columnCount;\r\n colWidthCheck = Math.round(colWidthCheck);\r\n\r\n if (colWidthCheck > _paginationInfo.columnWidth)\r\n {\r\n console.debug(\"ADJUST COLUMN\");\r\n console.log(_paginationInfo.columnWidth);\r\n console.log(colWidthCheck);\r\n\r\n _paginationInfo.columnWidth = colWidthCheck;\r\n }\r\n\r\n _paginationInfo.spreadCount = Math.ceil(_paginationInfo.columnCount / _paginationInfo.visibleColumnCount);\r\n\r\n if(_paginationInfo.currentSpreadIndex >= _paginationInfo.spreadCount) {\r\n _paginationInfo.currentSpreadIndex = _paginationInfo.spreadCount - 1;\r\n }\r\n\r\n if(_deferredPageRequest) {\r\n\r\n //if there is a request for specific page we get here\r\n openDeferredElement();\r\n }\r\n else {\r\n\r\n //we get here on resizing the viewport\r\n\r\n onPaginationChanged(self); // => redraw() => showBook(), so the trick below is not needed\r\n\r\n // //We do this to force re-rendering of the document in the iframe.\r\n // //There is a bug in WebView control with right to left columns layout - after resizing the window html document\r\n // //is shifted in side the containing div. Hiding and showing the html element puts document in place.\r\n // _$epubHtml.hide();\r\n // setTimeout(function() {\r\n // _$epubHtml.show();\r\n // onPaginationChanged(self); // => redraw() => showBook()\r\n // }, 50);\r\n\r\n }\r\n }\r\n\r\n// function shiftBookOfScreen() {\r\n//\r\n// if(_spine.isLeftToRight()) {\r\n// _$epubHtml.css(\"left\", (_lastViewPortSize.width + 1000) + \"px\");\r\n// }\r\n// else {\r\n// _$epubHtml.css(\"right\", (_lastViewPortSize.width + 1000) + \"px\");\r\n// }\r\n// }\r\n\r\n function hideBook()\r\n {\r\n if (_currentOpacity != -1) return; // already hidden\r\n\r\n _currentOpacity = _$epubHtml.css('opacity');\r\n _$epubHtml.css('opacity', \"0\");\r\n }\r\n\r\n function showBook()\r\n {\r\n if (_currentOpacity != -1)\r\n {\r\n _$epubHtml.css('opacity', _currentOpacity);\r\n }\r\n _currentOpacity = -1;\r\n }\r\n\r\n this.getFirstVisibleElementCfi = function() {\r\n\r\n var contentOffsets = getVisibleContentOffsets();\r\n return _navigationLogic.getFirstVisibleElementCfi(contentOffsets);\r\n };\r\n\r\n this.getPaginationInfo = function() {\r\n\r\n var paginationInfo = new CurrentPagesInfo(_spine, false);\r\n\r\n if(!_currentSpineItem) {\r\n return paginationInfo;\r\n }\r\n\r\n var pageIndexes = getOpenPageIndexes();\r\n\r\n for(var i = 0, count = pageIndexes.length; i < count; i++) {\r\n\r\n paginationInfo.addOpenPage(pageIndexes[i], _paginationInfo.columnCount, _currentSpineItem.idref, _currentSpineItem.index);\r\n }\r\n\r\n return paginationInfo;\r\n\r\n };\r\n\r\n function getOpenPageIndexes() {\r\n\r\n var indexes = [];\r\n\r\n var currentPage = _paginationInfo.currentSpreadIndex * _paginationInfo.visibleColumnCount;\r\n\r\n for(var i = 0; i < _paginationInfo.visibleColumnCount && (currentPage + i) < _paginationInfo.columnCount; i++) {\r\n\r\n indexes.push(currentPage + i);\r\n }\r\n\r\n return indexes;\r\n\r\n }\r\n\r\n //we need this styles for css columnizer not to chop big images\r\n function resizeImages() {\r\n\r\n if(!_$epubHtml) {\r\n return;\r\n }\r\n\r\n var $elem;\r\n var height;\r\n var width;\r\n\r\n $('img, svg', _$epubHtml).each(function(){\r\n\r\n $elem = $(this);\r\n\r\n // if we set max-width/max-height to 100% columnizing engine chops images embedded in the text\r\n // (but not if we set it to 99-98%) go figure.\r\n // TODO: CSS min-w/h is content-box, not border-box (does not take into account padding + border)? => images may still overrun?\r\n $elem.css('max-width', '98%');\r\n $elem.css('max-height', '98%');\r\n\r\n if(!$elem.css('height')) {\r\n $elem.css('height', 'auto');\r\n }\r\n\r\n if(!$elem.css('width')) {\r\n $elem.css('width', 'auto');\r\n }\r\n\r\n });\r\n }\r\n\r\n this.bookmarkCurrentPage = function() {\r\n\r\n if(!_currentSpineItem) {\r\n\r\n return new BookmarkData(\"\", \"\");\r\n }\r\n\r\n return new BookmarkData(_currentSpineItem.idref, self.getFirstVisibleElementCfi());\r\n };\r\n\r\n function getVisibleContentOffsets() {\r\n //TODO: _htmlBodyIsVerticalWritingMode ? (_lastViewPortSize.height * _paginationInfo.currentSpreadIndex)\r\n // NOT used with options.rectangleBased anyway (see CfiNavigationLogic constructor call, here in this reflow engine class)\r\n var columnsLeftOfViewport = Math.round(_paginationInfo.pageOffset / (_paginationInfo.columnWidth + _paginationInfo.columnGap));\r\n\r\n var topOffset = columnsLeftOfViewport * _$contentFrame.height();\r\n var bottomOffset = topOffset + _paginationInfo.visibleColumnCount * _$contentFrame.height();\r\n\r\n return {top: topOffset, bottom: bottomOffset};\r\n }\r\n\r\n this.getLoadedSpineItems = function() {\r\n return [_currentSpineItem];\r\n };\r\n\r\n this.getElementByCfi = function(spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n if(spineItem != _currentSpineItem) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n return _navigationLogic.getElementByCfi(cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n };\r\n\r\n this.getElementById = function(spineItem, id) {\r\n\r\n if(spineItem != _currentSpineItem) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n return _navigationLogic.getElementById(id);\r\n };\r\n\r\n this.getElement = function(spineItem, selector) {\r\n\r\n if(spineItem != _currentSpineItem) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n return _navigationLogic.getElement(selector);\r\n };\r\n\r\n this.getFirstVisibleMediaOverlayElement = function() {\r\n\r\n var visibleContentOffsets = getVisibleContentOffsets();\r\n return _navigationLogic.getFirstVisibleMediaOverlayElement(visibleContentOffsets);\r\n };\r\n\r\n // /**\r\n // * @deprecated\r\n // */\r\n // this.getVisibleMediaOverlayElements = function() {\r\n //\r\n // var visibleContentOffsets = getVisibleContentOffsets();\r\n // return _navigationLogic.getVisibleMediaOverlayElements(visibleContentOffsets);\r\n // };\r\n\r\n this.insureElementVisibility = function(spineItemId, element, initiator) {\r\n\r\n var $element = $(element);\r\n if(_navigationLogic.isElementVisible($element, getVisibleContentOffsets()))\r\n {\r\n return;\r\n }\r\n\r\n var page = _navigationLogic.getPageForElement($element);\r\n\r\n if(page == -1)\r\n {\r\n return;\r\n }\r\n\r\n var openPageRequest = new PageOpenRequest(_currentSpineItem, initiator);\r\n openPageRequest.setPageIndex(page);\r\n\r\n var id = element.id;\r\n if (!id)\r\n {\r\n id = element.getAttribute(\"id\");\r\n }\r\n\r\n if (id)\r\n {\r\n openPageRequest.setElementId(id);\r\n }\r\n\r\n self.openPage(openPageRequest);\r\n };\r\n\r\n this.isElementCfiVisible = function(spineIdRef, contentCfi) {\r\n if (spineIdRef != _currentSpineItem.idref) {\r\n return false;\r\n }\r\n return _navigationLogic.isElementCfiVisible(contentCfi);\r\n };\r\n\r\n};\r\n return ReflowableView;\r\n});\r\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/style',[], function() {\r\n/**\r\n *\r\n * @param selector\r\n * @param declarations\r\n * @constructor\r\n */\r\nvar Style = function(selector, declarations) {\r\n\r\n this.selector = selector;\r\n this.declarations = declarations;\r\n\r\n this.setDeclarations = function(declarations) {\r\n\r\n for(var prop in declarations) {\r\n if(declarations.hasOwnProperty(prop)) {\r\n this.declarations[prop] = declarations[prop];\r\n }\r\n }\r\n\r\n }\r\n};\r\n return Style;\r\n});\r\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/style_collection',[\"./style\"], function(Style) {\r\n/**\r\n *\r\n * @constructor\r\n */\r\nvar StyleCollection = function() {\r\n\r\n var _styles = [];\r\n\r\n this.clear = function() {\r\n _styles.length = 0;\r\n\r\n };\r\n\r\n this.findStyle = function(selector) {\r\n\r\n var count = _styles.length;\r\n for(var i = 0; i < count; i++) {\r\n if(_styles[i].selector === selector) {\r\n return _styles[i];\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n this.addStyle = function(selector, declarations) {\r\n\r\n var style = this.findStyle(selector);\r\n\r\n if(style) {\r\n style.setDeclarations(declarations);\r\n }\r\n else {\r\n style = new Style(selector, declarations);\r\n _styles.push(style);\r\n }\r\n\r\n return style;\r\n };\r\n\r\n this.removeStyle = function(selector) {\r\n \r\n var count = _styles.length;\r\n\r\n for(var i = 0; i < count; i++) {\r\n\r\n if(_styles[i].selector === selector) {\r\n _styles.splice(i, 1);\r\n return;\r\n }\r\n }\r\n };\r\n\r\n this.getStyles = function() {\r\n return _styles;\r\n };\r\n\r\n this.resetStyleValues = function() {\r\n\r\n var count = _styles.length;\r\n\r\n for(var i = 0; i < count; i++) {\r\n\r\n var style = _styles[i];\r\n var declarations = style.declarations;\r\n\r\n for(var prop in declarations) {\r\n if(declarations.hasOwnProperty(prop)) {\r\n declarations[prop] = '';\r\n }\r\n }\r\n }\r\n }\r\n\r\n};\r\n return StyleCollection;\r\n});\r\n\n", - "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\ndefine('readium_shared_js/models/switches',[\"jquery\", \"underscore\"], function($, _) {\r\n/**\r\n *\r\n * @constructor\r\n */\r\nvar Switches = function() {\r\n\r\n};\r\n\r\n// Description: Parse the epub \"switch\" tags and hide\r\n// cases that are not supported\r\nSwitches.apply = function(dom) {\r\n\r\n\r\n // helper method, returns true if a given case node\r\n // is supported, false otherwise\r\n function isSupported(caseNode) {\r\n\r\n var ns = caseNode.attributes[\"required-namespace\"];\r\n if(!ns) {\r\n // the namespace was not specified, that should\r\n // never happen, we don't support it then\r\n console.log(\"Encountered a case statement with no required-namespace\");\r\n return false;\r\n }\r\n // all the xmlns that readium is known to support\r\n // TODO this is going to require maintenance\r\n var supportedNamespaces = [\"http://www.w3.org/1998/Math/MathML\"];\r\n return _.include(supportedNamespaces, ns);\r\n }\r\n\r\n $('switch', dom).each( function() {\r\n\r\n // keep track of whether or now we found one\r\n var found = false;\r\n\r\n $('case', this).each(function() {\r\n\r\n if( !found && isSupported(this) ) {\r\n found = true; // we found the node, don't remove it\r\n }\r\n else {\r\n $(this).remove(); // remove the node from the dom\r\n// $(this).prop(\"hidden\", true);\r\n }\r\n });\r\n\r\n if(found) {\r\n // if we found a supported case, remove the default\r\n $('default', this).remove();\r\n// $('default', this).prop(\"hidden\", true);\r\n }\r\n })\r\n};\r\n return Switches;\r\n});\r\n\n", + "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\ndefine('readium_shared_js/models/switches',[\"jquery\", \"underscore\"], function($, _) {\r\n/**\r\n *\r\n * @constructor\r\n */\r\nvar Switches = function() {\r\n\r\n};\r\n\r\n// Description: Parse the epub \"switch\" tags and hide\r\n// cases that are not supported\r\nSwitches.apply = function(dom) {\r\n\r\n function isSupported(caseNode) {\r\n\r\n var ns = caseNode.attributes[\"required-namespace\"];\r\n if(!ns) {\r\n // the namespace was not specified, that should\r\n // never happen, we don't support it then\r\n console.log(\"Encountered a case statement with no required-namespace\");\r\n return false;\r\n }\r\n // all the xmlns that readium is known to support\r\n // TODO this is going to require maintenance\r\n var supportedNamespaces = [\"http://www.w3.org/1998/Math/MathML\"];\r\n return _.include(supportedNamespaces, ns.value);\r\n }\r\n\r\n var getQuery = ((window.navigator.userAgent.indexOf(\"Trident\") > 0) || (window.navigator.userAgent.indexOf(\"Edge\") > 0))\r\n ? function (elementName) { return 'epub\\\\:' + elementName; }\r\n : function (elementName) { return elementName; };\r\n\r\n _.each(dom.querySelectorAll(getQuery('switch')), function(switchNode) {\r\n\r\n // keep track of whether or now we found one\r\n var found = false;\r\n\r\n _.each(switchNode.querySelectorAll(getQuery('case')), function(caseNode) {\r\n\r\n if( !found && isSupported(caseNode) ) {\r\n found = true; // we found the node, don't remove it\r\n }\r\n else {\r\n $(caseNode).remove(); // remove the node from the dom\r\n }\r\n\r\n });\r\n\r\n if (found) {\r\n\r\n // if we found a supported case, remove the default\r\n _.each(switchNode.querySelectorAll(getQuery('default')), function(defaultNode) {\r\n $(defaultNode).remove();\r\n });\r\n\r\n }\r\n\r\n });\r\n};\r\n return Switches;\r\n});\r\n\n", "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/trigger',[\"jquery\", \"../helpers\"], function($, Helpers) {\r\n/**\r\n * Setter fot epub Triggers\r\n *\r\n *\r\n * @param domNode\r\n */\r\n\r\nvar Trigger = function(domNode) {\r\n var $el = $(domNode);\r\n this.action \t= $el.attr(\"action\");\r\n this.ref \t\t= $el.attr(\"ref\");\r\n this.event \t\t= $el.attr(\"ev:event\");\r\n this.observer \t= $el.attr(\"ev:observer\");\r\n this.ref \t\t= $el.attr(\"ref\");\r\n};\r\n\r\nTrigger.register = function(dom) {\r\n $('trigger', dom).each(function() {\r\n var trigger = new Trigger(this);\r\n trigger.subscribe(dom);\r\n });\r\n};\r\n\r\nTrigger.prototype.subscribe = function(dom) {\r\n var selector = \"#\" + this.observer;\r\n var that = this;\r\n $(selector, dom).on(this.event, function() {\r\n that.execute(dom);\r\n });\r\n};\r\n\r\nTrigger.prototype.execute = function(dom) {\r\n var $target = $( \"#\" + Helpers.escapeJQuerySelector(this.ref), dom);\r\n switch(this.action)\r\n {\r\n case \"show\":\r\n $target.css(\"visibility\", \"visible\");\r\n break;\r\n case \"hide\":\r\n $target.css(\"visibility\", \"hidden\");\r\n break;\r\n case \"play\":\r\n $target[0].currentTime = 0;\r\n $target[0].play();\r\n break;\r\n case \"pause\":\r\n $target[0].pause();\r\n break;\r\n case \"resume\":\r\n $target[0].play();\r\n break;\r\n case \"mute\":\r\n $target[0].muted = true;\r\n break;\r\n case \"unmute\":\r\n $target[0].muted = false;\r\n break;\r\n default:\r\n console.log(\"do not no how to handle trigger \" + this.action);\r\n }\r\n};\r\n return Trigger;\r\n});\r\n\n", - "// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/views/reader_view',[\"jquery\", \"underscore\", \"eventEmitter\", \"./fixed_view\", \"../helpers\", \"./iframe_loader\", \"./internal_links_support\",\r\n \"./media_overlay_data_injector\", \"./media_overlay_player\", \"../models/package\", \"../models/page_open_request\",\r\n \"./reflowable_view\", \"./scroll_view\", \"../models/style_collection\", \"../models/switches\", \"../models/trigger\",\r\n \"../models/viewer_settings\", \"../globals\"],\r\n function ($, _, EventEmitter, FixedView, Helpers, IFrameLoader, InternalLinksSupport,\r\n MediaOverlayDataInjector, MediaOverlayPlayer, Package, PageOpenRequest,\r\n ReflowableView, ScrollView, StyleCollection, Switches, Trigger,\r\n ViewerSettings, Globals) {\r\n/**\r\n * Options passed on the reader from the readium loader/initializer\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.ReaderOptions\r\n * @property {jQueryElement|string} el The element the reader view should create itself in. Can be a jquery wrapped element or a query selector.\r\n * @property {Globals.Views.IFrameLoader} iframeLoader An instance of an iframe loader or one expanding it.\r\n * @property {boolean} needsFixedLayoutScalerWorkAround\r\n */\r\n\r\n/**\r\n * Top level View object. Interface for view manipulation public APIs\r\n * @param {Views.ReaderView.ReaderOptions} options\r\n * @constructor\r\n */\r\nvar ReaderView = function (options) {\r\n\r\n $.extend(this, new EventEmitter());\r\n\r\n var self = this;\r\n var _currentView = undefined;\r\n var _package = undefined;\r\n var _spine = undefined;\r\n var _viewerSettings = new ViewerSettings({});\r\n //styles applied to the container divs\r\n var _userStyles = new StyleCollection();\r\n //styles applied to the content documents\r\n var _bookStyles = new StyleCollection();\r\n var _internalLinksSupport = new InternalLinksSupport(this);\r\n var _mediaOverlayPlayer;\r\n var _mediaOverlayDataInjector;\r\n var _iframeLoader;\r\n var _$el;\r\n\r\n //We will call onViewportResize after user stopped resizing window\r\n var lazyResize = Helpers.extendedThrottle(\r\n handleViewportResizeStart,\r\n handleViewportResizeTick,\r\n handleViewportResizeEnd, 250, 1000, self);\r\n\r\n $(window).on(\"resize.ReadiumSDK.readerView\", lazyResize);\r\n\r\n if (options.el instanceof $) {\r\n _$el = options.el;\r\n console.log(\"** EL is a jQuery selector:\" + options.el.attr('id'));\r\n } else {\r\n _$el = $(options.el);\r\n console.log(\"** EL is a string:\" + _$el.attr('id'));\r\n }\r\n\r\n if (options.iframeLoader) {\r\n _iframeLoader = options.iframeLoader;\r\n }\r\n else {\r\n _iframeLoader = new IFrameLoader({mathJaxUrl: options.mathJaxUrl});\r\n }\r\n\r\n\r\n _needsFixedLayoutScalerWorkAround = options.needsFixedLayoutScalerWorkAround;\r\n /**\r\n * @returns {boolean}\r\n */\r\n this.needsFixedLayoutScalerWorkAround = function () {\r\n return _needsFixedLayoutScalerWorkAround;\r\n };\r\n\r\n /**\r\n * Create a view based on the given view type.\r\n * @param {Views.ReaderView.ViewType} viewType\r\n * @param {Views.ReaderView.ViewCreationOptions} options\r\n * @returns {*}\r\n */\r\n this.createViewForType = function (viewType, options) {\r\n var createdView;\r\n\r\n // NOTE: _$el == options.$viewport\r\n _$el.css(\"overflow\", \"hidden\");\r\n\r\n switch (viewType) {\r\n case ReaderView.VIEW_TYPE_FIXED:\r\n\r\n _$el.css(\"overflow\", \"auto\"); // for content pan, see self.setZoom()\r\n\r\n createdView = new FixedView(options, self);\r\n break;\r\n case ReaderView.VIEW_TYPE_SCROLLED_DOC:\r\n createdView = new ScrollView(options, false, self);\r\n break;\r\n case ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS:\r\n createdView = new ScrollView(options, true, self);\r\n break;\r\n default:\r\n createdView = new ReflowableView(options, self);\r\n break;\r\n }\r\n\r\n return createdView;\r\n };\r\n\r\n /**\r\n * Returns the current view type of the reader view\r\n * @returns {ReaderView.ViewType}\r\n */\r\n this.getCurrentViewType = function () {\r\n\r\n if (!_currentView) {\r\n return undefined;\r\n }\r\n\r\n if (_currentView instanceof ReflowableView) {\r\n return ReaderView.VIEW_TYPE_COLUMNIZED;\r\n }\r\n\r\n if (_currentView instanceof FixedView) {\r\n return ReaderView.VIEW_TYPE_FIXED;\r\n }\r\n\r\n if (_currentView instanceof ScrollView) {\r\n if (_currentView.isContinuousScroll()) {\r\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\r\n }\r\n\r\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\r\n }\r\n\r\n console.error(\"Unrecognized view type\");\r\n return undefined;\r\n };\r\n\r\n //based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 document\r\n function deduceDesiredViewType(spineItem) {\r\n\r\n //check settings\r\n if (_viewerSettings.scroll == \"scroll-doc\") {\r\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\r\n }\r\n\r\n if (_viewerSettings.scroll == \"scroll-continuous\") {\r\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\r\n }\r\n\r\n //is fixed layout ignore flow\r\n if (spineItem.isFixedLayout()) {\r\n return ReaderView.VIEW_TYPE_FIXED;\r\n }\r\n\r\n //flow\r\n if (spineItem.isFlowScrolledDoc()) {\r\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\r\n }\r\n\r\n if (spineItem.isFlowScrolledContinuous()) {\r\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\r\n }\r\n\r\n return ReaderView.VIEW_TYPE_COLUMNIZED;\r\n }\r\n\r\n // returns true is view changed\r\n function initViewForItem(spineItem, callback) {\r\n\r\n var desiredViewType = deduceDesiredViewType(spineItem);\r\n\r\n if (_currentView) {\r\n\r\n if (self.getCurrentViewType() == desiredViewType) {\r\n callback(false);\r\n return;\r\n }\r\n\r\n resetCurrentView();\r\n }\r\n\r\n /**\r\n * View creation options\r\n * @typedef {object} Globals.Views.ReaderView.ViewCreationOptions\r\n * @property {jQueryElement} $viewport The view port element the reader view has created.\r\n * @property {Globals.Models.Spine} spine The spine item collection object\r\n * @property {Globals.Collections.StyleCollection} userStyles User styles\r\n * @property {Globals.Collections.StyleCollection} bookStyles Book styles\r\n * @property {Globals.Views.IFrameLoader} iframeLoader An instance of an iframe loader or one expanding it.\r\n */\r\n var viewCreationParams = {\r\n $viewport: _$el,\r\n spine: _spine,\r\n userStyles: _userStyles,\r\n bookStyles: _bookStyles,\r\n iframeLoader: _iframeLoader\r\n };\r\n\r\n\r\n _currentView = self.createViewForType(desiredViewType, viewCreationParams);\r\n self.emit(Globals.Events.READER_VIEW_CREATED, desiredViewType);\r\n\r\n _currentView.on(Globals.Events.CONTENT_DOCUMENT_LOADED, function ($iframe, spineItem) {\r\n\r\n if (!Helpers.isIframeAlive($iframe[0])) return;\r\n\r\n // performance degrades with large DOM (e.g. word-level text-audio sync)\r\n _mediaOverlayDataInjector.attachMediaOverlayData($iframe, spineItem, _viewerSettings);\r\n\r\n _internalLinksSupport.processLinkElements($iframe, spineItem);\r\n\r\n var contentDoc = $iframe[0].contentDocument;\r\n Trigger.register(contentDoc);\r\n Switches.apply(contentDoc);\r\n\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOADED, $iframe, spineItem);\r\n });\r\n\r\n _currentView.on(Globals.Events.CONTENT_DOCUMENT_LOAD_START, function ($iframe, spineItem) {\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOAD_START, $iframe, spineItem);\r\n });\r\n\r\n _currentView.on(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, function (pageChangeData) {\r\n\r\n //we call on onPageChanged explicitly instead of subscribing to the Globals.Events.PAGINATION_CHANGED by\r\n //mediaOverlayPlayer because we hve to guarantee that mediaOverlayPlayer will be updated before the host\r\n //application will be notified by the same Globals.Events.PAGINATION_CHANGED event\r\n _mediaOverlayPlayer.onPageChanged(pageChangeData);\r\n\r\n _.defer(function () {\r\n self.emit(Globals.Events.PAGINATION_CHANGED, pageChangeData);\r\n });\r\n });\r\n\r\n _currentView.on(Globals.Events.FXL_VIEW_RESIZED, function () {\r\n self.emit(Globals.Events.FXL_VIEW_RESIZED);\r\n })\r\n\r\n _currentView.render();\r\n _currentView.setViewSettings(_viewerSettings);\r\n\r\n // we do this to wait until elements are rendered otherwise book is not able to determine view size.\r\n setTimeout(function () {\r\n\r\n callback(true);\r\n\r\n }, 50);\r\n\r\n }\r\n\r\n /**\r\n * Returns a list of the currently active spine items\r\n *\r\n * @returns {Models.SpineItem[]}\r\n */\r\n this.getLoadedSpineItems = function () {\r\n\r\n if (_currentView) {\r\n return _currentView.getLoadedSpineItems();\r\n }\r\n\r\n return [];\r\n };\r\n\r\n function resetCurrentView() {\r\n\r\n if (!_currentView) {\r\n return;\r\n }\r\n\r\n self.emit(Globals.Events.READER_VIEW_DESTROYED);\r\n\r\n _currentView.off(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED);\r\n _currentView.remove();\r\n _currentView = undefined;\r\n }\r\n\r\n /**\r\n * Returns the currently instanced viewer settings\r\n *\r\n * @returns {Models.ViewerSettings}\r\n */\r\n this.viewerSettings = function () {\r\n return _viewerSettings;\r\n };\r\n\r\n /**\r\n * Returns a data object based on the package document\r\n *\r\n * @returns {Models.Package}\r\n */\r\n this.package = function () {\r\n return _package;\r\n };\r\n\r\n /**\r\n * Returns a representation of the spine as a data object, also acts as list of spine items\r\n *\r\n * @returns {Models.Spine}\r\n */\r\n this.spine = function () {\r\n return _spine;\r\n };\r\n\r\n /**\r\n * Returns the user CSS styles collection\r\n *\r\n * @returns {Collections.StyleCollection}\r\n */\r\n this.userStyles = function () {\r\n return _userStyles;\r\n };\r\n\r\n /**\r\n * Open Book Data\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.OpenBookData\r\n * @property {Globals.Models.Package} package - packageData (required)\r\n * @property {Globals.Models.PageOpenRequest} openPageRequest - openPageRequestData, (optional) data related to open page request\r\n * @property {Globals.Views.ReaderView.SettingsData} [settings]\r\n * @property {Globals.Collections.StyleCollection} styles: [cssStyles]\r\n * @todo Define missing types\r\n */\r\n\r\n /**\r\n * Triggers the process of opening the book and requesting resources specified in the packageData\r\n *\r\n * @param {Views.ReaderView.OpenBookData} openBookData - object with open book data\r\n */\r\n this.openBook = function (openBookData) {\r\n\r\n var packageData = openBookData.package ? openBookData.package : openBookData;\r\n\r\n _package = new Package(packageData);\r\n\r\n _spine = _package.spine;\r\n _spine.handleLinear(true);\r\n\r\n if (_mediaOverlayPlayer) {\r\n _mediaOverlayPlayer.reset();\r\n }\r\n\r\n _mediaOverlayPlayer = new MediaOverlayPlayer(self, $.proxy(onMediaPlayerStatusChanged, self));\r\n _mediaOverlayPlayer.setAutomaticNextSmil(_viewerSettings.mediaOverlaysAutomaticPageTurn ? true : false); // just to ensure the internal var is set to the default settings (user settings are applied below at self.updateSettings(openBookData.settings);)\r\n\r\n _mediaOverlayDataInjector = new MediaOverlayDataInjector(_package.media_overlay, _mediaOverlayPlayer);\r\n\r\n\r\n resetCurrentView();\r\n\r\n if (openBookData.settings) {\r\n self.updateSettings(openBookData.settings);\r\n }\r\n\r\n if (openBookData.styles) {\r\n self.setStyles(openBookData.styles);\r\n }\r\n\r\n var pageRequestData = undefined;\r\n\r\n if (openBookData.openPageRequest) {\r\n\r\n if (openBookData.openPageRequest.idref || (openBookData.openPageRequest.contentRefUrl && openBookData.openPageRequest.sourceFileHref)) {\r\n pageRequestData = openBookData.openPageRequest;\r\n }\r\n else {\r\n console.log(\"Invalid page request data: idref required!\");\r\n }\r\n }\r\n\r\n var fallback = false;\r\n if (pageRequestData) {\r\n\r\n pageRequestData = openBookData.openPageRequest;\r\n\r\n try {\r\n if (pageRequestData.idref) {\r\n\r\n if (pageRequestData.spineItemPageIndex) {\r\n fallback = !self.openSpineItemPage(pageRequestData.idref, pageRequestData.spineItemPageIndex, self);\r\n }\r\n else if (pageRequestData.elementCfi) {\r\n fallback = !self.openSpineItemElementCfi(pageRequestData.idref, pageRequestData.elementCfi, self);\r\n }\r\n else {\r\n fallback = !self.openSpineItemPage(pageRequestData.idref, 0, self);\r\n }\r\n }\r\n else {\r\n fallback = !self.openContentUrl(pageRequestData.contentRefUrl, pageRequestData.sourceFileHref, self);\r\n }\r\n } catch (err) {\r\n console.error(\"openPageRequest fail: fallback to first page!\")\r\n console.log(err);\r\n fallback = true;\r\n }\r\n }\r\n else {\r\n fallback = true;\r\n }\r\n\r\n if (fallback) {// if we where not asked to open specific page we will open the first one\r\n\r\n var spineItem = _spine.first();\r\n if (spineItem) {\r\n var pageOpenRequest = new PageOpenRequest(spineItem, self);\r\n pageOpenRequest.setFirstPage();\r\n openPage(pageOpenRequest, 0);\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n function onMediaPlayerStatusChanged(status) {\r\n self.emit(Globals.Events.MEDIA_OVERLAY_STATUS_CHANGED, status);\r\n }\r\n\r\n /**\r\n * Flips the page from left to right.\r\n * Takes to account the page progression direction to decide to flip to prev or next page.\r\n */\r\n this.openPageLeft = function () {\r\n\r\n if (_package.spine.isLeftToRight()) {\r\n self.openPagePrev();\r\n }\r\n else {\r\n self.openPageNext();\r\n }\r\n };\r\n\r\n /**\r\n * Flips the page from right to left.\r\n * Takes to account the page progression direction to decide to flip to prev or next page.\r\n */\r\n this.openPageRight = function () {\r\n\r\n if (_package.spine.isLeftToRight()) {\r\n self.openPageNext();\r\n }\r\n else {\r\n self.openPagePrev();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Returns if the current child view is an instance of a fixed page view\r\n *\r\n * @returns {boolean}\r\n */\r\n this.isCurrentViewFixedLayout = function () {\r\n return _currentView instanceof FixedView;\r\n };\r\n\r\n /**\r\n * Zoom options\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.ZoomOptions\r\n * @property {string} style - \"user\"|\"fit-screen\"|\"fit-width\"\r\n * @property {number} scale - 0.0 to 1.0\r\n */\r\n\r\n /**\r\n * Set the zoom options.\r\n *\r\n * @param {Views.ReaderView.ZoomOptions} zoom Zoom options\r\n */\r\n this.setZoom = function (zoom) {\r\n // zoom only handled by fixed layout views\r\n if (self.isCurrentViewFixedLayout()) {\r\n _currentView.setZoom(zoom);\r\n }\r\n };\r\n\r\n /**\r\n * Returns the current view scale as a percentage\r\n *\r\n * @returns {number}\r\n */\r\n this.getViewScale = function () {\r\n if (self.isCurrentViewFixedLayout()) {\r\n return 100 * _currentView.getViewScale();\r\n }\r\n else {\r\n return 100;\r\n }\r\n };\r\n\r\n /**\r\n * Settings Data\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.SettingsData\r\n * @property {number} fontSize - Font size as percentage\r\n * @property {(string|boolean)} syntheticSpread - \"auto\"|true|false\r\n * @property {(string|boolean)} scroll - \"auto\"|true|false\r\n * @property {boolean} doNotUpdateView - Indicates whether the view should be updated after the settings are applied\r\n * @property {boolean} mediaOverlaysEnableClick - Indicates whether media overlays are interactive on mouse clicks\r\n */\r\n\r\n /**\r\n * Updates reader view based on the settings specified in settingsData object\r\n *\r\n * @param {Globals.Views.ReaderView.SettingsData} settingsData Settings data\r\n * @fires Globals.Events.SETTINGS_APPLIED\r\n */\r\n this.updateSettings = function (settingsData) {\r\n\r\n//console.debug(\"UpdateSettings: \" + JSON.stringify(settingsData));\r\n\r\n _viewerSettings.update(settingsData);\r\n\r\n if (_mediaOverlayPlayer) {\r\n _mediaOverlayPlayer.setAutomaticNextSmil(_viewerSettings.mediaOverlaysAutomaticPageTurn ? true : false);\r\n }\r\n\r\n if (_currentView && !settingsData.doNotUpdateView) {\r\n\r\n var bookMark = _currentView.bookmarkCurrentPage();\r\n\r\n if (bookMark && bookMark.idref) {\r\n\r\n var wasPlaying = false;\r\n if (_currentView.isReflowable && _currentView.isReflowable()) {\r\n wasPlaying = self.isPlayingMediaOverlay();\r\n if (wasPlaying) {\r\n self.pauseMediaOverlay();\r\n }\r\n }\r\n\r\n var spineItem = _spine.getItemById(bookMark.idref);\r\n\r\n initViewForItem(spineItem, function (isViewChanged) {\r\n\r\n if (!isViewChanged) {\r\n _currentView.setViewSettings(_viewerSettings);\r\n }\r\n\r\n self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self);\r\n\r\n if (wasPlaying) {\r\n self.playMediaOverlay();\r\n // setTimeout(function()\r\n // {\r\n // }, 60);\r\n }\r\n\r\n self.emit(Globals.Events.SETTINGS_APPLIED);\r\n });\r\n \r\n return;\r\n }\r\n }\r\n\r\n self.emit(Globals.Events.SETTINGS_APPLIED);\r\n };\r\n\r\n /**\r\n * Opens the next page.\r\n */\r\n this.openPageNext = function () {\r\n\r\n if (self.getCurrentViewType() === ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS) {\r\n _currentView.openPageNext(self);\r\n return;\r\n }\r\n\r\n var paginationInfo = _currentView.getPaginationInfo();\r\n\r\n if (paginationInfo.openPages.length == 0) {\r\n return;\r\n }\r\n\r\n var lastOpenPage = paginationInfo.openPages[paginationInfo.openPages.length - 1];\r\n\r\n if (lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1) {\r\n _currentView.openPageNext(self);\r\n return;\r\n }\r\n\r\n var currentSpineItem = _spine.getItemById(lastOpenPage.idref);\r\n\r\n var nextSpineItem = _spine.nextItem(currentSpineItem);\r\n\r\n if (!nextSpineItem) {\r\n return;\r\n }\r\n\r\n var openPageRequest = new PageOpenRequest(nextSpineItem, self);\r\n openPageRequest.setFirstPage();\r\n\r\n openPage(openPageRequest, 2);\r\n };\r\n\r\n /**\r\n * Opens the previous page.\r\n */\r\n this.openPagePrev = function () {\r\n\r\n if (self.getCurrentViewType() === ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS) {\r\n _currentView.openPagePrev(self);\r\n return;\r\n }\r\n\r\n var paginationInfo = _currentView.getPaginationInfo();\r\n\r\n if (paginationInfo.openPages.length == 0) {\r\n return;\r\n }\r\n\r\n var firstOpenPage = paginationInfo.openPages[0];\r\n\r\n if (firstOpenPage.spineItemPageIndex > 0) {\r\n _currentView.openPagePrev(self);\r\n return;\r\n }\r\n\r\n var currentSpineItem = _spine.getItemById(firstOpenPage.idref);\r\n\r\n var prevSpineItem = _spine.prevItem(currentSpineItem);\r\n\r\n if (!prevSpineItem) {\r\n return;\r\n }\r\n\r\n var openPageRequest = new PageOpenRequest(prevSpineItem, self);\r\n openPageRequest.setLastPage();\r\n\r\n openPage(openPageRequest, 1);\r\n };\r\n\r\n function getSpineItem(idref) {\r\n\r\n if (!idref) {\r\n\r\n console.log(\"idref parameter value missing!\");\r\n return undefined;\r\n }\r\n\r\n var spineItem = _spine.getItemById(idref);\r\n if (!spineItem) {\r\n console.log(\"Spine item with id \" + idref + \" not found!\");\r\n return undefined;\r\n }\r\n\r\n return spineItem;\r\n\r\n }\r\n\r\n /**\r\n * Opens the page of the spine item with element with provided cfi\r\n *\r\n * @param {string} idref Id of the spine item\r\n * @param {string} elementCfi CFI of the element to be shown\r\n * @param {object} initiator optional\r\n */\r\n this.openSpineItemElementCfi = function (idref, elementCfi, initiator) {\r\n\r\n var spineItem = getSpineItem(idref);\r\n\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n var pageData = new PageOpenRequest(spineItem, initiator);\r\n if (elementCfi) {\r\n pageData.setElementCfi(elementCfi);\r\n }\r\n\r\n openPage(pageData, 0);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Opens specified page index of the current spine item\r\n *\r\n * @param {number} pageIndex Zero based index of the page in the current spine item\r\n * @param {object} initiator optional\r\n */\r\n this.openPageIndex = function (pageIndex, initiator) {\r\n\r\n if (!_currentView) {\r\n return false;\r\n }\r\n\r\n var pageRequest;\r\n\r\n if (_package.isFixedLayout()) {\r\n var spineItem = _spine.items[pageIndex];\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n pageRequest = new PageOpenRequest(spineItem, initiator);\r\n pageRequest.setPageIndex(0);\r\n }\r\n else {\r\n\r\n var spineItems = this.getLoadedSpineItems();\r\n if (spineItems.length > 0) {\r\n pageRequest = new PageOpenRequest(spineItems[0], initiator);\r\n pageRequest.setPageIndex(pageIndex);\r\n }\r\n }\r\n\r\n openPage(pageRequest, 0);\r\n\r\n return true;\r\n };\r\n\r\n // dir: 0 => new or same page, 1 => previous, 2 => next\r\n function openPage(pageRequest, dir) {\r\n\r\n initViewForItem(pageRequest.spineItem, function (isViewChanged) {\r\n\r\n if (!isViewChanged) {\r\n _currentView.setViewSettings(_viewerSettings);\r\n }\r\n\r\n _currentView.openPage(pageRequest, dir);\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Opens page index of the spine item with idref provided\r\n *\r\n * @param {string} idref Id of the spine item\r\n * @param {number} pageIndex Zero based index of the page in the spine item\r\n * @param {object} initiator optional\r\n */\r\n this.openSpineItemPage = function (idref, pageIndex, initiator) {\r\n\r\n var spineItem = getSpineItem(idref);\r\n\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n var pageData = new PageOpenRequest(spineItem, initiator);\r\n if (pageIndex) {\r\n pageData.setPageIndex(pageIndex);\r\n }\r\n\r\n openPage(pageData, 0);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Set CSS Styles to the reader container\r\n *\r\n * @param {Collections.StyleCollection} styles Style collection containing selector property and declarations object\r\n * @param {boolean} doNotUpdateView Whether to update the view after the styles are applied.\r\n */\r\n this.setStyles = function (styles, doNotUpdateView) {\r\n\r\n var count = styles.length;\r\n\r\n for (var i = 0; i < count; i++) {\r\n if (styles[i].declarations) {\r\n _userStyles.addStyle(styles[i].selector, styles[i].declarations);\r\n }\r\n else {\r\n _userStyles.removeStyle(styles[i].selector);\r\n }\r\n }\r\n\r\n applyStyles(doNotUpdateView);\r\n\r\n };\r\n\r\n /**\r\n * Set CSS Styles to the content documents\r\n *\r\n * @param {Collections.StyleCollection} styles Style collection containing selector property and declarations object\r\n */\r\n this.setBookStyles = function (styles) {\r\n\r\n var count = styles.length;\r\n\r\n for (var i = 0; i < count; i++) {\r\n _bookStyles.addStyle(styles[i].selector, styles[i].declarations);\r\n }\r\n\r\n if (_currentView) {\r\n _currentView.applyBookStyles();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Gets an element from active content documents based on a query selector.\r\n *\r\n * @param {Models.SpineItem} spineItem The spine item object associated with an active content document\r\n * @param {string} selector The query selector\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getElement = function (spineItem, selector) {\r\n\r\n if (_currentView) {\r\n return _currentView.getElement(spineItem, selector);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Gets an element from active content documents based on an element id.\r\n *\r\n * @param {Models.SpineItem} spineItem The spine item object associated with an active content document\r\n * @param {string} id The element id\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getElementById = function (spineItem, id) {\r\n\r\n if (_currentView) {\r\n return _currentView.getElementById(spineItem, id);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Gets an element from active content documents based on a content CFI.\r\n *\r\n * @param {Models.SpineItem} spineItem The spine item idref associated with an active content document\r\n * @param {string} cfi The partial content CFI\r\n * @param {string[]} [classBlacklist]\r\n * @param {string[]} [elementBlacklist]\r\n * @param {string[]} [idBlacklist]\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getElementByCfi = function (spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n if (_currentView) {\r\n return _currentView.getElementByCfi(spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n }\r\n\r\n return undefined;\r\n\r\n };\r\n\r\n function applyStyles(doNotUpdateView) {\r\n\r\n Helpers.setStyles(_userStyles.getStyles(), _$el);\r\n\r\n if (_mediaOverlayPlayer)\r\n _mediaOverlayPlayer.applyStyles();\r\n\r\n if (doNotUpdateView) return;\r\n\r\n if (_currentView) {\r\n _currentView.applyStyles();\r\n }\r\n }\r\n\r\n /**\r\n * Opens a content url from a media player context\r\n *\r\n * @param {string} contentRefUrl\r\n * @param {string} sourceFileHref\r\n * @param offset\r\n */\r\n this.mediaOverlaysOpenContentUrl = function (contentRefUrl, sourceFileHref, offset) {\r\n _mediaOverlayPlayer.mediaOverlaysOpenContentUrl(contentRefUrl, sourceFileHref, offset);\r\n };\r\n\r\n\r\n /**\r\n * Opens the content document specified by the url\r\n *\r\n * @param {string} contentRefUrl Url of the content document\r\n * @param {string | undefined} sourceFileHref Url to the file that contentRefUrl is relative to. If contentRefUrl is\r\n * relative ot the source file that contains it instead of the package file (ex. TOC file) We have to know the\r\n * sourceFileHref to resolve contentUrl relative to the package file.\r\n * @param {object} initiator optional\r\n */\r\n this.openContentUrl = function (contentRefUrl, sourceFileHref, initiator) {\r\n\r\n var combinedPath = Helpers.ResolveContentRef(contentRefUrl, sourceFileHref);\r\n\r\n var hashIndex = combinedPath.indexOf(\"#\");\r\n var hrefPart;\r\n var elementId;\r\n if (hashIndex >= 0) {\r\n hrefPart = combinedPath.substr(0, hashIndex);\r\n elementId = combinedPath.substr(hashIndex + 1);\r\n }\r\n else {\r\n hrefPart = combinedPath;\r\n elementId = undefined;\r\n }\r\n\r\n var spineItem = _spine.getItemByHref(hrefPart);\r\n if (!spineItem) {\r\n console.warn('spineItem ' + hrefPart + ' not found');\r\n // sometimes that happens because spine item's URI gets encoded,\r\n // yet it's compared with raw strings by `getItemByHref()` -\r\n // so we try to search with decoded link as well\r\n var decodedHrefPart = decodeURIComponent(hrefPart);\r\n spineItem = _spine.getItemByHref(decodedHrefPart);\r\n if (!spineItem) {\r\n console.warn('decoded spineItem ' + decodedHrefPart + ' missing as well');\r\n return false;\r\n }\r\n }\r\n\r\n return self.openSpineItemElementId(spineItem.idref, elementId, initiator);\r\n };\r\n\r\n /**\r\n * Opens the page of the spine item with element with provided cfi\r\n *\r\n * @param {string} idref Id of the spine item\r\n * @param {string} elementId id of the element to be shown\r\n * @param {object} initiator optional\r\n */\r\n this.openSpineItemElementId = function (idref, elementId, initiator) {\r\n\r\n var spineItem = _spine.getItemById(idref);\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n var pageData = new PageOpenRequest(spineItem, initiator);\r\n\r\n if (elementId) {\r\n pageData.setElementId(elementId);\r\n }\r\n\r\n\r\n openPage(pageData, 0);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Returns the bookmark associated with currently opened page.\r\n *\r\n * @returns {string} Serialized Globals.Models.BookmarkData object as JSON string.\r\n */\r\n this.bookmarkCurrentPage = function () {\r\n return JSON.stringify(_currentView.bookmarkCurrentPage());\r\n };\r\n\r\n /**\r\n * Resets all the custom styles set by setStyle callers at runtime\r\n */\r\n this.clearStyles = function () {\r\n\r\n _userStyles.resetStyleValues();\r\n applyStyles();\r\n _userStyles.clear();\r\n };\r\n\r\n /**\r\n * Resets all the custom styles set by setBookStyle callers at runtime\r\n */\r\n this.clearBookStyles = function () {\r\n\r\n if (_currentView) {\r\n\r\n _bookStyles.resetStyleValues();\r\n _currentView.applyBookStyles();\r\n }\r\n\r\n _bookStyles.clear();\r\n };\r\n\r\n /**\r\n * Returns true if media overlay available for one of the open pages.\r\n *\r\n * @returns {boolean}\r\n */\r\n this.isMediaOverlayAvailable = function () {\r\n\r\n if (!_mediaOverlayPlayer) return false;\r\n\r\n return _mediaOverlayPlayer.isMediaOverlayAvailable();\r\n };\r\n\r\n /*\r\n this.setMediaOverlaySkippables = function(items) {\r\n\r\n _mediaOverlayPlayer.setMediaOverlaySkippables(items);\r\n };\r\n\r\n this.setMediaOverlayEscapables = function(items) {\r\n\r\n _mediaOverlayPlayer.setMediaOverlayEscapables(items);\r\n };\r\n */\r\n\r\n /**\r\n * Starts/Stop playing media overlay on current page\r\n */\r\n this.toggleMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.toggleMediaOverlay();\r\n };\r\n\r\n\r\n /**\r\n * Plays next fragment media overlay\r\n */\r\n this.nextMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.nextMediaOverlay();\r\n\r\n };\r\n\r\n /**\r\n * Plays previous fragment media overlay\r\n */\r\n this.previousMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.previousMediaOverlay();\r\n\r\n };\r\n\r\n /**\r\n * Plays next available fragment media overlay that is outside of the current escapable scope\r\n */\r\n this.escapeMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.escape();\r\n };\r\n\r\n /**\r\n * End media overlay TTS\r\n * @todo Clarify what this does with Daniel.\r\n */\r\n this.ttsEndedMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.onTTSEnd();\r\n };\r\n\r\n /**\r\n * Pause currently playing media overlays.\r\n */\r\n this.pauseMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.pause();\r\n };\r\n\r\n /**\r\n * Start/Resume playback of media overlays.\r\n */\r\n this.playMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.play();\r\n };\r\n\r\n /**\r\n * Determine if media overlays are currently playing.\r\n * @returns {boolean}\r\n */\r\n this.isPlayingMediaOverlay = function () {\r\n\r\n return _mediaOverlayPlayer.isPlaying();\r\n };\r\n\r\n//\r\n// should use Globals.Events.SETTINGS_APPLIED instead!\r\n// this.setRateMediaOverlay = function(rate) {\r\n//\r\n// _mediaOverlayPlayer.setRate(rate);\r\n// };\r\n// this.setVolumeMediaOverlay = function(volume){\r\n//\r\n// _mediaOverlayPlayer.setVolume(volume);\r\n// };\r\n\r\n /**\r\n * Get the first visible media overlay element from the currently active content document(s)\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getFirstVisibleMediaOverlayElement = function () {\r\n\r\n if (_currentView) {\r\n return _currentView.getFirstVisibleMediaOverlayElement();\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Used to jump to an element to make sure it is visible when a content document is paginated\r\n * @param {string} spineItemId The spine item idref associated with an active content document\r\n * @param {HTMLElement} element The element to make visible\r\n * @param [initiator]\r\n */\r\n this.insureElementVisibility = function (spineItemId, element, initiator) {\r\n\r\n if (_currentView) {\r\n _currentView.insureElementVisibility(spineItemId, element, initiator);\r\n }\r\n };\r\n\r\n var _resizeBookmark = null;\r\n var _resizeMOWasPlaying = false;\r\n\r\n function handleViewportResizeStart() {\r\n\r\n _resizeBookmark = null;\r\n _resizeMOWasPlaying = false;\r\n\r\n if (_currentView) {\r\n\r\n if (_currentView.isReflowable && _currentView.isReflowable()) {\r\n _resizeMOWasPlaying = self.isPlayingMediaOverlay();\r\n if (_resizeMOWasPlaying) {\r\n self.pauseMediaOverlay();\r\n }\r\n }\r\n\r\n _resizeBookmark = _currentView.bookmarkCurrentPage(); // not self! (JSON string)\r\n }\r\n }\r\n\r\n function handleViewportResizeTick() {\r\n if (_currentView) {\r\n self.handleViewportResize(_resizeBookmark);\r\n }\r\n }\r\n\r\n function handleViewportResizeEnd() {\r\n //same as doing one final tick for now\r\n handleViewportResizeTick();\r\n\r\n if (_resizeMOWasPlaying) self.playMediaOverlay();\r\n }\r\n\r\n this.handleViewportResize = function (bookmarkToRestore) {\r\n if (!_currentView) return;\r\n\r\n var bookMark = bookmarkToRestore || _currentView.bookmarkCurrentPage(); // not self! (JSON string)\r\n\r\n if (_currentView.isReflowable && _currentView.isReflowable() && bookMark && bookMark.idref) {\r\n var spineItem = _spine.getItemById(bookMark.idref);\r\n\r\n initViewForItem(spineItem, function (isViewChanged) {\r\n self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self);\r\n return;\r\n });\r\n }\r\n else {\r\n _currentView.onViewportResize();\r\n }\r\n };\r\n\r\n /**\r\n * Lets user to subscribe to iframe's window events\r\n *\r\n * @param {string} eventName Event name.\r\n * @param {function} callback Callback function.\r\n * @param {object} context User specified data passed to the callback function.\r\n * @returns {undefined}\r\n */\r\n this.addIFrameEventListener = function (eventName, callback, context) {\r\n _iframeLoader.addIFrameEventListener(eventName, callback, context);\r\n };\r\n\r\n this.isElementCfiVisible = function (spineIdRef, contentCfi) {\r\n if (!_currentView) {\r\n return false;\r\n }\r\n return _currentView.isElementCfiVisible(spineIdRef, contentCfi);\r\n };\r\n\r\n var BackgroundAudioTrackManager = function () {\r\n var _spineItemIframeMap = {};\r\n var _wasPlaying = false;\r\n\r\n var _callback_playPause = undefined;\r\n this.setCallback_PlayPause = function (callback) {\r\n _callback_playPause = callback;\r\n };\r\n\r\n var _callback_isAvailable = undefined;\r\n this.setCallback_IsAvailable = function (callback) {\r\n _callback_isAvailable = callback;\r\n };\r\n\r\n this.playPause = function (doPlay) {\r\n _playPause(doPlay);\r\n };\r\n\r\n var _playPause = function (doPlay) {\r\n if (_callback_playPause) {\r\n _callback_playPause(doPlay);\r\n }\r\n\r\n try {\r\n var $iframe = undefined;\r\n\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var data = _spineItemIframeMap[prop];\r\n if (!data || !data.active) continue;\r\n\r\n if ($iframe) console.error(\"More than one active iframe?? (pagination)\");\r\n\r\n $iframe = data[\"$iframe\"];\r\n if (!$iframe) continue;\r\n\r\n var $audios = $(\"audio\", $iframe[0].contentDocument);\r\n\r\n $.each($audios, function () {\r\n\r\n var attr = this.getAttribute(\"epub:type\") || this.getAttribute(\"type\");\r\n\r\n if (!attr) return true; // continue\r\n\r\n if (attr.indexOf(\"ibooks:soundtrack\") < 0 && attr.indexOf(\"media:soundtrack\") < 0 && attr.indexOf(\"media:background\") < 0) return true; // continue\r\n\r\n if (doPlay && this.play) {\r\n this.play();\r\n }\r\n else if (this.pause) {\r\n this.pause();\r\n }\r\n\r\n return true; // continue (more than one track?)\r\n });\r\n }\r\n }\r\n catch (err) {\r\n console.error(err);\r\n }\r\n };\r\n\r\n this.setPlayState = function (wasPlaying) {\r\n _wasPlaying = wasPlaying;\r\n };\r\n\r\n self.on(Globals.Events.CONTENT_DOCUMENT_LOADED, function ($iframe, spineItem) {\r\n try {\r\n if (spineItem && spineItem.idref && $iframe && $iframe[0]) {\r\n // console.log(\"CONTENT_DOCUMENT_LOADED\");\r\n // console.debug(spineItem.href);\r\n // console.debug(spineItem.idref);\r\n\r\n _spineItemIframeMap[spineItem.idref] = {\"$iframe\": $iframe, href: spineItem.href};\r\n }\r\n }\r\n catch (err) {\r\n console.error(err);\r\n }\r\n });\r\n\r\n self.on(Globals.Events.PAGINATION_CHANGED, function (pageChangeData) {\r\n // console.log(\"PAGINATION_CHANGED\");\r\n // console.debug(pageChangeData);\r\n //\r\n // if (pageChangeData.spineItem)\r\n // {\r\n // console.debug(pageChangeData.spineItem.href);\r\n // console.debug(pageChangeData.spineItem.idref);\r\n // }\r\n // else\r\n // {\r\n // //console.error(pageChangeData);\r\n // }\r\n //\r\n // if (pageChangeData.paginationInfo && pageChangeData.paginationInfo.openPages && pageChangeData.paginationInfo.openPages.length)\r\n // {\r\n // for (var i = 0; i < pageChangeData.paginationInfo.openPages.length; i++)\r\n // {\r\n // console.log(pageChangeData.paginationInfo.openPages[i].idref);\r\n // }\r\n // }\r\n\r\n var atLeastOne = false;\r\n\r\n try {\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var isActive = pageChangeData.spineItem && pageChangeData.spineItem.idref === prop;\r\n\r\n var isDisplayed = false;\r\n\r\n if (pageChangeData.paginationInfo && pageChangeData.paginationInfo.openPages.length) {\r\n var allSame = true;\r\n\r\n for (var i = 0; i < pageChangeData.paginationInfo.openPages.length; i++) {\r\n if (pageChangeData.paginationInfo.openPages[i].idref === prop) {\r\n isDisplayed = true;\r\n }\r\n else {\r\n allSame = false;\r\n }\r\n }\r\n\r\n if (!isActive && allSame) isActive = true;\r\n }\r\n\r\n if (isActive || isDisplayed) {\r\n var data = _spineItemIframeMap[prop];\r\n if (!data) continue;\r\n\r\n _spineItemIframeMap[prop][\"active\"] = isActive;\r\n\r\n var $iframe = data[\"$iframe\"];\r\n var href = data.href;\r\n\r\n var $audios = $(\"audio\", $iframe[0].contentDocument);\r\n $.each($audios, function () {\r\n\r\n var attr = this.getAttribute(\"epub:type\") || this.getAttribute(\"type\");\r\n\r\n if (!attr) return true; // continue\r\n\r\n if (attr.indexOf(\"ibooks:soundtrack\") < 0 && attr.indexOf(\"media:soundtrack\") < 0 && attr.indexOf(\"media:background\") < 0) return true; // continue\r\n\r\n this.setAttribute(\"loop\", \"loop\");\r\n this.removeAttribute(\"autoplay\");\r\n\r\n // DEBUG!\r\n //this.setAttribute(\"controls\", \"controls\");\r\n\r\n if (isActive) {\r\n // DEBUG!\r\n //$(this).css({border:\"2px solid green\"});\r\n }\r\n else {\r\n if (this.pause) this.pause();\r\n\r\n // DEBUG!\r\n //$(this).css({border:\"2px solid red\"});\r\n }\r\n\r\n atLeastOne = true;\r\n\r\n return true; // continue (more than one track?)\r\n });\r\n\r\n continue;\r\n }\r\n else {\r\n if (_spineItemIframeMap[prop]) _spineItemIframeMap[prop][\"$iframe\"] = undefined;\r\n _spineItemIframeMap[prop] = undefined;\r\n }\r\n }\r\n }\r\n catch (err) {\r\n console.error(err);\r\n }\r\n\r\n if (_callback_isAvailable) {\r\n _callback_isAvailable(atLeastOne);\r\n }\r\n\r\n if (atLeastOne) {\r\n if (_wasPlaying) {\r\n _playPause(true);\r\n }\r\n else {\r\n _playPause(false); // ensure correct paused state\r\n }\r\n }\r\n else {\r\n _playPause(false); // ensure correct paused state\r\n }\r\n });\r\n\r\n self.on(Globals.Events.MEDIA_OVERLAY_STATUS_CHANGED, function (value) {\r\n if (!value.smilIndex) return;\r\n var package = self.package();\r\n var smil = package.media_overlay.smilAt(value.smilIndex);\r\n if (!smil || !smil.spineItemId) return;\r\n\r\n var needUpdate = false;\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var data = _spineItemIframeMap[prop];\r\n if (!data) continue;\r\n\r\n if (data.active) {\r\n if (prop !== smil.spineItemId) {\r\n _playPause(false); // ensure correct paused state\r\n data.active = false;\r\n needUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (needUpdate) {\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var data = _spineItemIframeMap[prop];\r\n if (!data) continue;\r\n\r\n if (!data.active) {\r\n if (prop === smil.spineItemId) {\r\n data.active = true;\r\n }\r\n }\r\n }\r\n\r\n if (_wasPlaying) {\r\n _playPause(true);\r\n }\r\n }\r\n });\r\n };\r\n this.backgroundAudioTrackManager = new BackgroundAudioTrackManager();\r\n};\r\n\r\n/**\r\n * View Type\r\n * @typedef {object} Globals.Views.ReaderView.ViewType\r\n * @property {number} VIEW_TYPE_COLUMNIZED Reflowable document view\r\n * @property {number} VIEW_TYPE_FIXED Fixed layout document view\r\n * @property {number} VIEW_TYPE_SCROLLED_DOC Scrollable document view\r\n * @property {number} VIEW_TYPE_SCROLLED_CONTINUOUS Continuous scrollable document view\r\n */\r\nReaderView.VIEW_TYPE_COLUMNIZED = 1;\r\nReaderView.VIEW_TYPE_FIXED = 2;\r\nReaderView.VIEW_TYPE_SCROLLED_DOC = 3;\r\nReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS = 4;\r\nreturn ReaderView;\r\n});\n" + "// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/navigation_history',[\r\n //\"jquery\", \"underscore\"\r\n ],\r\n function (\r\n //$, _\r\n ) {\r\n\r\n\r\nvar NavigationHistory = function (readerview) {\r\n\r\n var _DEBUG = true;\r\n\r\n var self = this;\r\n \r\n var _readerView = readerview;\r\n \r\n var _breadcrumb = [];\r\n \r\n var _skipNext = false;\r\n \r\n this.flush = function () {\r\n if (_DEBUG) {\r\n console.error(\"NavigationHistory FLUSH.\");\r\n }\r\n \r\n _breadcrumb = [];\r\n };\r\n this.flush();\r\n\r\n this.containsLinear = function() {\r\n \r\n for (var i = 0; i < _breadcrumb.length; i++) {\r\n var bookMark = _breadcrumb[i];\r\n if (bookMark && bookMark.idref) {\r\n var spineItem = readerview.spine().getItemById(bookMark.idref);\r\n \r\n var isLinear = spineItem && readerview.spine().isValidLinearItem(spineItem.index);\r\n if (isLinear) {\r\n return true;\r\n }\r\n }\r\n }\r\n \r\n return false;\r\n };\r\n\r\n this.push = function (bookMark) {\r\n \r\n if (_skipNext) {\r\n \r\n if (_DEBUG) {\r\n console.error(\"NavigationHistory PUSH SKIP: \");\r\n console.debug(bookMark);\r\n }\r\n \r\n _skipNext = false;\r\n return;\r\n }\r\n \r\n if (_DEBUG) {\r\n console.error(\"NavigationHistory PUSH: \");\r\n console.debug(bookMark);\r\n }\r\n \r\n if (_breadcrumb.length) {\r\n var lastBookMark = _breadcrumb[_breadcrumb.length-1];\r\n \r\n var bookMark_contentCFI = bookMark.contentCFI;\r\n // TODO bookmark spatial @x:y! (should be charcter offset)\r\n // if (bookMark_contentCFI) {\r\n // var i = bookMark_contentCFI.lastIndexOf(\"@\");\r\n // if (i > 1) {\r\n // bookMark_contentCFI = bookMark_contentCFI.substr(0, i);\r\n // }\r\n // }\r\n \r\n var lastBookMark_contentCFI = lastBookMark.contentCFI;\r\n // TODO bookmark spatial @x:y! (should be charcter offset)\r\n // if (lastBookMark_contentCFI) {\r\n // i = lastBookMark_contentCFI.lastIndexOf(\"@\");\r\n // if (i > 1) {\r\n // lastBookMark_contentCFI = lastBookMark_contentCFI.substr(0, i);\r\n // }\r\n // }\r\n \r\n if (bookMark.idref == lastBookMark.idref\r\n && bookMark_contentCFI == lastBookMark_contentCFI) {\r\n \r\n if (_DEBUG) {\r\n console.log(\"--- NavigationHistory skipping duplicate bookmark: \" + bookMark.idref + \" -- \" + bookMark_contentCFI);\r\n }\r\n return;\r\n }\r\n }\r\n \r\n _breadcrumb.push(bookMark);\r\n };\r\n \r\n this.pop = function () {\r\n var bookMark = _breadcrumb.pop();\r\n \r\n if (_DEBUG) {\r\n console.error(\"NavigationHistory POP: \");\r\n console.debug(bookMark);\r\n }\r\n \r\n return bookMark;\r\n };\r\n \r\n this.canPop = function() {\r\n return _breadcrumb.length > 0;\r\n };\r\n \r\n this.skipNext = function() {\r\n if (_DEBUG) {\r\n console.error(\"NavigationHistory SKIP NEXT.\");\r\n }\r\n _skipNext = true;\r\n };\r\n};\r\nreturn NavigationHistory;\r\n\r\n});\n", + "// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/views/reader_view',[\"jquery\", \"underscore\", \"eventEmitter\", \"./fixed_view\", \"../helpers\", \"./iframe_loader\", \"./internal_links_support\",\r\n \"./media_overlay_data_injector\", \"./media_overlay_player\", \"../models/package\", \"../models/page_open_request\",\r\n \"./reflowable_view\", \"./scroll_view\", \"../models/style_collection\", \"../models/switches\", \"../models/trigger\",\r\n \"../models/viewer_settings\", \"../globals\", \"../models/navigation_history\"],\r\n function ($, _, EventEmitter, FixedView, Helpers, IFrameLoader, InternalLinksSupport,\r\n MediaOverlayDataInjector, MediaOverlayPlayer, Package, PageOpenRequest,\r\n ReflowableView, ScrollView, StyleCollection, Switches, Trigger,\r\n ViewerSettings, Globals, NavigationHistory) {\r\n/**\r\n * Options passed on the reader from the readium loader/initializer\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.ReaderOptions\r\n * @property {jQueryElement|string} el The element the reader view should create itself in. Can be a jquery wrapped element or a query selector.\r\n * @property {Globals.Views.IFrameLoader} iframeLoader An instance of an iframe loader or one expanding it.\r\n * @property {boolean} needsFixedLayoutScalerWorkAround\r\n */\r\n\r\n/**\r\n * Top level View object. Interface for view manipulation public APIs\r\n * @param {Views.ReaderView.ReaderOptions} options\r\n * @constructor\r\n */\r\nvar ReaderView = function (options) {\r\n\r\n $.extend(this, new EventEmitter());\r\n\r\n var self = this;\r\n \r\n var _navigationHistory = new NavigationHistory(self);\r\n \r\n var _currentView = undefined;\r\n var _package = undefined;\r\n var _spine = undefined;\r\n var _viewerSettings = new ViewerSettings({});\r\n //styles applied to the container divs\r\n var _userStyles = new StyleCollection();\r\n //styles applied to the content documents\r\n var _bookStyles = new StyleCollection();\r\n var _internalLinksSupport = new InternalLinksSupport(this);\r\n var _mediaOverlayPlayer;\r\n var _mediaOverlayDataInjector;\r\n var _iframeLoader;\r\n var _$el;\r\n\r\n //We will call onViewportResize after user stopped resizing window\r\n var lazyResize = Helpers.extendedThrottle(\r\n handleViewportResizeStart,\r\n handleViewportResizeTick,\r\n handleViewportResizeEnd, 250, 1000, self);\r\n\r\n $(window).on(\"resize.ReadiumSDK.readerView\", lazyResize);\r\n\r\n if (options.el instanceof $) {\r\n _$el = options.el;\r\n console.log(\"** EL is a jQuery selector:\" + options.el.attr('id'));\r\n } else {\r\n _$el = $(options.el);\r\n console.log(\"** EL is a string:\" + _$el.attr('id'));\r\n }\r\n\r\n if (options.iframeLoader) {\r\n _iframeLoader = options.iframeLoader;\r\n }\r\n else {\r\n _iframeLoader = new IFrameLoader({mathJaxUrl: options.mathJaxUrl});\r\n }\r\n\r\n\r\n _needsFixedLayoutScalerWorkAround = options.needsFixedLayoutScalerWorkAround;\r\n /**\r\n * @returns {boolean}\r\n */\r\n this.needsFixedLayoutScalerWorkAround = function () {\r\n return _needsFixedLayoutScalerWorkAround;\r\n };\r\n\r\n /**\r\n * Create a view based on the given view type.\r\n * @param {Views.ReaderView.ViewType} viewType\r\n * @param {Views.ReaderView.ViewCreationOptions} options\r\n * @returns {*}\r\n */\r\n this.createViewForType = function (viewType, options) {\r\n var createdView;\r\n\r\n // NOTE: _$el == options.$viewport\r\n _$el.css(\"overflow\", \"hidden\");\r\n\r\n switch (viewType) {\r\n case ReaderView.VIEW_TYPE_FIXED:\r\n\r\n _$el.css(\"overflow\", \"auto\"); // for content pan, see self.setZoom()\r\n\r\n createdView = new FixedView(options, self);\r\n break;\r\n case ReaderView.VIEW_TYPE_SCROLLED_DOC:\r\n createdView = new ScrollView(options, false, self);\r\n break;\r\n case ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS:\r\n createdView = new ScrollView(options, true, self);\r\n break;\r\n default:\r\n createdView = new ReflowableView(options, self);\r\n break;\r\n }\r\n\r\n return createdView;\r\n };\r\n\r\n /**\r\n * Returns the current view type of the reader view\r\n * @returns {ReaderView.ViewType}\r\n */\r\n this.getCurrentViewType = function () {\r\n\r\n if (!_currentView) {\r\n return undefined;\r\n }\r\n\r\n if (_currentView instanceof ReflowableView) {\r\n return ReaderView.VIEW_TYPE_COLUMNIZED;\r\n }\r\n\r\n if (_currentView instanceof FixedView) {\r\n return ReaderView.VIEW_TYPE_FIXED;\r\n }\r\n\r\n if (_currentView instanceof ScrollView) {\r\n if (_currentView.isContinuousScroll()) {\r\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\r\n }\r\n\r\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\r\n }\r\n\r\n console.error(\"Unrecognized view type\");\r\n return undefined;\r\n };\r\n\r\n //based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 document\r\n function deduceDesiredViewType(spineItem) {\r\n\r\n //check settings\r\n if (_viewerSettings.scroll == \"scroll-doc\") {\r\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\r\n }\r\n\r\n if (_viewerSettings.scroll == \"scroll-continuous\") {\r\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\r\n }\r\n\r\n //is fixed layout ignore flow\r\n if (spineItem.isFixedLayout()) {\r\n return ReaderView.VIEW_TYPE_FIXED;\r\n }\r\n\r\n //flow\r\n if (spineItem.isFlowScrolledDoc()) {\r\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\r\n }\r\n\r\n if (spineItem.isFlowScrolledContinuous()) {\r\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\r\n }\r\n\r\n return ReaderView.VIEW_TYPE_COLUMNIZED;\r\n }\r\n\r\n // callback is passed true parameter is view changed\r\n function initViewForItem(spineItem, callback) {\r\n\r\n var desiredViewType = deduceDesiredViewType(spineItem);\r\n\r\n if (_currentView) {\r\n\r\n if (self.getCurrentViewType() == desiredViewType) {\r\n \r\n callback(false);\r\n return;\r\n }\r\n\r\n resetCurrentView();\r\n }\r\n\r\n /**\r\n * View creation options\r\n * @typedef {object} Globals.Views.ReaderView.ViewCreationOptions\r\n * @property {jQueryElement} $viewport The view port element the reader view has created.\r\n * @property {Globals.Models.Spine} spine The spine item collection object\r\n * @property {Globals.Collections.StyleCollection} userStyles User styles\r\n * @property {Globals.Collections.StyleCollection} bookStyles Book styles\r\n * @property {Globals.Views.IFrameLoader} iframeLoader An instance of an iframe loader or one expanding it.\r\n */\r\n var viewCreationParams = {\r\n $viewport: _$el,\r\n spine: _spine,\r\n userStyles: _userStyles,\r\n bookStyles: _bookStyles,\r\n iframeLoader: _iframeLoader\r\n };\r\n\r\n\r\n _currentView = self.createViewForType(desiredViewType, viewCreationParams);\r\n self.emit(Globals.Events.READER_VIEW_CREATED, desiredViewType);\r\n\r\n _currentView.on(Globals.Events.CONTENT_DOCUMENT_LOADED, function ($iframe, spineItem) {\r\n\r\n if (!Helpers.isIframeAlive($iframe[0])) return;\r\n\r\n // performance degrades with large DOM (e.g. word-level text-audio sync)\r\n _mediaOverlayDataInjector.attachMediaOverlayData($iframe, spineItem, _viewerSettings);\r\n\r\n _internalLinksSupport.processLinkElements($iframe, spineItem);\r\n\r\n var contentDoc = $iframe[0].contentDocument;\r\n Trigger.register(contentDoc);\r\n Switches.apply(contentDoc);\r\n\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOADED, $iframe, spineItem);\r\n });\r\n\r\n _currentView.on(Globals.Events.CONTENT_DOCUMENT_LOAD_START, function ($iframe, spineItem) {\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOAD_START, $iframe, spineItem);\r\n });\r\n\r\n _currentView.on(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, function (pageChangeData) {\r\n //we call on onPageChanged explicitly instead of subscribing to the Globals.Events.PAGINATION_CHANGED by\r\n //mediaOverlayPlayer because we hve to guarantee that mediaOverlayPlayer will be updated before the host\r\n //application will be notified by the same Globals.Events.PAGINATION_CHANGED event\r\n _mediaOverlayPlayer.onPageChanged(pageChangeData);\r\n\r\n _.defer(function () {\r\n self.emit(Globals.Events.PAGINATION_CHANGED, pageChangeData);\r\n });\r\n });\r\n\r\n _currentView.on(Globals.Events.FXL_VIEW_RESIZED, function () {\r\n self.emit(Globals.Events.FXL_VIEW_RESIZED);\r\n })\r\n\r\n _currentView.render();\r\n _currentView.setViewSettings(_viewerSettings);\r\n\r\n // we do this to wait until elements are rendered otherwise book is not able to determine view size.\r\n setTimeout(function () {\r\n\r\n callback(true);\r\n }, 50);\r\n\r\n }\r\n\r\n /**\r\n * Returns a list of the currently active spine items\r\n *\r\n * @returns {Models.SpineItem[]}\r\n */\r\n this.getLoadedSpineItems = function () {\r\n\r\n if (_currentView) {\r\n return _currentView.getLoadedSpineItems();\r\n }\r\n\r\n return [];\r\n };\r\n\r\n function resetCurrentView() {\r\n\r\n if (!_currentView) {\r\n return;\r\n }\r\n\r\n self.emit(Globals.Events.READER_VIEW_DESTROYED);\r\n\r\n _currentView.off(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED);\r\n _currentView.remove();\r\n _currentView = undefined;\r\n }\r\n\r\n /**\r\n * Returns the currently instanced viewer settings\r\n *\r\n * @returns {Models.ViewerSettings}\r\n */\r\n this.viewerSettings = function () {\r\n return _viewerSettings;\r\n };\r\n\r\n /**\r\n * Returns a data object based on the package document\r\n *\r\n * @returns {Models.Package}\r\n */\r\n this.package = function () {\r\n return _package;\r\n };\r\n\r\n /**\r\n * Returns a representation of the spine as a data object, also acts as list of spine items\r\n *\r\n * @returns {Models.Spine}\r\n */\r\n this.spine = function () {\r\n return _spine;\r\n };\r\n\r\n /**\r\n * Returns the user CSS styles collection\r\n *\r\n * @returns {Collections.StyleCollection}\r\n */\r\n this.userStyles = function () {\r\n return _userStyles;\r\n };\r\n\r\n /**\r\n * Open Book Data\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.OpenBookData\r\n * @property {Globals.Models.Package} package - packageData (required)\r\n * @property {Globals.Models.PageOpenRequest} openPageRequest - openPageRequestData, (optional) data related to open page request\r\n * @property {Globals.Views.ReaderView.SettingsData} [settings]\r\n * @property {Globals.Collections.StyleCollection} styles: [cssStyles]\r\n * @todo Define missing types\r\n */\r\n\r\n /**\r\n * Triggers the process of opening the book and requesting resources specified in the packageData\r\n *\r\n * @param {Views.ReaderView.OpenBookData} openBookData - object with open book data\r\n */\r\n this.openBook = function (openBookData) {\r\n\r\n _navigationHistory.flush();\r\n\r\n var packageData = openBookData.package ? openBookData.package : openBookData;\r\n\r\n _package = new Package(packageData);\r\n\r\n _spine = _package.spine;\r\n //_spine.handleLinear(false);\r\n\r\n if (_mediaOverlayPlayer) {\r\n _mediaOverlayPlayer.reset();\r\n }\r\n\r\n _mediaOverlayPlayer = new MediaOverlayPlayer(self, $.proxy(onMediaPlayerStatusChanged, self));\r\n _mediaOverlayPlayer.setAutomaticNextSmil(_viewerSettings.mediaOverlaysAutomaticPageTurn ? true : false); // just to ensure the internal var is set to the default settings (user settings are applied below at self.updateSettings(openBookData.settings);)\r\n\r\n _mediaOverlayDataInjector = new MediaOverlayDataInjector(_package.media_overlay, _mediaOverlayPlayer);\r\n\r\n\r\n resetCurrentView();\r\n\r\n if (openBookData.settings) {\r\n self.updateSettings(openBookData.settings);\r\n }\r\n\r\n if (openBookData.styles) {\r\n self.setStyles(openBookData.styles);\r\n }\r\n\r\n var pageRequestData = undefined;\r\n\r\n if (openBookData.openPageRequest) {\r\n\r\n if (openBookData.openPageRequest.idref || (openBookData.openPageRequest.contentRefUrl && openBookData.openPageRequest.sourceFileHref)) {\r\n pageRequestData = openBookData.openPageRequest;\r\n }\r\n else {\r\n console.log(\"Invalid page request data: idref required!\");\r\n }\r\n }\r\n\r\n var fallback = false;\r\n if (pageRequestData) {\r\n\r\n pageRequestData = openBookData.openPageRequest;\r\n\r\n try {\r\n if (pageRequestData.idref) {\r\n\r\n if (pageRequestData.spineItemPageIndex) {\r\n fallback = !self.openSpineItemPage(pageRequestData.idref, pageRequestData.spineItemPageIndex, self);\r\n }\r\n else if (pageRequestData.elementCfi) {\r\n fallback = !self.openSpineItemElementCfi(pageRequestData.idref, pageRequestData.elementCfi, self);\r\n }\r\n else {\r\n fallback = !self.openSpineItemPage(pageRequestData.idref, 0, self);\r\n }\r\n }\r\n else {\r\n fallback = !self.openContentUrl(pageRequestData.contentRefUrl, pageRequestData.sourceFileHref, self);\r\n }\r\n } catch (err) {\r\n console.error(\"openPageRequest fail: fallback to first page!\")\r\n console.log(err);\r\n fallback = true;\r\n }\r\n }\r\n else {\r\n fallback = true;\r\n }\r\n\r\n if (fallback) {// if we where not asked to open specific page we will open the first one\r\n\r\n var spineItem = _spine.first();\r\n if (spineItem) {\r\n var pageOpenRequest = new PageOpenRequest(spineItem, self);\r\n pageOpenRequest.setFirstPage();\r\n openPage(pageOpenRequest, 0);\r\n }\r\n }\r\n };\r\n\r\n function onMediaPlayerStatusChanged(status) {\r\n self.emit(Globals.Events.MEDIA_OVERLAY_STATUS_CHANGED, status);\r\n }\r\n\r\n /**\r\n * Flips the page from left to right.\r\n * Takes to account the page progression direction to decide to flip to prev or next page.\r\n */\r\n this.openPageLeft = function () {\r\n\r\n if (_package.spine.isLeftToRight()) {\r\n self.openPagePrev();\r\n }\r\n else {\r\n self.openPageNext();\r\n }\r\n };\r\n\r\n /**\r\n * Flips the page from right to left.\r\n * Takes to account the page progression direction to decide to flip to prev or next page.\r\n */\r\n this.openPageRight = function () {\r\n\r\n if (_package.spine.isLeftToRight()) {\r\n self.openPageNext();\r\n }\r\n else {\r\n self.openPagePrev();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Returns if the current child view is an instance of a fixed page view\r\n *\r\n * @returns {boolean}\r\n */\r\n this.isCurrentViewFixedLayout = function () {\r\n return _currentView instanceof FixedView;\r\n };\r\n\r\n /**\r\n * Zoom options\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.ZoomOptions\r\n * @property {string} style - \"user\"|\"fit-screen\"|\"fit-width\"\r\n * @property {number} scale - 0.0 to 1.0\r\n */\r\n\r\n /**\r\n * Set the zoom options.\r\n *\r\n * @param {Views.ReaderView.ZoomOptions} zoom Zoom options\r\n */\r\n this.setZoom = function (zoom) {\r\n // zoom only handled by fixed layout views\r\n if (self.isCurrentViewFixedLayout()) {\r\n _currentView.setZoom(zoom);\r\n }\r\n };\r\n\r\n /**\r\n * Returns the current view scale as a percentage\r\n *\r\n * @returns {number}\r\n */\r\n this.getViewScale = function () {\r\n if (self.isCurrentViewFixedLayout()) {\r\n return 100 * _currentView.getViewScale();\r\n }\r\n else {\r\n return 100;\r\n }\r\n };\r\n\r\n /**\r\n * Settings Data\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.SettingsData\r\n * @property {number} fontSize - Font size as percentage\r\n * @property {(string|boolean)} syntheticSpread - \"auto\"|true|false\r\n * @property {(string|boolean)} scroll - \"auto\"|true|false\r\n * @property {boolean} doNotUpdateView - Indicates whether the view should be updated after the settings are applied\r\n * @property {boolean} mediaOverlaysEnableClick - Indicates whether media overlays are interactive on mouse clicks\r\n */\r\n\r\n /**\r\n * Updates reader view based on the settings specified in settingsData object\r\n *\r\n * @param {Globals.Views.ReaderView.SettingsData} settingsData Settings data\r\n * @fires Globals.Events.SETTINGS_APPLIED\r\n */\r\n this.updateSettings = function (settingsData) {\r\n\r\n//console.debug(\"UpdateSettings: \" + JSON.stringify(settingsData));\r\n\r\n _viewerSettings.update(settingsData);\r\n\r\n if (_mediaOverlayPlayer) {\r\n _mediaOverlayPlayer.setAutomaticNextSmil(_viewerSettings.mediaOverlaysAutomaticPageTurn ? true : false);\r\n }\r\n\r\n if (_currentView && !settingsData.doNotUpdateView) {\r\n\r\n var bookMark = _currentView.bookmarkCurrentPage();\r\n\r\n if (bookMark && bookMark.idref) {\r\n\r\n var wasPlaying = false;\r\n if (_currentView.isReflowable && _currentView.isReflowable()) {\r\n wasPlaying = self.isPlayingMediaOverlay();\r\n if (wasPlaying) {\r\n self.pauseMediaOverlay();\r\n }\r\n }\r\n\r\n var spineItem = _spine.getItemById(bookMark.idref);\r\n\r\n _navigationHistory.skipNext();\r\n\r\n initViewForItem(spineItem, function (isViewChanged) {\r\n\r\n if (!isViewChanged) {\r\n _currentView.setViewSettings(_viewerSettings);\r\n }\r\n\r\n self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self);\r\n\r\n if (wasPlaying) {\r\n self.playMediaOverlay();\r\n // setTimeout(function()\r\n // {\r\n // }, 60);\r\n }\r\n\r\n self.emit(Globals.Events.SETTINGS_APPLIED);\r\n });\r\n \r\n return;\r\n }\r\n }\r\n\r\n self.emit(Globals.Events.SETTINGS_APPLIED);\r\n };\r\n\r\n /**\r\n * Opens the next page.\r\n */\r\n this.openPageNext = function () {\r\n\r\n if (self.getCurrentViewType() === ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS) {\r\n _currentView.openPageNext(self);\r\n return;\r\n }\r\n\r\n var paginationInfo = _currentView.getPaginationInfo();\r\n\r\n if (paginationInfo.openPages.length == 0) {\r\n return;\r\n }\r\n\r\n var lastOpenPage = paginationInfo.openPages[paginationInfo.openPages.length - 1];\r\n\r\n if (lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1) {\r\n _currentView.openPageNext(self);\r\n return;\r\n }\r\n\r\n var currentSpineItem = _spine.getItemById(lastOpenPage.idref);\r\n\r\n var nextSpineItem = _spine.nextItem(currentSpineItem);\r\n\r\n if (!nextSpineItem) {\r\n return;\r\n }\r\n\r\n var openPageRequest = new PageOpenRequest(nextSpineItem, self);\r\n openPageRequest.setFirstPage();\r\n\r\n _navigationHistory.skipNext();\r\n \r\n openPage(openPageRequest, 2);\r\n };\r\n\r\n /**\r\n * Opens the previous page.\r\n */\r\n this.openPagePrev = function () {\r\n\r\n if (self.getCurrentViewType() === ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS) {\r\n _currentView.openPagePrev(self);\r\n return;\r\n }\r\n\r\n var paginationInfo = _currentView.getPaginationInfo();\r\n\r\n if (paginationInfo.openPages.length == 0) {\r\n return;\r\n }\r\n\r\n var firstOpenPage = paginationInfo.openPages[0];\r\n\r\n if (firstOpenPage.spineItemPageIndex > 0) {\r\n _currentView.openPagePrev(self);\r\n return;\r\n }\r\n\r\n var currentSpineItem = _spine.getItemById(firstOpenPage.idref);\r\n\r\n var prevSpineItem = _spine.prevItem(currentSpineItem);\r\n\r\n if (!prevSpineItem) {\r\n return;\r\n }\r\n\r\n var openPageRequest = new PageOpenRequest(prevSpineItem, self);\r\n openPageRequest.setLastPage();\r\n\r\n _navigationHistory.skipNext();\r\n \r\n openPage(openPageRequest, 1);\r\n };\r\n\r\n function getSpineItem(idref) {\r\n\r\n if (!idref) {\r\n\r\n console.log(\"idref parameter value missing!\");\r\n return undefined;\r\n }\r\n\r\n var spineItem = _spine.getItemById(idref);\r\n if (!spineItem) {\r\n console.log(\"Spine item with id \" + idref + \" not found!\");\r\n return undefined;\r\n }\r\n\r\n return spineItem;\r\n\r\n }\r\n\r\n /**\r\n * Opens the page of the spine item with element with provided cfi\r\n *\r\n * @param {string} idref Id of the spine item\r\n * @param {string} elementCfi CFI of the element to be shown\r\n * @param {object} initiator optional\r\n */\r\n this.openSpineItemElementCfi = function (idref, elementCfi, initiator) {\r\n\r\n var spineItem = getSpineItem(idref);\r\n\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n var pageData = new PageOpenRequest(spineItem, initiator);\r\n if (elementCfi) {\r\n pageData.setElementCfi(elementCfi);\r\n }\r\n\r\n openPage(pageData, 0);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Opens specified page index of the current spine item\r\n *\r\n * @param {number} pageIndex Zero based index of the page in the current spine item\r\n * @param {object} initiator optional\r\n */\r\n this.openPageIndex = function (pageIndex, initiator) {\r\n\r\n if (!_currentView) {\r\n return false;\r\n }\r\n\r\n var pageRequest;\r\n\r\n if (_package.isFixedLayout()) {\r\n var spineItem = _spine.items[pageIndex];\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n pageRequest = new PageOpenRequest(spineItem, initiator);\r\n pageRequest.setPageIndex(0);\r\n }\r\n else {\r\n\r\n var spineItems = this.getLoadedSpineItems();\r\n if (spineItems.length > 0) {\r\n pageRequest = new PageOpenRequest(spineItems[0], initiator);\r\n pageRequest.setPageIndex(pageIndex);\r\n }\r\n }\r\n\r\n openPage(pageRequest, 0);\r\n\r\n return true;\r\n };\r\n\r\n // this.navigationHistoryForward = function() {\r\n // // Not implemented \r\n // };\r\n this.navigationHistoryBack = function(forceLinear) {\r\n \r\n console.log(\"back nav request ...\");\r\n \r\n while (true) {\r\n var bookMark = _navigationHistory.pop();\r\n if (bookMark && bookMark.idref) {\r\n var spineItem = _spine.getItemById(bookMark.idref);\r\n \r\n if (forceLinear) {\r\n var isLinear = _spine.isValidLinearItem(spineItem.index);\r\n if (!isLinear) {\r\n console.log(\"back nav, skipping non-linear \" + bookMark.idref);\r\n continue;\r\n }\r\n }\r\n \r\n console.log(\"back nav: \");\r\n console.debug(bookMark);\r\n \r\n _navigationHistory.skipNext();\r\n \r\n initViewForItem(spineItem, function (isViewChanged) {\r\n \r\n if (!isViewChanged) {\r\n _currentView.setViewSettings(_viewerSettings);\r\n }\r\n\r\n self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self);\r\n });\r\n \r\n return;\r\n }\r\n \r\n console.error(\"no valid back history?\");\r\n return;\r\n }\r\n };\r\n\r\n this.navigationHistoryCanBack = function(forceLinear) {\r\n \r\n if (!_navigationHistory.canPop()) return false;\r\n \r\n if (!forceLinear) {\r\n return true;\r\n }\r\n \r\n return _navigationHistory.containsLinear();\r\n };\r\n \r\n // dir: 0 => new or same page, 1 => previous, 2 => next\r\n function openPage(pageRequest, dir) {\r\n\r\n if (_currentView) _navigationHistory.push(_currentView.bookmarkCurrentPage());\r\n\r\n initViewForItem(pageRequest.spineItem, function (isViewChanged) {\r\n\r\n if (!isViewChanged) {\r\n _currentView.setViewSettings(_viewerSettings);\r\n }\r\n\r\n _currentView.openPage(pageRequest, dir);\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Opens page index of the spine item with idref provided\r\n *\r\n * @param {string} idref Id of the spine item\r\n * @param {number} pageIndex Zero based index of the page in the spine item\r\n * @param {object} initiator optional\r\n */\r\n this.openSpineItemPage = function (idref, pageIndex, initiator) {\r\n\r\n var spineItem = getSpineItem(idref);\r\n\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n var pageData = new PageOpenRequest(spineItem, initiator);\r\n if (pageIndex) {\r\n pageData.setPageIndex(pageIndex);\r\n }\r\n\r\n openPage(pageData, 0);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Set CSS Styles to the reader container\r\n *\r\n * @param {Collections.StyleCollection} styles Style collection containing selector property and declarations object\r\n * @param {boolean} doNotUpdateView Whether to update the view after the styles are applied.\r\n */\r\n this.setStyles = function (styles, doNotUpdateView) {\r\n\r\n var count = styles.length;\r\n\r\n for (var i = 0; i < count; i++) {\r\n if (styles[i].declarations) {\r\n _userStyles.addStyle(styles[i].selector, styles[i].declarations);\r\n }\r\n else {\r\n _userStyles.removeStyle(styles[i].selector);\r\n }\r\n }\r\n\r\n applyStyles(doNotUpdateView);\r\n\r\n };\r\n\r\n /**\r\n * Set CSS Styles to the content documents\r\n *\r\n * @param {Collections.StyleCollection} styles Style collection containing selector property and declarations object\r\n */\r\n this.setBookStyles = function (styles) {\r\n\r\n var count = styles.length;\r\n\r\n for (var i = 0; i < count; i++) {\r\n _bookStyles.addStyle(styles[i].selector, styles[i].declarations);\r\n }\r\n\r\n if (_currentView) {\r\n _currentView.applyBookStyles();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Gets an element from active content documents based on a query selector.\r\n *\r\n * @param {Models.SpineItem} spineItem The spine item object associated with an active content document\r\n * @param {string} selector The query selector\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getElement = function (spineItem, selector) {\r\n\r\n if (_currentView) {\r\n return _currentView.getElement(spineItem, selector);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Gets an element from active content documents based on an element id.\r\n *\r\n * @param {Models.SpineItem} spineItem The spine item object associated with an active content document\r\n * @param {string} id The element id\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getElementById = function (spineItem, id) {\r\n\r\n if (_currentView) {\r\n return _currentView.getElementById(spineItem, id);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Gets an element from active content documents based on a content CFI.\r\n *\r\n * @param {Models.SpineItem} spineItem The spine item idref associated with an active content document\r\n * @param {string} cfi The partial content CFI\r\n * @param {string[]} [classBlacklist]\r\n * @param {string[]} [elementBlacklist]\r\n * @param {string[]} [idBlacklist]\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getElementByCfi = function (spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n if (_currentView) {\r\n return _currentView.getElementByCfi(spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n }\r\n\r\n return undefined;\r\n\r\n };\r\n\r\n function applyStyles(doNotUpdateView) {\r\n\r\n Helpers.setStyles(_userStyles.getStyles(), _$el);\r\n\r\n if (_mediaOverlayPlayer)\r\n _mediaOverlayPlayer.applyStyles();\r\n\r\n if (doNotUpdateView) return;\r\n\r\n if (_currentView) {\r\n _currentView.applyStyles();\r\n }\r\n }\r\n\r\n /**\r\n * Opens a content url from a media player context\r\n *\r\n * @param {string} contentRefUrl\r\n * @param {string} sourceFileHref\r\n * @param offset\r\n */\r\n this.mediaOverlaysOpenContentUrl = function (contentRefUrl, sourceFileHref, offset) {\r\n _mediaOverlayPlayer.mediaOverlaysOpenContentUrl(contentRefUrl, sourceFileHref, offset);\r\n };\r\n\r\n\r\n /**\r\n * Opens the content document specified by the url\r\n *\r\n * @param {string} contentRefUrl Url of the content document\r\n * @param {string | undefined} sourceFileHref Url to the file that contentRefUrl is relative to. If contentRefUrl is\r\n * relative ot the source file that contains it instead of the package file (ex. TOC file) We have to know the\r\n * sourceFileHref to resolve contentUrl relative to the package file.\r\n * @param {object} initiator optional\r\n */\r\n this.openContentUrl = function (contentRefUrl, sourceFileHref, initiator) {\r\n\r\n var combinedPath = Helpers.ResolveContentRef(contentRefUrl, sourceFileHref);\r\n\r\n var hashIndex = combinedPath.indexOf(\"#\");\r\n var hrefPart;\r\n var elementId;\r\n if (hashIndex >= 0) {\r\n hrefPart = combinedPath.substr(0, hashIndex);\r\n elementId = combinedPath.substr(hashIndex + 1);\r\n }\r\n else {\r\n hrefPart = combinedPath;\r\n elementId = undefined;\r\n }\r\n\r\n var spineItem = _spine.getItemByHref(hrefPart);\r\n if (!spineItem) {\r\n console.warn('spineItem ' + hrefPart + ' not found');\r\n // sometimes that happens because spine item's URI gets encoded,\r\n // yet it's compared with raw strings by `getItemByHref()` -\r\n // so we try to search with decoded link as well\r\n var decodedHrefPart = decodeURIComponent(hrefPart);\r\n spineItem = _spine.getItemByHref(decodedHrefPart);\r\n if (!spineItem) {\r\n console.warn('decoded spineItem ' + decodedHrefPart + ' missing as well');\r\n return false;\r\n }\r\n }\r\n \r\n if (initiator && initiator instanceof MediaOverlayPlayer)\r\n {\r\n _navigationHistory.skipNext();\r\n }\r\n\r\n return self.openSpineItemElementId(spineItem.idref, elementId, initiator);\r\n };\r\n\r\n /**\r\n * Opens the page of the spine item with element with provided cfi\r\n *\r\n * @param {string} idref Id of the spine item\r\n * @param {string} elementId id of the element to be shown\r\n * @param {object} initiator optional\r\n */\r\n this.openSpineItemElementId = function (idref, elementId, initiator) {\r\n\r\n var spineItem = _spine.getItemById(idref);\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n var pageData = new PageOpenRequest(spineItem, initiator);\r\n\r\n if (elementId) {\r\n pageData.setElementId(elementId);\r\n }\r\n\r\n\r\n openPage(pageData, 0);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Returns the bookmark associated with currently opened page.\r\n *\r\n * @returns {string} Serialized Globals.Models.BookmarkData object as JSON string.\r\n */\r\n this.bookmarkCurrentPage = function () {\r\n return JSON.stringify(_currentView.bookmarkCurrentPage());\r\n };\r\n\r\n /**\r\n * Resets all the custom styles set by setStyle callers at runtime\r\n */\r\n this.clearStyles = function () {\r\n\r\n _userStyles.resetStyleValues();\r\n applyStyles();\r\n _userStyles.clear();\r\n };\r\n\r\n /**\r\n * Resets all the custom styles set by setBookStyle callers at runtime\r\n */\r\n this.clearBookStyles = function () {\r\n\r\n if (_currentView) {\r\n\r\n _bookStyles.resetStyleValues();\r\n _currentView.applyBookStyles();\r\n }\r\n\r\n _bookStyles.clear();\r\n };\r\n\r\n /**\r\n * Returns true if media overlay available for one of the open pages.\r\n *\r\n * @returns {boolean}\r\n */\r\n this.isMediaOverlayAvailable = function () {\r\n\r\n if (!_mediaOverlayPlayer) return false;\r\n\r\n return _mediaOverlayPlayer.isMediaOverlayAvailable();\r\n };\r\n\r\n /*\r\n this.setMediaOverlaySkippables = function(items) {\r\n\r\n _mediaOverlayPlayer.setMediaOverlaySkippables(items);\r\n };\r\n\r\n this.setMediaOverlayEscapables = function(items) {\r\n\r\n _mediaOverlayPlayer.setMediaOverlayEscapables(items);\r\n };\r\n */\r\n\r\n /**\r\n * Starts/Stop playing media overlay on current page\r\n */\r\n this.toggleMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.toggleMediaOverlay();\r\n };\r\n\r\n\r\n /**\r\n * Plays next fragment media overlay\r\n */\r\n this.nextMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.nextMediaOverlay();\r\n\r\n };\r\n\r\n /**\r\n * Plays previous fragment media overlay\r\n */\r\n this.previousMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.previousMediaOverlay();\r\n\r\n };\r\n\r\n /**\r\n * Plays next available fragment media overlay that is outside of the current escapable scope\r\n */\r\n this.escapeMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.escape();\r\n };\r\n\r\n /**\r\n * End media overlay TTS\r\n * @todo Clarify what this does with Daniel.\r\n */\r\n this.ttsEndedMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.onTTSEnd();\r\n };\r\n\r\n /**\r\n * Pause currently playing media overlays.\r\n */\r\n this.pauseMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.pause();\r\n };\r\n\r\n /**\r\n * Start/Resume playback of media overlays.\r\n */\r\n this.playMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.play();\r\n };\r\n\r\n /**\r\n * Determine if media overlays are currently playing.\r\n * @returns {boolean}\r\n */\r\n this.isPlayingMediaOverlay = function () {\r\n\r\n return _mediaOverlayPlayer.isPlaying();\r\n };\r\n\r\n//\r\n// should use Globals.Events.SETTINGS_APPLIED instead!\r\n// this.setRateMediaOverlay = function(rate) {\r\n//\r\n// _mediaOverlayPlayer.setRate(rate);\r\n// };\r\n// this.setVolumeMediaOverlay = function(volume){\r\n//\r\n// _mediaOverlayPlayer.setVolume(volume);\r\n// };\r\n\r\n /**\r\n * Get the first visible media overlay element from the currently active content document(s)\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getFirstVisibleMediaOverlayElement = function () {\r\n\r\n if (_currentView) {\r\n return _currentView.getFirstVisibleMediaOverlayElement();\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Used to jump to an element to make sure it is visible when a content document is paginated\r\n * @param {string} spineItemId The spine item idref associated with an active content document\r\n * @param {HTMLElement} element The element to make visible\r\n * @param [initiator]\r\n */\r\n this.insureElementVisibility = function (spineItemId, element, initiator) {\r\n\r\n if (_currentView) {\r\n _currentView.insureElementVisibility(spineItemId, element, initiator);\r\n }\r\n };\r\n\r\n var _resizeBookmark = null;\r\n var _resizeMOWasPlaying = false;\r\n\r\n function handleViewportResizeStart() {\r\n\r\n _resizeBookmark = null;\r\n _resizeMOWasPlaying = false;\r\n\r\n if (_currentView) {\r\n\r\n if (_currentView.isReflowable && _currentView.isReflowable()) {\r\n _resizeMOWasPlaying = self.isPlayingMediaOverlay();\r\n if (_resizeMOWasPlaying) {\r\n self.pauseMediaOverlay();\r\n }\r\n }\r\n\r\n _resizeBookmark = _currentView.bookmarkCurrentPage(); // not self! (JSON string)\r\n }\r\n }\r\n\r\n function handleViewportResizeTick() {\r\n if (_currentView) {\r\n self.handleViewportResize(_resizeBookmark);\r\n }\r\n }\r\n\r\n function handleViewportResizeEnd() {\r\n //same as doing one final tick for now\r\n handleViewportResizeTick();\r\n\r\n if (_resizeMOWasPlaying) self.playMediaOverlay();\r\n }\r\n\r\n this.handleViewportResize = function (bookmarkToRestore) {\r\n if (!_currentView) return;\r\n\r\n var bookMark = bookmarkToRestore || _currentView.bookmarkCurrentPage(); // not self! (JSON string)\r\n\r\n if (_currentView.isReflowable && _currentView.isReflowable() && bookMark && bookMark.idref) {\r\n var spineItem = _spine.getItemById(bookMark.idref);\r\n\r\n _navigationHistory.skipNext();\r\n \r\n initViewForItem(spineItem, function (isViewChanged) {\r\n \r\n // if (!isViewChanged) {\r\n // _currentView.setViewSettings(_viewerSettings);\r\n // }\r\n\r\n self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self);\r\n });\r\n }\r\n else {\r\n _currentView.onViewportResize();\r\n }\r\n };\r\n\r\n /**\r\n * Lets user to subscribe to iframe's window events\r\n *\r\n * @param {string} eventName Event name.\r\n * @param {function} callback Callback function.\r\n * @param {object} context User specified data passed to the callback function.\r\n * @returns {undefined}\r\n */\r\n this.addIFrameEventListener = function (eventName, callback, context) {\r\n _iframeLoader.addIFrameEventListener(eventName, callback, context);\r\n };\r\n\r\n this.isElementCfiVisible = function (spineIdRef, contentCfi) {\r\n if (!_currentView) {\r\n return false;\r\n }\r\n return _currentView.isElementCfiVisible(spineIdRef, contentCfi);\r\n };\r\n\r\n var BackgroundAudioTrackManager = function () {\r\n var _spineItemIframeMap = {};\r\n var _wasPlaying = false;\r\n\r\n var _callback_playPause = undefined;\r\n this.setCallback_PlayPause = function (callback) {\r\n _callback_playPause = callback;\r\n };\r\n\r\n var _callback_isAvailable = undefined;\r\n this.setCallback_IsAvailable = function (callback) {\r\n _callback_isAvailable = callback;\r\n };\r\n\r\n this.playPause = function (doPlay) {\r\n _playPause(doPlay);\r\n };\r\n\r\n var _playPause = function (doPlay) {\r\n if (_callback_playPause) {\r\n _callback_playPause(doPlay);\r\n }\r\n\r\n try {\r\n var $iframe = undefined;\r\n\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var data = _spineItemIframeMap[prop];\r\n if (!data || !data.active) continue;\r\n\r\n if ($iframe) console.error(\"More than one active iframe?? (pagination)\");\r\n\r\n $iframe = data[\"$iframe\"];\r\n if (!$iframe) continue;\r\n\r\n var $audios = $(\"audio\", $iframe[0].contentDocument);\r\n\r\n $.each($audios, function () {\r\n\r\n var attr = this.getAttribute(\"epub:type\") || this.getAttribute(\"type\");\r\n\r\n if (!attr) return true; // continue\r\n\r\n if (attr.indexOf(\"ibooks:soundtrack\") < 0 && attr.indexOf(\"media:soundtrack\") < 0 && attr.indexOf(\"media:background\") < 0) return true; // continue\r\n\r\n if (doPlay && this.play) {\r\n this.play();\r\n }\r\n else if (this.pause) {\r\n this.pause();\r\n }\r\n\r\n return true; // continue (more than one track?)\r\n });\r\n }\r\n }\r\n catch (err) {\r\n console.error(err);\r\n }\r\n };\r\n\r\n this.setPlayState = function (wasPlaying) {\r\n _wasPlaying = wasPlaying;\r\n };\r\n\r\n self.on(Globals.Events.CONTENT_DOCUMENT_LOADED, function ($iframe, spineItem) {\r\n try {\r\n if (spineItem && spineItem.idref && $iframe && $iframe[0]) {\r\n // console.log(\"CONTENT_DOCUMENT_LOADED\");\r\n // console.debug(spineItem.href);\r\n // console.debug(spineItem.idref);\r\n\r\n _spineItemIframeMap[spineItem.idref] = {\"$iframe\": $iframe, href: spineItem.href};\r\n }\r\n }\r\n catch (err) {\r\n console.error(err);\r\n }\r\n });\r\n\r\n self.on(Globals.Events.PAGINATION_CHANGED, function (pageChangeData) {\r\n // console.log(\"PAGINATION_CHANGED\");\r\n // console.debug(pageChangeData);\r\n //\r\n // if (pageChangeData.spineItem)\r\n // {\r\n // console.debug(pageChangeData.spineItem.href);\r\n // console.debug(pageChangeData.spineItem.idref);\r\n // }\r\n // else\r\n // {\r\n // //console.error(pageChangeData);\r\n // }\r\n //\r\n // if (pageChangeData.paginationInfo && pageChangeData.paginationInfo.openPages && pageChangeData.paginationInfo.openPages.length)\r\n // {\r\n // for (var i = 0; i < pageChangeData.paginationInfo.openPages.length; i++)\r\n // {\r\n // console.log(pageChangeData.paginationInfo.openPages[i].idref);\r\n // }\r\n // }\r\n\r\n var atLeastOne = false;\r\n\r\n try {\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var isActive = pageChangeData.spineItem && pageChangeData.spineItem.idref === prop;\r\n\r\n var isDisplayed = false;\r\n\r\n if (pageChangeData.paginationInfo && pageChangeData.paginationInfo.openPages.length) {\r\n var allSame = true;\r\n\r\n for (var i = 0; i < pageChangeData.paginationInfo.openPages.length; i++) {\r\n if (pageChangeData.paginationInfo.openPages[i].idref === prop) {\r\n isDisplayed = true;\r\n }\r\n else {\r\n allSame = false;\r\n }\r\n }\r\n\r\n if (!isActive && allSame) isActive = true;\r\n }\r\n\r\n if (isActive || isDisplayed) {\r\n var data = _spineItemIframeMap[prop];\r\n if (!data) continue;\r\n\r\n _spineItemIframeMap[prop][\"active\"] = isActive;\r\n\r\n var $iframe = data[\"$iframe\"];\r\n var href = data.href;\r\n\r\n var $audios = $(\"audio\", $iframe[0].contentDocument);\r\n $.each($audios, function () {\r\n\r\n var attr = this.getAttribute(\"epub:type\") || this.getAttribute(\"type\");\r\n\r\n if (!attr) return true; // continue\r\n\r\n if (attr.indexOf(\"ibooks:soundtrack\") < 0 && attr.indexOf(\"media:soundtrack\") < 0 && attr.indexOf(\"media:background\") < 0) return true; // continue\r\n\r\n this.setAttribute(\"loop\", \"loop\");\r\n this.removeAttribute(\"autoplay\");\r\n\r\n // DEBUG!\r\n //this.setAttribute(\"controls\", \"controls\");\r\n\r\n if (isActive) {\r\n // DEBUG!\r\n //$(this).css({border:\"2px solid green\"});\r\n }\r\n else {\r\n if (this.pause) this.pause();\r\n\r\n // DEBUG!\r\n //$(this).css({border:\"2px solid red\"});\r\n }\r\n\r\n atLeastOne = true;\r\n\r\n return true; // continue (more than one track?)\r\n });\r\n\r\n continue;\r\n }\r\n else {\r\n if (_spineItemIframeMap[prop]) _spineItemIframeMap[prop][\"$iframe\"] = undefined;\r\n _spineItemIframeMap[prop] = undefined;\r\n }\r\n }\r\n }\r\n catch (err) {\r\n console.error(err);\r\n }\r\n\r\n if (_callback_isAvailable) {\r\n _callback_isAvailable(atLeastOne);\r\n }\r\n\r\n if (atLeastOne) {\r\n if (_wasPlaying) {\r\n _playPause(true);\r\n }\r\n else {\r\n _playPause(false); // ensure correct paused state\r\n }\r\n }\r\n else {\r\n _playPause(false); // ensure correct paused state\r\n }\r\n });\r\n\r\n self.on(Globals.Events.MEDIA_OVERLAY_STATUS_CHANGED, function (value) {\r\n if (!value.smilIndex) return;\r\n var package = self.package();\r\n var smil = package.media_overlay.smilAt(value.smilIndex);\r\n if (!smil || !smil.spineItemId) return;\r\n\r\n var needUpdate = false;\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var data = _spineItemIframeMap[prop];\r\n if (!data) continue;\r\n\r\n if (data.active) {\r\n if (prop !== smil.spineItemId) {\r\n _playPause(false); // ensure correct paused state\r\n data.active = false;\r\n needUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (needUpdate) {\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var data = _spineItemIframeMap[prop];\r\n if (!data) continue;\r\n\r\n if (!data.active) {\r\n if (prop === smil.spineItemId) {\r\n data.active = true;\r\n }\r\n }\r\n }\r\n\r\n if (_wasPlaying) {\r\n _playPause(true);\r\n }\r\n }\r\n });\r\n };\r\n this.backgroundAudioTrackManager = new BackgroundAudioTrackManager();\r\n};\r\n\r\n/**\r\n * View Type\r\n * @typedef {object} Globals.Views.ReaderView.ViewType\r\n * @property {number} VIEW_TYPE_COLUMNIZED Reflowable document view\r\n * @property {number} VIEW_TYPE_FIXED Fixed layout document view\r\n * @property {number} VIEW_TYPE_SCROLLED_DOC Scrollable document view\r\n * @property {number} VIEW_TYPE_SCROLLED_CONTINUOUS Continuous scrollable document view\r\n */\r\nReaderView.VIEW_TYPE_COLUMNIZED = 1;\r\nReaderView.VIEW_TYPE_FIXED = 2;\r\nReaderView.VIEW_TYPE_SCROLLED_DOC = 3;\r\nReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS = 4;\r\nreturn ReaderView;\r\n});\n" ] } \ No newline at end of file diff --git a/build-output/_single-bundle/readium-shared-js_all.js b/build-output/_single-bundle/readium-shared-js_all.js index b48252509..c0234cd9b 100644 --- a/build-output/_single-bundle/readium-shared-js_all.js +++ b/build-output/_single-bundle/readium-shared-js_all.js @@ -18204,15 +18204,11 @@ var CurrentPagesInfo = function(spine, isFixedLayout) { var lastOpenPage = this.openPages[this.openPages.length - 1]; - // TODO: handling of non-linear spine items ("ancillary" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs "go back" feature to navigate to source hyperlink location that led to the non-linear document. - // See https://github.com/readium/readium-shared-js/issues/26 - - // Removed, needs to be implemented properly as per above. - // See https://github.com/readium/readium-shared-js/issues/108 - // if(!spine.isValidLinearItem(lastOpenPage.spineItemIndex)) - // return false; - - return lastOpenPage.spineItemIndex < spine.last().index || lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1; + if(spine.isValidLinearItem(lastOpenPage.spineItemIndex)) + return lastOpenPage.spineItemIndex < spine.last().index || lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1; + else + return lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1; + }; this.canGoPrev = function() { @@ -18222,15 +18218,10 @@ var CurrentPagesInfo = function(spine, isFixedLayout) { var firstOpenPage = this.openPages[0]; - // TODO: handling of non-linear spine items ("ancillary" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs "go back" feature to navigate to source hyperlink location that led to the non-linear document. - // See https://github.com/readium/readium-shared-js/issues/26 - - // Removed, needs to be implemented properly as per above. - // //https://github.com/readium/readium-shared-js/issues/108 - // if(!spine.isValidLinearItem(firstOpenPage.spineItemIndex)) - // return false; - - return spine.first().index < firstOpenPage.spineItemIndex || 0 < firstOpenPage.spineItemPageIndex; + if(spine.isValidLinearItem(firstOpenPage.spineItemIndex)) + return spine.first().index < firstOpenPage.spineItemIndex || 0 < firstOpenPage.spineItemPageIndex; + else + return 0 < firstOpenPage.spineItemPageIndex; }; this.sort = function() { @@ -18967,9 +18958,9 @@ Helpers.UpdateHtmlFontSize = function ($epubHtml, fontSize) { originalLineHeight = 0; } - ele.style.fontSize = (originalFontSize * factor) + 'px'; + $(ele).css("font-size", (originalFontSize * factor) + 'px'); if (originalLineHeight) { - ele.style.lineHeight = (originalLineHeight * factor) + 'px'; + $(ele).css("line-height", (originalLineHeight * factor) + 'px'); } } @@ -35877,7 +35868,7 @@ var Spine = function(epubPackage, spineDTO) { */ this.package = epubPackage; - var _handleLinear = false; + var _handleLinear = true; this.handleLinear = function(handleLinear) { _handleLinear = handleLinear; @@ -41214,9 +41205,6 @@ var Switches = function() { // cases that are not supported Switches.apply = function(dom) { - - // helper method, returns true if a given case node - // is supported, false otherwise function isSupported(caseNode) { var ns = caseNode.attributes["required-namespace"]; @@ -41229,31 +41217,39 @@ Switches.apply = function(dom) { // all the xmlns that readium is known to support // TODO this is going to require maintenance var supportedNamespaces = ["http://www.w3.org/1998/Math/MathML"]; - return _.include(supportedNamespaces, ns); + return _.include(supportedNamespaces, ns.value); } - $('switch', dom).each( function() { + var getQuery = ((window.navigator.userAgent.indexOf("Trident") > 0) || (window.navigator.userAgent.indexOf("Edge") > 0)) + ? function (elementName) { return 'epub\\:' + elementName; } + : function (elementName) { return elementName; }; + + _.each(dom.querySelectorAll(getQuery('switch')), function(switchNode) { // keep track of whether or now we found one var found = false; - $('case', this).each(function() { + _.each(switchNode.querySelectorAll(getQuery('case')), function(caseNode) { - if( !found && isSupported(this) ) { + if( !found && isSupported(caseNode) ) { found = true; // we found the node, don't remove it } else { - $(this).remove(); // remove the node from the dom -// $(this).prop("hidden", true); + $(caseNode).remove(); // remove the node from the dom } + }); - if(found) { + if (found) { + // if we found a supported case, remove the default - $('default', this).remove(); -// $('default', this).prop("hidden", true); + _.each(switchNode.querySelectorAll(getQuery('default')), function(defaultNode) { + $(defaultNode).remove(); + }); + } - }) + + }); }; return Switches; }); @@ -41376,14 +41372,163 @@ Trigger.prototype.execute = function(dom) { // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // OF THE POSSIBILITY OF SUCH DAMAGE. +define('readium_shared_js/models/navigation_history',[ + //"jquery", "underscore" + ], + function ( + //$, _ + ) { + + +var NavigationHistory = function (readerview) { + + var _DEBUG = true; + + var self = this; + + var _readerView = readerview; + + var _breadcrumb = []; + + var _skipNext = false; + + this.flush = function () { + if (_DEBUG) { + console.error("NavigationHistory FLUSH."); + } + + _breadcrumb = []; + }; + this.flush(); + + this.containsLinear = function() { + + for (var i = 0; i < _breadcrumb.length; i++) { + var bookMark = _breadcrumb[i]; + if (bookMark && bookMark.idref) { + var spineItem = readerview.spine().getItemById(bookMark.idref); + + var isLinear = spineItem && readerview.spine().isValidLinearItem(spineItem.index); + if (isLinear) { + return true; + } + } + } + + return false; + }; + + this.push = function (bookMark) { + + if (_skipNext) { + + if (_DEBUG) { + console.error("NavigationHistory PUSH SKIP: "); + console.debug(bookMark); + } + + _skipNext = false; + return; + } + + if (_DEBUG) { + console.error("NavigationHistory PUSH: "); + console.debug(bookMark); + } + + if (_breadcrumb.length) { + var lastBookMark = _breadcrumb[_breadcrumb.length-1]; + + var bookMark_contentCFI = bookMark.contentCFI; + // TODO bookmark spatial @x:y! (should be charcter offset) + // if (bookMark_contentCFI) { + // var i = bookMark_contentCFI.lastIndexOf("@"); + // if (i > 1) { + // bookMark_contentCFI = bookMark_contentCFI.substr(0, i); + // } + // } + + var lastBookMark_contentCFI = lastBookMark.contentCFI; + // TODO bookmark spatial @x:y! (should be charcter offset) + // if (lastBookMark_contentCFI) { + // i = lastBookMark_contentCFI.lastIndexOf("@"); + // if (i > 1) { + // lastBookMark_contentCFI = lastBookMark_contentCFI.substr(0, i); + // } + // } + + if (bookMark.idref == lastBookMark.idref + && bookMark_contentCFI == lastBookMark_contentCFI) { + + if (_DEBUG) { + console.log("--- NavigationHistory skipping duplicate bookmark: " + bookMark.idref + " -- " + bookMark_contentCFI); + } + return; + } + } + + _breadcrumb.push(bookMark); + }; + + this.pop = function () { + var bookMark = _breadcrumb.pop(); + + if (_DEBUG) { + console.error("NavigationHistory POP: "); + console.debug(bookMark); + } + + return bookMark; + }; + + this.canPop = function() { + return _breadcrumb.length > 0; + }; + + this.skipNext = function() { + if (_DEBUG) { + console.error("NavigationHistory SKIP NEXT."); + } + _skipNext = true; + }; +}; +return NavigationHistory; + +}); +// Created by Boris Schneiderman. +// Modified by Daniel Weck +// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation and/or +// other materials provided with the distribution. +// 3. Neither the name of the organization nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. + define('readium_shared_js/views/reader_view',["jquery", "underscore", "eventEmitter", "./fixed_view", "../helpers", "./iframe_loader", "./internal_links_support", "./media_overlay_data_injector", "./media_overlay_player", "../models/package", "../models/page_open_request", "./reflowable_view", "./scroll_view", "../models/style_collection", "../models/switches", "../models/trigger", - "../models/viewer_settings", "../globals"], + "../models/viewer_settings", "../globals", "../models/navigation_history"], function ($, _, EventEmitter, FixedView, Helpers, IFrameLoader, InternalLinksSupport, MediaOverlayDataInjector, MediaOverlayPlayer, Package, PageOpenRequest, ReflowableView, ScrollView, StyleCollection, Switches, Trigger, - ViewerSettings, Globals) { + ViewerSettings, Globals, NavigationHistory) { /** * Options passed on the reader from the readium loader/initializer * @@ -41403,6 +41548,9 @@ var ReaderView = function (options) { $.extend(this, new EventEmitter()); var self = this; + + var _navigationHistory = new NavigationHistory(self); + var _currentView = undefined; var _package = undefined; var _spine = undefined; @@ -41541,7 +41689,7 @@ var ReaderView = function (options) { return ReaderView.VIEW_TYPE_COLUMNIZED; } - // returns true is view changed + // callback is passed true parameter is view changed function initViewForItem(spineItem, callback) { var desiredViewType = deduceDesiredViewType(spineItem); @@ -41549,6 +41697,7 @@ var ReaderView = function (options) { if (_currentView) { if (self.getCurrentViewType() == desiredViewType) { + callback(false); return; } @@ -41598,7 +41747,6 @@ var ReaderView = function (options) { }); _currentView.on(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, function (pageChangeData) { - //we call on onPageChanged explicitly instead of subscribing to the Globals.Events.PAGINATION_CHANGED by //mediaOverlayPlayer because we hve to guarantee that mediaOverlayPlayer will be updated before the host //application will be notified by the same Globals.Events.PAGINATION_CHANGED event @@ -41620,7 +41768,6 @@ var ReaderView = function (options) { setTimeout(function () { callback(true); - }, 50); } @@ -41706,12 +41853,14 @@ var ReaderView = function (options) { */ this.openBook = function (openBookData) { + _navigationHistory.flush(); + var packageData = openBookData.package ? openBookData.package : openBookData; _package = new Package(packageData); _spine = _package.spine; - _spine.handleLinear(true); + //_spine.handleLinear(false); if (_mediaOverlayPlayer) { _mediaOverlayPlayer.reset(); @@ -41784,9 +41933,7 @@ var ReaderView = function (options) { pageOpenRequest.setFirstPage(); openPage(pageOpenRequest, 0); } - } - }; function onMediaPlayerStatusChanged(status) { @@ -41908,6 +42055,8 @@ var ReaderView = function (options) { var spineItem = _spine.getItemById(bookMark.idref); + _navigationHistory.skipNext(); + initViewForItem(spineItem, function (isViewChanged) { if (!isViewChanged) { @@ -41925,7 +42074,7 @@ var ReaderView = function (options) { self.emit(Globals.Events.SETTINGS_APPLIED); }); - + return; } } @@ -41967,6 +42116,8 @@ var ReaderView = function (options) { var openPageRequest = new PageOpenRequest(nextSpineItem, self); openPageRequest.setFirstPage(); + _navigationHistory.skipNext(); + openPage(openPageRequest, 2); }; @@ -42004,6 +42155,8 @@ var ReaderView = function (options) { var openPageRequest = new PageOpenRequest(prevSpineItem, self); openPageRequest.setLastPage(); + _navigationHistory.skipNext(); + openPage(openPageRequest, 1); }; @@ -42087,9 +42240,64 @@ var ReaderView = function (options) { return true; }; + // this.navigationHistoryForward = function() { + // // Not implemented + // }; + this.navigationHistoryBack = function(forceLinear) { + + console.log("back nav request ..."); + + while (true) { + var bookMark = _navigationHistory.pop(); + if (bookMark && bookMark.idref) { + var spineItem = _spine.getItemById(bookMark.idref); + + if (forceLinear) { + var isLinear = _spine.isValidLinearItem(spineItem.index); + if (!isLinear) { + console.log("back nav, skipping non-linear " + bookMark.idref); + continue; + } + } + + console.log("back nav: "); + console.debug(bookMark); + + _navigationHistory.skipNext(); + + initViewForItem(spineItem, function (isViewChanged) { + + if (!isViewChanged) { + _currentView.setViewSettings(_viewerSettings); + } + + self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self); + }); + + return; + } + + console.error("no valid back history?"); + return; + } + }; + + this.navigationHistoryCanBack = function(forceLinear) { + + if (!_navigationHistory.canPop()) return false; + + if (!forceLinear) { + return true; + } + + return _navigationHistory.containsLinear(); + }; + // dir: 0 => new or same page, 1 => previous, 2 => next function openPage(pageRequest, dir) { + if (_currentView) _navigationHistory.push(_currentView.bookmarkCurrentPage()); + initViewForItem(pageRequest.spineItem, function (isViewChanged) { if (!isViewChanged) { @@ -42284,6 +42492,11 @@ var ReaderView = function (options) { return false; } } + + if (initiator && initiator instanceof MediaOverlayPlayer) + { + _navigationHistory.skipNext(); + } return self.openSpineItemElementId(spineItem.idref, elementId, initiator); }; @@ -42519,9 +42732,15 @@ var ReaderView = function (options) { if (_currentView.isReflowable && _currentView.isReflowable() && bookMark && bookMark.idref) { var spineItem = _spine.getItemById(bookMark.idref); + _navigationHistory.skipNext(); + initViewForItem(spineItem, function (isViewChanged) { + + // if (!isViewChanged) { + // _currentView.setViewSettings(_viewerSettings); + // } + self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self); - return; }); } else { diff --git a/build-output/_single-bundle/readium-shared-js_all.js.bundles.js b/build-output/_single-bundle/readium-shared-js_all.js.bundles.js index 6df261ec9..f37ca359e 100644 --- a/build-output/_single-bundle/readium-shared-js_all.js.bundles.js +++ b/build-output/_single-bundle/readium-shared-js_all.js.bundles.js @@ -1 +1 @@ -require.config({bundles: {"readium-shared-js_all":["FontLoader","IPv6","SecondLevelDomains","URIjs","console_shim","cssom","domReady","eventEmitter","jquery","jquerySizes","punycode","rangy","rangy-core","rangy-cssclassapplier","rangy-highlighter","rangy-position","rangy-textrange","readium-shared-js_all","readium_cfi_js/cfi_API","readium_cfi_js/cfi_generator","readium_cfi_js/cfi_instructions","readium_cfi_js/cfi_interpreter","readium_cfi_js/cfi_parser","readium_cfi_js/cfi_runtime_errors","readium_js_plugins","readium_shared_js/globals","readium_shared_js/globalsSetup","readium_shared_js/helpers","readium_shared_js/models/bookmark_data","readium_shared_js/models/current_pages_info","readium_shared_js/models/fixed_page_spread","readium_shared_js/models/media_overlay","readium_shared_js/models/package","readium_shared_js/models/package_data","readium_shared_js/models/page_open_request","readium_shared_js/models/smil_iterator","readium_shared_js/models/smil_model","readium_shared_js/models/spine","readium_shared_js/models/spine_item","readium_shared_js/models/style","readium_shared_js/models/style_collection","readium_shared_js/models/switches","readium_shared_js/models/trigger","readium_shared_js/models/viewer_settings","readium_shared_js/views/audio_player","readium_shared_js/views/cfi_navigation_logic","readium_shared_js/views/fixed_view","readium_shared_js/views/font_loader","readium_shared_js/views/iframe_loader","readium_shared_js/views/internal_links_support","readium_shared_js/views/media_overlay_data_injector","readium_shared_js/views/media_overlay_element_highlighter","readium_shared_js/views/media_overlay_player","readium_shared_js/views/one_page_view","readium_shared_js/views/reader_view","readium_shared_js/views/reflowable_view","readium_shared_js/views/scroll_view","underscore"]}}); \ No newline at end of file +require.config({bundles: {"readium-shared-js_all":["FontLoader","IPv6","SecondLevelDomains","URIjs","console_shim","cssom","domReady","eventEmitter","jquery","jquerySizes","punycode","rangy","rangy-core","rangy-cssclassapplier","rangy-highlighter","rangy-position","rangy-textrange","readium-shared-js_all","readium_cfi_js/cfi_API","readium_cfi_js/cfi_generator","readium_cfi_js/cfi_instructions","readium_cfi_js/cfi_interpreter","readium_cfi_js/cfi_parser","readium_cfi_js/cfi_runtime_errors","readium_js_plugins","readium_shared_js/globals","readium_shared_js/globalsSetup","readium_shared_js/helpers","readium_shared_js/models/bookmark_data","readium_shared_js/models/current_pages_info","readium_shared_js/models/fixed_page_spread","readium_shared_js/models/media_overlay","readium_shared_js/models/navigation_history","readium_shared_js/models/package","readium_shared_js/models/package_data","readium_shared_js/models/page_open_request","readium_shared_js/models/smil_iterator","readium_shared_js/models/smil_model","readium_shared_js/models/spine","readium_shared_js/models/spine_item","readium_shared_js/models/style","readium_shared_js/models/style_collection","readium_shared_js/models/switches","readium_shared_js/models/trigger","readium_shared_js/models/viewer_settings","readium_shared_js/views/audio_player","readium_shared_js/views/cfi_navigation_logic","readium_shared_js/views/fixed_view","readium_shared_js/views/font_loader","readium_shared_js/views/iframe_loader","readium_shared_js/views/internal_links_support","readium_shared_js/views/media_overlay_data_injector","readium_shared_js/views/media_overlay_element_highlighter","readium_shared_js/views/media_overlay_player","readium_shared_js/views/one_page_view","readium_shared_js/views/reader_view","readium_shared_js/views/reflowable_view","readium_shared_js/views/scroll_view","underscore"]}}); \ No newline at end of file diff --git a/build-output/_single-bundle/readium-shared-js_all.js.map b/build-output/_single-bundle/readium-shared-js_all.js.map index e802bf894..dbd30e95f 100644 --- a/build-output/_single-bundle/readium-shared-js_all.js.map +++ b/build-output/_single-bundle/readium-shared-js_all.js.map @@ -59,10 +59,11 @@ "js/models/style_collection.js", "js/models/switches.js", "js/models/trigger.js", + "js/models/navigation_history.js", "js/views/reader_view.js" ], "names": [], - "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChbA,ADibA;AChbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACp8CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1/RA,AD2/RA;AC1/RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpHA,ADqHA;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtbA,ADubA;ACtbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxfA,ADyfA;ACxfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvJA,ADwJA;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5fA,AD6fA;AC5fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9mEA,AD+mEA;AC9mEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5gDA,AD6gDA;AC5gDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1LA,AD2LA;AC1LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnFA,ADoFA;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnPA,ADoPA;ACnPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxxBA,ADyxBA;ACxxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACp5BA,ADq5BA;ACp5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClOA,ADmOA;AClOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjIA,ADkIA;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9qHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzfA,AD0fA;ACzfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACh+BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC93DA,AD+3DA;AC93DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACliBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzBA,AD0BA;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnjBA,ADojBA;ACnjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3gBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/2CA,ADg3CA;AC/2CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnlEA,ADolEA;ACnlEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxOA,ADyOA;ACxOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtvBA,ADuvBA;ACtvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvEA,ADwEA;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACr5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjlDA,ADklDA;ACjlDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC35BA,AD45BA;AC35BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA", + "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChbA,ADibA;AChbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACp8CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1/RA,AD2/RA;AC1/RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpHA,ADqHA;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtbA,ADubA;ACtbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxfA,ADyfA;ACxfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvJA,ADwJA;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5fA,AD6fA;AC5fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9mEA,AD+mEA;AC9mEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5gDA,AD6gDA;AC5gDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1LA,AD2LA;AC1LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnFA,ADoFA;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnPA,ADoPA;ACnPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxxBA,ADyxBA;ACxxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACp5BA,ADq5BA;ACp5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClOA,ADmOA;AClOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjIA,ADkIA;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9qHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzfA,AD0fA;ACzfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACh+BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC93DA,AD+3DA;AC93DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACliBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzBA,AD0BA;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnjBA,ADojBA;ACnjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3gBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/2CA,ADg3CA;AC/2CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnlEA,ADolEA;ACnlEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxOA,ADyOA;ACxOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtvBA,ADuvBA;ACtvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvEA,ADwEA;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACr5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjlDA,ADklDA;ACjlDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC35BA,AD45BA;AC35BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3FA,AD4FA;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA", "sourcesContent": [ "/**\n * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.\n * Available via the MIT or new BSD license.\n * see: http://github.com/jrburke/almond for details\n */\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\n//be followed.\n/*jslint sloppy: true */\n/*global setTimeout: false */\n\nvar requirejs, require, define;\n(function (undef) {\n var main, req, makeMap, handlers,\n defined = {},\n waiting = {},\n config = {},\n defining = {},\n hasOwn = Object.prototype.hasOwnProperty,\n aps = [].slice,\n jsSuffixRegExp = /\\.js$/;\n\n function hasProp(obj, prop) {\n return hasOwn.call(obj, prop);\n }\n\n /**\n * Given a relative module name, like ./something, normalize it to\n * a real name that can be mapped to a path.\n * @param {String} name the relative name\n * @param {String} baseName a real name that the name arg is relative\n * to.\n * @returns {String} normalized name\n */\n function normalize(name, baseName) {\n var nameParts, nameSegment, mapValue, foundMap, lastIndex,\n foundI, foundStarMap, starI, i, j, part,\n baseParts = baseName && baseName.split(\"/\"),\n map = config.map,\n starMap = (map && map['*']) || {};\n\n //Adjust any relative paths.\n if (name && name.charAt(0) === \".\") {\n //If have a base name, try to normalize against it,\n //otherwise, assume it is a top-level require that will\n //be relative to baseUrl in the end.\n if (baseName) {\n name = name.split('/');\n lastIndex = name.length - 1;\n\n // Node .js allowance:\n if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n }\n\n //Lop off the last part of baseParts, so that . matches the\n //\"directory\" and not name of the baseName's module. For instance,\n //baseName of \"one/two/three\", maps to \"one/two/three.js\", but we\n //want the directory, \"one/two\" for this normalization.\n name = baseParts.slice(0, baseParts.length - 1).concat(name);\n\n //start trimDots\n for (i = 0; i < name.length; i += 1) {\n part = name[i];\n if (part === \".\") {\n name.splice(i, 1);\n i -= 1;\n } else if (part === \"..\") {\n if (i === 1 && (name[2] === '..' || name[0] === '..')) {\n //End of the line. Keep at least one non-dot\n //path segment at the front so it can be mapped\n //correctly to disk. Otherwise, there is likely\n //no path mapping for a path starting with '..'.\n //This can still fail, but catches the most reasonable\n //uses of ..\n break;\n } else if (i > 0) {\n name.splice(i - 1, 2);\n i -= 2;\n }\n }\n }\n //end trimDots\n\n name = name.join(\"/\");\n } else if (name.indexOf('./') === 0) {\n // No baseName, so this is ID is resolved relative\n // to baseUrl, pull off the leading dot.\n name = name.substring(2);\n }\n }\n\n //Apply map config if available.\n if ((baseParts || starMap) && map) {\n nameParts = name.split('/');\n\n for (i = nameParts.length; i > 0; i -= 1) {\n nameSegment = nameParts.slice(0, i).join(\"/\");\n\n if (baseParts) {\n //Find the longest baseName segment match in the config.\n //So, do joins on the biggest to smallest lengths of baseParts.\n for (j = baseParts.length; j > 0; j -= 1) {\n mapValue = map[baseParts.slice(0, j).join('/')];\n\n //baseName segment has config, find if it has one for\n //this name.\n if (mapValue) {\n mapValue = mapValue[nameSegment];\n if (mapValue) {\n //Match, update name to the new value.\n foundMap = mapValue;\n foundI = i;\n break;\n }\n }\n }\n }\n\n if (foundMap) {\n break;\n }\n\n //Check for a star map match, but just hold on to it,\n //if there is a shorter segment match later in a matching\n //config, then favor over this star map.\n if (!foundStarMap && starMap && starMap[nameSegment]) {\n foundStarMap = starMap[nameSegment];\n starI = i;\n }\n }\n\n if (!foundMap && foundStarMap) {\n foundMap = foundStarMap;\n foundI = starI;\n }\n\n if (foundMap) {\n nameParts.splice(0, foundI, foundMap);\n name = nameParts.join('/');\n }\n }\n\n return name;\n }\n\n function makeRequire(relName, forceSync) {\n return function () {\n //A version of a require function that passes a moduleName\n //value for items that may need to\n //look up paths relative to the moduleName\n var args = aps.call(arguments, 0);\n\n //If first arg is not require('string'), and there is only\n //one arg, it is the array form without a callback. Insert\n //a null so that the following concat is correct.\n if (typeof args[0] !== 'string' && args.length === 1) {\n args.push(null);\n }\n return req.apply(undef, args.concat([relName, forceSync]));\n };\n }\n\n function makeNormalize(relName) {\n return function (name) {\n return normalize(name, relName);\n };\n }\n\n function makeLoad(depName) {\n return function (value) {\n defined[depName] = value;\n };\n }\n\n function callDep(name) {\n if (hasProp(waiting, name)) {\n var args = waiting[name];\n delete waiting[name];\n defining[name] = true;\n main.apply(undef, args);\n }\n\n if (!hasProp(defined, name) && !hasProp(defining, name)) {\n throw new Error('No ' + name);\n }\n return defined[name];\n }\n\n //Turns a plugin!resource to [plugin, resource]\n //with the plugin being undefined if the name\n //did not have a plugin prefix.\n function splitPrefix(name) {\n var prefix,\n index = name ? name.indexOf('!') : -1;\n if (index > -1) {\n prefix = name.substring(0, index);\n name = name.substring(index + 1, name.length);\n }\n return [prefix, name];\n }\n\n /**\n * Makes a name map, normalizing the name, and using a plugin\n * for normalization if necessary. Grabs a ref to plugin\n * too, as an optimization.\n */\n makeMap = function (name, relName) {\n var plugin,\n parts = splitPrefix(name),\n prefix = parts[0];\n\n name = parts[1];\n\n if (prefix) {\n prefix = normalize(prefix, relName);\n plugin = callDep(prefix);\n }\n\n //Normalize according\n if (prefix) {\n if (plugin && plugin.normalize) {\n name = plugin.normalize(name, makeNormalize(relName));\n } else {\n name = normalize(name, relName);\n }\n } else {\n name = normalize(name, relName);\n parts = splitPrefix(name);\n prefix = parts[0];\n name = parts[1];\n if (prefix) {\n plugin = callDep(prefix);\n }\n }\n\n //Using ridiculous property names for space reasons\n return {\n f: prefix ? prefix + '!' + name : name, //fullName\n n: name,\n pr: prefix,\n p: plugin\n };\n };\n\n function makeConfig(name) {\n return function () {\n return (config && config.config && config.config[name]) || {};\n };\n }\n\n handlers = {\n require: function (name) {\n return makeRequire(name);\n },\n exports: function (name) {\n var e = defined[name];\n if (typeof e !== 'undefined') {\n return e;\n } else {\n return (defined[name] = {});\n }\n },\n module: function (name) {\n return {\n id: name,\n uri: '',\n exports: defined[name],\n config: makeConfig(name)\n };\n }\n };\n\n main = function (name, deps, callback, relName) {\n var cjsModule, depName, ret, map, i,\n args = [],\n callbackType = typeof callback,\n usingExports;\n\n //Use name if no relName\n relName = relName || name;\n\n //Call the callback to define the module, if necessary.\n if (callbackType === 'undefined' || callbackType === 'function') {\n //Pull out the defined dependencies and pass the ordered\n //values to the callback.\n //Default to [require, exports, module] if no deps\n deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\n for (i = 0; i < deps.length; i += 1) {\n map = makeMap(deps[i], relName);\n depName = map.f;\n\n //Fast path CommonJS standard dependencies.\n if (depName === \"require\") {\n args[i] = handlers.require(name);\n } else if (depName === \"exports\") {\n //CommonJS module spec 1.1\n args[i] = handlers.exports(name);\n usingExports = true;\n } else if (depName === \"module\") {\n //CommonJS module spec 1.1\n cjsModule = args[i] = handlers.module(name);\n } else if (hasProp(defined, depName) ||\n hasProp(waiting, depName) ||\n hasProp(defining, depName)) {\n args[i] = callDep(depName);\n } else if (map.p) {\n map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n args[i] = defined[depName];\n } else {\n throw new Error(name + ' missing ' + depName);\n }\n }\n\n ret = callback ? callback.apply(defined[name], args) : undefined;\n\n if (name) {\n //If setting exports via \"module\" is in play,\n //favor that over return value and exports. After that,\n //favor a non-undefined return value over exports use.\n if (cjsModule && cjsModule.exports !== undef &&\n cjsModule.exports !== defined[name]) {\n defined[name] = cjsModule.exports;\n } else if (ret !== undef || !usingExports) {\n //Use the return value from the function.\n defined[name] = ret;\n }\n }\n } else if (name) {\n //May just be an object definition for the module. Only\n //worry about defining if have a module name.\n defined[name] = callback;\n }\n };\n\n requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\n if (typeof deps === \"string\") {\n if (handlers[deps]) {\n //callback in this case is really relName\n return handlers[deps](callback);\n }\n //Just return the module wanted. In this scenario, the\n //deps arg is the module name, and second arg (if passed)\n //is just the relName.\n //Normalize module name, if it contains . or ..\n return callDep(makeMap(deps, callback).f);\n } else if (!deps.splice) {\n //deps is a config object, not an array.\n config = deps;\n if (config.deps) {\n req(config.deps, config.callback);\n }\n if (!callback) {\n return;\n }\n\n if (callback.splice) {\n //callback is an array, which means it is a dependency list.\n //Adjust args if there are dependencies\n deps = callback;\n callback = relName;\n relName = null;\n } else {\n deps = undef;\n }\n }\n\n //Support require(['a'])\n callback = callback || function () {};\n\n //If relName is a function, it is an errback handler,\n //so remove it.\n if (typeof relName === 'function') {\n relName = forceSync;\n forceSync = alt;\n }\n\n //Simulate async callback;\n if (forceSync) {\n main(undef, deps, callback, relName);\n } else {\n //Using a non-zero value because of concern for what old browsers\n //do, and latest browsers \"upgrade\" to 4 if lower value is used:\n //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\n //If want a value immediately, use require('id') instead -- something\n //that works in almond on the global level, but not guaranteed and\n //unlikely to work in other AMD implementations.\n setTimeout(function () {\n main(undef, deps, callback, relName);\n }, 4);\n }\n\n return req;\n };\n\n /**\n * Just drops the config on the floor, but returns req in case\n * the config return value is used.\n */\n req.config = function (cfg) {\n return req(cfg);\n };\n\n /**\n * Expose module registry for debugging and tooling\n */\n requirejs._defined = defined;\n\n define = function (name, deps, callback) {\n if (typeof name !== 'string') {\n throw new Error('See almond README: incorrect module build, no module name');\n }\n\n //This module may not have dependencies\n if (!deps.splice) {\n //deps is not an array, so probably means\n //an object literal or factory function for\n //the value. Adjust args.\n callback = deps;\n deps = [];\n }\n\n if (!hasProp(defined, name) && !hasProp(waiting, name)) {\n waiting[name] = [name, deps, callback];\n }\n };\n\n define.amd = {\n jQuery: true\n };\n}());\n\ndefine(\"readium-shared-js_all\", function(){});\n\n", "window.EPUBcfiParser = (function() {\n \"use strict\";\n\n /*\n * Generated by PEG.js 0.9.0.\n *\n * http://pegjs.org/\n */\n\n function peg$subclass(child, parent) {\n function ctor() { this.constructor = child; }\n ctor.prototype = parent.prototype;\n child.prototype = new ctor();\n }\n\n function peg$SyntaxError(message, expected, found, location) {\n this.message = message;\n this.expected = expected;\n this.found = found;\n this.location = location;\n this.name = \"SyntaxError\";\n\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(this, peg$SyntaxError);\n }\n }\n\n peg$subclass(peg$SyntaxError, Error);\n\n function peg$parse(input) {\n var options = arguments.length > 1 ? arguments[1] : {},\n parser = this,\n\n peg$FAILED = {},\n\n peg$startRuleFunctions = { fragment: peg$parsefragment },\n peg$startRuleFunction = peg$parsefragment,\n\n peg$c0 = \"epubcfi(\",\n peg$c1 = { type: \"literal\", value: \"epubcfi(\", description: \"\\\"epubcfi(\\\"\" },\n peg$c2 = \")\",\n peg$c3 = { type: \"literal\", value: \")\", description: \"\\\")\\\"\" },\n peg$c4 = function(fragmentVal) { \r\n \r\n return { type:\"CFIAST\", cfiString:fragmentVal };\r\n },\n peg$c5 = \",\",\n peg$c6 = { type: \"literal\", value: \",\", description: \"\\\",\\\"\" },\n peg$c7 = function(stepVal, localPathVal, rangeLocalPath1Val, rangeLocalPath2Val) {\r\n\r\n return { type:\"range\", path:stepVal, localPath:localPathVal, range1:rangeLocalPath1Val, range2:rangeLocalPath2Val };\r\n },\n peg$c8 = function(stepVal, localPathVal) { \r\n\r\n return { type:\"path\", path:stepVal, localPath:localPathVal }; \r\n },\n peg$c9 = function(localPathStepVal, termStepVal) { \r\n\r\n return { steps:localPathStepVal, termStep:termStepVal?termStepVal:\"\" }; \r\n },\n peg$c10 = \"/\",\n peg$c11 = { type: \"literal\", value: \"/\", description: \"\\\"/\\\"\" },\n peg$c12 = \"[\",\n peg$c13 = { type: \"literal\", value: \"[\", description: \"\\\"[\\\"\" },\n peg$c14 = \"]\",\n peg$c15 = { type: \"literal\", value: \"]\", description: \"\\\"]\\\"\" },\n peg$c16 = function(stepLengthVal, assertVal) { \r\n\r\n return { type:\"indexStep\", stepLength:stepLengthVal, idAssertion:assertVal?assertVal[1]:undefined };\r\n },\n peg$c17 = \"!/\",\n peg$c18 = { type: \"literal\", value: \"!/\", description: \"\\\"!/\\\"\" },\n peg$c19 = function(stepLengthVal, assertVal) { \r\n\r\n return { type:\"indirectionStep\", stepLength:stepLengthVal, idAssertion:assertVal?assertVal[1]:undefined };\r\n },\n peg$c20 = \":\",\n peg$c21 = { type: \"literal\", value: \":\", description: \"\\\":\\\"\" },\n peg$c22 = function(textOffsetValue, textLocAssertVal) { \r\n\r\n return { type:\"textTerminus\", offsetValue:textOffsetValue, textAssertion: textLocAssertVal?textLocAssertVal[1]:undefined };\r\n },\n peg$c23 = function(idVal) { \r\n\r\n return idVal; \r\n },\n peg$c24 = function(csvVal, paramVal) { \r\n\r\n return { type:\"textLocationAssertion\", csv:csvVal?csvVal:\"\", parameter:paramVal?paramVal:\"\" }; \r\n },\n peg$c25 = \";\",\n peg$c26 = { type: \"literal\", value: \";\", description: \"\\\";\\\"\" },\n peg$c27 = \"=\",\n peg$c28 = { type: \"literal\", value: \"=\", description: \"\\\"=\\\"\" },\n peg$c29 = function(paramLHSVal, paramRHSVal) { \r\n\r\n return { type:\"parameter\", LHSValue:paramLHSVal?paramLHSVal:\"\", RHSValue:paramRHSVal?paramRHSVal:\"\" }; \r\n },\n peg$c30 = function(preAssertionVal, postAssertionVal) { \r\n\r\n return { type:\"csv\", preAssertion:preAssertionVal?preAssertionVal:\"\", postAssertion:postAssertionVal?postAssertionVal:\"\" }; \r\n },\n peg$c31 = function(stringVal) { \r\n\r\n return stringVal.join(''); \r\n },\n peg$c32 = function(escSpecCharVal) { \r\n \r\n return escSpecCharVal[1]; \r\n },\n peg$c33 = /^[1-9]/,\n peg$c34 = { type: \"class\", value: \"[1-9]\", description: \"[1-9]\" },\n peg$c35 = /^[0-9]/,\n peg$c36 = { type: \"class\", value: \"[0-9]\", description: \"[0-9]\" },\n peg$c37 = \".\",\n peg$c38 = { type: \"literal\", value: \".\", description: \"\\\".\\\"\" },\n peg$c39 = function(intPartVal, fracPartVal) { \r\n\r\n return intPartVal.join('') + \".\" + fracPartVal.join(''); \r\n },\n peg$c40 = \"0\",\n peg$c41 = { type: \"literal\", value: \"0\", description: \"\\\"0\\\"\" },\n peg$c42 = function(integerVal) { \r\n\r\n if (integerVal === \"0\") { \r\n return \"0\";\r\n } \r\n else { \r\n return integerVal[0].concat(integerVal[1].join(''));\r\n }\r\n },\n peg$c43 = \" \",\n peg$c44 = { type: \"literal\", value: \" \", description: \"\\\" \\\"\" },\n peg$c45 = function() { return \" \"; },\n peg$c46 = \"^\",\n peg$c47 = { type: \"literal\", value: \"^\", description: \"\\\"^\\\"\" },\n peg$c48 = function() { return \"^\"; },\n peg$c49 = \"\\\"\",\n peg$c50 = { type: \"literal\", value: \"\\\"\", description: \"\\\"\\\\\\\"\\\"\" },\n peg$c51 = function() { return '\"'; },\n peg$c52 = function(bracketVal) { return bracketVal; },\n peg$c53 = \"(\",\n peg$c54 = { type: \"literal\", value: \"(\", description: \"\\\"(\\\"\" },\n peg$c55 = function(paraVal) { return paraVal; },\n peg$c56 = function() { return \",\"; },\n peg$c57 = function() { return \";\"; },\n peg$c58 = function() { return \"=\"; },\n peg$c59 = /^[a-z]/,\n peg$c60 = { type: \"class\", value: \"[a-z]\", description: \"[a-z]\" },\n peg$c61 = /^[A-Z]/,\n peg$c62 = { type: \"class\", value: \"[A-Z]\", description: \"[A-Z]\" },\n peg$c63 = \"-\",\n peg$c64 = { type: \"literal\", value: \"-\", description: \"\\\"-\\\"\" },\n peg$c65 = \"_\",\n peg$c66 = { type: \"literal\", value: \"_\", description: \"\\\"_\\\"\" },\n peg$c67 = function(charVal) { return charVal; },\n\n peg$currPos = 0,\n peg$savedPos = 0,\n peg$posDetailsCache = [{ line: 1, column: 1, seenCR: false }],\n peg$maxFailPos = 0,\n peg$maxFailExpected = [],\n peg$silentFails = 0,\n\n peg$result;\n\n if (\"startRule\" in options) {\n if (!(options.startRule in peg$startRuleFunctions)) {\n throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n }\n\n peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n }\n\n function text() {\n return input.substring(peg$savedPos, peg$currPos);\n }\n\n function location() {\n return peg$computeLocation(peg$savedPos, peg$currPos);\n }\n\n function expected(description) {\n throw peg$buildException(\n null,\n [{ type: \"other\", description: description }],\n input.substring(peg$savedPos, peg$currPos),\n peg$computeLocation(peg$savedPos, peg$currPos)\n );\n }\n\n function error(message) {\n throw peg$buildException(\n message,\n null,\n input.substring(peg$savedPos, peg$currPos),\n peg$computeLocation(peg$savedPos, peg$currPos)\n );\n }\n\n function peg$computePosDetails(pos) {\n var details = peg$posDetailsCache[pos],\n p, ch;\n\n if (details) {\n return details;\n } else {\n p = pos - 1;\n while (!peg$posDetailsCache[p]) {\n p--;\n }\n\n details = peg$posDetailsCache[p];\n details = {\n line: details.line,\n column: details.column,\n seenCR: details.seenCR\n };\n\n while (p < pos) {\n ch = input.charAt(p);\n if (ch === \"\\n\") {\n if (!details.seenCR) { details.line++; }\n details.column = 1;\n details.seenCR = false;\n } else if (ch === \"\\r\" || ch === \"\\u2028\" || ch === \"\\u2029\") {\n details.line++;\n details.column = 1;\n details.seenCR = true;\n } else {\n details.column++;\n details.seenCR = false;\n }\n\n p++;\n }\n\n peg$posDetailsCache[pos] = details;\n return details;\n }\n }\n\n function peg$computeLocation(startPos, endPos) {\n var startPosDetails = peg$computePosDetails(startPos),\n endPosDetails = peg$computePosDetails(endPos);\n\n return {\n start: {\n offset: startPos,\n line: startPosDetails.line,\n column: startPosDetails.column\n },\n end: {\n offset: endPos,\n line: endPosDetails.line,\n column: endPosDetails.column\n }\n };\n }\n\n function peg$fail(expected) {\n if (peg$currPos < peg$maxFailPos) { return; }\n\n if (peg$currPos > peg$maxFailPos) {\n peg$maxFailPos = peg$currPos;\n peg$maxFailExpected = [];\n }\n\n peg$maxFailExpected.push(expected);\n }\n\n function peg$buildException(message, expected, found, location) {\n function cleanupExpected(expected) {\n var i = 1;\n\n expected.sort(function(a, b) {\n if (a.description < b.description) {\n return -1;\n } else if (a.description > b.description) {\n return 1;\n } else {\n return 0;\n }\n });\n\n while (i < expected.length) {\n if (expected[i - 1] === expected[i]) {\n expected.splice(i, 1);\n } else {\n i++;\n }\n }\n }\n\n function buildMessage(expected, found) {\n function stringEscape(s) {\n function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }\n\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\x08/g, '\\\\b')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\f/g, '\\\\f')\n .replace(/\\r/g, '\\\\r')\n .replace(/[\\x00-\\x07\\x0B\\x0E\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })\n .replace(/[\\x10-\\x1F\\x80-\\xFF]/g, function(ch) { return '\\\\x' + hex(ch); })\n .replace(/[\\u0100-\\u0FFF]/g, function(ch) { return '\\\\u0' + hex(ch); })\n .replace(/[\\u1000-\\uFFFF]/g, function(ch) { return '\\\\u' + hex(ch); });\n }\n\n var expectedDescs = new Array(expected.length),\n expectedDesc, foundDesc, i;\n\n for (i = 0; i < expected.length; i++) {\n expectedDescs[i] = expected[i].description;\n }\n\n expectedDesc = expected.length > 1\n ? expectedDescs.slice(0, -1).join(\", \")\n + \" or \"\n + expectedDescs[expected.length - 1]\n : expectedDescs[0];\n\n foundDesc = found ? \"\\\"\" + stringEscape(found) + \"\\\"\" : \"end of input\";\n\n return \"Expected \" + expectedDesc + \" but \" + foundDesc + \" found.\";\n }\n\n if (expected !== null) {\n cleanupExpected(expected);\n }\n\n return new peg$SyntaxError(\n message !== null ? message : buildMessage(expected, found),\n expected,\n found,\n location\n );\n }\n\n function peg$parsefragment() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 8) === peg$c0) {\n s1 = peg$c0;\n peg$currPos += 8;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c1); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parserange();\n if (s2 === peg$FAILED) {\n s2 = peg$parsepath();\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s3 = peg$c2;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c3); }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c4(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parserange() {\n var s0, s1, s2, s3, s4, s5, s6;\n\n s0 = peg$currPos;\n s1 = peg$parseindexStep();\n if (s1 !== peg$FAILED) {\n s2 = peg$parselocal_path();\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s3 = peg$c5;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c6); }\n }\n if (s3 !== peg$FAILED) {\n s4 = peg$parselocal_path();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c5;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c6); }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parselocal_path();\n if (s6 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c7(s1, s2, s4, s6);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsepath() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = peg$parseindexStep();\n if (s1 !== peg$FAILED) {\n s2 = peg$parselocal_path();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c8(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parselocal_path() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parseindexStep();\n if (s2 === peg$FAILED) {\n s2 = peg$parseindirectionStep();\n }\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parseindexStep();\n if (s2 === peg$FAILED) {\n s2 = peg$parseindirectionStep();\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseterminus();\n if (s2 === peg$FAILED) {\n s2 = null;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c9(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseindexStep() {\n var s0, s1, s2, s3, s4, s5, s6;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 47) {\n s1 = peg$c10;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c11); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseinteger();\n if (s2 !== peg$FAILED) {\n s3 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 91) {\n s4 = peg$c12;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c13); }\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parseidAssertion();\n if (s5 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 93) {\n s6 = peg$c14;\n peg$currPos++;\n } else {\n s6 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c15); }\n }\n if (s6 !== peg$FAILED) {\n s4 = [s4, s5, s6];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n if (s3 === peg$FAILED) {\n s3 = null;\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c16(s2, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseindirectionStep() {\n var s0, s1, s2, s3, s4, s5, s6;\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c17) {\n s1 = peg$c17;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c18); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseinteger();\n if (s2 !== peg$FAILED) {\n s3 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 91) {\n s4 = peg$c12;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c13); }\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parseidAssertion();\n if (s5 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 93) {\n s6 = peg$c14;\n peg$currPos++;\n } else {\n s6 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c15); }\n }\n if (s6 !== peg$FAILED) {\n s4 = [s4, s5, s6];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n if (s3 === peg$FAILED) {\n s3 = null;\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c19(s2, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseterminus() {\n var s0, s1, s2, s3, s4, s5, s6;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 58) {\n s1 = peg$c20;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c21); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseinteger();\n if (s2 !== peg$FAILED) {\n s3 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 91) {\n s4 = peg$c12;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c13); }\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parsetextLocationAssertion();\n if (s5 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 93) {\n s6 = peg$c14;\n peg$currPos++;\n } else {\n s6 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c15); }\n }\n if (s6 !== peg$FAILED) {\n s4 = [s4, s5, s6];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n if (s3 === peg$FAILED) {\n s3 = null;\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c22(s2, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseidAssertion() {\n var s0, s1;\n\n s0 = peg$currPos;\n s1 = peg$parsevalue();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c23(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsetextLocationAssertion() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = peg$parsecsv();\n if (s1 === peg$FAILED) {\n s1 = null;\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseparameter();\n if (s2 === peg$FAILED) {\n s2 = null;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c24(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseparameter() {\n var s0, s1, s2, s3, s4;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 59) {\n s1 = peg$c25;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c26); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parsevalueNoSpace();\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 61) {\n s3 = peg$c27;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c28); }\n }\n if (s3 !== peg$FAILED) {\n s4 = peg$parsevalueNoSpace();\n if (s4 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c29(s2, s4);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsecsv() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n s1 = peg$parsevalue();\n if (s1 === peg$FAILED) {\n s1 = null;\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s2 = peg$c5;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c6); }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parsevalue();\n if (s3 === peg$FAILED) {\n s3 = null;\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c30(s1, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsevalueNoSpace() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parseescapedSpecialChars();\n if (s2 === peg$FAILED) {\n s2 = peg$parsecharacter();\n }\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parseescapedSpecialChars();\n if (s2 === peg$FAILED) {\n s2 = peg$parsecharacter();\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c31(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsevalue() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parseescapedSpecialChars();\n if (s2 === peg$FAILED) {\n s2 = peg$parsecharacter();\n if (s2 === peg$FAILED) {\n s2 = peg$parsespace();\n }\n }\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parseescapedSpecialChars();\n if (s2 === peg$FAILED) {\n s2 = peg$parsecharacter();\n if (s2 === peg$FAILED) {\n s2 = peg$parsespace();\n }\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c31(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parseescapedSpecialChars() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n s1 = peg$currPos;\n s2 = peg$parsecircumflex();\n if (s2 !== peg$FAILED) {\n s3 = peg$parsecircumflex();\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 === peg$FAILED) {\n s1 = peg$currPos;\n s2 = peg$parsecircumflex();\n if (s2 !== peg$FAILED) {\n s3 = peg$parsesquareBracket();\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 === peg$FAILED) {\n s1 = peg$currPos;\n s2 = peg$parsecircumflex();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseparentheses();\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 === peg$FAILED) {\n s1 = peg$currPos;\n s2 = peg$parsecircumflex();\n if (s2 !== peg$FAILED) {\n s3 = peg$parsecomma();\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 === peg$FAILED) {\n s1 = peg$currPos;\n s2 = peg$parsecircumflex();\n if (s2 !== peg$FAILED) {\n s3 = peg$parsesemicolon();\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 === peg$FAILED) {\n s1 = peg$currPos;\n s2 = peg$parsecircumflex();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseequal();\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n }\n }\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c32(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsenumber() {\n var s0, s1, s2, s3, s4, s5;\n\n s0 = peg$currPos;\n s1 = peg$currPos;\n if (peg$c33.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c34); }\n }\n if (s2 !== peg$FAILED) {\n s3 = [];\n if (peg$c35.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c36); }\n }\n if (s4 !== peg$FAILED) {\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n if (peg$c35.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c36); }\n }\n }\n } else {\n s3 = peg$FAILED;\n }\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 46) {\n s2 = peg$c37;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c38); }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$currPos;\n s4 = [];\n if (peg$c35.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c36); }\n }\n while (s5 !== peg$FAILED) {\n s4.push(s5);\n if (peg$c35.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c36); }\n }\n }\n if (s4 !== peg$FAILED) {\n if (peg$c33.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c34); }\n }\n if (s5 !== peg$FAILED) {\n s4 = [s4, s5];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c39(s1, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseinteger() {\n var s0, s1, s2, s3, s4;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 48) {\n s1 = peg$c40;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c41); }\n }\n if (s1 === peg$FAILED) {\n s1 = peg$currPos;\n if (peg$c33.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c34); }\n }\n if (s2 !== peg$FAILED) {\n s3 = [];\n if (peg$c35.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c36); }\n }\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n if (peg$c35.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c36); }\n }\n }\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c42(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsespace() {\n var s0, s1;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 32) {\n s1 = peg$c43;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c44); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c45();\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsecircumflex() {\n var s0, s1;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 94) {\n s1 = peg$c46;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c47); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c48();\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsedoubleQuote() {\n var s0, s1;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 34) {\n s1 = peg$c49;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c50); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c51();\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsesquareBracket() {\n var s0, s1;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 91) {\n s1 = peg$c12;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c13); }\n }\n if (s1 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 93) {\n s1 = peg$c14;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c15); }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c52(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parseparentheses() {\n var s0, s1;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 40) {\n s1 = peg$c53;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c54); }\n }\n if (s1 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s1 = peg$c2;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c3); }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c55(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsecomma() {\n var s0, s1;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 44) {\n s1 = peg$c5;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c6); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c56();\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsesemicolon() {\n var s0, s1;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 59) {\n s1 = peg$c25;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c26); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c57();\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parseequal() {\n var s0, s1;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 61) {\n s1 = peg$c27;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c28); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c58();\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsecharacter() {\n var s0, s1;\n\n s0 = peg$currPos;\n if (peg$c59.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c60); }\n }\n if (s1 === peg$FAILED) {\n if (peg$c61.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c62); }\n }\n if (s1 === peg$FAILED) {\n if (peg$c35.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c36); }\n }\n if (s1 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 45) {\n s1 = peg$c63;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c64); }\n }\n if (s1 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 95) {\n s1 = peg$c65;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c66); }\n }\n if (s1 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 46) {\n s1 = peg$c37;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c38); }\n }\n }\n }\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c67(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n peg$result = peg$startRuleFunction();\n\n if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n return peg$result;\n } else {\n if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n peg$fail({ type: \"end\", description: \"end of input\" });\n }\n\n throw peg$buildException(\n null,\n peg$maxFailExpected,\n peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n peg$maxFailPos < input.length\n ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n );\n }\n }\n\n return {\n SyntaxError: peg$SyntaxError,\n parse: peg$parse\n };\n})();\n\ndefine(\"readium_cfi_js/cfi_parser\", (function (global) {\n return function () {\n var ret, fn;\n return ret || global.EPUBcfiParser;\n };\n}(this)));\n\n", @@ -83,11 +84,11 @@ "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/globals',['jquery','eventEmitter'], function($, EventEmitter) {\r\n/**\r\n * Top level ReadiumSDK namespace\r\n * @namespace\r\n */\r\nvar Globals = {\r\n\r\n /**\r\n * Current version of the JS SDK\r\n * @static\r\n * @return {string} version\r\n */\r\n version: function () {\r\n return \"0.8.0\";\r\n },\r\n /**\r\n * @namespace\r\n */\r\n Views: {\r\n /**\r\n * Landscape Orientation\r\n */\r\n ORIENTATION_LANDSCAPE: \"orientation_landscape\",\r\n /**\r\n * Portrait Orientation\r\n */\r\n ORIENTATION_PORTRAIT: \"orientation_portrait\"\r\n },\r\n /**\r\n * @namespace\r\n */\r\n Events: {\r\n /**\r\n * @event\r\n */\r\n READER_INITIALIZED: \"ReaderInitialized\",\r\n /**\r\n * This gets triggered on every page turnover. It includes spine information and such.\r\n * @event\r\n */\r\n PAGINATION_CHANGED: \"PaginationChanged\",\r\n /**\r\n * @event\r\n */\r\n SETTINGS_APPLIED: \"SettingsApplied\",\r\n /**\r\n * @event\r\n */\r\n FXL_VIEW_RESIZED: \"FXLViewResized\",\r\n /**\r\n * @event\r\n */\r\n READER_VIEW_CREATED: \"ReaderViewCreated\",\r\n /**\r\n * @event\r\n */\r\n READER_VIEW_DESTROYED: \"ReaderViewDestroyed\",\r\n /**\r\n * @event\r\n */\r\n CONTENT_DOCUMENT_LOAD_START: \"ContentDocumentLoadStart\",\r\n /**\r\n * @event\r\n */\r\n CONTENT_DOCUMENT_LOADED: \"ContentDocumentLoaded\",\r\n /**\r\n * @event\r\n */\r\n MEDIA_OVERLAY_STATUS_CHANGED: \"MediaOverlayStatusChanged\",\r\n /**\r\n * @event\r\n */\r\n MEDIA_OVERLAY_TTS_SPEAK: \"MediaOverlayTTSSpeak\",\r\n /**\r\n * @event\r\n */\r\n MEDIA_OVERLAY_TTS_STOP: \"MediaOverlayTTSStop\",\r\n /**\r\n * @event\r\n */\r\n PLUGINS_LOADED: \"PluginsLoaded\"\r\n },\r\n /**\r\n * Internal Events\r\n *\r\n * @desc Should not be triggered outside of {@link Views.ReaderView}.\r\n * @namespace\r\n */\r\n InternalEvents: {\r\n /**\r\n * @event\r\n */\r\n CURRENT_VIEW_PAGINATION_CHANGED: \"CurrentViewPaginationChanged\",\r\n }\r\n\r\n};\r\n$.extend(Globals, new EventEmitter());\r\n\r\nreturn Globals;\r\n\r\n});\r\n\r\n//This is default implementation of reading system object that will be available for the publication's javascript to analyze at runtime\r\n//To extend/modify/replace this object reading system should subscribe Globals.Events.READER_INITIALIZED and apply changes in reaction to this event\r\nnavigator.epubReadingSystem = {\r\n name: \"\",\r\n version: \"0.0.0\",\r\n layoutStyle: \"paginated\",\r\n\r\n hasFeature: function (feature, version) {\r\n\r\n // for now all features must be version 1.0 so fail fast if the user has asked for something else\r\n if (version && version !== \"1.0\") {\r\n return false;\r\n }\r\n\r\n if (feature === \"dom-manipulation\") {\r\n // Scripts may make structural changes to the document???s DOM (applies to spine-level scripting only).\r\n return true;\r\n }\r\n if (feature === \"layout-changes\") {\r\n // Scripts may modify attributes and CSS styles that affect content layout (applies to spine-level scripting only).\r\n return true;\r\n }\r\n if (feature === \"touch-events\") {\r\n // The device supports touch events and the Reading System passes touch events to the content.\r\n return false;\r\n }\r\n if (feature === \"mouse-events\") {\r\n // The device supports mouse events and the Reading System passes mouse events to the content.\r\n return true;\r\n }\r\n if (feature === \"keyboard-events\") {\r\n // The device supports keyboard events and the Reading System passes keyboard events to the content.\r\n return true;\r\n }\r\n\r\n if (feature === \"spine-scripting\") {\r\n //Spine-level scripting is supported.\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n};\n", "// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n\r\n//'text!empty:'\r\ndefine('readium_shared_js/globalsSetup',['jquery', 'console_shim', 'eventEmitter', 'URIjs', 'readium_cfi_js', 'readium_js_plugins', './globals'], function ($, console_shim, EventEmitter, URI, epubCfi, PluginsController, Globals) {\r\n\r\n console.log(\"Globals...\");\r\n\r\n if (window[\"ReadiumSDK\"]) {\r\n console.log(\"ReadiumSDK extend.\");\r\n $.extend(Globals, window.ReadiumSDK);\r\n } else {\r\n console.log(\"ReadiumSDK set.\");\r\n }\r\n\r\n window.ReadiumSDK = Globals;\r\n\r\n // TODO: refactor client code to use emit instead of trigger?\r\n EventEmitter.prototype.trigger = EventEmitter.prototype.emit;\r\n\r\n // TODO pass as dependency injection define() function parameter, not window global!\r\n window.EventEmitter = EventEmitter;\r\n\r\n // TODO pass as dependency injection define() function parameter, not window global!\r\n window.URI = URI;\r\n\r\n // window.URL accessor to window.webkitURL (Safari 6 support)\r\n if ('URL' in window === false) {\r\n if ('webkitURL' in window === false) {\r\n throw Error('Browser does not support window.URL');\r\n }\r\n\r\n window.URL = window.webkitURL;\r\n }\r\n // Plugins bootstrapping begins\r\n Globals.Plugins = PluginsController;\r\n Globals.on(Globals.Events.READER_INITIALIZED, function(reader) {\r\n try {\r\n PluginsController.initialize(reader);\r\n } catch (ex) {\r\n console.error(\"Plugins failed to initialize:\", ex);\r\n }\r\n\r\n _.defer(function() {\r\n console.log(\"Plugins loaded.\");\r\n Globals.emit(Globals.Events.PLUGINS_LOADED, reader);\r\n });\r\n });\r\n\r\n if (window._RJS_isBrowser) {\r\n // If under a browser env and using RequireJS, dynamically require all plugins\r\n var pluginsList = window._RJS_pluginsList;\r\n console.log(\"Plugins included: \", pluginsList.map(function(v) {\r\n // To stay consistent with bundled output\r\n return v.replace('readium_plugin_', '');\r\n }));\r\n\r\n require(pluginsList);\r\n } else {\r\n // Else list which plugins were included when using almond and bundle(s)\r\n setTimeout(function() {\r\n // Assume that in the next callback all the plugins have been registered\r\n var pluginsList = Object.keys(PluginsController.getLoadedPlugins());\r\n console.log(\"Plugins included: \", pluginsList);\r\n }, 0);\r\n }\r\n // Plugins bootstrapping ends\r\n});\r\n\ndefine('readium_shared_js', ['readium_shared_js/globalsSetup'], function (main) { return main; });\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/bookmark_data',[],function() {\r\n/**\r\n * @class Models.BookmarkData\r\n */\r\nvar BookmarkData = function(idref, contentCFI) {\r\n\r\n /**\r\n * spine item idref\r\n * @property idref\r\n * @type {string}\r\n */\r\n this.idref = idref;\r\n\r\n /**\r\n * cfi of the first visible element\r\n * @property contentCFI\r\n * @type {string}\r\n */\r\n this.contentCFI = contentCFI;\r\n\r\n this.toString = function () {\r\n return JSON.stringify(this);\r\n }\r\n};\r\n\r\nreturn BookmarkData;\r\n});\n", - "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/current_pages_info',[],function() {\r\n\r\n/**\r\n * Used to report pagination state back to the host application\r\n *\r\n * @class Models.CurrentPagesInfo\r\n *\r\n * @constructor\r\n *\r\n * @param {Models.Spine} spine\r\n * @param {boolean} isFixedLayout is fixed or reflowable spine item\r\n*/\r\nvar CurrentPagesInfo = function(spine, isFixedLayout) {\r\n\r\n\r\n this.isRightToLeft = spine.isRightToLeft();\r\n this.isFixedLayout = isFixedLayout;\r\n this.spineItemCount = spine.items.length\r\n this.openPages = [];\r\n\r\n this.addOpenPage = function(spineItemPageIndex, spineItemPageCount, idref, spineItemIndex) {\r\n this.openPages.push({spineItemPageIndex: spineItemPageIndex, spineItemPageCount: spineItemPageCount, idref: idref, spineItemIndex: spineItemIndex});\r\n\r\n this.sort();\r\n };\r\n\r\n this.canGoLeft = function () {\r\n return this.isRightToLeft ? this.canGoNext() : this.canGoPrev();\r\n };\r\n\r\n this.canGoRight = function () {\r\n return this.isRightToLeft ? this.canGoPrev() : this.canGoNext();\r\n };\r\n\r\n this.canGoNext = function() {\r\n\r\n if(this.openPages.length == 0)\r\n return false;\r\n\r\n var lastOpenPage = this.openPages[this.openPages.length - 1];\r\n\r\n // TODO: handling of non-linear spine items (\"ancillary\" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs \"go back\" feature to navigate to source hyperlink location that led to the non-linear document.\r\n // See https://github.com/readium/readium-shared-js/issues/26\r\n\r\n // Removed, needs to be implemented properly as per above.\r\n // See https://github.com/readium/readium-shared-js/issues/108\r\n // if(!spine.isValidLinearItem(lastOpenPage.spineItemIndex))\r\n // return false;\r\n\r\n return lastOpenPage.spineItemIndex < spine.last().index || lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1;\r\n };\r\n\r\n this.canGoPrev = function() {\r\n\r\n if(this.openPages.length == 0)\r\n return false;\r\n\r\n var firstOpenPage = this.openPages[0];\r\n\r\n // TODO: handling of non-linear spine items (\"ancillary\" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs \"go back\" feature to navigate to source hyperlink location that led to the non-linear document.\r\n // See https://github.com/readium/readium-shared-js/issues/26\r\n\r\n // Removed, needs to be implemented properly as per above.\r\n // //https://github.com/readium/readium-shared-js/issues/108\r\n // if(!spine.isValidLinearItem(firstOpenPage.spineItemIndex))\r\n // return false;\r\n\r\n return spine.first().index < firstOpenPage.spineItemIndex || 0 < firstOpenPage.spineItemPageIndex;\r\n };\r\n\r\n this.sort = function() {\r\n\r\n this.openPages.sort(function(a, b) {\r\n\r\n if(a.spineItemIndex != b.spineItemIndex) {\r\n return a.spineItemIndex - b.spineItemIndex;\r\n }\r\n\r\n return a.pageIndex - b.pageIndex;\r\n\r\n });\r\n\r\n };\r\n\r\n};\r\n\r\nreturn CurrentPagesInfo;\r\n});\n", + "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/current_pages_info',[],function() {\r\n\r\n/**\r\n * Used to report pagination state back to the host application\r\n *\r\n * @class Models.CurrentPagesInfo\r\n *\r\n * @constructor\r\n *\r\n * @param {Models.Spine} spine\r\n * @param {boolean} isFixedLayout is fixed or reflowable spine item\r\n*/\r\nvar CurrentPagesInfo = function(spine, isFixedLayout) {\r\n\r\n\r\n this.isRightToLeft = spine.isRightToLeft();\r\n this.isFixedLayout = isFixedLayout;\r\n this.spineItemCount = spine.items.length\r\n this.openPages = [];\r\n\r\n this.addOpenPage = function(spineItemPageIndex, spineItemPageCount, idref, spineItemIndex) {\r\n this.openPages.push({spineItemPageIndex: spineItemPageIndex, spineItemPageCount: spineItemPageCount, idref: idref, spineItemIndex: spineItemIndex});\r\n\r\n this.sort();\r\n };\r\n\r\n this.canGoLeft = function () {\r\n return this.isRightToLeft ? this.canGoNext() : this.canGoPrev();\r\n };\r\n\r\n this.canGoRight = function () {\r\n return this.isRightToLeft ? this.canGoPrev() : this.canGoNext();\r\n };\r\n\r\n this.canGoNext = function() {\r\n\r\n if(this.openPages.length == 0)\r\n return false;\r\n\r\n var lastOpenPage = this.openPages[this.openPages.length - 1];\r\n\r\n if(spine.isValidLinearItem(lastOpenPage.spineItemIndex))\r\n return lastOpenPage.spineItemIndex < spine.last().index || lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1;\r\n else\r\n return lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1;\r\n \r\n };\r\n\r\n this.canGoPrev = function() {\r\n\r\n if(this.openPages.length == 0)\r\n return false;\r\n\r\n var firstOpenPage = this.openPages[0];\r\n\r\n if(spine.isValidLinearItem(firstOpenPage.spineItemIndex))\r\n return spine.first().index < firstOpenPage.spineItemIndex || 0 < firstOpenPage.spineItemPageIndex;\r\n else\r\n return 0 < firstOpenPage.spineItemPageIndex;\r\n };\r\n\r\n this.sort = function() {\r\n\r\n this.openPages.sort(function(a, b) {\r\n\r\n if(a.spineItemIndex != b.spineItemIndex) {\r\n return a.spineItemIndex - b.spineItemIndex;\r\n }\r\n\r\n return a.pageIndex - b.pageIndex;\r\n\r\n });\r\n\r\n };\r\n\r\n};\r\n\r\nreturn CurrentPagesInfo;\r\n});\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/fixed_page_spread',[],function() {\r\n/**\r\n *\r\n * @param {Models.Spine} spine\r\n * @constructor\r\n */\r\nvar Spread = function(spine, isSyntheticSpread) {\r\n\r\n var self = this;\r\n\r\n this.spine = spine;\r\n\r\n this.leftItem = undefined;\r\n this.rightItem = undefined;\r\n this.centerItem = undefined;\r\n\r\n var _isSyntheticSpread = isSyntheticSpread;\r\n\r\n this.setSyntheticSpread = function(isSyntheticSpread) {\r\n _isSyntheticSpread = isSyntheticSpread;\r\n };\r\n\r\n this.isSyntheticSpread = function() {\r\n return _isSyntheticSpread;\r\n };\r\n\r\n this.openFirst = function() {\r\n\r\n if( this.spine.items.length == 0 ) {\r\n resetItems();\r\n }\r\n else {\r\n this.openItem(this.spine.first());\r\n }\r\n };\r\n\r\n this.openLast = function() {\r\n\r\n if( this.spine.items.length == 0 ) {\r\n resetItems();\r\n }\r\n else {\r\n this.openItem(this.spine.last());\r\n }\r\n };\r\n\r\n this.openItem = function(item) {\r\n\r\n resetItems();\r\n\r\n var position = getItemPosition(item);\r\n setItemToPosition(item, position);\r\n\r\n if(position != Spread.POSITION_CENTER && this.spine.isValidLinearItem(item.index)) { // && item.isRenditionSpreadAllowed() not necessary, see getItemPosition() below\r\n var neighbour = getNeighbourItem(item);\r\n if(neighbour) {\r\n var neighbourPos = getItemPosition(neighbour);\r\n if(neighbourPos != position\r\n && neighbourPos != Spread.POSITION_CENTER\r\n && !neighbour.isReflowable()\r\n && neighbour.isRenditionSpreadAllowed()) {\r\n setItemToPosition(neighbour, neighbourPos);\r\n }\r\n }\r\n }\r\n };\r\n\r\n function resetItems() {\r\n\r\n self.leftItem = undefined;\r\n self.rightItem = undefined;\r\n self.centerItem = undefined;\r\n }\r\n\r\n function setItemToPosition(item, position) {\r\n\r\n if(position == Spread.POSITION_LEFT) {\r\n self.leftItem = item;\r\n }\r\n else if (position == Spread.POSITION_RIGHT) {\r\n self.rightItem = item;\r\n }\r\n else {\r\n\r\n if(position != Spread.POSITION_CENTER) {\r\n console.error(\"Unrecognized position value\");\r\n }\r\n\r\n self.centerItem = item;\r\n }\r\n }\r\n\r\n function getItemPosition(item) {\r\n \r\n // includes !item.isRenditionSpreadAllowed() (\"rendition:spread-none\") ==> force center position\r\n if(!_isSyntheticSpread) {\r\n return Spread.POSITION_CENTER;\r\n }\r\n\r\n if(item.isLeftPage()) {\r\n return Spread.POSITION_LEFT;\r\n }\r\n\r\n if (item.isRightPage()) {\r\n return Spread.POSITION_RIGHT;\r\n }\r\n\r\n return Spread.POSITION_CENTER;\r\n }\r\n\r\n this.openNext = function() {\r\n\r\n var items = this.validItems();\r\n\r\n if(items.length == 0) {\r\n\r\n this.openFirst();\r\n }\r\n else {\r\n\r\n var nextItem = this.spine.nextItem(items[items.length - 1]);\r\n if(nextItem) {\r\n\r\n this.openItem(nextItem);\r\n }\r\n }\r\n };\r\n\r\n this.openPrev = function() {\r\n\r\n var items = this.validItems();\r\n\r\n if(items.length == 0) {\r\n this.openLast();\r\n }\r\n else {\r\n\r\n var prevItem = this.spine.prevItem(items[0]);\r\n if(prevItem) {\r\n\r\n this.openItem(prevItem);\r\n\r\n }\r\n }\r\n };\r\n\r\n this.validItems = function() {\r\n\r\n var arr = [];\r\n\r\n if(this.leftItem) arr.push(this.leftItem);\r\n if(this.rightItem) arr.push(this.rightItem);\r\n if(this.centerItem) arr.push(this.centerItem);\r\n\r\n arr.sort(function(a, b) {\r\n return a.index - b.index;\r\n });\r\n\r\n return arr;\r\n };\r\n\r\n function getNeighbourItem(item) {\r\n\r\n if(item.isLeftPage()) {\r\n return self.spine.isRightToLeft() ? self.spine.prevItem(item) : self.spine.nextItem(item);\r\n }\r\n\r\n if(item.isRightPage()) {\r\n return self.spine.isRightToLeft() ? self.spine.nextItem(item) : self.spine.prevItem(item);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n};\r\n\r\nSpread.POSITION_LEFT = \"left\";\r\nSpread.POSITION_RIGHT = \"right\";\r\nSpread.POSITION_CENTER = \"center\";\r\n\r\nreturn Spread;\r\n});\n", "/**\r\n * @preserve JSizes - JQuery plugin v0.33\r\n *\r\n * Licensed under the revised BSD License.\r\n * Copyright 2008-2010 Bram Stein\r\n * All rights reserved.\r\n */\r\n/*global jQuery*/\r\n(function ($) {\r\n\t'use strict';\r\n\tvar num = function (value) {\r\n\t\t\treturn parseInt(value, 10) || 0;\r\n\t\t};\r\n\r\n\t/**\r\n\t * Sets or gets the values for min-width, min-height, max-width\r\n\t * and max-height.\r\n\t */\r\n\t$.each(['min', 'max'], function (i, name) {\r\n\t\t$.fn[name + 'Size'] = function (value) {\r\n\t\t\tvar width, height;\r\n\t\t\tif (value) {\r\n\t\t\t\tif (value.width !== undefined) {\r\n\t\t\t\t\tthis.css(name + '-width', value.width);\r\n\t\t\t\t}\r\n\t\t\t\tif (value.height !== undefined) {\r\n\t\t\t\t\tthis.css(name + '-height', value.height);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = this.css(name + '-width');\r\n\t\t\t\theight = this.css(name + '-height');\r\n\t\t\t\t// Apparently:\r\n\t\t\t\t// * Opera returns -1px instead of none\r\n\t\t\t\t// * IE6 returns undefined instead of none\r\n\t\t\t\treturn {'width': (name === 'max' && (width === undefined || width === 'none' || num(width) === -1) && Number.MAX_VALUE) || num(width), \r\n\t\t\t\t\t\t'height': (name === 'max' && (height === undefined || height === 'none' || num(height) === -1) && Number.MAX_VALUE) || num(height)};\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t};\r\n\t});\r\n\r\n\t/**\r\n\t * Returns whether or not an element is visible.\r\n\t */\r\n\t$.fn.isVisible = function () {\r\n\t\treturn this.is(':visible');\r\n\t};\r\n\r\n\t/**\r\n\t * Sets or gets the values for border, margin and padding.\r\n\t */\r\n\t$.each(['border', 'margin', 'padding'], function (i, name) {\r\n\t\t$.fn[name] = function (value) {\r\n\t\t\tif (value) {\r\n\t\t\t\tif (value.top !== undefined) {\r\n\t\t\t\t\tthis.css(name + '-top' + (name === 'border' ? '-width' : ''), value.top);\r\n\t\t\t\t}\r\n\t\t\t\tif (value.bottom !== undefined) {\r\n\t\t\t\t\tthis.css(name + '-bottom' + (name === 'border' ? '-width' : ''), value.bottom);\r\n\t\t\t\t}\r\n\t\t\t\tif (value.left !== undefined) {\r\n\t\t\t\t\tthis.css(name + '-left' + (name === 'border' ? '-width' : ''), value.left);\r\n\t\t\t\t}\r\n\t\t\t\tif (value.right !== undefined) {\r\n\t\t\t\t\tthis.css(name + '-right' + (name === 'border' ? '-width' : ''), value.right);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\treturn {top: num(this.css(name + '-top' + (name === 'border' ? '-width' : ''))),\r\n\t\t\t\t\t\tbottom: num(this.css(name + '-bottom' + (name === 'border' ? '-width' : ''))),\r\n\t\t\t\t\t\tleft: num(this.css(name + '-left' + (name === 'border' ? '-width' : ''))),\r\n\t\t\t\t\t\tright: num(this.css(name + '-right' + (name === 'border' ? '-width' : '')))};\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t};\r\n\t});\r\n}(jQuery));\r\n\ndefine(\"jquerySizes\", [\"jquery\"], (function (global) {\n return function () {\n var ret, fn;\n return ret || global.jQuery;\n };\n}(this)));\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/spine_item',[], function() {\r\n\r\n/**\r\n * Wrapper of the SpineItem object received from the host application\r\n *\r\n * @class Models.SpineItem\r\n *\r\n * @param itemData spine item properties container\r\n * @param {Number} index\r\n * @param {Models.Spine} spine\r\n *\r\n */\r\nvar SpineItem = function(itemData, index, spine){\r\n\r\n var self = this;\r\n\r\n this.idref = itemData.idref;\r\n this.href = itemData.href;\r\n\r\n this.linear = itemData.linear ? itemData.linear.toLowerCase() : itemData.linear;\r\n\r\n this.page_spread = itemData.page_spread;\r\n \r\n this.rendition_viewport = itemData.rendition_viewport;\r\n \r\n this.rendition_spread = itemData.rendition_spread;\r\n \r\n //TODO: unused yet!\r\n this.rendition_orientation = itemData.rendition_orientation;\r\n\r\n this.rendition_layout = itemData.rendition_layout;\r\n \r\n this.rendition_flow = itemData.rendition_flow;\r\n \r\n \r\n \r\n this.media_overlay_id = itemData.media_overlay_id;\r\n\r\n this.media_type = itemData.media_type;\r\n\r\n this.index = index;\r\n this.spine = spine;\r\n\r\n validateSpread();\r\n\r\n this.setSpread = function(spread) {\r\n this.page_spread = spread;\r\n\r\n validateSpread();\r\n };\r\n\r\n this.isRenditionSpreadAllowed = function() {\r\n \r\n var rendition_spread = self.getRenditionSpread();\r\n return !rendition_spread || rendition_spread != SpineItem.RENDITION_SPREAD_NONE;\r\n };\r\n\r\n function validateSpread() {\r\n\r\n if(!self.page_spread) {\r\n return;\r\n }\r\n\r\n if( self.page_spread != SpineItem.SPREAD_LEFT &&\r\n self.page_spread != SpineItem.SPREAD_RIGHT &&\r\n self.page_spread != SpineItem.SPREAD_CENTER ) {\r\n\r\n console.error(self.page_spread + \" is not a recognized spread type\");\r\n }\r\n\r\n }\r\n\r\n this.isLeftPage = function() {\r\n return self.page_spread == SpineItem.SPREAD_LEFT;\r\n };\r\n\r\n this.isRightPage = function() {\r\n return self.page_spread == SpineItem.SPREAD_RIGHT;\r\n };\r\n\r\n this.isCenterPage = function() {\r\n return self.page_spread == SpineItem.SPREAD_CENTER;\r\n };\r\n\r\n this.isReflowable = function() {\r\n return !self.isFixedLayout();\r\n };\r\n\r\n this.isFixedLayout = function() {\r\n \r\n // cannot use isPropertyValueSetForItemOrPackage() here!\r\n\r\n var isLayoutExplicitlyDefined = self.getRenditionLayout();\r\n\r\n if(isLayoutExplicitlyDefined) {\r\n\r\n if (self.rendition_layout)\r\n {\r\n if (self.rendition_layout === SpineItem.RENDITION_LAYOUT_PREPAGINATED) return true;\r\n if (self.rendition_layout === SpineItem.RENDITION_LAYOUT_REFLOWABLE) return false;\r\n }\r\n\r\n return self.spine.package.isFixedLayout();\r\n }\r\n\r\n // if image or svg use fixed layout\r\n return self.media_type.indexOf(\"image/\") >= 0;\r\n\r\n };\r\n\r\n this.getRenditionFlow = function() {\r\n\r\n if(self.rendition_flow) {\r\n return self.rendition_flow;\r\n }\r\n\r\n return self.spine.package.rendition_flow;\r\n };\r\n \r\n this.getRenditionViewport = function() {\r\n\r\n if(self.rendition_viewport) {\r\n return self.rendition_viewport;\r\n }\r\n\r\n return self.spine.package.rendition_viewport;\r\n };\r\n\r\n this.getRenditionSpread = function() {\r\n\r\n if(self.rendition_spread) {\r\n return self.rendition_spread;\r\n }\r\n\r\n return self.spine.package.rendition_spread;\r\n };\r\n\r\n this.getRenditionOrientation = function() {\r\n\r\n if(self.rendition_orientation) {\r\n return self.rendition_orientation;\r\n }\r\n\r\n return self.spine.package.rendition_orientation;\r\n };\r\n\r\n this.getRenditionLayout = function() {\r\n\r\n if(self.rendition_layout) {\r\n return self.rendition_layout;\r\n }\r\n\r\n return self.spine.package.rendition_layout;\r\n };\r\n\r\n function isPropertyValueSetForItemOrPackage(propName, propValue) {\r\n\r\n if(self[propName]) {\r\n return self[propName] === propValue;\r\n }\r\n\r\n if(self.spine.package[propName]) {\r\n return self.spine.package[propName] === propValue;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n this.isFlowScrolledContinuous = function() {\r\n\r\n return isPropertyValueSetForItemOrPackage(\"rendition_flow\", SpineItem.RENDITION_FLOW_SCROLLED_CONTINUOUS);\r\n };\r\n\r\n this.isFlowScrolledDoc = function() {\r\n\r\n return isPropertyValueSetForItemOrPackage(\"rendition_flow\", SpineItem.RENDITION_FLOW_SCROLLED_DOC);\r\n };\r\n};\r\n\r\nSpineItem.RENDITION_LAYOUT_REFLOWABLE = \"reflowable\";\r\nSpineItem.RENDITION_LAYOUT_PREPAGINATED = \"pre-paginated\";\r\n\r\nSpineItem.RENDITION_ORIENTATION_LANDSCAPE = \"landscape\";\r\nSpineItem.RENDITION_ORIENTATION_PORTRAIT = \"portrait\";\r\nSpineItem.RENDITION_ORIENTATION_AUTO = \"auto\";\r\n\r\nSpineItem.SPREAD_LEFT = \"page-spread-left\";\r\nSpineItem.SPREAD_RIGHT = \"page-spread-right\";\r\nSpineItem.SPREAD_CENTER = \"page-spread-center\";\r\n\r\nSpineItem.RENDITION_SPREAD_NONE = \"none\";\r\nSpineItem.RENDITION_SPREAD_LANDSCAPE = \"landscape\";\r\nSpineItem.RENDITION_SPREAD_PORTRAIT = \"portrait\";\r\nSpineItem.RENDITION_SPREAD_BOTH = \"both\";\r\nSpineItem.RENDITION_SPREAD_AUTO = \"auto\";\r\n\r\nSpineItem.RENDITION_FLOW_PAGINATED = \"paginated\";\r\nSpineItem.RENDITION_FLOW_SCROLLED_CONTINUOUS = \"scrolled-continuous\";\r\nSpineItem.RENDITION_FLOW_SCROLLED_DOC = \"scrolled-doc\";\r\nSpineItem.RENDITION_FLOW_AUTO = \"auto\";\r\n\r\nSpineItem.alternateSpread = function(spread) {\r\n\r\n if(spread === SpineItem.SPREAD_LEFT) {\r\n return SpineItem.SPREAD_RIGHT;\r\n }\r\n\r\n if(spread === SpineItem.SPREAD_RIGHT) {\r\n return SpineItem.SPREAD_LEFT;\r\n }\r\n\r\n return spread;\r\n\r\n};\r\n return SpineItem;\r\n});\r\n\r\n\r\n\n", - "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\ndefine('readium_shared_js/helpers',['underscore', \"jquery\", \"jquerySizes\", \"./models/spine_item\", \"./globals\"], function(_, $, JQuerySizes, SpineItem, Globals) {\r\n\r\nvar Helpers = {};\r\n\r\n/**\r\n *\r\n * @param ebookURL URL string, or Blob (possibly File)\r\n * @returns string representing the file path / name from which the asset referenced by this URL originates\r\n */\r\nHelpers.getEbookUrlFilePath = function(ebookURL) {\r\n \r\n if (!window.Blob || !window.File) return ebookURL;\r\n \r\n var ebookURL_filepath = (ebookURL instanceof Blob) ? ((ebookURL instanceof File) ? ebookURL.name : \"readium-ebook.epub\") : ebookURL;\r\n return ebookURL_filepath;\r\n};\r\n\r\n/**\r\n *\r\n * @returns object (map between URL query parameter names and corresponding decoded / unescaped values)\r\n */\r\nHelpers.getURLQueryParams = function() {\r\n var params = {};\r\n\r\n var query = window.location.search;\r\n if (query && query.length) {\r\n query = query.substring(1);\r\n var keyParams = query.split('&');\r\n for (var x = 0; x < keyParams.length; x++)\r\n {\r\n var keyVal = keyParams[x].split('=');\r\n if (keyVal.length > 1) {\r\n params[keyVal[0]] = decodeURIComponent(keyVal[1]);\r\n }\r\n }\r\n }\r\n\r\n return params;\r\n};\r\n\r\n\r\n/**\r\n *\r\n * @param left\r\n * @param top\r\n * @param width\r\n * @param height\r\n * @constructor\r\n */\r\nHelpers.Rect = function (left, top, width, height) {\r\n\r\n this.left = left;\r\n this.top = top;\r\n this.width = width;\r\n this.height = height;\r\n\r\n this.right = function () {\r\n return this.left + this.width;\r\n };\r\n\r\n this.bottom = function () {\r\n return this.top + this.height;\r\n };\r\n\r\n this.isOverlap = function (rect, tolerance) {\r\n\r\n if (tolerance == undefined) {\r\n tolerance = 0;\r\n }\r\n\r\n return !(rect.right() < this.left + tolerance ||\r\n rect.left > this.right() - tolerance ||\r\n rect.bottom() < this.top + tolerance ||\r\n rect.top > this.bottom() - tolerance);\r\n }\r\n};\r\n\r\n/**\r\n *\r\n * @param $element\r\n * @returns {Helpers.Rect}\r\n */\r\n//This method treats multicolumn view as one long column and finds the rectangle of the element in this \"long\" column\r\n//we are not using jQuery Offset() and width()/height() function because for multicolumn rendition_layout it produces rectangle as a bounding box of element that\r\n// reflows between columns this is inconstant and difficult to analyze .\r\nHelpers.Rect.fromElement = function ($element) {\r\n\r\n var e;\r\n if (_.isArray($element) || $element instanceof jQuery)\r\n e = $element[0];\r\n else\r\n e = $element;\r\n // TODODM this is somewhat hacky. Text (range?) elements don't have a position so we have to ask the parent.\r\n if (e.nodeType === 3) {\r\n e = $element.parent()[0];\r\n }\r\n\r\n\r\n var offsetLeft = e.offsetLeft;\r\n var offsetTop = e.offsetTop;\r\n var offsetWidth = e.offsetWidth;\r\n var offsetHeight = e.offsetHeight;\r\n\r\n while (e = e.offsetParent) {\r\n offsetLeft += e.offsetLeft;\r\n offsetTop += e.offsetTop;\r\n }\r\n\r\n return new Helpers.Rect(offsetLeft, offsetTop, offsetWidth, offsetHeight);\r\n};\r\n\r\nHelpers.UpdateHtmlFontSize = function ($epubHtml, fontSize) {\r\n\r\n\r\n var factor = fontSize / 100;\r\n var win = $epubHtml[0].ownerDocument.defaultView;\r\n var $textblocks = $('p, div, span, h1, h2, h3, h4, h5, h6, li, blockquote, td, pre', $epubHtml);\r\n var originalLineHeight;\r\n\r\n\r\n // need to do two passes because it is possible to have nested text blocks.\r\n // If you change the font size of the parent this will then create an inaccurate\r\n // font size for any children.\r\n for (var i = 0; i < $textblocks.length; i++) {\r\n var ele = $textblocks[i],\r\n fontSizeAttr = ele.getAttribute('data-original-font-size');\r\n\r\n if (!fontSizeAttr) {\r\n var style = win.getComputedStyle(ele);\r\n var originalFontSize = parseInt(style.fontSize);\r\n originalLineHeight = parseInt(style.lineHeight);\r\n\r\n ele.setAttribute('data-original-font-size', originalFontSize);\r\n // getComputedStyle will not calculate the line-height if the value is 'normal'. In this case parseInt will return NaN\r\n if (originalLineHeight) {\r\n ele.setAttribute('data-original-line-height', originalLineHeight);\r\n }\r\n }\r\n }\r\n\r\n // reset variable so the below logic works. All variables in JS are function scoped.\r\n originalLineHeight = 0;\r\n for (var i = 0; i < $textblocks.length; i++) {\r\n var ele = $textblocks[i],\r\n fontSizeAttr = ele.getAttribute('data-original-font-size'),\r\n lineHeightAttr = ele.getAttribute('data-original-line-height'),\r\n originalFontSize = Number(fontSizeAttr);\r\n\r\n if (lineHeightAttr) {\r\n originalLineHeight = Number(lineHeightAttr);\r\n }\r\n else {\r\n originalLineHeight = 0;\r\n }\r\n\r\n ele.style.fontSize = (originalFontSize * factor) + 'px';\r\n if (originalLineHeight) {\r\n ele.style.lineHeight = (originalLineHeight * factor) + 'px';\r\n }\r\n\r\n }\r\n $epubHtml.css(\"font-size\", fontSize + \"%\");\r\n};\r\n\r\n\r\n/**\r\n *\r\n * @param contentRef\r\n * @param sourceFileHref\r\n * @returns {string}\r\n * @constructor\r\n */\r\nHelpers.ResolveContentRef = function (contentRef, sourceFileHref) {\r\n\r\n if (!sourceFileHref) {\r\n return contentRef;\r\n }\r\n\r\n var sourceParts = sourceFileHref.split(\"/\");\r\n sourceParts.pop(); //remove source file name\r\n\r\n var pathComponents = contentRef.split(\"/\");\r\n\r\n while (sourceParts.length > 0 && pathComponents[0] === \"..\") {\r\n\r\n sourceParts.pop();\r\n pathComponents.splice(0, 1);\r\n }\r\n\r\n var combined = sourceParts.concat(pathComponents);\r\n\r\n return combined.join(\"/\");\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param str\r\n * @param suffix\r\n * @returns {boolean}\r\n * @static\r\n */\r\nHelpers.EndsWith = function (str, suffix) {\r\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\r\n};\r\n\r\n/**\r\n *\r\n * @param str\r\n * @param suffix\r\n * @returns {boolean}\r\n * @static\r\n */\r\nHelpers.BeginsWith = function (str, suffix) {\r\n\r\n return str.indexOf(suffix) === 0;\r\n};\r\n\r\n/**\r\n *\r\n * @param str\r\n * @param toRemove\r\n * @returns {string}\r\n * @static\r\n */\r\nHelpers.RemoveFromString = function (str, toRemove) {\r\n\r\n var startIx = str.indexOf(toRemove);\r\n\r\n if (startIx == -1) {\r\n return str;\r\n }\r\n\r\n return str.substring(0, startIx) + str.substring(startIx + toRemove.length);\r\n};\r\n\r\n/**\r\n *\r\n * @param margin\r\n * @param border\r\n * @param padding\r\n * @constructor\r\n */\r\nHelpers.Margins = function (margin, border, padding) {\r\n\r\n this.margin = margin;\r\n this.border = border;\r\n this.padding = padding;\r\n\r\n this.left = this.margin.left + this.border.left + this.padding.left;\r\n this.right = this.margin.right + this.border.right + this.padding.right;\r\n this.top = this.margin.top + this.border.top + this.padding.top;\r\n this.bottom = this.margin.bottom + this.border.bottom + this.padding.bottom;\r\n\r\n this.width = function () {\r\n return this.left + this.right;\r\n };\r\n\r\n this.height = function () {\r\n return this.top + this.bottom;\r\n }\r\n};\r\n\r\n/**\r\n *\r\n * @param $iframe\r\n */\r\nHelpers.triggerLayout = function ($iframe) {\r\n\r\n var doc = $iframe[0].contentDocument;\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n var ss = undefined;\r\n try {\r\n ss = doc.styleSheets && doc.styleSheets.length ? doc.styleSheets[0] : undefined;\r\n if (!ss) {\r\n var style = doc.createElement('style');\r\n doc.head.appendChild(style);\r\n style.appendChild(doc.createTextNode(''));\r\n ss = style.sheet;\r\n }\r\n\r\n if (ss) {\r\n var cssRule = 'body:first-child::before {content:\\'READIUM\\';color: red;font-weight: bold;}';\r\n if (ss.cssRules) {\r\n ss.insertRule(cssRule, ss.cssRules.length);\r\n } else {\r\n ss.insertRule(cssRule, 0);\r\n }\r\n }\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n }\r\n\r\n try {\r\n var el = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"style\");\r\n el.appendChild(doc.createTextNode(\"*{}\"));\r\n doc.body.appendChild(el);\r\n doc.body.removeChild(el);\r\n\r\n if (ss) {\r\n if (ss.cssRules) {\r\n ss.deleteRule(ss.cssRules.length - 1);\r\n } else {\r\n ss.deleteRule(0);\r\n }\r\n }\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n }\r\n\r\n if (doc.body) {\r\n var val = doc.body.offsetTop; // triggers layout\r\n }\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param $viewport\r\n * @param spineItem\r\n * @param settings\r\n * @returns {boolean}\r\n */\r\n//Based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 doc\r\n// Returns falsy and truthy\r\n// true and false mean that the synthetic-spread or single-page is \"forced\" (to be respected whatever the external conditions)\r\n// 1 and 0 mean that the synthetic-spread or single-page is \"not forced\" (is allowed to be overriden by external conditions, such as optimum column width / text line number of characters, etc.)\r\nHelpers.deduceSyntheticSpread = function ($viewport, spineItem, settings) {\r\n\r\n if (!$viewport || $viewport.length == 0) {\r\n return 0; // non-forced\r\n }\r\n\r\n //http://www.idpf.org/epub/fxl/#property-spread-values\r\n\r\n var rendition_spread = spineItem ? spineItem.getRenditionSpread() : undefined;\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_NONE) {\r\n return false; // forced\r\n\r\n //\"Reading Systems must not incorporate this spine item in a synthetic spread.\"\r\n }\r\n\r\n if (settings.syntheticSpread == \"double\") {\r\n return true; // forced\r\n }\r\n else if (settings.syntheticSpread == \"single\") {\r\n return false; // forced\r\n }\r\n\r\n if (!spineItem) {\r\n return 0; // non-forced\r\n }\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_BOTH) {\r\n return true; // forced\r\n\r\n //\"Reading Systems should incorporate this spine item in a synthetic spread regardless of device orientation.\"\r\n }\r\n\r\n var orientation = Helpers.getOrientation($viewport);\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_LANDSCAPE) {\r\n return orientation === Globals.Views.ORIENTATION_LANDSCAPE; // forced\r\n\r\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in landscape orientation.\"\r\n }\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_PORTRAIT) {\r\n return orientation === Globals.Views.ORIENTATION_PORTRAIT; // forced\r\n\r\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in portrait orientation.\"\r\n }\r\n\r\n if (!rendition_spread || rendition_spread === SpineItem.RENDITION_SPREAD_AUTO) {\r\n // if no spread set in document and user didn't set in in setting we will do double for landscape\r\n var landscape = orientation === Globals.Views.ORIENTATION_LANDSCAPE;\r\n return landscape ? 1 : 0; // non-forced\r\n\r\n //\"Reading Systems may use synthetic spreads in specific or all device orientations as part of a display area utilization optimization process.\"\r\n }\r\n\r\n console.warn(\"Helpers.deduceSyntheticSpread: spread properties?!\");\r\n return 0; // non-forced\r\n};\r\n\r\n/**\r\n *\r\n * @param $element\r\n * @returns {Helpers.Rect}\r\n */\r\nHelpers.Margins.fromElement = function ($element) {\r\n return new this($element.margin(), $element.border(), $element.padding());\r\n};\r\n\r\n/**\r\n * @returns {Helpers.Rect}\r\n */\r\nHelpers.Margins.empty = function () {\r\n\r\n return new this({left: 0, right: 0, top: 0, bottom: 0}, {left: 0, right: 0, top: 0, bottom: 0}, {\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n bottom: 0\r\n });\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param name\r\n * @param params\r\n * @returns {Helpers.loadTemplate.cache}\r\n */\r\nHelpers.loadTemplate = function (name, params) {\r\n return Helpers.loadTemplate.cache[name];\r\n};\r\n\r\n/**\r\n *\r\n * @type {{fixed_book_frame: string, single_page_frame: string, scrolled_book_frame: string, reflowable_book_frame: string, reflowable_book_page_frame: string}}\r\n */\r\nHelpers.loadTemplate.cache = {\r\n \"fixed_book_frame\": '
',\r\n\r\n \"single_page_frame\": '
',\r\n //\"single_page_frame\" : '
',\r\n\r\n \"scrolled_book_frame\": '
',\r\n \"reflowable_book_frame\": '
',\r\n \"reflowable_book_page_frame\": '
'\r\n};\r\n\r\n/**\r\n *\r\n * @param styles\r\n * @param $element\r\n */\r\nHelpers.setStyles = function (styles, $element) {\r\n\r\n var count = styles.length;\r\n\r\n if (!count) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < count; i++) {\r\n var style = styles[i];\r\n if (style.selector) {\r\n $(style.selector, $element).css(style.declarations);\r\n }\r\n else {\r\n $element.css(style.declarations);\r\n }\r\n }\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param iframe\r\n * @returns {boolean}\r\n */\r\nHelpers.isIframeAlive = function (iframe) {\r\n var w = undefined;\r\n var d = undefined;\r\n try {\r\n w = iframe.contentWindow;\r\n d = iframe.contentDocument;\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n return false;\r\n }\r\n\r\n return w && d;\r\n};\r\n\r\n/**\r\n *\r\n * @param $viewport\r\n * @returns {Globals.Views.ORIENTATION_LANDSCAPE|Globals.Views.ORIENTATION_PORTRAIT}\r\n */\r\nHelpers.getOrientation = function ($viewport) {\r\n\r\n var viewportWidth = $viewport.width();\r\n var viewportHeight = $viewport.height();\r\n\r\n if (!viewportWidth || !viewportHeight) {\r\n return undefined;\r\n }\r\n\r\n return viewportWidth >= viewportHeight ? Globals.Views.ORIENTATION_LANDSCAPE : Globals.Views.ORIENTATION_PORTRAIT;\r\n};\r\n\r\n/**\r\n *\r\n * @param item\r\n * @param orientation\r\n * @returns {boolean}\r\n */\r\nHelpers.isRenditionSpreadPermittedForItem = function (item, orientation) {\r\n\r\n var rendition_spread = item.getRenditionSpread();\r\n\r\n return !rendition_spread\r\n || rendition_spread == SpineItem.RENDITION_SPREAD_BOTH\r\n || rendition_spread == SpineItem.RENDITION_SPREAD_AUTO\r\n || (rendition_spread == SpineItem.RENDITION_SPREAD_LANDSCAPE\r\n && orientation == Globals.Views.ORIENTATION_LANDSCAPE)\r\n || (rendition_spread == SpineItem.RENDITION_SPREAD_PORTRAIT\r\n && orientation == Globals.Views.ORIENTATION_PORTRAIT );\r\n};\r\n\r\nHelpers.CSSTransition = function ($el, trans) {\r\n\r\n // does not work!\r\n //$el.css('transition', trans);\r\n\r\n var css = {};\r\n // empty '' prefix FIRST!\r\n _.each(['', '-webkit-', '-moz-', '-ms-'], function (prefix) {\r\n css[prefix + 'transition'] = prefix + trans;\r\n });\r\n $el.css(css);\r\n}\r\n\r\n//scale, left, top, angle, origin\r\nHelpers.CSSTransformString = function (options) {\r\n var enable3D = options.enable3D ? true : false;\r\n\r\n var translate, scale, rotation,\r\n origin = options.origin;\r\n\r\n if (options.left || options.top) {\r\n var left = options.left || 0,\r\n top = options.top || 0;\r\n\r\n translate = enable3D ? (\"translate3D(\" + left + \"px, \" + top + \"px, 0)\") : (\"translate(\" + left + \"px, \" + top + \"px)\");\r\n }\r\n if (options.scale) {\r\n scale = enable3D ? (\"scale3D(\" + options.scale + \", \" + options.scale + \", 0)\") : (\"scale(\" + options.scale + \")\");\r\n }\r\n if (options.angle) {\r\n rotation = enable3D ? (\"rotate3D(0,0,\" + options.angle + \"deg)\") : (\"rotate(\" + options.angle + \"deg)\");\r\n }\r\n\r\n if (!(translate || scale || rotation)) {\r\n return {};\r\n }\r\n\r\n var transformString = (translate && scale) ? (translate + \" \" + scale) : (translate ? translate : scale); // the order is important!\r\n if (rotation) {\r\n transformString = transformString + \" \" + rotation;\r\n //transformString = rotation + \" \" + transformString;\r\n }\r\n\r\n var css = {};\r\n css['transform'] = transformString;\r\n css['transform-origin'] = origin ? origin : (enable3D ? '0 0 0' : '0 0');\r\n return css;\r\n};\r\n\r\nHelpers.extendedThrottle = function (startCb, tickCb, endCb, tickRate, waitThreshold, context) {\r\n if (!tickRate) tickRate = 250;\r\n if (!waitThreshold) waitThreshold = tickRate;\r\n\r\n var first = true,\r\n last,\r\n deferTimer;\r\n\r\n return function () {\r\n var ctx = context || this,\r\n now = (Date.now && Date.now()) || new Date().getTime(),\r\n args = arguments;\r\n\r\n if (!(last && now < last + tickRate)) {\r\n last = now;\r\n if (first) {\r\n startCb.apply(ctx, args);\r\n first = false;\r\n } else {\r\n tickCb.apply(ctx, args);\r\n }\r\n }\r\n\r\n clearTimeout(deferTimer);\r\n deferTimer = setTimeout(function () {\r\n last = now;\r\n first = true;\r\n endCb.apply(ctx, args);\r\n }, waitThreshold);\r\n };\r\n};\r\n\r\n\r\n//TODO: consider using CSSOM escape() or polyfill\r\n//https://github.com/mathiasbynens/CSS.escape/blob/master/css.escape.js\r\n//http://mathiasbynens.be/notes/css-escapes\r\n/**\r\n *\r\n * @param sel\r\n * @returns {string}\r\n */\r\nHelpers.escapeJQuerySelector = function (sel) {\r\n //http://api.jquery.com/category/selectors/\r\n //!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~\r\n // double backslash escape\r\n\r\n if (!sel) return undefined;\r\n\r\n var selector = sel.replace(/([;&,\\.\\+\\*\\~\\?':\"\\!\\^#$%@\\[\\]\\(\\)<=>\\|\\/\\\\{}`])/g, '\\\\$1');\r\n\r\n // if (selector !== sel)\r\n // {\r\n // console.debug(\"---- SELECTOR ESCAPED\");\r\n // console.debug(\"1: \" + sel);\r\n // console.debug(\"2: \" + selector);\r\n // }\r\n // else\r\n // {\r\n // console.debug(\"---- SELECTOR OKAY: \" + sel);\r\n // }\r\n\r\n return selector;\r\n};\r\n\r\n\r\nreturn Helpers;\r\n});\r\n\n", + "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\ndefine('readium_shared_js/helpers',['underscore', \"jquery\", \"jquerySizes\", \"./models/spine_item\", \"./globals\"], function(_, $, JQuerySizes, SpineItem, Globals) {\r\n\r\nvar Helpers = {};\r\n\r\n/**\r\n *\r\n * @param ebookURL URL string, or Blob (possibly File)\r\n * @returns string representing the file path / name from which the asset referenced by this URL originates\r\n */\r\nHelpers.getEbookUrlFilePath = function(ebookURL) {\r\n \r\n if (!window.Blob || !window.File) return ebookURL;\r\n \r\n var ebookURL_filepath = (ebookURL instanceof Blob) ? ((ebookURL instanceof File) ? ebookURL.name : \"readium-ebook.epub\") : ebookURL;\r\n return ebookURL_filepath;\r\n};\r\n\r\n/**\r\n *\r\n * @returns object (map between URL query parameter names and corresponding decoded / unescaped values)\r\n */\r\nHelpers.getURLQueryParams = function() {\r\n var params = {};\r\n\r\n var query = window.location.search;\r\n if (query && query.length) {\r\n query = query.substring(1);\r\n var keyParams = query.split('&');\r\n for (var x = 0; x < keyParams.length; x++)\r\n {\r\n var keyVal = keyParams[x].split('=');\r\n if (keyVal.length > 1) {\r\n params[keyVal[0]] = decodeURIComponent(keyVal[1]);\r\n }\r\n }\r\n }\r\n\r\n return params;\r\n};\r\n\r\n\r\n/**\r\n *\r\n * @param left\r\n * @param top\r\n * @param width\r\n * @param height\r\n * @constructor\r\n */\r\nHelpers.Rect = function (left, top, width, height) {\r\n\r\n this.left = left;\r\n this.top = top;\r\n this.width = width;\r\n this.height = height;\r\n\r\n this.right = function () {\r\n return this.left + this.width;\r\n };\r\n\r\n this.bottom = function () {\r\n return this.top + this.height;\r\n };\r\n\r\n this.isOverlap = function (rect, tolerance) {\r\n\r\n if (tolerance == undefined) {\r\n tolerance = 0;\r\n }\r\n\r\n return !(rect.right() < this.left + tolerance ||\r\n rect.left > this.right() - tolerance ||\r\n rect.bottom() < this.top + tolerance ||\r\n rect.top > this.bottom() - tolerance);\r\n }\r\n};\r\n\r\n/**\r\n *\r\n * @param $element\r\n * @returns {Helpers.Rect}\r\n */\r\n//This method treats multicolumn view as one long column and finds the rectangle of the element in this \"long\" column\r\n//we are not using jQuery Offset() and width()/height() function because for multicolumn rendition_layout it produces rectangle as a bounding box of element that\r\n// reflows between columns this is inconstant and difficult to analyze .\r\nHelpers.Rect.fromElement = function ($element) {\r\n\r\n var e;\r\n if (_.isArray($element) || $element instanceof jQuery)\r\n e = $element[0];\r\n else\r\n e = $element;\r\n // TODODM this is somewhat hacky. Text (range?) elements don't have a position so we have to ask the parent.\r\n if (e.nodeType === 3) {\r\n e = $element.parent()[0];\r\n }\r\n\r\n\r\n var offsetLeft = e.offsetLeft;\r\n var offsetTop = e.offsetTop;\r\n var offsetWidth = e.offsetWidth;\r\n var offsetHeight = e.offsetHeight;\r\n\r\n while (e = e.offsetParent) {\r\n offsetLeft += e.offsetLeft;\r\n offsetTop += e.offsetTop;\r\n }\r\n\r\n return new Helpers.Rect(offsetLeft, offsetTop, offsetWidth, offsetHeight);\r\n};\r\n\r\nHelpers.UpdateHtmlFontSize = function ($epubHtml, fontSize) {\r\n\r\n\r\n var factor = fontSize / 100;\r\n var win = $epubHtml[0].ownerDocument.defaultView;\r\n var $textblocks = $('p, div, span, h1, h2, h3, h4, h5, h6, li, blockquote, td, pre', $epubHtml);\r\n var originalLineHeight;\r\n\r\n\r\n // need to do two passes because it is possible to have nested text blocks.\r\n // If you change the font size of the parent this will then create an inaccurate\r\n // font size for any children.\r\n for (var i = 0; i < $textblocks.length; i++) {\r\n var ele = $textblocks[i],\r\n fontSizeAttr = ele.getAttribute('data-original-font-size');\r\n\r\n if (!fontSizeAttr) {\r\n var style = win.getComputedStyle(ele);\r\n var originalFontSize = parseInt(style.fontSize);\r\n originalLineHeight = parseInt(style.lineHeight);\r\n\r\n ele.setAttribute('data-original-font-size', originalFontSize);\r\n // getComputedStyle will not calculate the line-height if the value is 'normal'. In this case parseInt will return NaN\r\n if (originalLineHeight) {\r\n ele.setAttribute('data-original-line-height', originalLineHeight);\r\n }\r\n }\r\n }\r\n\r\n // reset variable so the below logic works. All variables in JS are function scoped.\r\n originalLineHeight = 0;\r\n for (var i = 0; i < $textblocks.length; i++) {\r\n var ele = $textblocks[i],\r\n fontSizeAttr = ele.getAttribute('data-original-font-size'),\r\n lineHeightAttr = ele.getAttribute('data-original-line-height'),\r\n originalFontSize = Number(fontSizeAttr);\r\n\r\n if (lineHeightAttr) {\r\n originalLineHeight = Number(lineHeightAttr);\r\n }\r\n else {\r\n originalLineHeight = 0;\r\n }\r\n\r\n $(ele).css(\"font-size\", (originalFontSize * factor) + 'px');\r\n if (originalLineHeight) {\r\n $(ele).css(\"line-height\", (originalLineHeight * factor) + 'px');\r\n }\r\n\r\n }\r\n $epubHtml.css(\"font-size\", fontSize + \"%\");\r\n};\r\n\r\n\r\n/**\r\n *\r\n * @param contentRef\r\n * @param sourceFileHref\r\n * @returns {string}\r\n * @constructor\r\n */\r\nHelpers.ResolveContentRef = function (contentRef, sourceFileHref) {\r\n\r\n if (!sourceFileHref) {\r\n return contentRef;\r\n }\r\n\r\n var sourceParts = sourceFileHref.split(\"/\");\r\n sourceParts.pop(); //remove source file name\r\n\r\n var pathComponents = contentRef.split(\"/\");\r\n\r\n while (sourceParts.length > 0 && pathComponents[0] === \"..\") {\r\n\r\n sourceParts.pop();\r\n pathComponents.splice(0, 1);\r\n }\r\n\r\n var combined = sourceParts.concat(pathComponents);\r\n\r\n return combined.join(\"/\");\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param str\r\n * @param suffix\r\n * @returns {boolean}\r\n * @static\r\n */\r\nHelpers.EndsWith = function (str, suffix) {\r\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\r\n};\r\n\r\n/**\r\n *\r\n * @param str\r\n * @param suffix\r\n * @returns {boolean}\r\n * @static\r\n */\r\nHelpers.BeginsWith = function (str, suffix) {\r\n\r\n return str.indexOf(suffix) === 0;\r\n};\r\n\r\n/**\r\n *\r\n * @param str\r\n * @param toRemove\r\n * @returns {string}\r\n * @static\r\n */\r\nHelpers.RemoveFromString = function (str, toRemove) {\r\n\r\n var startIx = str.indexOf(toRemove);\r\n\r\n if (startIx == -1) {\r\n return str;\r\n }\r\n\r\n return str.substring(0, startIx) + str.substring(startIx + toRemove.length);\r\n};\r\n\r\n/**\r\n *\r\n * @param margin\r\n * @param border\r\n * @param padding\r\n * @constructor\r\n */\r\nHelpers.Margins = function (margin, border, padding) {\r\n\r\n this.margin = margin;\r\n this.border = border;\r\n this.padding = padding;\r\n\r\n this.left = this.margin.left + this.border.left + this.padding.left;\r\n this.right = this.margin.right + this.border.right + this.padding.right;\r\n this.top = this.margin.top + this.border.top + this.padding.top;\r\n this.bottom = this.margin.bottom + this.border.bottom + this.padding.bottom;\r\n\r\n this.width = function () {\r\n return this.left + this.right;\r\n };\r\n\r\n this.height = function () {\r\n return this.top + this.bottom;\r\n }\r\n};\r\n\r\n/**\r\n *\r\n * @param $iframe\r\n */\r\nHelpers.triggerLayout = function ($iframe) {\r\n\r\n var doc = $iframe[0].contentDocument;\r\n\r\n if (!doc) {\r\n return;\r\n }\r\n\r\n var ss = undefined;\r\n try {\r\n ss = doc.styleSheets && doc.styleSheets.length ? doc.styleSheets[0] : undefined;\r\n if (!ss) {\r\n var style = doc.createElement('style');\r\n doc.head.appendChild(style);\r\n style.appendChild(doc.createTextNode(''));\r\n ss = style.sheet;\r\n }\r\n\r\n if (ss) {\r\n var cssRule = 'body:first-child::before {content:\\'READIUM\\';color: red;font-weight: bold;}';\r\n if (ss.cssRules) {\r\n ss.insertRule(cssRule, ss.cssRules.length);\r\n } else {\r\n ss.insertRule(cssRule, 0);\r\n }\r\n }\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n }\r\n\r\n try {\r\n var el = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"style\");\r\n el.appendChild(doc.createTextNode(\"*{}\"));\r\n doc.body.appendChild(el);\r\n doc.body.removeChild(el);\r\n\r\n if (ss) {\r\n if (ss.cssRules) {\r\n ss.deleteRule(ss.cssRules.length - 1);\r\n } else {\r\n ss.deleteRule(0);\r\n }\r\n }\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n }\r\n\r\n if (doc.body) {\r\n var val = doc.body.offsetTop; // triggers layout\r\n }\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param $viewport\r\n * @param spineItem\r\n * @param settings\r\n * @returns {boolean}\r\n */\r\n//Based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 doc\r\n// Returns falsy and truthy\r\n// true and false mean that the synthetic-spread or single-page is \"forced\" (to be respected whatever the external conditions)\r\n// 1 and 0 mean that the synthetic-spread or single-page is \"not forced\" (is allowed to be overriden by external conditions, such as optimum column width / text line number of characters, etc.)\r\nHelpers.deduceSyntheticSpread = function ($viewport, spineItem, settings) {\r\n\r\n if (!$viewport || $viewport.length == 0) {\r\n return 0; // non-forced\r\n }\r\n\r\n //http://www.idpf.org/epub/fxl/#property-spread-values\r\n\r\n var rendition_spread = spineItem ? spineItem.getRenditionSpread() : undefined;\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_NONE) {\r\n return false; // forced\r\n\r\n //\"Reading Systems must not incorporate this spine item in a synthetic spread.\"\r\n }\r\n\r\n if (settings.syntheticSpread == \"double\") {\r\n return true; // forced\r\n }\r\n else if (settings.syntheticSpread == \"single\") {\r\n return false; // forced\r\n }\r\n\r\n if (!spineItem) {\r\n return 0; // non-forced\r\n }\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_BOTH) {\r\n return true; // forced\r\n\r\n //\"Reading Systems should incorporate this spine item in a synthetic spread regardless of device orientation.\"\r\n }\r\n\r\n var orientation = Helpers.getOrientation($viewport);\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_LANDSCAPE) {\r\n return orientation === Globals.Views.ORIENTATION_LANDSCAPE; // forced\r\n\r\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in landscape orientation.\"\r\n }\r\n\r\n if (rendition_spread === SpineItem.RENDITION_SPREAD_PORTRAIT) {\r\n return orientation === Globals.Views.ORIENTATION_PORTRAIT; // forced\r\n\r\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in portrait orientation.\"\r\n }\r\n\r\n if (!rendition_spread || rendition_spread === SpineItem.RENDITION_SPREAD_AUTO) {\r\n // if no spread set in document and user didn't set in in setting we will do double for landscape\r\n var landscape = orientation === Globals.Views.ORIENTATION_LANDSCAPE;\r\n return landscape ? 1 : 0; // non-forced\r\n\r\n //\"Reading Systems may use synthetic spreads in specific or all device orientations as part of a display area utilization optimization process.\"\r\n }\r\n\r\n console.warn(\"Helpers.deduceSyntheticSpread: spread properties?!\");\r\n return 0; // non-forced\r\n};\r\n\r\n/**\r\n *\r\n * @param $element\r\n * @returns {Helpers.Rect}\r\n */\r\nHelpers.Margins.fromElement = function ($element) {\r\n return new this($element.margin(), $element.border(), $element.padding());\r\n};\r\n\r\n/**\r\n * @returns {Helpers.Rect}\r\n */\r\nHelpers.Margins.empty = function () {\r\n\r\n return new this({left: 0, right: 0, top: 0, bottom: 0}, {left: 0, right: 0, top: 0, bottom: 0}, {\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n bottom: 0\r\n });\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param name\r\n * @param params\r\n * @returns {Helpers.loadTemplate.cache}\r\n */\r\nHelpers.loadTemplate = function (name, params) {\r\n return Helpers.loadTemplate.cache[name];\r\n};\r\n\r\n/**\r\n *\r\n * @type {{fixed_book_frame: string, single_page_frame: string, scrolled_book_frame: string, reflowable_book_frame: string, reflowable_book_page_frame: string}}\r\n */\r\nHelpers.loadTemplate.cache = {\r\n \"fixed_book_frame\": '
',\r\n\r\n \"single_page_frame\": '
',\r\n //\"single_page_frame\" : '
',\r\n\r\n \"scrolled_book_frame\": '
',\r\n \"reflowable_book_frame\": '
',\r\n \"reflowable_book_page_frame\": '
'\r\n};\r\n\r\n/**\r\n *\r\n * @param styles\r\n * @param $element\r\n */\r\nHelpers.setStyles = function (styles, $element) {\r\n\r\n var count = styles.length;\r\n\r\n if (!count) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < count; i++) {\r\n var style = styles[i];\r\n if (style.selector) {\r\n $(style.selector, $element).css(style.declarations);\r\n }\r\n else {\r\n $element.css(style.declarations);\r\n }\r\n }\r\n\r\n};\r\n\r\n/**\r\n *\r\n * @param iframe\r\n * @returns {boolean}\r\n */\r\nHelpers.isIframeAlive = function (iframe) {\r\n var w = undefined;\r\n var d = undefined;\r\n try {\r\n w = iframe.contentWindow;\r\n d = iframe.contentDocument;\r\n }\r\n catch (ex) {\r\n console.error(ex);\r\n return false;\r\n }\r\n\r\n return w && d;\r\n};\r\n\r\n/**\r\n *\r\n * @param $viewport\r\n * @returns {Globals.Views.ORIENTATION_LANDSCAPE|Globals.Views.ORIENTATION_PORTRAIT}\r\n */\r\nHelpers.getOrientation = function ($viewport) {\r\n\r\n var viewportWidth = $viewport.width();\r\n var viewportHeight = $viewport.height();\r\n\r\n if (!viewportWidth || !viewportHeight) {\r\n return undefined;\r\n }\r\n\r\n return viewportWidth >= viewportHeight ? Globals.Views.ORIENTATION_LANDSCAPE : Globals.Views.ORIENTATION_PORTRAIT;\r\n};\r\n\r\n/**\r\n *\r\n * @param item\r\n * @param orientation\r\n * @returns {boolean}\r\n */\r\nHelpers.isRenditionSpreadPermittedForItem = function (item, orientation) {\r\n\r\n var rendition_spread = item.getRenditionSpread();\r\n\r\n return !rendition_spread\r\n || rendition_spread == SpineItem.RENDITION_SPREAD_BOTH\r\n || rendition_spread == SpineItem.RENDITION_SPREAD_AUTO\r\n || (rendition_spread == SpineItem.RENDITION_SPREAD_LANDSCAPE\r\n && orientation == Globals.Views.ORIENTATION_LANDSCAPE)\r\n || (rendition_spread == SpineItem.RENDITION_SPREAD_PORTRAIT\r\n && orientation == Globals.Views.ORIENTATION_PORTRAIT );\r\n};\r\n\r\nHelpers.CSSTransition = function ($el, trans) {\r\n\r\n // does not work!\r\n //$el.css('transition', trans);\r\n\r\n var css = {};\r\n // empty '' prefix FIRST!\r\n _.each(['', '-webkit-', '-moz-', '-ms-'], function (prefix) {\r\n css[prefix + 'transition'] = prefix + trans;\r\n });\r\n $el.css(css);\r\n}\r\n\r\n//scale, left, top, angle, origin\r\nHelpers.CSSTransformString = function (options) {\r\n var enable3D = options.enable3D ? true : false;\r\n\r\n var translate, scale, rotation,\r\n origin = options.origin;\r\n\r\n if (options.left || options.top) {\r\n var left = options.left || 0,\r\n top = options.top || 0;\r\n\r\n translate = enable3D ? (\"translate3D(\" + left + \"px, \" + top + \"px, 0)\") : (\"translate(\" + left + \"px, \" + top + \"px)\");\r\n }\r\n if (options.scale) {\r\n scale = enable3D ? (\"scale3D(\" + options.scale + \", \" + options.scale + \", 0)\") : (\"scale(\" + options.scale + \")\");\r\n }\r\n if (options.angle) {\r\n rotation = enable3D ? (\"rotate3D(0,0,\" + options.angle + \"deg)\") : (\"rotate(\" + options.angle + \"deg)\");\r\n }\r\n\r\n if (!(translate || scale || rotation)) {\r\n return {};\r\n }\r\n\r\n var transformString = (translate && scale) ? (translate + \" \" + scale) : (translate ? translate : scale); // the order is important!\r\n if (rotation) {\r\n transformString = transformString + \" \" + rotation;\r\n //transformString = rotation + \" \" + transformString;\r\n }\r\n\r\n var css = {};\r\n css['transform'] = transformString;\r\n css['transform-origin'] = origin ? origin : (enable3D ? '0 0 0' : '0 0');\r\n return css;\r\n};\r\n\r\nHelpers.extendedThrottle = function (startCb, tickCb, endCb, tickRate, waitThreshold, context) {\r\n if (!tickRate) tickRate = 250;\r\n if (!waitThreshold) waitThreshold = tickRate;\r\n\r\n var first = true,\r\n last,\r\n deferTimer;\r\n\r\n return function () {\r\n var ctx = context || this,\r\n now = (Date.now && Date.now()) || new Date().getTime(),\r\n args = arguments;\r\n\r\n if (!(last && now < last + tickRate)) {\r\n last = now;\r\n if (first) {\r\n startCb.apply(ctx, args);\r\n first = false;\r\n } else {\r\n tickCb.apply(ctx, args);\r\n }\r\n }\r\n\r\n clearTimeout(deferTimer);\r\n deferTimer = setTimeout(function () {\r\n last = now;\r\n first = true;\r\n endCb.apply(ctx, args);\r\n }, waitThreshold);\r\n };\r\n};\r\n\r\n\r\n//TODO: consider using CSSOM escape() or polyfill\r\n//https://github.com/mathiasbynens/CSS.escape/blob/master/css.escape.js\r\n//http://mathiasbynens.be/notes/css-escapes\r\n/**\r\n *\r\n * @param sel\r\n * @returns {string}\r\n */\r\nHelpers.escapeJQuerySelector = function (sel) {\r\n //http://api.jquery.com/category/selectors/\r\n //!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~\r\n // double backslash escape\r\n\r\n if (!sel) return undefined;\r\n\r\n var selector = sel.replace(/([;&,\\.\\+\\*\\~\\?':\"\\!\\^#$%@\\[\\]\\(\\)<=>\\|\\/\\\\{}`])/g, '\\\\$1');\r\n\r\n // if (selector !== sel)\r\n // {\r\n // console.debug(\"---- SELECTOR ESCAPED\");\r\n // console.debug(\"1: \" + sel);\r\n // console.debug(\"2: \" + selector);\r\n // }\r\n // else\r\n // {\r\n // console.debug(\"---- SELECTOR OKAY: \" + sel);\r\n // }\r\n\r\n return selector;\r\n};\r\n\r\n\r\nreturn Helpers;\r\n});\r\n\n", "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n/**\r\n * CFI navigation helper class\r\n *\r\n * @param $viewport\r\n * @param $iframe\r\n * @param options Additional settings for NavigationLogic object\r\n * - rectangleBased If truthy, clientRect-based geometry will be used\r\n * - paginationInfo Layout details, used by clientRect-based geometry\r\n * @constructor\r\n */\r\ndefine('readium_shared_js/views/cfi_navigation_logic',[\"jquery\", \"underscore\", \"../helpers\", 'readium_cfi_js'], function($, _, Helpers, epubCfi) {\r\n\r\nvar CfiNavigationLogic = function($viewport, $iframe, options){\r\n\r\n options = options || {};\r\n\r\n this.getRootElement = function(){\r\n\r\n return $iframe[0].contentDocument.documentElement;\r\n };\r\n \r\n // FIXED LAYOUT if (!options.rectangleBased) alert(\"!!!options.rectangleBased\");\r\n \r\n var visibilityCheckerFunc = options.rectangleBased\r\n ? checkVisibilityByRectangles\r\n : checkVisibilityByVerticalOffsets;\r\n\r\n /**\r\n * @private\r\n * Checks whether or not pages are rendered right-to-left\r\n *\r\n * @returns {boolean}\r\n */\r\n function isPageProgressionRightToLeft() {\r\n return options.paginationInfo && !!options.paginationInfo.rightToLeft;\r\n }\r\n\r\n /**\r\n * @private\r\n * Checks whether or not pages are rendered with vertical writing mode\r\n *\r\n * @returns {boolean}\r\n */\r\n function isVerticalWritingMode() {\r\n return options.paginationInfo && !!options.paginationInfo.isVerticalWritingMode;\r\n }\r\n\r\n\r\n /**\r\n * @private\r\n * Checks whether or not a (fully adjusted) rectangle is at least partly visible\r\n *\r\n * @param {Object} rect\r\n * @param {Object} frameDimensions\r\n * @param {boolean} [isVwm] isVerticalWritingMode\r\n * @returns {boolean}\r\n */\r\n function isRectVisible(rect, frameDimensions, isVwm) {\r\n if (isVwm) {\r\n return rect.top >= 0 && rect.top < frameDimensions.height;\r\n }\r\n return rect.left >= 0 && rect.left < frameDimensions.width;\r\n }\r\n\r\n /**\r\n * @private\r\n * Retrieves _current_ full width of a column (including its gap)\r\n *\r\n * @returns {number} Full width of a column in pixels\r\n */\r\n function getColumnFullWidth() {\r\n \r\n if (!options.paginationInfo || isVerticalWritingMode())\r\n {\r\n return $iframe.width();\r\n }\r\n \r\n return options.paginationInfo.columnWidth + options.paginationInfo.columnGap;\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * Retrieves _current_ offset of a viewport\r\n * (related to the beginning of the chapter)\r\n *\r\n * @returns {Object}\r\n */\r\n function getVisibleContentOffsets() {\r\n if(isVerticalWritingMode()){\r\n return {\r\n top: (options.paginationInfo ? options.paginationInfo.pageOffset : 0)\r\n };\r\n }\r\n return {\r\n left: (options.paginationInfo ? options.paginationInfo.pageOffset : 0)\r\n * (isPageProgressionRightToLeft() ? -1 : 1)\r\n };\r\n }\r\n\r\n // Old (offsetTop-based) algorithm, useful in top-to-bottom layouts\r\n function checkVisibilityByVerticalOffsets(\r\n $element, visibleContentOffsets, shouldCalculateVisibilityOffset) {\r\n\r\n var elementRect = Helpers.Rect.fromElement($element);\r\n if (_.isNaN(elementRect.left)) {\r\n // this is actually a point element, doesnt have a bounding rectangle\r\n elementRect = new Helpers.Rect(\r\n $element.position().top, $element.position().left, 0, 0);\r\n }\r\n var topOffset = visibleContentOffsets.top || 0;\r\n var isBelowVisibleTop = elementRect.bottom() > topOffset;\r\n var isAboveVisibleBottom = visibleContentOffsets.bottom !== undefined\r\n ? elementRect.top < visibleContentOffsets.bottom\r\n : true; //this check always passed, if corresponding offset isn't set\r\n\r\n var percentOfElementHeight = 0;\r\n if (isBelowVisibleTop && isAboveVisibleBottom) { // element is visible\r\n if (!shouldCalculateVisibilityOffset) {\r\n return 100;\r\n }\r\n else if (elementRect.top <= topOffset) {\r\n percentOfElementHeight = Math.ceil(\r\n 100 * (topOffset - elementRect.top) / elementRect.height\r\n );\r\n\r\n // below goes another algorithm, which has been used in getVisibleElements pattern,\r\n // but it seems to be a bit incorrect\r\n // (as spatial offset should be measured at the first visible point of the element):\r\n //\r\n // var visibleTop = Math.max(elementRect.top, visibleContentOffsets.top);\r\n // var visibleBottom = Math.min(elementRect.bottom(), visibleContentOffsets.bottom);\r\n // var visibleHeight = visibleBottom - visibleTop;\r\n // var percentVisible = Math.round((visibleHeight / elementRect.height) * 100);\r\n }\r\n return 100 - percentOfElementHeight;\r\n }\r\n return 0; // element isn't visible\r\n }\r\n\r\n /**\r\n * New (rectangle-based) algorithm, useful in multi-column layouts\r\n *\r\n * Note: the second param (props) is ignored intentionally\r\n * (no need to use those in normalization)\r\n *\r\n * @param {jQuery} $element\r\n * @param {Object} _props\r\n * @param {boolean} shouldCalculateVisibilityPercentage\r\n * @returns {number|null}\r\n * 0 for non-visible elements,\r\n * 0 < n <= 100 for visible elements\r\n * (will just give 100, if `shouldCalculateVisibilityPercentage` => false)\r\n * null for elements with display:none\r\n */\r\n function checkVisibilityByRectangles(\r\n $element, _props, shouldCalculateVisibilityPercentage) {\r\n\r\n var elementRectangles = getNormalizedRectangles($element);\r\n var clientRectangles = elementRectangles.clientRectangles;\r\n if (clientRectangles.length === 0) { // elements with display:none, etc.\r\n return null;\r\n }\r\n\r\n var isRtl = isPageProgressionRightToLeft();\r\n var isVwm = isVerticalWritingMode();\r\n var columnFullWidth = getColumnFullWidth();\r\n var frameDimensions = {\r\n width: $iframe.width(),\r\n height: $iframe.height()\r\n };\r\n\r\n if (clientRectangles.length === 1) {\r\n // because of webkit inconsistency, that single rectangle should be adjusted\r\n // until it hits the end OR will be based on the FIRST column that is visible\r\n adjustRectangle(clientRectangles[0], frameDimensions, columnFullWidth,\r\n isRtl, isVwm, true);\r\n }\r\n\r\n // for an element split between several CSS columns,\r\n // both Firefox and IE produce as many client rectangles;\r\n // each of those should be checked\r\n var visibilityPercentage = 0;\r\n for (var i = 0, l = clientRectangles.length; i < l; ++i) {\r\n if (isRectVisible(clientRectangles[i], frameDimensions, isVwm)) {\r\n visibilityPercentage = shouldCalculateVisibilityPercentage\r\n ? measureVisibilityPercentageByRectangles(clientRectangles, i)\r\n : 100;\r\n break;\r\n }\r\n }\r\n return visibilityPercentage;\r\n }\r\n\r\n /**\r\n * Finds a page index (0-based) for a specific element.\r\n * Calculations are based on rectangles retrieved with getClientRects() method.\r\n *\r\n * @param {jQuery} $element\r\n * @param {number} spatialVerticalOffset\r\n * @returns {number|null}\r\n */\r\n function findPageByRectangles($element, spatialVerticalOffset) {\r\n var visibleContentOffsets = getVisibleContentOffsets();\r\n var elementRectangles = getNormalizedRectangles($element, visibleContentOffsets);\r\n var clientRectangles = elementRectangles.clientRectangles;\r\n if (clientRectangles.length === 0) { // elements with display:none, etc.\r\n return null;\r\n }\r\n\r\n var isRtl = isPageProgressionRightToLeft();\r\n var isVwm = isVerticalWritingMode();\r\n var columnFullWidth = getColumnFullWidth();\r\n\r\n var frameHeight = $iframe.height();\r\n var frameWidth = $iframe.width();\r\n\r\n if (spatialVerticalOffset) {\r\n trimRectanglesByVertOffset(clientRectangles, spatialVerticalOffset,\r\n frameHeight, columnFullWidth, isRtl, isVwm);\r\n }\r\n\r\n var firstRectangle = _.first(clientRectangles);\r\n if (clientRectangles.length === 1) {\r\n adjustRectangle(firstRectangle, {\r\n height: frameHeight, width: frameWidth\r\n }, columnFullWidth, isRtl, isVwm);\r\n }\r\n\r\n var pageIndex;\r\n\r\n if (isVwm) {\r\n var topOffset = firstRectangle.top;\r\n pageIndex = Math.floor(topOffset / frameHeight);\r\n } else {\r\n var leftOffset = firstRectangle.left;\r\n if (isRtl) {\r\n leftOffset = (columnFullWidth * (options.paginationInfo ? options.paginationInfo.visibleColumnCount : 1)) - leftOffset;\r\n }\r\n pageIndex = Math.floor(leftOffset / columnFullWidth);\r\n }\r\n\r\n if (pageIndex < 0) {\r\n pageIndex = 0;\r\n }\r\n else if (pageIndex >= (options.paginationInfo ? options.paginationInfo.columnCount : 1)) {\r\n pageIndex = (options.paginationInfo ? (options.paginationInfo.columnCount - 1) : 0);\r\n }\r\n\r\n return pageIndex;\r\n }\r\n\r\n /**\r\n * @private\r\n * Calculates the visibility offset percentage based on ClientRect dimensions\r\n *\r\n * @param {Array} clientRectangles (should already be normalized)\r\n * @param {number} firstVisibleRectIndex\r\n * @returns {number} - visibility percentage (0 < n <= 100)\r\n */\r\n function measureVisibilityPercentageByRectangles(\r\n clientRectangles, firstVisibleRectIndex) {\r\n\r\n var heightTotal = 0;\r\n var heightVisible = 0;\r\n\r\n if (clientRectangles.length > 1) {\r\n _.each(clientRectangles, function(rect, index) {\r\n heightTotal += rect.height;\r\n if (index >= firstVisibleRectIndex) {\r\n // in this case, all the rectangles after the first visible\r\n // should be counted as visible\r\n heightVisible += rect.height;\r\n }\r\n });\r\n }\r\n else {\r\n // should already be normalized and adjusted\r\n heightTotal = clientRectangles[0].height;\r\n heightVisible = clientRectangles[0].height - Math.max(\r\n 0, -clientRectangles[0].top);\r\n }\r\n return heightVisible === heightTotal\r\n ? 100 // trivial case: element is 100% visible\r\n : Math.floor(100 * heightVisible / heightTotal);\r\n }\r\n\r\n /**\r\n * @private\r\n * Retrieves the position of $element in multi-column layout\r\n *\r\n * @param {jQuery} $el\r\n * @param {Object} [visibleContentOffsets]\r\n * @returns {Object}\r\n */\r\n function getNormalizedRectangles($el, visibleContentOffsets) {\r\n\r\n visibleContentOffsets = visibleContentOffsets || {};\r\n var leftOffset = visibleContentOffsets.left || 0;\r\n var topOffset = visibleContentOffsets.top || 0;\r\n\r\n // union of all rectangles wrapping the element\r\n var wrapperRectangle = normalizeRectangle(\r\n $el[0].getBoundingClientRect(), leftOffset, topOffset);\r\n\r\n // all the separate rectangles (for detecting position of the element\r\n // split between several columns)\r\n var clientRectangles = [];\r\n var clientRectList = $el[0].getClientRects();\r\n for (var i = 0, l = clientRectList.length; i < l; ++i) {\r\n if (clientRectList[i].height > 0) {\r\n // Firefox sometimes gets it wrong,\r\n // adding literally empty (height = 0) client rectangle preceding the real one,\r\n // that empty client rectanle shouldn't be retrieved\r\n clientRectangles.push(\r\n normalizeRectangle(clientRectList[i], leftOffset, topOffset));\r\n }\r\n }\r\n\r\n if (clientRectangles.length === 0) {\r\n // sometimes an element is either hidden or empty, and that means\r\n // Webkit-based browsers fail to assign proper clientRects to it\r\n // in this case we need to go for its sibling (if it exists)\r\n $el = $el.next();\r\n if ($el.length) {\r\n return getNormalizedRectangles($el, visibleContentOffsets);\r\n }\r\n }\r\n\r\n return {\r\n wrapperRectangle: wrapperRectangle,\r\n clientRectangles: clientRectangles\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * Converts TextRectangle object into a plain object,\r\n * taking content offsets (=scrolls, position shifts etc.) into account\r\n *\r\n * @param {TextRectangle} textRect\r\n * @param {number} leftOffset\r\n * @param {number} topOffset\r\n * @returns {Object}\r\n */\r\n function normalizeRectangle(textRect, leftOffset, topOffset) {\r\n\r\n var plainRectObject = {\r\n left: textRect.left,\r\n right: textRect.right,\r\n top: textRect.top,\r\n bottom: textRect.bottom,\r\n width: textRect.right - textRect.left,\r\n height: textRect.bottom - textRect.top\r\n };\r\n offsetRectangle(plainRectObject, leftOffset, topOffset);\r\n return plainRectObject;\r\n }\r\n\r\n /**\r\n * @private\r\n * Offsets plain object (which represents a TextRectangle).\r\n *\r\n * @param {Object} rect\r\n * @param {number} leftOffset\r\n * @param {number} topOffset\r\n */\r\n function offsetRectangle(rect, leftOffset, topOffset) {\r\n\r\n rect.left += leftOffset;\r\n rect.right += leftOffset;\r\n rect.top += topOffset;\r\n rect.bottom += topOffset;\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * When element is spilled over two or more columns,\r\n * most of the time Webkit-based browsers\r\n * still assign a single clientRectangle to it, setting its `top` property to negative value\r\n * (so it looks like it's rendered based on the second column)\r\n * Alas, sometimes they decide to continue the leftmost column - from _below_ its real height.\r\n * In this case, `bottom` property is actually greater than element's height and had to be adjusted accordingly.\r\n *\r\n * Ugh.\r\n *\r\n * @param {Object} rect\r\n * @param {Object} frameDimensions\r\n * @param {number} columnFullWidth\r\n * @param {boolean} isRtl\r\n * @param {boolean} isVwm isVerticalWritingMode\r\n * @param {boolean} shouldLookForFirstVisibleColumn\r\n * If set, there'll be two-phase adjustment\r\n * (to align a rectangle with a viewport)\r\n\r\n */\r\n function adjustRectangle(rect, frameDimensions, columnFullWidth, isRtl, isVwm,\r\n shouldLookForFirstVisibleColumn) {\r\n\r\n // Rectangle adjustment is not needed in VWM since it does not deal with columns\r\n if (isVwm) {\r\n return;\r\n }\r\n\r\n if (isRtl) {\r\n columnFullWidth *= -1; // horizontal shifts are reverted in RTL mode\r\n }\r\n\r\n // first we go left/right (rebasing onto the very first column available)\r\n while (rect.top < 0) {\r\n offsetRectangle(rect, -columnFullWidth, frameDimensions.height);\r\n }\r\n\r\n // ... then, if necessary (for visibility offset checks),\r\n // each column is tried again (now in reverse order)\r\n // the loop will be stopped when the column is aligned with a viewport\r\n // (i.e., is the first visible one).\r\n if (shouldLookForFirstVisibleColumn) {\r\n while (rect.bottom >= frameDimensions.height) {\r\n if (isRectVisible(rect, frameDimensions, isVwm)) {\r\n break;\r\n }\r\n offsetRectangle(rect, columnFullWidth, -frameDimensions.height);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * Trims the rectangle(s) representing the given element.\r\n *\r\n * @param {Array} rects\r\n * @param {number} verticalOffset\r\n * @param {number} frameHeight\r\n * @param {number} columnFullWidth\r\n * @param {boolean} isRtl\r\n * @param {boolean} isVwm isVerticalWritingMode\r\n */\r\n function trimRectanglesByVertOffset(\r\n rects, verticalOffset, frameHeight, columnFullWidth, isRtl, isVwm) {\r\n\r\n //TODO: Support vertical writing mode\r\n if (isVwm) {\r\n return;\r\n }\r\n \r\n var totalHeight = _.reduce(rects, function(prev, cur) {\r\n return prev + cur.height;\r\n }, 0);\r\n\r\n var heightToHide = totalHeight * verticalOffset / 100;\r\n if (rects.length > 1) {\r\n var heightAccum = 0;\r\n do {\r\n heightAccum += rects[0].height;\r\n if (heightAccum > heightToHide) {\r\n break;\r\n }\r\n rects.shift();\r\n } while (rects.length > 1);\r\n }\r\n else {\r\n // rebase to the last possible column\r\n // (so that adding to top will be properly processed later)\r\n if (isRtl) {\r\n columnFullWidth *= -1;\r\n }\r\n while (rects[0].bottom >= frameHeight) {\r\n offsetRectangle(rects[0], columnFullWidth, -frameHeight);\r\n }\r\n\r\n rects[0].top += heightToHide;\r\n rects[0].height -= heightToHide;\r\n }\r\n }\r\n\r\n //we look for text and images\r\n this.findFirstVisibleElement = function (props) {\r\n\r\n if (typeof props !== 'object') {\r\n // compatibility with legacy code, `props` is `topOffset` actually\r\n props = { top: props };\r\n }\r\n\r\n var $elements;\r\n var $firstVisibleTextNode = null;\r\n var percentOfElementHeight = 0;\r\n\r\n $elements = $(\"body\", this.getRootElement()).find(\":not(iframe)\").contents().filter(function () {\r\n return isValidTextNode(this) || this.nodeName.toLowerCase() === 'img';\r\n });\r\n\r\n // Find the first visible text node\r\n $.each($elements, function() {\r\n\r\n var $element;\r\n\r\n if(this.nodeType === Node.TEXT_NODE) { //text node\r\n $element = $(this).parent();\r\n }\r\n else {\r\n $element = $(this); //image\r\n }\r\n\r\n var visibilityResult = visibilityCheckerFunc($element, props, true);\r\n if (visibilityResult) {\r\n $firstVisibleTextNode = $element;\r\n percentOfElementHeight = 100 - visibilityResult;\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n return {$element: $firstVisibleTextNode, percentY: percentOfElementHeight};\r\n };\r\n\r\n this.getFirstVisibleElementCfi = function(topOffset) {\r\n\r\n var foundElement = this.findFirstVisibleElement(topOffset);\r\n\r\n if(!foundElement.$element) {\r\n console.log(\"Could not generate CFI no visible element on page\");\r\n return undefined;\r\n }\r\n\r\n //noinspection JSUnresolvedVariable\r\n var cfi = EPUBcfi.Generator.generateElementCFIComponent(foundElement.$element[0]);\r\n\r\n if(cfi[0] == \"!\") {\r\n cfi = cfi.substring(1);\r\n }\r\n\r\n return cfi + \"@0:\" + foundElement.percentY;\r\n };\r\n\r\n this.getPageForElementCfi = function(cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n var cfiParts = splitCfi(cfi);\r\n\r\n var $element = getElementByPartialCfi(cfiParts.cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n\r\n if(!$element) {\r\n return -1;\r\n }\r\n\r\n return this.getPageForPointOnElement($element, cfiParts.x, cfiParts.y);\r\n };\r\n\r\n function getElementByPartialCfi(cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n var contentDoc = $iframe[0].contentDocument;\r\n\r\n var wrappedCfi = \"epubcfi(\" + cfi + \")\";\r\n //noinspection JSUnresolvedVariable\r\n var $element = EPUBcfi.getTargetElementWithPartialCFI(wrappedCfi, contentDoc, classBlacklist, elementBlacklist, idBlacklist);\r\n\r\n if(!$element || $element.length == 0) {\r\n console.log(\"Can't find element for CFI: \" + cfi);\r\n return undefined;\r\n }\r\n\r\n return $element;\r\n }\r\n\r\n this.getElementByCfi = function(cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n var cfiParts = splitCfi(cfi);\r\n return getElementByPartialCfi(cfiParts.cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n };\r\n\r\n this.getPageForElement = function($element) {\r\n\r\n return this.getPageForPointOnElement($element, 0, 0);\r\n };\r\n\r\n this.getPageForPointOnElement = function($element, x, y) {\r\n\r\n var pageIndex;\r\n if (options.rectangleBased) {\r\n pageIndex = findPageByRectangles($element, y);\r\n if (pageIndex === null) {\r\n console.warn('Impossible to locate a hidden element: ', $element);\r\n return 0;\r\n }\r\n return pageIndex;\r\n }\r\n\r\n var posInElement = this.getVerticalOffsetForPointOnElement($element, x, y);\r\n return Math.floor(posInElement / $viewport.height());\r\n };\r\n\r\n this.getVerticalOffsetForElement = function($element) {\r\n\r\n return this.getVerticalOffsetForPointOnElement($element, 0, 0);\r\n };\r\n\r\n this.getVerticalOffsetForPointOnElement = function($element, x, y) {\r\n\r\n var elementRect = Helpers.Rect.fromElement($element);\r\n return Math.ceil(elementRect.top + y * elementRect.height / 100);\r\n };\r\n\r\n this.getElementById = function(id) {\r\n\r\n var contentDoc = $iframe[0].contentDocument;\r\n\r\n var $element = $(contentDoc.getElementById(id));\r\n //$(\"#\" + Helpers.escapeJQuerySelector(id), contentDoc);\r\n \r\n if($element.length == 0) {\r\n return undefined;\r\n }\r\n\r\n return $element;\r\n };\r\n\r\n this.getPageForElementId = function(id) {\r\n\r\n var $element = this.getElementById(id);\r\n if(!$element) {\r\n return -1;\r\n }\r\n\r\n return this.getPageForElement($element);\r\n };\r\n\r\n function splitCfi(cfi) {\r\n\r\n var ret = {\r\n cfi: \"\",\r\n x: 0,\r\n y: 0\r\n };\r\n\r\n var ix = cfi.indexOf(\"@\");\r\n\r\n if(ix != -1) {\r\n var terminus = cfi.substring(ix + 1);\r\n\r\n var colIx = terminus.indexOf(\":\");\r\n if(colIx != -1) {\r\n ret.x = parseInt(terminus.substr(0, colIx));\r\n ret.y = parseInt(terminus.substr(colIx + 1));\r\n }\r\n else {\r\n console.log(\"Unexpected terminating step format\");\r\n }\r\n\r\n ret.cfi = cfi.substring(0, ix);\r\n }\r\n else {\r\n\r\n ret.cfi = cfi;\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n // returns raw DOM element (not $ jQuery-wrapped)\r\n this.getFirstVisibleMediaOverlayElement = function(visibleContentOffsets)\r\n {\r\n var docElement = this.getRootElement();\r\n if (!docElement) return undefined;\r\n\r\n var $root = $(\"body\", docElement);\r\n if (!$root || !$root.length || !$root[0]) return undefined;\r\n\r\n var that = this;\r\n\r\n var firstPartial = undefined;\r\n\r\n function traverseArray(arr)\r\n {\r\n if (!arr || !arr.length) return undefined;\r\n\r\n for (var i = 0, count = arr.length; i < count; i++)\r\n {\r\n var item = arr[i];\r\n if (!item) continue;\r\n\r\n var $item = $(item);\r\n\r\n if($item.data(\"mediaOverlayData\"))\r\n {\r\n var visible = that.getElementVisibility($item, visibleContentOffsets);\r\n if (visible)\r\n {\r\n if (!firstPartial) firstPartial = item;\r\n\r\n if (visible == 100) return item;\r\n }\r\n }\r\n else\r\n {\r\n var elem = traverseArray(item.children);\r\n if (elem) return elem;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n var el = traverseArray([$root[0]]);\r\n if (!el) el = firstPartial;\r\n return el;\r\n\r\n // var $elements = this.getMediaOverlayElements($root);\r\n // return this.getVisibleElements($elements, visibleContentOffsets);\r\n };\r\n\r\n this.getElementVisibility = function($element, visibleContentOffsets) {\r\n return visibilityCheckerFunc($element, visibleContentOffsets, true);\r\n };\r\n\r\n\r\n\r\n this.isElementVisible = visibilityCheckerFunc;\r\n\r\n this.isElementCfiVisible = function (partialCfi) {\r\n var pageIndex = this.getPageForElementCfi(partialCfi,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n var paginationInfo = options.paginationInfo || null;\r\n if (paginationInfo) {\r\n var openPages = [paginationInfo.currentSpreadIndex * paginationInfo.visibleColumnCount];\r\n if (paginationInfo.visibleColumnCount == 2) {\r\n openPages.push(openPages[0] + 1);\r\n }\r\n return _.contains(openPages, pageIndex);\r\n }\r\n return undefined;\r\n };\r\n\r\n\r\n function isValidTextNode(node) {\r\n\r\n if(node.nodeType === Node.TEXT_NODE) {\r\n\r\n // Heuristic to find a text node with actual text\r\n var nodeText = node.nodeValue.replace(/\\n/g, \"\");\r\n nodeText = nodeText.replace(/ /g, \"\");\r\n\r\n return nodeText.length > 0;\r\n }\r\n\r\n return false;\r\n\r\n }\r\n\r\n this.getElement = function(selector) {\r\n\r\n var $element = $(selector, this.getRootElement());\r\n\r\n if($element.length > 0) {\r\n return $element;\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n};\r\nreturn CfiNavigationLogic;\r\n});\r\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/viewer_settings',[], function() {\r\n/**\r\n *\r\n * @param settingsData\r\n * @constructor\r\n */\r\nvar ViewerSettings = function(settingsData) {\r\n\r\n var self = this;\r\n\r\n this.syntheticSpread = \"auto\";\r\n this.fontSize = 100;\r\n this.columnGap = 20;\r\n\r\n this.mediaOverlaysPreservePlaybackWhenScroll = false;\r\n\r\n this.mediaOverlaysSkipSkippables = false;\r\n this.mediaOverlaysEscapeEscapables = true;\r\n\r\n this.mediaOverlaysSkippables = [];\r\n this.mediaOverlaysEscapables = [];\r\n \r\n this.mediaOverlaysEnableClick = true;\r\n this.mediaOverlaysRate = 1;\r\n this.mediaOverlaysVolume = 100;\r\n \r\n this.mediaOverlaysSynchronizationGranularity = \"\";\r\n\r\n this.mediaOverlaysAutomaticPageTurn = true;\r\n\r\n this.enableGPUHardwareAccelerationCSS3D = false;\r\n\r\n // -1 ==> disable\r\n // [0...n] ==> index of transition in pre-defined array\r\n this.pageTransition = -1;\r\n \r\n this.scroll = \"auto\";\r\n\r\n function buildArray(str)\r\n {\r\n var retArr = [];\r\n var arr = str.split(/[\\s,;]+/); //','\r\n for (var i = 0; i < arr.length; i++)\r\n {\r\n var item = arr[i].trim();\r\n if (item !== \"\")\r\n {\r\n retArr.push(item);\r\n }\r\n }\r\n return retArr;\r\n }\r\n\r\n function mapProperty(propName, settingsData, functionToApply) {\r\n\r\n if(settingsData[propName] !== undefined) {\r\n if(functionToApply) {\r\n\r\n self[propName] = functionToApply(settingsData[propName]);\r\n }\r\n else {\r\n self[propName] = settingsData[propName];\r\n }\r\n }\r\n\r\n }\r\n\r\n this.update = function(settingsData) {\r\n\r\n mapProperty(\"columnGap\", settingsData);\r\n mapProperty(\"fontSize\", settingsData);\r\n mapProperty(\"mediaOverlaysPreservePlaybackWhenScroll\", settingsData);\r\n mapProperty(\"mediaOverlaysSkipSkippables\", settingsData);\r\n mapProperty(\"mediaOverlaysEscapeEscapables\", settingsData);\r\n mapProperty(\"mediaOverlaysSkippables\", settingsData, buildArray);\r\n mapProperty(\"mediaOverlaysEscapables\", settingsData, buildArray);\r\n mapProperty(\"mediaOverlaysEnableClick\", settingsData);\r\n mapProperty(\"mediaOverlaysRate\", settingsData);\r\n mapProperty(\"mediaOverlaysVolume\", settingsData);\r\n mapProperty(\"mediaOverlaysSynchronizationGranularity\", settingsData);\r\n mapProperty(\"mediaOverlaysAutomaticPageTurn\", settingsData);\r\n mapProperty(\"scroll\", settingsData);\r\n mapProperty(\"syntheticSpread\", settingsData);\r\n mapProperty(\"pageTransition\", settingsData);\r\n mapProperty(\"enableGPUHardwareAccelerationCSS3D\", settingsData);\r\n };\r\n\r\n this.update(settingsData);\r\n};\r\n return ViewerSettings;\r\n});\r\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n\r\ndefine('readium_shared_js/views/one_page_view',[\"jquery\", \"underscore\", \"eventEmitter\", \"./cfi_navigation_logic\", \"../helpers\", \"../models/viewer_settings\"],\r\n function ($, _, EventEmitter, CfiNavigationLogic, Helpers, ViewerSettings) {\r\n\r\n/**\r\n * Renders one page of fixed layout spread\r\n *\r\n * @param options\r\n * @param classes\r\n * @param enableBookStyleOverrides\r\n * @constructor\r\n */\r\nvar OnePageView = function (options, classes, enableBookStyleOverrides, reader) {\r\n\r\n $.extend(this, new EventEmitter());\r\n\r\n var self = this;\r\n\r\n var _$epubHtml;\r\n var _$el;\r\n var _$iframe;\r\n var _currentSpineItem;\r\n var _spine = options.spine;\r\n var _iframeLoader = options.iframeLoader;\r\n var _bookStyles = options.bookStyles;\r\n\r\n var _$viewport = options.$viewport;\r\n\r\n var _isIframeLoaded = false;\r\n\r\n var _$scaler;\r\n\r\n var PageTransitionHandler = function (opts) {\r\n var PageTransition = function (begin, end) {\r\n this.begin = begin;\r\n this.end = end;\r\n };\r\n\r\n var _pageTransition_OPACITY = new PageTransition(\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"0\");\r\n },\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"transform\", \"none\");\r\n\r\n Helpers.CSSTransition($el, \"opacity 150ms ease-out\");\r\n\r\n $el.css(\"opacity\", \"1\");\r\n }\r\n );\r\n\r\n var _pageTransition_TRANSLATE = new PageTransition(\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"0\");\r\n\r\n var elWidth = Math.ceil(meta_width * scale);\r\n\r\n var initialLeft = elWidth * 0.8 * (pageSwitchDir === 2 ? 1 : -1);\r\n var move = Helpers.CSSTransformString({\r\n left: Math.round(initialLeft),\r\n origin: \"50% 50% 0\",\r\n enable3D: _enable3D\r\n });\r\n $el.css(move);\r\n },\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"1\");\r\n\r\n Helpers.CSSTransition($el, \"transform 150ms ease-out\");\r\n\r\n $el.css(\"transform\", \"none\");\r\n }\r\n );\r\n\r\n var _pageTransition_ROTATE = new PageTransition(\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"0\");\r\n\r\n var elWidth = Math.ceil(meta_width * scale);\r\n\r\n var initialLeft = elWidth * 1.7 * (pageSwitchDir === 2 ? 1 : -1);\r\n var trans = Helpers.CSSTransformString({\r\n left: Math.round(initialLeft),\r\n angle: (pageSwitchDir === 2 ? -1 : 1) * 30,\r\n origin: \"50% 50% 0\",\r\n enable3D: _enable3D\r\n }); //(pageSwitchDir === 2 ? '0% 0%' : '100% 0%')\r\n $el.css(trans);\r\n },\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"1\");\r\n\r\n Helpers.CSSTransition($el, \"transform 300ms ease-in-out\");\r\n\r\n $el.css(\"transform\", \"none\");\r\n }\r\n );\r\n\r\n var _pageTransition_SWING = new PageTransition(\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"0\");\r\n\r\n // SUPER HACKY!! (just for demo)\r\n var isLeft = false;\r\n var isCenter = false;\r\n var isRight = false;\r\n for (var i = 0; i < classes.length; i++) {\r\n var c = classes[i].toLowerCase();\r\n if (c.indexOf(\"left\") >= 0) {\r\n isLeft = true;\r\n break;\r\n }\r\n if (c.indexOf(\"right\") >= 0) {\r\n isRight = true;\r\n break;\r\n }\r\n if (c.indexOf(\"center\") >= 0) {\r\n isCenter = true;\r\n break;\r\n }\r\n }\r\n\r\n var elWidth = Math.ceil(meta_width * scale);\r\n\r\n var initialLeft = elWidth * 0.5 * ((isLeft || isCenter && pageSwitchDir === 1) ? 1 : -1);\r\n var trans = Helpers.CSSTransformString({\r\n scale: 0.2,\r\n left: Math.round(initialLeft),\r\n angle: ((isLeft || isCenter && pageSwitchDir === 1) ? 1 : -1) * 30,\r\n origin: '50% 50% 0',\r\n enable3D: _enable3D\r\n });\r\n $el.css(trans);\r\n },\r\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\r\n $el.css(\"opacity\", \"1\");\r\n\r\n Helpers.CSSTransition($el, \"transform 400ms ease-out\");\r\n\r\n $el.css(\"transform\", \"none\");\r\n }\r\n );\r\n\r\n var _pageTransitions = [];\r\n _pageTransitions.push(_pageTransition_OPACITY); // 0\r\n _pageTransitions.push(_pageTransition_TRANSLATE); // 1\r\n _pageTransitions.push(_pageTransition_ROTATE); // 2\r\n _pageTransitions.push(_pageTransition_SWING); // 3\r\n\r\n var _disablePageTransitions = opts.disablePageTransitions || false;\r\n\r\n var _pageTransition = -1;\r\n\r\n var _enable3D = new ViewerSettings({}).enableGPUHardwareAccelerationCSS3D;\r\n\r\n var _viewerSettings = undefined;\r\n this.updateOptions = function (o) {\r\n _viewerSettings = o;\r\n\r\n var settings = _viewerSettings;\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n _enable3D = true;\r\n }\r\n\r\n if (o.pageTransition !== null && typeof o.pageTransition !== \"undefined\") {\r\n _pageTransition = o.pageTransition;\r\n }\r\n };\r\n this.updateOptions(opts);\r\n\r\n var _pageSwitchDir = 0;\r\n var _pageSwitchActuallyChanged = false;\r\n var _pageSwitchActuallyChanged_IFRAME_LOAD = false;\r\n\r\n // dir: 0 => new or same page, 1 => previous, 2 => next\r\n this.updatePageSwitchDir = function (dir, hasChanged) {\r\n if (_pageSwitchActuallyChanged_IFRAME_LOAD) {\r\n return;\r\n }\r\n\r\n _pageSwitchDir = dir;\r\n _pageSwitchActuallyChanged = hasChanged;\r\n };\r\n\r\n this.onIFrameLoad = function () {\r\n _pageSwitchActuallyChanged_IFRAME_LOAD = true; // second pass, but initial display for transition\r\n };\r\n\r\n this.transformContentImmediate_BEGIN = function ($el, scale, left, top) {\r\n var pageSwitchActuallyChanged = _pageSwitchActuallyChanged || _pageSwitchActuallyChanged_IFRAME_LOAD;\r\n _pageSwitchActuallyChanged_IFRAME_LOAD = false;\r\n\r\n if (_disablePageTransitions || _pageTransition === -1) return;\r\n\r\n Helpers.CSSTransition($el, \"all 0 ease 0\");\r\n\r\n if (!pageSwitchActuallyChanged) return;\r\n\r\n var pageTransition = (_pageTransition >= 0 && _pageTransition < _pageTransitions.length) ? _pageTransitions[_pageTransition] : undefined;\r\n\r\n if (_pageSwitchDir === 0 || !pageTransition) {\r\n $el.css(\"opacity\", \"0\");\r\n }\r\n else {\r\n pageTransition.begin(scale, left, top, $el, self.meta_width(), self.meta_height(), _pageSwitchDir);\r\n }\r\n };\r\n\r\n this.transformContentImmediate_END = function ($el, scale, left, top) {\r\n if (_disablePageTransitions || _pageTransition === -1) {\r\n $el.css(\"transform\", \"none\");\r\n return;\r\n }\r\n\r\n setTimeout(function () {\r\n var pageTransition = (_pageTransition >= 0 && _pageTransition < _pageTransitions.length) ? _pageTransitions[_pageTransition] : undefined;\r\n\r\n if (_pageSwitchDir === 0 || !pageTransition) {\r\n $el.css(\"transform\", \"none\");\r\n\r\n Helpers.CSSTransition($el, \"opacity 250ms linear\");\r\n\r\n $el.css(\"opacity\", \"1\");\r\n }\r\n else {\r\n pageTransition.end(scale, left, top, $el, self.meta_width(), self.meta_height(), _pageSwitchDir);\r\n }\r\n\r\n }, 10);\r\n };\r\n };\r\n var _pageTransitionHandler = new PageTransitionHandler(options);\r\n\r\n\r\n // fixed layout does not apply user styles to publisher content, but reflowable scroll view does\r\n var _enableBookStyleOverrides = enableBookStyleOverrides || false;\r\n\r\n var _meta_size = {\r\n width: 0,\r\n height: 0\r\n };\r\n\r\n this.element = function () {\r\n return _$el;\r\n };\r\n\r\n this.meta_height = function () {\r\n return _meta_size.height;\r\n };\r\n\r\n this.meta_width = function () {\r\n return _meta_size.width;\r\n };\r\n\r\n this.isDisplaying = function () {\r\n\r\n return _isIframeLoaded;\r\n };\r\n\r\n this.render = function () {\r\n\r\n var template = Helpers.loadTemplate(\"single_page_frame\", {});\r\n\r\n _$el = $(template);\r\n\r\n _$scaler = $(\"#scaler\", _$el);\r\n\r\n Helpers.CSSTransition(_$el, \"all 0 ease 0\");\r\n\r\n _$el.css(\"transform\", \"none\");\r\n\r\n var settings = reader.viewerSettings();\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n\r\n // This fixes rendering issues with WebView (native apps), which crops content embedded in iframes unless GPU hardware acceleration is enabled for CSS rendering.\r\n _$el.css(\"transform\", \"translateZ(0)\");\r\n }\r\n\r\n _$el.css(\"height\", \"100%\");\r\n _$el.css(\"width\", \"100%\");\r\n\r\n for (var i = 0, count = classes.length; i < count; i++) {\r\n _$el.addClass(classes[i]);\r\n }\r\n\r\n _$iframe = $(\"iframe\", _$el);\r\n\r\n return this;\r\n };\r\n\r\n\r\n this.decorateIframe = function () {\r\n if (!_$iframe || !_$iframe.length) return;\r\n\r\n _$iframe.css(\"border-bottom\", \"1px dashed silver\");\r\n _$iframe.css(\"border-top\", \"1px dashed silver\");\r\n };\r\n\r\n this.remove = function () {\r\n _isIframeLoaded = false;\r\n _currentSpineItem = undefined;\r\n _$el.remove();\r\n };\r\n\r\n this.clear = function () {\r\n _isIframeLoaded = false;\r\n _$iframe[0].src = \"\";\r\n };\r\n\r\n this.currentSpineItem = function () {\r\n\r\n return _currentSpineItem;\r\n };\r\n\r\n function onIFrameLoad(success) {\r\n\r\n if (success) {\r\n _isIframeLoaded = true;\r\n var epubContentDocument = _$iframe[0].contentDocument;\r\n _$epubHtml = $(\"html\", epubContentDocument);\r\n if (!_$epubHtml || _$epubHtml.length == 0) {\r\n _$epubHtml = $(\"svg\", epubContentDocument);\r\n }\r\n\r\n //_$epubHtml.css(\"overflow\", \"hidden\");\r\n\r\n if (_enableBookStyleOverrides) {\r\n self.applyBookStyles();\r\n }\r\n\r\n updateMetaSize();\r\n\r\n _pageTransitionHandler.onIFrameLoad();\r\n }\r\n }\r\n\r\n var _viewSettings = undefined;\r\n this.setViewSettings = function (settings) {\r\n\r\n _viewSettings = settings;\r\n\r\n if (_enableBookStyleOverrides) {\r\n self.applyBookStyles();\r\n }\r\n\r\n updateMetaSize();\r\n\r\n _pageTransitionHandler.updateOptions(settings);\r\n };\r\n\r\n function updateHtmlFontSize() {\r\n\r\n if (!_enableBookStyleOverrides) return;\r\n\r\n if (_$epubHtml && _viewSettings) {\r\n Helpers.UpdateHtmlFontSize(_$epubHtml, _viewSettings.fontSize);\r\n }\r\n }\r\n\r\n this.applyBookStyles = function () {\r\n\r\n if (!_enableBookStyleOverrides) return;\r\n\r\n if (_$epubHtml) {\r\n Helpers.setStyles(_bookStyles.getStyles(), _$epubHtml);\r\n updateHtmlFontSize();\r\n }\r\n };\r\n\r\n //this is called by scroll_view for fixed spine item\r\n this.scaleToWidth = function (width) {\r\n\r\n if (_meta_size.width <= 0) return; // resize event too early!\r\n\r\n var scale = width / _meta_size.width;\r\n self.transformContentImmediate(scale, 0, 0);\r\n };\r\n\r\n //this is called by scroll_view for reflowable spine item\r\n this.resizeIFrameToContent = function () {\r\n var contHeight = getContentDocHeight();\r\n //console.log(\"resizeIFrameToContent: \" + contHeight);\r\n\r\n self.setHeight(contHeight);\r\n\r\n self.showIFrame();\r\n };\r\n\r\n this.setHeight = function (height) {\r\n\r\n _$scaler.css(\"height\", height + \"px\");\r\n _$el.css(\"height\", height + \"px\");\r\n\r\n// _$iframe.css(\"height\", height + \"px\");\r\n };\r\n\r\n var _useCSSTransformToHideIframe = true;\r\n\r\n this.showIFrame = function () {\r\n\r\n _$iframe.css(\"visibility\", \"visible\");\r\n\r\n if (_useCSSTransformToHideIframe) {\r\n _$iframe.css(\"transform\", \"none\");\r\n\r\n var enable3D = false;\r\n var settings = _viewSettings;\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n enable3D = true;\r\n _$iframe.css(\"transform\", \"translateZ(0)\");\r\n }\r\n }\r\n else {\r\n _$iframe.css({left: \"0px\", top: \"0px\"});\r\n }\r\n };\r\n\r\n this.hideIFrame = function () {\r\n\r\n _$iframe.css(\"visibility\", \"hidden\");\r\n\r\n // With some books, despite the iframe and its containing div wrapper being hidden,\r\n // the iframe's contentWindow / contentDocument is still visible!\r\n // Thus why we translate the iframe out of view instead.\r\n\r\n if (_useCSSTransformToHideIframe) {\r\n var enable3D = false;\r\n var settings = _viewSettings;\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n enable3D = true;\r\n }\r\n\r\n var css = Helpers.CSSTransformString({left: \"10000\", top: \"10000\", enable3D: enable3D});\r\n _$iframe.css(css);\r\n }\r\n else {\r\n _$iframe.css({left: \"10000px\", top: \"10000px\"});\r\n }\r\n };\r\n\r\n function getContentDocHeight() {\r\n\r\n if (!_$iframe || !_$iframe.length) {\r\n return 0;\r\n }\r\n\r\n if (Helpers.isIframeAlive(_$iframe[0])) {\r\n var win = _$iframe[0].contentWindow;\r\n var doc = _$iframe[0].contentDocument;\r\n\r\n var height = Math.round(parseFloat(win.getComputedStyle(doc.documentElement).height)); //body can be shorter!\r\n return height;\r\n }\r\n else if (_$epubHtml) {\r\n console.error(\"getContentDocHeight ??\");\r\n\r\n var jqueryHeight = _$epubHtml.height();\r\n return jqueryHeight;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n // dir: 0 => new or same page, 1 => previous, 2 => next\r\n this.updatePageSwitchDir = function (dir, hasChanged) {\r\n _pageTransitionHandler.updatePageSwitchDir(dir, hasChanged);\r\n };\r\n\r\n\r\n this.transformContentImmediate = function (scale, left, top) {\r\n\r\n var elWidth = Math.ceil(_meta_size.width * scale);\r\n var elHeight = Math.floor(_meta_size.height * scale);\r\n\r\n _pageTransitionHandler.transformContentImmediate_BEGIN(_$el, scale, left, top);\r\n\r\n _$el.css(\"left\", left + \"px\");\r\n _$el.css(\"top\", top + \"px\");\r\n _$el.css(\"width\", elWidth + \"px\");\r\n _$el.css(\"height\", elHeight + \"px\");\r\n\r\n if (!_$epubHtml) {\r\n// debugger;\r\n return;\r\n }\r\n\r\n var enable3D = false;\r\n var settings = _viewSettings;\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n enable3D = true;\r\n }\r\n\r\n if (reader.needsFixedLayoutScalerWorkAround()) {\r\n var css1 = Helpers.CSSTransformString({scale: scale, enable3D: enable3D});\r\n _$epubHtml.css(css1);\r\n\r\n var css2 = Helpers.CSSTransformString({scale : 1, enable3D: enable3D});\r\n css2[\"width\"] = _meta_size.width * scale;\r\n css2[\"height\"] = _meta_size.height * scale;\r\n\r\n _$scaler.css(css2);\r\n }\r\n else {\r\n var css = Helpers.CSSTransformString({scale: scale, enable3D: enable3D});\r\n css[\"width\"] = _meta_size.width;\r\n css[\"height\"] = _meta_size.height;\r\n _$scaler.css(css);\r\n }\r\n\r\n // Chrome workaround: otherwise text is sometimes invisible (probably a rendering glitch due to the 3D transform graphics backend?)\r\n //_$epubHtml.css(\"visibility\", \"hidden\"); // \"flashing\" in two-page spread mode is annoying :(\r\n _$epubHtml.css(\"opacity\", \"0.999\");\r\n\r\n self.showIFrame();\r\n\r\n setTimeout(function () {\r\n //_$epubHtml.css(\"visibility\", \"visible\");\r\n _$epubHtml.css(\"opacity\", \"1\");\r\n }, 0);\r\n\r\n _pageTransitionHandler.transformContentImmediate_END(_$el, scale, left, top);\r\n };\r\n\r\n this.getCalculatedPageHeight = function () {\r\n return _$el.height();\r\n };\r\n\r\n this.transformContent = _.bind(_.debounce(this.transformContentImmediate, 50), self);\r\n\r\n function updateMetaSize() {\r\n\r\n _meta_size.width = 0;\r\n _meta_size.height = 0;\r\n\r\n var size = undefined;\r\n\r\n var isFallbackDimension = false;\r\n var widthPercent = undefined;\r\n var heightPercent = undefined;\r\n\r\n var contentDocument = _$iframe[0].contentDocument;\r\n\r\n // first try to read viewport size\r\n var content = $('meta[name=viewport]', contentDocument).attr(\"content\");\r\n\r\n // if not found try viewbox (used for SVG)\r\n if (!content) {\r\n content = $('meta[name=viewbox]', contentDocument).attr(\"content\");\r\n }\r\n\r\n if (content) {\r\n size = parseMetaSize(content);\r\n }\r\n\r\n if (!size) {\r\n\r\n //var $svg = $(contentDocument).find('svg');\r\n // if($svg.length > 0) {\r\n if (contentDocument && contentDocument.documentElement && contentDocument.documentElement.nodeName && contentDocument.documentElement.nodeName.toLowerCase() == \"svg\") {\r\n\r\n var width = undefined;\r\n var height = undefined;\r\n\r\n var wAttr = contentDocument.documentElement.getAttribute(\"width\");\r\n var isWidthPercent = wAttr && wAttr.length >= 1 && wAttr[wAttr.length - 1] == '%';\r\n if (wAttr) {\r\n try {\r\n width = parseInt(wAttr, 10);\r\n }\r\n catch (err) {}\r\n }\r\n if (width && isWidthPercent) {\r\n widthPercent = width;\r\n width = undefined;\r\n }\r\n\r\n var hAttr = contentDocument.documentElement.getAttribute(\"height\");\r\n var isHeightPercent = hAttr && hAttr.length >= 1 && hAttr[hAttr.length - 1] == '%';\r\n if (hAttr) {\r\n try {\r\n height = parseInt(hAttr, 10);\r\n }\r\n catch (err) {}\r\n }\r\n if (height && isHeightPercent) {\r\n heightPercent = height;\r\n height = undefined;\r\n }\r\n\r\n if (width && height) {\r\n size = {\r\n width: width,\r\n height: height\r\n }\r\n }\r\n else {\r\n /// DISABLED (not a satisfactory fallback)\r\n // content = $svg.attr('viewBox');\r\n // if(content) {\r\n // size = parseViewBoxSize(content);\r\n // }\r\n //\r\n // if (size) {\r\n // console.warn(\"Viewport SVG: using viewbox!\");\r\n // }\r\n }\r\n }\r\n }\r\n\r\n if (!size && _currentSpineItem) {\r\n content = _currentSpineItem.getRenditionViewport();\r\n\r\n if (content) {\r\n size = parseMetaSize(content);\r\n if (size) {\r\n console.log(\"Viewport: using rendition:viewport dimensions\");\r\n }\r\n }\r\n }\r\n\r\n if (!size) {\r\n // Image fallback (auto-generated HTML template when WebView / iFrame is fed with image media type)\r\n var $img = $(contentDocument).find('img');\r\n if ($img.length > 0) {\r\n size = {\r\n width: $img.width(),\r\n height: $img.height()\r\n };\r\n\r\n var isImage = _currentSpineItem && _currentSpineItem.media_type && _currentSpineItem.media_type.length && _currentSpineItem.media_type.indexOf(\"image/\") == 0;\r\n if (!isImage) {\r\n console.warn(\"Viewport: using img dimensions!\");\r\n }\r\n }\r\n else {\r\n $img = $(contentDocument).find('image');\r\n if ($img.length > 0) {\r\n var width = undefined;\r\n var height = undefined;\r\n\r\n var wAttr = $img[0].getAttribute(\"width\");\r\n if (wAttr) {\r\n try {\r\n width = parseInt(wAttr, 10);\r\n }\r\n catch (err) {}\r\n }\r\n var hAttr = $img[0].getAttribute(\"height\");\r\n if (hAttr) {\r\n try {\r\n height = parseInt(hAttr, 10);\r\n }\r\n catch (err) {}\r\n }\r\n\r\n\r\n if (width && height) {\r\n size = {\r\n width: width,\r\n height: height\r\n };\r\n\r\n isFallbackDimension = true;\r\n\r\n console.warn(\"Viewport: using image dimensions!\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!size) {\r\n // Not a great fallback, as it has the aspect ratio of the full window, but it is better than no display at all.\r\n width = _$viewport.width();\r\n height = _$viewport.height();\r\n\r\n // hacky method to determine the actual available horizontal space (half the two-page spread is a reasonable approximation, this means that whatever the size of the other iframe / one_page_view, the aspect ratio of this one exactly corresponds to half the viewport rendering surface)\r\n var isTwoPageSyntheticSpread = $(\"iframe.iframe-fixed\", _$viewport).length > 1;\r\n if (isTwoPageSyntheticSpread) width *= 0.5;\r\n\r\n // the original SVG width/height might have been specified as a percentage of the containing viewport\r\n if (widthPercent) {\r\n width *= (widthPercent / 100);\r\n }\r\n if (heightPercent) {\r\n height *= (heightPercent / 100);\r\n }\r\n\r\n size = {\r\n width: width,\r\n height: height\r\n };\r\n\r\n isFallbackDimension = true;\r\n\r\n console.warn(\"Viewport: using browser / e-reader viewport dimensions!\");\r\n }\r\n\r\n if (size) {\r\n _meta_size.width = size.width;\r\n _meta_size.height = size.height;\r\n\r\n // Not strictly necessary, let's preserve the percentage values\r\n // if (isFallbackDimension && contentDocument && contentDocument.documentElement && contentDocument.documentElement.nodeName && contentDocument.documentElement.nodeName.toLowerCase() == \"svg\") {\r\n // contentDocument.documentElement.setAttribute(\"width\", size.width + \"px\");\r\n // contentDocument.documentElement.setAttribute(\"height\", size.height + \"px\");\r\n // }\r\n }\r\n }\r\n\r\n //expected callback signature: function(success, $iframe, spineItem, isNewlyLoaded, context)\r\n this.loadSpineItem = function (spineItem, callback, context) {\r\n\r\n if (_currentSpineItem != spineItem) {\r\n\r\n _currentSpineItem = spineItem;\r\n var src = _spine.package.resolveRelativeUrl(spineItem.href);\r\n\r\n //if (spineItem && spineItem.isFixedLayout())\r\n if (true) // both fixed layout and reflowable documents need hiding due to flashing during layout/rendering\r\n {\r\n //hide iframe until content is scaled\r\n self.hideIFrame();\r\n }\r\n\r\n self.emit(OnePageView.SPINE_ITEM_OPEN_START, _$iframe, _currentSpineItem);\r\n _iframeLoader.loadIframe(_$iframe[0], src, function (success) {\r\n\r\n if (success && callback) {\r\n var func = function () {\r\n callback(success, _$iframe, _currentSpineItem, true, context);\r\n };\r\n\r\n if (Helpers.isIframeAlive(_$iframe[0])) {\r\n onIFrameLoad(success); // applies styles\r\n\r\n func();\r\n }\r\n else {\r\n console.error(\"onIFrameLoad !! doc && win + TIMEOUT\");\r\n console.debug(spineItem.href);\r\n\r\n onIFrameLoad(success);\r\n\r\n setTimeout(func, 500);\r\n }\r\n }\r\n else {\r\n onIFrameLoad(success);\r\n }\r\n\r\n }, self, {spineItem: _currentSpineItem});\r\n }\r\n else {\r\n if (callback) {\r\n callback(true, _$iframe, _currentSpineItem, false, context);\r\n }\r\n }\r\n };\r\n //\r\n // function parseViewBoxSize(viewBoxString) {\r\n //\r\n // var parts = viewBoxString.split(' ');\r\n //\r\n // if(parts.length < 4) {\r\n // console.warn(viewBoxString + \" value is not valid viewBox size\")\r\n // return undefined;\r\n // }\r\n //\r\n // var width = parseInt(parts[2]);\r\n // var height = parseInt(parts[3]);\r\n //\r\n // if(!isNaN(width) && !isNaN(height)) {\r\n // return { width: width, height: height} ;\r\n // }\r\n //\r\n // return undefined;\r\n // }\r\n\r\n function parseMetaSize(content) {\r\n\r\n var pairs = content.replace(/\\s/g, '').split(\",\");\r\n\r\n var dict = {};\r\n\r\n for (var i = 0; i < pairs.length; i++) {\r\n var nameVal = pairs[i].split(\"=\");\r\n if (nameVal.length == 2) {\r\n\r\n dict[nameVal[0]] = nameVal[1];\r\n }\r\n }\r\n\r\n var width = Number.NaN;\r\n var height = Number.NaN;\r\n\r\n if (dict[\"width\"]) {\r\n width = parseInt(dict[\"width\"]);\r\n }\r\n\r\n if (dict[\"height\"]) {\r\n height = parseInt(dict[\"height\"]);\r\n }\r\n\r\n if (!isNaN(width) && !isNaN(height)) {\r\n return {width: width, height: height};\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n this.getFirstVisibleElementCfi = function () {\r\n\r\n var navigation = new CfiNavigationLogic(_$el, _$iframe);\r\n return navigation.getFirstVisibleElementCfi(0);\r\n\r\n };\r\n\r\n this.getNavigator = function () {\r\n\r\n return new CfiNavigationLogic(_$el, _$iframe);\r\n };\r\n\r\n this.getElementByCfi = function (spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n if (spineItem != _currentSpineItem) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n var navigation = new CfiNavigationLogic(_$el, _$iframe);\r\n return navigation.getElementByCfi(cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n };\r\n\r\n this.getElementById = function (spineItem, id) {\r\n\r\n if (spineItem != _currentSpineItem) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n var navigation = new CfiNavigationLogic(_$el, _$iframe);\r\n return navigation.getElementById(id);\r\n };\r\n\r\n this.getElement = function (spineItem, selector) {\r\n\r\n if (spineItem != _currentSpineItem) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n var navigation = new CfiNavigationLogic(_$el, _$iframe);\r\n return navigation.getElement(selector);\r\n };\r\n\r\n this.getFirstVisibleMediaOverlayElement = function () {\r\n var navigation = new CfiNavigationLogic(_$el, _$iframe);\r\n return navigation.getFirstVisibleMediaOverlayElement({top: 0, bottom: _$iframe.height()});\r\n };\r\n\r\n this.offset = function () {\r\n if (_$iframe) {\r\n return _$iframe.offset();\r\n }\r\n return undefined;\r\n }\r\n};\r\n\r\nOnePageView.SPINE_ITEM_OPEN_START = \"SpineItemOpenStart\";\r\nreturn OnePageView;\r\n});\r\n\n", @@ -108,7 +109,7 @@ "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/views/media_overlay_element_highlighter',['jquery', 'rangy', 'readium_cfi_js'], function($, rangy, epubCfi) {\r\n/**\r\n *\r\n * @param reader\r\n * @constructor\r\n */\r\nvar MediaOverlayElementHighlighter = function(reader) {\r\n\r\n this.includeParWhenAdjustingToSeqSyncGranularity = true;\r\n\r\n var DEFAULT_MO_ACTIVE_CLASS = \"mo-active-default\";\r\n var DEFAULT_MO_SUB_SYNC_CLASS = \"mo-sub-sync\";\r\n \r\n //var BACK_COLOR = \"#99CCCC\";\r\n\r\n var _highlightedElementPar = undefined;\r\n this.isElementHighlighted = function(par)\r\n {\r\n return _highlightedElementPar && par === _highlightedElementPar;\r\n };\r\n \r\n var _highlightedCfiPar = undefined;\r\n this.isCfiHighlighted = function(par)\r\n {\r\n return _highlightedCfiPar && par === _highlightedCfiPar;\r\n };\r\n\r\n var _activeClass = \"\";\r\n var _playbackActiveClass = \"\";\r\n\r\n var _reader = reader;\r\n \r\n var USE_RANGY = true && (typeof rangy !== \"undefined\");\r\n var _rangyCSS = undefined;\r\n var _rangyRange = undefined;\r\n \r\n var HIGHLIGHT_ID = \"MO_SPEAK\";\r\n \r\n var self = this;\r\n\r\n var $userStyle = undefined;\r\n \r\n this.reDo = function()\r\n {\r\n //this.reset();\r\n \r\n if ($userStyle)\r\n {\r\n $userStyle.remove();\r\n }\r\n $userStyle = undefined;\r\n\r\n var he = _highlightedElementPar;\r\n var hc = _highlightedCfiPar;\r\n var c1 = _activeClass;\r\n var c2 = _playbackActiveClass;\r\n \r\n if (_highlightedElementPar)\r\n {\r\n this.reset();\r\n\r\n this.highlightElement(he, c1, c2);\r\n }\r\n else if (_highlightedCfiPar)\r\n {\r\n this.reset();\r\n\r\n this.highlightCfi(hc, c1, c2);\r\n }\r\n };\r\n\r\n function ensureUserStyle($element, hasAuthorStyle, overrideWithUserStyle)\r\n {\r\n if ($userStyle)\r\n {\r\n try\r\n {\r\n if ($userStyle[0].ownerDocument === $element[0].ownerDocument)\r\n {\r\n return;\r\n }\r\n }\r\n catch (e)\r\n {\r\n \r\n }\r\n }\r\n\r\n\r\n $head = $(\"head\", $element[0].ownerDocument.documentElement);\r\n\r\n $userStyle = $(\"\");\r\n\r\n $userStyle.append(\".\" + DEFAULT_MO_ACTIVE_CLASS + \" {\");\r\n \r\n var fallbackUserStyle = \"background-color: yellow !important; color: black !important; border-radius: 0.4em;\";\r\n \r\n var style = overrideWithUserStyle; //_reader.userStyles().findStyle(\".\" + DEFAULT_MO_ACTIVE_CLASS);\r\n if (style)\r\n {\r\n var atLeastOne = false;\r\n for(var prop in style.declarations)\r\n {\r\n if(!style.declarations.hasOwnProperty(prop))\r\n {\r\n continue;\r\n }\r\n\r\n atLeastOne = true;\r\n $userStyle.append(prop + \": \" + style.declarations[prop] + \"; \");\r\n }\r\n \r\n if (!atLeastOne && !hasAuthorStyle)\r\n {\r\n $userStyle.append(fallbackUserStyle);\r\n }\r\n }\r\n else if (!hasAuthorStyle)\r\n {\r\n $userStyle.append(fallbackUserStyle);\r\n }\r\n \r\n $userStyle.append(\"}\");\r\n \r\n \r\n // ---- CFI\r\n //$userStyle.append(\" .highlight {background-color: blue; border: 2x solid green;}\"); //.hover-highlight\r\n \r\n \r\n $userStyle.appendTo($head);\r\n\r\n//console.debug($userStyle[0].textContent);\r\n };\r\n \r\n this.highlightElement = function(par, activeClass, playbackActiveClass) {\r\n\r\n if(!par || par === _highlightedElementPar) {\r\n return;\r\n }\r\n\r\n this.reset();\r\n\r\n _highlightedElementPar = par;\r\n _highlightedCfiPar = undefined;\r\n \r\n _activeClass = activeClass;\r\n _playbackActiveClass = playbackActiveClass;\r\n\r\n var seq = this.adjustParToSeqSyncGranularity(_highlightedElementPar);\r\n var element = seq.element;\r\n \r\n if (_playbackActiveClass && _playbackActiveClass !== \"\")\r\n {\r\n //console.debug(\"MO playbackActiveClass: \" + _playbackActiveClass);\r\n $(element.ownerDocument.documentElement).addClass(_playbackActiveClass);\r\n //console.debug(\"MO playbackActiveClass 2: \" + element.ownerDocument.documentElement.classList);\r\n }\r\n\r\n var $hel = $(element);\r\n\r\n var hasAuthorStyle = _activeClass && _activeClass !== \"\";\r\n var overrideWithUserStyle = _reader.userStyles().findStyle(\".\" + DEFAULT_MO_ACTIVE_CLASS);\r\n\r\n ensureUserStyle($hel, hasAuthorStyle, overrideWithUserStyle);\r\n \r\n if (overrideWithUserStyle || !hasAuthorStyle)\r\n {\r\n //console.debug(\"MO active NO CLASS: \" + _activeClass);\r\n\r\n if (hasAuthorStyle)\r\n {\r\n $hel.addClass(_activeClass);\r\n }\r\n \r\n $hel.addClass(DEFAULT_MO_ACTIVE_CLASS);\r\n\r\n //$(element).css(\"background\", BACK_COLOR);\r\n }\r\n else\r\n {\r\n //console.debug(\"MO activeClass: \" + _activeClass);\r\n $hel.addClass(_activeClass);\r\n }\r\n \r\n if (this.includeParWhenAdjustingToSeqSyncGranularity || _highlightedElementPar !== seq)\r\n {\r\n $(_highlightedElementPar.element).addClass(DEFAULT_MO_SUB_SYNC_CLASS);\r\n }\r\n \r\n// ---- CFI\r\n// try\r\n// {\r\n// // //noinspection JSUnresolvedVariable\r\n// // var cfi = EPUBcfi.Generator.generateElementCFIComponent(element); //$hel[0]\r\n// // if(cfi[0] == \"!\") {\r\n// // cfi = cfi.substring(1);\r\n// // }\r\n// \r\n// //console.log(element);\r\n// \r\n// var firstTextNode = getFirstTextNode(element);\r\n// var txtFirst = firstTextNode.textContent;\r\n// //console.log(txtFirst);\r\n// \r\n// var lastTextNode = getLastTextNode(element);\r\n// var txtLast = lastTextNode.textContent;\r\n// //console.log(txtLast);\r\n// \r\n// var cfi = EPUBcfi.Generator.generateCharOffsetRangeComponent(\r\n// firstTextNode, \r\n// 0, \r\n// lastTextNode, \r\n// txtLast.length,\r\n// [\"cfi-marker\"],\r\n// [],\r\n// [\"MathJax_Message\"]\r\n// );\r\n// \r\n// var id = $hel.data(\"mediaOverlayData\").par.getSmil().spineItemId;\r\n// _reader.addHighlight(id, cfi, HIGHLIGHT_ID,\r\n// \"highlight\", //\"underline\"\r\n// undefined // styles\r\n// );\r\n// }\r\n// catch(error)\r\n// {\r\n// console.error(error);\r\n// \r\n// removeHighlight();\r\n// }\r\n };\r\n \r\n this.highlightCfi = function(par, activeClass, playbackActiveClass) {\r\n\r\n if(!par || par === _highlightedCfiPar) {\r\n return;\r\n }\r\n\r\n this.reset();\r\n\r\n _highlightedElementPar = undefined;\r\n _highlightedCfiPar = par;\r\n \r\n _activeClass = activeClass;\r\n _playbackActiveClass = playbackActiveClass;\r\n\r\n var $hel = $(_highlightedCfiPar.cfi.cfiTextParent);\r\n\r\n var hasAuthorStyle = _activeClass && _activeClass !== \"\";\r\n var overrideWithUserStyle = _reader.userStyles().findStyle(\".\" + DEFAULT_MO_ACTIVE_CLASS); // TODO: performance issue?\r\n\r\n ensureUserStyle($hel, hasAuthorStyle, overrideWithUserStyle);\r\n\r\n var clazz = (overrideWithUserStyle || !hasAuthorStyle) ? ((hasAuthorStyle ? (_activeClass + \" \") : \"\") + DEFAULT_MO_ACTIVE_CLASS) : _activeClass;\r\n\r\n if (USE_RANGY)\r\n {\r\n var doc = _highlightedCfiPar.cfi.cfiTextParent.ownerDocument;\r\n\r\n _rangyRange = rangy.createRange(doc); //createNativeRange\r\n\r\n var startCFI = \"epubcfi(\" + _highlightedCfiPar.cfi.partialStartCfi + \")\";\r\n var infoStart = EPUBcfi.getTextTerminusInfoWithPartialCFI(startCFI, doc,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n//console.log(infoStart);\r\n\r\n var endCFI = \"epubcfi(\" + _highlightedCfiPar.cfi.partialEndCfi + \")\";\r\n var infoEnd = EPUBcfi.getTextTerminusInfoWithPartialCFI(endCFI, doc,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n//console.log(infoEnd);\r\n \r\n _rangyRange.setStartAndEnd(\r\n infoStart.textNode[0], infoStart.textOffset,\r\n infoEnd.textNode[0], infoEnd.textOffset\r\n );\r\n \r\n if (false && // we use CssClassApplier instead, because surroundContents() has no trivial undoSurroundContents() function (inc. text nodes normalisation, etc.)\r\n _rangyRange.canSurroundContents())\r\n {\r\n _rangyRange.MO_createCssClassApplier = false;\r\n \r\n var span = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", 'span');\r\n span.id = HIGHLIGHT_ID;\r\n span.setAttribute(\"id\", span.id);\r\n span.setAttribute(\"class\", clazz + \" mo-cfi-highlight\");\r\n \r\n _rangyRange.surroundContents(span);\r\n }\r\n else\r\n {\r\n _rangyRange.MO_createCssClassApplier = true;\r\n \r\n if (!_rangyCSS || _rangyCSS.cssClass !== clazz)\r\n {\r\n _rangyCSS = rangy.createCssClassApplier(clazz,\r\n {\r\n elementTagName: \"span\",\r\n elementProperties: {className: \"mo-cfi-highlight\"},\r\n ignoreWhiteSpace: true,\r\n applyToEditableOnly: false,\r\n normalize: true\r\n },\r\n [\"span\"]);\r\n }\r\n\r\n _rangyCSS.applyToRange(_rangyRange);\r\n }\r\n }\r\n else if (_reader.plugins.annotations)\r\n {\r\n try\r\n {\r\n //var id = $hel.data(\"mediaOverlayData\").par.getSmil().spineItemId;\r\n var id = par.getSmil().spineItemId;\r\n _reader.plugins.annotations.addHighlight(id, par.cfi.partialRangeCfi, HIGHLIGHT_ID,\r\n \"highlight\", //\"underline\"\r\n undefined // styles\r\n );\r\n }\r\n catch(error)\r\n {\r\n console.error(error);\r\n }\r\n }\r\n };\r\n \r\n// ---- CFI\r\n// \r\n// function getFirstTextNode(node)\r\n// {\r\n// if (node.nodeType === Node.TEXT_NODE)\r\n// {\r\n// if (node.textContent.trim().length > 0)\r\n// return node;\r\n// }\r\n// \r\n// for (var i = 0; i < node.childNodes.length; i++)\r\n// {\r\n// var child = node.childNodes[i];\r\n// var first = getFirstTextNode(child);\r\n// if (first)\r\n// {\r\n// return first;\r\n// }\r\n// }\r\n// \r\n// return undefined;\r\n// }\r\n// \r\n// function getLastTextNode(node)\r\n// {\r\n// if (node.nodeType === Node.TEXT_NODE)\r\n// {\r\n// if (node.textContent.trim().length > 0)\r\n// return node;\r\n// }\r\n// \r\n// for (var i = node.childNodes.length-1; i >= 0; i--)\r\n// {\r\n// var child = node.childNodes[i];\r\n// var last = getLastTextNode(child);\r\n// if (last)\r\n// {\r\n// return last;\r\n// }\r\n// }\r\n// \r\n// return undefined;\r\n// }\r\n// \r\n\r\n this.reset = function() {\r\n \r\n if (_highlightedCfiPar)\r\n {\r\n var doc = _highlightedCfiPar.cfi.cfiTextParent.ownerDocument;\r\n if (USE_RANGY)\r\n {\r\n if (_rangyCSS && _rangyRange.MO_createCssClassApplier)\r\n {\r\n _rangyCSS.undoToRange(_rangyRange);\r\n }\r\n else\r\n {\r\n var toRemove = undefined;\r\n while ((toRemove = doc.getElementById(HIGHLIGHT_ID)) !== null)\r\n {\r\n var txt = toRemove.textContent; // TODO: innerHTML? or better: hasChildNodes loop + detach and re-attach\r\n var txtNode = doc.createTextNode(txt);\r\n \r\n toRemove.parentNode.replaceChild(txtNode, toRemove);\r\n txtNode.parentNode.normalize();\r\n }\r\n }\r\n \r\n //_rangyCSS = undefined;\r\n _rangyRange = undefined;\r\n }\r\n else if (_reader.plugins.annotations)\r\n {\r\n try\r\n {\r\n _reader.plugins.annotations.removeHighlight(HIGHLIGHT_ID);\r\n \r\n var toRemove = undefined;\r\n while ((toRemove = doc.getElementById(\"start-\" + HIGHLIGHT_ID)) !== null)\r\n {\r\n console.log(\"toRemove START\");\r\n console.log(toRemove);\r\n toRemove.parentNode.removeChild(toRemove);\r\n }\r\n while ((toRemove = doc.getElementById(\"end-\" + HIGHLIGHT_ID)) !== null)\r\n {\r\n console.log(\"toRemove END\");\r\n console.log(toRemove);\r\n toRemove.parentNode.removeChild(toRemove);\r\n }\r\n }\r\n catch(error)\r\n {\r\n console.error(error);\r\n }\r\n }\r\n \r\n _highlightedCfiPar = undefined;\r\n }\r\n \r\n \r\n \r\n\r\n if(_highlightedElementPar) {\r\n\r\n var seq = this.adjustParToSeqSyncGranularity(_highlightedElementPar);\r\n var element = seq.element;\r\n if (this.includeParWhenAdjustingToSeqSyncGranularity || _highlightedElementPar !== seq)\r\n {\r\n $(_highlightedElementPar.element).removeClass(DEFAULT_MO_SUB_SYNC_CLASS);\r\n }\r\n \r\n if (_playbackActiveClass && _playbackActiveClass !== \"\")\r\n {\r\n //console.debug(\"MO RESET playbackActiveClass: \" + _playbackActiveClass);\r\n $(element.ownerDocument.documentElement).removeClass(_playbackActiveClass);\r\n }\r\n\r\n if (_activeClass && _activeClass !== \"\")\r\n {\r\n //console.debug(\"MO RESET activeClass: \" + _activeClass);\r\n $(element).removeClass(_activeClass);\r\n }\r\n //else\r\n //{\r\n //console.debug(\"MO RESET active NO CLASS: \" + _activeClass);\r\n $(element).removeClass(DEFAULT_MO_ACTIVE_CLASS);\r\n //$(element).css(\"background\", '');\r\n //}\r\n\r\n _highlightedElementPar = undefined;\r\n }\r\n\r\n _activeClass = \"\";\r\n _playbackActiveClass = \"\";\r\n };\r\n\r\n this.adjustParToSeqSyncGranularity = function(par)\r\n {\r\n if (!par) return undefined;\r\n \r\n var sync = _reader.viewerSettings().mediaOverlaysSynchronizationGranularity;\r\n if (sync && sync.length > 0)\r\n {\r\n var element = par.element || (par.cfi ? par.cfi.cfiTextParent : undefined);\r\n if (!element)\r\n {\r\n console.error(\"adjustParToSeqSyncGranularity !element ???\");\r\n return par; // should never happen!\r\n }\r\n\r\n var seq = par.getFirstSeqAncestorWithEpubType(sync, this.includeParWhenAdjustingToSeqSyncGranularity);\r\n if (seq && seq.element)\r\n {\r\n return seq;\r\n }\r\n }\r\n \r\n return par;\r\n };\r\n};\r\n return MediaOverlayElementHighlighter;\r\n});\r\n\n", "// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\ndefine('readium_shared_js/views/scroll_view',[\"jquery\", \"underscore\", \"eventEmitter\", \"../models/bookmark_data\", \"../models/current_pages_info\", \"../helpers\",\r\n \"./one_page_view\", \"../models/page_open_request\", \"../globals\", \"../models/viewer_settings\"],\r\n function ($, _, EventEmitter, BookmarkData, CurrentPagesInfo, Helpers,\r\n OnePageView, PageOpenRequest, Globals, ViewerSettings) {\r\n/**\r\n * Renders content inside a scrollable view port\r\n * @param options\r\n * @param isContinuousScroll\r\n * @param reader\r\n * @constructor\r\n */\r\nvar ScrollView = function (options, isContinuousScroll, reader) {\r\n\r\n var _DEBUG = false;\r\n\r\n $.extend(this, new EventEmitter());\r\n\r\n var SCROLL_MARGIN_TO_SHOW_LAST_VISBLE_LINE = 5;\r\n var ITEM_LOAD_SCROLL_BUFFER = 2000;\r\n var ON_SCROLL_TIME_DALAY = 300;\r\n\r\n var self = this;\r\n\r\n var _$viewport = options.$viewport;\r\n var _spine = options.spine;\r\n var _userStyles = options.userStyles;\r\n var _deferredPageRequest;\r\n var _$contentFrame;\r\n var _$el;\r\n\r\n var _stopTransientViewUpdate = false;\r\n\r\n //this flags used to prevent onScroll event triggering pagination changed when internal layout modifications happens\r\n //if we trigger pagination change without reference to the original request that started the change - we brake the\r\n //Media Overlay bechaviyour\r\n //We can't reuse same flag for all of this action because this actions mey happen in parallel\r\n var _isPerformingLayoutModifications = false; //performing asynch actions that may trigger onScroll;\r\n var _isSettingScrollPosition = false; //this happens when we set scroll position based on open element request\r\n var _isLoadingNewSpineItemOnPageRequest = false; //\r\n\r\n this.isContinuousScroll = function () {\r\n return isContinuousScroll;\r\n };\r\n\r\n this.render = function () {\r\n\r\n var template = Helpers.loadTemplate(\"scrolled_book_frame\", {});\r\n\r\n _$el = $(template);\r\n _$viewport.append(_$el);\r\n\r\n _$contentFrame = $(\"#scrolled-content-frame\", _$el);\r\n _$contentFrame.css(\"overflow\", \"\");\r\n _$contentFrame.css(\"overflow-y\", \"auto\");\r\n _$contentFrame.css(\"overflow-x\", \"hidden\");\r\n _$contentFrame.css(\"-webkit-overflow-scrolling\", \"touch\");\r\n _$contentFrame.css(\"width\", \"100%\");\r\n _$contentFrame.css(\"height\", \"100%\");\r\n _$contentFrame.css(\"position\", \"relative\");\r\n\r\n var settings = reader.viewerSettings();\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\")\r\n {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n // This is a necessary counterpart for the same CSS GPU hardware acceleration trick in one_page_view.js\r\n // This affects the stacking order and re-enables the scrollbar in Safari (works fine in Chrome otherwise)\r\n _$contentFrame.css(\"transform\", \"translateZ(0)\");\r\n }\r\n\r\n // _$contentFrame.css(\"box-sizing\", \"border-box\");\r\n // _$contentFrame.css(\"border\", \"20px solid red\");\r\n\r\n self.applyStyles();\r\n\r\n var lazyScroll = _.debounce(onScroll, ON_SCROLL_TIME_DALAY);\r\n\r\n _$contentFrame.on('scroll', function (e) {\r\n lazyScroll(e);\r\n onScrollDirect();\r\n });\r\n\r\n return self;\r\n };\r\n\r\n function updateLoadedViewsTop(callback, assertScrollPosition) {\r\n\r\n if (_stopTransientViewUpdate) {\r\n callback();\r\n return;\r\n }\r\n\r\n var viewPage = firstLoadedView();\r\n if (!viewPage) {\r\n callback();\r\n return;\r\n }\r\n\r\n var viewPortRange = getVisibleRange(0);\r\n var firstViewRange = getPageViewRange(viewPage);\r\n\r\n if ((viewPortRange.top - firstViewRange.bottom) > ITEM_LOAD_SCROLL_BUFFER) {\r\n var scrollPos = scrollTop();\r\n removePageView(viewPage);\r\n scrollTo(scrollPos - (firstViewRange.bottom - firstViewRange.top), undefined);\r\n assertScrollPosition(\"updateLoadedViewsTop 1\");\r\n updateLoadedViewsTop(callback, assertScrollPosition); //recursion\r\n }\r\n else if ((viewPortRange.top - firstViewRange.top) < ITEM_LOAD_SCROLL_BUFFER) {\r\n addToTopOf(viewPage, function (isElementAdded) {\r\n if (isElementAdded) {\r\n assertScrollPosition(\"updateLoadedViewsTop 2\");\r\n updateLoadedViewsTop(callback, assertScrollPosition); //recursion\r\n }\r\n else {\r\n callback();\r\n }\r\n });\r\n }\r\n else {\r\n callback();\r\n }\r\n\r\n }\r\n\r\n function updateLoadedViewsBottom(callback, assertScrollPosition) {\r\n\r\n if (_stopTransientViewUpdate) {\r\n callback();\r\n return;\r\n }\r\n\r\n var viewPage = lastLoadedView();\r\n if (!viewPage) {\r\n callback();\r\n return;\r\n }\r\n\r\n var viewPortRange = getVisibleRange(0);\r\n var lastViewRange = getPageViewRange(viewPage);\r\n\r\n if ((lastViewRange.top - viewPortRange.bottom) > ITEM_LOAD_SCROLL_BUFFER) {\r\n removePageView(viewPage);\r\n assertScrollPosition(\"updateLoadedViewsBottom 1\");\r\n updateLoadedViewsBottom(callback, assertScrollPosition); //recursion\r\n }\r\n else if ((lastViewRange.bottom - viewPortRange.bottom) < ITEM_LOAD_SCROLL_BUFFER) {\r\n addToBottomOf(viewPage, function (newPageLoaded) {\r\n assertScrollPosition(\"updateLoadedViewsBottom 2\");\r\n if (newPageLoaded) {\r\n updateLoadedViewsBottom(callback, assertScrollPosition); //recursion\r\n }\r\n else {\r\n callback();\r\n }\r\n });\r\n }\r\n else {\r\n callback();\r\n }\r\n\r\n }\r\n\r\n function updateTransientViews(pageView) {\r\n\r\n if (!isContinuousScroll) {\r\n return;\r\n }\r\n\r\n var scrollPosBefore = undefined;\r\n if (_DEBUG)\r\n {\r\n if (pageView)\r\n {\r\n var offset = pageView.offset();\r\n if (offset) scrollPosBefore = offset.top;\r\n }\r\n }\r\n\r\n // This function double-checks whether the browser has shifted the scroll position because of unforeseen rendering issues.\r\n // (this should never happen because we handle scroll adjustments during iframe height resizes explicitely in this code)\r\n var assertScrollPosition = function(msg)\r\n {\r\n if (_DEBUG)\r\n {\r\n if (!scrollPosBefore) return;\r\n var scrollPosAfter = undefined;\r\n\r\n var offset = pageView.offset();\r\n if (offset) scrollPosAfter = offset.top;\r\n\r\n if (!scrollPosAfter) return;\r\n\r\n var diff = scrollPosAfter - scrollPosBefore;\r\n if (Math.abs(diff) > 1)\r\n {\r\n console.debug(\"@@@@@@@@@@@@@@@ SCROLL ADJUST (\" + msg + \") \" + diff + \" -- \" + pageView.currentSpineItem().href);\r\n //_$contentFrame[0].scrollTop = _$contentFrame[0].scrollTop + diff;\r\n }\r\n }\r\n };\r\n\r\n _isPerformingLayoutModifications = true;\r\n updateLoadedViewsBottom(function () {\r\n updateLoadedViewsTop(function () {\r\n setTimeout(function () {\r\n _isPerformingLayoutModifications = false;\r\n }, ON_SCROLL_TIME_DALAY + 100);\r\n }, assertScrollPosition);\r\n }, assertScrollPosition);\r\n }\r\n\r\n var _mediaOverlaysWasPlayingLastTimeScrollStarted = false;\r\n\r\n function onScrollDirect(e)\r\n {\r\n var settings = reader.viewerSettings();\r\n if (!settings.mediaOverlaysPreservePlaybackWhenScroll)\r\n {\r\n if (!_mediaOverlaysWasPlayingLastTimeScrollStarted && reader.isMediaOverlayAvailable())\r\n {\r\n _mediaOverlaysWasPlayingLastTimeScrollStarted = reader.isPlayingMediaOverlay();\r\n if (_mediaOverlaysWasPlayingLastTimeScrollStarted)\r\n {\r\n reader.pauseMediaOverlay();\r\n }\r\n }\r\n }\r\n }\r\n\r\n function onScroll(e)\r\n {\r\n if ( !_isPerformingLayoutModifications\r\n && !_isSettingScrollPosition\r\n && !_isLoadingNewSpineItemOnPageRequest) {\r\n\r\n updateTransientViews();\r\n onPaginationChanged(self);\r\n\r\n var settings = reader.viewerSettings();\r\n if (!settings.mediaOverlaysPreservePlaybackWhenScroll)\r\n {\r\n if (_mediaOverlaysWasPlayingLastTimeScrollStarted)\r\n {\r\n setTimeout(function()\r\n {\r\n reader.playMediaOverlay();\r\n _mediaOverlaysWasPlayingLastTimeScrollStarted = false;\r\n }, 100);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function scrollTo(offset, pageRequest) {\r\n\r\n _$contentFrame[0].scrollTop = offset;\r\n\r\n if (pageRequest) {\r\n onPaginationChanged(pageRequest.initiator, pageRequest.spineItem, pageRequest.elementId);\r\n }\r\n }\r\n\r\n function updatePageViewSizeAndAdjustScroll(pageView)\r\n {\r\n var scrollPos = scrollTop();\r\n var rangeBeforeResize = getPageViewRange(pageView);\r\n\r\n updatePageViewSize(pageView);\r\n\r\n var rangeAfterResize = getPageViewRange(pageView);\r\n\r\n var heightAfter = rangeAfterResize.bottom - rangeAfterResize.top;\r\n var heightBefore = rangeBeforeResize.bottom - rangeBeforeResize.top;\r\n\r\n var delta = heightAfter - heightBefore;\r\n\r\n if (Math.abs(delta) > 0)\r\n {\r\n if (_DEBUG)\r\n {\r\n console.debug(\"IMMEDIATE SCROLL ADJUST: \" + pageView.currentSpineItem().href + \" == \" + delta);\r\n }\r\n scrollTo(scrollPos + delta);\r\n }\r\n }\r\n\r\n function reachStableContentHeight(updateScroll, pageView, iframe, href, fixedLayout, metaWidth, msg, callback)\r\n {\r\n if (!Helpers.isIframeAlive(iframe))\r\n {\r\n if (_DEBUG)\r\n {\r\n console.log(\"reachStableContentHeight ! win && doc (iFrame disposed?)\");\r\n }\r\n\r\n if (callback) callback(false);\r\n return;\r\n }\r\n\r\n var MAX_ATTEMPTS = 10;\r\n var TIME_MS = 300;\r\n\r\n var w = iframe.contentWindow;\r\n var d = iframe.contentDocument;\r\n\r\n var previousPolledContentHeight = parseInt(Math.round(parseFloat(w.getComputedStyle(d.documentElement).height))); //body can be shorter!;\r\n\r\n var initialContentHeight = previousPolledContentHeight;\r\n\r\n if (updateScroll === 0)\r\n {\r\n updatePageViewSizeAndAdjustScroll(pageView);\r\n }\r\n else\r\n {\r\n updatePageViewSize(pageView);\r\n }\r\n\r\n var tryAgainFunc = function(tryAgain)\r\n {\r\n if (_DEBUG && tryAgain !== MAX_ATTEMPTS)\r\n {\r\n console.log(\"tryAgainFunc - \" + tryAgain + \": \" + href + \" <\" + initialContentHeight +\" -- \"+ previousPolledContentHeight + \">\");\r\n }\r\n\r\n tryAgain--;\r\n if (tryAgain < 0)\r\n {\r\n if (_DEBUG)\r\n {\r\n console.error(\"tryAgainFunc abort: \" + href);\r\n }\r\n\r\n if (callback) callback(true);\r\n return;\r\n }\r\n\r\n setTimeout(function()\r\n {\r\n try\r\n {\r\n if (Helpers.isIframeAlive(iframe))\r\n {\r\n var win = iframe.contentWindow;\r\n var doc = iframe.contentDocument;\r\n\r\n var iframeHeight = parseInt(Math.round(parseFloat(window.getComputedStyle(iframe).height)));\r\n\r\n var docHeight = parseInt(Math.round(parseFloat(win.getComputedStyle(doc.documentElement).height))); //body can be shorter!\r\n\r\n if (previousPolledContentHeight !== docHeight)\r\n {\r\n previousPolledContentHeight = docHeight;\r\n\r\n tryAgainFunc(tryAgain);\r\n return;\r\n }\r\n\r\n // CONTENT HEIGHT IS NOW STABILISED\r\n\r\n var diff = iframeHeight - docHeight;\r\n if (Math.abs(diff) > 4)\r\n {\r\n if (_DEBUG)\r\n {\r\n console.log(\"$$$ IFRAME HEIGHT ADJUST: \" + href + \" [\" + diff + \"]<\" + initialContentHeight + \" -- \" + previousPolledContentHeight + \">\");\r\n console.log(msg);\r\n }\r\n\r\n if (updateScroll === 0)\r\n {\r\n updatePageViewSizeAndAdjustScroll(pageView);\r\n }\r\n else\r\n {\r\n updatePageViewSize(pageView);\r\n }\r\n\r\n if (Helpers.isIframeAlive(iframe))\r\n {\r\n var win = iframe.contentWindow;\r\n var doc = iframe.contentDocument;\r\n\r\n var docHeightAfter = parseInt(Math.round(parseFloat(win.getComputedStyle(doc.documentElement).height))); //body can be shorter!\r\n var iframeHeightAfter = parseInt(Math.round(parseFloat(window.getComputedStyle(iframe).height)));\r\n\r\n var newdiff = iframeHeightAfter - docHeightAfter;\r\n if (Math.abs(newdiff) > 4)\r\n {\r\n if (_DEBUG)\r\n {\r\n console.error(\"## IFRAME HEIGHT ADJUST: \" + href + \" [\" + newdiff + \"]<\" + initialContentHeight + \" -- \"+ previousPolledContentHeight + \">\");\r\n console.log(msg);\r\n }\r\n\r\n tryAgainFunc(tryAgain);\r\n return;\r\n }\r\n else\r\n {\r\n if (_DEBUG)\r\n {\r\n console.log(\">> IFRAME HEIGHT ADJUSTED OKAY: \" + href + \" [\"+diff+\"]<\" + initialContentHeight + \" -- \" + previousPolledContentHeight + \">\");\r\n // console.log(msg);\r\n }\r\n }\r\n }\r\n else\r\n {\r\n if (_DEBUG)\r\n {\r\n console.log(\"tryAgainFunc ! win && doc (iFrame disposed?)\");\r\n }\r\n\r\n if (callback) callback(false);\r\n return;\r\n }\r\n }\r\n else\r\n {\r\n //if (_DEBUG)\r\n // console.debug(\"IFRAME HEIGHT NO NEED ADJUST: \" + href);\r\n // console.log(msg);\r\n }\r\n }\r\n else\r\n {\r\n if (_DEBUG)\r\n {\r\n console.log(\"tryAgainFunc ! win && doc (iFrame disposed?)\");\r\n }\r\n\r\n if (callback) callback(false);\r\n return;\r\n }\r\n }\r\n catch(ex)\r\n {\r\n console.error(ex);\r\n\r\n if (callback) callback(false);\r\n return;\r\n }\r\n\r\n if (callback) callback(true);\r\n\r\n }, TIME_MS);\r\n };\r\n\r\n tryAgainFunc(MAX_ATTEMPTS);\r\n }\r\n\r\n\r\n function addToTopOf(topView, callback) {\r\n\r\n var prevSpineItem = _spine.prevItem(topView.currentSpineItem(), true);\r\n if (!prevSpineItem) {\r\n callback(false);\r\n return;\r\n }\r\n\r\n var tmpView = createPageViewForSpineItem(true);\r\n\r\n // add to the end first to avoid scrolling during load\r\n var lastView = lastLoadedView();\r\n tmpView.element().insertAfter(lastView.element());\r\n\r\n tmpView.loadSpineItem(prevSpineItem, function (success, $iframe, spineItem, isNewlyLoaded, context) {\r\n if (success) {\r\n\r\n updatePageViewSize(tmpView);\r\n var range = getPageViewRange(tmpView);\r\n\r\n removePageView(tmpView);\r\n\r\n\r\n var scrollPos = scrollTop();\r\n\r\n var newView = createPageViewForSpineItem();\r\n var originalHeight = range.bottom - range.top;\r\n\r\n\r\n newView.setHeight(originalHeight);\r\n // iframe is loaded hidden here\r\n //this.showIFrame();\r\n //===> not necessary here (temporary iframe)\r\n\r\n newView.element().insertBefore(topView.element());\r\n\r\n scrollPos = scrollPos + originalHeight;\r\n\r\n scrollTo(scrollPos, undefined);\r\n\r\n newView.loadSpineItem(prevSpineItem, function (success, $iframe, spineItem, isNewlyLoaded, context) {\r\n if (success) {\r\n\r\n var continueCallback = function (successFlag)\r\n {\r\n onPageViewLoaded(newView, success, $iframe, spineItem, isNewlyLoaded, context);\r\n\r\n callback(successFlag);\r\n };\r\n\r\n reachStableContentHeight(0, newView, $iframe[0], spineItem.href, spineItem.isFixedLayout(), spineItem.isFixedLayout() ? newView.meta_width() : 0, \"addToTopOf\", continueCallback); // //onIFrameLoad called before this callback, so okay.\r\n }\r\n else {\r\n console.error(\"Unable to open 2 \" + prevSpineItem.href);\r\n removePageView(newView);\r\n callback(false);\r\n }\r\n\r\n });\r\n }\r\n else {\r\n console.error(\"Unable to open 1 \" + prevSpineItem.href);\r\n removePageView(tmpView);\r\n callback(false);\r\n }\r\n\r\n });\r\n }\r\n\r\n function updatePageViewSize(pageView) {\r\n\r\n if (pageView.currentSpineItem().isFixedLayout()) {\r\n pageView.scaleToWidth(_$contentFrame.width());\r\n }\r\n else {\r\n pageView.resizeIFrameToContent();\r\n }\r\n }\r\n\r\n function addToBottomOf(bottomView, callback) {\r\n\r\n var nexSpineItem = _spine.nextItem(bottomView.currentSpineItem(), true);\r\n if (!nexSpineItem) {\r\n callback(false);\r\n return;\r\n }\r\n\r\n var scrollPos = scrollTop();\r\n\r\n var newView = createPageViewForSpineItem();\r\n newView.element().insertAfter(bottomView.element());\r\n\r\n newView.loadSpineItem(nexSpineItem, function (success, $iframe, spineItem, isNewlyLoaded, context) {\r\n if (success) {\r\n\r\n var continueCallback = function (successFlag)\r\n {\r\n onPageViewLoaded(newView, success, $iframe, spineItem, isNewlyLoaded, context);\r\n\r\n callback(successFlag);\r\n };\r\n\r\n reachStableContentHeight(2, newView, $iframe[0], spineItem.href, spineItem.isFixedLayout(), spineItem.isFixedLayout() ? newView.meta_width() : 0, \"addToBottomOf\", continueCallback); // //onIFrameLoad called before this callback, so okay.\r\n }\r\n else {\r\n console.error(\"Unable to load \" + nexSpineItem.href);\r\n callback(false);\r\n }\r\n\r\n });\r\n }\r\n\r\n function removeLoadedItems() {\r\n\r\n var loadedPageViews = [];\r\n\r\n forEachItemView(function (pageView) {\r\n loadedPageViews.push(pageView);\r\n }, false);\r\n\r\n for (var i = 0, count = loadedPageViews.length; i < count; i++) {\r\n removePageView(loadedPageViews[i]);\r\n }\r\n }\r\n\r\n function removePageView(pageView) {\r\n\r\n pageView.element().remove();\r\n\r\n }\r\n\r\n\r\n function setFrameSizesToRectangle(rectangle) {\r\n\r\n _$contentFrame.css(\"left\", rectangle.left);\r\n _$contentFrame.css(\"top\", rectangle.top);\r\n _$contentFrame.css(\"right\", rectangle.right);\r\n _$contentFrame.css(\"bottom\", rectangle.bottom);\r\n\r\n }\r\n\r\n this.remove = function () {\r\n _$el.remove();\r\n };\r\n\r\n this.onViewportResize = function () {\r\n\r\n if (!_$contentFrame) {\r\n return;\r\n }\r\n\r\n forEachItemView(function (pageView) {\r\n\r\n updatePageViewSize(pageView);\r\n }, false);\r\n\r\n onPaginationChanged(self);\r\n\r\n updateTransientViews();\r\n };\r\n\r\n var _viewSettings = undefined;\r\n this.setViewSettings = function (settings) {\r\n\r\n _viewSettings = settings;\r\n\r\n forEachItemView(function (pageView) {\r\n\r\n pageView.setViewSettings(settings);\r\n\r\n }, false);\r\n };\r\n\r\n function createPageViewForSpineItem(isTemporaryView) {\r\n\r\n options.disablePageTransitions = true; // force\r\n\r\n var pageView = new OnePageView(\r\n options,\r\n [\"content-doc-frame\"],\r\n true, //enableBookStyleOverrides\r\n reader);\r\n\r\n pageView.on(OnePageView.SPINE_ITEM_OPEN_START, function($iframe, spineItem) {\r\n\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOAD_START, $iframe, spineItem);\r\n });\r\n\r\n pageView.render();\r\n if (_viewSettings) pageView.setViewSettings(_viewSettings);\r\n\r\n if (!isTemporaryView) {\r\n pageView.element().data(\"pageView\", pageView);\r\n }\r\n\r\n\r\n if (isContinuousScroll)\r\n {\r\n pageView.decorateIframe();\r\n }\r\n\r\n return pageView;\r\n }\r\n\r\n function findPageViewForSpineItem(spineItem, reverse) {\r\n\r\n var retView = undefined;\r\n\r\n forEachItemView(function (pageView) {\r\n if (pageView.currentSpineItem() == spineItem) {\r\n retView = pageView;\r\n //brake the iteration\r\n return false;\r\n }\r\n else {\r\n return true;\r\n }\r\n\r\n }, reverse);\r\n\r\n return retView;\r\n }\r\n\r\n function forEachItemView(func, reverse) {\r\n\r\n var pageNodes = _$contentFrame.children();\r\n\r\n var count = pageNodes.length;\r\n var iter = reverse ? function(ix) { return ix - 1}\r\n : function(ix) { return ix + 1};\r\n\r\n var compare = reverse ? function(ix) { return ix >= 0}\r\n : function(ix) { return ix < count };\r\n\r\n var start = reverse ? count - 1 : 0;\r\n\r\n for (var i = start; compare(i); i = iter(i)) {\r\n\r\n var $element = pageNodes.eq(i);\r\n var curView = $element.data(\"pageView\");\r\n\r\n if (curView) {\r\n\r\n if (func(curView) === false) {\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function firstLoadedView() {\r\n\r\n var firstView = undefined;\r\n\r\n forEachItemView(function (pageView) {\r\n\r\n firstView = pageView;\r\n return false;\r\n\r\n }, false);\r\n\r\n return firstView;\r\n }\r\n\r\n function lastLoadedView() {\r\n\r\n var lastView = undefined;\r\n\r\n forEachItemView(function (pageView) {\r\n lastView = pageView;\r\n return false;\r\n\r\n }, true);\r\n\r\n return lastView;\r\n }\r\n\r\n function onPageViewLoaded(pageView, success, $iframe, spineItem, isNewlyLoaded, context) {\r\n\r\n if (success && isNewlyLoaded) {\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOADED, $iframe, spineItem);\r\n }\r\n\r\n }\r\n\r\n function loadSpineItem(spineItem, callback) {\r\n\r\n removeLoadedItems();\r\n\r\n var scrollPos = scrollTop();\r\n\r\n var loadedView = createPageViewForSpineItem();\r\n\r\n _$contentFrame.append(loadedView.element());\r\n\r\n loadedView.loadSpineItem(spineItem, function (success, $iframe, spineItem, isNewlyLoaded, context) {\r\n\r\n if (success) {\r\n\r\n var continueCallback = function(successFlag)\r\n {\r\n onPageViewLoaded(loadedView, success, $iframe, spineItem, isNewlyLoaded, context);\r\n\r\n callback(loadedView);\r\n\r\n //successFlag should always be true as loadedView iFrame cannot be dead at this stage.\r\n };\r\n\r\n reachStableContentHeight(1, loadedView, $iframe[0], spineItem.href, spineItem.isFixedLayout(), spineItem.isFixedLayout() ? loadedView.meta_width() : 0, \"openPage\", continueCallback); // //onIFrameLoad called before this callback, so okay.\r\n }\r\n else {\r\n console.error(\"Unable to load \" + spineItem.href);\r\n\r\n removePageView(loadedView);\r\n loadedView = undefined;\r\n }\r\n\r\n callback(loadedView);\r\n\r\n });\r\n\r\n }\r\n\r\n this.applyStyles = function () {\r\n\r\n Helpers.setStyles(_userStyles.getStyles(), _$el.parent());\r\n\r\n //because left, top, bottom, right setting ignores padding of parent container\r\n //we have to take it to account manually\r\n var elementMargins = Helpers.Margins.fromElement(_$el);\r\n\r\n setFrameSizesToRectangle(elementMargins.padding);\r\n\r\n };\r\n\r\n this.applyBookStyles = function () {\r\n\r\n forEachItemView(function (pageView) {\r\n pageView.applyBookStyles();\r\n }, false);\r\n };\r\n\r\n\r\n this.openPage = function (pageRequest) {\r\n\r\n _stopTransientViewUpdate = true;\r\n\r\n //local helper function\r\n var doneLoadingSpineItem = function (pageView, pageRequest) {\r\n\r\n _deferredPageRequest = undefined;\r\n openPageViewElement(pageView, pageRequest);\r\n _stopTransientViewUpdate = false;\r\n updateTransientViews(pageView);\r\n };\r\n\r\n if (pageRequest.spineItem) {\r\n\r\n var pageView = findPageViewForSpineItem(pageRequest.spineItem);\r\n if (pageView) {\r\n doneLoadingSpineItem(pageView, pageRequest);\r\n }\r\n else {\r\n _deferredPageRequest = pageRequest;\r\n _isLoadingNewSpineItemOnPageRequest = true;\r\n\r\n loadSpineItem(pageRequest.spineItem, function (pageView) {\r\n\r\n setTimeout(function () {\r\n _isLoadingNewSpineItemOnPageRequest = false;\r\n }, ON_SCROLL_TIME_DALAY + 100);\r\n\r\n if (pageView && _deferredPageRequest) {\r\n if (pageView.currentSpineItem() === _deferredPageRequest.spineItem) {\r\n doneLoadingSpineItem(pageView, _deferredPageRequest);\r\n }\r\n else { //while we where waiting for load new request come\r\n self.openPage(_deferredPageRequest); //recursion\r\n }\r\n }\r\n else {\r\n onPaginationChanged(pageRequest.initiator, pageRequest.spineItem, pageRequest.elementId);\r\n }\r\n\r\n });\r\n }\r\n }\r\n else {\r\n doneLoadingSpineItem(undefined, pageRequest);\r\n }\r\n };\r\n\r\n function openPageViewElement(pageView, pageRequest) {\r\n\r\n var topOffset = 0;\r\n var pageCount;\r\n var $element;\r\n var sfiNav;\r\n var pageRange;\r\n\r\n if (pageRequest.scrollTop !== undefined) {\r\n\r\n topOffset = pageRequest.scrollTop;\r\n }\r\n else if (pageRequest.spineItemPageIndex !== undefined) {\r\n\r\n var pageIndex;\r\n pageCount = calculatePageCount();\r\n if (pageRequest.spineItemPageIndex < 0) {\r\n pageIndex = 0;\r\n }\r\n else if (pageRequest.spineItemPageIndex >= pageCount) {\r\n pageIndex = pageCount - 1;\r\n }\r\n else {\r\n pageIndex = pageRequest.spineItemPageIndex;\r\n }\r\n\r\n topOffset = pageIndex * viewHeight();\r\n }\r\n else if (pageView && pageRequest.elementId) {\r\n\r\n pageRange = getPageViewRange(pageView);\r\n sfiNav = pageView.getNavigator();\r\n $element = sfiNav.getElementById(pageRequest.elementId);\r\n\r\n if (!$element || !$element.length) {\r\n console.warn(\"Element id=\" + pageRequest.elementId + \" not found!\");\r\n return;\r\n }\r\n\r\n if (isElementVisibleOnScreen(pageView, $element, 60)) {\r\n //TODO refactoring required\r\n // this is artificial call because MO player waits for this event to continue playing.\r\n onPaginationChanged(pageRequest.initiator, pageRequest.spineItem, pageRequest.elementId);\r\n return;\r\n }\r\n\r\n topOffset = sfiNav.getVerticalOffsetForElement($element) + pageRange.top;\r\n\r\n }\r\n else if (pageView && pageRequest.elementCfi) {\r\n\r\n pageRange = getPageViewRange(pageView);\r\n sfiNav = pageView.getNavigator();\r\n $element = sfiNav.getElementByCfi(pageRequest.elementCfi);\r\n\r\n if (!$element || !$element.length) {\r\n console.warn(\"Element cfi=\" + pageRequest.elementCfi + \" not found!\");\r\n return;\r\n }\r\n\r\n if (isElementVisibleOnScreen(pageView, $element, 60)) {\r\n //TODO refactoring required\r\n // this is artificial call because MO player waits for this event to continue playing.\r\n onPaginationChanged(pageRequest.initiator, pageRequest.spineItem, pageRequest.elementId);\r\n return;\r\n }\r\n\r\n topOffset = sfiNav.getVerticalOffsetForElement($element) + pageRange.top;\r\n\r\n }\r\n else if (pageRequest.firstPage) {\r\n\r\n topOffset = 0;\r\n }\r\n else if (pageRequest.lastPage) {\r\n pageCount = calculatePageCount();\r\n\r\n if (pageCount === 0) {\r\n return;\r\n }\r\n\r\n topOffset = scrollHeight() - viewHeight() - 5;\r\n }\r\n else if (pageView) {\r\n\r\n pageRange = getPageViewRange(pageView);\r\n topOffset = pageRange.top;\r\n }\r\n else {\r\n topOffset = 0;\r\n }\r\n\r\n if (scrollTop() != topOffset) {\r\n\r\n _isSettingScrollPosition = true;\r\n scrollTo(topOffset, pageRequest);\r\n\r\n setTimeout(function () {\r\n _isSettingScrollPosition = false;\r\n }, ON_SCROLL_TIME_DALAY + 100); //we have to wait more than scroll delay to make sure that we don't react on onScroll\r\n\r\n }\r\n else {\r\n onPaginationChanged(pageRequest.initiator, pageRequest.spineItem, pageRequest.elementId);\r\n }\r\n }\r\n\r\n function calculatePageCount() {\r\n\r\n return Math.ceil(scrollHeight() / viewHeight());\r\n }\r\n\r\n function onPaginationChanged(initiator, paginationRequest_spineItem, paginationRequest_elementId) {\r\n self.emit(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, {\r\n paginationInfo: self.getPaginationInfo(),\r\n initiator: initiator,\r\n spineItem: paginationRequest_spineItem,\r\n elementId: paginationRequest_elementId\r\n });\r\n }\r\n\r\n function scrollTop() {\r\n return _$contentFrame[0].scrollTop;\r\n }\r\n\r\n function scrollBottom() {\r\n return scrollHeight() - (scrollTop() + viewHeight());\r\n }\r\n\r\n function viewHeight() {\r\n return _$contentFrame.height();\r\n }\r\n\r\n function scrollHeight() {\r\n return _$contentFrame[0].scrollHeight;\r\n }\r\n\r\n this.openPageNext = function (initiator) {\r\n\r\n var pageRequest;\r\n\r\n if (scrollBottom() > 0) {\r\n\r\n pageRequest = new PageOpenRequest(undefined, initiator);\r\n pageRequest.scrollTop = scrollTop() + Math.min(scrollBottom(), viewHeight() - SCROLL_MARGIN_TO_SHOW_LAST_VISBLE_LINE);\r\n openPageViewElement(undefined, pageRequest);\r\n }\r\n\r\n };\r\n\r\n this.openPagePrev = function (initiator) {\r\n\r\n var pageRequest;\r\n\r\n if (scrollTop() > 0) {\r\n\r\n pageRequest = new PageOpenRequest(undefined, initiator);\r\n pageRequest.scrollTop = scrollTop() - (viewHeight() - SCROLL_MARGIN_TO_SHOW_LAST_VISBLE_LINE);\r\n if (pageRequest.scrollTop < 0) {\r\n pageRequest.scrollTop = 0;\r\n }\r\n\r\n openPageViewElement(undefined, pageRequest);\r\n }\r\n };\r\n\r\n function getVisiblePageViews() {\r\n\r\n var views = [];\r\n\r\n var range = getVisibleRange(-SCROLL_MARGIN_TO_SHOW_LAST_VISBLE_LINE);\r\n\r\n forEachItemView(function (pageView) {\r\n\r\n if (isPageViewVisibleInRange(pageView, range)) {\r\n\r\n views.push(pageView);\r\n }\r\n else if (views.length > 0) {\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n\r\n }, false);\r\n\r\n return views;\r\n\r\n }\r\n\r\n\r\n function getFirstVisiblePageView() {\r\n\r\n var visibleViews = getVisiblePageViews();\r\n\r\n return visibleViews[0];\r\n }\r\n\r\n function isPageViewVisibleInRange(pageView, range) {\r\n var pageViewRange = getPageViewRange(pageView);\r\n return rangeLength(intersectRanges(pageViewRange, range)) > 0;\r\n }\r\n\r\n function getPageViewRange(pageView) {\r\n var range = {top: 0, bottom: 0};\r\n\r\n range.top = pageView.element().position().top + scrollTop();\r\n range.bottom = range.top + pageView.getCalculatedPageHeight();\r\n\r\n return range;\r\n }\r\n\r\n this.getFirstVisibleElementCfi = function () {\r\n var visibleViewPage = getFirstVisiblePageView();\r\n if (visibleViewPage) {\r\n return visibleViewPage.getNavigator().getFirstVisibleElementCfi(scrollTop());\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n this.getPaginationInfo = function () {\r\n var spineItem;\r\n var pageCount;\r\n var pageView;\r\n var pageViewRange;\r\n var heightAboveViewport;\r\n var heightBelowViewport;\r\n var pageCountAbove;\r\n var pageCountBelow;\r\n\r\n var viewPortRange = getVisibleRange();\r\n var viewPortHeight = viewPortRange.bottom - viewPortRange.top;\r\n\r\n var paginationInfo = new CurrentPagesInfo(_spine, false);\r\n\r\n var visibleViews = getVisiblePageViews();\r\n\r\n for (var i = 0, count = visibleViews.length; i < count; i++) {\r\n\r\n pageView = visibleViews[i];\r\n spineItem = pageView.currentSpineItem();\r\n pageViewRange = getPageViewRange(pageView);\r\n\r\n heightAboveViewport = Math.max(viewPortRange.top - pageViewRange.top, 0);\r\n heightBelowViewport = Math.max(pageViewRange.bottom - viewPortRange.bottom, 0);\r\n\r\n pageCountAbove = Math.ceil(heightAboveViewport / viewPortHeight);\r\n pageCountBelow = Math.ceil(heightBelowViewport / viewPortHeight);\r\n pageCount = pageCountAbove + pageCountBelow + 1;\r\n\r\n paginationInfo.addOpenPage(pageCountAbove, pageCount, spineItem.idref, spineItem.index);\r\n }\r\n\r\n return paginationInfo;\r\n };\r\n\r\n this.bookmarkCurrentPage = function () {\r\n var pageView = getFirstVisiblePageView();\r\n\r\n if (!pageView) {\r\n\r\n return new BookmarkData(\"\", \"\");\r\n }\r\n\r\n return new BookmarkData(pageView.currentSpineItem().idref, self.getFirstVisibleElementCfi());\r\n };\r\n\r\n\r\n this.getLoadedSpineItems = function () {\r\n var spineItems = [];\r\n\r\n forEachItemView(function (pageView) {\r\n spineItems.push(pageView.currentSpineItem());\r\n }, false);\r\n\r\n return spineItems;\r\n };\r\n\r\n this.getElement = function (spineItem, selector) {\r\n var element = undefined;\r\n\r\n forEachItemView(function (pageView) {\r\n if (pageView.currentSpineItem() == spineItem) {\r\n\r\n element = pageView.getNavigator().getElement(selector);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n\r\n }, false);\r\n\r\n return element;\r\n };\r\n\r\n this.getElementByCfi = function (spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n var found = undefined;\r\n\r\n forEachItemView(function (pageView) {\r\n if (pageView.currentSpineItem() == spineItem) {\r\n\r\n found = pageView.getElementByCfi(spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n return false;\r\n }\r\n\r\n return true;\r\n\r\n }, false);\r\n\r\n if (!found) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n return found;\r\n };\r\n\r\n this.getElementById = function (spineItem, id) {\r\n\r\n var found = undefined;\r\n\r\n forEachItemView(function (pageView) {\r\n if (pageView.currentSpineItem() == spineItem) {\r\n\r\n found = pageView.getNavigator().getElementById(id);\r\n return false;\r\n }\r\n\r\n return true;\r\n\r\n }, false);\r\n\r\n if (!found) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n return found;\r\n };\r\n\r\n this.getFirstVisibleMediaOverlayElement = function () {\r\n var viewPortRange = getVisibleRange();\r\n\r\n var moElement = undefined;\r\n var normalizedRange = {top: 0, bottom: 0};\r\n var pageViewRange;\r\n\r\n var steppedToVisiblePage = false;\r\n\r\n forEachItemView(function (pageView) {\r\n pageViewRange = getPageViewRange(pageView);\r\n\r\n normalizedRange.top = Math.max(pageViewRange.top, viewPortRange.top) - pageViewRange.top;\r\n normalizedRange.bottom = Math.min(pageViewRange.bottom, viewPortRange.bottom) - pageViewRange.top;\r\n\r\n if (rangeLength(normalizedRange) > 0) {\r\n steppedToVisiblePage = true;\r\n\r\n moElement = pageView.getNavigator().getFirstVisibleMediaOverlayElement(normalizedRange);\r\n if (moElement) {\r\n return false;\r\n }\r\n }\r\n else if (steppedToVisiblePage) {\r\n return false;\r\n }\r\n\r\n return true; //continue iteration\r\n\r\n }, false);\r\n\r\n return moElement;\r\n };\r\n\r\n // /**\r\n // * @deprecated\r\n // */\r\n // this.getVisibleMediaOverlayElements = function() {\r\n // var viewPortRange = getVisibleRange();\r\n //\r\n // var pageMoElements;\r\n // var moElements = [];\r\n // var normalizedRange = {top: 0, bottom: 0};\r\n // var pageViewRange;\r\n //\r\n // forEachItemView(function(pageView){\r\n // pageViewRange = getPageViewRange(pageView);\r\n //\r\n // normalizedRange.top = Math.max(pageViewRange.top, viewPortRange.top) - pageViewRange.top;\r\n // normalizedRange.bottom = Math.min(pageViewRange.bottom, viewPortRange.bottom) - pageViewRange.top;\r\n //\r\n // if(rangeLength(normalizedRange) > 0) {\r\n // pageMoElements = pageView.getNavigator().getVisibleMediaOverlayElements(normalizedRange);\r\n // moElements.push.apply(moElements, pageMoElements);\r\n // }\r\n // }, false);\r\n //\r\n // return moElements;\r\n // };\r\n\r\n function getVisibleRange(expand) {\r\n if (expand !== 0 && !expand) {\r\n expand = 0;\r\n }\r\n\r\n var range = {\r\n\r\n top: scrollTop() - expand,\r\n bottom: scrollTop() + viewHeight() + expand\r\n };\r\n\r\n if (range.top < 0) {\r\n range.top = 0;\r\n }\r\n\r\n if (range.bottom > scrollHeight()) {\r\n range.bottom = scrollHeight();\r\n }\r\n\r\n return range;\r\n\r\n }\r\n\r\n function intersectRanges(r1, r2) {\r\n return {\r\n\r\n top: Math.max(r1.top, r2.top),\r\n bottom: Math.min(r1.bottom, r2.bottom)\r\n };\r\n }\r\n\r\n function rangeLength(range) {\r\n if (range.bottom < range.top) {\r\n return 0;\r\n }\r\n\r\n return range.bottom - range.top;\r\n }\r\n\r\n function isElementVisibleOnScreen(pageView, $element, percentVisible) {\r\n\r\n var elementRange = getElementRange(pageView, $element);\r\n\r\n return isRangeIsVisibleOnScreen(elementRange, percentVisible);\r\n }\r\n\r\n function isRangeIsVisibleOnScreen(range, percentVisible) {\r\n\r\n var visibleRange = getVisibleRange();\r\n\r\n var smallestVisibleLength = Math.min(rangeLength(visibleRange), rangeLength(range));\r\n if (smallestVisibleLength === 0) {\r\n smallestVisibleLength = 5; // if element is 0 height we will set it to arbitrary 5 pixels - not to divide by 0\r\n }\r\n\r\n var intersectionRange = intersectRanges(visibleRange, range);\r\n\r\n var visiblePercent = (rangeLength(intersectionRange) / smallestVisibleLength) * 100;\r\n\r\n return visiblePercent >= percentVisible;\r\n }\r\n\r\n function getElementRange(pageView, $element) {\r\n\r\n var pageRange = getPageViewRange(pageView);\r\n\r\n var elementRange = {top: 0, bottom: 0};\r\n elementRange.top = $element.offset().top + pageRange.top;\r\n elementRange.bottom = elementRange.top + $element.height();\r\n\r\n return elementRange;\r\n }\r\n\r\n this.insureElementVisibility = function (spineItemId, element, initiator) {\r\n var pageView = undefined;\r\n\r\n forEachItemView(function (pv) {\r\n if (pv.currentSpineItem().idref === spineItemId) {\r\n\r\n pageView = pv;\r\n return false;\r\n }\r\n\r\n return true;\r\n }, false);\r\n\r\n if (!pageView) {\r\n console.warn(\"Page for element \" + element + \" not found\");\r\n return;\r\n }\r\n\r\n var $element = $(element);\r\n\r\n var elementRange = getElementRange(pageView, $element);\r\n\r\n if (!isRangeIsVisibleOnScreen(elementRange, 60)) {\r\n\r\n var spineItem = _spine.getItemById(spineItemId);\r\n var openPageRequest = new PageOpenRequest(spineItem, initiator);\r\n openPageRequest.scrollTop = elementRange.top;\r\n\r\n self.openPage(openPageRequest);\r\n }\r\n\r\n };\r\n\r\n this.isElementCfiVisible = function (spineIdRef, contentCfi) {\r\n // TODO: implement this for scrollable views\r\n return false;\r\n };\r\n\r\n};\r\nreturn ScrollView;\r\n});\r\n\n", "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/views/media_overlay_player',[\"jquery\", \"../helpers\", \"./audio_player\", \"./media_overlay_element_highlighter\", \"../globals\", \"../models/smil_iterator\", \"rangy\", 'readium_cfi_js', './scroll_view'],\r\n function($, Helpers, AudioPlayer, MediaOverlayElementHighlighter, Globals, SmilIterator, rangy, epubCfi, ScrollView) {\r\n/**\r\n *\r\n * @param reader\r\n * @param onStatusChanged\r\n * @constructor\r\n */\r\nvar MediaOverlayPlayer = function(reader, onStatusChanged) {\r\n\r\n\r\n var _smilIterator = undefined;\r\n\r\n var _audioPlayer = new AudioPlayer(onStatusChanged, onAudioPositionChanged, onAudioEnded, onPlay, onPause);\r\n\r\n var _ttsIsPlaying = false;\r\n var _currentTTS = undefined;\r\n var _enableHTMLSpeech = true && typeof window.speechSynthesis !== \"undefined\" && speechSynthesis != null; // set to false to force \"native\" platform TTS engine, rather than HTML Speech API\r\n \r\n var _SpeechSynthesisUtterance = undefined;\r\n //var _skipTTSEndEvent = false;\r\n var TOKENIZE_TTS = false;\r\n\r\n var _embeddedIsPlaying = false;\r\n var _currentEmbedded = undefined;\r\n\r\n\r\n this.isPlaying = function()\r\n {\r\n return _audioPlayer.isPlaying() || _ttsIsPlaying || _embeddedIsPlaying || _blankPagePlayer;\r\n }\r\n\r\n //var _currentPagination = undefined;\r\n var _package = reader.package();\r\n var _settings = reader.viewerSettings();\r\n var self = this;\r\n var _elementHighlighter = new MediaOverlayElementHighlighter(reader);\r\n\r\n reader.on(Globals.Events.READER_VIEW_DESTROYED, function(){\r\n\r\n self.reset();\r\n\r\n });\r\n\r\n\r\n this.applyStyles = function()\r\n {\r\n _elementHighlighter.reDo();\r\n };\r\n\r\n//\r\n// should use this.onSettingsApplied() instead!\r\n// this.setRate = function(rate) {\r\n// _audioPlayer.setRate(rate);\r\n// };\r\n// this.setVolume = function(volume) {\r\n// _audioPlayer.setVolume(volume);\r\n// };\r\n\r\n\r\n this.onSettingsApplied = function() {\r\n//console.debug(_settings);\r\n _audioPlayer.setRate(_settings.mediaOverlaysRate);\r\n _audioPlayer.setVolume(_settings.mediaOverlaysVolume / 100.0);\r\n };\r\n self.onSettingsApplied();\r\n //Globals.\r\n reader.on(Globals.Events.SETTINGS_APPLIED, this.onSettingsApplied, this);\r\n\r\n /*\r\n var lastElement = undefined;\r\n var lastElementColor = \"\";\r\n */\r\n\r\n var _wasPlayingAtDocLoadStart = false;\r\n this.onDocLoadStart = function() {\r\n // 1) Globals.Events.CONTENT_DOCUMENT_LOAD_START\r\n // (maybe 2-page fixed-layout or reflowable spread == 2 documents == 2x events)\r\n // MOPLayer.onDocLoad()\r\n \r\n // 2) Globals.Events.CONTENT_DOCUMENT_LOADED\r\n // (maybe 2-page fixed-layout or reflowable spread == 2 documents == 2x events)\r\n //_mediaOverlayDataInjector.attachMediaOverlayData($iframe, spineItem, _viewerSettings);\r\n \r\n // 3) Globals.Events.PAGINATION_CHANGED (layout finished, notified before rest of app, just once)\r\n // MOPLayer.onPageChanged()\r\n\r\n var wasPlaying = self.isPlaying();\r\n if (wasPlaying)\r\n {\r\n _wasPlayingAtDocLoadStart = true;\r\n self.pause();\r\n }\r\n };\r\n \r\n var _lastPaginationData = undefined;\r\n \r\n this.onPageChanged = function(paginationData) {\r\n \r\n _lastPaginationData = paginationData;\r\n \r\n var wasPausedBecauseNoAutoNextSmil = _wasPausedBecauseNoAutoNextSmil;\r\n _wasPausedBecauseNoAutoNextSmil = false;\r\n \r\n var wasPlayingAtDocLoadStart = _wasPlayingAtDocLoadStart;\r\n _wasPlayingAtDocLoadStart = false;\r\n\r\n if(!paginationData) {\r\n self.reset();\r\n return;\r\n }\r\n\r\n// if (paginationData.paginationInfo)\r\n// {\r\n// _currentPagination = paginationData.paginationInfo;\r\n// }\r\n\r\n /*\r\n if (lastElement)\r\n {\r\n $(lastElement).css(\"background-color\", lastElementColor);\r\n lastElement = undefined;\r\n }\r\n */\r\n\r\n var element = undefined;\r\n var isCfiTextRange = false;\r\n \r\n var fakeOpfRoot = \"/99!\";\r\n var epubCfiPrefix = \"epubcfi\";\r\n \r\n if (paginationData.elementId || paginationData.initiator == self)\r\n {\r\n var spineItems = reader.getLoadedSpineItems();\r\n\r\n var rtl = reader.spine().isRightToLeft();\r\n\r\n for(var i = (rtl ? (spineItems.length - 1) : 0); rtl && i >=0 || !rtl && i < spineItems.length; i += (rtl ? -1: 1))\r\n {\r\n var spineItem = spineItems[i];\r\n if (paginationData.spineItem && paginationData.spineItem != spineItem)\r\n {\r\n continue;\r\n }\r\n \r\n if (paginationData.elementId && paginationData.elementId.indexOf(epubCfiPrefix) === 0)\r\n {\r\n _elementHighlighter.reset(); // ensure clean DOM (no CFI span markers)\r\n \r\n var partial = paginationData.elementId.substr(epubCfiPrefix.length + 1, paginationData.elementId.length - epubCfiPrefix.length - 2);\r\n \r\n if (partial.indexOf(fakeOpfRoot) === 0)\r\n {\r\n partial = partial.substr(fakeOpfRoot.length, partial.length - fakeOpfRoot.length);\r\n }\r\n//console.log(partial);\r\n var parts = partial.split(\",\");\r\n if (parts && parts.length === 3)\r\n {\r\n try\r\n {\r\n var cfi = parts[0] + parts[1];\r\n var $element = reader.getElementByCfi(spineItem, cfi,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n\r\n element = ($element && $element.length > 0) ? $element[0] : undefined;\r\n if (element)\r\n {\r\n if (element.nodeType === Node.TEXT_NODE)\r\n {\r\n element = element.parentNode;\r\n }\r\n break;\r\n }\r\n }\r\n catch (error)\r\n {\r\n console.error(error);\r\n }\r\n }\r\n else\r\n {\r\n try\r\n {\r\n //var cfi = \"epubcfi(\" + partial + \")\";\r\n //var $element = EPUBcfi.getTargetElementWithPartialCFI(cfi, DOC);\r\n var $element = reader.getElementByCfi(spineItem, partial,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n \r\n element = ($element && $element.length > 0) ? $element[0] : undefined;\r\n if (element)\r\n {\r\n if (element.nodeType === Node.TEXT_NODE)\r\n {\r\n element = element.parentNode;\r\n }\r\n break;\r\n }\r\n }\r\n catch (error)\r\n {\r\n console.error(error);\r\n }\r\n }\r\n }\r\n\r\n if (!element)\r\n {\r\n if (paginationData.initiator == self && !paginationData.elementId)\r\n {\r\n var $element = reader.getElement(spineItem, \"body\");\r\n element = ($element && $element.length > 0) ? $element[0] : undefined;\r\n }\r\n else\r\n {\r\n var $element = reader.getElementById(spineItem, paginationData.elementId);\r\n element = ($element && $element.length > 0) ? $element[0] : undefined;\r\n //(\"#\" + Globals.Helpers.escapeJQuerySelector(paginationData.elementId))\r\n }\r\n \r\n if (element)\r\n {\r\n /*\r\n console.error(\"GREEN: \" + paginationData.elementId);\r\n lastElement = element;\r\n lastElementColor = $(element).css(\"background-color\");\r\n $(element).css(\"background-color\", \"green\");\r\n */\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!element)\r\n {\r\n console.error(\"paginationData.elementId BUT !element: \" + paginationData.elementId);\r\n }\r\n }\r\n\r\n var wasPlaying = self.isPlaying() || wasPlayingAtDocLoadStart;\r\n\r\n if(!_smilIterator || !_smilIterator.currentPar) {\r\n if(paginationData.initiator !== self) {\r\n clipBeginOffset = 0.0;\r\n self.reset();\r\n\r\n if (paginationData.elementId && element)\r\n {\r\n if (wasPlaying || wasPausedBecauseNoAutoNextSmil)\r\n {\r\n paginationData.elementIdResolved = element;\r\n self.toggleMediaOverlayRefresh(paginationData);\r\n }\r\n }\r\n else if (wasPlaying || wasPausedBecauseNoAutoNextSmil)\r\n {\r\n self.toggleMediaOverlay();\r\n }\r\n return;\r\n }\r\n\r\n //paginationData.initiator === self\r\n//\r\n// if (!paginationData.elementId)\r\n// {\r\n// console.error(\"!paginationData.elementId\");\r\n// clipBeginOffset = 0.0;\r\n// return;\r\n// }\r\n\r\n if(!element)\r\n {\r\n console.error(\"!element: \" + paginationData.elementId);\r\n clipBeginOffset = 0.0;\r\n return;\r\n }\r\n\r\n var moData = $(element).data(\"mediaOverlayData\");\r\n if(!moData) {\r\n console.error(\"!moData: \" + paginationData.elementId);\r\n clipBeginOffset = 0.0;\r\n return;\r\n }\r\n\r\n var parToPlay = moData.par ? moData.par : moData.pars[0];\r\n\r\n if (moData.pars)\r\n {\r\n for (var iPar = 0; iPar < moData.pars.length; iPar++)\r\n {\r\n var p = moData.pars[iPar];\r\n \r\n if (paginationData.elementId === p.cfi.smilTextSrcCfi)\r\n {\r\n parToPlay = p;\r\n break;\r\n }\r\n }\r\n }\r\n \r\n playPar(parToPlay);\r\n return;\r\n }\r\n\r\n var noReverseData = !_smilIterator.currentPar.element && !_smilIterator.currentPar.cfi;\r\n if(noReverseData) {\r\n console.error(\"!! _smilIterator.currentPar.element ??\");\r\n }\r\n\r\n//console.debug(\"+++> paginationData.elementId: \" + paginationData.elementId + \" /// \" + _smilIterator.currentPar.text.srcFile + \" # \" + _smilIterator.currentPar.text.srcFragmentId); //PageOpenRequest.elementId\r\n\r\n\r\n if(paginationData.initiator == self)\r\n {\r\n var notSameTargetID = paginationData.elementId && paginationData.elementId !== _smilIterator.currentPar.text.srcFragmentId;\r\n\r\n if(notSameTargetID) {\r\n console.error(\"!! paginationData.elementId !== _smilIterator.currentPar.text.srcFragmentId\");\r\n }\r\n\r\n if(notSameTargetID || noReverseData) {\r\n clipBeginOffset = 0.0;\r\n return;\r\n }\r\n\r\n if(wasPlaying)\r\n {\r\n highlightCurrentElement();\r\n }\r\n else\r\n {\r\n playCurrentPar();\r\n }\r\n }\r\n else\r\n {\r\n if(!wasPlaying && !wasPausedBecauseNoAutoNextSmil)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n if(!paginationData.elementId)\r\n {\r\n //self.reset();\r\n }\r\n\r\n if(paginationData.elementId && !element)\r\n {\r\n //self.reset();\r\n return;\r\n }\r\n\r\n if(paginationData.elementId)\r\n {\r\n paginationData.elementIdResolved = element;\r\n }\r\n \r\n self.toggleMediaOverlayRefresh(paginationData);\r\n }\r\n };\r\n\r\n function playPar(par) {\r\n\r\n var parSmil = par.getSmil();\r\n if(!_smilIterator || _smilIterator.smil != parSmil)\r\n {\r\n _smilIterator = new SmilIterator(parSmil);\r\n }\r\n else {\r\n _smilIterator.reset();\r\n }\r\n\r\n _smilIterator.goToPar(par);\r\n\r\n if(!_smilIterator.currentPar) {\r\n console.error(\"playPar !_smilIterator.currentPar\");\r\n return;\r\n }\r\n\r\n playCurrentPar();\r\n }\r\n\r\n var clipBeginOffset = 0.0;\r\n\r\n var _blankPagePlayer = undefined;\r\n\r\n function initBlankPagePlayer()\r\n {\r\n self.resetBlankPage();\r\n\r\n _blankPagePlayer = setTimeout(function() {\r\n\r\n if (!_blankPagePlayer)\r\n {\r\n return;\r\n }\r\n\r\n self.resetBlankPage();\r\n\r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n audioCurrentTime = 0.0;\r\n//console.log(\"BLANK END.\");\r\n //nextSmil(true);\r\n onAudioPositionChanged(_smilIterator.currentPar.audio.clipEnd + 0.1, 2);\r\n\r\n }, 2000);\r\n\r\n onStatusChanged({isPlaying: true});\r\n }\r\n\r\n function playCurrentPar() {\r\n _wasPlayingScrolling = false;\r\n \r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n console.error(\"playCurrentPar !_smilIterator || !_smilIterator.currentPar ???\");\r\n return;\r\n }\r\n\r\n if (!_smilIterator.smil.id)\r\n {\r\n _audioPlayer.reset();\r\n\r\n self.resetTTS();\r\n self.resetEmbedded();\r\n\r\n setTimeout(function()\r\n {\r\n initBlankPagePlayer();\r\n }, 100);\r\n\r\n return;\r\n }\r\n else if (!_smilIterator.currentPar.audio.src)\r\n {\r\n clipBeginOffset = 0.0;\r\n\r\n// if (_currentTTS)\r\n// {\r\n// _skipTTSEnded = true;\r\n// }\r\n\r\n _audioPlayer.reset();\r\n\r\n var element = _smilIterator.currentPar.element;\r\n if (element)\r\n {\r\n audioCurrentTime = 0.0;\r\n\r\n var name = element.nodeName ? element.nodeName.toLowerCase() : undefined;\r\n\r\n if (name === \"audio\" || name === \"video\")\r\n {\r\n self.resetTTS();\r\n self.resetBlankPage();\r\n\r\n if (_currentEmbedded)\r\n {\r\n self.resetEmbedded();\r\n }\r\n\r\n _currentEmbedded = element;\r\n\r\n _currentEmbedded.pause();\r\n\r\n // DONE at reader_view.attachMO()\r\n //$(_currentEmbedded).attr(\"preload\", \"auto\");\r\n\r\n _currentEmbedded.currentTime = 0;\r\n\r\n _currentEmbedded.play();\r\n\r\n $(_currentEmbedded).on(\"ended\", self.onEmbeddedEnd);\r\n\r\n _embeddedIsPlaying = true;\r\n \r\n // gives the audio player some dispatcher time to raise the onPause event\r\n setTimeout(function(){\r\n onStatusChanged({isPlaying: true});\r\n }, 80);\r\n\r\n// $(element).on(\"seeked\", function()\r\n// {\r\n// $(element).off(\"seeked\", onSeeked);\r\n// });\r\n }\r\n else\r\n {\r\n self.resetEmbedded();\r\n self.resetBlankPage();\r\n\r\n _currentTTS = element.textContent; //.innerText (CSS display sensitive + script + style tags)\r\n if (!_currentTTS || _currentTTS == \"\")\r\n {\r\n _currentTTS = undefined;\r\n }\r\n else\r\n {\r\n speakStart(_currentTTS);\r\n }\r\n }\r\n }\r\n \r\n var cfi = _smilIterator.currentPar.cfi;\r\n if (cfi)\r\n {\r\n audioCurrentTime = 0.0;\r\n self.resetEmbedded();\r\n self.resetBlankPage();\r\n\r\n _elementHighlighter.reset(); // ensure clean DOM (no CFI span markers)\r\n \r\n var doc = cfi.cfiTextParent.ownerDocument;\r\n\r\n var startCFI = \"epubcfi(\" + cfi.partialStartCfi + \")\";\r\n var infoStart = EPUBcfi.getTextTerminusInfoWithPartialCFI(startCFI, doc,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n//console.log(infoStart);\r\n\r\n var endCFI = \"epubcfi(\" + cfi.partialEndCfi + \")\";\r\n var infoEnd = EPUBcfi.getTextTerminusInfoWithPartialCFI(endCFI, doc,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n//console.log(infoEnd);\r\n\r\n if (rangy)\r\n {\r\n //infoStart.textNode[0].parentNode.ownerDocument\r\n var range = rangy.createRange(doc); //createNativeRange\r\n range.setStartAndEnd(\r\n infoStart.textNode[0], infoStart.textOffset,\r\n infoEnd.textNode[0], infoEnd.textOffset\r\n );\r\n _currentTTS = range.toString(); //.text()\r\n }\r\n else\r\n {\r\n _currentTTS = undefined;\r\n }\r\n\r\n if (!_currentTTS || _currentTTS == \"\")\r\n {\r\n _currentTTS = undefined;\r\n }\r\n else\r\n {\r\n speakStart(_currentTTS);\r\n }\r\n }\r\n }\r\n else\r\n {\r\n self.resetTTS();\r\n self.resetEmbedded();\r\n self.resetBlankPage();\r\n\r\n var dur = _smilIterator.currentPar.audio.clipEnd - _smilIterator.currentPar.audio.clipBegin;\r\n if (dur <= 0 || clipBeginOffset > dur)\r\n {\r\n console.error(\"### MO XXX PAR OFFSET: \" + clipBeginOffset + \" / \" + dur);\r\n clipBeginOffset = 0.0;\r\n }\r\n else\r\n {\r\n//console.debug(\"### MO PAR OFFSET: \" + clipBeginOffset);\r\n }\r\n\r\n var audioContentRef = Helpers.ResolveContentRef(_smilIterator.currentPar.audio.src, _smilIterator.smil.href);\r\n\r\n var audioSource = _package.resolveRelativeUrlMO(audioContentRef);\r\n\r\n var startTime = _smilIterator.currentPar.audio.clipBegin + clipBeginOffset;\r\n\r\n//console.debug(\"PLAY START TIME: \" + startTime + \"(\"+_smilIterator.currentPar.audio.clipBegin+\" + \"+clipBeginOffset+\")\");\r\n\r\n _audioPlayer.playFile(_smilIterator.currentPar.audio.src, audioSource, startTime); //_smilIterator.currentPar.element ? _smilIterator.currentPar.element : _smilIterator.currentPar.cfi.cfiTextParent\r\n }\r\n\r\n clipBeginOffset = 0.0;\r\n\r\n highlightCurrentElement();\r\n }\r\n\r\n function nextSmil(goNext)\r\n {\r\n self.pause();\r\n\r\n//console.debug(\"current Smil: \" + _smilIterator.smil.href + \" /// \" + _smilIterator.smil.id);\r\n\r\n var nextSmil = goNext ? _package.media_overlay.getNextSmil(_smilIterator.smil) : _package.media_overlay.getPreviousSmil(_smilIterator.smil);\r\n if(nextSmil) {\r\n\r\n//console.debug(\"nextSmil: \" + nextSmil.href + \" /// \" + nextSmil.id);\r\n\r\n _smilIterator = new SmilIterator(nextSmil);\r\n if(_smilIterator.currentPar) {\r\n if (!goNext)\r\n {\r\n while (!_smilIterator.isLast())\r\n {\r\n _smilIterator.next();\r\n }\r\n }\r\n\r\n//console.debug(\"openContentUrl (nextSmil): \" + _smilIterator.currentPar.text.src + \" -- \" + _smilIterator.smil.href);\r\n\r\n reader.openContentUrl(_smilIterator.currentPar.text.src, _smilIterator.smil.href, self);\r\n }\r\n }\r\n else\r\n {\r\n console.log(\"No more SMIL\");\r\n self.reset();\r\n }\r\n }\r\n\r\n\r\n var _skipAudioEnded = false;\r\n// var _skipTTSEnded = false;\r\n\r\n var audioCurrentTime = 0.0;\r\n\r\n var DIRECTION_MARK = -999;\r\n\r\n// var _letPlay = false;\r\n\r\n//from\r\n//1 = audio player\r\n//2 = blank page\r\n//3 = video/audio embbeded\r\n//4 = TTS\r\n//5 = audio end\r\n//6 = user previous/next/escape\r\n function onAudioPositionChanged(position, from, skipping) { //noLetPlay\r\n\r\n audioCurrentTime = position;\r\n\r\n// if (_letPlay)\r\n// {\r\n// return;\r\n// }\r\n\r\n _skipAudioEnded = false;\r\n// _skipTTSEnded = false;\r\n\r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n return;\r\n }\r\n\r\n var parFrom = _smilIterator.currentPar;\r\n \r\n var audio = _smilIterator.currentPar.audio;\r\n\r\n //var TOLERANCE = 0.05;\r\n if(\r\n //position >= (audio.clipBegin - TOLERANCE) &&\r\n position > DIRECTION_MARK &&\r\n position <= audio.clipEnd) {\r\n\r\n//console.debug(\"onAudioPositionChanged: \" + position);\r\n return;\r\n }\r\n\r\n _skipAudioEnded = true;\r\n\r\n//console.debug(\"PLAY NEXT: \" + \"(\" + audio.clipBegin + \" -- \" + audio.clipEnd + \") [\" + from + \"] \" + position);\r\n//console.debug(_smilIterator.currentPar.text.srcFragmentId);\r\n\r\n var isPlaying = _audioPlayer.isPlaying();\r\n if (isPlaying && from === 6)\r\n {\r\n console.debug(\"from userNav _audioPlayer.isPlaying() ???\");\r\n }\r\n\r\n var goNext = position > audio.clipEnd;\r\n\r\n var doNotNextSmil = !_autoNextSmil && from !== 6 && goNext;\r\n\r\n var spineItemIdRef = (_smilIterator && _smilIterator.smil && _smilIterator.smil.spineItemId) ? _smilIterator.smil.spineItemId : ((_lastPaginationData && _lastPaginationData.spineItem && _lastPaginationData.spineItem.idref) ? _lastPaginationData.spineItem.idref : undefined);\r\n if (doNotNextSmil && spineItemIdRef && _lastPaginationData && _lastPaginationData.paginationInfo && _lastPaginationData.paginationInfo.openPages && _lastPaginationData.paginationInfo.openPages.length > 1)\r\n {\r\n //var iPage = _lastPaginationData.paginationInfo.isRightToLeft ? _lastPaginationData.paginationInfo.openPages.length - 1 : 0;\r\n var iPage = 0;\r\n \r\n var openPage = _lastPaginationData.paginationInfo.openPages[iPage];\r\n if (spineItemIdRef === openPage.idref)\r\n {\r\n doNotNextSmil = false;\r\n }\r\n }\r\n \r\n if (goNext)\r\n {\r\n _smilIterator.next();\r\n }\r\n else //position <= DIRECTION_MARK\r\n {\r\n _smilIterator.previous();\r\n }\r\n\r\n if(!_smilIterator.currentPar)\r\n {\r\n //\r\n // if (!noLetPlay)\r\n // {\r\n // _letPlay = true;\r\n // setTimeout(function()\r\n // {\r\n // _letPlay = false;\r\n // nextSmil(goNext);\r\n // }, 200);\r\n // }\r\n // else\r\n // {\r\n // nextSmil(goNext);\r\n // }\r\n\r\n//console.debug(\"NEXT SMIL ON AUDIO POS\");\r\n \r\n if (doNotNextSmil)\r\n {\r\n _wasPausedBecauseNoAutoNextSmil = true;\r\n self.reset();\r\n //self.pause();\r\n }\r\n else\r\n {\r\n nextSmil(goNext);\r\n }\r\n return;\r\n }\r\n\r\n//console.debug(\"ITER: \" + _smilIterator.currentPar.text.srcFragmentId);\r\n\r\n if(!_smilIterator.currentPar.audio) {\r\n self.pause();\r\n return;\r\n }\r\n \r\n if(_settings.mediaOverlaysSkipSkippables)\r\n {\r\n var skip = false;\r\n var parent = _smilIterator.currentPar;\r\n while (parent)\r\n {\r\n if (parent.isSkippable && parent.isSkippable(_settings.mediaOverlaysSkippables))\r\n {\r\n skip = true;\r\n break;\r\n }\r\n parent = parent.parent;\r\n }\r\n\r\n if (skip)\r\n {\r\n console.log(\"MO SKIP: \" + parent.epubtype);\r\n\r\n self.pause();\r\n\r\n var pos = goNext ? _smilIterator.currentPar.audio.clipEnd + 0.1 : DIRECTION_MARK - 1;\r\n\r\n onAudioPositionChanged(pos, from, true); //noLetPlay\r\n return;\r\n }\r\n }\r\n\r\n // _settings.mediaOverlaysSynchronizationGranularity\r\n if (!isPlaying && (_smilIterator.currentPar.element || _smilIterator.currentPar.cfi && _smilIterator.currentPar.cfi.cfiTextParent))\r\n {\r\n var scopeTo = _elementHighlighter.adjustParToSeqSyncGranularity(_smilIterator.currentPar);\r\n if (scopeTo && scopeTo !== _smilIterator.currentPar)\r\n {\r\n var scopeFrom = _elementHighlighter.adjustParToSeqSyncGranularity(parFrom);\r\n if (scopeFrom && (scopeFrom === scopeTo || !goNext))\r\n {\r\n if (scopeFrom === scopeTo)\r\n {\r\n do\r\n {\r\n if (goNext) _smilIterator.next();\r\n else _smilIterator.previous();\r\n } while (_smilIterator.currentPar && _smilIterator.currentPar.hasAncestor(scopeFrom));\r\n\r\n if (!_smilIterator.currentPar)\r\n {\r\n //console.debug(\"adjustParToSeqSyncGranularity nextSmil(goNext)\");\r\n\r\n if (doNotNextSmil)\r\n {\r\n _wasPausedBecauseNoAutoNextSmil = true;\r\n self.reset();\r\n //self.pause();\r\n }\r\n else\r\n {\r\n nextSmil(goNext);\r\n }\r\n \r\n return;\r\n }\r\n }\r\n \r\n//console.debug(\"ADJUSTED: \" + _smilIterator.currentPar.text.srcFragmentId);\r\n if (!goNext)\r\n {\r\n var landed = _elementHighlighter.adjustParToSeqSyncGranularity(_smilIterator.currentPar);\r\n if (landed && landed !== _smilIterator.currentPar)\r\n {\r\n var backup = _smilIterator.currentPar;\r\n \r\n var innerPar = undefined;\r\n do\r\n {\r\n innerPar = _smilIterator.currentPar;\r\n _smilIterator.previous();\r\n }\r\n while (_smilIterator.currentPar && _smilIterator.currentPar.hasAncestor(landed));\r\n \r\n if (_smilIterator.currentPar)\r\n {\r\n _smilIterator.next();\r\n \r\n if (!_smilIterator.currentPar.hasAncestor(landed))\r\n {\r\n console.error(\"adjustParToSeqSyncGranularity !_smilIterator.currentPar.hasAncestor(landed) ???\");\r\n }\r\n //assert \r\n }\r\n else\r\n {\r\n//console.debug(\"adjustParToSeqSyncGranularity reached begin\");\r\n\r\n _smilIterator.reset();\r\n \r\n if (_smilIterator.currentPar !== innerPar)\r\n {\r\n console.error(\"adjustParToSeqSyncGranularity _smilIterator.currentPar !=== innerPar???\");\r\n }\r\n }\r\n\r\n if (!_smilIterator.currentPar)\r\n {\r\n console.error(\"adjustParToSeqSyncGranularity !_smilIterator.currentPar ?????\");\r\n _smilIterator.goToPar(backup);\r\n }\r\n \r\n//console.debug(\"ADJUSTED PREV: \" + _smilIterator.currentPar.text.srcFragmentId);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n if(_audioPlayer.isPlaying()\r\n && _smilIterator.currentPar.audio.src\r\n && _smilIterator.currentPar.audio.src == _audioPlayer.currentSmilSrc()\r\n && position >= _smilIterator.currentPar.audio.clipBegin\r\n && position <= _smilIterator.currentPar.audio.clipEnd)\r\n {\r\n//console.debug(\"ONLY highlightCurrentElement\");\r\n highlightCurrentElement();\r\n return;\r\n }\r\n\r\n //position <= DIRECTION_MARK goes here (goto previous):\r\n\r\n// if (!noLetPlay && position > DIRECTION_MARK\r\n// && _audioPlayer.isPlaying() && _audioPlayer.srcRef() != _smilIterator.currentPar.audio.src)\r\n// {\r\n// _letPlay = true;\r\n// setTimeout(function()\r\n// {\r\n// _letPlay = false;\r\n// playCurrentPar();\r\n// }, 100);\r\n//\r\n// playCurrentPar();\r\n//\r\n// return;\r\n// }\r\n\r\n playCurrentPar();\r\n }\r\n\r\n this.touchInit = function()\r\n {\r\n var todo = _audioPlayer.touchInit();\r\n if (todo)\r\n {\r\n if (_enableHTMLSpeech)\r\n {\r\n speakStart(\"o\", 0);\r\n }\r\n }\r\n };\r\n\r\n var tokeniseTTS = function(element)\r\n {\r\n var BLOCK_DELIMITERS = ['p', 'div', 'pagenum', 'td', 'table', 'li', 'ul', 'ol'];\r\n var BOUNDARY_PUNCTUATION = [',', ';', '.', '-', '??', '??', '?', '!'];\r\n var IGNORABLE_PUNCTUATION = ['\"', '\\'', '??', '??', '??', '??'];\r\n\r\n var flush = function(t, r)\r\n {\r\n if (t.word.length <= 0)\r\n {\r\n return;\r\n }\r\n\r\n var pos = t.text.length;\r\n r.spanMap[pos] = t.counter;\r\n t.text += t.word;\r\n t.markup += t.html.substring(0, t.wordStart) +\r\n '' +\r\n t.html.substring(t.wordStart, t.wordEnd) +\r\n '' + t.html.substring(t.wordEnd, t.html.length);\r\n t.word = \"\";\r\n t.html = \"\";\r\n t.wordStart = -1;\r\n t.wordEnd = -1;\r\n t.counter++;\r\n };\r\n\r\n var r =\r\n {\r\n element : element,\r\n innerHTML_tts : \"\",\r\n spanMap : {},\r\n text : \"\",\r\n lastCharIndex : undefined\r\n };\r\n r.element.innerHTML_original = element.innerHTML;\r\n\r\n var t =\r\n {\r\n inTag : false,\r\n counter : 0,\r\n wordStart : -1,\r\n wordEnd : -1,\r\n text : '',\r\n markup : '',\r\n word : '',\r\n html : ''\r\n };\r\n\r\n var limit = r.element.innerHTML_original.length;\r\n var i = 0;\r\n while (i <= limit)\r\n {\r\n if (t.inTag)\r\n {\r\n t.html += r.element.innerHTML_original[i];\r\n if (r.element.innerHTML_original[i] == \">\") {\r\n t.inTag = false;\r\n // if it's a block element delimiter, flush\r\n var blockCheck = t.html.match(/<\\/(.*?)>$/);\r\n if (blockCheck && BLOCK_DELIMITERS.indexOf(blockCheck[1]) > -1)\r\n {\r\n flush(t, r);\r\n t.text += ' ';\r\n }\r\n }\r\n }\r\n else\r\n {\r\n if (i == limit || r.element.innerHTML_original[i].match(/\\s/))\r\n {\r\n flush(t, r);\r\n\r\n // append the captured whitespace\r\n if (i < limit)\r\n {\r\n t.text += r.element.innerHTML_original[i];\r\n t.markup += r.element.innerHTML_original[i];\r\n }\r\n }\r\n else if (BOUNDARY_PUNCTUATION.indexOf(r.element.innerHTML_original[i]) > -1)\r\n {\r\n flush(t, r);\r\n\r\n t.wordStart = t.html.length;\r\n t.wordEnd = t.html.length + 1;\r\n t.word += r.element.innerHTML_original[i];\r\n t.html += r.element.innerHTML_original[i];\r\n\r\n flush(t, r);\r\n }\r\n else if (r.element.innerHTML_original[i] == \"<\")\r\n {\r\n t.inTag = true;\r\n t.html += r.element.innerHTML_original[i];\r\n }\r\n else\r\n {\r\n if (t.word.length == 0)\r\n {\r\n t.wordStart = t.html.length;\r\n }\r\n t.wordEnd = t.html.length + 1;\r\n t.word += r.element.innerHTML_original[i];\r\n t.html += r.element.innerHTML_original[i];\r\n }\r\n }\r\n i++;\r\n }\r\n//\r\n//console.debug(t.text);\r\n// console.debug(\"----\");\r\n//console.debug(t.markup);\r\n\r\n r.text = t.text;\r\n r.innerHTML_tts = t.markup;\r\n r.element.innerHTML = r.innerHTML_tts;\r\n\r\n return r;\r\n };\r\n\r\n var $ttsStyle = undefined;\r\n function ensureTTSStyle($element)\r\n {\r\n if ($ttsStyle && $ttsStyle[0].ownerDocument === $element[0].ownerDocument)\r\n {\r\n return;\r\n }\r\n\r\n var style = \".tts_on{background-color:red;color:white;} .tts_off{}\";\r\n\r\n $head = $(\"head\", $element[0].ownerDocument.documentElement);\r\n\r\n $ttsStyle = $(\"\").appendTo($head);\r\n\r\n $ttsStyle.append(style);\r\n }\r\n\r\n var speakStart = function(txt, volume)\r\n {\r\n var tokenData = undefined;\r\n var curPar = (_smilIterator && _smilIterator.currentPar) ? _smilIterator.currentPar : undefined;\r\n var element = curPar ? curPar.element : undefined;\r\n var cfi = curPar ? curPar.cfi : undefined;\r\n\r\n if (!volume || volume > 0)\r\n {\r\n // gives the audio player some dispatcher time to raise the onPause event\r\n setTimeout(function(){\r\n onStatusChanged({isPlaying: true});\r\n }, 80);\r\n \r\n _ttsIsPlaying = true;\r\n\r\n if (TOKENIZE_TTS && element)\r\n {\r\n var $el = $(element);\r\n ensureTTSStyle($el);\r\n\r\n\r\n if (element.innerHTML_original)\r\n {\r\n element.innerHTML = element.innerHTML_original;\r\n element.innerHTML_original = undefined;\r\n }\r\n tokenData = tokeniseTTS(element);\r\n }\r\n }\r\n\r\n if (!_enableHTMLSpeech)\r\n {\r\n reader.emit(Globals.Events.MEDIA_OVERLAY_TTS_SPEAK, {tts: txt}); // resume if txt == undefined\r\n return;\r\n }\r\n\r\n if (!txt && window.speechSynthesis.paused)\r\n {\r\n//console.debug(\"TTS resume\");\r\n window.speechSynthesis.resume();\r\n\r\n return;\r\n }\r\n\r\n var text = txt || _currentTTS;\r\n\r\n if (text)\r\n {\r\n if (_SpeechSynthesisUtterance)\r\n {\r\n//console.debug(\"_SpeechSynthesisUtterance nullify\");\r\n\r\n if (TOKENIZE_TTS)\r\n {\r\n if (_SpeechSynthesisUtterance.onend)\r\n {\r\n _SpeechSynthesisUtterance.onend({forceSkipEnd: true, target: _SpeechSynthesisUtterance});\r\n }\r\n \r\n _SpeechSynthesisUtterance.tokenData = undefined;\r\n \r\n _SpeechSynthesisUtterance.onboundary = undefined;\r\n // _SpeechSynthesisUtterance.onboundary = function(event)\r\n // {\r\n // console.debug(\"OLD TTS boundary\");\r\n // \r\n // event.target.tokenData = undefined;\r\n // \r\n // };\r\n }\r\n\r\n _SpeechSynthesisUtterance.onend = undefined;\r\n// _SpeechSynthesisUtterance.onend = function(event)\r\n// {\r\n// console.debug(\"OLD TTS ended\");\r\n// if (TOKENIZE_TTS)\r\n// {\r\n// event.target.tokenData = undefined;\r\n// }\r\n// };\r\n \r\n _SpeechSynthesisUtterance.onerror = undefined;\r\n// _SpeechSynthesisUtterance.onerror = function(event)\r\n// {\r\n// console.debug(\"OLD TTS error\");\r\n// //console.debug(event);\r\n// if (TOKENIZE_TTS)\r\n// {\r\n// event.target.tokenData = undefined;\r\n// }\r\n// };\r\n\r\n _SpeechSynthesisUtterance = undefined;\r\n }\r\n//\r\n// if (window.speechSynthesis.pending ||\r\n// window.speechSynthesis.speaking)\r\n// {\r\n// _skipTTSEndEvent = true;\r\n// }\r\n \r\nconsole.debug(\"paused: \"+window.speechSynthesis.paused);\r\nconsole.debug(\"speaking: \"+window.speechSynthesis.speaking);\r\nconsole.debug(\"pending: \"+window.speechSynthesis.pending);\r\n\r\n// if (!window.speechSynthesis.paused)\r\n// {\r\n// console.debug(\"TTS pause before speak\");\r\n// window.speechSynthesis.pause();\r\n// }\r\n \r\n function cancelTTS(first)\r\n {\r\n if (first || window.speechSynthesis.pending)\r\n {\r\n console.debug(\"TTS cancel before speak\");\r\n window.speechSynthesis.cancel();\r\n\r\n setTimeout(function()\r\n {\r\n cancelTTS(false);\r\n }, 5);\r\n }\r\n else\r\n {\r\n updateTTS();\r\n }\r\n }\r\n cancelTTS(true);\r\n \r\n function updateTTS()\r\n {\r\n // setTimeout(function()\r\n // {\r\n\r\n _SpeechSynthesisUtterance = new SpeechSynthesisUtterance();\r\n\r\n if (TOKENIZE_TTS && tokenData)\r\n {\r\n _SpeechSynthesisUtterance.tokenData = tokenData;\r\n \r\n _SpeechSynthesisUtterance.onboundary = function(event)\r\n //_SpeechSynthesisUtterance.addEventListener(\"boundary\", function(event)\r\n {\r\n if (!_SpeechSynthesisUtterance)\r\n {\r\n return;\r\n }\r\n\r\n console.debug(\"TTS boundary: \" + event.name + \" / \" + event.charIndex);\r\n //console.debug(event);\r\n\r\n var tokenised = event.target.tokenData;\r\n if (!tokenised || !tokenised.spanMap.hasOwnProperty(event.charIndex))\r\n {\r\n return;\r\n }\r\n\r\n if (false && tokenised.lastCharIndex)\r\n {\r\n //console.debug(\"TTS lastCharIndex: \" + tokenised.lastCharIndex);\r\n var id = 'tts_' + tokenised.spanMap[tokenised.lastCharIndex];\r\n //console.debug(\"TTS lastCharIndex ID: \" + id);\r\n var spanPrevious = tokenised.element.querySelector(\"#\"+id);\r\n if (spanPrevious)\r\n {\r\n //console.debug(\"TTS OFF\");\r\n spanPrevious.className = 'tts_off';\r\n //spanPrevious.style.backgroundColor = \"white\";\r\n }\r\n }\r\n else\r\n {\r\n [].forEach.call(\r\n tokenised.element.querySelectorAll(\".tts_on\"),\r\n function(el)\r\n {\r\n console.debug(\"TTS OFF \" + el.id);\r\n el.className = 'tts_off';\r\n }\r\n );\r\n }\r\n\r\n var id = 'tts_' + tokenised.spanMap[event.charIndex];\r\n console.debug(\"TTS charIndex ID: \" + id);\r\n var spanNew = tokenised.element.querySelector(\"#\"+id);\r\n if (spanNew)\r\n {\r\n console.debug(\"TTS ON\");\r\n spanNew.className = 'tts_on';\r\n //spanNew.style.backgroundColor = \"transparent\";\r\n }\r\n\r\n tokenised.lastCharIndex = event.charIndex;\r\n };\r\n }\r\n\r\n _SpeechSynthesisUtterance.onend = function(event)\r\n //_SpeechSynthesisUtterance.addEventListener(\"end\", function(event)\r\n {\r\n if (!_SpeechSynthesisUtterance)\r\n {\r\n //_skipTTSEndEvent = false;\r\n return;\r\n }\r\n //\r\n // if (_skipTTSEndEvent)\r\n // {\r\n // _skipTTSEndEvent = false;\r\n // return;\r\n // }\r\n\r\nconsole.debug(\"TTS ended\");\r\n //console.debug(event);\r\n\r\n if (TOKENIZE_TTS)\r\n {\r\n var tokenised = event.target.tokenData;\r\n\r\n var doEnd = !event.forceSkipEnd && (_SpeechSynthesisUtterance === event.target) && (!tokenised || tokenised.element.innerHTML_original);\r\n\r\n if (tokenised)\r\n {\r\n if (tokenised.element.innerHTML_original)\r\n {\r\n tokenised.element.innerHTML = tokenised.element.innerHTML_original;\r\n }\r\n else\r\n {\r\n [].forEach.call(\r\n tokenised.element.querySelectorAll(\".tts_on\"),\r\n function(el)\r\n {\r\n console.debug(\"TTS OFF (end)\" + el.id);\r\n el.className = 'tts_off';\r\n }\r\n );\r\n }\r\n\r\n tokenised.element.innerHTML_original = undefined;\r\n }\r\n\r\n\r\n if (doEnd)\r\n {\r\n self.onTTSEnd();\r\n }\r\n else\r\n {\r\n console.debug(\"TTS end SKIPPED\");\r\n }\r\n }\r\n else\r\n {\r\n self.onTTSEnd();\r\n }\r\n };\r\n\r\n _SpeechSynthesisUtterance.onerror = function(event)\r\n //_SpeechSynthesisUtterance.addEventListener(\"error\", function(event)\r\n {\r\n if (!_SpeechSynthesisUtterance)\r\n {\r\n return;\r\n }\r\n\r\nconsole.error(\"TTS error\");\r\n//console.debug(event);\r\nconsole.debug(_SpeechSynthesisUtterance.text);\r\nconsole.debug(window.speechSynthesis.paused);\r\nconsole.debug(window.speechSynthesis.pending);\r\nconsole.debug(window.speechSynthesis.speaking);\r\n\r\n if (TOKENIZE_TTS)\r\n {\r\n var tokenised = event.target.tokenData;\r\n if (tokenised)\r\n {\r\n if (tokenised.element.innerHTML_original)\r\n {\r\n tokenised.element.innerHTML = tokenised.element.innerHTML_original;\r\n }\r\n else\r\n {\r\n [].forEach.call(\r\n tokenised.element.ownerDocument.querySelectorAll(\".tts_on\"),\r\n function(el)\r\n {\r\n console.debug(\"TTS OFF (error)\" + el.id);\r\n el.className = 'tts_off';\r\n }\r\n );\r\n }\r\n tokenised.element.innerHTML_original = undefined;\r\n }\r\n }\r\n };\r\n\r\n var vol = volume || _audioPlayer.getVolume();\r\n _SpeechSynthesisUtterance.volume = vol;\r\n\r\n _SpeechSynthesisUtterance.rate = _audioPlayer.getRate();\r\n _SpeechSynthesisUtterance.pitch = 1;\r\n\r\n //_SpeechSynthesisUtterance.lang = \"en-US\";\r\n\r\n _SpeechSynthesisUtterance.text = text;\r\n\r\n //console.debug(\"TTS speak: \" + text);\r\n window.speechSynthesis.speak(_SpeechSynthesisUtterance);\r\n\r\n if (window.speechSynthesis.paused)\r\n {\r\nconsole.debug(\"TTS resume\");\r\n window.speechSynthesis.resume();\r\n }\r\n\r\n //}, 5);\r\n }\r\n }\r\n };\r\n\r\n var speakStop = function()\r\n {\r\n onStatusChanged({isPlaying: false});\r\n _ttsIsPlaying = false;\r\n\r\n if (!_enableHTMLSpeech)\r\n {\r\n reader.emit(Globals.Events.MEDIA_OVERLAY_TTS_STOP, undefined);\r\n return;\r\n }\r\n\r\n//console.debug(\"TTS pause\");\r\n window.speechSynthesis.pause();\r\n };\r\n\r\n var _timerTick = undefined;\r\n\r\n function onPlay() {\r\n onPause();\r\n\r\n var func = function() {\r\n\r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n return;\r\n }\r\n\r\n var smil = _smilIterator.smil; //currentPar.getSmil();\r\n if (!smil.mo)\r\n {\r\n return;\r\n }\r\n\r\n// if (!_smilIterator.currentPar.audio.src)\r\n// {\r\n// return;\r\n// }\r\n\r\n var playPosition = audioCurrentTime - _smilIterator.currentPar.audio.clipBegin;\r\n if (playPosition <= 0)\r\n {\r\n return;\r\n }\r\n\r\n var smilIndex = smil.mo.smil_models.indexOf(smil);\r\n\r\n var smilIterator = new SmilIterator(smil);\r\n var parIndex = -1;\r\n while (smilIterator.currentPar)\r\n {\r\n parIndex++;\r\n if (smilIterator.currentPar == _smilIterator.currentPar)\r\n {\r\n break;\r\n }\r\n smilIterator.next();\r\n }\r\n\r\n onStatusChanged({playPosition: playPosition, smilIndex: smilIndex, parIndex: parIndex});\r\n };\r\n\r\n setTimeout(func, 500);\r\n\r\n _timerTick = setInterval(func, 1500);\r\n }\r\n\r\n function onPause() {\r\n\r\n audioCurrentTime = 0.0;\r\n if (_timerTick !== undefined)\r\n {\r\n clearInterval(_timerTick);\r\n }\r\n _timerTick = undefined;\r\n }\r\n\r\n\r\n this.onEmbeddedEnd = function()\r\n {\r\n audioCurrentTime = 0.0;\r\n\r\n _embeddedIsPlaying = false;\r\n //_currentEmbedded = undefined;\r\n\r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n onAudioPositionChanged(_smilIterator.currentPar.audio.clipEnd + 0.1, 3);\r\n };\r\n\r\n this.onTTSEnd = function()\r\n {\r\n audioCurrentTime = 0.0;\r\n\r\n _ttsIsPlaying = false;\r\n //_currentTTS = undefined;\r\n\r\n// if(_skipTTSEnded)\r\n// {\r\n// _skipTTSEnded = false;\r\n// return;\r\n// }\r\n\r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n onAudioPositionChanged(_smilIterator.currentPar.audio.clipEnd + 0.1, 4);\r\n };\r\n\r\n function onAudioEnded() {\r\n\r\n onPause();\r\n//\r\n// if (_letPlay)\r\n// {\r\n// return;\r\n// }\r\n\r\n if(_skipAudioEnded)\r\n {\r\n _skipAudioEnded = false;\r\n return;\r\n }\r\n\r\n if (!_smilIterator || !_smilIterator.currentPar)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n onAudioPositionChanged(_smilIterator.currentPar.audio.clipEnd + 0.1, 5);\r\n }\r\n\r\n function highlightCurrentElement() {\r\n\r\n if(!_smilIterator) {\r\n return;\r\n }\r\n\r\n if(!_smilIterator.currentPar) {\r\n return;\r\n }\r\n\r\n if (_smilIterator.currentPar.text.srcFragmentId && _smilIterator.currentPar.text.srcFragmentId.length > 0)\r\n {\r\n if (_smilIterator.currentPar.element) {\r\n //console.error(_smilIterator.currentPar.element.id + \": \" + _smilIterator.currentPar.audio.clipBegin + \" / \" + _smilIterator.currentPar.audio.clipEnd);\r\n\r\n if (!_elementHighlighter.isElementHighlighted(_smilIterator.currentPar))\r\n {\r\n _elementHighlighter.highlightElement(_smilIterator.currentPar, _package.media_overlay.activeClass, _package.media_overlay.playbackActiveClass);\r\n\r\n if (!_wasPlayingScrolling)\r\n {\r\n reader.insureElementVisibility(_smilIterator.currentPar.getSmil().spineItemId, _smilIterator.currentPar.element, self);\r\n }\r\n }\r\n \r\n return;\r\n \r\n } else if (_smilIterator.currentPar.cfi) {\r\n\r\n if (!_elementHighlighter.isCfiHighlighted(_smilIterator.currentPar))\r\n {\r\n _elementHighlighter.highlightCfi(_smilIterator.currentPar, _package.media_overlay.activeClass, _package.media_overlay.playbackActiveClass);\r\n\r\n if (!_wasPlayingScrolling)\r\n {\r\n reader.insureElementVisibility(_smilIterator.currentPar.getSmil().spineItemId, _smilIterator.currentPar.cfi.cfiTextParent, self);\r\n }\r\n }\r\n \r\n return;\r\n }\r\n }\r\n \r\n // body (not FRAG ID)\r\n if (_smilIterator.currentPar.element) {\r\n return;\r\n }\r\n \r\n //else: single SMIL per multiple XHTML? ==> open new spine item\r\n \r\n /*\r\n var textRelativeRef = Globals.Helpers.ResolveContentRef(_smilIterator.currentPar.text.srcFile, _smilIterator.smil.href);\r\nconsole.debug(\"textRelativeRef: \" + textRelativeRef);\r\n if (textRelativeRef)\r\n {\r\n var textAbsoluteRef = _package.resolveRelativeUrl(textRelativeRef);\r\nconsole.debug(\"textAbsoluteRef: \" + textAbsoluteRef);\r\n }\r\n */\r\n\r\n var src = _smilIterator.currentPar.text.src;\r\n var base = _smilIterator.smil.href;\r\n\r\n //self.pause();\r\n //self.reset();\r\n _smilIterator = undefined;\r\n\r\n reader.openContentUrl(src, base, self);\r\n }\r\n\r\n this.escape = function() {\r\n \r\n if(!_smilIterator || !_smilIterator.currentPar) {\r\n\r\n this.toggleMediaOverlay();\r\n return;\r\n }\r\n\r\n if(!self.isPlaying())\r\n {\r\n //playCurrentPar();\r\n self.play();\r\n return;\r\n }\r\n\r\n if(_settings.mediaOverlaysEscapeEscapables)\r\n {\r\n var parent = _smilIterator.currentPar;\r\n while (parent)\r\n {\r\n if (parent.isEscapable && parent.isEscapable(_settings.mediaOverlaysEscapables))\r\n {\r\n do\r\n {\r\n _smilIterator.next();\r\n } while (_smilIterator.currentPar && _smilIterator.currentPar.hasAncestor(parent));\r\n\r\n if (!_smilIterator.currentPar)\r\n {\r\n nextSmil(true);\r\n return;\r\n }\r\n\r\n //_smilIterator.goToPar(_smilIterator.currentPar);\r\n playCurrentPar();\r\n return;\r\n }\r\n\r\n parent = parent.parent;\r\n }\r\n }\r\n\r\n this.nextMediaOverlay(true);\r\n };\r\n\r\n\r\n this.playUserPar = function(par) {\r\n if(self.isPlaying())\r\n {\r\n self.pause();\r\n }\r\n\r\n if (par.element || par.cfi && par.cfi.cfiTextParent)\r\n {\r\n var seq = _elementHighlighter.adjustParToSeqSyncGranularity(par);\r\n if (seq && seq !== par)\r\n {\r\n var findFirstPar = function(smilNode)\r\n {\r\n if (smilNode.nodeType && smilNode.nodeType === \"par\") return smilNode;\r\n \r\n if (!smilNode.children || smilNode.children.length <= 0) return undefined;\r\n \r\n for (var i = 0; i < smilNode.children.length; i++)\r\n {\r\n var child = smilNode.children[i];\r\n var inPar = findFirstPar(child);\r\n if (inPar) return inPar;\r\n }\r\n };\r\n var firstPar = findFirstPar(seq);\r\n if (firstPar) par = firstPar;\r\n }\r\n }\r\n\r\n playPar(par);\r\n };\r\n\r\n this.resetTTS = function() {\r\n _currentTTS = undefined;\r\n// _skipTTSEnded = false;\r\n speakStop();\r\n };\r\n\r\n this.resetBlankPage = function() {\r\n if (_blankPagePlayer)\r\n {\r\n var timer = _blankPagePlayer;\r\n _blankPagePlayer = undefined;\r\n clearTimeout(timer);\r\n }\r\n _blankPagePlayer = undefined;\r\n\r\n onStatusChanged({isPlaying: false});\r\n };\r\n\r\n this.resetEmbedded = function() {\r\n if (_currentEmbedded)\r\n {\r\n $(_currentEmbedded).off(\"ended\", self.onEmbeddedEnd);\r\n _currentEmbedded.pause();\r\n }\r\n _currentEmbedded = undefined;\r\n onStatusChanged({isPlaying: false});\r\n _embeddedIsPlaying = false;\r\n };\r\n\r\n this.reset = function() {\r\n clipBeginOffset = 0.0;\r\n _audioPlayer.reset();\r\n self.resetTTS();\r\n self.resetEmbedded();\r\n self.resetBlankPage();\r\n _elementHighlighter.reset();\r\n _smilIterator = undefined;\r\n _skipAudioEnded = false;\r\n };\r\n\r\n this.play = function ()\r\n {\r\n if (_smilIterator && _smilIterator.smil && !_smilIterator.smil.id)\r\n {\r\n initBlankPagePlayer();\r\n return;\r\n }\r\n else if (_currentEmbedded)\r\n {\r\n _embeddedIsPlaying = true;\r\n _currentEmbedded.play();\r\n onStatusChanged({isPlaying: true});\r\n }\r\n else if (_currentTTS)\r\n {\r\n speakStart(undefined);\r\n }\r\n else\r\n {\r\n if (!_audioPlayer.play())\r\n {\r\n console.log(\"Audio player was dead, reactivating...\");\r\n\r\n this.reset();\r\n this.toggleMediaOverlay();\r\n return;\r\n }\r\n }\r\n\r\n highlightCurrentElement();\r\n }\r\n\r\n this.pause = function()\r\n {\r\n _wasPlayingScrolling = false;\r\n \r\n if (_blankPagePlayer)\r\n {\r\n this.resetBlankPage();\r\n }\r\n else if (_embeddedIsPlaying)\r\n {\r\n _embeddedIsPlaying = false;\r\n if (_currentEmbedded)\r\n {\r\n _currentEmbedded.pause();\r\n }\r\n onStatusChanged({isPlaying: false});\r\n }\r\n else if (_ttsIsPlaying)\r\n {\r\n speakStop();\r\n }\r\n else\r\n {\r\n _audioPlayer.pause();\r\n }\r\n\r\n _elementHighlighter.reset();\r\n }\r\n\r\n this.isMediaOverlayAvailable = function() {\r\n\r\n// console.debug(\"isMediaOverlayAvailable()\");\r\n//\r\n// var now1 = window.performance && window.performance.now ? window.performance.now() : Date.now();\r\n//\r\n// if (console.time)\r\n// {\r\n// console.time(\"MO\");\r\n// }\r\n\r\n var visibleMediaElement = reader.getFirstVisibleMediaOverlayElement();\r\n\r\n// if (console.timeEnd)\r\n// {\r\n// console.timeEnd(\"MO\");\r\n// }\r\n//\r\n// var now2 = window.performance && window.performance.now ? window.performance.now() : Date.now();\r\n//\r\n// console.debug(now2 - now1);\r\n\r\n return typeof visibleMediaElement !== \"undefined\";\r\n };\r\n\r\n this.nextOrPreviousMediaOverlay = function(previous) {\r\n if(self.isPlaying())\r\n {\r\n self.pause();\r\n }\r\n else\r\n {\r\n if (_smilIterator && _smilIterator.currentPar)\r\n {\r\n //playCurrentPar();\r\n self.play();\r\n return;\r\n }\r\n }\r\n\r\n if(!_smilIterator)\r\n {\r\n this.toggleMediaOverlay();\r\n return;\r\n }\r\n\r\n var position = previous ? DIRECTION_MARK - 1 : _smilIterator.currentPar.audio.clipEnd + 0.1;\r\n\r\n onAudioPositionChanged(position, 6);\r\n // setTimeout(function(){\r\n // \r\n // }, 1);\r\n\r\n //self.play();\r\n //playCurrentPar();\r\n };\r\n\r\n this.nextMediaOverlay = function() {\r\n this.nextOrPreviousMediaOverlay(false);\r\n };\r\n\r\n this.previousMediaOverlay = function() {\r\n this.nextOrPreviousMediaOverlay(true);\r\n };\r\n\r\n /*\r\n this.setMediaOverlaySkippables = function(items) {\r\n\r\n };\r\n\r\n this.setMediaOverlayEscapables = function(items) {\r\n\r\n };\r\n */\r\n\r\n this.mediaOverlaysOpenContentUrl = function(contentRefUrl, sourceFileHref, offset)\r\n {\r\n clipBeginOffset = offset;\r\n\r\n //self.pause();\r\n //self.reset();\r\n _smilIterator = undefined;\r\n\r\n reader.openContentUrl(contentRefUrl, sourceFileHref, self);\r\n\r\n /*\r\n if (_currentPagination && _currentPagination.isFixedLayout && _currentPagination.openPages && _currentPagination.openPages.length > 0)\r\n {\r\n var combinedPath = Globals.Helpers.ResolveContentRef(contentRefUrl, sourceFileHref);\r\n\r\n var hashIndex = combinedPath.indexOf(\"#\");\r\n var hrefPart;\r\n var elementId;\r\n if(hashIndex >= 0) {\r\n hrefPart = combinedPath.substr(0, hashIndex);\r\n elementId = combinedPath.substr(hashIndex + 1);\r\n }\r\n else {\r\n hrefPart = combinedPath;\r\n elementId = undefined;\r\n }\r\n\r\n var spineItem = reader.spine.getItemByHref(hrefPart);\r\n var spineItemIndex = _currentPagination.openPages[0].spineItemIndex;\r\n\r\n //var idref = _currentPagination.openPages[0].idref;\r\n //spineItem.idref === idref\r\n //var currentSpineItem = reader.spine.getItemById(idref);\r\n //currentSpineItem == spineItem\r\n if (spineItem.index === spineItemIndex)\r\n {\r\n self.onPageChanged({\r\n paginationInfo: _currentPagination,\r\n elementId: elementId,\r\n initiator: self\r\n });\r\n }\r\n }\r\n */\r\n };\r\n\r\n this.toggleMediaOverlay = function() {\r\n if(self.isPlaying()) {\r\n self.pause();\r\n return;\r\n }\r\n\r\n //if we have position to continue from (reset wasn't called)\r\n if(_smilIterator) {\r\n self.play();\r\n return;\r\n }\r\n\r\n this.toggleMediaOverlayRefresh(undefined);\r\n };\r\n\r\n var _wasPlayingScrolling = false;\r\n\r\n this.toggleMediaOverlayRefresh = function(paginationData)\r\n {\r\n//console.debug(\"moData SMIL: \" + moData.par.getSmil().href + \" // \" + + moData.par.getSmil().id);\r\n\r\n var spineItems = reader.getLoadedSpineItems();\r\n\r\n //paginationData.isRightToLeft\r\n var rtl = reader.spine().isRightToLeft();\r\n\r\n //paginationData.spineItemCount\r\n //paginationData.openPages\r\n //{spineItemPageIndex: , spineItemPageCount: , idref: , spineItemIndex: }\r\n\r\n var playingPar = undefined;\r\n var wasPlaying = self.isPlaying();\r\n if(wasPlaying && _smilIterator)\r\n {\r\n var isScrollView = paginationData.initiator && paginationData.initiator instanceof ScrollView;\r\n if (isScrollView && _settings.mediaOverlaysPreservePlaybackWhenScroll)\r\n {\r\n _wasPlayingScrolling = true;\r\n return;\r\n }\r\n \r\n playingPar = _smilIterator.currentPar;\r\n self.pause();\r\n }\r\n \r\n _wasPlayingScrolling = false;\r\n\r\n //paginationData && paginationData.elementId\r\n //paginationData.initiator != self\r\n\r\n //_package.isFixedLayout()\r\n\r\n var element = (paginationData && paginationData.elementIdResolved) ? paginationData.elementIdResolved : undefined;\r\n\r\n var id = (paginationData && paginationData.elementId) ? paginationData.elementId : undefined;\r\n\r\n if (!element)\r\n {\r\n if (id)\r\n {\r\n console.error(\"[WARN] id did not resolve to element?\");\r\n }\r\n \r\n for(var i = (rtl ? (spineItems.length - 1) : 0); (rtl && i >=0) || (!rtl && i < spineItems.length); i += (rtl ? -1: 1))\r\n {\r\n var spineItem = spineItems[i];\r\n if (!spineItem)\r\n {\r\n console.error(\"spineItems[i] is undefined??\");\r\n continue;\r\n }\r\n \r\n if (paginationData && paginationData.spineItem && paginationData.spineItem != spineItem)\r\n {\r\n continue;\r\n }\r\n\r\n if (id)\r\n {\r\n var $element = reader.getElementById(spineItem, id);\r\n //var $element = reader.getElement(spineItem, \"#\" + Globals.Helpers.escapeJQuerySelector(id));\r\n element = ($element && $element.length > 0) ? $element[0] : undefined;\r\n }\r\n else if (spineItem.isFixedLayout())\r\n {\r\n if (paginationData && paginationData.paginationInfo && paginationData.paginationInfo.openPages)\r\n {\r\n // openPages are sorted by spineItem index, so the smallest index on display is the one we need to play (page on the left in LTR, or page on the right in RTL progression)\r\n var index = 0; // !paginationData.paginationInfo.isRightToLeft ? 0 : paginationData.paginationInfo.openPages.length - 1;\r\n \r\n if (paginationData.paginationInfo.openPages[index] && paginationData.paginationInfo.openPages[index].idref && paginationData.paginationInfo.openPages[index].idref === spineItem.idref)\r\n {\r\n var $element = reader.getElement(spineItem, \"body\");\r\n element = ($element && $element.length > 0) ? $element[0] : undefined;\r\n }\r\n }\r\n }\r\n\r\n if (element)\r\n {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!element)\r\n {\r\n element = reader.getFirstVisibleMediaOverlayElement();\r\n }\r\n\r\n if (!element)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n var moData = $(element).data(\"mediaOverlayData\");\r\n\r\n if (!moData)\r\n {\r\n var foundMe = false;\r\n var depthFirstTraversal = function(elements)\r\n {\r\n if (!elements)\r\n {\r\n return false;\r\n }\r\n\r\n for (var i = 0; i < elements.length; i++)\r\n {\r\n if (element === elements[i]) foundMe = true;\r\n \r\n if (foundMe)\r\n {\r\n var d = $(elements[i]).data(\"mediaOverlayData\");\r\n if (d)\r\n {\r\n moData = d;\r\n return true;\r\n }\r\n }\r\n\r\n var found = depthFirstTraversal(elements[i].children);\r\n if (found)\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n var root = element;\r\n while (root && root.nodeName.toLowerCase() !== \"body\")\r\n {\r\n root = root.parentNode;\r\n }\r\n\r\n if (!root)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n depthFirstTraversal([root]);\r\n }\r\n\r\n if (!moData)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n var zPar = moData.par ? moData.par : moData.pars[0];\r\n var parSmil = zPar.getSmil();\r\n if(!_smilIterator || _smilIterator.smil != parSmil)\r\n {\r\n _smilIterator = new SmilIterator(parSmil);\r\n }\r\n else\r\n {\r\n _smilIterator.reset();\r\n }\r\n \r\n _smilIterator.goToPar(zPar);\r\n \r\n if (!_smilIterator.currentPar && id)\r\n {\r\n _smilIterator.reset();\r\n _smilIterator.findTextId(id);\r\n }\r\n \r\n if (!_smilIterator.currentPar)\r\n {\r\n self.reset();\r\n return;\r\n }\r\n\r\n if (wasPlaying && playingPar && playingPar === _smilIterator.currentPar)\r\n {\r\n self.play();\r\n }\r\n else\r\n {\r\n playCurrentPar();\r\n //playPar(zPar);\r\n }\r\n };\r\n\r\n this.isPlayingCfi = function()\r\n {\r\n return _smilIterator && _smilIterator.currentPar && _smilIterator.currentPar.cfi;\r\n };\r\n \r\n var _wasPausedBecauseNoAutoNextSmil = false;\r\n var _autoNextSmil = true;\r\n this.setAutomaticNextSmil = function(autoNext)\r\n {\r\n _autoNextSmil = autoNext;\r\n };\r\n};\r\n return MediaOverlayPlayer;\r\n});\r\n\n", - "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/spine',[\"./spine_item\"], function(SpineItem) {\r\n/**\r\n * Wrapper of the spine object received from hosting application\r\n *\r\n * @class Models.Spine\r\n */\r\n\r\nvar Spine = function(epubPackage, spineDTO) {\r\n\r\n var self = this;\r\n\r\n /*\r\n * Collection of spine items\r\n * @property items\r\n * @type {Array}\r\n */\r\n this.items = [];\r\n\r\n /*\r\n * Page progression direction ltr|rtl|default\r\n * @property direction\r\n * @type {string}\r\n */\r\n this.direction = \"ltr\";\r\n\r\n /*\r\n * @property package\r\n * @type {Models.Package}\r\n *\r\n */\r\n this.package = epubPackage;\r\n\r\n var _handleLinear = false;\r\n\r\n this.handleLinear = function(handleLinear) {\r\n _handleLinear = handleLinear;\r\n };\r\n\r\n function isValidLinearItem(item) {\r\n return !_handleLinear || item.linear !== \"no\";\r\n }\r\n\r\n\r\n this.isValidLinearItem = function(index) {\r\n \r\n if(!isValidIndex(index)) {\r\n return undefined;\r\n }\r\n\r\n return isValidLinearItem(this.item(index));\r\n };\r\n\r\n this.prevItem = function(item) {\r\n\r\n return lookForPrevValidItem(item.index - 1);\r\n };\r\n\r\n function lookForNextValidItem(ix) {\r\n\r\n if(!isValidIndex(ix)) {\r\n return undefined;\r\n }\r\n\r\n var item = self.items[ix];\r\n\r\n if(isValidLinearItem(item)) {\r\n return item;\r\n }\r\n\r\n return lookForNextValidItem(item.index + 1);\r\n }\r\n\r\n function lookForPrevValidItem(ix) {\r\n\r\n if(!isValidIndex(ix)) {\r\n return undefined;\r\n }\r\n\r\n var item = self.items[ix];\r\n\r\n if(isValidLinearItem(item)) {\r\n return item;\r\n }\r\n\r\n return lookForPrevValidItem(item.index - 1);\r\n }\r\n\r\n this.nextItem = function(item){\r\n\r\n return lookForNextValidItem(item.index + 1);\r\n };\r\n\r\n this.getItemUrl = function(item) {\r\n\r\n return self.package.resolveRelativeUrl(item.href);\r\n\r\n };\r\n\r\n function isValidIndex(index) {\r\n\r\n return index >= 0 && index < self.items.length;\r\n }\r\n\r\n this.first = function() {\r\n\r\n return lookForNextValidItem(0);\r\n };\r\n\r\n this.last = function() {\r\n\r\n return lookForPrevValidItem(this.items.length - 1);\r\n };\r\n\r\n this.isFirstItem = function(item) {\r\n\r\n return self.first() === item;\r\n };\r\n\r\n this.isLastItem = function(item) {\r\n\r\n return self.last() === item;\r\n };\r\n\r\n this.item = function(index) {\r\n\t\t\r\n\t\tif (isValidIndex(index))\r\n \treturn self.items[index];\r\n\t\t\t\r\n\t\treturn undefined;\r\n };\r\n\r\n this.isRightToLeft = function() {\r\n\r\n return self.direction == \"rtl\";\r\n };\r\n\r\n this.isLeftToRight = function() {\r\n\r\n return !self.isRightToLeft();\r\n };\r\n\r\n this.getItemById = function(idref) {\r\n\r\n var length = self.items.length;\r\n\r\n for(var i = 0; i < length; i++) {\r\n if(self.items[i].idref == idref) {\r\n\r\n return self.items[i];\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n this.getItemByHref = function(href) {\r\n\r\n var length = self.items.length;\r\n\r\n for(var i = 0; i < length; i++) {\r\n if(self.items[i].href == href) {\r\n\r\n return self.items[i];\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n function updateSpineItemsSpread() {\r\n\r\n var len = self.items.length;\r\n\r\n var isFirstPageInSpread = false;\r\n var baseSide = self.isLeftToRight() ? SpineItem.SPREAD_LEFT : SpineItem.SPREAD_RIGHT;\r\n\r\n for(var i = 0; i < len; i++) {\r\n\r\n var spineItem = self.items[i];\r\n if( !spineItem.page_spread) {\r\n\r\n var spread = spineItem.isRenditionSpreadAllowed() ? (isFirstPageInSpread ? baseSide : SpineItem.alternateSpread(baseSide)) : SpineItem.SPREAD_CENTER;\r\n spineItem.setSpread(spread);\r\n }\r\n\r\n isFirstPageInSpread = !spineItem.isRenditionSpreadAllowed() || spineItem.page_spread != baseSide;\r\n }\r\n }\r\n\r\n if(spineDTO) {\r\n\r\n if(spineDTO.direction) {\r\n this.direction = spineDTO.direction;\r\n }\r\n\r\n var length = spineDTO.items.length;\r\n for(var i = 0; i < length; i++) {\r\n var item = new SpineItem(spineDTO.items[i], i, this);\r\n this.items.push(item);\r\n }\r\n\r\n updateSpineItemsSpread();\r\n }\r\n\r\n};\r\n return Spine;\r\n});\r\n\n", + "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/spine',[\"./spine_item\"], function(SpineItem) {\r\n/**\r\n * Wrapper of the spine object received from hosting application\r\n *\r\n * @class Models.Spine\r\n */\r\n\r\nvar Spine = function(epubPackage, spineDTO) {\r\n\r\n var self = this;\r\n\r\n /*\r\n * Collection of spine items\r\n * @property items\r\n * @type {Array}\r\n */\r\n this.items = [];\r\n\r\n /*\r\n * Page progression direction ltr|rtl|default\r\n * @property direction\r\n * @type {string}\r\n */\r\n this.direction = \"ltr\";\r\n\r\n /*\r\n * @property package\r\n * @type {Models.Package}\r\n *\r\n */\r\n this.package = epubPackage;\r\n\r\n var _handleLinear = true;\r\n\r\n this.handleLinear = function(handleLinear) {\r\n _handleLinear = handleLinear;\r\n };\r\n\r\n function isValidLinearItem(item) {\r\n return !_handleLinear || item.linear !== \"no\";\r\n }\r\n\r\n\r\n this.isValidLinearItem = function(index) {\r\n \r\n if(!isValidIndex(index)) {\r\n return undefined;\r\n }\r\n\r\n return isValidLinearItem(this.item(index));\r\n };\r\n\r\n this.prevItem = function(item) {\r\n\r\n return lookForPrevValidItem(item.index - 1);\r\n };\r\n\r\n function lookForNextValidItem(ix) {\r\n\r\n if(!isValidIndex(ix)) {\r\n return undefined;\r\n }\r\n\r\n var item = self.items[ix];\r\n\r\n if(isValidLinearItem(item)) {\r\n return item;\r\n }\r\n\r\n return lookForNextValidItem(item.index + 1);\r\n }\r\n\r\n function lookForPrevValidItem(ix) {\r\n\r\n if(!isValidIndex(ix)) {\r\n return undefined;\r\n }\r\n\r\n var item = self.items[ix];\r\n\r\n if(isValidLinearItem(item)) {\r\n return item;\r\n }\r\n\r\n return lookForPrevValidItem(item.index - 1);\r\n }\r\n\r\n this.nextItem = function(item){\r\n\r\n return lookForNextValidItem(item.index + 1);\r\n };\r\n\r\n this.getItemUrl = function(item) {\r\n\r\n return self.package.resolveRelativeUrl(item.href);\r\n\r\n };\r\n\r\n function isValidIndex(index) {\r\n\r\n return index >= 0 && index < self.items.length;\r\n }\r\n\r\n this.first = function() {\r\n\r\n return lookForNextValidItem(0);\r\n };\r\n\r\n this.last = function() {\r\n\r\n return lookForPrevValidItem(this.items.length - 1);\r\n };\r\n\r\n this.isFirstItem = function(item) {\r\n\r\n return self.first() === item;\r\n };\r\n\r\n this.isLastItem = function(item) {\r\n\r\n return self.last() === item;\r\n };\r\n\r\n this.item = function(index) {\r\n\t\t\r\n\t\tif (isValidIndex(index))\r\n \treturn self.items[index];\r\n\t\t\t\r\n\t\treturn undefined;\r\n };\r\n\r\n this.isRightToLeft = function() {\r\n\r\n return self.direction == \"rtl\";\r\n };\r\n\r\n this.isLeftToRight = function() {\r\n\r\n return !self.isRightToLeft();\r\n };\r\n\r\n this.getItemById = function(idref) {\r\n\r\n var length = self.items.length;\r\n\r\n for(var i = 0; i < length; i++) {\r\n if(self.items[i].idref == idref) {\r\n\r\n return self.items[i];\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n this.getItemByHref = function(href) {\r\n\r\n var length = self.items.length;\r\n\r\n for(var i = 0; i < length; i++) {\r\n if(self.items[i].href == href) {\r\n\r\n return self.items[i];\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n function updateSpineItemsSpread() {\r\n\r\n var len = self.items.length;\r\n\r\n var isFirstPageInSpread = false;\r\n var baseSide = self.isLeftToRight() ? SpineItem.SPREAD_LEFT : SpineItem.SPREAD_RIGHT;\r\n\r\n for(var i = 0; i < len; i++) {\r\n\r\n var spineItem = self.items[i];\r\n if( !spineItem.page_spread) {\r\n\r\n var spread = spineItem.isRenditionSpreadAllowed() ? (isFirstPageInSpread ? baseSide : SpineItem.alternateSpread(baseSide)) : SpineItem.SPREAD_CENTER;\r\n spineItem.setSpread(spread);\r\n }\r\n\r\n isFirstPageInSpread = !spineItem.isRenditionSpreadAllowed() || spineItem.page_spread != baseSide;\r\n }\r\n }\r\n\r\n if(spineDTO) {\r\n\r\n if(spineDTO.direction) {\r\n this.direction = spineDTO.direction;\r\n }\r\n\r\n var length = spineDTO.items.length;\r\n for(var i = 0; i < length; i++) {\r\n var item = new SpineItem(spineDTO.items[i], i, this);\r\n this.items.push(item);\r\n }\r\n\r\n updateSpineItemsSpread();\r\n }\r\n\r\n};\r\n return Spine;\r\n});\r\n\n", "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\ndefine ('readium_shared_js/models/smil_model',[\"../helpers\"], function(Helpers) {\r\n\r\n/**\r\n *\r\n * @param parent\r\n * @constructor\r\n */\r\nvar Smil = {};\r\n\r\nSmil.SmilNode = function(parent) {\r\n\r\n this.parent = parent;\r\n \r\n this.id = \"\";\r\n \r\n //root node is a smil model\r\n this.getSmil = function() {\r\n\r\n var node = this;\r\n while(node.parent) {\r\n node = node.parent;\r\n }\r\n\r\n return node;\r\n };\r\n \r\n this.hasAncestor = function(node)\r\n {\r\n var parent = this.parent;\r\n while(parent)\r\n {\r\n if (parent == node)\r\n {\r\n return true;\r\n }\r\n\r\n parent = parent.parent;\r\n }\r\n\r\n return false;\r\n };\r\n};\r\n\r\nSmil.TimeContainerNode = function(parent) {\r\n\r\n this.parent = parent;\r\n \r\n this.children = undefined;\r\n this.index = undefined;\r\n \r\n this.epubtype = \"\";\r\n\r\n this.isEscapable = function(userEscapables)\r\n {\r\n if (this.epubtype === \"\")\r\n {\r\n return false;\r\n }\r\n\r\n var smilModel = this.getSmil();\r\n if (!smilModel.mo)\r\n {\r\n return false;\r\n }\r\n\r\n var arr = smilModel.mo.escapables;\r\n if (userEscapables.length > 0)\r\n {\r\n arr = userEscapables;\r\n }\r\n\r\n for (var i = 0; i < arr.length; i++)\r\n {\r\n if (this.epubtype.indexOf(arr[i]) >= 0)\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n this.isSkippable = function(userSkippables)\r\n {\r\n if (this.epubtype === \"\")\r\n {\r\n return false;\r\n }\r\n \r\n var smilModel = this.getSmil();\r\n if (!smilModel.mo)\r\n {\r\n return false;\r\n }\r\n\r\n var arr = smilModel.mo.skippables;\r\n if (userSkippables.length > 0)\r\n {\r\n arr = userSkippables;\r\n }\r\n\r\n for (var i = 0; i < arr.length; i++)\r\n {\r\n if (this.epubtype.indexOf(arr[i]) >= 0)\r\n {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n};\r\n\r\nSmil.TimeContainerNode.prototype = new Smil.SmilNode();\r\n\r\n//////////////////////////\r\n//MediaNode\r\n\r\nSmil.MediaNode = function(parent) {\r\n\r\n this.parent = parent;\r\n \r\n this.src = \"\";\r\n};\r\n\r\nSmil.MediaNode.prototype = new Smil.SmilNode();\r\n\r\n////////////////////////////\r\n//SeqNode\r\n\r\nSmil.SeqNode = function(parent) {\r\n\r\n this.parent = parent;\r\n \r\n this.children = [];\r\n this.nodeType = \"seq\";\r\n this.textref = \"\";\r\n \r\n this.durationMilliseconds = function()\r\n {\r\n var smilData = this.getSmil();\r\n \r\n var total = 0;\r\n \r\n for (var i = 0; i < this.children.length; i++)\r\n {\r\n var container = this.children[i];\r\n if (container.nodeType === \"par\")\r\n {\r\n if (!container.audio)\r\n {\r\n continue;\r\n }\r\n if (container.text && (!container.text.manifestItemId || container.text.manifestItemId != smilData.spineItemId))\r\n {\r\n// console.log(container.text);\r\n// console.log(smilData.spineItemId);\r\n continue;\r\n }\r\n \r\n var clipDur = container.audio.clipDurationMilliseconds();\r\n total += clipDur;\r\n }\r\n else if (container.nodeType === \"seq\")\r\n {\r\n total += container.durationMilliseconds();\r\n }\r\n }\r\n\r\n return total;\r\n };\r\n \r\n this.clipOffset = function(offset, par)\r\n {\r\n var smilData = this.getSmil();\r\n \r\n for (var i = 0; i < this.children.length; i++)\r\n {\r\n var container = this.children[i];\r\n if (container.nodeType === \"par\")\r\n {\r\n if (container == par)\r\n {\r\n return true;\r\n }\r\n\r\n if (!container.audio)\r\n {\r\n continue;\r\n }\r\n\r\n if (container.text && (!container.text.manifestItemId || container.text.manifestItemId != smilData.spineItemId))\r\n {\r\n continue;\r\n }\r\n\r\n var clipDur = container.audio.clipDurationMilliseconds();\r\n offset.offset += clipDur;\r\n }\r\n else if (container.nodeType === \"seq\")\r\n {\r\n var found = container.clipOffset(offset, par);\r\n if (found)\r\n {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n this.parallelAt = function(timeMilliseconds)\r\n {\r\n var smilData = this.getSmil();\r\n \r\n var offset = 0;\r\n\r\n for (var i = 0; i < this.children.length; i++)\r\n {\r\n var timeAdjusted = timeMilliseconds - offset;\r\n\r\n var container = this.children[i];\r\n \r\n if (container.nodeType === \"par\")\r\n {\r\n if (!container.audio)\r\n {\r\n continue;\r\n }\r\n\r\n if (container.text && (!container.text.manifestItemId || container.text.manifestItemId != smilData.spineItemId))\r\n {\r\n continue;\r\n }\r\n\r\n var clipDur = container.audio.clipDurationMilliseconds();\r\n\r\n if (clipDur > 0 && timeAdjusted <= clipDur)\r\n {\r\n return container;\r\n }\r\n\r\n offset += clipDur;\r\n }\r\n else if (container.nodeType === \"seq\")\r\n {\r\n var para = container.parallelAt(timeAdjusted);\r\n if (para)\r\n {\r\n return para;\r\n }\r\n\r\n offset += container.durationMilliseconds();\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n this.nthParallel = function(index, count)\r\n {\r\n for (var i = 0; i < this.children.length; i++)\r\n {\r\n var container = this.children[i];\r\n \r\n if (container.nodeType === \"par\")\r\n {\r\n count.count++;\r\n\r\n if (count.count == index)\r\n {\r\n return container;\r\n }\r\n }\r\n else if (container.nodeType === \"seq\")\r\n {\r\n var para = container.nthParallel(index, count);\r\n if (para)\r\n {\r\n return para;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n \r\n};\r\n\r\nSmil.SeqNode.prototype = new Smil.TimeContainerNode();\r\n\r\n//////////////////////////\r\n//ParNode\r\n\r\nSmil.ParNode = function(parent) {\r\n\r\n this.parent = parent;\r\n \r\n this.children = [];\r\n this.nodeType = \"par\";\r\n this.text = undefined;\r\n this.audio = undefined;\r\n this.element = undefined;\r\n \r\n\r\n this.getFirstSeqAncestorWithEpubType = function(epubtype, includeSelf) {\r\n if (!epubtype) return undefined;\r\n \r\n var parent = includeSelf ? this : this.parent;\r\n while (parent)\r\n {\r\n if (parent.epubtype && parent.epubtype.indexOf(epubtype) >= 0)\r\n {\r\n return parent; // assert(parent.nodeType === \"seq\")\r\n }\r\n \r\n parent = parent.parent;\r\n }\r\n \r\n return undefined;\r\n };\r\n};\r\n\r\nSmil.ParNode.prototype = new Smil.TimeContainerNode();\r\n\r\n//////////////////////////\r\n//TextNode\r\n\r\nSmil.TextNode = function(parent) {\r\n\r\n this.parent = parent;\r\n\r\n this.nodeType = \"text\";\r\n this.srcFile = \"\";\r\n this.srcFragmentId = \"\";\r\n \r\n \r\n this.manifestItemId = undefined;\r\n this.updateMediaManifestItemId = function()\r\n {\r\n var smilData = this.getSmil();\r\n \r\n if (!smilData.href || !smilData.href.length)\r\n {\r\n return; // Blank MO page placeholder, no real SMIL\r\n }\r\n \r\n // var srcParts = item.src.split('#');\r\n// item.srcFile = srcParts[0];\r\n// item.srcFragmentId = (srcParts.length === 2) ? srcParts[1] : \"\";\r\n \r\n var src = this.srcFile ? this.srcFile : this.src;\r\n// console.log(\"src: \" + src);\r\n// console.log(\"smilData.href: \" + smilData.href);\r\n var ref = Helpers.ResolveContentRef(src, smilData.href);\r\n//console.log(\"ref: \" + ref);\r\n var full = smilData.mo.package.resolveRelativeUrlMO(ref);\r\n// console.log(\"full: \" + full);\r\n// console.log(\"---\");\r\n for (var j = 0; j < smilData.mo.package.spine.items.length; j++)\r\n {\r\n var item = smilData.mo.package.spine.items[j];\r\n//console.log(\"item.href: \" + item.href);\r\n var url = smilData.mo.package.resolveRelativeUrl(item.href);\r\n//console.log(\"url: \" + url);\r\n if (url === full)\r\n {\r\n//console.error(\"FOUND: \" + item.idref);\r\n this.manifestItemId = item.idref;\r\n return;\r\n }\r\n }\r\n \r\n console.error(\"Cannot set the Media ManifestItemId? \" + this.src + \" && \" + smilData.href);\r\n \r\n// throw \"BREAK\";\r\n };\r\n \r\n};\r\n\r\nSmil.TextNode.prototype = new Smil.MediaNode();\r\n\r\n///////////////////////////\r\n//AudioNode\r\n\r\nSmil.AudioNode = function(parent) {\r\n\r\n this.parent = parent;\r\n\r\n this.nodeType = \"audio\";\r\n\r\n this.clipBegin = 0;\r\n\r\n this.MAX = 1234567890.1; //Number.MAX_VALUE - 0.1; //Infinity;\r\n this.clipEnd = this.MAX;\r\n \r\n\r\n this.clipDurationMilliseconds = function()\r\n {\r\n var _clipBeginMilliseconds = this.clipBegin * 1000;\r\n var _clipEndMilliseconds = this.clipEnd * 1000;\r\n \r\n if (this.clipEnd >= this.MAX || _clipEndMilliseconds <= _clipBeginMilliseconds)\r\n {\r\n return 0;\r\n }\r\n\r\n return _clipEndMilliseconds - _clipBeginMilliseconds;\r\n }; \r\n};\r\n\r\nSmil.AudioNode.prototype = new Smil.MediaNode();\r\n\r\n//////////////////////////////\r\n//SmilModel\r\n\r\nvar SmilModel = function() {\r\n\r\n this.parent = undefined;\r\n \r\n \r\n \r\n this.children = []; //collection of seq or par smil nodes\r\n this.id = undefined; //manifest item id\r\n this.href = undefined; //href of the .smil source file\r\n this.duration = undefined;\r\n this.mo = undefined;\r\n \r\n this.parallelAt = function(timeMilliseconds)\r\n {\r\n return this.children[0].parallelAt(timeMilliseconds);\r\n };\r\n\r\n this.nthParallel = function(index)\r\n {\r\n var count = {count: -1};\r\n return this.children[0].nthParallel(index, count);\r\n };\r\n\r\n this.clipOffset = function(par)\r\n {\r\n var offset = {offset: 0};\r\n if (this.children[0].clipOffset(offset, par))\r\n {\r\n return offset.offset;\r\n }\r\n\r\n return 0;\r\n };\r\n \r\n this.durationMilliseconds_Calculated = function()\r\n {\r\n return this.children[0].durationMilliseconds();\r\n };\r\n \r\n\r\n var _epubtypeSyncs = [];\r\n // \r\n // this.clearSyncs = function()\r\n // {\r\n // _epubtypeSyncs = [];\r\n // };\r\n\r\n this.hasSync = function(epubtype)\r\n {\r\n for (var i = 0; i < _epubtypeSyncs.length; i++)\r\n {\r\n if (_epubtypeSyncs[i] === epubtype)\r\n {\r\n//console.debug(\"hasSync OK: [\"+epubtype+\"]\");\r\n return true;\r\n }\r\n }\r\n \r\n//console.debug(\"hasSync??: [\"+epubtype+\"] \" + _epubtypeSyncs);\r\n return false;\r\n };\r\n \r\n this.addSync = function(epubtypes)\r\n {\r\n if (!epubtypes) return;\r\n \r\n//console.debug(\"addSyncs: \"+epubtypes);\r\n\r\n var parts = epubtypes.split(' ');\r\n for (var i = 0; i < parts.length; i++)\r\n {\r\n var epubtype = parts[i].trim();\r\n\r\n if (epubtype.length > 0 && !this.hasSync(epubtype))\r\n {\r\n _epubtypeSyncs.push(epubtype);\r\n\r\n//console.debug(\"addSync: \"+epubtype);\r\n }\r\n }\r\n };\r\n \r\n};\r\n\r\nSmilModel.fromSmilDTO = function(smilDTO, mo) {\r\n\r\n if (mo.DEBUG)\r\n {\r\n console.debug(\"Media Overlay DTO import...\");\r\n }\r\n\r\n var indent = 0;\r\n var getIndent = function()\r\n {\r\n var str = \"\";\r\n for (var i = 0; i < indent; i++)\r\n {\r\n str += \" \";\r\n }\r\n return str;\r\n }\r\n\r\n var smilModel = new SmilModel();\r\n smilModel.id = smilDTO.id;\r\n smilModel.spineItemId = smilDTO.spineItemId;\r\n smilModel.href = smilDTO.href;\r\n \r\n smilModel.smilVersion = smilDTO.smilVersion;\r\n \r\n smilModel.duration = smilDTO.duration;\r\n if (smilModel.duration && smilModel.duration.length && smilModel.duration.length > 0)\r\n {\r\n console.error(\"SMIL duration is string, parsing float... (\" + smilModel.duration + \")\");\r\n smilModel.duration = parseFloat(smilModel.duration);\r\n }\r\n \r\n smilModel.mo = mo; //Models.MediaOverlay\r\n\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(\"JS MO smilVersion=\" + smilModel.smilVersion);\r\n console.log(\"JS MO id=\" + smilModel.id);\r\n console.log(\"JS MO spineItemId=\" + smilModel.spineItemId);\r\n console.log(\"JS MO href=\" + smilModel.href);\r\n console.log(\"JS MO duration=\" + smilModel.duration);\r\n }\r\n\r\n var safeCopyProperty = function(property, from, to, isRequired) {\r\n\r\n if((property in from))\r\n { // && from[property] !== \"\"\r\n\r\n if( !(property in to) ) {\r\n console.debug(\"property \" + property + \" not declared in smil node \" + to.nodeType);\r\n }\r\n\r\n to[property] = from[property];\r\n\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO: [\" + property + \"=\" + to[property] + \"]\");\r\n }\r\n }\r\n else if(isRequired) {\r\n console.log(\"Required property \" + property + \" not found in smil node \" + from.nodeType);\r\n }\r\n };\r\n\r\n var createNodeFromDTO = function(nodeDTO, parent) {\r\n\r\n var node;\r\n\r\n if(nodeDTO.nodeType == \"seq\") {\r\n\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO seq\");\r\n }\r\n\r\n node = new Smil.SeqNode(parent);\r\n\r\n safeCopyProperty(\"textref\", nodeDTO, node, ((parent && parent.parent) ? true : false));\r\n safeCopyProperty(\"id\", nodeDTO, node);\r\n safeCopyProperty(\"epubtype\", nodeDTO, node);\r\n\r\n if (node.epubtype)\r\n {\r\n node.getSmil().addSync(node.epubtype);\r\n }\r\n \r\n indent++;\r\n copyChildren(nodeDTO, node);\r\n indent--;\r\n }\r\n else if (nodeDTO.nodeType == \"par\") {\r\n\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO par\");\r\n }\r\n\r\n node = new Smil.ParNode(parent);\r\n\r\n safeCopyProperty(\"id\", nodeDTO, node);\r\n safeCopyProperty(\"epubtype\", nodeDTO, node);\r\n\r\n if (node.epubtype)\r\n {\r\n node.getSmil().addSync(node.epubtype);\r\n }\r\n\r\n indent++;\r\n copyChildren(nodeDTO, node);\r\n indent--;\r\n\t\t\t\r\n for(var i = 0, count = node.children.length; i < count; i++) {\r\n var child = node.children[i];\r\n\r\n if(child.nodeType == \"text\") {\r\n node.text = child;\r\n }\r\n else if(child.nodeType == \"audio\") {\r\n node.audio = child;\r\n }\r\n else {\r\n console.error(\"Unexpected smil node type: \" + child.nodeType);\r\n }\r\n }\r\n\r\n////////////////\r\nvar forceTTS = false; // for testing only!\r\n////////////////\r\n\r\n if (forceTTS || !node.audio)\r\n {\r\n // synthetic speech (playback using TTS engine), or embedded media, or blank page\r\n var fakeAudio = new Smil.AudioNode(node);\r\n\r\n fakeAudio.clipBegin = 0;\r\n fakeAudio.clipEnd = fakeAudio.MAX;\r\n fakeAudio.src = undefined;\r\n\r\n node.audio = fakeAudio;\r\n }\r\n }\r\n else if (nodeDTO.nodeType == \"text\") {\r\n\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO text\");\r\n }\r\n\r\n node = new Smil.TextNode(parent);\r\n\r\n safeCopyProperty(\"src\", nodeDTO, node, true);\r\n safeCopyProperty(\"srcFile\", nodeDTO, node, true);\r\n safeCopyProperty(\"srcFragmentId\", nodeDTO, node, false);\r\n safeCopyProperty(\"id\", nodeDTO, node);\r\n \r\n node.updateMediaManifestItemId();\r\n }\r\n else if (nodeDTO.nodeType == \"audio\") {\r\n\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO audio\");\r\n }\r\n\r\n node = new Smil.AudioNode(parent);\r\n\r\n safeCopyProperty(\"src\", nodeDTO, node, true);\r\n safeCopyProperty(\"id\", nodeDTO, node);\r\n\r\n safeCopyProperty(\"clipBegin\", nodeDTO, node);\r\n if (node.clipBegin && node.clipBegin.length && node.clipBegin.length > 0)\r\n {\r\n console.error(\"SMIL clipBegin is string, parsing float... (\" + node.clipBegin + \")\");\r\n node.clipBegin = parseFloat(node.clipBegin);\r\n }\r\n if (node.clipBegin < 0)\r\n {\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO clipBegin adjusted to ZERO\");\r\n }\r\n node.clipBegin = 0;\r\n }\r\n\r\n safeCopyProperty(\"clipEnd\", nodeDTO, node);\r\n if (node.clipEnd && node.clipEnd.length && node.clipEnd.length > 0)\r\n {\r\n console.error(\"SMIL clipEnd is string, parsing float... (\" + node.clipEnd + \")\");\r\n node.clipEnd = parseFloat(node.clipEnd);\r\n }\r\n if (node.clipEnd <= node.clipBegin)\r\n {\r\n if (smilModel.mo.DEBUG)\r\n {\r\n console.log(getIndent() + \"JS MO clipEnd adjusted to MAX\");\r\n }\r\n node.clipEnd = node.MAX;\r\n }\r\n \r\n //node.updateMediaManifestItemId(); ONLY XHTML SPINE ITEMS \r\n }\r\n else {\r\n console.error(\"Unexpected smil node type: \" + nodeDTO.nodeType);\r\n return undefined;\r\n }\r\n\r\n return node;\r\n\r\n };\r\n\r\n var copyChildren = function(from, to) {\r\n\r\n var count = from.children.length;\r\n\r\n for(var i = 0; i < count; i++) {\r\n var node = createNodeFromDTO(from.children[i], to);\r\n node.index = i;\r\n to.children.push(node);\r\n }\r\n\r\n };\r\n\r\n copyChildren(smilDTO, smilModel);\r\n\r\n return smilModel;\r\n\r\n};\r\n\r\nreturn SmilModel;\r\n});\r\n\n", "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/media_overlay',[\"./smil_model\"], function(SmilModel) {\r\n/**\r\n *\r\n * @param package\r\n * @constructor\r\n */\r\nvar MediaOverlay = function(package) {\r\n\r\n this.package = package;\r\n \r\n\r\n this.parallelAt = function(timeMilliseconds)\r\n {\r\n var offset = 0;\r\n \r\n for (var i = 0; i < this.smil_models.length; i++)\r\n {\r\n var smilData = this.smil_models[i];\r\n \r\n var timeAdjusted = timeMilliseconds - offset;\r\n\r\n var para = smilData.parallelAt(timeAdjusted);\r\n if (para)\r\n {\r\n return para;\r\n }\r\n\r\n offset += smilData.durationMilliseconds_Calculated();\r\n }\r\n\r\n return undefined;\r\n };\r\n \r\n this.percentToPosition = function(percent, smilData, par, milliseconds)\r\n {\r\n if (percent < 0.0 || percent > 100.0)\r\n {\r\n percent = 0.0;\r\n }\r\n \r\n var total = this.durationMilliseconds_Calculated();\r\n\r\n var timeMs = total * (percent / 100.0);\r\n\r\n par.par = this.parallelAt(timeMs);\r\n if (!par.par)\r\n {\r\n return;\r\n }\r\n \r\n var smilDataPar = par.par.getSmil();\r\n if (!smilDataPar)\r\n {\r\n return;\r\n }\r\n \r\n var smilDataOffset = 0;\r\n \r\n for (var i = 0; i < this.smil_models.length; i++)\r\n {\r\n smilData.smilData = this.smil_models[i];\r\n if (smilData.smilData == smilDataPar)\r\n {\r\n break;\r\n }\r\n smilDataOffset += smilData.smilData.durationMilliseconds_Calculated();\r\n }\r\n\r\n milliseconds.milliseconds = timeMs - (smilDataOffset + smilData.smilData.clipOffset(par.par));\r\n };\r\n\r\n this.durationMilliseconds_Calculated = function()\r\n {\r\n var total = 0;\r\n \r\n for (var i = 0; i < this.smil_models.length; i++)\r\n {\r\n var smilData = this.smil_models[i];\r\n\r\n total += smilData.durationMilliseconds_Calculated();\r\n }\r\n \r\n return total;\r\n };\r\n \r\n this.smilAt = function(smilIndex)\r\n {\r\n if (smilIndex < 0 || smilIndex >= this.smil_models.length)\r\n {\r\n return undefined;\r\n }\r\n \r\n return this.smil_models[smilIndex];\r\n }\r\n \r\n this.positionToPercent = function(smilIndex, parIndex, milliseconds)\r\n {\r\n// console.log(\">>>>>>>>>>\");\r\n// console.log(milliseconds);\r\n// console.log(smilIndex);\r\n// console.log(parIndex);\r\n// console.log(\"-------\");\r\n \r\n if (smilIndex >= this.smil_models.length)\r\n {\r\n return -1.0;\r\n }\r\n\r\n var smilDataOffset = 0;\r\n for (var i = 0; i < smilIndex; i++)\r\n {\r\n var sd = this.smil_models[i];\r\n smilDataOffset += sd.durationMilliseconds_Calculated();\r\n }\r\n\r\n//console.log(smilDataOffset);\r\n \r\n var smilData = this.smil_models[smilIndex];\r\n\r\n var par = smilData.nthParallel(parIndex);\r\n if (!par)\r\n {\r\n return -1.0;\r\n }\r\n\r\n var offset = smilDataOffset + smilData.clipOffset(par) + milliseconds;\r\n\r\n//console.log(offset);\r\n \r\n var total = this.durationMilliseconds_Calculated();\r\n\r\n///console.log(total);\r\n\r\n var percent = (offset / total) * 100;\r\n\r\n//console.log(\"<<<<<<<<<<< \" + percent);\r\n \r\n return percent;\r\n };\r\n \r\n this.smil_models = [];\r\n\r\n this.skippables = [];\r\n this.escapables = [];\r\n\r\n this.duration = undefined;\r\n this.narrator = undefined;\r\n\r\n\r\n this.activeClass = undefined;\r\n this.playbackActiveClass = undefined;\r\n\r\n this.DEBUG = false;\r\n\r\n\r\n this.getSmilBySpineItem = function (spineItem) {\r\n if (!spineItem) return undefined;\r\n\r\n for(var i = 0, count = this.smil_models.length; i < count; i++)\r\n {\r\n var smil = this.smil_models[i];\r\n if(smil.spineItemId === spineItem.idref) {\r\n if (spineItem.media_overlay_id !== smil.id)\r\n {\r\n console.error(\"SMIL INCORRECT ID?? \" + spineItem.media_overlay_id + \" /// \" + smil.id);\r\n }\r\n return smil;\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /*\r\n this.getSmilById = function (id) {\r\n\r\n for(var i = 0, count = this.smil_models.length; i < count; i++) {\r\n\r\n var smil = this.smil_models[i];\r\n if(smil.id === id) {\r\n return smil;\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n */\r\n\r\n this.getNextSmil = function(smil) {\r\n\r\n var index = this.smil_models.indexOf(smil);\r\n if(index == -1 || index == this.smil_models.length - 1) {\r\n return undefined;\r\n }\r\n\r\n return this.smil_models[index + 1];\r\n }\r\n\r\n this.getPreviousSmil = function(smil) {\r\n\r\n var index = this.smil_models.indexOf(smil);\r\n if(index == -1 || index == 0) {\r\n return undefined;\r\n }\r\n\r\n return this.smil_models[index - 1];\r\n }\r\n};\r\n\r\nMediaOverlay.fromDTO = function(moDTO, package) {\r\n\r\n var mo = new MediaOverlay(package);\r\n\r\n if(!moDTO) {\r\n console.debug(\"No Media Overlay.\");\r\n return mo;\r\n }\r\n\r\n console.debug(\"Media Overlay INIT...\");\r\n\r\n // if (mo.DEBUG)\r\n // console.debug(JSON.stringify(moDTO));\r\n \r\n mo.duration = moDTO.duration;\r\n if (mo.duration && mo.duration.length && mo.duration.length > 0)\r\n {\r\n console.error(\"SMIL total duration is string, parsing float... (\" + mo.duration + \")\");\r\n mo.duration = parseFloat(mo.duration);\r\n }\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay Duration (TOTAL): \" + mo.duration);\r\n\r\n mo.narrator = moDTO.narrator;\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay Narrator: \" + mo.narrator);\r\n\r\n mo.activeClass = moDTO.activeClass;\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay Active-Class: \" + mo.activeClass);\r\n\r\n mo.playbackActiveClass = moDTO.playbackActiveClass;\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay Playback-Active-Class: \" + mo.playbackActiveClass);\r\n\r\n var count = moDTO.smil_models.length;\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay SMIL count: \" + count);\r\n\r\n for(var i = 0; i < count; i++) {\r\n var smilModel = SmilModel.fromSmilDTO(moDTO.smil_models[i], mo);\r\n mo.smil_models.push(smilModel);\r\n\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay Duration (SPINE ITEM): \" + smilModel.duration);\r\n }\r\n\r\n count = moDTO.skippables.length;\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay SKIPPABLES count: \" + count);\r\n\r\n for(var i = 0; i < count; i++) {\r\n mo.skippables.push(moDTO.skippables[i]);\r\n\r\n //if (mo.DEBUG)\r\n // console.debug(\"Media Overlay SKIPPABLE: \" + mo.skippables[i]);\r\n }\r\n\r\n count = moDTO.escapables.length;\r\n if (mo.DEBUG)\r\n console.debug(\"Media Overlay ESCAPABLES count: \" + count);\r\n\r\n for(var i = 0; i < count; i++) {\r\n mo.escapables.push(moDTO.escapables[i]);\r\n\r\n //if (mo.DEBUG)\r\n // console.debug(\"Media Overlay ESCAPABLE: \" + mo.escapables[i]);\r\n }\r\n\r\n return mo;\r\n};\r\n\r\nreturn MediaOverlay;\r\n});\r\n\r\n\r\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n\r\ndefine('readium_shared_js/models/package_data',[],function() {\r\n/**\r\n * This object is not instantiated directly but provided by the host application to the DOMAccess layer in the\r\n * Views.ReaderView.openBook function\r\n *\r\n * Provided for reference only\r\n *\r\n * @class Models.PackageData\r\n */\r\nvar PackageData = {\r\n\r\n /**\r\n * @property rootUrl Url of the package file\r\n * @type {string}\r\n *\r\n */\r\n rootUrl: \"\",\r\n /**\r\n * @property rootUrl Url of the package file, to prefix Media Overlays SMIL audio references\r\n * @type {string}\r\n *\r\n */\r\n rootUrlMO: \"\",\r\n /**\r\n *\r\n * @property rendering_layout expected values \"reflowable\"|rendering_layout=\"pre-paginated\"\r\n * @type {string}\r\n */\r\n rendering_layout: \"\",\r\n\r\n spine: {\r\n\r\n direction: \"ltr\",\r\n items: [\r\n {\r\n href:\"\",\r\n idref:\"\",\r\n page_spread:\"\", //\"page-spread-left\"|\"page-spread-right\"|\"page-spread-center\"\r\n rendering_layout:\"\" //\"reflowable\"|\"pre-paginated\"\r\n }\r\n ]\r\n }\r\n};\r\n\r\nreturn PackageData;\r\n});\n", @@ -119,8 +120,9 @@ "\r\n// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without modification,\r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this\r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice,\r\n// this list of conditions and the following disclaimer in the documentation and/or\r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be\r\n// used to endorse or promote products derived from this software without specific\r\n// prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/views/reflowable_view',[\"jquery\", \"underscore\", \"eventEmitter\", \"../models/bookmark_data\", \"./cfi_navigation_logic\",\r\n \"../models/current_pages_info\", \"../helpers\", \"../models/page_open_request\", \"../globals\",\r\n \"../models/viewer_settings\", \"./font_loader\"],\r\n function($, _, EventEmitter, BookmarkData, CfiNavigationLogic,\r\n CurrentPagesInfo, Helpers, PageOpenRequest, Globals,\r\n ViewerSettings, FontLoader) {\r\n/**\r\n * Renders reflowable content using CSS columns\r\n * @param options\r\n * @constructor\r\n */\r\nvar ReflowableView = function(options, reader){\r\n\r\n $.extend(this, new EventEmitter());\r\n\r\n var self = this;\r\n\r\n var _$viewport = options.$viewport;\r\n var _spine = options.spine;\r\n var _userStyles = options.userStyles;\r\n var _bookStyles = options.bookStyles;\r\n var _iframeLoader = options.iframeLoader;\r\n\r\n var _currentSpineItem;\r\n var _isWaitingFrameRender = false;\r\n var _deferredPageRequest;\r\n var _fontSize = 100;\r\n var _$contentFrame;\r\n var _navigationLogic;\r\n var _$el;\r\n var _$iframe;\r\n var _$epubHtml;\r\n\r\n var _$htmlBody;\r\n\r\n var _htmlBodyIsVerticalWritingMode;\r\n var _htmlBodyIsLTRDirection;\r\n var _htmlBodyIsLTRWritingMode;\r\n\r\n\r\n var _currentOpacity = -1;\r\n\r\n var _lastViewPortSize = {\r\n width: undefined,\r\n height: undefined\r\n };\r\n\r\n var _paginationInfo = {\r\n\r\n visibleColumnCount : 2,\r\n columnGap : 20,\r\n spreadCount : 0,\r\n currentSpreadIndex : 0,\r\n columnWidth : undefined,\r\n pageOffset : 0,\r\n columnCount: 0\r\n };\r\n\r\n this.render = function(){\r\n\r\n var template = Helpers.loadTemplate(\"reflowable_book_frame\", {});\r\n\r\n _$el = $(template);\r\n _$viewport.append(_$el);\r\n\r\n var settings = reader.viewerSettings();\r\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\")\r\n {\r\n //defaults\r\n settings = new ViewerSettings({});\r\n }\r\n if (settings.enableGPUHardwareAccelerationCSS3D) {\r\n // This fixes rendering issues with WebView (native apps), which clips content embedded in iframes unless GPU hardware acceleration is enabled for CSS rendering.\r\n _$el.css(\"transform\", \"translateZ(0)\");\r\n }\r\n\r\n // See ReaderView.handleViewportResize\r\n // var lazyResize = _.debounce(self.onViewportResize, 100);\r\n // $(window).on(\"resize.ReadiumSDK.reflowableView\", _.bind(lazyResize, self));\r\n renderIframe();\r\n\r\n return self;\r\n };\r\n\r\n function setFrameSizesToRectangle(rectangle) {\r\n _$contentFrame.css(\"left\", rectangle.left + \"px\");\r\n _$contentFrame.css(\"top\", rectangle.top + \"px\");\r\n _$contentFrame.css(\"right\", rectangle.right + \"px\");\r\n _$contentFrame.css(\"bottom\", rectangle.bottom + \"px\");\r\n\r\n }\r\n\r\n this.remove = function() {\r\n\r\n //$(window).off(\"resize.ReadiumSDK.reflowableView\");\r\n _$el.remove();\r\n\r\n };\r\n\r\n this.isReflowable = function() {\r\n return true;\r\n };\r\n\r\n this.onViewportResize = function() {\r\n\r\n if(updateViewportSize()) {\r\n updatePagination();\r\n }\r\n };\r\n\r\n var _viewSettings = undefined;\r\n this.setViewSettings = function(settings) {\r\n\r\n _viewSettings = settings;\r\n\r\n _paginationInfo.columnGap = settings.columnGap;\r\n _fontSize = settings.fontSize;\r\n\r\n updateHtmlFontSize();\r\n updateColumnGap();\r\n\r\n updateViewportSize();\r\n updatePagination();\r\n };\r\n\r\n function renderIframe() {\r\n if (_$contentFrame) {\r\n //destroy old contentFrame\r\n _$contentFrame.remove();\r\n }\r\n\r\n var template = Helpers.loadTemplate(\"reflowable_book_page_frame\", {});\r\n var $bookFrame = $(template);\r\n $bookFrame = _$el.append($bookFrame);\r\n\r\n _$contentFrame = $(\"#reflowable-content-frame\", $bookFrame);\r\n\r\n _$iframe = $(\"#epubContentIframe\", $bookFrame);\r\n\r\n _$iframe.css(\"left\", \"\");\r\n _$iframe.css(\"right\", \"\");\r\n _$iframe.css(\"position\", \"relative\");\r\n //_$iframe.css(_spine.isLeftToRight() ? \"left\" : \"right\", \"0px\");\r\n _$iframe.css(\"overflow\", \"hidden\");\r\n\r\n _navigationLogic = new CfiNavigationLogic(\r\n _$contentFrame, _$iframe,\r\n { rectangleBased: true, paginationInfo: _paginationInfo });\r\n }\r\n\r\n function loadSpineItem(spineItem) {\r\n\r\n if(_currentSpineItem != spineItem) {\r\n\r\n //create & append iframe to container frame\r\n renderIframe();\r\n\r\n _paginationInfo.pageOffset = 0;\r\n _paginationInfo.currentSpreadIndex = 0;\r\n _currentSpineItem = spineItem;\r\n _isWaitingFrameRender = true;\r\n\r\n var src = _spine.package.resolveRelativeUrl(spineItem.href);\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOAD_START, _$iframe, spineItem);\r\n\r\n _$iframe.css(\"opacity\", \"0.01\");\r\n\r\n _iframeLoader.loadIframe(_$iframe[0], src, onIFrameLoad, self, {spineItem : spineItem});\r\n }\r\n }\r\n\r\n function updateHtmlFontSize() {\r\n\r\n if(_$epubHtml) {\r\n Helpers.UpdateHtmlFontSize(_$epubHtml, _fontSize);\r\n }\r\n }\r\n\r\n function updateColumnGap() {\r\n\r\n if(_$epubHtml) {\r\n\r\n _$epubHtml.css(\"column-gap\", _paginationInfo.columnGap + \"px\");\r\n }\r\n }\r\n\r\n function onIFrameLoad(success) {\r\n if (!success) {\r\n applyIFrameLoad(success);\r\n return;\r\n }\r\n var fontLoader = new FontLoader(_$iframe);\r\n fontLoader.waitForFonts(function () {\r\n applyIFrameLoad(success);\r\n });\r\n }\r\n\r\n function applyIFrameLoad(success) {\r\n\r\n _isWaitingFrameRender = false;\r\n\r\n //while we where loading frame new request came\r\n if(_deferredPageRequest && _deferredPageRequest.spineItem != _currentSpineItem) {\r\n loadSpineItem(_deferredPageRequest.spineItem);\r\n return;\r\n }\r\n\r\n if(!success) {\r\n _$iframe.css(\"opacity\", \"1\");\r\n _deferredPageRequest = undefined;\r\n return;\r\n }\r\n\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOADED, _$iframe, _currentSpineItem);\r\n\r\n var epubContentDocument = _$iframe[0].contentDocument;\r\n _$epubHtml = $(\"html\", epubContentDocument);\r\n _$htmlBody = $(\"body\", _$epubHtml);\r\n\r\n // TODO: how to address this correctly across all the affected platforms?!\r\n // Video surface sometimes (depends on the video codec) disappears from CSS column (i.e. reflow page) during playback\r\n // (audio continues to play normally, but video canvas is invisible).\r\n // https://github.com/readium/readium-js-viewer/issues/265#issuecomment-73018762\r\n // ...Meanwhile, reverting https://github.com/readium/readium-js-viewer/issues/239\r\n // by commenting the code below (which unfortunately only works with some GPU / codec configurations,\r\n // but actually fails on several other machines!!)\r\n /*\r\n if(window.chrome\r\n && window.navigator.vendor === \"Google Inc.\") // TODO: Opera (WebKit) sometimes suffers from this rendering bug too (depends on the video codec), but unfortunately GPU-accelerated rendering makes the video controls unresponsive!!\r\n {\r\n $(\"video\", _$htmlBody).css(\"transform\", \"translateZ(0)\");\r\n }\r\n */\r\n\r\n _htmlBodyIsVerticalWritingMode = false;\r\n _htmlBodyIsLTRDirection = true;\r\n _htmlBodyIsLTRWritingMode = undefined;\r\n\r\n var win = _$iframe[0].contentDocument.defaultView || _$iframe[0].contentWindow;\r\n\r\n //Helpers.isIframeAlive\r\n var htmlBodyComputedStyle = win.getComputedStyle(_$htmlBody[0], null);\r\n if (htmlBodyComputedStyle)\r\n {\r\n _htmlBodyIsLTRDirection = htmlBodyComputedStyle.direction === \"ltr\";\r\n\r\n var writingMode = undefined;\r\n if (htmlBodyComputedStyle.getPropertyValue)\r\n {\r\n writingMode = htmlBodyComputedStyle.getPropertyValue(\"-webkit-writing-mode\") || htmlBodyComputedStyle.getPropertyValue(\"-moz-writing-mode\") || htmlBodyComputedStyle.getPropertyValue(\"-ms-writing-mode\") || htmlBodyComputedStyle.getPropertyValue(\"-o-writing-mode\") || htmlBodyComputedStyle.getPropertyValue(\"-epub-writing-mode\") || htmlBodyComputedStyle.getPropertyValue(\"writing-mode\");\r\n }\r\n else\r\n {\r\n writingMode = htmlBodyComputedStyle.webkitWritingMode || htmlBodyComputedStyle.mozWritingMode || htmlBodyComputedStyle.msWritingMode || htmlBodyComputedStyle.oWritingMode || htmlBodyComputedStyle.epubWritingMode || htmlBodyComputedStyle.writingMode;\r\n }\r\n\r\n if (writingMode)\r\n {\r\n _htmlBodyIsLTRWritingMode = writingMode.indexOf(\"-lr\") >= 0; // || writingMode.indexOf(\"horizontal-\") >= 0; we need explicit!\r\n\r\n if (writingMode.indexOf(\"vertical\") >= 0 || writingMode.indexOf(\"tb-\") >= 0 || writingMode.indexOf(\"bt-\") >= 0)\r\n {\r\n _htmlBodyIsVerticalWritingMode = true;\r\n }\r\n }\r\n }\r\n\r\n if (_htmlBodyIsLTRDirection)\r\n {\r\n if (_$htmlBody[0].getAttribute(\"dir\") === \"rtl\" || _$epubHtml[0].getAttribute(\"dir\") === \"rtl\")\r\n {\r\n _htmlBodyIsLTRDirection = false;\r\n }\r\n }\r\n\r\n // Some EPUBs may not have explicit RTL content direction (via CSS \"direction\" property or @dir attribute) despite having a RTL page progression direction. Readium consequently tweaks the HTML in order to restore the correct block flow in the browser renderer, resulting in the appropriate CSS columnisation (which is used to emulate pagination).\r\n if (!_spine.isLeftToRight() && _htmlBodyIsLTRDirection && !_htmlBodyIsVerticalWritingMode)\r\n {\r\n _$htmlBody[0].setAttribute(\"dir\", \"rtl\");\r\n _htmlBodyIsLTRDirection = false;\r\n _htmlBodyIsLTRWritingMode = false;\r\n }\r\n\r\n _paginationInfo.isVerticalWritingMode = _htmlBodyIsVerticalWritingMode;\r\n\r\n hideBook();\r\n _$iframe.css(\"opacity\", \"1\");\r\n\r\n updateViewportSize();\r\n _$epubHtml.css(\"height\", _lastViewPortSize.height + \"px\");\r\n\r\n _$epubHtml.css(\"position\", \"relative\");\r\n _$epubHtml.css(\"margin\", \"0\");\r\n _$epubHtml.css(\"padding\", \"0\");\r\n\r\n _$epubHtml.css(\"column-axis\", (_htmlBodyIsVerticalWritingMode ? \"vertical\" : \"horizontal\"));\r\n\r\n //\r\n // /////////\r\n // //Columns Debugging\r\n //\r\n // _$epubHtml.css(\"column-rule-color\", \"red\");\r\n // _$epubHtml.css(\"column-rule-style\", \"dashed\");\r\n // _$epubHtml.css(\"column-rule-width\", \"1px\");\r\n // _$epubHtml.css(\"background-color\", '#b0c4de');\r\n //\r\n // ////\r\n\r\n self.applyBookStyles();\r\n resizeImages();\r\n\r\n updateHtmlFontSize();\r\n updateColumnGap();\r\n\r\n\r\n self.applyStyles();\r\n }\r\n\r\n this.applyStyles = function() {\r\n\r\n Helpers.setStyles(_userStyles.getStyles(), _$el.parent());\r\n\r\n //because left, top, bottom, right setting ignores padding of parent container\r\n //we have to take it to account manually\r\n var elementMargins = Helpers.Margins.fromElement(_$el);\r\n setFrameSizesToRectangle(elementMargins.padding);\r\n\r\n\r\n updateViewportSize();\r\n updatePagination();\r\n };\r\n\r\n this.applyBookStyles = function() {\r\n\r\n if(_$epubHtml) {\r\n Helpers.setStyles(_bookStyles.getStyles(), _$epubHtml);\r\n }\r\n };\r\n\r\n function openDeferredElement() {\r\n\r\n if(!_deferredPageRequest) {\r\n return;\r\n }\r\n\r\n var deferredData = _deferredPageRequest;\r\n _deferredPageRequest = undefined;\r\n self.openPage(deferredData);\r\n\r\n }\r\n\r\n this.openPage = function(pageRequest) {\r\n\r\n if(_isWaitingFrameRender) {\r\n _deferredPageRequest = pageRequest;\r\n return;\r\n }\r\n\r\n // if no spine item specified we are talking about current spine item\r\n if(pageRequest.spineItem && pageRequest.spineItem != _currentSpineItem) {\r\n _deferredPageRequest = pageRequest;\r\n loadSpineItem(pageRequest.spineItem);\r\n return;\r\n }\r\n\r\n var pageIndex = undefined;\r\n\r\n\r\n if(pageRequest.spineItemPageIndex !== undefined) {\r\n pageIndex = pageRequest.spineItemPageIndex;\r\n }\r\n else if(pageRequest.elementId) {\r\n pageIndex = _navigationLogic.getPageForElementId(pageRequest.elementId);\r\n }\r\n else if(pageRequest.elementCfi) {\r\n try\r\n {\r\n pageIndex = _navigationLogic.getPageForElementCfi(pageRequest.elementCfi,\r\n [\"cfi-marker\", \"mo-cfi-highlight\"],\r\n [],\r\n [\"MathJax_Message\"]);\r\n }\r\n catch (e)\r\n {\r\n pageIndex = 0;\r\n console.error(e);\r\n }\r\n }\r\n else if(pageRequest.firstPage) {\r\n pageIndex = 0;\r\n }\r\n else if(pageRequest.lastPage) {\r\n pageIndex = _paginationInfo.columnCount - 1;\r\n }\r\n else {\r\n console.debug(\"No criteria in pageRequest\");\r\n pageIndex = 0;\r\n }\r\n\r\n if(pageIndex >= 0 && pageIndex < _paginationInfo.columnCount) {\r\n _paginationInfo.currentSpreadIndex = Math.floor(pageIndex / _paginationInfo.visibleColumnCount) ;\r\n onPaginationChanged(pageRequest.initiator, pageRequest.spineItem, pageRequest.elementId);\r\n }\r\n else {\r\n console.log('Illegal pageIndex value: ', pageIndex, 'column count is ', _paginationInfo.columnCount);\r\n }\r\n };\r\n\r\n function redraw() {\r\n\r\n var offsetVal = -_paginationInfo.pageOffset + \"px\";\r\n\r\n if (_htmlBodyIsVerticalWritingMode)\r\n {\r\n _$epubHtml.css(\"top\", offsetVal);\r\n }\r\n else\r\n {\r\n var ltr = _htmlBodyIsLTRDirection || _htmlBodyIsLTRWritingMode;\r\n\r\n _$epubHtml.css(\"left\", ltr ? offsetVal : \"\");\r\n _$epubHtml.css(\"right\", !ltr ? offsetVal : \"\");\r\n }\r\n\r\n showBook(); // as it's no longer hidden by shifting the position\r\n }\r\n\r\n function updateViewportSize() {\r\n\r\n var newWidth = _$contentFrame.width();\r\n var newHeight = _$contentFrame.height();\r\n\r\n if(_lastViewPortSize.width !== newWidth || _lastViewPortSize.height !== newHeight){\r\n\r\n _lastViewPortSize.width = newWidth;\r\n _lastViewPortSize.height = newHeight;\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function onPaginationChanged_(initiator, paginationRequest_spineItem, paginationRequest_elementId) {\r\n\r\n _paginationInfo.pageOffset = (_paginationInfo.columnWidth + _paginationInfo.columnGap) * _paginationInfo.visibleColumnCount * _paginationInfo.currentSpreadIndex;\r\n\r\n redraw();\r\n\r\n _.defer(function () {\r\n self.emit(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, {\r\n paginationInfo: self.getPaginationInfo(),\r\n initiator: initiator,\r\n spineItem: paginationRequest_spineItem,\r\n elementId: paginationRequest_elementId\r\n });\r\n });\r\n }\r\n var onPaginationChanged = _.debounce(onPaginationChanged_, 100);\r\n\r\n this.openPagePrev = function (initiator) {\r\n\r\n if(!_currentSpineItem) {\r\n return;\r\n }\r\n\r\n if(_paginationInfo.currentSpreadIndex > 0) {\r\n _paginationInfo.currentSpreadIndex--;\r\n onPaginationChanged(initiator);\r\n }\r\n else {\r\n\r\n var prevSpineItem = _spine.prevItem(_currentSpineItem, true);\r\n if(prevSpineItem) {\r\n\r\n var pageRequest = new PageOpenRequest(prevSpineItem, initiator);\r\n pageRequest.setLastPage();\r\n self.openPage(pageRequest);\r\n }\r\n }\r\n };\r\n\r\n this.openPageNext = function (initiator) {\r\n\r\n if(!_currentSpineItem) {\r\n return;\r\n }\r\n\r\n if(_paginationInfo.currentSpreadIndex < _paginationInfo.spreadCount - 1) {\r\n _paginationInfo.currentSpreadIndex++;\r\n onPaginationChanged(initiator);\r\n }\r\n else {\r\n\r\n var nextSpineItem = _spine.nextItem(_currentSpineItem, true);\r\n if(nextSpineItem) {\r\n\r\n var pageRequest = new PageOpenRequest(nextSpineItem, initiator);\r\n pageRequest.setFirstPage();\r\n self.openPage(pageRequest);\r\n }\r\n }\r\n };\r\n\r\n\r\n function updatePagination() {\r\n\r\n // At 100% font-size = 16px (on HTML, not body or descendant markup!)\r\n var MAXW = 550; //TODO user/vendor-configurable?\r\n var MINW = 400;\r\n\r\n var isDoublePageSyntheticSpread = Helpers.deduceSyntheticSpread(_$viewport, _currentSpineItem, _viewSettings);\r\n\r\n var forced = (isDoublePageSyntheticSpread === false) || (isDoublePageSyntheticSpread === true);\r\n // excludes 0 and 1 falsy/truthy values which denote non-forced result\r\n\r\n// console.debug(\"isDoublePageSyntheticSpread: \" + isDoublePageSyntheticSpread);\r\n// console.debug(\"forced: \" + forced);\r\n//\r\n if (isDoublePageSyntheticSpread === 0)\r\n {\r\n isDoublePageSyntheticSpread = 1; // try double page, will shrink if doesn't fit\r\n// console.debug(\"TRYING SPREAD INSTEAD OF SINGLE...\");\r\n }\r\n\r\n _paginationInfo.visibleColumnCount = isDoublePageSyntheticSpread ? 2 : 1;\r\n\r\n if (_htmlBodyIsVerticalWritingMode)\r\n {\r\n MAXW *= 2;\r\n isDoublePageSyntheticSpread = false;\r\n forced = true;\r\n _paginationInfo.visibleColumnCount = 1;\r\n// console.debug(\"Vertical Writing Mode => single CSS column, but behaves as if two-page spread\");\r\n }\r\n\r\n if(!_$epubHtml) {\r\n return;\r\n }\r\n\r\n hideBook(); // shiftBookOfScreen();\r\n\r\n var borderLeft = parseInt(_$viewport.css(\"border-left-width\"));\r\n var borderRight = parseInt(_$viewport.css(\"border-right-width\"));\r\n var adjustedGapLeft = _paginationInfo.columnGap/2;\r\n adjustedGapLeft = Math.max(0, adjustedGapLeft-borderLeft)\r\n var adjustedGapRight = _paginationInfo.columnGap/2;\r\n adjustedGapRight = Math.max(0, adjustedGapRight-borderRight)\r\n\r\n var filler = 0;\r\n\r\n// var win = _$iframe[0].contentDocument.defaultView || _$iframe[0].contentWindow;\r\n// var htmlBodyComputedStyle = win.getComputedStyle(_$htmlBody[0], null);\r\n// if (htmlBodyComputedStyle)\r\n// {\r\n// var fontSize = undefined;\r\n// if (htmlBodyComputedStyle.getPropertyValue)\r\n// {\r\n// fontSize = htmlBodyComputedStyle.getPropertyValue(\"font-size\");\r\n// }\r\n// else\r\n// {\r\n// fontSize = htmlBodyComputedStyle.fontSize;\r\n// }\r\n// console.debug(fontSize);\r\n// }\r\n\r\n if (_viewSettings.fontSize)\r\n {\r\n var fontSizeAdjust = (_viewSettings.fontSize*0.8)/100;\r\n MAXW = Math.floor(MAXW * fontSizeAdjust);\r\n MINW = Math.floor(MINW * fontSizeAdjust);\r\n }\r\n\r\n var availableWidth = _$viewport.width();\r\n var textWidth = availableWidth - borderLeft - borderRight - adjustedGapLeft - adjustedGapRight;\r\n if (isDoublePageSyntheticSpread)\r\n {\r\n textWidth = (textWidth - _paginationInfo.columnGap) * 0.5;\r\n }\r\n\r\n if (textWidth > MAXW)\r\n {\r\n// console.debug(\"LIMITING WIDTH\");\r\n filler = Math.floor((textWidth - MAXW) * (isDoublePageSyntheticSpread ? 1 : 0.5));\r\n }\r\n else if (!forced && textWidth < MINW && isDoublePageSyntheticSpread)\r\n {\r\n//console.debug(\"REDUCING SPREAD TO SINGLE\");\r\n isDoublePageSyntheticSpread = false;\r\n _paginationInfo.visibleColumnCount = 1;\r\n\r\n textWidth = availableWidth - borderLeft - borderRight - adjustedGapLeft - adjustedGapRight;\r\n if (textWidth > MAXW)\r\n {\r\n filler = Math.floor((textWidth - MAXW) * 0.5);\r\n }\r\n }\r\n\r\n _$el.css({\"left\": (filler+adjustedGapLeft + \"px\"), \"right\": (filler+adjustedGapRight + \"px\")});\r\n updateViewportSize(); //_$contentFrame ==> _lastViewPortSize\r\n\r\n\r\n _$iframe.css(\"width\", _lastViewPortSize.width + \"px\");\r\n _$iframe.css(\"height\", _lastViewPortSize.height + \"px\");\r\n\r\n _$epubHtml.css(\"height\", _lastViewPortSize.height + \"px\");\r\n\r\n // below min- max- are required in vertical writing mode (height is not enough, in some cases...weird!)\r\n _$epubHtml.css(\"min-height\", _lastViewPortSize.height + \"px\");\r\n _$epubHtml.css(\"max-height\", _lastViewPortSize.height + \"px\");\r\n\r\n //normalise spacing to avoid interference with column-isation\r\n _$epubHtml.css('margin', 0);\r\n _$epubHtml.css('padding', 0);\r\n _$epubHtml.css('border', 0);\r\n _$htmlBody.css('margin', 0);\r\n _$htmlBody.css('padding', 0);\r\n\r\n _paginationInfo.rightToLeft = _spine.isRightToLeft();\r\n\r\n _paginationInfo.columnWidth = Math.round(((_htmlBodyIsVerticalWritingMode ? _lastViewPortSize.height : _lastViewPortSize.width) - _paginationInfo.columnGap * (_paginationInfo.visibleColumnCount - 1)) / _paginationInfo.visibleColumnCount);\r\n\r\n var useColumnCountNotWidth = _paginationInfo.visibleColumnCount > 1; // column-count == 1 does not work in Chrome, and is not needed anyway (HTML width is full viewport width, no Firefox video flickering)\r\n if (useColumnCountNotWidth) {\r\n _$epubHtml.css(\"width\", _lastViewPortSize.width + \"px\");\r\n _$epubHtml.css(\"column-width\", \"auto\");\r\n _$epubHtml.css(\"column-count\", _paginationInfo.visibleColumnCount);\r\n } else {\r\n _$epubHtml.css(\"width\", (_htmlBodyIsVerticalWritingMode ? _lastViewPortSize.width : _paginationInfo.columnWidth) + \"px\");\r\n _$epubHtml.css(\"column-count\", \"auto\");\r\n _$epubHtml.css(\"column-width\", _paginationInfo.columnWidth + \"px\");\r\n }\r\n\r\n _$epubHtml.css(\"column-fill\", \"auto\");\r\n\r\n _$epubHtml.css({left: \"0\", right: \"0\", top: \"0\"});\r\n\r\n Helpers.triggerLayout(_$iframe);\r\n\r\n _paginationInfo.columnCount = ((_htmlBodyIsVerticalWritingMode ? _$epubHtml[0].scrollHeight : _$epubHtml[0].scrollWidth) + _paginationInfo.columnGap) / (_paginationInfo.columnWidth + _paginationInfo.columnGap);\r\n _paginationInfo.columnCount = Math.round(_paginationInfo.columnCount);\r\n\r\n var totalGaps = (_paginationInfo.columnCount-1) * _paginationInfo.columnGap;\r\n var colWidthCheck = ((_htmlBodyIsVerticalWritingMode ? _$epubHtml[0].scrollHeight : _$epubHtml[0].scrollWidth) - totalGaps) / _paginationInfo.columnCount;\r\n colWidthCheck = Math.round(colWidthCheck);\r\n\r\n if (colWidthCheck > _paginationInfo.columnWidth)\r\n {\r\n console.debug(\"ADJUST COLUMN\");\r\n console.log(_paginationInfo.columnWidth);\r\n console.log(colWidthCheck);\r\n\r\n _paginationInfo.columnWidth = colWidthCheck;\r\n }\r\n\r\n _paginationInfo.spreadCount = Math.ceil(_paginationInfo.columnCount / _paginationInfo.visibleColumnCount);\r\n\r\n if(_paginationInfo.currentSpreadIndex >= _paginationInfo.spreadCount) {\r\n _paginationInfo.currentSpreadIndex = _paginationInfo.spreadCount - 1;\r\n }\r\n\r\n if(_deferredPageRequest) {\r\n\r\n //if there is a request for specific page we get here\r\n openDeferredElement();\r\n }\r\n else {\r\n\r\n //we get here on resizing the viewport\r\n\r\n onPaginationChanged(self); // => redraw() => showBook(), so the trick below is not needed\r\n\r\n // //We do this to force re-rendering of the document in the iframe.\r\n // //There is a bug in WebView control with right to left columns layout - after resizing the window html document\r\n // //is shifted in side the containing div. Hiding and showing the html element puts document in place.\r\n // _$epubHtml.hide();\r\n // setTimeout(function() {\r\n // _$epubHtml.show();\r\n // onPaginationChanged(self); // => redraw() => showBook()\r\n // }, 50);\r\n\r\n }\r\n }\r\n\r\n// function shiftBookOfScreen() {\r\n//\r\n// if(_spine.isLeftToRight()) {\r\n// _$epubHtml.css(\"left\", (_lastViewPortSize.width + 1000) + \"px\");\r\n// }\r\n// else {\r\n// _$epubHtml.css(\"right\", (_lastViewPortSize.width + 1000) + \"px\");\r\n// }\r\n// }\r\n\r\n function hideBook()\r\n {\r\n if (_currentOpacity != -1) return; // already hidden\r\n\r\n _currentOpacity = _$epubHtml.css('opacity');\r\n _$epubHtml.css('opacity', \"0\");\r\n }\r\n\r\n function showBook()\r\n {\r\n if (_currentOpacity != -1)\r\n {\r\n _$epubHtml.css('opacity', _currentOpacity);\r\n }\r\n _currentOpacity = -1;\r\n }\r\n\r\n this.getFirstVisibleElementCfi = function() {\r\n\r\n var contentOffsets = getVisibleContentOffsets();\r\n return _navigationLogic.getFirstVisibleElementCfi(contentOffsets);\r\n };\r\n\r\n this.getPaginationInfo = function() {\r\n\r\n var paginationInfo = new CurrentPagesInfo(_spine, false);\r\n\r\n if(!_currentSpineItem) {\r\n return paginationInfo;\r\n }\r\n\r\n var pageIndexes = getOpenPageIndexes();\r\n\r\n for(var i = 0, count = pageIndexes.length; i < count; i++) {\r\n\r\n paginationInfo.addOpenPage(pageIndexes[i], _paginationInfo.columnCount, _currentSpineItem.idref, _currentSpineItem.index);\r\n }\r\n\r\n return paginationInfo;\r\n\r\n };\r\n\r\n function getOpenPageIndexes() {\r\n\r\n var indexes = [];\r\n\r\n var currentPage = _paginationInfo.currentSpreadIndex * _paginationInfo.visibleColumnCount;\r\n\r\n for(var i = 0; i < _paginationInfo.visibleColumnCount && (currentPage + i) < _paginationInfo.columnCount; i++) {\r\n\r\n indexes.push(currentPage + i);\r\n }\r\n\r\n return indexes;\r\n\r\n }\r\n\r\n //we need this styles for css columnizer not to chop big images\r\n function resizeImages() {\r\n\r\n if(!_$epubHtml) {\r\n return;\r\n }\r\n\r\n var $elem;\r\n var height;\r\n var width;\r\n\r\n $('img, svg', _$epubHtml).each(function(){\r\n\r\n $elem = $(this);\r\n\r\n // if we set max-width/max-height to 100% columnizing engine chops images embedded in the text\r\n // (but not if we set it to 99-98%) go figure.\r\n // TODO: CSS min-w/h is content-box, not border-box (does not take into account padding + border)? => images may still overrun?\r\n $elem.css('max-width', '98%');\r\n $elem.css('max-height', '98%');\r\n\r\n if(!$elem.css('height')) {\r\n $elem.css('height', 'auto');\r\n }\r\n\r\n if(!$elem.css('width')) {\r\n $elem.css('width', 'auto');\r\n }\r\n\r\n });\r\n }\r\n\r\n this.bookmarkCurrentPage = function() {\r\n\r\n if(!_currentSpineItem) {\r\n\r\n return new BookmarkData(\"\", \"\");\r\n }\r\n\r\n return new BookmarkData(_currentSpineItem.idref, self.getFirstVisibleElementCfi());\r\n };\r\n\r\n function getVisibleContentOffsets() {\r\n //TODO: _htmlBodyIsVerticalWritingMode ? (_lastViewPortSize.height * _paginationInfo.currentSpreadIndex)\r\n // NOT used with options.rectangleBased anyway (see CfiNavigationLogic constructor call, here in this reflow engine class)\r\n var columnsLeftOfViewport = Math.round(_paginationInfo.pageOffset / (_paginationInfo.columnWidth + _paginationInfo.columnGap));\r\n\r\n var topOffset = columnsLeftOfViewport * _$contentFrame.height();\r\n var bottomOffset = topOffset + _paginationInfo.visibleColumnCount * _$contentFrame.height();\r\n\r\n return {top: topOffset, bottom: bottomOffset};\r\n }\r\n\r\n this.getLoadedSpineItems = function() {\r\n return [_currentSpineItem];\r\n };\r\n\r\n this.getElementByCfi = function(spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n if(spineItem != _currentSpineItem) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n return _navigationLogic.getElementByCfi(cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n };\r\n\r\n this.getElementById = function(spineItem, id) {\r\n\r\n if(spineItem != _currentSpineItem) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n return _navigationLogic.getElementById(id);\r\n };\r\n\r\n this.getElement = function(spineItem, selector) {\r\n\r\n if(spineItem != _currentSpineItem) {\r\n console.error(\"spine item is not loaded\");\r\n return undefined;\r\n }\r\n\r\n return _navigationLogic.getElement(selector);\r\n };\r\n\r\n this.getFirstVisibleMediaOverlayElement = function() {\r\n\r\n var visibleContentOffsets = getVisibleContentOffsets();\r\n return _navigationLogic.getFirstVisibleMediaOverlayElement(visibleContentOffsets);\r\n };\r\n\r\n // /**\r\n // * @deprecated\r\n // */\r\n // this.getVisibleMediaOverlayElements = function() {\r\n //\r\n // var visibleContentOffsets = getVisibleContentOffsets();\r\n // return _navigationLogic.getVisibleMediaOverlayElements(visibleContentOffsets);\r\n // };\r\n\r\n this.insureElementVisibility = function(spineItemId, element, initiator) {\r\n\r\n var $element = $(element);\r\n if(_navigationLogic.isElementVisible($element, getVisibleContentOffsets()))\r\n {\r\n return;\r\n }\r\n\r\n var page = _navigationLogic.getPageForElement($element);\r\n\r\n if(page == -1)\r\n {\r\n return;\r\n }\r\n\r\n var openPageRequest = new PageOpenRequest(_currentSpineItem, initiator);\r\n openPageRequest.setPageIndex(page);\r\n\r\n var id = element.id;\r\n if (!id)\r\n {\r\n id = element.getAttribute(\"id\");\r\n }\r\n\r\n if (id)\r\n {\r\n openPageRequest.setElementId(id);\r\n }\r\n\r\n self.openPage(openPageRequest);\r\n };\r\n\r\n this.isElementCfiVisible = function(spineIdRef, contentCfi) {\r\n if (spineIdRef != _currentSpineItem.idref) {\r\n return false;\r\n }\r\n return _navigationLogic.isElementCfiVisible(contentCfi);\r\n };\r\n\r\n};\r\n return ReflowableView;\r\n});\r\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/style',[], function() {\r\n/**\r\n *\r\n * @param selector\r\n * @param declarations\r\n * @constructor\r\n */\r\nvar Style = function(selector, declarations) {\r\n\r\n this.selector = selector;\r\n this.declarations = declarations;\r\n\r\n this.setDeclarations = function(declarations) {\r\n\r\n for(var prop in declarations) {\r\n if(declarations.hasOwnProperty(prop)) {\r\n this.declarations[prop] = declarations[prop];\r\n }\r\n }\r\n\r\n }\r\n};\r\n return Style;\r\n});\r\n\n", "// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/style_collection',[\"./style\"], function(Style) {\r\n/**\r\n *\r\n * @constructor\r\n */\r\nvar StyleCollection = function() {\r\n\r\n var _styles = [];\r\n\r\n this.clear = function() {\r\n _styles.length = 0;\r\n\r\n };\r\n\r\n this.findStyle = function(selector) {\r\n\r\n var count = _styles.length;\r\n for(var i = 0; i < count; i++) {\r\n if(_styles[i].selector === selector) {\r\n return _styles[i];\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n this.addStyle = function(selector, declarations) {\r\n\r\n var style = this.findStyle(selector);\r\n\r\n if(style) {\r\n style.setDeclarations(declarations);\r\n }\r\n else {\r\n style = new Style(selector, declarations);\r\n _styles.push(style);\r\n }\r\n\r\n return style;\r\n };\r\n\r\n this.removeStyle = function(selector) {\r\n \r\n var count = _styles.length;\r\n\r\n for(var i = 0; i < count; i++) {\r\n\r\n if(_styles[i].selector === selector) {\r\n _styles.splice(i, 1);\r\n return;\r\n }\r\n }\r\n };\r\n\r\n this.getStyles = function() {\r\n return _styles;\r\n };\r\n\r\n this.resetStyleValues = function() {\r\n\r\n var count = _styles.length;\r\n\r\n for(var i = 0; i < count; i++) {\r\n\r\n var style = _styles[i];\r\n var declarations = style.declarations;\r\n\r\n for(var prop in declarations) {\r\n if(declarations.hasOwnProperty(prop)) {\r\n declarations[prop] = '';\r\n }\r\n }\r\n }\r\n }\r\n\r\n};\r\n return StyleCollection;\r\n});\r\n\n", - "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\ndefine('readium_shared_js/models/switches',[\"jquery\", \"underscore\"], function($, _) {\r\n/**\r\n *\r\n * @constructor\r\n */\r\nvar Switches = function() {\r\n\r\n};\r\n\r\n// Description: Parse the epub \"switch\" tags and hide\r\n// cases that are not supported\r\nSwitches.apply = function(dom) {\r\n\r\n\r\n // helper method, returns true if a given case node\r\n // is supported, false otherwise\r\n function isSupported(caseNode) {\r\n\r\n var ns = caseNode.attributes[\"required-namespace\"];\r\n if(!ns) {\r\n // the namespace was not specified, that should\r\n // never happen, we don't support it then\r\n console.log(\"Encountered a case statement with no required-namespace\");\r\n return false;\r\n }\r\n // all the xmlns that readium is known to support\r\n // TODO this is going to require maintenance\r\n var supportedNamespaces = [\"http://www.w3.org/1998/Math/MathML\"];\r\n return _.include(supportedNamespaces, ns);\r\n }\r\n\r\n $('switch', dom).each( function() {\r\n\r\n // keep track of whether or now we found one\r\n var found = false;\r\n\r\n $('case', this).each(function() {\r\n\r\n if( !found && isSupported(this) ) {\r\n found = true; // we found the node, don't remove it\r\n }\r\n else {\r\n $(this).remove(); // remove the node from the dom\r\n// $(this).prop(\"hidden\", true);\r\n }\r\n });\r\n\r\n if(found) {\r\n // if we found a supported case, remove the default\r\n $('default', this).remove();\r\n// $('default', this).prop(\"hidden\", true);\r\n }\r\n })\r\n};\r\n return Switches;\r\n});\r\n\n", + "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\ndefine('readium_shared_js/models/switches',[\"jquery\", \"underscore\"], function($, _) {\r\n/**\r\n *\r\n * @constructor\r\n */\r\nvar Switches = function() {\r\n\r\n};\r\n\r\n// Description: Parse the epub \"switch\" tags and hide\r\n// cases that are not supported\r\nSwitches.apply = function(dom) {\r\n\r\n function isSupported(caseNode) {\r\n\r\n var ns = caseNode.attributes[\"required-namespace\"];\r\n if(!ns) {\r\n // the namespace was not specified, that should\r\n // never happen, we don't support it then\r\n console.log(\"Encountered a case statement with no required-namespace\");\r\n return false;\r\n }\r\n // all the xmlns that readium is known to support\r\n // TODO this is going to require maintenance\r\n var supportedNamespaces = [\"http://www.w3.org/1998/Math/MathML\"];\r\n return _.include(supportedNamespaces, ns.value);\r\n }\r\n\r\n var getQuery = ((window.navigator.userAgent.indexOf(\"Trident\") > 0) || (window.navigator.userAgent.indexOf(\"Edge\") > 0))\r\n ? function (elementName) { return 'epub\\\\:' + elementName; }\r\n : function (elementName) { return elementName; };\r\n\r\n _.each(dom.querySelectorAll(getQuery('switch')), function(switchNode) {\r\n\r\n // keep track of whether or now we found one\r\n var found = false;\r\n\r\n _.each(switchNode.querySelectorAll(getQuery('case')), function(caseNode) {\r\n\r\n if( !found && isSupported(caseNode) ) {\r\n found = true; // we found the node, don't remove it\r\n }\r\n else {\r\n $(caseNode).remove(); // remove the node from the dom\r\n }\r\n\r\n });\r\n\r\n if (found) {\r\n\r\n // if we found a supported case, remove the default\r\n _.each(switchNode.querySelectorAll(getQuery('default')), function(defaultNode) {\r\n $(defaultNode).remove();\r\n });\r\n\r\n }\r\n\r\n });\r\n};\r\n return Switches;\r\n});\r\n\n", "// LauncherOSX\r\n//\r\n// Created by Boris Schneiderman.\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/trigger',[\"jquery\", \"../helpers\"], function($, Helpers) {\r\n/**\r\n * Setter fot epub Triggers\r\n *\r\n *\r\n * @param domNode\r\n */\r\n\r\nvar Trigger = function(domNode) {\r\n var $el = $(domNode);\r\n this.action \t= $el.attr(\"action\");\r\n this.ref \t\t= $el.attr(\"ref\");\r\n this.event \t\t= $el.attr(\"ev:event\");\r\n this.observer \t= $el.attr(\"ev:observer\");\r\n this.ref \t\t= $el.attr(\"ref\");\r\n};\r\n\r\nTrigger.register = function(dom) {\r\n $('trigger', dom).each(function() {\r\n var trigger = new Trigger(this);\r\n trigger.subscribe(dom);\r\n });\r\n};\r\n\r\nTrigger.prototype.subscribe = function(dom) {\r\n var selector = \"#\" + this.observer;\r\n var that = this;\r\n $(selector, dom).on(this.event, function() {\r\n that.execute(dom);\r\n });\r\n};\r\n\r\nTrigger.prototype.execute = function(dom) {\r\n var $target = $( \"#\" + Helpers.escapeJQuerySelector(this.ref), dom);\r\n switch(this.action)\r\n {\r\n case \"show\":\r\n $target.css(\"visibility\", \"visible\");\r\n break;\r\n case \"hide\":\r\n $target.css(\"visibility\", \"hidden\");\r\n break;\r\n case \"play\":\r\n $target[0].currentTime = 0;\r\n $target[0].play();\r\n break;\r\n case \"pause\":\r\n $target[0].pause();\r\n break;\r\n case \"resume\":\r\n $target[0].play();\r\n break;\r\n case \"mute\":\r\n $target[0].muted = true;\r\n break;\r\n case \"unmute\":\r\n $target[0].muted = false;\r\n break;\r\n default:\r\n console.log(\"do not no how to handle trigger \" + this.action);\r\n }\r\n};\r\n return Trigger;\r\n});\r\n\n", - "// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/views/reader_view',[\"jquery\", \"underscore\", \"eventEmitter\", \"./fixed_view\", \"../helpers\", \"./iframe_loader\", \"./internal_links_support\",\r\n \"./media_overlay_data_injector\", \"./media_overlay_player\", \"../models/package\", \"../models/page_open_request\",\r\n \"./reflowable_view\", \"./scroll_view\", \"../models/style_collection\", \"../models/switches\", \"../models/trigger\",\r\n \"../models/viewer_settings\", \"../globals\"],\r\n function ($, _, EventEmitter, FixedView, Helpers, IFrameLoader, InternalLinksSupport,\r\n MediaOverlayDataInjector, MediaOverlayPlayer, Package, PageOpenRequest,\r\n ReflowableView, ScrollView, StyleCollection, Switches, Trigger,\r\n ViewerSettings, Globals) {\r\n/**\r\n * Options passed on the reader from the readium loader/initializer\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.ReaderOptions\r\n * @property {jQueryElement|string} el The element the reader view should create itself in. Can be a jquery wrapped element or a query selector.\r\n * @property {Globals.Views.IFrameLoader} iframeLoader An instance of an iframe loader or one expanding it.\r\n * @property {boolean} needsFixedLayoutScalerWorkAround\r\n */\r\n\r\n/**\r\n * Top level View object. Interface for view manipulation public APIs\r\n * @param {Views.ReaderView.ReaderOptions} options\r\n * @constructor\r\n */\r\nvar ReaderView = function (options) {\r\n\r\n $.extend(this, new EventEmitter());\r\n\r\n var self = this;\r\n var _currentView = undefined;\r\n var _package = undefined;\r\n var _spine = undefined;\r\n var _viewerSettings = new ViewerSettings({});\r\n //styles applied to the container divs\r\n var _userStyles = new StyleCollection();\r\n //styles applied to the content documents\r\n var _bookStyles = new StyleCollection();\r\n var _internalLinksSupport = new InternalLinksSupport(this);\r\n var _mediaOverlayPlayer;\r\n var _mediaOverlayDataInjector;\r\n var _iframeLoader;\r\n var _$el;\r\n\r\n //We will call onViewportResize after user stopped resizing window\r\n var lazyResize = Helpers.extendedThrottle(\r\n handleViewportResizeStart,\r\n handleViewportResizeTick,\r\n handleViewportResizeEnd, 250, 1000, self);\r\n\r\n $(window).on(\"resize.ReadiumSDK.readerView\", lazyResize);\r\n\r\n if (options.el instanceof $) {\r\n _$el = options.el;\r\n console.log(\"** EL is a jQuery selector:\" + options.el.attr('id'));\r\n } else {\r\n _$el = $(options.el);\r\n console.log(\"** EL is a string:\" + _$el.attr('id'));\r\n }\r\n\r\n if (options.iframeLoader) {\r\n _iframeLoader = options.iframeLoader;\r\n }\r\n else {\r\n _iframeLoader = new IFrameLoader({mathJaxUrl: options.mathJaxUrl});\r\n }\r\n\r\n\r\n _needsFixedLayoutScalerWorkAround = options.needsFixedLayoutScalerWorkAround;\r\n /**\r\n * @returns {boolean}\r\n */\r\n this.needsFixedLayoutScalerWorkAround = function () {\r\n return _needsFixedLayoutScalerWorkAround;\r\n };\r\n\r\n /**\r\n * Create a view based on the given view type.\r\n * @param {Views.ReaderView.ViewType} viewType\r\n * @param {Views.ReaderView.ViewCreationOptions} options\r\n * @returns {*}\r\n */\r\n this.createViewForType = function (viewType, options) {\r\n var createdView;\r\n\r\n // NOTE: _$el == options.$viewport\r\n _$el.css(\"overflow\", \"hidden\");\r\n\r\n switch (viewType) {\r\n case ReaderView.VIEW_TYPE_FIXED:\r\n\r\n _$el.css(\"overflow\", \"auto\"); // for content pan, see self.setZoom()\r\n\r\n createdView = new FixedView(options, self);\r\n break;\r\n case ReaderView.VIEW_TYPE_SCROLLED_DOC:\r\n createdView = new ScrollView(options, false, self);\r\n break;\r\n case ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS:\r\n createdView = new ScrollView(options, true, self);\r\n break;\r\n default:\r\n createdView = new ReflowableView(options, self);\r\n break;\r\n }\r\n\r\n return createdView;\r\n };\r\n\r\n /**\r\n * Returns the current view type of the reader view\r\n * @returns {ReaderView.ViewType}\r\n */\r\n this.getCurrentViewType = function () {\r\n\r\n if (!_currentView) {\r\n return undefined;\r\n }\r\n\r\n if (_currentView instanceof ReflowableView) {\r\n return ReaderView.VIEW_TYPE_COLUMNIZED;\r\n }\r\n\r\n if (_currentView instanceof FixedView) {\r\n return ReaderView.VIEW_TYPE_FIXED;\r\n }\r\n\r\n if (_currentView instanceof ScrollView) {\r\n if (_currentView.isContinuousScroll()) {\r\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\r\n }\r\n\r\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\r\n }\r\n\r\n console.error(\"Unrecognized view type\");\r\n return undefined;\r\n };\r\n\r\n //based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 document\r\n function deduceDesiredViewType(spineItem) {\r\n\r\n //check settings\r\n if (_viewerSettings.scroll == \"scroll-doc\") {\r\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\r\n }\r\n\r\n if (_viewerSettings.scroll == \"scroll-continuous\") {\r\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\r\n }\r\n\r\n //is fixed layout ignore flow\r\n if (spineItem.isFixedLayout()) {\r\n return ReaderView.VIEW_TYPE_FIXED;\r\n }\r\n\r\n //flow\r\n if (spineItem.isFlowScrolledDoc()) {\r\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\r\n }\r\n\r\n if (spineItem.isFlowScrolledContinuous()) {\r\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\r\n }\r\n\r\n return ReaderView.VIEW_TYPE_COLUMNIZED;\r\n }\r\n\r\n // returns true is view changed\r\n function initViewForItem(spineItem, callback) {\r\n\r\n var desiredViewType = deduceDesiredViewType(spineItem);\r\n\r\n if (_currentView) {\r\n\r\n if (self.getCurrentViewType() == desiredViewType) {\r\n callback(false);\r\n return;\r\n }\r\n\r\n resetCurrentView();\r\n }\r\n\r\n /**\r\n * View creation options\r\n * @typedef {object} Globals.Views.ReaderView.ViewCreationOptions\r\n * @property {jQueryElement} $viewport The view port element the reader view has created.\r\n * @property {Globals.Models.Spine} spine The spine item collection object\r\n * @property {Globals.Collections.StyleCollection} userStyles User styles\r\n * @property {Globals.Collections.StyleCollection} bookStyles Book styles\r\n * @property {Globals.Views.IFrameLoader} iframeLoader An instance of an iframe loader or one expanding it.\r\n */\r\n var viewCreationParams = {\r\n $viewport: _$el,\r\n spine: _spine,\r\n userStyles: _userStyles,\r\n bookStyles: _bookStyles,\r\n iframeLoader: _iframeLoader\r\n };\r\n\r\n\r\n _currentView = self.createViewForType(desiredViewType, viewCreationParams);\r\n self.emit(Globals.Events.READER_VIEW_CREATED, desiredViewType);\r\n\r\n _currentView.on(Globals.Events.CONTENT_DOCUMENT_LOADED, function ($iframe, spineItem) {\r\n\r\n if (!Helpers.isIframeAlive($iframe[0])) return;\r\n\r\n // performance degrades with large DOM (e.g. word-level text-audio sync)\r\n _mediaOverlayDataInjector.attachMediaOverlayData($iframe, spineItem, _viewerSettings);\r\n\r\n _internalLinksSupport.processLinkElements($iframe, spineItem);\r\n\r\n var contentDoc = $iframe[0].contentDocument;\r\n Trigger.register(contentDoc);\r\n Switches.apply(contentDoc);\r\n\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOADED, $iframe, spineItem);\r\n });\r\n\r\n _currentView.on(Globals.Events.CONTENT_DOCUMENT_LOAD_START, function ($iframe, spineItem) {\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOAD_START, $iframe, spineItem);\r\n });\r\n\r\n _currentView.on(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, function (pageChangeData) {\r\n\r\n //we call on onPageChanged explicitly instead of subscribing to the Globals.Events.PAGINATION_CHANGED by\r\n //mediaOverlayPlayer because we hve to guarantee that mediaOverlayPlayer will be updated before the host\r\n //application will be notified by the same Globals.Events.PAGINATION_CHANGED event\r\n _mediaOverlayPlayer.onPageChanged(pageChangeData);\r\n\r\n _.defer(function () {\r\n self.emit(Globals.Events.PAGINATION_CHANGED, pageChangeData);\r\n });\r\n });\r\n\r\n _currentView.on(Globals.Events.FXL_VIEW_RESIZED, function () {\r\n self.emit(Globals.Events.FXL_VIEW_RESIZED);\r\n })\r\n\r\n _currentView.render();\r\n _currentView.setViewSettings(_viewerSettings);\r\n\r\n // we do this to wait until elements are rendered otherwise book is not able to determine view size.\r\n setTimeout(function () {\r\n\r\n callback(true);\r\n\r\n }, 50);\r\n\r\n }\r\n\r\n /**\r\n * Returns a list of the currently active spine items\r\n *\r\n * @returns {Models.SpineItem[]}\r\n */\r\n this.getLoadedSpineItems = function () {\r\n\r\n if (_currentView) {\r\n return _currentView.getLoadedSpineItems();\r\n }\r\n\r\n return [];\r\n };\r\n\r\n function resetCurrentView() {\r\n\r\n if (!_currentView) {\r\n return;\r\n }\r\n\r\n self.emit(Globals.Events.READER_VIEW_DESTROYED);\r\n\r\n _currentView.off(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED);\r\n _currentView.remove();\r\n _currentView = undefined;\r\n }\r\n\r\n /**\r\n * Returns the currently instanced viewer settings\r\n *\r\n * @returns {Models.ViewerSettings}\r\n */\r\n this.viewerSettings = function () {\r\n return _viewerSettings;\r\n };\r\n\r\n /**\r\n * Returns a data object based on the package document\r\n *\r\n * @returns {Models.Package}\r\n */\r\n this.package = function () {\r\n return _package;\r\n };\r\n\r\n /**\r\n * Returns a representation of the spine as a data object, also acts as list of spine items\r\n *\r\n * @returns {Models.Spine}\r\n */\r\n this.spine = function () {\r\n return _spine;\r\n };\r\n\r\n /**\r\n * Returns the user CSS styles collection\r\n *\r\n * @returns {Collections.StyleCollection}\r\n */\r\n this.userStyles = function () {\r\n return _userStyles;\r\n };\r\n\r\n /**\r\n * Open Book Data\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.OpenBookData\r\n * @property {Globals.Models.Package} package - packageData (required)\r\n * @property {Globals.Models.PageOpenRequest} openPageRequest - openPageRequestData, (optional) data related to open page request\r\n * @property {Globals.Views.ReaderView.SettingsData} [settings]\r\n * @property {Globals.Collections.StyleCollection} styles: [cssStyles]\r\n * @todo Define missing types\r\n */\r\n\r\n /**\r\n * Triggers the process of opening the book and requesting resources specified in the packageData\r\n *\r\n * @param {Views.ReaderView.OpenBookData} openBookData - object with open book data\r\n */\r\n this.openBook = function (openBookData) {\r\n\r\n var packageData = openBookData.package ? openBookData.package : openBookData;\r\n\r\n _package = new Package(packageData);\r\n\r\n _spine = _package.spine;\r\n _spine.handleLinear(true);\r\n\r\n if (_mediaOverlayPlayer) {\r\n _mediaOverlayPlayer.reset();\r\n }\r\n\r\n _mediaOverlayPlayer = new MediaOverlayPlayer(self, $.proxy(onMediaPlayerStatusChanged, self));\r\n _mediaOverlayPlayer.setAutomaticNextSmil(_viewerSettings.mediaOverlaysAutomaticPageTurn ? true : false); // just to ensure the internal var is set to the default settings (user settings are applied below at self.updateSettings(openBookData.settings);)\r\n\r\n _mediaOverlayDataInjector = new MediaOverlayDataInjector(_package.media_overlay, _mediaOverlayPlayer);\r\n\r\n\r\n resetCurrentView();\r\n\r\n if (openBookData.settings) {\r\n self.updateSettings(openBookData.settings);\r\n }\r\n\r\n if (openBookData.styles) {\r\n self.setStyles(openBookData.styles);\r\n }\r\n\r\n var pageRequestData = undefined;\r\n\r\n if (openBookData.openPageRequest) {\r\n\r\n if (openBookData.openPageRequest.idref || (openBookData.openPageRequest.contentRefUrl && openBookData.openPageRequest.sourceFileHref)) {\r\n pageRequestData = openBookData.openPageRequest;\r\n }\r\n else {\r\n console.log(\"Invalid page request data: idref required!\");\r\n }\r\n }\r\n\r\n var fallback = false;\r\n if (pageRequestData) {\r\n\r\n pageRequestData = openBookData.openPageRequest;\r\n\r\n try {\r\n if (pageRequestData.idref) {\r\n\r\n if (pageRequestData.spineItemPageIndex) {\r\n fallback = !self.openSpineItemPage(pageRequestData.idref, pageRequestData.spineItemPageIndex, self);\r\n }\r\n else if (pageRequestData.elementCfi) {\r\n fallback = !self.openSpineItemElementCfi(pageRequestData.idref, pageRequestData.elementCfi, self);\r\n }\r\n else {\r\n fallback = !self.openSpineItemPage(pageRequestData.idref, 0, self);\r\n }\r\n }\r\n else {\r\n fallback = !self.openContentUrl(pageRequestData.contentRefUrl, pageRequestData.sourceFileHref, self);\r\n }\r\n } catch (err) {\r\n console.error(\"openPageRequest fail: fallback to first page!\")\r\n console.log(err);\r\n fallback = true;\r\n }\r\n }\r\n else {\r\n fallback = true;\r\n }\r\n\r\n if (fallback) {// if we where not asked to open specific page we will open the first one\r\n\r\n var spineItem = _spine.first();\r\n if (spineItem) {\r\n var pageOpenRequest = new PageOpenRequest(spineItem, self);\r\n pageOpenRequest.setFirstPage();\r\n openPage(pageOpenRequest, 0);\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n function onMediaPlayerStatusChanged(status) {\r\n self.emit(Globals.Events.MEDIA_OVERLAY_STATUS_CHANGED, status);\r\n }\r\n\r\n /**\r\n * Flips the page from left to right.\r\n * Takes to account the page progression direction to decide to flip to prev or next page.\r\n */\r\n this.openPageLeft = function () {\r\n\r\n if (_package.spine.isLeftToRight()) {\r\n self.openPagePrev();\r\n }\r\n else {\r\n self.openPageNext();\r\n }\r\n };\r\n\r\n /**\r\n * Flips the page from right to left.\r\n * Takes to account the page progression direction to decide to flip to prev or next page.\r\n */\r\n this.openPageRight = function () {\r\n\r\n if (_package.spine.isLeftToRight()) {\r\n self.openPageNext();\r\n }\r\n else {\r\n self.openPagePrev();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Returns if the current child view is an instance of a fixed page view\r\n *\r\n * @returns {boolean}\r\n */\r\n this.isCurrentViewFixedLayout = function () {\r\n return _currentView instanceof FixedView;\r\n };\r\n\r\n /**\r\n * Zoom options\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.ZoomOptions\r\n * @property {string} style - \"user\"|\"fit-screen\"|\"fit-width\"\r\n * @property {number} scale - 0.0 to 1.0\r\n */\r\n\r\n /**\r\n * Set the zoom options.\r\n *\r\n * @param {Views.ReaderView.ZoomOptions} zoom Zoom options\r\n */\r\n this.setZoom = function (zoom) {\r\n // zoom only handled by fixed layout views\r\n if (self.isCurrentViewFixedLayout()) {\r\n _currentView.setZoom(zoom);\r\n }\r\n };\r\n\r\n /**\r\n * Returns the current view scale as a percentage\r\n *\r\n * @returns {number}\r\n */\r\n this.getViewScale = function () {\r\n if (self.isCurrentViewFixedLayout()) {\r\n return 100 * _currentView.getViewScale();\r\n }\r\n else {\r\n return 100;\r\n }\r\n };\r\n\r\n /**\r\n * Settings Data\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.SettingsData\r\n * @property {number} fontSize - Font size as percentage\r\n * @property {(string|boolean)} syntheticSpread - \"auto\"|true|false\r\n * @property {(string|boolean)} scroll - \"auto\"|true|false\r\n * @property {boolean} doNotUpdateView - Indicates whether the view should be updated after the settings are applied\r\n * @property {boolean} mediaOverlaysEnableClick - Indicates whether media overlays are interactive on mouse clicks\r\n */\r\n\r\n /**\r\n * Updates reader view based on the settings specified in settingsData object\r\n *\r\n * @param {Globals.Views.ReaderView.SettingsData} settingsData Settings data\r\n * @fires Globals.Events.SETTINGS_APPLIED\r\n */\r\n this.updateSettings = function (settingsData) {\r\n\r\n//console.debug(\"UpdateSettings: \" + JSON.stringify(settingsData));\r\n\r\n _viewerSettings.update(settingsData);\r\n\r\n if (_mediaOverlayPlayer) {\r\n _mediaOverlayPlayer.setAutomaticNextSmil(_viewerSettings.mediaOverlaysAutomaticPageTurn ? true : false);\r\n }\r\n\r\n if (_currentView && !settingsData.doNotUpdateView) {\r\n\r\n var bookMark = _currentView.bookmarkCurrentPage();\r\n\r\n if (bookMark && bookMark.idref) {\r\n\r\n var wasPlaying = false;\r\n if (_currentView.isReflowable && _currentView.isReflowable()) {\r\n wasPlaying = self.isPlayingMediaOverlay();\r\n if (wasPlaying) {\r\n self.pauseMediaOverlay();\r\n }\r\n }\r\n\r\n var spineItem = _spine.getItemById(bookMark.idref);\r\n\r\n initViewForItem(spineItem, function (isViewChanged) {\r\n\r\n if (!isViewChanged) {\r\n _currentView.setViewSettings(_viewerSettings);\r\n }\r\n\r\n self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self);\r\n\r\n if (wasPlaying) {\r\n self.playMediaOverlay();\r\n // setTimeout(function()\r\n // {\r\n // }, 60);\r\n }\r\n\r\n self.emit(Globals.Events.SETTINGS_APPLIED);\r\n });\r\n \r\n return;\r\n }\r\n }\r\n\r\n self.emit(Globals.Events.SETTINGS_APPLIED);\r\n };\r\n\r\n /**\r\n * Opens the next page.\r\n */\r\n this.openPageNext = function () {\r\n\r\n if (self.getCurrentViewType() === ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS) {\r\n _currentView.openPageNext(self);\r\n return;\r\n }\r\n\r\n var paginationInfo = _currentView.getPaginationInfo();\r\n\r\n if (paginationInfo.openPages.length == 0) {\r\n return;\r\n }\r\n\r\n var lastOpenPage = paginationInfo.openPages[paginationInfo.openPages.length - 1];\r\n\r\n if (lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1) {\r\n _currentView.openPageNext(self);\r\n return;\r\n }\r\n\r\n var currentSpineItem = _spine.getItemById(lastOpenPage.idref);\r\n\r\n var nextSpineItem = _spine.nextItem(currentSpineItem);\r\n\r\n if (!nextSpineItem) {\r\n return;\r\n }\r\n\r\n var openPageRequest = new PageOpenRequest(nextSpineItem, self);\r\n openPageRequest.setFirstPage();\r\n\r\n openPage(openPageRequest, 2);\r\n };\r\n\r\n /**\r\n * Opens the previous page.\r\n */\r\n this.openPagePrev = function () {\r\n\r\n if (self.getCurrentViewType() === ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS) {\r\n _currentView.openPagePrev(self);\r\n return;\r\n }\r\n\r\n var paginationInfo = _currentView.getPaginationInfo();\r\n\r\n if (paginationInfo.openPages.length == 0) {\r\n return;\r\n }\r\n\r\n var firstOpenPage = paginationInfo.openPages[0];\r\n\r\n if (firstOpenPage.spineItemPageIndex > 0) {\r\n _currentView.openPagePrev(self);\r\n return;\r\n }\r\n\r\n var currentSpineItem = _spine.getItemById(firstOpenPage.idref);\r\n\r\n var prevSpineItem = _spine.prevItem(currentSpineItem);\r\n\r\n if (!prevSpineItem) {\r\n return;\r\n }\r\n\r\n var openPageRequest = new PageOpenRequest(prevSpineItem, self);\r\n openPageRequest.setLastPage();\r\n\r\n openPage(openPageRequest, 1);\r\n };\r\n\r\n function getSpineItem(idref) {\r\n\r\n if (!idref) {\r\n\r\n console.log(\"idref parameter value missing!\");\r\n return undefined;\r\n }\r\n\r\n var spineItem = _spine.getItemById(idref);\r\n if (!spineItem) {\r\n console.log(\"Spine item with id \" + idref + \" not found!\");\r\n return undefined;\r\n }\r\n\r\n return spineItem;\r\n\r\n }\r\n\r\n /**\r\n * Opens the page of the spine item with element with provided cfi\r\n *\r\n * @param {string} idref Id of the spine item\r\n * @param {string} elementCfi CFI of the element to be shown\r\n * @param {object} initiator optional\r\n */\r\n this.openSpineItemElementCfi = function (idref, elementCfi, initiator) {\r\n\r\n var spineItem = getSpineItem(idref);\r\n\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n var pageData = new PageOpenRequest(spineItem, initiator);\r\n if (elementCfi) {\r\n pageData.setElementCfi(elementCfi);\r\n }\r\n\r\n openPage(pageData, 0);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Opens specified page index of the current spine item\r\n *\r\n * @param {number} pageIndex Zero based index of the page in the current spine item\r\n * @param {object} initiator optional\r\n */\r\n this.openPageIndex = function (pageIndex, initiator) {\r\n\r\n if (!_currentView) {\r\n return false;\r\n }\r\n\r\n var pageRequest;\r\n\r\n if (_package.isFixedLayout()) {\r\n var spineItem = _spine.items[pageIndex];\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n pageRequest = new PageOpenRequest(spineItem, initiator);\r\n pageRequest.setPageIndex(0);\r\n }\r\n else {\r\n\r\n var spineItems = this.getLoadedSpineItems();\r\n if (spineItems.length > 0) {\r\n pageRequest = new PageOpenRequest(spineItems[0], initiator);\r\n pageRequest.setPageIndex(pageIndex);\r\n }\r\n }\r\n\r\n openPage(pageRequest, 0);\r\n\r\n return true;\r\n };\r\n\r\n // dir: 0 => new or same page, 1 => previous, 2 => next\r\n function openPage(pageRequest, dir) {\r\n\r\n initViewForItem(pageRequest.spineItem, function (isViewChanged) {\r\n\r\n if (!isViewChanged) {\r\n _currentView.setViewSettings(_viewerSettings);\r\n }\r\n\r\n _currentView.openPage(pageRequest, dir);\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Opens page index of the spine item with idref provided\r\n *\r\n * @param {string} idref Id of the spine item\r\n * @param {number} pageIndex Zero based index of the page in the spine item\r\n * @param {object} initiator optional\r\n */\r\n this.openSpineItemPage = function (idref, pageIndex, initiator) {\r\n\r\n var spineItem = getSpineItem(idref);\r\n\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n var pageData = new PageOpenRequest(spineItem, initiator);\r\n if (pageIndex) {\r\n pageData.setPageIndex(pageIndex);\r\n }\r\n\r\n openPage(pageData, 0);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Set CSS Styles to the reader container\r\n *\r\n * @param {Collections.StyleCollection} styles Style collection containing selector property and declarations object\r\n * @param {boolean} doNotUpdateView Whether to update the view after the styles are applied.\r\n */\r\n this.setStyles = function (styles, doNotUpdateView) {\r\n\r\n var count = styles.length;\r\n\r\n for (var i = 0; i < count; i++) {\r\n if (styles[i].declarations) {\r\n _userStyles.addStyle(styles[i].selector, styles[i].declarations);\r\n }\r\n else {\r\n _userStyles.removeStyle(styles[i].selector);\r\n }\r\n }\r\n\r\n applyStyles(doNotUpdateView);\r\n\r\n };\r\n\r\n /**\r\n * Set CSS Styles to the content documents\r\n *\r\n * @param {Collections.StyleCollection} styles Style collection containing selector property and declarations object\r\n */\r\n this.setBookStyles = function (styles) {\r\n\r\n var count = styles.length;\r\n\r\n for (var i = 0; i < count; i++) {\r\n _bookStyles.addStyle(styles[i].selector, styles[i].declarations);\r\n }\r\n\r\n if (_currentView) {\r\n _currentView.applyBookStyles();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Gets an element from active content documents based on a query selector.\r\n *\r\n * @param {Models.SpineItem} spineItem The spine item object associated with an active content document\r\n * @param {string} selector The query selector\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getElement = function (spineItem, selector) {\r\n\r\n if (_currentView) {\r\n return _currentView.getElement(spineItem, selector);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Gets an element from active content documents based on an element id.\r\n *\r\n * @param {Models.SpineItem} spineItem The spine item object associated with an active content document\r\n * @param {string} id The element id\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getElementById = function (spineItem, id) {\r\n\r\n if (_currentView) {\r\n return _currentView.getElementById(spineItem, id);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Gets an element from active content documents based on a content CFI.\r\n *\r\n * @param {Models.SpineItem} spineItem The spine item idref associated with an active content document\r\n * @param {string} cfi The partial content CFI\r\n * @param {string[]} [classBlacklist]\r\n * @param {string[]} [elementBlacklist]\r\n * @param {string[]} [idBlacklist]\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getElementByCfi = function (spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n if (_currentView) {\r\n return _currentView.getElementByCfi(spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n }\r\n\r\n return undefined;\r\n\r\n };\r\n\r\n function applyStyles(doNotUpdateView) {\r\n\r\n Helpers.setStyles(_userStyles.getStyles(), _$el);\r\n\r\n if (_mediaOverlayPlayer)\r\n _mediaOverlayPlayer.applyStyles();\r\n\r\n if (doNotUpdateView) return;\r\n\r\n if (_currentView) {\r\n _currentView.applyStyles();\r\n }\r\n }\r\n\r\n /**\r\n * Opens a content url from a media player context\r\n *\r\n * @param {string} contentRefUrl\r\n * @param {string} sourceFileHref\r\n * @param offset\r\n */\r\n this.mediaOverlaysOpenContentUrl = function (contentRefUrl, sourceFileHref, offset) {\r\n _mediaOverlayPlayer.mediaOverlaysOpenContentUrl(contentRefUrl, sourceFileHref, offset);\r\n };\r\n\r\n\r\n /**\r\n * Opens the content document specified by the url\r\n *\r\n * @param {string} contentRefUrl Url of the content document\r\n * @param {string | undefined} sourceFileHref Url to the file that contentRefUrl is relative to. If contentRefUrl is\r\n * relative ot the source file that contains it instead of the package file (ex. TOC file) We have to know the\r\n * sourceFileHref to resolve contentUrl relative to the package file.\r\n * @param {object} initiator optional\r\n */\r\n this.openContentUrl = function (contentRefUrl, sourceFileHref, initiator) {\r\n\r\n var combinedPath = Helpers.ResolveContentRef(contentRefUrl, sourceFileHref);\r\n\r\n var hashIndex = combinedPath.indexOf(\"#\");\r\n var hrefPart;\r\n var elementId;\r\n if (hashIndex >= 0) {\r\n hrefPart = combinedPath.substr(0, hashIndex);\r\n elementId = combinedPath.substr(hashIndex + 1);\r\n }\r\n else {\r\n hrefPart = combinedPath;\r\n elementId = undefined;\r\n }\r\n\r\n var spineItem = _spine.getItemByHref(hrefPart);\r\n if (!spineItem) {\r\n console.warn('spineItem ' + hrefPart + ' not found');\r\n // sometimes that happens because spine item's URI gets encoded,\r\n // yet it's compared with raw strings by `getItemByHref()` -\r\n // so we try to search with decoded link as well\r\n var decodedHrefPart = decodeURIComponent(hrefPart);\r\n spineItem = _spine.getItemByHref(decodedHrefPart);\r\n if (!spineItem) {\r\n console.warn('decoded spineItem ' + decodedHrefPart + ' missing as well');\r\n return false;\r\n }\r\n }\r\n\r\n return self.openSpineItemElementId(spineItem.idref, elementId, initiator);\r\n };\r\n\r\n /**\r\n * Opens the page of the spine item with element with provided cfi\r\n *\r\n * @param {string} idref Id of the spine item\r\n * @param {string} elementId id of the element to be shown\r\n * @param {object} initiator optional\r\n */\r\n this.openSpineItemElementId = function (idref, elementId, initiator) {\r\n\r\n var spineItem = _spine.getItemById(idref);\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n var pageData = new PageOpenRequest(spineItem, initiator);\r\n\r\n if (elementId) {\r\n pageData.setElementId(elementId);\r\n }\r\n\r\n\r\n openPage(pageData, 0);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Returns the bookmark associated with currently opened page.\r\n *\r\n * @returns {string} Serialized Globals.Models.BookmarkData object as JSON string.\r\n */\r\n this.bookmarkCurrentPage = function () {\r\n return JSON.stringify(_currentView.bookmarkCurrentPage());\r\n };\r\n\r\n /**\r\n * Resets all the custom styles set by setStyle callers at runtime\r\n */\r\n this.clearStyles = function () {\r\n\r\n _userStyles.resetStyleValues();\r\n applyStyles();\r\n _userStyles.clear();\r\n };\r\n\r\n /**\r\n * Resets all the custom styles set by setBookStyle callers at runtime\r\n */\r\n this.clearBookStyles = function () {\r\n\r\n if (_currentView) {\r\n\r\n _bookStyles.resetStyleValues();\r\n _currentView.applyBookStyles();\r\n }\r\n\r\n _bookStyles.clear();\r\n };\r\n\r\n /**\r\n * Returns true if media overlay available for one of the open pages.\r\n *\r\n * @returns {boolean}\r\n */\r\n this.isMediaOverlayAvailable = function () {\r\n\r\n if (!_mediaOverlayPlayer) return false;\r\n\r\n return _mediaOverlayPlayer.isMediaOverlayAvailable();\r\n };\r\n\r\n /*\r\n this.setMediaOverlaySkippables = function(items) {\r\n\r\n _mediaOverlayPlayer.setMediaOverlaySkippables(items);\r\n };\r\n\r\n this.setMediaOverlayEscapables = function(items) {\r\n\r\n _mediaOverlayPlayer.setMediaOverlayEscapables(items);\r\n };\r\n */\r\n\r\n /**\r\n * Starts/Stop playing media overlay on current page\r\n */\r\n this.toggleMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.toggleMediaOverlay();\r\n };\r\n\r\n\r\n /**\r\n * Plays next fragment media overlay\r\n */\r\n this.nextMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.nextMediaOverlay();\r\n\r\n };\r\n\r\n /**\r\n * Plays previous fragment media overlay\r\n */\r\n this.previousMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.previousMediaOverlay();\r\n\r\n };\r\n\r\n /**\r\n * Plays next available fragment media overlay that is outside of the current escapable scope\r\n */\r\n this.escapeMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.escape();\r\n };\r\n\r\n /**\r\n * End media overlay TTS\r\n * @todo Clarify what this does with Daniel.\r\n */\r\n this.ttsEndedMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.onTTSEnd();\r\n };\r\n\r\n /**\r\n * Pause currently playing media overlays.\r\n */\r\n this.pauseMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.pause();\r\n };\r\n\r\n /**\r\n * Start/Resume playback of media overlays.\r\n */\r\n this.playMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.play();\r\n };\r\n\r\n /**\r\n * Determine if media overlays are currently playing.\r\n * @returns {boolean}\r\n */\r\n this.isPlayingMediaOverlay = function () {\r\n\r\n return _mediaOverlayPlayer.isPlaying();\r\n };\r\n\r\n//\r\n// should use Globals.Events.SETTINGS_APPLIED instead!\r\n// this.setRateMediaOverlay = function(rate) {\r\n//\r\n// _mediaOverlayPlayer.setRate(rate);\r\n// };\r\n// this.setVolumeMediaOverlay = function(volume){\r\n//\r\n// _mediaOverlayPlayer.setVolume(volume);\r\n// };\r\n\r\n /**\r\n * Get the first visible media overlay element from the currently active content document(s)\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getFirstVisibleMediaOverlayElement = function () {\r\n\r\n if (_currentView) {\r\n return _currentView.getFirstVisibleMediaOverlayElement();\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Used to jump to an element to make sure it is visible when a content document is paginated\r\n * @param {string} spineItemId The spine item idref associated with an active content document\r\n * @param {HTMLElement} element The element to make visible\r\n * @param [initiator]\r\n */\r\n this.insureElementVisibility = function (spineItemId, element, initiator) {\r\n\r\n if (_currentView) {\r\n _currentView.insureElementVisibility(spineItemId, element, initiator);\r\n }\r\n };\r\n\r\n var _resizeBookmark = null;\r\n var _resizeMOWasPlaying = false;\r\n\r\n function handleViewportResizeStart() {\r\n\r\n _resizeBookmark = null;\r\n _resizeMOWasPlaying = false;\r\n\r\n if (_currentView) {\r\n\r\n if (_currentView.isReflowable && _currentView.isReflowable()) {\r\n _resizeMOWasPlaying = self.isPlayingMediaOverlay();\r\n if (_resizeMOWasPlaying) {\r\n self.pauseMediaOverlay();\r\n }\r\n }\r\n\r\n _resizeBookmark = _currentView.bookmarkCurrentPage(); // not self! (JSON string)\r\n }\r\n }\r\n\r\n function handleViewportResizeTick() {\r\n if (_currentView) {\r\n self.handleViewportResize(_resizeBookmark);\r\n }\r\n }\r\n\r\n function handleViewportResizeEnd() {\r\n //same as doing one final tick for now\r\n handleViewportResizeTick();\r\n\r\n if (_resizeMOWasPlaying) self.playMediaOverlay();\r\n }\r\n\r\n this.handleViewportResize = function (bookmarkToRestore) {\r\n if (!_currentView) return;\r\n\r\n var bookMark = bookmarkToRestore || _currentView.bookmarkCurrentPage(); // not self! (JSON string)\r\n\r\n if (_currentView.isReflowable && _currentView.isReflowable() && bookMark && bookMark.idref) {\r\n var spineItem = _spine.getItemById(bookMark.idref);\r\n\r\n initViewForItem(spineItem, function (isViewChanged) {\r\n self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self);\r\n return;\r\n });\r\n }\r\n else {\r\n _currentView.onViewportResize();\r\n }\r\n };\r\n\r\n /**\r\n * Lets user to subscribe to iframe's window events\r\n *\r\n * @param {string} eventName Event name.\r\n * @param {function} callback Callback function.\r\n * @param {object} context User specified data passed to the callback function.\r\n * @returns {undefined}\r\n */\r\n this.addIFrameEventListener = function (eventName, callback, context) {\r\n _iframeLoader.addIFrameEventListener(eventName, callback, context);\r\n };\r\n\r\n this.isElementCfiVisible = function (spineIdRef, contentCfi) {\r\n if (!_currentView) {\r\n return false;\r\n }\r\n return _currentView.isElementCfiVisible(spineIdRef, contentCfi);\r\n };\r\n\r\n var BackgroundAudioTrackManager = function () {\r\n var _spineItemIframeMap = {};\r\n var _wasPlaying = false;\r\n\r\n var _callback_playPause = undefined;\r\n this.setCallback_PlayPause = function (callback) {\r\n _callback_playPause = callback;\r\n };\r\n\r\n var _callback_isAvailable = undefined;\r\n this.setCallback_IsAvailable = function (callback) {\r\n _callback_isAvailable = callback;\r\n };\r\n\r\n this.playPause = function (doPlay) {\r\n _playPause(doPlay);\r\n };\r\n\r\n var _playPause = function (doPlay) {\r\n if (_callback_playPause) {\r\n _callback_playPause(doPlay);\r\n }\r\n\r\n try {\r\n var $iframe = undefined;\r\n\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var data = _spineItemIframeMap[prop];\r\n if (!data || !data.active) continue;\r\n\r\n if ($iframe) console.error(\"More than one active iframe?? (pagination)\");\r\n\r\n $iframe = data[\"$iframe\"];\r\n if (!$iframe) continue;\r\n\r\n var $audios = $(\"audio\", $iframe[0].contentDocument);\r\n\r\n $.each($audios, function () {\r\n\r\n var attr = this.getAttribute(\"epub:type\") || this.getAttribute(\"type\");\r\n\r\n if (!attr) return true; // continue\r\n\r\n if (attr.indexOf(\"ibooks:soundtrack\") < 0 && attr.indexOf(\"media:soundtrack\") < 0 && attr.indexOf(\"media:background\") < 0) return true; // continue\r\n\r\n if (doPlay && this.play) {\r\n this.play();\r\n }\r\n else if (this.pause) {\r\n this.pause();\r\n }\r\n\r\n return true; // continue (more than one track?)\r\n });\r\n }\r\n }\r\n catch (err) {\r\n console.error(err);\r\n }\r\n };\r\n\r\n this.setPlayState = function (wasPlaying) {\r\n _wasPlaying = wasPlaying;\r\n };\r\n\r\n self.on(Globals.Events.CONTENT_DOCUMENT_LOADED, function ($iframe, spineItem) {\r\n try {\r\n if (spineItem && spineItem.idref && $iframe && $iframe[0]) {\r\n // console.log(\"CONTENT_DOCUMENT_LOADED\");\r\n // console.debug(spineItem.href);\r\n // console.debug(spineItem.idref);\r\n\r\n _spineItemIframeMap[spineItem.idref] = {\"$iframe\": $iframe, href: spineItem.href};\r\n }\r\n }\r\n catch (err) {\r\n console.error(err);\r\n }\r\n });\r\n\r\n self.on(Globals.Events.PAGINATION_CHANGED, function (pageChangeData) {\r\n // console.log(\"PAGINATION_CHANGED\");\r\n // console.debug(pageChangeData);\r\n //\r\n // if (pageChangeData.spineItem)\r\n // {\r\n // console.debug(pageChangeData.spineItem.href);\r\n // console.debug(pageChangeData.spineItem.idref);\r\n // }\r\n // else\r\n // {\r\n // //console.error(pageChangeData);\r\n // }\r\n //\r\n // if (pageChangeData.paginationInfo && pageChangeData.paginationInfo.openPages && pageChangeData.paginationInfo.openPages.length)\r\n // {\r\n // for (var i = 0; i < pageChangeData.paginationInfo.openPages.length; i++)\r\n // {\r\n // console.log(pageChangeData.paginationInfo.openPages[i].idref);\r\n // }\r\n // }\r\n\r\n var atLeastOne = false;\r\n\r\n try {\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var isActive = pageChangeData.spineItem && pageChangeData.spineItem.idref === prop;\r\n\r\n var isDisplayed = false;\r\n\r\n if (pageChangeData.paginationInfo && pageChangeData.paginationInfo.openPages.length) {\r\n var allSame = true;\r\n\r\n for (var i = 0; i < pageChangeData.paginationInfo.openPages.length; i++) {\r\n if (pageChangeData.paginationInfo.openPages[i].idref === prop) {\r\n isDisplayed = true;\r\n }\r\n else {\r\n allSame = false;\r\n }\r\n }\r\n\r\n if (!isActive && allSame) isActive = true;\r\n }\r\n\r\n if (isActive || isDisplayed) {\r\n var data = _spineItemIframeMap[prop];\r\n if (!data) continue;\r\n\r\n _spineItemIframeMap[prop][\"active\"] = isActive;\r\n\r\n var $iframe = data[\"$iframe\"];\r\n var href = data.href;\r\n\r\n var $audios = $(\"audio\", $iframe[0].contentDocument);\r\n $.each($audios, function () {\r\n\r\n var attr = this.getAttribute(\"epub:type\") || this.getAttribute(\"type\");\r\n\r\n if (!attr) return true; // continue\r\n\r\n if (attr.indexOf(\"ibooks:soundtrack\") < 0 && attr.indexOf(\"media:soundtrack\") < 0 && attr.indexOf(\"media:background\") < 0) return true; // continue\r\n\r\n this.setAttribute(\"loop\", \"loop\");\r\n this.removeAttribute(\"autoplay\");\r\n\r\n // DEBUG!\r\n //this.setAttribute(\"controls\", \"controls\");\r\n\r\n if (isActive) {\r\n // DEBUG!\r\n //$(this).css({border:\"2px solid green\"});\r\n }\r\n else {\r\n if (this.pause) this.pause();\r\n\r\n // DEBUG!\r\n //$(this).css({border:\"2px solid red\"});\r\n }\r\n\r\n atLeastOne = true;\r\n\r\n return true; // continue (more than one track?)\r\n });\r\n\r\n continue;\r\n }\r\n else {\r\n if (_spineItemIframeMap[prop]) _spineItemIframeMap[prop][\"$iframe\"] = undefined;\r\n _spineItemIframeMap[prop] = undefined;\r\n }\r\n }\r\n }\r\n catch (err) {\r\n console.error(err);\r\n }\r\n\r\n if (_callback_isAvailable) {\r\n _callback_isAvailable(atLeastOne);\r\n }\r\n\r\n if (atLeastOne) {\r\n if (_wasPlaying) {\r\n _playPause(true);\r\n }\r\n else {\r\n _playPause(false); // ensure correct paused state\r\n }\r\n }\r\n else {\r\n _playPause(false); // ensure correct paused state\r\n }\r\n });\r\n\r\n self.on(Globals.Events.MEDIA_OVERLAY_STATUS_CHANGED, function (value) {\r\n if (!value.smilIndex) return;\r\n var package = self.package();\r\n var smil = package.media_overlay.smilAt(value.smilIndex);\r\n if (!smil || !smil.spineItemId) return;\r\n\r\n var needUpdate = false;\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var data = _spineItemIframeMap[prop];\r\n if (!data) continue;\r\n\r\n if (data.active) {\r\n if (prop !== smil.spineItemId) {\r\n _playPause(false); // ensure correct paused state\r\n data.active = false;\r\n needUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (needUpdate) {\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var data = _spineItemIframeMap[prop];\r\n if (!data) continue;\r\n\r\n if (!data.active) {\r\n if (prop === smil.spineItemId) {\r\n data.active = true;\r\n }\r\n }\r\n }\r\n\r\n if (_wasPlaying) {\r\n _playPause(true);\r\n }\r\n }\r\n });\r\n };\r\n this.backgroundAudioTrackManager = new BackgroundAudioTrackManager();\r\n};\r\n\r\n/**\r\n * View Type\r\n * @typedef {object} Globals.Views.ReaderView.ViewType\r\n * @property {number} VIEW_TYPE_COLUMNIZED Reflowable document view\r\n * @property {number} VIEW_TYPE_FIXED Fixed layout document view\r\n * @property {number} VIEW_TYPE_SCROLLED_DOC Scrollable document view\r\n * @property {number} VIEW_TYPE_SCROLLED_CONTINUOUS Continuous scrollable document view\r\n */\r\nReaderView.VIEW_TYPE_COLUMNIZED = 1;\r\nReaderView.VIEW_TYPE_FIXED = 2;\r\nReaderView.VIEW_TYPE_SCROLLED_DOC = 3;\r\nReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS = 4;\r\nreturn ReaderView;\r\n});\n" + "// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/models/navigation_history',[\r\n //\"jquery\", \"underscore\"\r\n ],\r\n function (\r\n //$, _\r\n ) {\r\n\r\n\r\nvar NavigationHistory = function (readerview) {\r\n\r\n var _DEBUG = true;\r\n\r\n var self = this;\r\n \r\n var _readerView = readerview;\r\n \r\n var _breadcrumb = [];\r\n \r\n var _skipNext = false;\r\n \r\n this.flush = function () {\r\n if (_DEBUG) {\r\n console.error(\"NavigationHistory FLUSH.\");\r\n }\r\n \r\n _breadcrumb = [];\r\n };\r\n this.flush();\r\n\r\n this.containsLinear = function() {\r\n \r\n for (var i = 0; i < _breadcrumb.length; i++) {\r\n var bookMark = _breadcrumb[i];\r\n if (bookMark && bookMark.idref) {\r\n var spineItem = readerview.spine().getItemById(bookMark.idref);\r\n \r\n var isLinear = spineItem && readerview.spine().isValidLinearItem(spineItem.index);\r\n if (isLinear) {\r\n return true;\r\n }\r\n }\r\n }\r\n \r\n return false;\r\n };\r\n\r\n this.push = function (bookMark) {\r\n \r\n if (_skipNext) {\r\n \r\n if (_DEBUG) {\r\n console.error(\"NavigationHistory PUSH SKIP: \");\r\n console.debug(bookMark);\r\n }\r\n \r\n _skipNext = false;\r\n return;\r\n }\r\n \r\n if (_DEBUG) {\r\n console.error(\"NavigationHistory PUSH: \");\r\n console.debug(bookMark);\r\n }\r\n \r\n if (_breadcrumb.length) {\r\n var lastBookMark = _breadcrumb[_breadcrumb.length-1];\r\n \r\n var bookMark_contentCFI = bookMark.contentCFI;\r\n // TODO bookmark spatial @x:y! (should be charcter offset)\r\n // if (bookMark_contentCFI) {\r\n // var i = bookMark_contentCFI.lastIndexOf(\"@\");\r\n // if (i > 1) {\r\n // bookMark_contentCFI = bookMark_contentCFI.substr(0, i);\r\n // }\r\n // }\r\n \r\n var lastBookMark_contentCFI = lastBookMark.contentCFI;\r\n // TODO bookmark spatial @x:y! (should be charcter offset)\r\n // if (lastBookMark_contentCFI) {\r\n // i = lastBookMark_contentCFI.lastIndexOf(\"@\");\r\n // if (i > 1) {\r\n // lastBookMark_contentCFI = lastBookMark_contentCFI.substr(0, i);\r\n // }\r\n // }\r\n \r\n if (bookMark.idref == lastBookMark.idref\r\n && bookMark_contentCFI == lastBookMark_contentCFI) {\r\n \r\n if (_DEBUG) {\r\n console.log(\"--- NavigationHistory skipping duplicate bookmark: \" + bookMark.idref + \" -- \" + bookMark_contentCFI);\r\n }\r\n return;\r\n }\r\n }\r\n \r\n _breadcrumb.push(bookMark);\r\n };\r\n \r\n this.pop = function () {\r\n var bookMark = _breadcrumb.pop();\r\n \r\n if (_DEBUG) {\r\n console.error(\"NavigationHistory POP: \");\r\n console.debug(bookMark);\r\n }\r\n \r\n return bookMark;\r\n };\r\n \r\n this.canPop = function() {\r\n return _breadcrumb.length > 0;\r\n };\r\n \r\n this.skipNext = function() {\r\n if (_DEBUG) {\r\n console.error(\"NavigationHistory SKIP NEXT.\");\r\n }\r\n _skipNext = true;\r\n };\r\n};\r\nreturn NavigationHistory;\r\n\r\n});\n", + "// Created by Boris Schneiderman.\r\n// Modified by Daniel Weck\r\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\r\n// \r\n// Redistribution and use in source and binary forms, with or without modification, \r\n// are permitted provided that the following conditions are met:\r\n// 1. Redistributions of source code must retain the above copyright notice, this \r\n// list of conditions and the following disclaimer.\r\n// 2. Redistributions in binary form must reproduce the above copyright notice, \r\n// this list of conditions and the following disclaimer in the documentation and/or \r\n// other materials provided with the distribution.\r\n// 3. Neither the name of the organization nor the names of its contributors may be \r\n// used to endorse or promote products derived from this software without specific \r\n// prior written permission.\r\n// \r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \r\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \r\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \r\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \r\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \r\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n// OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\ndefine('readium_shared_js/views/reader_view',[\"jquery\", \"underscore\", \"eventEmitter\", \"./fixed_view\", \"../helpers\", \"./iframe_loader\", \"./internal_links_support\",\r\n \"./media_overlay_data_injector\", \"./media_overlay_player\", \"../models/package\", \"../models/page_open_request\",\r\n \"./reflowable_view\", \"./scroll_view\", \"../models/style_collection\", \"../models/switches\", \"../models/trigger\",\r\n \"../models/viewer_settings\", \"../globals\", \"../models/navigation_history\"],\r\n function ($, _, EventEmitter, FixedView, Helpers, IFrameLoader, InternalLinksSupport,\r\n MediaOverlayDataInjector, MediaOverlayPlayer, Package, PageOpenRequest,\r\n ReflowableView, ScrollView, StyleCollection, Switches, Trigger,\r\n ViewerSettings, Globals, NavigationHistory) {\r\n/**\r\n * Options passed on the reader from the readium loader/initializer\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.ReaderOptions\r\n * @property {jQueryElement|string} el The element the reader view should create itself in. Can be a jquery wrapped element or a query selector.\r\n * @property {Globals.Views.IFrameLoader} iframeLoader An instance of an iframe loader or one expanding it.\r\n * @property {boolean} needsFixedLayoutScalerWorkAround\r\n */\r\n\r\n/**\r\n * Top level View object. Interface for view manipulation public APIs\r\n * @param {Views.ReaderView.ReaderOptions} options\r\n * @constructor\r\n */\r\nvar ReaderView = function (options) {\r\n\r\n $.extend(this, new EventEmitter());\r\n\r\n var self = this;\r\n \r\n var _navigationHistory = new NavigationHistory(self);\r\n \r\n var _currentView = undefined;\r\n var _package = undefined;\r\n var _spine = undefined;\r\n var _viewerSettings = new ViewerSettings({});\r\n //styles applied to the container divs\r\n var _userStyles = new StyleCollection();\r\n //styles applied to the content documents\r\n var _bookStyles = new StyleCollection();\r\n var _internalLinksSupport = new InternalLinksSupport(this);\r\n var _mediaOverlayPlayer;\r\n var _mediaOverlayDataInjector;\r\n var _iframeLoader;\r\n var _$el;\r\n\r\n //We will call onViewportResize after user stopped resizing window\r\n var lazyResize = Helpers.extendedThrottle(\r\n handleViewportResizeStart,\r\n handleViewportResizeTick,\r\n handleViewportResizeEnd, 250, 1000, self);\r\n\r\n $(window).on(\"resize.ReadiumSDK.readerView\", lazyResize);\r\n\r\n if (options.el instanceof $) {\r\n _$el = options.el;\r\n console.log(\"** EL is a jQuery selector:\" + options.el.attr('id'));\r\n } else {\r\n _$el = $(options.el);\r\n console.log(\"** EL is a string:\" + _$el.attr('id'));\r\n }\r\n\r\n if (options.iframeLoader) {\r\n _iframeLoader = options.iframeLoader;\r\n }\r\n else {\r\n _iframeLoader = new IFrameLoader({mathJaxUrl: options.mathJaxUrl});\r\n }\r\n\r\n\r\n _needsFixedLayoutScalerWorkAround = options.needsFixedLayoutScalerWorkAround;\r\n /**\r\n * @returns {boolean}\r\n */\r\n this.needsFixedLayoutScalerWorkAround = function () {\r\n return _needsFixedLayoutScalerWorkAround;\r\n };\r\n\r\n /**\r\n * Create a view based on the given view type.\r\n * @param {Views.ReaderView.ViewType} viewType\r\n * @param {Views.ReaderView.ViewCreationOptions} options\r\n * @returns {*}\r\n */\r\n this.createViewForType = function (viewType, options) {\r\n var createdView;\r\n\r\n // NOTE: _$el == options.$viewport\r\n _$el.css(\"overflow\", \"hidden\");\r\n\r\n switch (viewType) {\r\n case ReaderView.VIEW_TYPE_FIXED:\r\n\r\n _$el.css(\"overflow\", \"auto\"); // for content pan, see self.setZoom()\r\n\r\n createdView = new FixedView(options, self);\r\n break;\r\n case ReaderView.VIEW_TYPE_SCROLLED_DOC:\r\n createdView = new ScrollView(options, false, self);\r\n break;\r\n case ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS:\r\n createdView = new ScrollView(options, true, self);\r\n break;\r\n default:\r\n createdView = new ReflowableView(options, self);\r\n break;\r\n }\r\n\r\n return createdView;\r\n };\r\n\r\n /**\r\n * Returns the current view type of the reader view\r\n * @returns {ReaderView.ViewType}\r\n */\r\n this.getCurrentViewType = function () {\r\n\r\n if (!_currentView) {\r\n return undefined;\r\n }\r\n\r\n if (_currentView instanceof ReflowableView) {\r\n return ReaderView.VIEW_TYPE_COLUMNIZED;\r\n }\r\n\r\n if (_currentView instanceof FixedView) {\r\n return ReaderView.VIEW_TYPE_FIXED;\r\n }\r\n\r\n if (_currentView instanceof ScrollView) {\r\n if (_currentView.isContinuousScroll()) {\r\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\r\n }\r\n\r\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\r\n }\r\n\r\n console.error(\"Unrecognized view type\");\r\n return undefined;\r\n };\r\n\r\n //based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 document\r\n function deduceDesiredViewType(spineItem) {\r\n\r\n //check settings\r\n if (_viewerSettings.scroll == \"scroll-doc\") {\r\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\r\n }\r\n\r\n if (_viewerSettings.scroll == \"scroll-continuous\") {\r\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\r\n }\r\n\r\n //is fixed layout ignore flow\r\n if (spineItem.isFixedLayout()) {\r\n return ReaderView.VIEW_TYPE_FIXED;\r\n }\r\n\r\n //flow\r\n if (spineItem.isFlowScrolledDoc()) {\r\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\r\n }\r\n\r\n if (spineItem.isFlowScrolledContinuous()) {\r\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\r\n }\r\n\r\n return ReaderView.VIEW_TYPE_COLUMNIZED;\r\n }\r\n\r\n // callback is passed true parameter is view changed\r\n function initViewForItem(spineItem, callback) {\r\n\r\n var desiredViewType = deduceDesiredViewType(spineItem);\r\n\r\n if (_currentView) {\r\n\r\n if (self.getCurrentViewType() == desiredViewType) {\r\n \r\n callback(false);\r\n return;\r\n }\r\n\r\n resetCurrentView();\r\n }\r\n\r\n /**\r\n * View creation options\r\n * @typedef {object} Globals.Views.ReaderView.ViewCreationOptions\r\n * @property {jQueryElement} $viewport The view port element the reader view has created.\r\n * @property {Globals.Models.Spine} spine The spine item collection object\r\n * @property {Globals.Collections.StyleCollection} userStyles User styles\r\n * @property {Globals.Collections.StyleCollection} bookStyles Book styles\r\n * @property {Globals.Views.IFrameLoader} iframeLoader An instance of an iframe loader or one expanding it.\r\n */\r\n var viewCreationParams = {\r\n $viewport: _$el,\r\n spine: _spine,\r\n userStyles: _userStyles,\r\n bookStyles: _bookStyles,\r\n iframeLoader: _iframeLoader\r\n };\r\n\r\n\r\n _currentView = self.createViewForType(desiredViewType, viewCreationParams);\r\n self.emit(Globals.Events.READER_VIEW_CREATED, desiredViewType);\r\n\r\n _currentView.on(Globals.Events.CONTENT_DOCUMENT_LOADED, function ($iframe, spineItem) {\r\n\r\n if (!Helpers.isIframeAlive($iframe[0])) return;\r\n\r\n // performance degrades with large DOM (e.g. word-level text-audio sync)\r\n _mediaOverlayDataInjector.attachMediaOverlayData($iframe, spineItem, _viewerSettings);\r\n\r\n _internalLinksSupport.processLinkElements($iframe, spineItem);\r\n\r\n var contentDoc = $iframe[0].contentDocument;\r\n Trigger.register(contentDoc);\r\n Switches.apply(contentDoc);\r\n\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOADED, $iframe, spineItem);\r\n });\r\n\r\n _currentView.on(Globals.Events.CONTENT_DOCUMENT_LOAD_START, function ($iframe, spineItem) {\r\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOAD_START, $iframe, spineItem);\r\n });\r\n\r\n _currentView.on(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, function (pageChangeData) {\r\n //we call on onPageChanged explicitly instead of subscribing to the Globals.Events.PAGINATION_CHANGED by\r\n //mediaOverlayPlayer because we hve to guarantee that mediaOverlayPlayer will be updated before the host\r\n //application will be notified by the same Globals.Events.PAGINATION_CHANGED event\r\n _mediaOverlayPlayer.onPageChanged(pageChangeData);\r\n\r\n _.defer(function () {\r\n self.emit(Globals.Events.PAGINATION_CHANGED, pageChangeData);\r\n });\r\n });\r\n\r\n _currentView.on(Globals.Events.FXL_VIEW_RESIZED, function () {\r\n self.emit(Globals.Events.FXL_VIEW_RESIZED);\r\n })\r\n\r\n _currentView.render();\r\n _currentView.setViewSettings(_viewerSettings);\r\n\r\n // we do this to wait until elements are rendered otherwise book is not able to determine view size.\r\n setTimeout(function () {\r\n\r\n callback(true);\r\n }, 50);\r\n\r\n }\r\n\r\n /**\r\n * Returns a list of the currently active spine items\r\n *\r\n * @returns {Models.SpineItem[]}\r\n */\r\n this.getLoadedSpineItems = function () {\r\n\r\n if (_currentView) {\r\n return _currentView.getLoadedSpineItems();\r\n }\r\n\r\n return [];\r\n };\r\n\r\n function resetCurrentView() {\r\n\r\n if (!_currentView) {\r\n return;\r\n }\r\n\r\n self.emit(Globals.Events.READER_VIEW_DESTROYED);\r\n\r\n _currentView.off(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED);\r\n _currentView.remove();\r\n _currentView = undefined;\r\n }\r\n\r\n /**\r\n * Returns the currently instanced viewer settings\r\n *\r\n * @returns {Models.ViewerSettings}\r\n */\r\n this.viewerSettings = function () {\r\n return _viewerSettings;\r\n };\r\n\r\n /**\r\n * Returns a data object based on the package document\r\n *\r\n * @returns {Models.Package}\r\n */\r\n this.package = function () {\r\n return _package;\r\n };\r\n\r\n /**\r\n * Returns a representation of the spine as a data object, also acts as list of spine items\r\n *\r\n * @returns {Models.Spine}\r\n */\r\n this.spine = function () {\r\n return _spine;\r\n };\r\n\r\n /**\r\n * Returns the user CSS styles collection\r\n *\r\n * @returns {Collections.StyleCollection}\r\n */\r\n this.userStyles = function () {\r\n return _userStyles;\r\n };\r\n\r\n /**\r\n * Open Book Data\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.OpenBookData\r\n * @property {Globals.Models.Package} package - packageData (required)\r\n * @property {Globals.Models.PageOpenRequest} openPageRequest - openPageRequestData, (optional) data related to open page request\r\n * @property {Globals.Views.ReaderView.SettingsData} [settings]\r\n * @property {Globals.Collections.StyleCollection} styles: [cssStyles]\r\n * @todo Define missing types\r\n */\r\n\r\n /**\r\n * Triggers the process of opening the book and requesting resources specified in the packageData\r\n *\r\n * @param {Views.ReaderView.OpenBookData} openBookData - object with open book data\r\n */\r\n this.openBook = function (openBookData) {\r\n\r\n _navigationHistory.flush();\r\n\r\n var packageData = openBookData.package ? openBookData.package : openBookData;\r\n\r\n _package = new Package(packageData);\r\n\r\n _spine = _package.spine;\r\n //_spine.handleLinear(false);\r\n\r\n if (_mediaOverlayPlayer) {\r\n _mediaOverlayPlayer.reset();\r\n }\r\n\r\n _mediaOverlayPlayer = new MediaOverlayPlayer(self, $.proxy(onMediaPlayerStatusChanged, self));\r\n _mediaOverlayPlayer.setAutomaticNextSmil(_viewerSettings.mediaOverlaysAutomaticPageTurn ? true : false); // just to ensure the internal var is set to the default settings (user settings are applied below at self.updateSettings(openBookData.settings);)\r\n\r\n _mediaOverlayDataInjector = new MediaOverlayDataInjector(_package.media_overlay, _mediaOverlayPlayer);\r\n\r\n\r\n resetCurrentView();\r\n\r\n if (openBookData.settings) {\r\n self.updateSettings(openBookData.settings);\r\n }\r\n\r\n if (openBookData.styles) {\r\n self.setStyles(openBookData.styles);\r\n }\r\n\r\n var pageRequestData = undefined;\r\n\r\n if (openBookData.openPageRequest) {\r\n\r\n if (openBookData.openPageRequest.idref || (openBookData.openPageRequest.contentRefUrl && openBookData.openPageRequest.sourceFileHref)) {\r\n pageRequestData = openBookData.openPageRequest;\r\n }\r\n else {\r\n console.log(\"Invalid page request data: idref required!\");\r\n }\r\n }\r\n\r\n var fallback = false;\r\n if (pageRequestData) {\r\n\r\n pageRequestData = openBookData.openPageRequest;\r\n\r\n try {\r\n if (pageRequestData.idref) {\r\n\r\n if (pageRequestData.spineItemPageIndex) {\r\n fallback = !self.openSpineItemPage(pageRequestData.idref, pageRequestData.spineItemPageIndex, self);\r\n }\r\n else if (pageRequestData.elementCfi) {\r\n fallback = !self.openSpineItemElementCfi(pageRequestData.idref, pageRequestData.elementCfi, self);\r\n }\r\n else {\r\n fallback = !self.openSpineItemPage(pageRequestData.idref, 0, self);\r\n }\r\n }\r\n else {\r\n fallback = !self.openContentUrl(pageRequestData.contentRefUrl, pageRequestData.sourceFileHref, self);\r\n }\r\n } catch (err) {\r\n console.error(\"openPageRequest fail: fallback to first page!\")\r\n console.log(err);\r\n fallback = true;\r\n }\r\n }\r\n else {\r\n fallback = true;\r\n }\r\n\r\n if (fallback) {// if we where not asked to open specific page we will open the first one\r\n\r\n var spineItem = _spine.first();\r\n if (spineItem) {\r\n var pageOpenRequest = new PageOpenRequest(spineItem, self);\r\n pageOpenRequest.setFirstPage();\r\n openPage(pageOpenRequest, 0);\r\n }\r\n }\r\n };\r\n\r\n function onMediaPlayerStatusChanged(status) {\r\n self.emit(Globals.Events.MEDIA_OVERLAY_STATUS_CHANGED, status);\r\n }\r\n\r\n /**\r\n * Flips the page from left to right.\r\n * Takes to account the page progression direction to decide to flip to prev or next page.\r\n */\r\n this.openPageLeft = function () {\r\n\r\n if (_package.spine.isLeftToRight()) {\r\n self.openPagePrev();\r\n }\r\n else {\r\n self.openPageNext();\r\n }\r\n };\r\n\r\n /**\r\n * Flips the page from right to left.\r\n * Takes to account the page progression direction to decide to flip to prev or next page.\r\n */\r\n this.openPageRight = function () {\r\n\r\n if (_package.spine.isLeftToRight()) {\r\n self.openPageNext();\r\n }\r\n else {\r\n self.openPagePrev();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Returns if the current child view is an instance of a fixed page view\r\n *\r\n * @returns {boolean}\r\n */\r\n this.isCurrentViewFixedLayout = function () {\r\n return _currentView instanceof FixedView;\r\n };\r\n\r\n /**\r\n * Zoom options\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.ZoomOptions\r\n * @property {string} style - \"user\"|\"fit-screen\"|\"fit-width\"\r\n * @property {number} scale - 0.0 to 1.0\r\n */\r\n\r\n /**\r\n * Set the zoom options.\r\n *\r\n * @param {Views.ReaderView.ZoomOptions} zoom Zoom options\r\n */\r\n this.setZoom = function (zoom) {\r\n // zoom only handled by fixed layout views\r\n if (self.isCurrentViewFixedLayout()) {\r\n _currentView.setZoom(zoom);\r\n }\r\n };\r\n\r\n /**\r\n * Returns the current view scale as a percentage\r\n *\r\n * @returns {number}\r\n */\r\n this.getViewScale = function () {\r\n if (self.isCurrentViewFixedLayout()) {\r\n return 100 * _currentView.getViewScale();\r\n }\r\n else {\r\n return 100;\r\n }\r\n };\r\n\r\n /**\r\n * Settings Data\r\n *\r\n * @typedef {object} Globals.Views.ReaderView.SettingsData\r\n * @property {number} fontSize - Font size as percentage\r\n * @property {(string|boolean)} syntheticSpread - \"auto\"|true|false\r\n * @property {(string|boolean)} scroll - \"auto\"|true|false\r\n * @property {boolean} doNotUpdateView - Indicates whether the view should be updated after the settings are applied\r\n * @property {boolean} mediaOverlaysEnableClick - Indicates whether media overlays are interactive on mouse clicks\r\n */\r\n\r\n /**\r\n * Updates reader view based on the settings specified in settingsData object\r\n *\r\n * @param {Globals.Views.ReaderView.SettingsData} settingsData Settings data\r\n * @fires Globals.Events.SETTINGS_APPLIED\r\n */\r\n this.updateSettings = function (settingsData) {\r\n\r\n//console.debug(\"UpdateSettings: \" + JSON.stringify(settingsData));\r\n\r\n _viewerSettings.update(settingsData);\r\n\r\n if (_mediaOverlayPlayer) {\r\n _mediaOverlayPlayer.setAutomaticNextSmil(_viewerSettings.mediaOverlaysAutomaticPageTurn ? true : false);\r\n }\r\n\r\n if (_currentView && !settingsData.doNotUpdateView) {\r\n\r\n var bookMark = _currentView.bookmarkCurrentPage();\r\n\r\n if (bookMark && bookMark.idref) {\r\n\r\n var wasPlaying = false;\r\n if (_currentView.isReflowable && _currentView.isReflowable()) {\r\n wasPlaying = self.isPlayingMediaOverlay();\r\n if (wasPlaying) {\r\n self.pauseMediaOverlay();\r\n }\r\n }\r\n\r\n var spineItem = _spine.getItemById(bookMark.idref);\r\n\r\n _navigationHistory.skipNext();\r\n\r\n initViewForItem(spineItem, function (isViewChanged) {\r\n\r\n if (!isViewChanged) {\r\n _currentView.setViewSettings(_viewerSettings);\r\n }\r\n\r\n self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self);\r\n\r\n if (wasPlaying) {\r\n self.playMediaOverlay();\r\n // setTimeout(function()\r\n // {\r\n // }, 60);\r\n }\r\n\r\n self.emit(Globals.Events.SETTINGS_APPLIED);\r\n });\r\n \r\n return;\r\n }\r\n }\r\n\r\n self.emit(Globals.Events.SETTINGS_APPLIED);\r\n };\r\n\r\n /**\r\n * Opens the next page.\r\n */\r\n this.openPageNext = function () {\r\n\r\n if (self.getCurrentViewType() === ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS) {\r\n _currentView.openPageNext(self);\r\n return;\r\n }\r\n\r\n var paginationInfo = _currentView.getPaginationInfo();\r\n\r\n if (paginationInfo.openPages.length == 0) {\r\n return;\r\n }\r\n\r\n var lastOpenPage = paginationInfo.openPages[paginationInfo.openPages.length - 1];\r\n\r\n if (lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1) {\r\n _currentView.openPageNext(self);\r\n return;\r\n }\r\n\r\n var currentSpineItem = _spine.getItemById(lastOpenPage.idref);\r\n\r\n var nextSpineItem = _spine.nextItem(currentSpineItem);\r\n\r\n if (!nextSpineItem) {\r\n return;\r\n }\r\n\r\n var openPageRequest = new PageOpenRequest(nextSpineItem, self);\r\n openPageRequest.setFirstPage();\r\n\r\n _navigationHistory.skipNext();\r\n \r\n openPage(openPageRequest, 2);\r\n };\r\n\r\n /**\r\n * Opens the previous page.\r\n */\r\n this.openPagePrev = function () {\r\n\r\n if (self.getCurrentViewType() === ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS) {\r\n _currentView.openPagePrev(self);\r\n return;\r\n }\r\n\r\n var paginationInfo = _currentView.getPaginationInfo();\r\n\r\n if (paginationInfo.openPages.length == 0) {\r\n return;\r\n }\r\n\r\n var firstOpenPage = paginationInfo.openPages[0];\r\n\r\n if (firstOpenPage.spineItemPageIndex > 0) {\r\n _currentView.openPagePrev(self);\r\n return;\r\n }\r\n\r\n var currentSpineItem = _spine.getItemById(firstOpenPage.idref);\r\n\r\n var prevSpineItem = _spine.prevItem(currentSpineItem);\r\n\r\n if (!prevSpineItem) {\r\n return;\r\n }\r\n\r\n var openPageRequest = new PageOpenRequest(prevSpineItem, self);\r\n openPageRequest.setLastPage();\r\n\r\n _navigationHistory.skipNext();\r\n \r\n openPage(openPageRequest, 1);\r\n };\r\n\r\n function getSpineItem(idref) {\r\n\r\n if (!idref) {\r\n\r\n console.log(\"idref parameter value missing!\");\r\n return undefined;\r\n }\r\n\r\n var spineItem = _spine.getItemById(idref);\r\n if (!spineItem) {\r\n console.log(\"Spine item with id \" + idref + \" not found!\");\r\n return undefined;\r\n }\r\n\r\n return spineItem;\r\n\r\n }\r\n\r\n /**\r\n * Opens the page of the spine item with element with provided cfi\r\n *\r\n * @param {string} idref Id of the spine item\r\n * @param {string} elementCfi CFI of the element to be shown\r\n * @param {object} initiator optional\r\n */\r\n this.openSpineItemElementCfi = function (idref, elementCfi, initiator) {\r\n\r\n var spineItem = getSpineItem(idref);\r\n\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n var pageData = new PageOpenRequest(spineItem, initiator);\r\n if (elementCfi) {\r\n pageData.setElementCfi(elementCfi);\r\n }\r\n\r\n openPage(pageData, 0);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Opens specified page index of the current spine item\r\n *\r\n * @param {number} pageIndex Zero based index of the page in the current spine item\r\n * @param {object} initiator optional\r\n */\r\n this.openPageIndex = function (pageIndex, initiator) {\r\n\r\n if (!_currentView) {\r\n return false;\r\n }\r\n\r\n var pageRequest;\r\n\r\n if (_package.isFixedLayout()) {\r\n var spineItem = _spine.items[pageIndex];\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n pageRequest = new PageOpenRequest(spineItem, initiator);\r\n pageRequest.setPageIndex(0);\r\n }\r\n else {\r\n\r\n var spineItems = this.getLoadedSpineItems();\r\n if (spineItems.length > 0) {\r\n pageRequest = new PageOpenRequest(spineItems[0], initiator);\r\n pageRequest.setPageIndex(pageIndex);\r\n }\r\n }\r\n\r\n openPage(pageRequest, 0);\r\n\r\n return true;\r\n };\r\n\r\n // this.navigationHistoryForward = function() {\r\n // // Not implemented \r\n // };\r\n this.navigationHistoryBack = function(forceLinear) {\r\n \r\n console.log(\"back nav request ...\");\r\n \r\n while (true) {\r\n var bookMark = _navigationHistory.pop();\r\n if (bookMark && bookMark.idref) {\r\n var spineItem = _spine.getItemById(bookMark.idref);\r\n \r\n if (forceLinear) {\r\n var isLinear = _spine.isValidLinearItem(spineItem.index);\r\n if (!isLinear) {\r\n console.log(\"back nav, skipping non-linear \" + bookMark.idref);\r\n continue;\r\n }\r\n }\r\n \r\n console.log(\"back nav: \");\r\n console.debug(bookMark);\r\n \r\n _navigationHistory.skipNext();\r\n \r\n initViewForItem(spineItem, function (isViewChanged) {\r\n \r\n if (!isViewChanged) {\r\n _currentView.setViewSettings(_viewerSettings);\r\n }\r\n\r\n self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self);\r\n });\r\n \r\n return;\r\n }\r\n \r\n console.error(\"no valid back history?\");\r\n return;\r\n }\r\n };\r\n\r\n this.navigationHistoryCanBack = function(forceLinear) {\r\n \r\n if (!_navigationHistory.canPop()) return false;\r\n \r\n if (!forceLinear) {\r\n return true;\r\n }\r\n \r\n return _navigationHistory.containsLinear();\r\n };\r\n \r\n // dir: 0 => new or same page, 1 => previous, 2 => next\r\n function openPage(pageRequest, dir) {\r\n\r\n if (_currentView) _navigationHistory.push(_currentView.bookmarkCurrentPage());\r\n\r\n initViewForItem(pageRequest.spineItem, function (isViewChanged) {\r\n\r\n if (!isViewChanged) {\r\n _currentView.setViewSettings(_viewerSettings);\r\n }\r\n\r\n _currentView.openPage(pageRequest, dir);\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Opens page index of the spine item with idref provided\r\n *\r\n * @param {string} idref Id of the spine item\r\n * @param {number} pageIndex Zero based index of the page in the spine item\r\n * @param {object} initiator optional\r\n */\r\n this.openSpineItemPage = function (idref, pageIndex, initiator) {\r\n\r\n var spineItem = getSpineItem(idref);\r\n\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n var pageData = new PageOpenRequest(spineItem, initiator);\r\n if (pageIndex) {\r\n pageData.setPageIndex(pageIndex);\r\n }\r\n\r\n openPage(pageData, 0);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Set CSS Styles to the reader container\r\n *\r\n * @param {Collections.StyleCollection} styles Style collection containing selector property and declarations object\r\n * @param {boolean} doNotUpdateView Whether to update the view after the styles are applied.\r\n */\r\n this.setStyles = function (styles, doNotUpdateView) {\r\n\r\n var count = styles.length;\r\n\r\n for (var i = 0; i < count; i++) {\r\n if (styles[i].declarations) {\r\n _userStyles.addStyle(styles[i].selector, styles[i].declarations);\r\n }\r\n else {\r\n _userStyles.removeStyle(styles[i].selector);\r\n }\r\n }\r\n\r\n applyStyles(doNotUpdateView);\r\n\r\n };\r\n\r\n /**\r\n * Set CSS Styles to the content documents\r\n *\r\n * @param {Collections.StyleCollection} styles Style collection containing selector property and declarations object\r\n */\r\n this.setBookStyles = function (styles) {\r\n\r\n var count = styles.length;\r\n\r\n for (var i = 0; i < count; i++) {\r\n _bookStyles.addStyle(styles[i].selector, styles[i].declarations);\r\n }\r\n\r\n if (_currentView) {\r\n _currentView.applyBookStyles();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Gets an element from active content documents based on a query selector.\r\n *\r\n * @param {Models.SpineItem} spineItem The spine item object associated with an active content document\r\n * @param {string} selector The query selector\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getElement = function (spineItem, selector) {\r\n\r\n if (_currentView) {\r\n return _currentView.getElement(spineItem, selector);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Gets an element from active content documents based on an element id.\r\n *\r\n * @param {Models.SpineItem} spineItem The spine item object associated with an active content document\r\n * @param {string} id The element id\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getElementById = function (spineItem, id) {\r\n\r\n if (_currentView) {\r\n return _currentView.getElementById(spineItem, id);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Gets an element from active content documents based on a content CFI.\r\n *\r\n * @param {Models.SpineItem} spineItem The spine item idref associated with an active content document\r\n * @param {string} cfi The partial content CFI\r\n * @param {string[]} [classBlacklist]\r\n * @param {string[]} [elementBlacklist]\r\n * @param {string[]} [idBlacklist]\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getElementByCfi = function (spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist) {\r\n\r\n if (_currentView) {\r\n return _currentView.getElementByCfi(spineItem, cfi, classBlacklist, elementBlacklist, idBlacklist);\r\n }\r\n\r\n return undefined;\r\n\r\n };\r\n\r\n function applyStyles(doNotUpdateView) {\r\n\r\n Helpers.setStyles(_userStyles.getStyles(), _$el);\r\n\r\n if (_mediaOverlayPlayer)\r\n _mediaOverlayPlayer.applyStyles();\r\n\r\n if (doNotUpdateView) return;\r\n\r\n if (_currentView) {\r\n _currentView.applyStyles();\r\n }\r\n }\r\n\r\n /**\r\n * Opens a content url from a media player context\r\n *\r\n * @param {string} contentRefUrl\r\n * @param {string} sourceFileHref\r\n * @param offset\r\n */\r\n this.mediaOverlaysOpenContentUrl = function (contentRefUrl, sourceFileHref, offset) {\r\n _mediaOverlayPlayer.mediaOverlaysOpenContentUrl(contentRefUrl, sourceFileHref, offset);\r\n };\r\n\r\n\r\n /**\r\n * Opens the content document specified by the url\r\n *\r\n * @param {string} contentRefUrl Url of the content document\r\n * @param {string | undefined} sourceFileHref Url to the file that contentRefUrl is relative to. If contentRefUrl is\r\n * relative ot the source file that contains it instead of the package file (ex. TOC file) We have to know the\r\n * sourceFileHref to resolve contentUrl relative to the package file.\r\n * @param {object} initiator optional\r\n */\r\n this.openContentUrl = function (contentRefUrl, sourceFileHref, initiator) {\r\n\r\n var combinedPath = Helpers.ResolveContentRef(contentRefUrl, sourceFileHref);\r\n\r\n var hashIndex = combinedPath.indexOf(\"#\");\r\n var hrefPart;\r\n var elementId;\r\n if (hashIndex >= 0) {\r\n hrefPart = combinedPath.substr(0, hashIndex);\r\n elementId = combinedPath.substr(hashIndex + 1);\r\n }\r\n else {\r\n hrefPart = combinedPath;\r\n elementId = undefined;\r\n }\r\n\r\n var spineItem = _spine.getItemByHref(hrefPart);\r\n if (!spineItem) {\r\n console.warn('spineItem ' + hrefPart + ' not found');\r\n // sometimes that happens because spine item's URI gets encoded,\r\n // yet it's compared with raw strings by `getItemByHref()` -\r\n // so we try to search with decoded link as well\r\n var decodedHrefPart = decodeURIComponent(hrefPart);\r\n spineItem = _spine.getItemByHref(decodedHrefPart);\r\n if (!spineItem) {\r\n console.warn('decoded spineItem ' + decodedHrefPart + ' missing as well');\r\n return false;\r\n }\r\n }\r\n \r\n if (initiator && initiator instanceof MediaOverlayPlayer)\r\n {\r\n _navigationHistory.skipNext();\r\n }\r\n\r\n return self.openSpineItemElementId(spineItem.idref, elementId, initiator);\r\n };\r\n\r\n /**\r\n * Opens the page of the spine item with element with provided cfi\r\n *\r\n * @param {string} idref Id of the spine item\r\n * @param {string} elementId id of the element to be shown\r\n * @param {object} initiator optional\r\n */\r\n this.openSpineItemElementId = function (idref, elementId, initiator) {\r\n\r\n var spineItem = _spine.getItemById(idref);\r\n if (!spineItem) {\r\n return false;\r\n }\r\n\r\n var pageData = new PageOpenRequest(spineItem, initiator);\r\n\r\n if (elementId) {\r\n pageData.setElementId(elementId);\r\n }\r\n\r\n\r\n openPage(pageData, 0);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Returns the bookmark associated with currently opened page.\r\n *\r\n * @returns {string} Serialized Globals.Models.BookmarkData object as JSON string.\r\n */\r\n this.bookmarkCurrentPage = function () {\r\n return JSON.stringify(_currentView.bookmarkCurrentPage());\r\n };\r\n\r\n /**\r\n * Resets all the custom styles set by setStyle callers at runtime\r\n */\r\n this.clearStyles = function () {\r\n\r\n _userStyles.resetStyleValues();\r\n applyStyles();\r\n _userStyles.clear();\r\n };\r\n\r\n /**\r\n * Resets all the custom styles set by setBookStyle callers at runtime\r\n */\r\n this.clearBookStyles = function () {\r\n\r\n if (_currentView) {\r\n\r\n _bookStyles.resetStyleValues();\r\n _currentView.applyBookStyles();\r\n }\r\n\r\n _bookStyles.clear();\r\n };\r\n\r\n /**\r\n * Returns true if media overlay available for one of the open pages.\r\n *\r\n * @returns {boolean}\r\n */\r\n this.isMediaOverlayAvailable = function () {\r\n\r\n if (!_mediaOverlayPlayer) return false;\r\n\r\n return _mediaOverlayPlayer.isMediaOverlayAvailable();\r\n };\r\n\r\n /*\r\n this.setMediaOverlaySkippables = function(items) {\r\n\r\n _mediaOverlayPlayer.setMediaOverlaySkippables(items);\r\n };\r\n\r\n this.setMediaOverlayEscapables = function(items) {\r\n\r\n _mediaOverlayPlayer.setMediaOverlayEscapables(items);\r\n };\r\n */\r\n\r\n /**\r\n * Starts/Stop playing media overlay on current page\r\n */\r\n this.toggleMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.toggleMediaOverlay();\r\n };\r\n\r\n\r\n /**\r\n * Plays next fragment media overlay\r\n */\r\n this.nextMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.nextMediaOverlay();\r\n\r\n };\r\n\r\n /**\r\n * Plays previous fragment media overlay\r\n */\r\n this.previousMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.previousMediaOverlay();\r\n\r\n };\r\n\r\n /**\r\n * Plays next available fragment media overlay that is outside of the current escapable scope\r\n */\r\n this.escapeMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.escape();\r\n };\r\n\r\n /**\r\n * End media overlay TTS\r\n * @todo Clarify what this does with Daniel.\r\n */\r\n this.ttsEndedMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.onTTSEnd();\r\n };\r\n\r\n /**\r\n * Pause currently playing media overlays.\r\n */\r\n this.pauseMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.pause();\r\n };\r\n\r\n /**\r\n * Start/Resume playback of media overlays.\r\n */\r\n this.playMediaOverlay = function () {\r\n\r\n _mediaOverlayPlayer.play();\r\n };\r\n\r\n /**\r\n * Determine if media overlays are currently playing.\r\n * @returns {boolean}\r\n */\r\n this.isPlayingMediaOverlay = function () {\r\n\r\n return _mediaOverlayPlayer.isPlaying();\r\n };\r\n\r\n//\r\n// should use Globals.Events.SETTINGS_APPLIED instead!\r\n// this.setRateMediaOverlay = function(rate) {\r\n//\r\n// _mediaOverlayPlayer.setRate(rate);\r\n// };\r\n// this.setVolumeMediaOverlay = function(volume){\r\n//\r\n// _mediaOverlayPlayer.setVolume(volume);\r\n// };\r\n\r\n /**\r\n * Get the first visible media overlay element from the currently active content document(s)\r\n * @returns {HTMLElement|undefined}\r\n */\r\n this.getFirstVisibleMediaOverlayElement = function () {\r\n\r\n if (_currentView) {\r\n return _currentView.getFirstVisibleMediaOverlayElement();\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n /**\r\n * Used to jump to an element to make sure it is visible when a content document is paginated\r\n * @param {string} spineItemId The spine item idref associated with an active content document\r\n * @param {HTMLElement} element The element to make visible\r\n * @param [initiator]\r\n */\r\n this.insureElementVisibility = function (spineItemId, element, initiator) {\r\n\r\n if (_currentView) {\r\n _currentView.insureElementVisibility(spineItemId, element, initiator);\r\n }\r\n };\r\n\r\n var _resizeBookmark = null;\r\n var _resizeMOWasPlaying = false;\r\n\r\n function handleViewportResizeStart() {\r\n\r\n _resizeBookmark = null;\r\n _resizeMOWasPlaying = false;\r\n\r\n if (_currentView) {\r\n\r\n if (_currentView.isReflowable && _currentView.isReflowable()) {\r\n _resizeMOWasPlaying = self.isPlayingMediaOverlay();\r\n if (_resizeMOWasPlaying) {\r\n self.pauseMediaOverlay();\r\n }\r\n }\r\n\r\n _resizeBookmark = _currentView.bookmarkCurrentPage(); // not self! (JSON string)\r\n }\r\n }\r\n\r\n function handleViewportResizeTick() {\r\n if (_currentView) {\r\n self.handleViewportResize(_resizeBookmark);\r\n }\r\n }\r\n\r\n function handleViewportResizeEnd() {\r\n //same as doing one final tick for now\r\n handleViewportResizeTick();\r\n\r\n if (_resizeMOWasPlaying) self.playMediaOverlay();\r\n }\r\n\r\n this.handleViewportResize = function (bookmarkToRestore) {\r\n if (!_currentView) return;\r\n\r\n var bookMark = bookmarkToRestore || _currentView.bookmarkCurrentPage(); // not self! (JSON string)\r\n\r\n if (_currentView.isReflowable && _currentView.isReflowable() && bookMark && bookMark.idref) {\r\n var spineItem = _spine.getItemById(bookMark.idref);\r\n\r\n _navigationHistory.skipNext();\r\n \r\n initViewForItem(spineItem, function (isViewChanged) {\r\n \r\n // if (!isViewChanged) {\r\n // _currentView.setViewSettings(_viewerSettings);\r\n // }\r\n\r\n self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self);\r\n });\r\n }\r\n else {\r\n _currentView.onViewportResize();\r\n }\r\n };\r\n\r\n /**\r\n * Lets user to subscribe to iframe's window events\r\n *\r\n * @param {string} eventName Event name.\r\n * @param {function} callback Callback function.\r\n * @param {object} context User specified data passed to the callback function.\r\n * @returns {undefined}\r\n */\r\n this.addIFrameEventListener = function (eventName, callback, context) {\r\n _iframeLoader.addIFrameEventListener(eventName, callback, context);\r\n };\r\n\r\n this.isElementCfiVisible = function (spineIdRef, contentCfi) {\r\n if (!_currentView) {\r\n return false;\r\n }\r\n return _currentView.isElementCfiVisible(spineIdRef, contentCfi);\r\n };\r\n\r\n var BackgroundAudioTrackManager = function () {\r\n var _spineItemIframeMap = {};\r\n var _wasPlaying = false;\r\n\r\n var _callback_playPause = undefined;\r\n this.setCallback_PlayPause = function (callback) {\r\n _callback_playPause = callback;\r\n };\r\n\r\n var _callback_isAvailable = undefined;\r\n this.setCallback_IsAvailable = function (callback) {\r\n _callback_isAvailable = callback;\r\n };\r\n\r\n this.playPause = function (doPlay) {\r\n _playPause(doPlay);\r\n };\r\n\r\n var _playPause = function (doPlay) {\r\n if (_callback_playPause) {\r\n _callback_playPause(doPlay);\r\n }\r\n\r\n try {\r\n var $iframe = undefined;\r\n\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var data = _spineItemIframeMap[prop];\r\n if (!data || !data.active) continue;\r\n\r\n if ($iframe) console.error(\"More than one active iframe?? (pagination)\");\r\n\r\n $iframe = data[\"$iframe\"];\r\n if (!$iframe) continue;\r\n\r\n var $audios = $(\"audio\", $iframe[0].contentDocument);\r\n\r\n $.each($audios, function () {\r\n\r\n var attr = this.getAttribute(\"epub:type\") || this.getAttribute(\"type\");\r\n\r\n if (!attr) return true; // continue\r\n\r\n if (attr.indexOf(\"ibooks:soundtrack\") < 0 && attr.indexOf(\"media:soundtrack\") < 0 && attr.indexOf(\"media:background\") < 0) return true; // continue\r\n\r\n if (doPlay && this.play) {\r\n this.play();\r\n }\r\n else if (this.pause) {\r\n this.pause();\r\n }\r\n\r\n return true; // continue (more than one track?)\r\n });\r\n }\r\n }\r\n catch (err) {\r\n console.error(err);\r\n }\r\n };\r\n\r\n this.setPlayState = function (wasPlaying) {\r\n _wasPlaying = wasPlaying;\r\n };\r\n\r\n self.on(Globals.Events.CONTENT_DOCUMENT_LOADED, function ($iframe, spineItem) {\r\n try {\r\n if (spineItem && spineItem.idref && $iframe && $iframe[0]) {\r\n // console.log(\"CONTENT_DOCUMENT_LOADED\");\r\n // console.debug(spineItem.href);\r\n // console.debug(spineItem.idref);\r\n\r\n _spineItemIframeMap[spineItem.idref] = {\"$iframe\": $iframe, href: spineItem.href};\r\n }\r\n }\r\n catch (err) {\r\n console.error(err);\r\n }\r\n });\r\n\r\n self.on(Globals.Events.PAGINATION_CHANGED, function (pageChangeData) {\r\n // console.log(\"PAGINATION_CHANGED\");\r\n // console.debug(pageChangeData);\r\n //\r\n // if (pageChangeData.spineItem)\r\n // {\r\n // console.debug(pageChangeData.spineItem.href);\r\n // console.debug(pageChangeData.spineItem.idref);\r\n // }\r\n // else\r\n // {\r\n // //console.error(pageChangeData);\r\n // }\r\n //\r\n // if (pageChangeData.paginationInfo && pageChangeData.paginationInfo.openPages && pageChangeData.paginationInfo.openPages.length)\r\n // {\r\n // for (var i = 0; i < pageChangeData.paginationInfo.openPages.length; i++)\r\n // {\r\n // console.log(pageChangeData.paginationInfo.openPages[i].idref);\r\n // }\r\n // }\r\n\r\n var atLeastOne = false;\r\n\r\n try {\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var isActive = pageChangeData.spineItem && pageChangeData.spineItem.idref === prop;\r\n\r\n var isDisplayed = false;\r\n\r\n if (pageChangeData.paginationInfo && pageChangeData.paginationInfo.openPages.length) {\r\n var allSame = true;\r\n\r\n for (var i = 0; i < pageChangeData.paginationInfo.openPages.length; i++) {\r\n if (pageChangeData.paginationInfo.openPages[i].idref === prop) {\r\n isDisplayed = true;\r\n }\r\n else {\r\n allSame = false;\r\n }\r\n }\r\n\r\n if (!isActive && allSame) isActive = true;\r\n }\r\n\r\n if (isActive || isDisplayed) {\r\n var data = _spineItemIframeMap[prop];\r\n if (!data) continue;\r\n\r\n _spineItemIframeMap[prop][\"active\"] = isActive;\r\n\r\n var $iframe = data[\"$iframe\"];\r\n var href = data.href;\r\n\r\n var $audios = $(\"audio\", $iframe[0].contentDocument);\r\n $.each($audios, function () {\r\n\r\n var attr = this.getAttribute(\"epub:type\") || this.getAttribute(\"type\");\r\n\r\n if (!attr) return true; // continue\r\n\r\n if (attr.indexOf(\"ibooks:soundtrack\") < 0 && attr.indexOf(\"media:soundtrack\") < 0 && attr.indexOf(\"media:background\") < 0) return true; // continue\r\n\r\n this.setAttribute(\"loop\", \"loop\");\r\n this.removeAttribute(\"autoplay\");\r\n\r\n // DEBUG!\r\n //this.setAttribute(\"controls\", \"controls\");\r\n\r\n if (isActive) {\r\n // DEBUG!\r\n //$(this).css({border:\"2px solid green\"});\r\n }\r\n else {\r\n if (this.pause) this.pause();\r\n\r\n // DEBUG!\r\n //$(this).css({border:\"2px solid red\"});\r\n }\r\n\r\n atLeastOne = true;\r\n\r\n return true; // continue (more than one track?)\r\n });\r\n\r\n continue;\r\n }\r\n else {\r\n if (_spineItemIframeMap[prop]) _spineItemIframeMap[prop][\"$iframe\"] = undefined;\r\n _spineItemIframeMap[prop] = undefined;\r\n }\r\n }\r\n }\r\n catch (err) {\r\n console.error(err);\r\n }\r\n\r\n if (_callback_isAvailable) {\r\n _callback_isAvailable(atLeastOne);\r\n }\r\n\r\n if (atLeastOne) {\r\n if (_wasPlaying) {\r\n _playPause(true);\r\n }\r\n else {\r\n _playPause(false); // ensure correct paused state\r\n }\r\n }\r\n else {\r\n _playPause(false); // ensure correct paused state\r\n }\r\n });\r\n\r\n self.on(Globals.Events.MEDIA_OVERLAY_STATUS_CHANGED, function (value) {\r\n if (!value.smilIndex) return;\r\n var package = self.package();\r\n var smil = package.media_overlay.smilAt(value.smilIndex);\r\n if (!smil || !smil.spineItemId) return;\r\n\r\n var needUpdate = false;\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var data = _spineItemIframeMap[prop];\r\n if (!data) continue;\r\n\r\n if (data.active) {\r\n if (prop !== smil.spineItemId) {\r\n _playPause(false); // ensure correct paused state\r\n data.active = false;\r\n needUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (needUpdate) {\r\n for (var prop in _spineItemIframeMap) {\r\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\r\n\r\n var data = _spineItemIframeMap[prop];\r\n if (!data) continue;\r\n\r\n if (!data.active) {\r\n if (prop === smil.spineItemId) {\r\n data.active = true;\r\n }\r\n }\r\n }\r\n\r\n if (_wasPlaying) {\r\n _playPause(true);\r\n }\r\n }\r\n });\r\n };\r\n this.backgroundAudioTrackManager = new BackgroundAudioTrackManager();\r\n};\r\n\r\n/**\r\n * View Type\r\n * @typedef {object} Globals.Views.ReaderView.ViewType\r\n * @property {number} VIEW_TYPE_COLUMNIZED Reflowable document view\r\n * @property {number} VIEW_TYPE_FIXED Fixed layout document view\r\n * @property {number} VIEW_TYPE_SCROLLED_DOC Scrollable document view\r\n * @property {number} VIEW_TYPE_SCROLLED_CONTINUOUS Continuous scrollable document view\r\n */\r\nReaderView.VIEW_TYPE_COLUMNIZED = 1;\r\nReaderView.VIEW_TYPE_FIXED = 2;\r\nReaderView.VIEW_TYPE_SCROLLED_DOC = 3;\r\nReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS = 4;\r\nreturn ReaderView;\r\n});\n" ] } \ No newline at end of file From 2698f5799daac1c67e3cdf0985e2eaa545152f83 Mon Sep 17 00:00:00 2001 From: danielweck Date: Tue, 8 Dec 2015 11:16:34 +0000 Subject: [PATCH 7/7] handling of non-linear spine items in scroll view (if continuous, forcing scrolled-doc) --- js/views/reader_view.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/js/views/reader_view.js b/js/views/reader_view.js index 8585ae795..7f35a890d 100644 --- a/js/views/reader_view.js +++ b/js/views/reader_view.js @@ -166,13 +166,20 @@ var ReaderView = function (options) { //based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 document function deduceDesiredViewType(spineItem) { + var isLinear = self.spine().isValidLinearItem(spineItem.index); + //check settings if (_viewerSettings.scroll == "scroll-doc") { return ReaderView.VIEW_TYPE_SCROLLED_DOC; } if (_viewerSettings.scroll == "scroll-continuous") { - return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS; + + if (isLinear) { + return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS; + } else { + return ReaderView.VIEW_TYPE_SCROLLED_DOC; + } } //is fixed layout ignore flow @@ -186,7 +193,12 @@ var ReaderView = function (options) { } if (spineItem.isFlowScrolledContinuous()) { - return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS; + + if (isLinear) { + return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS; + } else { + return ReaderView.VIEW_TYPE_SCROLLED_DOC; + } } return ReaderView.VIEW_TYPE_COLUMNIZED;